diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 3190de88d7..a294b007b7 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -23,18 +23,14 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.10.3 (Latest release) + - 1.11.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.10.3 - 1.10.2 - 1.10.1 - 1.10.0 - - 1.9.4 - - 1.9.3 - - 1.9.2 - - 1.9.1 - - 1.9.0 - - pre-1.9.0 + - pre-1.10.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 0d87681cdf..59d0fb53f1 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -23,18 +23,14 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.10.3 (Latest release) + - 1.11.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.10.3 - 1.10.2 - 1.10.1 - 1.10.0 - - 1.9.4 - - 1.9.3 - - 1.9.2 - - 1.9.1 - - 1.9.0 - - pre-1.9.0 + - pre-1.10.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index edf5f827f3..0ceab0ec95 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -23,18 +23,14 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.10.3 (Latest release) + - 1.11.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.10.3 - 1.10.2 - 1.10.1 - 1.10.0 - - 1.9.4 - - 1.9.3 - - 1.9.2 - - 1.9.1 - - 1.9.0 - - pre-1.9.0 + - pre-1.10.0 validations: required: true - type: input diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 0000000000..70203c4f93 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,4 @@ +## Mega Evolution Overworld Sprite Credits: +- [princess-phoenix](https://www.deviantart.com/princess-phoenix) +- [larryturbo](https://www.deviantart.com/larryturbo) +- [kidkatt](https://www.deviantart.com/kidkatt) diff --git a/Makefile b/Makefile index a71c7bc755..095b6b6ac8 100644 --- a/Makefile +++ b/Makefile @@ -121,7 +121,7 @@ CPPFLAGS := $(INCLUDE_CPP_ARGS) -Wno-trigraphs -DMODERN=1 -DTESTING=$(TEST) ARMCC := $(PREFIX)gcc PATH_ARMCC := PATH="$(PATH)" $(ARMCC) CC1 := $(shell $(PATH_ARMCC) --print-prog-name=cc1) -quiet -override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init +override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init ifeq ($(ANALYZE),1) override CFLAGS += -fanalyzer endif @@ -346,6 +346,7 @@ endif $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast $(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member +$(C_BUILDDIR)/agb_flash.o: override CFLAGS += -fno-toplevel-reorder $(C_BUILDDIR)/pokedex_plus_hgss.o: CFLAGS := -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init # Annoyingly we can't turn this on just for src/data/trainers.h $(C_BUILDDIR)/data.o: CFLAGS += -fno-show-column -fno-diagnostics-show-caret diff --git a/README.md b/README.md index db2d05977d..5e83f9793b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ The main advantage of using vanilla pokeemerald as a base is being able to link If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect. You can phrase it as the following: ``` -Based off RHH's pokeemerald-expansion 1.10.3 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.11.0 https://github.com/rh-hideout/pokeemerald-expansion/ ``` #### Important: DO NOT use GitHub's "Download Zip" option. Using this option will not download the commit history required to update your expansion version or merge other feature branches. Instead, please read [this guide](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub) to learn how to fork the repository and clone locally from there. diff --git a/asm/macros/battle_frontier/battle_dome.inc b/asm/macros/battle_frontier/battle_dome.inc index 9adbcc54e7..fe21ca4308 100644 --- a/asm/macros/battle_frontier/battle_dome.inc +++ b/asm/macros/battle_frontier/battle_dome.inc @@ -57,7 +57,7 @@ special CallBattleDomeFunction .endm - @ Sets gTrainerBattleOpponent_A to the trainer ID of the next opponent + @ Sets gTrainerBattleParameter.params.opponentA to the trainer ID of the next opponent .macro dome_setopponent setvar VAR_0x8004, BATTLE_DOME_FUNC_SET_OPPONENT_ID special CallBattleDomeFunction diff --git a/asm/macros/battle_frontier/battle_tower.inc b/asm/macros/battle_frontier/battle_tower.inc index b3c86955dd..6c9e606dde 100644 --- a/asm/macros/battle_frontier/battle_tower.inc +++ b/asm/macros/battle_frontier/battle_tower.inc @@ -115,14 +115,13 @@ .macro multi_2_vs_2 trainer1Id:req, trainer1LoseText:req, trainer2Id:req, trainer2LoseText:req, partnerId:req special SavePlayerParty - trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons - trainerbattle TRAINER_BATTLE_SET_TRAINER_B, \trainer2Id, 0, NULL, \trainer2LoseText @ set second trainer mons + trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, \trainer2Id, NULL, \trainer2LoseText, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE multi_do MULTI_BATTLE_2_VS_2, \partnerId .endm .macro multi_2_vs_1 trainer1Id:req, trainer1LoseText:req, partnerId:req special SavePlayerParty - trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons + trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE multi_do MULTI_BATTLE_2_VS_1, \partnerId .endm @@ -145,14 +144,13 @@ .macro multi_fixed_2_vs_2 trainer1Id:req, trainer1LoseText:req, trainer2Id:req, trainer2LoseText:req, partnerId:req special SavePlayerParty - trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons - trainerbattle TRAINER_BATTLE_SET_TRAINER_B, \trainer2Id, 0, NULL, \trainer2LoseText @ set second trainer mons + trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, \trainer2Id, NULL, \trainer2LoseText, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE multi_do_fixed MULTI_BATTLE_2_VS_2, \partnerId .endm .macro multi_fixed_2_vs_1 trainer1Id:req, trainer1LoseText:req, partnerId:req special SavePlayerParty - trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons + trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE multi_do_fixed MULTI_BATTLE_2_VS_1, \partnerId .endm diff --git a/asm/macros/battle_frontier/frontier_util.inc b/asm/macros/battle_frontier/frontier_util.inc index e40eccb5e7..4913b0fc15 100644 --- a/asm/macros/battle_frontier/frontier_util.inc +++ b/asm/macros/battle_frontier/frontier_util.inc @@ -133,7 +133,7 @@ special CallFrontierUtilFunc .endm - @ Buffer the name of gTrainerBattleOpponent_A in STR_VAR_1 (0) or STR_VAR_2 (1) + @ Buffer the name of gTrainerBattleParameter.params.opponentA in STR_VAR_1 (0) or STR_VAR_2 (1) .macro frontier_gettrainername stringVar:req setvar VAR_0x8004, FRONTIER_UTIL_FUNC_BUFFER_TRAINER_NAME .if \stringVar == STR_VAR_1 diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index cd52f9629b..a169b3580b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -356,7 +356,7 @@ .byte 0x3a .endm - .macro healthbar_update battler:req + .macro absorbhealthbarupdate battler:req .byte 0x3b .byte \battler .endm @@ -833,7 +833,7 @@ .byte 0x94 .endm - .macro unused_95 + .macro copybidedmg .byte 0x95 .endm @@ -929,8 +929,9 @@ .4byte \failInstr .endm - .macro setdestinybond + .macro trysetdestinybond failInstr:req .byte 0xaa + .4byte \failInstr .endm .macro trysetdestinybondtohappen @@ -1231,11 +1232,11 @@ .byte 0xe5 .endm - .macro unused3 + .macro unused_0xE6 .byte 0xe6 .endm - .macro unused4 + .macro unused_0xE7 .byte 0xe7 .endm @@ -1276,8 +1277,9 @@ .byte 0xef .endm - .macro givecaughtmon + .macro givecaughtmon passInstr:req .byte 0xf0 + .4byte \passInstr .endm .macro trysetcaughtmondexflags failInstr:req @@ -1289,9 +1291,8 @@ .byte 0xf2 .endm - .macro trygivecaughtmonnick successInstr:req + .macro trygivecaughtmonnick .byte 0xf3 - .4byte \successInstr .endm .macro subattackerhpbydmg @@ -1521,8 +1522,8 @@ .4byte \jumpInstr .endm - .macro jumpifargument argument:req, jumpInstr:req - callnative BS_JumpIfArgument + .macro jumpifmovepropertyargument argument:req, jumpInstr:req + callnative BS_JumpIfMovePropertyArgument .byte \argument .4byte \jumpInstr .endm @@ -1554,13 +1555,43 @@ .4byte \failInstr .endm - .macro trysetstatus1, ptr:req - callnative BS_TrySetStatus1 + .macro trysetparalysis, ptr:req + callnative BS_TrySetParalysis .4byte \ptr .endm - .macro trysetstatus2, ptr:req - callnative BS_TrySetStatus2 + .macro trysetpoison, ptr:req + callnative BS_TrySetPoison + .4byte \ptr + .endm + + .macro trysetpoisonparalysis, ptr:req + callnative BS_TrySetPoisonParalyzis + .4byte \ptr + .endm + + .macro tryseteffectspore, ptr:req + callnative BS_TrySetEffectSpore + .4byte \ptr + .endm + + .macro trysetconfusion, ptr:req + callnative BS_TrySetConfusion + .4byte \ptr + .endm + + .macro trysetinfatuation, ptr:req + callnative BS_TrySetInfatuation + .4byte \ptr + .endm + + .macro trysetescapeprevention, ptr:req + callnative BS_TrySetEscapePrevention + .4byte \ptr + .endm + + .macro trysettorment, ptr:req + callnative BS_TrySetTorment .4byte \ptr .endm @@ -1610,8 +1641,8 @@ callnative BS_TryTriggerStatusForm .endm - .macro setphotongeysercategory - callnative BS_SetPhotonGeyserCategory + .macro setdynamicmovecategory + callnative BS_SetDynamicMoveCategory .endm .macro tryupperhand failInstr:req @@ -1664,6 +1695,11 @@ callnative BS_DamageToQuarterTargetHP .endm + .macro jumpifsleepclause jumpInstr:req + callnative BS_JumpIfSleepClause + .4byte \jumpInstr + .endm + .macro ficklebeamdamagecalculation callnative BS_FickleBeamDamageCalculation .endm @@ -1760,6 +1796,26 @@ callnative BS_SpectralThiefPrintStats .endm + .macro setmoveresultflags flags:req + callnative BS_SetMoveResultFlags + .2byte \flags + .endm + + .macro clearmoveresultflags flags:req + callnative BS_ClearMoveResultFlags + .2byte \flags + .endm + + .macro jumpifmoveresultflags flags:req failInstr:req + callnative BS_JumpIfMoveResultFlags + .2byte \flags + .4byte \failInstr + .endm + + .macro jumpifcriticalhit failInstr:req + callnative BS_JumpIfCriticalHit + .4byte \failInstr + .endm @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req @@ -2006,9 +2062,10 @@ .4byte \jumpInstr .endm - .macro trypsychoshift failInstr:req + .macro trypsychoshift failInstr:req sleepClauseFailInstr:req various BS_ATTACKER, VARIOUS_PSYCHO_SHIFT .4byte \failInstr + .4byte \sleepClauseFailInstr .endm .macro curestatus battler:req @@ -2312,11 +2369,11 @@ .endm .macro swapsidestatuses - various BS_ATTACKER, VARIOUS_SWAP_SIDE_STATUSES + callnative BS_CourtChangeSwapSideStatuses .endm .macro swapstats stat:req - various BS_ATTACKER, VARIOUS_SWAP_STATS + callnative BS_SwapStats .byte \stat .endm @@ -2391,7 +2448,7 @@ .endm .macro jumpifmovehadnoeffect jumpInstr:req - jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_NO_EFFECT, \jumpInstr + jumpifmoveresultflags MOVE_RESULT_NO_EFFECT, \jumpInstr .endm .macro jumpifside battler:req, side:req, equalJumpInstr:req diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 4c0bf54514..f621dd16cd 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -254,15 +254,26 @@ .endm @ Calls the native C function stored at func. - .macro callnative func:req + @ 'callnative's should set 'requests_effects=1' if the native + @ contains a call to 'Script_RequestEffects', which allows them + @ to be analyzed by 'RunScriptImmediatelyUntilEffect'. + .macro callnative func:req, requests_effects=0 .byte SCR_OP_CALLNATIVE + .if \requests_effects == 0 .4byte \func + .else + .4byte \func + ROM_SIZE + .endif .endm @ Replaces the script with the function stored at func. Execution returns to the bytecode script when func returns TRUE. - .macro gotonative func:req + .macro gotonative func:req, requests_effects=0 .byte SCR_OP_GOTONATIVE + .if \requests_effects == 0 .4byte \func + .else + .4byte \func + ROM_SIZE + .endif .endm @ Calls a function listed in the table in data/specials.inc. @@ -683,59 +694,31 @@ .byte \direction .endm + NULL = 0 + OBJ_ID_NONE = 0 + @ Configures the arguments for a trainer battle, then jumps to the appropriate script in scripts/trainer_battle.inc - .macro trainerbattle type:req, trainer:req, local_id:req, pointer1:req, pointer2, pointer3, pointer4 + .macro trainerbattle type:req localIdA:req, trainer_a:req, intro_text_a:req, lose_text_a:req, event_script_a:req, localIdB:req, trainer_b:req, intro_text_b:req, lose_text_b:req, event_script_b:req, victory_text:req, cannot_battle:req, isDouble:req, playMusicA:req, playMusicB:req, isRematch:req .byte SCR_OP_TRAINERBATTLE - .byte \type - .2byte \trainer - .2byte \local_id - .if \type == TRAINER_BATTLE_SINGLE - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ event script - .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ event script - .elseif \type == TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT - .4byte \pointer1 @ text - .elseif \type == TRAINER_BATTLE_DOUBLE - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ text - .elseif \type == TRAINER_BATTLE_REMATCH - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ text - .4byte \pointer4 @ event script - .elseif \type == TRAINER_BATTLE_REMATCH_DOUBLE - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ text - .elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .4byte \pointer3 @ text - .4byte \pointer4 @ event script - .elseif \type == TRAINER_BATTLE_PYRAMID - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .elseif \type == TRAINER_BATTLE_SET_TRAINER_A - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .elseif \type == TRAINER_BATTLE_SET_TRAINER_B - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .elseif \type == TRAINER_BATTLE_HILL - .4byte \pointer1 @ text - .4byte \pointer2 @ text - .endif + .set trainerbattle_flags, 0 + .ifgt \isDouble; .set trainerbattle_flags, trainerbattle_flags | (1 << 0); .endif + .ifgt \isRematch; .set trainerbattle_flags, trainerbattle_flags | (1 << 1); .endif + .ifgt \playMusicA; .set trainerbattle_flags, trainerbattle_flags | (1 << 2); .endif + .ifgt \playMusicB; .set trainerBattle_flags, trainerbattle_flags | (1 << 3); .endif + .ifgt \type; .set trainerbattle_flags, trainerbattle_flags | (\type << 4); .endif + .byte trainerbattle_flags + .byte \localIdA @ objEventLocalIdA + .2byte \trainer_a @ opponentA + .4byte \intro_text_a @ introTextA + .4byte \lose_text_a @ defeatTextA + .4byte \event_script_a @ retAddrA + .byte \localIdB @ objEventLocalIdB + .2byte \trainer_b @ opponentB + .4byte \intro_text_b @ introTextB + .4byte \lose_text_b @ defeatTextB + .4byte \event_script_b @ retAddrB + .4byte \victory_text @ victoryText + .4byte \cannot_battle @ cannotBattle .endm NO_MUSIC = FALSE @@ -744,11 +727,11 @@ @ When used with an event script, you can also pass in an optional flag to disable music .macro trainerbattle_single trainer:req, intro_text:req, lose_text:req, event_script=FALSE, music=TRUE .if \event_script == FALSE - trainerbattle TRAINER_BATTLE_SINGLE, \trainer, 0, \intro_text, \lose_text + trainerbattle TRAINER_BATTLE_SINGLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE .elseif \music == TRUE - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, \trainer, 0, \intro_text, \lose_text, \event_script + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE .else - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, \trainer, 0, \intro_text, \lose_text, \event_script + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE .endif .endm @@ -756,38 +739,33 @@ @ and an optional event script. When used with an event script you can pass in an optional flag to disable music .macro trainerbattle_double trainer:req, intro_text:req, lose_text:req, not_enough_pkmn_text:req, event_script=FALSE, music=TRUE .if \event_script == FALSE - trainerbattle TRAINER_BATTLE_DOUBLE, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text + trainerbattle TRAINER_BATTLE_DOUBLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, TRUE, FALSE, FALSE .elseif \music == TRUE - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text, \event_script + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, TRUE, FALSE, FALSE .else - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text, \event_script + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, FALSE, FALSE, FALSE .endif .endm @ Starts a rematch battle. Takes a trainer, intro text and loss text .macro trainerbattle_rematch trainer:req, intro_text:req, lose_text:req - trainerbattle TRAINER_BATTLE_REMATCH, \trainer, 0, \intro_text, \lose_text + trainerbattle TRAINER_BATTLE_REMATCH, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, TRUE .endm @ Starts a rematch double battle. Takes a trainer, intro text, loss text, and text for when you have too few pokemon .macro trainerbattle_rematch_double trainer:req, intro_text:req, lose_text:req, not_enough_pkmn_text:req - trainerbattle TRAINER_BATTLE_REMATCH_DOUBLE, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text + trainerbattle TRAINER_BATTLE_REMATCH_DOUBLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, FALSE, TRUE, FALSE, TRUE .endm @ Starts a trainer battle, skipping intro text. Takes a trainer and loss text .macro trainerbattle_no_intro trainer:req, lose_text:req - trainerbattle TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT, \trainer, 0, \lose_text + trainerbattle TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT, OBJ_ID_NONE, \trainer, NULL, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE .endm @ Starts a double battle with the player against two trainers @ Takes two trainers and defeat text for each .macro trainerbattle_two_trainers trainer_a:req, lose_text_a:req, trainer_b:req, lose_text_b:req - .byte 0x5c - .byte TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO - .2byte \trainer_a - .4byte \lose_text_a - .2byte \trainer_b - .4byte \lose_text_b + trainerbattle TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO, OBJ_ID_NONE, \trainer_a, NULL, \lose_text_a, NULL, OBJ_ID_NONE, \trainer_b, NULL, \lose_text_b, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE .endm @ Starts a trainer battle using the battle information stored in RAM (usually by the scripts in trainer_battle.inc, which @@ -999,10 +977,10 @@ @ Gives the player a Pokémon of the specified species and level, and allows to customize extra parameters. @ VAR_RESULT will be set to MON_GIVEN_TO_PARTY, MON_GIVEN_TO_PC, or MON_CANT_GIVE depending on the outcome. - .macro givemon species:req, level:req, item, ball, nature, abilityNum, gender, hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, move1, move2, move3, move4, isShiny, ggMaxFactor, teraType - callnative ScrCmd_createmon + .macro givemon species:req, level:req, item, ball, nature, abilityNum, gender, hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, move1, move2, move3, move4, isShiny, gmaxFactor, teraType, dmaxLevel + callnative ScrCmd_createmon, requests_effects=1 .byte 0 - .byte 6 @ PARTY_SIZE - assign to first empty slot + .byte PARTY_SIZE @ assign to first empty slot .set givemon_flags, 0 .2byte \species .2byte \level @@ -1028,8 +1006,9 @@ .ifnb \move3; .set givemon_flags, givemon_flags | (1 << 19); .endif .ifnb \move4; .set givemon_flags, givemon_flags | (1 << 20); .endif .ifnb \isShiny; .set givemon_flags, givemon_flags | (1 << 21); .endif - .ifnb \ggMaxFactor; .set givemon_flags, givemon_flags | (1 << 22); .endif + .ifnb \gmaxFactor; .set givemon_flags, givemon_flags | (1 << 22); .endif .ifnb \teraType; .set givemon_flags, givemon_flags | (1 << 23); .endif + .ifnb \dmaxLevel; .set givemon_flags, givemon_flags | (1 << 24); .endif .4byte givemon_flags .ifnb \item; .2byte \item; .endif .ifnb \ball; .2byte \ball; .endif @@ -1053,14 +1032,15 @@ .ifnb \move3; .2byte \move3; .endif .ifnb \move4; .2byte \move4; .endif .ifnb \isShiny; .2byte \isShiny; .endif - .ifnb \ggMaxFactor; .2byte \ggMaxFactor; .endif + .ifnb \gmaxFactor; .2byte \gmaxFactor; .endif .ifnb \teraType; .2byte \teraType; .endif + .ifnb \dmaxLevel; .2byte \dmaxLevel; .endif .endm @ creates a mon for a given party and slot @ otherwise - .macro createmon side:req, slot:req, species:req, level:req, item, ball, nature, abilityNum, gender, hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, move1, move2, move3, move4, isShiny, ggMaxFactor, teraType - callnative ScrCmd_createmon + .macro createmon side:req, slot:req, species:req, level:req, item, ball, nature, abilityNum, gender, hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, move1, move2, move3, move4, isShiny, gmaxFactor, teraType, dmaxLevel + callnative ScrCmd_createmon, requests_effects=1 .byte \side @ 0 - player, 1 - opponent .byte \slot @ 0-5 .set givemon_flags, 0 @@ -1088,8 +1068,9 @@ .ifnb \move3; .set givemon_flags, givemon_flags | (1 << 19); .endif .ifnb \move4; .set givemon_flags, givemon_flags | (1 << 20); .endif .ifnb \isShiny; .set givemon_flags, givemon_flags | (1 << 21); .endif - .ifnb \ggMaxFactor; .set givemon_flags, givemon_flags | (1 << 22); .endif + .ifnb \gmaxFactor; .set givemon_flags, givemon_flags | (1 << 22); .endif .ifnb \teraType; .set givemon_flags, givemon_flags | (1 << 23); .endif + .ifnb \dmaxLevel; .set givemon_flags, givemon_flags | (1 << 24); .endif .4byte givemon_flags .ifnb \item; .2byte \item; .endif .ifnb \ball; .2byte \ball; .endif @@ -1113,8 +1094,9 @@ .ifnb \move3; .2byte \move3; .endif .ifnb \move4; .2byte \move4; .endif .ifnb \isShiny; .2byte \isShiny; .endif - .ifnb \ggMaxFactor; .2byte \ggMaxFactor; .endif + .ifnb \gmaxFactor; .2byte \gmaxFactor; .endif .ifnb \teraType; .2byte \teraType; .endif + .ifnb \dmaxLevel; .2byte \dmaxLevel; .endif .endm @ Gives the player an Egg of the specified species. @@ -1808,7 +1790,7 @@ .4byte \text .endm - @ Equivalent to fadescreen but copies gPlttBufferUnfaded to gDecompressionBuffer on the fade out + @ Equivalent to fadescreen but copies gPlttBufferUnfaded to an allocated buffer on the fade out @ and the reverse on the fade in, in effect saving gPlttBufferUnfaded to restore it. .macro fadescreenswapbuffers mode:req .byte SCR_OP_FADESCREENSWAPBUFFERS @@ -2106,7 +2088,7 @@ .endm .macro setdynamicaifunc func:req - callnative ScriptSetDynamicAiFunc + callnative ScriptSetDynamicAiFunc, requests_effects=1 .4byte \func .endm @@ -2115,7 +2097,7 @@ @ The rest of the arguments are the stat change values to each stat. @ For example, giving the first opponent +1 to atk and -2 to speed would be: settotemboost B_POSITION_OPPONENT_LEFT, 1, 0, -2 .macro settotemboost battler:req, atk=0,def=0,speed=0,spatk=0,spdef=0,acc=0,evas=0 - callnative ScriptSetTotemBoost + callnative ScriptSetTotemBoost, requests_effects=1 .2byte \battler .2byte \atk .2byte \def @@ -2186,21 +2168,21 @@ .macro ai_vs_ai_battle trainer1:req, trainer2:req setflag B_FLAG_AI_VS_AI_BATTLE setvar VAR_0x8004, \trainer1 - callnative CreateTrainerPartyForPlayer + callnative CreateTrainerPartyForPlayer, requests_effects=1 trainerbattle_no_intro \trainer2, NULL .endm @ Sets VAR_RESULT to TRUE if stat can be hyper trained, or to @ FALSE otherwise. .macro canhypertrain stat:req, slot:req - callnative CanHyperTrain + callnative CanHyperTrain, requests_effects=1 .byte \stat .2byte \slot .endm @ Hyper Trains a stat. .macro hypertrain stat:req, slot:req - callnative HyperTrain + callnative HyperTrain, requests_effects=1 .byte \stat .2byte \slot .endm @@ -2208,7 +2190,7 @@ @ Sets VAR_RESULT to TRUE if the Pokemon has the Gigantamax Factor, @ or to FALSE otherwise. .macro hasgigantamaxfactor slot:req - callnative HasGigantamaxFactor + callnative HasGigantamaxFactor, requests_effects=1 .2byte \slot .endm @@ -2216,7 +2198,7 @@ @ Fails for Melmetal (vanilla behavior). @ Sets VAR_RESULT to TRUE if it succeeds, and FALSE otherwise. .macro togglegigantamaxfactor slot:req - callnative ToggleGigantamaxFactor + callnative ToggleGigantamaxFactor, requests_effects=1 .2byte \slot .endm @@ -2254,27 +2236,27 @@ @ Inflicts \status1 to the Pokémon in \slot. @ If \slot is greater or equal than PARTY_SIZE, the status is inflicted on each of the Player's Pokémon. .macro setstatus1 status1:req, slot:req - callnative Script_SetStatus1 + callnative Script_SetStatus1, requests_effects=1 .2byte \status1 .2byte \slot .endm @ Sets VAR_RESULT to the Pokémon in \slot's Tera Type .macro checkteratype slot:req - callnative CheckTeraType + callnative CheckTeraType, requests_effects=1 .2byte \slot .endm @ Sets the Pokémon in \slot's Tera Type .macro setteratype type:req, slot:req - callnative SetTeraType + callnative SetTeraType, requests_effects=1 .byte \type .2byte \slot .endm @ Saves species and forms of Daycare Pokémon to specific vars. Saves the amount of Daycare mon to VAR_RESULT. .macro getdaycaregfx varSpecies1:req varSpecies2:req varForm1:req varForm2:req - callnative GetDaycareGraphics + callnative GetDaycareGraphics, requests_effects=1 .2byte \varSpecies1 .2byte \varSpecies2 .2byte \varForm1 @@ -2283,12 +2265,12 @@ @ Plays the cry of the first alive party member. .macro playfirstmoncry - callnative PlayFirstMonCry + callnative PlayFirstMonCry, requests_effects=1 .endm @ Buffers the nickname of the first alive party member. .macro bufferlivemonnickname out:req - callnative BufferFirstLiveMonNickname + callnative BufferFirstLiveMonNickname, requests_effects=1 .byte \out .endm @@ -2299,13 +2281,13 @@ @ Checks if Field move is being used by the current follower. .macro isfollowerfieldmoveuser var:req - callnative IsFollowerFieldMoveUser + callnative IsFollowerFieldMoveUser, requests_effects=1 .2byte \var .endm @ Saves the direction from where source object event would need to turn to to face the target into the specified var. .macro getdirectiontoface var:req, sourceId:req, targetId:req - callnative GetDirectionToFaceScript + callnative GetDirectionToFaceScript, requests_effects=1 .2byte \var .byte \sourceId .byte \targetId @@ -2314,50 +2296,50 @@ @ set the wild double battle flag @ can be used in conjunection with createmon to set up a wild battle with 2 player mons vs. 1 enemy mon .macro setwilddoubleflag - callnative ScriptSetDoubleBattleFlag + callnative ScriptSetDoubleBattleFlag, requests_effects=1 .endm @ When OW_USE_FAKE_RTC and OW_FLAG_PAUSE_TIME is assigned, this macro will stop the flow of time. .macro pausefakertc - callnative Script_PauseFakeRtc + callnative Script_PauseFakeRtc, requests_effects=1 .endm @ When OW_USE_FAKE_RTC and OW_FLAG_PAUSE_TIME is assigned, this macro will resume the flow of time. .macro resumefakertc - callnative Script_ResumeFakeRtc + callnative Script_ResumeFakeRtc, requests_effects=1 .endm @ When OW_USE_FAKE_RTC and OW_FLAG_PAUSE_TIME is assigned, this macro will resume the flow of time if paused, and stop the flow of time otherwise. .macro togglefakertc - callnative Script_ToggleFakeRtc + callnative Script_ToggleFakeRtc, requests_effects=1 .endm @ ============================ @ @ ITEM DESCRIPTION HEADER MACROS @ Used with OW_SHOW_ITEM_DESCRIPTIONS config .macro showitemdescription - callnative ScriptShowItemDescription + callnative ScriptShowItemDescription, requests_effects=1 .byte 0 .endm .macro showberrydescription - callnative ScriptShowItemDescription + callnative ScriptShowItemDescription, requests_effects=1 .byte 1 .endm .macro hideitemdescription - callnative ScriptHideItemDescription + callnative ScriptHideItemDescription, requests_effects=1 .endm @ Remove all of specified item from the player's bag and return the number of removed items to VAR_RESULT .macro removeallitem itemId:req - callnative ScrCmd_removeallitem + callnative ScrCmd_removeallitem, requests_effects=1 .2byte \itemId .endm @ Stores the position of the given object in destX and destY. Mode CURRENT_POSITION will take the object's current position. Mode TEMPLATE_POSITION will take the object's template position. .macro getobjectxy localId:req, posType:req, destX:req, destY:req - callnative ScrCmd_getobjectxy + callnative ScrCmd_getobjectxy, requests_effects=1 .2byte \localId .2byte \posType .2byte \destX @@ -2365,7 +2347,7 @@ .endm .macro getobjecttemplatexy localId:req, posType = TEMPLATE_POSITION, destX:req, destY:req - callnative ScrCmd_getobjectxy + callnative ScrCmd_getobjectxy, requests_effects=1 .2byte \localId .2byte \posType .2byte \destX @@ -2373,7 +2355,7 @@ .endm .macro getobjectcurrentxy localId:req, posType = CURRENT_POSITION, destX:req, destY:req - callnative ScrCmd_getobjectxy + callnative ScrCmd_getobjectxy, requests_effects=1 .2byte \localId .2byte \posType .2byte \destX @@ -2382,7 +2364,7 @@ @ Return TRUE to dest if there is an object at the position x and y. .macro checkobjectat x:req, y:req, dest = VAR_RESULT - callnative ScrCmd_checkobjectat + callnative ScrCmd_checkobjectat, requests_effects=1 .2byte \x .2byte \y .2byte \dest @@ -2390,28 +2372,28 @@ @ Returns the state of the Pokedex Seen Flag to VAR_RESULT for the Pokemon with speciesId .macro getseenmon species:req - callnative Scrcmd_getsetpokedexflag + callnative Scrcmd_getsetpokedexflag, requests_effects=1 .2byte \species .2byte FLAG_GET_SEEN .endm @ Returns the state of the Pokedex Caught Flag to VAR_RESULT for the Pokemon with speciesId .macro getcaughtmon species:req - callnative Scrcmd_getsetpokedexflag + callnative Scrcmd_getsetpokedexflag, requests_effects=1 .2byte \species .2byte FLAG_GET_CAUGHT .endm @ Sets the Pokedex Seen Flag for the Pokemon with speciesId .macro setseenmon species:req - callnative Scrcmd_getsetpokedexflag + callnative Scrcmd_getsetpokedexflag, requests_effects=1 .2byte \species .2byte FLAG_SET_SEEN .endm @ Sets the Pokedex Caught Flag for the Pokemon with speciesId .macro setcaughtmon species:req - callnative Scrcmd_getsetpokedexflag + callnative Scrcmd_getsetpokedexflag, requests_effects=1 .2byte \species .2byte FLAG_SET_CAUGHT .endm @@ -2421,10 +2403,10 @@ .if \mode == OPEN_PARTY_SCREEN special ChoosePartyMon waitstate - callnative Scrcmd_checkspecies_choose + callnative Scrcmd_checkspecies_choose, requests_effects=1 .2byte \speciesId .else - callnative Scrcmd_checkspecies + callnative Scrcmd_checkspecies, requests_effects=1 .2byte \speciesId .endif .endm @@ -2435,7 +2417,7 @@ @ Gets the facing direction of a given event object and stores it in the variable dest. .macro getobjectfacingdirection localId:req, dest:req - callnative Scrcmd_getobjectfacingdirection + callnative Scrcmd_getobjectfacingdirection, requests_effects=1 .2byte \localId .2byte \dest .endm @@ -2445,3 +2427,86 @@ callnative ScrFunc_hidefollower .2byte \wait .endm + + .macro increasedifficulty + callnative Script_IncreaseDifficulty, requests_effects=1 + .endm + + .macro decreasedifficulty + callnative Script_DecreaseDifficulty, requests_effects=1 + .endm + + .macro getdifficulty var:req + callnative Script_GetDifficulty, requests_effects=1 + .endm + + .macro setdifficulty difficulty:req + callnative Script_SetDifficulty, requests_effects=1 + .byte \difficulty + .endm + + .macro forcesave + callnative Script_ForceSaveGame + waitstate + .endm + + @ Makes the trainer unable to see the player if executed. + @ This is a no-op if the player interacts with the trainer. + .macro cant_see_if, condition:req + callnative Script_EndTrainerCanSeeIf, requests_effects=1 + .byte \condition + .endm + + .macro cant_see + cant_see_if_unset 0 @ flag 0 is always FALSE. + .endm + + .macro cant_see_if_unset, flag:req + checkflag \flag + cant_see_if FALSE + .endm + + .macro cant_see_if_set, flag:req + checkflag \flag + cant_see_if TRUE + .endm + + .macro cant_see_if_trainerflag_unset, trainer:req + checktrainerflag \trainer + cant_see_if FALSE + .endm + + .macro cant_see_if_trainerflag_set, trainer:req + checktrainerflag \trainer + cant_see_if TRUE + .endm + + .macro cant_see_if_lt, a:req, b:req + compare \a, \b + cant_see_if 0 + .endm + + .macro cant_see_if_eq, a:req, b:req + compare \a, \b + cant_see_if 1 + .endm + + .macro cant_see_if_gt, a:req, b:req + compare \a, \b + cant_see_if 2 + .endm + + .macro cant_see_if_le, a:req, b:req + compare \a, \b + cant_see_if 3 + .endm + + .macro cant_see_if_ge, a:req, b:req + compare \a, \b + cant_see_if 4 + .endm + + .macro cant_see_if_ne, a:req, b:req + compare \a, \b + cant_see_if 5 + .endm diff --git a/charmap.txt b/charmap.txt index e2acfdf16b..cd0972f84a 100644 --- a/charmap.txt +++ b/charmap.txt @@ -413,6 +413,7 @@ B_ATK_TEAM2 = FD 38 B_DEF_NAME = FD 39 B_DEF_TEAM1 = FD 3A B_DEF_TEAM2 = FD 3B +B_DEF_PARTNER_NAME = FD 3C @ FD 3C - preiously gActiveBattler @ FD 3D - preiously gActiveBattler without Illusion Check B_ATK_NAME_WITH_PREFIX2 = FD 3E diff --git a/constants/gba_constants.inc b/constants/gba_constants.inc index 9f51b0f02b..febb1244d0 100644 --- a/constants/gba_constants.inc +++ b/constants/gba_constants.inc @@ -29,6 +29,9 @@ .set OAM, 0x7000000 + .set ROM, 0x8000000 + .set ROM_SIZE, 0x2000000 + .set SOUND_INFO_PTR, 0x3007FF0 .set INTR_CHECK, 0x3007FF8 .set INTR_VECTOR, 0x3007FFC diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 3db049255b..35c43a793a 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1880,7 +1880,7 @@ gBattleAnimMove_Avalanche:: loadspritegfx ANIM_TAG_ICE_CHUNK monbg ANIM_DEF_PARTNER createsprite gShakeMonOrTerrainSpriteTemplate, ANIM_TARGET, 2, 7, 1, 11, 1 - createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 130, 4, -5, 1, -5, 1 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 130, -5, 1, -5, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET delay 2 createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 130, 5, 0, 6, 1 @@ -5554,44 +5554,40 @@ GrassPledgeMiddleFountain: delay 4 return +@Credits to Skeli gBattleAnimMove_VoltSwitch:: - loadspritegfx ANIM_TAG_SPARK + loadspritegfx ANIM_TAG_SHADOW_BALL + loadspritegfx ANIM_TAG_IONS loadspritegfx ANIM_TAG_SPARK_2 - loadspritegfx ANIM_TAG_THIN_RING - monbg ANIM_ATTACKER - setalpha 12, 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x3BDF, 8 - playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + createsprite gVoltSwitchSpriteTemplate, ANIM_TARGET, 3, 0, 0, 0, 0, 32, 20 + delay 30 + createvisualtask AnimTask_ShakeMon2 2, ANIM_TARGET, 3, 0, 8, 1 + call VoltSwitchElectricFlashes + delay 2 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + createsprite gVoltSwitchSpriteTemplate ANIM_TARGET, 3, 0, 0, 0, 0, 32, -20 delay 4 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x3BDF, 8 - delay 4 - 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 - delay 4 - call ElectricityEffect - playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createvisualtask AnimTask_CanBattlerSwitch, 1, ANIM_ATTACKER - jumpretfalse VoltSwitchContinue - createvisualtask AnimTask_IsTargetSameSide 1 - jumprettrue VoltSwitchAgainstPartner - createvisualtask AnimTask_SlideOffScreen, 5, ANIM_ATTACKER, -2 -VoltSwitchContinue: + call VoltSwitchElectricFlashes + delay 18 + createvisualtask AnimTask_ShakeMon2 2, ANIM_TARGET, 3, 0, 8, 1 + call VoltSwitchElectricFlashes + delay 6 + call VoltSwitchElectricFlashes waitforvisualfinish - clearmonbg ANIM_ATTACKER - blendoff - createvisualtask AnimTask_CanBattlerSwitch, 1, ANIM_ATTACKER - jumpretfalse VoltSwitchLast - invisible ANIM_ATTACKER -VoltSwitchLast: - delay 8 end -@ Attacking the same side requires a change of direction -@ why would you attack your partner though?! -VoltSwitchAgainstPartner: - createvisualtask AnimTask_SlideOffScreen, 5, ANIM_ATTACKER, 2 - goto VoltSwitchContinue + +VoltSwitchElectricFlashes: + playsewithpan SE_M_CHARGE, SOUND_PAN_TARGET + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 5, 0, 5, 0 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -5, 10, 5, 1 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 15, 20, 5, 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -15, -10, 5, 0 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 25, 0, 5, 1 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -8, 8, 5, 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 2, -8, 5, 0 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -20, 15, 5, 1 + return gBattleAnimMove_StruggleBug:: loadspritegfx ANIM_TAG_MOVEMENT_WAVES @@ -5627,7 +5623,6 @@ gBattleAnimMove_Bulldoze:: gBattleAnimMove_FrostBreath:: loadspritegfx ANIM_TAG_ICE_CHUNK loadspritegfx ANIM_TAG_SMALL_EMBER - loadspritegfx ANIM_TAG_FIRE_PLUME fadetobg BG_ICE waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0x300, 0x0, 0x0, 0xffff @@ -5639,6 +5634,8 @@ gBattleAnimMove_FrostBreath:: waitforvisualfinish createsprite gFrostBreathBlueBreathTemplate, ANIM_TARGET, 2, 0x1e, 0xf, 0x0, 0xa, 0xa waitforvisualfinish + unloadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_FIRE_PLUME loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0xb, 0x3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0x5, 0x0 @@ -7722,7 +7719,6 @@ gBattleAnimMove_ParabolicCharge:: loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_LIGHTNING loadspritegfx ANIM_TAG_ORBS - loadspritegfx ANIM_TAG_BLUE_STAR monbg ANIM_ATTACKER setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 6, RGB(18, 16, 3) @@ -7745,6 +7741,11 @@ gBattleAnimMove_ParabolicCharge:: createvisualtask AnimTask_BlendBattleAnimPal, 5, 4, 0, 0, 0, RGB_BLACK ParabolicChargeHeal: waitforvisualfinish + unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + unloadspritegfx ANIM_TAG_ELECTRIC_ORBS + unloadspritegfx ANIM_TAG_SPARK + unloadspritegfx ANIM_TAG_LIGHTNING + loadspritegfx ANIM_TAG_BLUE_STAR clearmonbg ANIM_ATTACKER waitforvisualfinish call HealingEffect @@ -12318,14 +12319,13 @@ ZingZapSparks2: return gBattleAnimMove_NaturesMadness:: - loadspritegfx ANIM_TAG_ICE_CRYSTALS @small circles - loadspritegfx ANIM_TAG_THIN_RING @ring - loadspritegfx ANIM_TAG_SPARKLE_2 @stars - loadspritegfx ANIM_TAG_PINK_PETAL @pink - loadspritegfx ANIM_TAG_ICE_CHUNK @blue green + loadspritegfx ANIM_TAG_ICE_CRYSTALS @small circles CrystalsTemplate + loadspritegfx ANIM_TAG_THIN_RING @ring PinkRingTemplate, GrayRingTemplate + loadspritegfx ANIM_TAG_SPARKLE_2 @stars PinkStarsTemplate + loadspritegfx ANIM_TAG_PINK_PETAL @pink PinkRingTemplate, PinkStarsTemplate + loadspritegfx ANIM_TAG_ICE_CHUNK @blue green CrystalsTemplate loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge loadspritegfx ANIM_TAG_TEAL_ALERT @charge particles - loadspritegfx ANIM_TAG_ECLIPSING_ORB @blue green monbg ANIM_ATTACKER setalpha 14, 8 delay 0x1 @@ -12361,6 +12361,8 @@ gBattleAnimMove_NaturesMadness:: delay 0x1 monbg ANIM_TARGET waitforvisualfinish + unloadspritegfx ANIM_TAG_SPARKLE_2 + loadspritegfx ANIM_TAG_ECLIPSING_ORB @blue green grayRing createsprite gNaturesMadnessGrayRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x1, 0x0 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER delay 0xe @@ -13144,7 +13146,6 @@ gBattleAnimMove_StuffCheeks:: loadspritegfx ANIM_TAG_BERRY_NORMAL loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_THIN_RING - loadspritegfx ANIM_TAG_SPARKLE_2 playsewithpan SE_M_METRONOME, 0xc0 createsprite gFloatingBerryTemplate, ANIM_ATTACKER, 1, 0x0 delay 0x45 @@ -18070,10 +18071,199 @@ PopulationBombContinue: gBattleAnimMove_RevivalBlessing:: goto gBattleAnimMove_LunarBlessing +gBattleAnimMove_TeraStarstorm:: + loadspritegfx ANIM_TAG_STARSTORM + loadspritegfx ANIM_TAG_YELLOW_STAR + loadspritegfx ANIM_TAG_IMPACT + fadetobg BG_COSMIC + waitbgfadein + playsewithpan SE_FALL, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + jumpifmovetypeequal TYPE_STELLAR, TeraStarstormStellar + goto TeraStarstormSingle +TeraStarstormStellar: + jumpifdoublebattle TeraStarstormDouble +TeraStarstormSingle: + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + delay 3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, -5, 30, 0, 1 + delay 3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 5, 30, 0, 1 + delay 3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + waitforvisualfinish + restorebg + waitbgfadeout + end +TeraStarstormDouble: + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + waitforvisualfinish + restorebg + waitbgfadeout + end + +TeraStarstormCreateBeam:: + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -3, 1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 1, 0, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 3, -1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -2, 0, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 0, 1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -1, -1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 2, 0, 0, 0, 20 + return + +gBattleAnimMove_TachyonCutter:: + loadspritegfx ANIM_TAG_CUT + loadspritegfx ANIM_TAG_BUBBLE + createsprite gTachyonCutterSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 + createsprite gTachyonCutterSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + waitforvisualfinish + end + +gBattleAnimMove_SaltCure:: + loadspritegfx ANIM_TAG_SALT_PARTICLE + loadspritegfx ANIM_TAG_WATER_ORB + call SaltCureEffect + call SaltCureEffect + call SaltCureEffect + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + waitforvisualfinish + call gBattleAnimGeneral_SaltCureDamage + end + +SaltCureEffect: + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 28, 384, 50, 8, 50, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 32, 240, 40, 11, -46, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 33, 416, 40, 4, 42, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 31, 288, 45, 6, -42, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 28, 448, 45, 11, 46, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 50, 10, -50, ANIM_TARGET + delay 2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + return + gBattleAnimMove_TeraBlast:: gBattleAnimMove_OrderUp:: gBattleAnimMove_GlaiveRush:: -gBattleAnimMove_SaltCure:: gBattleAnimMove_TripleDive:: gBattleAnimMove_Doodle:: gBattleAnimMove_Ruination:: @@ -18087,9 +18277,7 @@ gBattleAnimMove_CombatTorque:: gBattleAnimMove_MagicalTorque:: gBattleAnimMove_Psyblade:: gBattleAnimMove_MatchaGotcha:: -gBattleAnimMove_TeraStarstorm:: gBattleAnimMove_MightyCleave:: -gBattleAnimMove_TachyonCutter:: gBattleAnimMove_SupercellSlam:: end @to do @@ -28783,7 +28971,41 @@ General_AffectionHangedOn_3Hearts: end gBattleAnimGeneral_SaltCureDamage:: - goto gBattleAnimStatus_Freeze + loadspritegfx ANIM_TAG_SALT_PARTICLE + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -10, -10, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 10, 20, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -29, 0, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 29, -20, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -5, 10, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 17, -12, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -20, 0, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -15, 15, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 26, -5, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 20, 2, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + waitforvisualfinish + end gBattleAnimGeneral_Rainbow:: call RainDrops diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 66159bc7fb..748fa2c5be 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -26,7 +26,7 @@ BattleScript_DamageToQuarterTargetHP:: attackstring ppreduce typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE damagetoquartertargethp goto BattleScript_HitFromAtkAnimation @@ -211,7 +211,7 @@ BattleScript_FilletAwayTrySpeed:: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayEnd:: - bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + clearmoveresultflags MOVE_RESULT_NO_EFFECT healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER goto BattleScript_MoveEnd @@ -244,7 +244,7 @@ BattleScript_EffectDoodle_AfterCopy: BattleScript_EffectGlaiveRush:: call BattleScript_EffectHit_Ret - jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TryFaintMon + jumpifmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TryFaintMon setglaiverush goto BattleScript_TryFaintMon @@ -272,7 +272,7 @@ BattleScript_EffectChillyReception:: jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_EffectChillyReceptionBlockedByPrimalRain jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_EffectChillyReceptionBlockedByStrongWinds call BattleScript_EffectChillyReceptionPlayAnimation - setfieldweather ENUM_WEATHER_SNOW + setfieldweather BATTLE_WEATHER_SNOW call BattleScript_MoveWeatherChangeRet goto BattleScript_MoveSwitch BattleScript_EffectChillyReceptionPlayAnimation: @@ -304,12 +304,20 @@ BattleScript_CheckPrimalWeather: jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn return +BattleScript_MoveSwitchPursuit: + jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_MoveSwitchEnd + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_MoveSwitchEnd + printstring STRINGID_PKMNWENTBACK + waitmessage B_WAIT_TIME_SHORT + jumpifnopursuitswitchdmg BattleScript_MoveSwitchOpenPartyScreen + end + BattleScript_MoveSwitch: jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_MoveSwitchEnd jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_MoveSwitchEnd printstring STRINGID_PKMNWENTBACK waitmessage B_WAIT_TIME_SHORT -BattleScript_MoveSwitchOpenPartyScreen: +BattleScript_MoveSwitchOpenPartyScreen:: openpartyscreen BS_ATTACKER, BattleScript_MoveSwitchEnd switchoutabilities BS_ATTACKER waitstate @@ -434,7 +442,7 @@ BattleScript_EffectCorrosiveGas:: BattleScript_CorrosiveGasFail: pause B_WAIT_TIME_SHORT - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED printstring STRINGID_NOEFFECTONTARGET waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -717,7 +725,7 @@ BattleScript_SkyDropFlyingType: goto BattleScript_MoveEnd BattleScript_SkyDropChangedTarget: pause B_WAIT_TIME_SHORT - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED resultmessage waitmessage B_WAIT_TIME_LONG makevisible BS_ATTACKER @@ -828,8 +836,8 @@ BattleScript_FlingMissed: ppreduce goto BattleScript_MoveMissedPause -BattleScript_EffectPhotonGeyser:: - setphotongeysercategory +BattleScript_EffectDynamicCategory:: + setdynamicmovecategory goto BattleScript_EffectHit BattleScript_EffectAuraWheel:: @ Aura Wheel can only be used by Morpeko @@ -948,15 +956,6 @@ BattleScript_MoveEffectIonDeluge:: waitmessage B_WAIT_TIME_LONG return -BattleScript_EffectSparklySwirl:: - call BattleScript_EffectHit_Ret - tryfaintmon BS_TARGET - healpartystatus - waitstate - updatestatusicon BS_ATTACKER_WITH_PARTNER - waitstate - goto BattleScript_MoveEnd - BattleScript_MoveEffectHaze:: printstring STRINGID_STATCHANGESGONE waitmessage B_WAIT_TIME_LONG @@ -1345,7 +1344,7 @@ BattleScript_EffectPartingShotTrySpAtk: waitmessage B_WAIT_TIME_LONG BattleScript_EffectPartingShotSwitch: moveendall - goto BattleScript_MoveSwitch + goto BattleScript_MoveSwitchPursuit BattleScript_EffectPowder:: attackcanceler @@ -1642,7 +1641,7 @@ BattleScript_EffectPsychoShift:: BattleScript_EffectPsychoShiftCanWork: jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed jumpifsafeguard BattleScript_SafeguardProtected - trypsychoshift BattleScript_ButItFailed + trypsychoshift BattleScript_ButItFailed, BattleScript_SleepClauseBlocked attackanimation waitanimation copybyte gEffectBattler, gBattlerTarget @@ -1796,7 +1795,7 @@ BattleScript_EffectFinalGambit:: ppreduce critcalc typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE dmgtocurrattackerhp adjustdamage attackanimation @@ -1808,13 +1807,13 @@ BattleScript_EffectFinalGambit:: datahpupdate BS_TARGET resultmessage waitmessage B_WAIT_TIME_LONG - dmgtocurrattackerhp - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER setadditionaleffects - tryfaintmon BS_ATTACKER tryfaintmon BS_TARGET jumpifmovehadnoeffect BattleScript_MoveEnd + setatkhptozero + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_TryHitSwitchTarget:: @@ -2373,7 +2372,7 @@ BattleScript_EffectMetalBurst:: attackstring ppreduce typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE + clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage goto BattleScript_HitFromAtkAnimation @@ -2778,7 +2777,7 @@ BattleScript_EffectHitEscape:: setbyte sGIVEEXP_STATE, 0 getexp BS_TARGET BattleScript_HitEscapeSwitch: - goto BattleScript_MoveSwitch + goto BattleScript_MoveSwitchPursuit BattleScript_HitEscapeEnd: end @@ -2852,7 +2851,7 @@ BattleScript_EffectNaturalGiftEnd: goto BattleScript_MoveEnd BattleScript_MakeMoveMissed:: - orhalfword gMoveResultFlags, MOVE_RESULT_MISSED + setmoveresultflags MOVE_RESULT_MISSED BattleScript_PrintMoveMissed:: attackstring ppreduce @@ -2885,6 +2884,7 @@ BattleScript_EffectSleep:: jumpifleafguardprotected BS_TARGET, BattleScript_AbilityProtectsDoesntAffect jumpifshieldsdown BS_TARGET, BattleScript_AbilityProtectsDoesntAffect jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed + jumpifsleepclause BattleScript_SleepClauseBlocked jumpifterrainaffected BS_TARGET, STATUS_FIELD_ELECTRIC_TERRAIN, BattleScript_ElectricTerrainPrevents jumpifterrainaffected BS_TARGET, STATUS_FIELD_MISTY_TERRAIN, BattleScript_MistyTerrainPrevents accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE @@ -2904,14 +2904,14 @@ BattleScript_ElectricTerrainPrevents:: pause B_WAIT_TIME_SHORT printstring STRINGID_ELECTRICTERRAINPREVENTS waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_MistyTerrainPrevents:: pause B_WAIT_TIME_SHORT printstring STRINGID_MISTYTERRAINPREVENTS waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_FlowerVeilProtectsRet:: @@ -2923,7 +2923,7 @@ BattleScript_FlowerVeilProtectsRet:: BattleScript_FlowerVeilProtects: call BattleScript_FlowerVeilProtectsRet - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_SweetVeilProtectsRet:: @@ -2935,7 +2935,7 @@ BattleScript_SweetVeilProtectsRet:: BattleScript_SweetVeilProtects: call BattleScript_SweetVeilProtectsRet - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_AromaVeilProtectsRet:: @@ -2947,7 +2947,7 @@ BattleScript_AromaVeilProtectsRet:: BattleScript_AromaVeilProtects: call BattleScript_AromaVeilProtectsRet - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_PastelVeilProtectsRet:: @@ -2959,7 +2959,7 @@ BattleScript_PastelVeilProtectsRet:: BattleScript_PastelVeilProtects: call BattleScript_PastelVeilProtectsRet - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_AbilityProtectsDoesntAffectRet:: @@ -2971,7 +2971,7 @@ BattleScript_AbilityProtectsDoesntAffectRet:: BattleScript_AbilityProtectsDoesntAffect: call BattleScript_AbilityProtectsDoesntAffectRet - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_InsomniaProtects: @@ -2979,7 +2979,7 @@ BattleScript_InsomniaProtects: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSTAYEDAWAKEUSING waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_AlreadyAsleep:: @@ -2987,21 +2987,21 @@ BattleScript_AlreadyAsleep:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYASLEEP waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_WasntAffected:: pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNWASNTAFFECTED waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_CantMakeAsleep:: pause B_WAIT_TIME_SHORT printfromtable gUproarAwakeStringIds waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_EffectAbsorbLiquidOoze:: @@ -3009,11 +3009,12 @@ BattleScript_EffectAbsorbLiquidOoze:: goto BattleScript_EffectAbsorb BattleScript_EffectAbsorb:: - healthbarupdate BS_ATTACKER + absorbhealthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printfromtable gAbsorbDrainStringIds waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER + bicword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_PASSIVE_DAMAGE return BattleScript_EffectExplosion:: @@ -3085,7 +3086,7 @@ BattleScript_EffectMirrorMove:: pause B_WAIT_TIME_LONG trymirrormove ppreduce - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED printstring STRINGID_MIRRORMOVEFAILED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -3424,7 +3425,7 @@ BattleScript_EffectSuperFang:: attackstring ppreduce typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE damagetohalftargethp goto BattleScript_HitFromAtkAnimation @@ -3433,7 +3434,7 @@ BattleScript_EffectRecoilIfMiss:: accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE .if B_CRASH_IF_TARGET_IMMUNE >= GEN_4 typecalc - jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveMissedDoDamage + jumpifmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveMissedDoDamage .endif goto BattleScript_HitFromAtkString BattleScript_MoveMissedDoDamage:: @@ -3444,7 +3445,7 @@ BattleScript_MoveMissedDoDamage:: resultmessage waitmessage B_WAIT_TIME_LONG .if B_CRASH_IF_TARGET_IMMUNE < GEN_4 - jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd + jumpifmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd .endif moveendcase MOVEEND_PROTECT_LIKE_EFFECT @ Spiky Shield's damage happens before recoil. jumpifhasnohp BS_ATTACKER, BattleScript_MoveEnd @@ -3459,18 +3460,18 @@ BattleScript_MoveMissedDoDamage:: manipulatedamage DMG_RECOIL_FROM_MISS .endif .if B_CRASH_IF_TARGET_IMMUNE >= GEN_4 - bichalfword gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE + clearmoveresultflags MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE .else - bichalfword gMoveResultFlags, MOVE_RESULT_MISSED + clearmoveresultflags MOVE_RESULT_MISSED .endif orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER .if B_CRASH_IF_TARGET_IMMUNE >= GEN_4 - orhalfword gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE + setmoveresultflags MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE .else - orhalfword gMoveResultFlags, MOVE_RESULT_MISSED + setmoveresultflags MOVE_RESULT_MISSED .endif goto BattleScript_MoveEnd @@ -3651,12 +3652,13 @@ BattleScript_EffectParalyze:: typecalc jumpifmovehadnoeffect BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed + jumpifelectricabilityaffected BS_TARGET, ABILITY_VOLT_ABSORB, BattleScript_VoltAbsorbHeal + clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE tryparalyzetype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed jumpifterrainaffected BS_TARGET, STATUS_FIELD_MISTY_TERRAIN, BattleScript_MistyTerrainPrevents accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsafeguard BattleScript_SafeguardProtected - bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE attackanimation waitanimation seteffectprimary MOVE_EFFECT_PARALYSIS @@ -3859,26 +3861,39 @@ BattleScript_EffectDoNothing:: attackcanceler attackstring ppreduce - jumpifmove MOVE_HOLD_HANDS, BattleScript_EffectHoldHands attackanimation waitanimation - jumpifmove MOVE_CELEBRATE, BattleScript_EffectCelebrate - jumpifmove MOVE_HAPPY_HOUR, BattleScript_EffectHappyHour incrementgamestat GAME_STAT_USED_SPLASH printstring STRINGID_BUTNOTHINGHAPPENED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectHoldHands: + +BattleScript_EffectHoldHands:: + attackcanceler + attackstring + ppreduce jumpifsideaffecting BS_TARGET, SIDE_STATUS_CRAFTY_SHIELD, BattleScript_ButItFailed jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_ButItFailed attackanimation waitanimation goto BattleScript_MoveEnd -BattleScript_EffectCelebrate: + +BattleScript_EffectCelebrate:: + attackcanceler + attackstring + ppreduce + attackanimation + waitanimation printstring STRINGID_CELEBRATEMESSAGE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectHappyHour: + +BattleScript_EffectHappyHour:: + attackcanceler + attackstring + ppreduce + attackanimation + waitanimation seteffectprimary MOVE_EFFECT_HAPPY_HOUR goto BattleScript_MoveEnd @@ -3901,7 +3916,7 @@ BattleScript_EffectLevelDamage:: attackstring ppreduce typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE dmgtolevel adjustdamage goto BattleScript_HitFromAtkAnimation @@ -3912,7 +3927,7 @@ BattleScript_EffectPsywave:: attackstring ppreduce typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE psywavedamageeffect adjustdamage goto BattleScript_HitFromAtkAnimation @@ -3924,7 +3939,7 @@ BattleScript_EffectCounter:: attackstring ppreduce typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE + clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage goto BattleScript_HitFromAtkAnimation @@ -3952,7 +3967,6 @@ BattleScript_EffectPainSplit:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER - copyword gBattleMoveDamage, sPAINSPLIT_HP healthbarupdate BS_TARGET datahpupdate BS_TARGET printstring STRINGID_SHAREDPAIN @@ -4038,7 +4052,7 @@ BattleScript_EffectDestinyBond:: attackcanceler attackstring ppreduce - setdestinybond + trysetdestinybond BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNTRYINGTOTAKEFOE @@ -4066,13 +4080,16 @@ BattleScript_EffectHealBell:: attackcanceler attackstring ppreduce - healpartystatus - waitstate attackanimation waitanimation +BattleScript_EffectHealBell_FromHeal:: + healpartystatus + waitstate printfromtable gPartyStatusHealStringIds waitmessage B_WAIT_TIME_LONG - jumpifnotmove MOVE_HEAL_BELL, BattleScript_PartyHealEnd + jumpifblockedbysoundproof BS_ATTACKER_PARTNER, BattleScript_HealBellSoundproof + goto BattleScript_PartyHealEnd +BattleScript_HealBellSoundproof:: jumpifbyte CMP_NO_COMMON_BITS, cMULTISTRING_CHOOSER, B_MSG_BELL_SOUNDPROOF_ATTACKER, BattleScript_CheckHealBellMon2Unaffected printstring STRINGID_PKMNSXBLOCKSY waitmessage B_WAIT_TIME_LONG @@ -4260,7 +4277,7 @@ BattleScript_EffectSandstorm:: attackstring ppreduce call BattleScript_CheckPrimalWeather - setfieldweather ENUM_WEATHER_SANDSTORM + setfieldweather BATTLE_WEATHER_SANDSTORM goto BattleScript_MoveWeatherChange BattleScript_EffectRollout:: @@ -4406,7 +4423,7 @@ BattleScript_EffectFixedDamageArg:: attackstring ppreduce typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE setargtobattledamage adjustdamage goto BattleScript_HitFromAtkAnimation @@ -4426,7 +4443,7 @@ BattleScript_EffectRainDance:: attackstring ppreduce call BattleScript_CheckPrimalWeather - setfieldweather ENUM_WEATHER_RAIN + setfieldweather BATTLE_WEATHER_RAIN BattleScript_MoveWeatherChange:: attackanimation waitanimation @@ -4444,7 +4461,7 @@ BattleScript_EffectSunnyDay:: attackstring ppreduce call BattleScript_CheckPrimalWeather - setfieldweather ENUM_WEATHER_SUN + setfieldweather BATTLE_WEATHER_SUN goto BattleScript_MoveWeatherChange BattleScript_ExtremelyHarshSunlightWasNotLessened: @@ -4551,7 +4568,7 @@ BattleScript_EffectMirrorCoat:: attackstring ppreduce typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE + clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage goto BattleScript_HitFromAtkAnimation @@ -4607,7 +4624,7 @@ BattleScript_BeatUpLoop:: trydobeatup BattleScript_BeatUpEnd, BattleScript_ButItFailed printstring STRINGID_PKMNATTACK critcalc - jumpifbyte CMP_NOT_EQUAL, gIsCriticalHit, TRUE, BattleScript_BeatUpAttack + jumpifcriticalhit BattleScript_BeatUpAttack manipulatedamage DMG_DOUBLED BattleScript_BeatUpAttack:: adjustdamage @@ -4676,7 +4693,7 @@ BattleScript_FailedFromPpReduce:: ppreduce BattleScript_ButItFailed:: pause B_WAIT_TIME_SHORT - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4686,7 +4703,7 @@ BattleScript_RestoreAttackerButItFailed: BattleScript_NotAffected:: pause B_WAIT_TIME_SHORT - orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE + setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4694,7 +4711,7 @@ BattleScript_NotAffected:: BattleScript_NotAffectedAbilityPopUp:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpTarget - orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE + setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4764,7 +4781,6 @@ BattleScript_EffectSpitUp:: attackstring ppreduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - setbyte gIsCriticalHit, FALSE damagecalc adjustdamage stockpiletobasedamage BattleScript_SpitUpFail @@ -4804,7 +4820,7 @@ BattleScript_EffectHail:: attackstring ppreduce call BattleScript_CheckPrimalWeather - setfieldweather ENUM_WEATHER_HAIL + setfieldweather BATTLE_WEATHER_HAIL goto BattleScript_MoveWeatherChange BattleScript_EffectTorment:: @@ -5097,7 +5113,7 @@ BattleScript_EffectBrickBreak:: damagecalc adjustdamage jumpifbyte CMP_EQUAL, sB_ANIM_TURN, 0, BattleScript_BrickBreakAnim - bichalfword gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE + clearmoveresultflags MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE BattleScript_BrickBreakAnim:: attackanimation waitanimation @@ -5130,6 +5146,7 @@ BattleScript_EffectYawn:: jumpifflowerveil BattleScript_FlowerVeilProtects jumpifleafguardprotected BS_TARGET, BattleScript_AbilityProtectsDoesntAffect jumpifshieldsdown BS_TARGET, BattleScript_AbilityProtectsDoesntAffect + jumpifsleepclause BattleScript_SleepClauseBlocked jumpifsubstituteblocks BattleScript_ButItFailed jumpifsafeguard BattleScript_SafeguardProtected accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON @@ -5155,12 +5172,10 @@ BattleScript_EffectEndeavor:: attackstring ppreduce setdamagetohealthdifference BattleScript_ButItFailed - copyword gHpDealt, gBattleMoveDamage accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc jumpifmovehadnoeffect BattleScript_HitFromAtkAnimation - bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - copyword gBattleMoveDamage, gHpDealt + clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE adjustdamage goto BattleScript_HitFromAtkAnimation @@ -5284,7 +5299,7 @@ BattleScript_TickleEnd:: BattleScript_CantLowerMultipleStats:: pause B_WAIT_TIME_SHORT - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED printstring STRINGID_STATSWONTDECREASE2 waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -5368,7 +5383,7 @@ BattleScript_CalmMindEnd:: BattleScript_CantRaiseMultipleStats:: pause B_WAIT_TIME_SHORT - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED printstring STRINGID_STATSWONTINCREASE2 waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -5585,7 +5600,7 @@ BattleScript_LocalBattleLost:: jumpifbattletype BATTLE_TYPE_FRONTIER, BattleScript_LocalBattleLostPrintTrainersWinText jumpifbattletype BATTLE_TYPE_TRAINER_HILL, BattleScript_LocalBattleLostPrintTrainersWinText jumpifbattletype BATTLE_TYPE_EREADER_TRAINER, BattleScript_LocalBattleLostEnd - jumpifhalfword CMP_EQUAL, gTrainerBattleOpponent_A, TRAINER_SECRET_BASE, BattleScript_LocalBattleLostEnd + jumpifhalfword CMP_EQUAL, gTrainerBattleParameter + 2, TRAINER_SECRET_BASE, BattleScript_LocalBattleLostEnd BattleScript_LocalBattleLostPrintWhiteOut:: .if B_WHITEOUT_MONEY >= GEN_4 jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostEnd @@ -5744,19 +5759,10 @@ BattleScript_PrintFullBox:: BattleScript_ActionSwitch:: hpthresholds2 BS_ATTACKER printstring STRINGID_RETURNMON - jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_PursuitSwitchDmgSetMultihit - setmultihit 1 - goto BattleScript_PursuitSwitchDmgLoop -BattleScript_PursuitSwitchDmgSetMultihit:: - setmultihit 2 -BattleScript_PursuitSwitchDmgLoop:: jumpifnopursuitswitchdmg BattleScript_DoSwitchOut - swapattackerwithtarget - trysetdestinybondtohappen - call BattleScript_PursuitDmgOnSwitchOut - swapattackerwithtarget + end2 + BattleScript_DoSwitchOut:: - decrementmultihit BattleScript_PursuitSwitchDmgLoop switchoutabilities BS_ATTACKER updatedynamax waitstate @@ -5778,34 +5784,6 @@ BattleScript_DoSwitchOut:: moveendcase MOVEEND_MIRROR_MOVE end2 -BattleScript_PursuitDmgOnSwitchOut:: - pause B_WAIT_TIME_SHORT - orword gHitMarker, HITMARKER_OBEYS - 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 - tryfaintmon BS_TARGET - moveendfromto MOVEEND_ABILITIES, MOVEEND_ATTACKER_INVISIBLE @ MOVEEND_CHOICE_MOVE has to be included - jumpiffainted BS_TARGET, FALSE, BattleScript_PursuitDmgOnSwitchOutRet - setbyte sGIVEEXP_STATE, 0 - getexp BS_TARGET -BattleScript_PursuitDmgOnSwitchOutRet: - bicword gHitMarker, HITMARKER_OBEYS - return - BattleScript_Pausex20:: pause B_WAIT_TIME_SHORT return @@ -5847,20 +5825,18 @@ BattleScript_LearnedNewMove:: BattleScript_LearnMoveReturn:: return -BattleScript_RainContinuesOrEnds:: - printfromtable gRainContinuesStringIds - waitmessage B_WAIT_TIME_LONG - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_RAIN_STOPPED, BattleScript_RainContinuesOrEndsEnd - playanimation BS_ATTACKER, B_ANIM_RAIN_CONTINUES -BattleScript_RainContinuesOrEndsEnd:: - call BattleScript_ActivateWeatherAbilities - end2 - -BattleScript_DamagingWeatherContinues:: - printfromtable gSandStormHailSnowContinuesStringIds +BattleScript_WeatherContinues:: + printfromtable gWeatherTurnStringIds waitmessage B_WAIT_TIME_LONG playanimation_var BS_ATTACKER, sB_ANIM_ARG1 setbyte gBattleCommunication, 0 + call BattleScript_ActivateWeatherAbilities + end2 + +BattleScript_WeatherFaded:: + printfromtable gWeatherEndsStringIds + waitmessage B_WAIT_TIME_LONG + call BattleScript_ActivateWeatherAbilities end2 BattleScript_DamagingWeather:: @@ -5870,6 +5846,12 @@ BattleScript_DamagingWeather:: hitanimation BS_SCRIPTING goto BattleScript_DoTurnDmg +BattleScript_FogEnded_Ret:: + printstring STRINGID_FOGLIFTED + waitmessage B_WAIT_TIME_LONG + call BattleScript_ActivateWeatherAbilities + return + BattleScript_IceBodyHeal:: call BattleScript_AbilityPopUpScripting playanimation BS_SCRIPTING, B_ANIM_SIMPLE_HEAL @@ -5879,42 +5861,6 @@ BattleScript_IceBodyHeal:: waitmessage B_WAIT_TIME_LONG end2 -BattleScript_SandStormHailSnowEnds:: - printfromtable gSandStormHailSnowEndStringIds - waitmessage B_WAIT_TIME_LONG - call BattleScript_ActivateWeatherAbilities - end2 - -BattleScript_SunlightContinues:: - printstring STRINGID_SUNLIGHTSTRONG - waitmessage B_WAIT_TIME_LONG - playanimation BS_ATTACKER, B_ANIM_SUN_CONTINUES - call BattleScript_ActivateWeatherAbilities - end2 - -BattleScript_SunlightFaded:: - printstring STRINGID_SUNLIGHTFADED - waitmessage B_WAIT_TIME_LONG - call BattleScript_ActivateWeatherAbilities - end2 - -BattleScript_FogContinues:: - printstring STRINGID_FOGISDEEP - waitmessage B_WAIT_TIME_LONG - playanimation BS_ATTACKER, B_ANIM_FOG_CONTINUES - call BattleScript_ActivateWeatherAbilities - end2 - -BattleScript_FogEnded_Ret:: - printstring STRINGID_FOGLIFTED - waitmessage B_WAIT_TIME_LONG - call BattleScript_ActivateWeatherAbilities - return - -BattleScript_FogEnded:: - call BattleScript_FogEnded_Ret - end2 - BattleScript_OverworldStatusStarts:: printfromtable gStartingStatusStringIds waitmessage B_WAIT_TIME_LONG @@ -5924,8 +5870,7 @@ BattleScript_OverworldStatusStarts:: BattleScript_OverworldStatusStarts_TryActivations: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SET_TRICK_ROOM, BattleScript_TryRoomServiceLoop - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SET_TAILWIND_PLAYER, BattleScript_TryTailwindAbilitiesLoop - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SET_TAILWIND_OPPONENT, BattleScript_TryTailwindAbilitiesLoop + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SET_TAILWIND, BattleScript_TryTailwindAbilitiesLoop return BattleScript_OverworldWeatherStarts:: @@ -6018,11 +5963,14 @@ BattleScript_SafeguardEnds:: waitmessage B_WAIT_TIME_LONG end2 +@ Leech Seed end turn effect +@ attacker is the victim +@ target is the leech seeder (recieving HP) BattleScript_LeechSeedTurnDrainLiquidOoze:: call BattleScript_LeechSeedTurnDrain - manipulatedamage DMG_CHANGE_SIGN copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp + copybyte gBattlerAttacker, gBattlerTarget @ needed to get liquid ooze message correct goto BattleScript_LeechSeedTurnDrainGainHp BattleScript_LeechSeedTurnDrainHealBlock:: @@ -6032,7 +5980,6 @@ BattleScript_LeechSeedTurnDrainHealBlock:: BattleScript_LeechSeedTurnDrainRecovery:: call BattleScript_LeechSeedTurnDrain BattleScript_LeechSeedTurnDrainGainHp: - manipulatedamage DMG_BIG_ROOT healthbarupdate BS_TARGET datahpupdate BS_TARGET printfromtable gLeechSeedStringIds @@ -6059,8 +6006,8 @@ BattleScript_BideAttack:: waitmessage B_WAIT_TIME_LONG accuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - copyword gBattleMoveDamage, sBIDE_DMG + clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + copybidedmg adjustdamage setbyte sB_ANIM_TURN, 1 attackanimation @@ -6614,14 +6561,14 @@ BattleScript_FutureAttackEnd:: moveendcase MOVEEND_RAGE moveendcase MOVEEND_ABILITIES moveendfromto MOVEEND_ITEM_EFFECTS_ALL, MOVEEND_UPDATE_LAST_MOVES - setbyte gMoveResultFlags, 0 + setmoveresultflags 0 end2 BattleScript_FutureAttackMiss:: pause B_WAIT_TIME_SHORT - sethword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED resultmessage waitmessage B_WAIT_TIME_LONG - sethword gMoveResultFlags, 0 + setmoveresultflags 0 end2 BattleScript_NoMovesLeft:: @@ -6901,7 +6848,7 @@ BattleScript_MagicCoatPrankster:: waitmessage B_WAIT_TIME_LONG printstring STRINGID_ITDOESNTAFFECT waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + setmoveresultflags MOVE_RESULT_NO_EFFECT goto BattleScript_MoveEnd BattleScript_SnatchedMove:: @@ -6950,7 +6897,6 @@ BattleScript_MegaEvolution:: printstring STRINGID_MEGAEVOREACTING BattleScript_MegaEvolutionAfterString: waitmessage B_WAIT_TIME_LONG - setbyte gIsCriticalHit, 0 handlemegaevo BS_SCRIPTING, 0 playanimation BS_SCRIPTING, B_ANIM_MEGA_EVOLUTION waitanimation @@ -6968,7 +6914,6 @@ BattleScript_WishMegaEvolution:: BattleScript_PrimalReversion:: flushtextbox - setbyte gIsCriticalHit, 0 handleprimalreversion BS_SCRIPTING, 0 handleprimalreversion BS_SCRIPTING, 1 playanimation BS_SCRIPTING, B_ANIM_PRIMAL_REVERSION @@ -6984,7 +6929,6 @@ BattleScript_UltraBurst:: trytrainerslidezmovemsg printstring STRINGID_ULTRABURSTREACTING waitmessage B_WAIT_TIME_LONG - setbyte gIsCriticalHit, 0 handleultraburst BS_SCRIPTING, 0 playanimation BS_SCRIPTING, B_ANIM_ULTRA_BURST waitanimation @@ -7292,7 +7236,7 @@ BattleScript_PowderMoveNoEffectPrint: BattleScript_PowderMoveNoEffectWaitMsg: waitmessage B_WAIT_TIME_LONG cancelmultiturnmoves BS_ATTACKER - sethword gMoveResultFlags, MOVE_RESULT_FAILED + setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd BattleScript_MoveUsedFlinched:: @@ -8223,7 +8167,7 @@ BattleScript_MoveHPDrain:: datahpupdate BS_TARGET printstring STRINGID_PKMNRESTOREDHPUSING waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE + setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd BattleScript_MoveStatDrain_PPLoss:: @@ -8255,7 +8199,7 @@ BattleScript_MonMadeMoveUseless:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXMADEYUSELESS waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE + setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd BattleScript_FlashFireBoost_PPLoss:: @@ -8338,7 +8282,7 @@ BattleScript_SoundproofProtected:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXBLOCKSY waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE + setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd BattleScript_IceFaceNullsDamage:: @@ -8377,7 +8321,6 @@ BattleScript_GrassyTerrainLoopIncrement:: addbyte gBattleCommunication, 1 jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_GrassyTerrainLoop bicword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_PERMANENT, BattleScript_GrassyTerrainHealEnd BattleScript_GrassyTerrainHealEnd: return @@ -8387,7 +8330,7 @@ BattleScript_AbilityNoSpecificStatLoss:: printstring STRINGID_PKMNSXPREVENTSYLOSS waitmessage B_WAIT_TIME_LONG setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY - orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + setmoveresultflags MOVE_RESULT_NO_EFFECT return BattleScript_StickyHoldActivates:: @@ -8412,7 +8355,7 @@ BattleScript_ProteanActivates:: BattleScript_TeraShellDistortingTypeMatchups:: pause B_WAIT_TIME_SHORTEST - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting printstring STRINGID_PKMNMADESHELLGLEAM waitmessage B_WAIT_TIME_LONG return @@ -8497,7 +8440,7 @@ BattleScript_WeakArmorActivates:: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed pause B_WAIT_TIME_SHORTEST printfromtable gStatDownStringIds - bichalfword gMoveResultFlags, MOVE_RESULT_MISSED @ Set by statbuffchange when stat can't be decreased + clearmoveresultflags MOVE_RESULT_MISSED @ Set by statbuffchange when stat can't be decreased waitmessage B_WAIT_TIME_LONG goto BattleScript_WeakArmorActivatesSpeed BattleScript_WeakArmorDefAnim: @@ -8516,7 +8459,7 @@ BattleScript_WeakArmorActivatesSpeed: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER - bichalfword gMoveResultFlags, MOVE_RESULT_MISSED + clearmoveresultflags MOVE_RESULT_MISSED waitmessage B_WAIT_TIME_LONG goto BattleScript_WeakArmorActivatesEnd BattleScript_WeakArmorSpeedAnim: @@ -8639,31 +8582,31 @@ BattleScript_RockyHelmetActivatesDmg: BattleScript_SpikyShieldEffect:: jumpifabsent BS_ATTACKER, BattleScript_SpikyShieldRet orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + clearmoveresultflags MOVE_RESULT_NO_EFFECT healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNHURTSWITH waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER - orhalfword gMoveResultFlags, MOVE_RESULT_MISSED + setmoveresultflags MOVE_RESULT_MISSED BattleScript_SpikyShieldRet:: return BattleScript_KingsShieldEffect:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + clearmoveresultflags MOVE_RESULT_NO_EFFECT seteffectsecondary copybyte sBATTLER, gBattlerTarget copybyte gBattlerTarget, gBattlerAttacker copybyte gBattlerAttacker, sBATTLER - orhalfword gMoveResultFlags, MOVE_RESULT_MISSED + setmoveresultflags MOVE_RESULT_MISSED return BattleScript_BanefulBunkerEffect:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_DAMAGE - bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + clearmoveresultflags MOVE_RESULT_NO_EFFECT seteffectsecondary - orhalfword gMoveResultFlags, MOVE_RESULT_MISSED + setmoveresultflags MOVE_RESULT_MISSED return BattleScript_CuteCharmActivates:: @@ -8865,18 +8808,12 @@ BattleScript_GemActivates:: return BattleScript_BerryReduceDmg:: - playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT waitanimation - setlastuseditem BS_TARGET - printstring STRINGID_TARGETATEITEM - waitmessage B_WAIT_TIME_LONG - removeitem BS_TARGET - return - -BattleScript_PrintBerryReduceString:: - waitmessage B_WAIT_TIME_LONG + setlastuseditem BS_SCRIPTING printstring STRINGID_BERRYDMGREDUCES waitmessage B_WAIT_TIME_LONG + removeitem BS_SCRIPTING return BattleScript_BerryCureConfusionEnd2:: @@ -9504,7 +9441,7 @@ BattleScript_EffectHitSetRemoveTerrain:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - jumpifargument ARG_TRY_REMOVE_TERRAIN_FAIL, BattleScript_RemoveTerrain + jumpifmovepropertyargument ARG_TRY_REMOVE_TERRAIN_FAIL, BattleScript_RemoveTerrain critcalc damagecalc adjustdamage @@ -9660,7 +9597,7 @@ BattleScript_DarkTypePreventsPrankster:: pause B_WAIT_TIME_SHORT printstring STRINGID_ITDOESNTAFFECT waitmessage B_WAIT_TIME_LONG - orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + setmoveresultflags MOVE_RESULT_NO_EFFECT goto BattleScript_MoveEnd BattleScript_WellBakedBodyActivates:: @@ -9668,7 +9605,7 @@ BattleScript_WellBakedBodyActivates:: ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpTarget - orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + setmoveresultflags MOVE_RESULT_NO_EFFECT modifybattlerstatstage BS_TARGET, STAT_DEF, INCREASE, 1, BattleScript_WellBakedBodyEnd, ANIM_ON BattleScript_WellBakedBodyEnd: goto BattleScript_MoveEnd @@ -9678,7 +9615,7 @@ BattleScript_WindRiderActivatesMoveEnd:: ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpTarget - orhalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + setmoveresultflags MOVE_RESULT_NO_EFFECT modifybattlerstatstage BS_TARGET, STAT_ATK, INCREASE, 1, BattleScript_WindRiderActivatesMoveEnd_End, ANIM_ON BattleScript_WindRiderActivatesMoveEnd_End: goto BattleScript_MoveEnd @@ -9775,7 +9712,7 @@ BattleScript_EffectMaxMove:: resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET - setmaxmoveeffect + setadditionaleffects moveendall end @@ -9849,61 +9786,158 @@ BattleScript_EffectTryReducePP:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectStatus1Foes:: +BattleScript_EffectParalyzeSide:: savetarget copybyte sBATTLER, gBattlerTarget -BattleScript_Status1FoesLoop: - jumpifabsent BS_TARGET, BattleScript_Status1FoesIncrement - trysetstatus1 BattleScript_Status1FoesIncrement +BattleScript_ParalyzeSideLoop: + jumpifabsent BS_TARGET, BattleScript_ParalyzeSideIncrement + trysetparalysis BattleScript_ParalyzeSideIncrement statusanimation BS_TARGET updatestatusicon BS_TARGET printfromtable gStatusConditionsStringIds waitmessage B_WAIT_TIME_LONG updatestatusicon BS_EFFECT_BATTLER waitstate -BattleScript_Status1FoesIncrement: - jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_Status1FoesEnd - setallytonexttarget BattleScript_Status1FoesLoop -BattleScript_Status1FoesEnd: +BattleScript_ParalyzeSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ParalyzeSideEnd + setallytonexttarget BattleScript_ParalyzeSideLoop +BattleScript_ParalyzeSideEnd: restoretarget goto BattleScript_MoveEnd -BattleScript_EffectStatus2Foes:: +BattleScript_EffectPoisonSide:: savetarget copybyte sBATTLER, gBattlerTarget -BattleScript_Status2FoesLoop: - jumpifabsent BS_TARGET, BattleScript_Status2FoesIncrement - trysetstatus2 BattleScript_Status2FoesIncrement - jumpifbyte CMP_EQUAL, gBattleCommunication, 1, BattleScript_DoConfuseAnim - jumpifbyte CMP_EQUAL, gBattleCommunication, 2, BattleScript_DoInfatuationAnim -BattleScript_Status2FoesPrintMessage: +BattleScript_PoisonSideLoop: + jumpifabsent BS_TARGET, BattleScript_PoisonSideIncrement + trysetpoison BattleScript_PoisonSideIncrement + statusanimation BS_TARGET + updatestatusicon BS_TARGET + printfromtable gStatusConditionsStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_EFFECT_BATTLER + waitstate +BattleScript_PoisonSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_PoisonSideEnd + setallytonexttarget BattleScript_PoisonSideLoop +BattleScript_PoisonSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectPoisonParalyzeSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_PoisonParalyzeSideLoop: + jumpifabsent BS_TARGET, BattleScript_PoisonParalyzeSideIncrement + trysetpoisonparalysis BattleScript_PoisonParalyzeSideIncrement + statusanimation BS_TARGET + updatestatusicon BS_TARGET + printfromtable gStatusConditionsStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_EFFECT_BATTLER + waitstate +BattleScript_PoisonParalyzeSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_PoisonParalyzeSideEnd + setallytonexttarget BattleScript_PoisonParalyzeSideLoop +BattleScript_PoisonParalyzeSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectEffectSporeSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_EffectSporeSideLoop: + jumpifabsent BS_TARGET, BattleScript_EffectSporeSideIncrement + tryseteffectspore BattleScript_EffectSporeSideIncrement + statusanimation BS_TARGET + updatestatusicon BS_TARGET + printfromtable gStatusConditionsStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_EFFECT_BATTLER + waitstate +BattleScript_EffectSporeSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_EffectSporeSideEnd + setallytonexttarget BattleScript_EffectSporeSideLoop +BattleScript_EffectSporeSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectConfuseSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_ConfuseSideLoop: + jumpifabsent BS_TARGET, BattleScript_ConfuseSideIncrement + trysetconfusion BattleScript_ConfuseSideIncrement + status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION +BattleScript_ConfuseSidePrintMessage: printfromtable gStatus2StringIds waitmessage B_WAIT_TIME_LONG -BattleScript_Status2FoesIncrement: - jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_Status2FoesEnd - setallytonexttarget BattleScript_Status2FoesLoop -BattleScript_Status2FoesEnd: +BattleScript_ConfuseSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ConfuseSideEnd + setallytonexttarget BattleScript_ConfuseSideLoop +BattleScript_ConfuseSideEnd: restoretarget jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 1, BattleScript_PrintCoinsScattered @ Gold Rush goto BattleScript_MoveEnd -BattleScript_DoConfuseAnim: - status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION - goto BattleScript_Status2FoesPrintMessage - -BattleScript_DoInfatuationAnim: - status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION - goto BattleScript_Status2FoesPrintMessage - BattleScript_PrintCoinsScattered: printstring STRINGID_COINSSCATTERED goto BattleScript_MoveEnd +BattleScript_EffectInfatuateSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_InfatuateSideLoop: + jumpifabsent BS_TARGET, BattleScript_InfatuateSideIncrement + trysetinfatuation BattleScript_InfatuateSideIncrement + status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION +BattleScript_InfatuateSidePrintMessage: + printfromtable gStatus2StringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_InfatuateSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_InfatuateSideEnd + setallytonexttarget BattleScript_InfatuateSideLoop +BattleScript_InfatuateSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectTormentSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_TormentSideLoop: + jumpifabsent BS_TARGET, BattleScript_TormentSideIncrement + trysettorment BattleScript_TormentSideIncrement +BattleScript_TormentSidePrintMessage: + printfromtable gStatus2StringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_TormentSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_TormentSideEnd + setallytonexttarget BattleScript_TormentSideLoop +BattleScript_TormentSideEnd: + restoretarget + goto BattleScript_MoveEnd + BattleScript_TormentEnds:: printstring STRINGID_TORMENTEDNOMORE waitmessage B_WAIT_TIME_LONG end2 +BattleScript_EffectMeanLookSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_MeanLookSideLoop: + jumpifabsent BS_TARGET, BattleScript_MeanLookSideIncrement + trysetescapeprevention BattleScript_MeanLookSideIncrement +BattleScript_MeanLookSidePrintMessage: + printfromtable gStatus2StringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_MeanLookSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_MeanLookSideEnd + setallytonexttarget BattleScript_MeanLookSideLoop +BattleScript_MeanLookSideEnd: + restoretarget + goto BattleScript_MoveEnd + BattleScript_EffectRaiseCritAlliesAnim:: savetarget copybyte gBattlerTarget, gBattlerAttacker @@ -9941,29 +9975,6 @@ BattleScript_HealOneSixthAlliesEnd: restoretarget goto BattleScript_MoveEnd -BattleScript_EffectCureStatusAllies:: - jumpifteamhealthy BS_ATTACKER, BattleScript_MoveEnd - savetarget - copybyte gBattlerTarget, gBattlerAttacker -BattleScript_CureStatusAlliesLoop: - jumpifabsent BS_TARGET, BattleScript_CureStatusAlliesIncrement - jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_CureStatusActivate -BattleScript_CureStatusAlliesIncrement: - jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_CureStatusAlliesEnd - setallytonexttarget BattleScript_CureStatusAlliesLoop -BattleScript_CureStatusAlliesEnd: - restoretarget - goto BattleScript_MoveEnd - -BattleScript_CureStatusActivate: - curestatus BS_TARGET - updatestatusicon BS_TARGET - swapattackerwithtarget - printstring STRINGID_PKMNSTATUSNORMAL - waitmessage B_WAIT_TIME_LONG - swapattackerwithtarget - goto BattleScript_CureStatusAlliesIncrement - BattleScript_EffectRecycleBerriesAllies:: savetarget copybyte gBattlerTarget, gBattlerAttacker @@ -9981,12 +9992,6 @@ BattleScript_RecycleBerriesAlliesEnd: restoretarget goto BattleScript_MoveEnd -BattleScript_EffectStonesurge:: - setstealthrock BattleScript_MoveEnd - printfromtable gDmgHazardsStringIds - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - BattleScript_EffectSteelsurge:: setsteelsurge BattleScript_MoveEnd printfromtable gDmgHazardsStringIds @@ -10085,5 +10090,18 @@ BattleScript_EffectSnow:: attackstring ppreduce call BattleScript_CheckPrimalWeather - setfieldweather ENUM_WEATHER_SNOW + setfieldweather BATTLE_WEATHER_SNOW goto BattleScript_MoveWeatherChange + +BattleScript_SleepClauseBlocked:: + pause B_WAIT_TIME_SHORT + setmoveresultflags MOVE_RESULT_FAILED + printstring STRINGID_BLOCKEDBYSLEEPCLAUSE + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_SleepClausePreventsEnd:: + pause B_WAIT_TIME_SHORT + printstring STRINGID_BLOCKEDBYSLEEPCLAUSE + waitmessage B_WAIT_TIME_LONG + end2 diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 4db3f350d0..572d076fab 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -48,7 +48,7 @@ BattleScript_UseItemMessage: return BattleScript_ItemRestoreHPRet: - bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + clearmoveresultflags MOVE_RESULT_NO_EFFECT orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_SCRIPTING datahpupdate BS_SCRIPTING @@ -69,7 +69,7 @@ BattleScript_ItemRestoreHPEnd: BattleScript_ItemRestoreHP_Party:: jumpifbyte CMP_EQUAL, gBattleCommunication, TRUE, BattleScript_ItemRestoreHP_SendOutRevivedBattler - bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + clearmoveresultflags MOVE_RESULT_NO_EFFECT printstring STRINGID_ITEMRESTOREDSPECIESHEALTH waitmessage B_WAIT_TIME_LONG return @@ -195,13 +195,13 @@ BattleScript_TryNicknameCaughtMon:: printstring STRINGID_GIVENICKNAMECAPTURED waitstate setbyte gBattleCommunication, 0 - trygivecaughtmonnick BattleScript_GiveCaughtMonEnd - givecaughtmon + trygivecaughtmonnick + givecaughtmon BattleScript_SuccessBallThrowEnd printfromtable gCaughtMonStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_SuccessBallThrowEnd BattleScript_GiveCaughtMonEnd:: - givecaughtmon + givecaughtmon BattleScript_SuccessBallThrowEnd BattleScript_SuccessBallThrowEnd:: setbyte gBattleOutcome, B_OUTCOME_CAUGHT finishturn diff --git a/data/event_scripts.s b/data/event_scripts.s index d33742f565..960a5fa084 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -20,6 +20,7 @@ #include "constants/contest.h" #include "constants/daycare.h" #include "constants/decorations.h" +#include "constants/difficulty.h" #include "constants/easy_chat.h" #include "constants/event_objects.h" #include "constants/event_object_movement.h" @@ -88,7 +89,7 @@ gSpecialVars:: .4byte gSpecialVar_MonBoxId .4byte gSpecialVar_MonBoxPos .4byte gSpecialVar_Unused_0x8014 - .4byte gTrainerBattleOpponent_A + .4byte gTrainerBattleParameter + 2 // gTrainerBattleParameter.params.opponentA .include "data/specials.inc" @@ -1152,3 +1153,4 @@ EventScript_VsSeekerChargingDone:: .include "data/scripts/follower.inc" .include "data/text/save.inc" .include "data/text/birch_speech.inc" + .include "data/scripts/dexnav.inc" diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index baa0ddb503..0425252232 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -25,9 +25,9 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_JumpSmallSplash @ FLDEFF_JUMP_SMALL_SPLASH .4byte gFieldEffectScript_LongGrass @ FLDEFF_LONG_GRASS .4byte gFieldEffectScript_JumpLongGrass @ FLDEFF_JUMP_LONG_GRASS - .4byte gFieldEffectScript_UnusedGrass @ FLDEFF_UNUSED_GRASS - .4byte gFieldEffectScript_UnusedGrass2 @ FLDEFF_UNUSED_GRASS_2 - .4byte gFieldEffectScript_UnusedSand @ FLDEFF_UNUSED_SAND + .4byte gFieldEffectScript_ShakingGrass @ FLDEFF_SHAKING_GRASS + .4byte gFieldEffectScript_ShakingGrass2 @ FLDEFF_SHAKING_LONG_GRASS + .4byte gFieldEffectScript_UnusedSand @ FLDEFF_SAND_HOLE .4byte gFieldEffectScript_WaterSurfacing @ FLDEFF_WATER_SURFACING .4byte gFieldEffectScript_BerryTreeGrowthSparkle @ FLDEFF_BERRY_TREE_GROWTH_SPARKLE .4byte gFieldEffectScript_DeepSandFootprints @ FLDEFF_DEEP_SAND_FOOTPRINTS @@ -79,7 +79,8 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_TracksSlither @ FLDEFF_TRACKS_SLITHER .4byte gFieldEffectScript_TracksBug @ FLDEFF_TRACKS_BUG .4byte gFieldEffectScript_TracksSpot @ FLDEFF_TRACKS_SPOT - + .4byte gFieldEffectScript_CaveDust @ FLDEFF_CAVE_DUST + gFieldEffectScript_ExclamationMarkIcon1:: field_eff_callnative FldEff_ExclamationMarkIcon field_eff_end @@ -156,12 +157,12 @@ gFieldEffectScript_JumpLongGrass:: field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_JumpLongGrass field_eff_end -gFieldEffectScript_UnusedGrass:: - field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_UnusedGrass +gFieldEffectScript_ShakingGrass:: + field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_ShakingGrass field_eff_end -gFieldEffectScript_UnusedGrass2:: - field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_UnusedGrass2 +gFieldEffectScript_ShakingGrass2:: + field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_ShakingGrass2 field_eff_end gFieldEffectScript_UnusedSand:: @@ -374,3 +375,7 @@ gFieldEffectScript_TracksSpot:: gFieldEffectScript_TracksSlither:: field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_TracksSlither field_eff_end + +gFieldEffectScript_CaveDust:: + field_eff_loadfadedpal_callnative gSpritePalette_CaveDust FldEff_CaveDust + field_eff_end diff --git a/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc b/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc index ba9d996706..2b0ed8b9c4 100644 --- a/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc @@ -105,7 +105,7 @@ BattlePyramid_WarpToTop:: @ TRAINER_PHILLIP is used as a placeholder BattlePyramid_TrainerBattle:: - trainerbattle TRAINER_BATTLE_PYRAMID, TRAINER_PHILLIP, 0, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText + trainerbattle TRAINER_BATTLE_HILL, OBJ_ID_NONE, TRAINER_PHILLIP, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE pyramid_showhint waitmessage waitbuttonpress diff --git a/data/maps/BattleFrontier_Lounge5/scripts.inc b/data/maps/BattleFrontier_Lounge5/scripts.inc index b81c748e5d..7dc4251fcc 100644 --- a/data/maps/BattleFrontier_Lounge5/scripts.inc +++ b/data/maps/BattleFrontier_Lounge5/scripts.inc @@ -51,138 +51,60 @@ BattleFrontier_Lounge5_Text_NatureGirlNoneShown:: .string "Boo!\n" .string "Cheapie!$" -BattleFrontier_Lounge5_Text_NatureGirlHardy:: +BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow:: .string "Hmhm…\p" .string "This one says it likes to battle!\n" .string "It will battle even if it has a lot\l" .string "of ouchies!$" -BattleFrontier_Lounge5_Text_NatureGirlLonely:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" - .string "But if it gets enough ouchies,\l" - .string "it will hit back!$" - -BattleFrontier_Lounge5_Text_NatureGirlBrave:: +BattleFrontier_Lounge5_Text_NatureGirlAttackHighDefenseLow:: .string "Hmhm…\p" .string "This one says it likes to battle!\n" .string "But if it gets enough ouchies,\l" .string "it will worry about itself!$" -BattleFrontier_Lounge5_Text_NatureGirlAdamant:: - .string "Hmhm…\p" - .string "This one says it likes to battle!\n" - .string "It will battle even if it has a lot\l" - .string "of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlNaughty:: - .string "Hmhm…\p" - .string "This one says it looks after itself!\n" - .string "But if it gets enough ouchies,\l" - .string "it will hit back!$" - -BattleFrontier_Lounge5_Text_NatureGirlBold:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" - .string "But if it gets enough ouchies,\l" - .string "it will worry about itself!$" - -BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky:: - .string "Hmhm…\p" - .string "This one says it likes to battle!\n" - .string "It will battle even if it has a lot\l" - .string "of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlRelaxed:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" - .string "But if it gets enough ouchies,\l" - .string "it will hit back!$" - -BattleFrontier_Lounge5_Text_NatureGirlImpish:: - .string "Hmhm…\p" - .string "This one says it likes to battle!\n" - .string "But if it gets enough ouchies,\l" - .string "it will worry about itself!$" - -BattleFrontier_Lounge5_Text_NatureGirlLax:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" - .string "It says it likes to be sneaky even\l" - .string "if it has a lot of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlTimid:: +BattleFrontier_Lounge5_Text_NatureGirlAttackHighSupportLow:: .string "Hmhm…\p" .string "This one says it likes to battle!\n" .string "But if it gets enough ouchies,\l" .string "it will turn sneaky!$" -BattleFrontier_Lounge5_Text_NatureGirlHasty:: +BattleFrontier_Lounge5_Text_NatureGirlDefenseHighAttackLow:: .string "Hmhm…\p" - .string "This one says it likes to battle!\n" - .string "It will battle even if it has a lot\l" - .string "of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlSerious:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" - .string "It says it likes to be sneaky even\l" - .string "if it has a lot of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlJolly:: - .string "Hmhm…\p" - .string "This one says it likes to be sneaky!\n" + .string "This one says it looks after itself!\n" .string "But if it gets enough ouchies,\l" - .string "it will worry about itself!$" + .string "it will hit back!$" -BattleFrontier_Lounge5_Text_NatureGirlModest:: +BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow:: .string "Hmhm…\p" .string "This one says it looks after itself!\n" .string "It says it worries about itself whether\l" .string "or not it has a lot of ouchies!$" -BattleFrontier_Lounge5_Text_NatureGirlMild:: +BattleFrontier_Lounge5_Text_NatureGirlDefenseHighSupportLow:: .string "Hmhm…\p" .string "This one says it looks after itself!\n" .string "But if it gets enough ouchies,\l" .string "it will turn sneaky!$" -BattleFrontier_Lounge5_Text_NatureGirlBashful:: +BattleFrontier_Lounge5_Text_NatureGirlSupportHighAttackLow:: .string "Hmhm…\p" - .string "This one says it looks after itself!\n" - .string "It says it worries about itself even\l" - .string "if it has a lot of ouchies!$" + .string "This one says it likes to be sneaky!\n" + .string "But if it gets enough ouchies,\l" + .string "it will hit back!$" -BattleFrontier_Lounge5_Text_NatureGirlRash:: +BattleFrontier_Lounge5_Text_NatureGirlSupportHighDefenseLow:: + .string "Hmhm…\p" + .string "This one says it likes to be sneaky!\n" + .string "But if it gets enough ouchies,\l" + .string "it will worry about itself!$" + +BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow:: .string "Hmhm…\p" .string "This one says it likes to be sneaky!\n" .string "It says it likes to be sneaky even\l" .string "if it has a lot of ouchies!$" -BattleFrontier_Lounge5_Text_NatureGirlCalm:: - .string "Hmhm…\p" - .string "This one says it looks after itself!\n" - .string "It says it worries about itself even\l" - .string "if it has a lot of ouchies!$" - -BattleFrontier_Lounge5_Text_NatureGirlGentle:: - .string "Hmhm…\p" - .string "This one says it looks after itself!\n" - .string "But if it gets enough ouchies,\l" - .string "it will hit back!$" - -BattleFrontier_Lounge5_Text_NatureGirlSassy:: - .string "Hmhm…\p" - .string "This one says it likes to battle!\n" - .string "But if it gets enough ouchies,\l" - .string "it will turn sneaky!$" - -BattleFrontier_Lounge5_Text_NatureGirlCareful:: - .string "Hmhm…\p" - .string "This one says it looks after itself!\n" - .string "But if it gets enough ouchies,\l" - .string "it will turn sneaky!$" - BattleFrontier_Lounge5_Text_NatureGirlEgg:: .string "That's silly! An EGG is asleep!\n" .string "I can't talk to it!$" diff --git a/data/maps/LavaridgeTown_Gym_1F/scripts.inc b/data/maps/LavaridgeTown_Gym_1F/scripts.inc index b7db13f54a..e211d08063 100644 --- a/data/maps/LavaridgeTown_Gym_1F/scripts.inc +++ b/data/maps/LavaridgeTown_Gym_1F/scripts.inc @@ -104,7 +104,7 @@ LavaridgeTown_Gym_1F_EventScript_FlanneryRematch:: end LavaridgeTown_Gym_1F_EventScript_Cole:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_COLE, LOCALID_COLE, LavaridgeTown_Gym_1F_Text_ColeIntro, LavaridgeTown_Gym_1F_Text_ColeDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_COLE, TRAINER_COLE, LavaridgeTown_Gym_1F_Text_ColeIntro, LavaridgeTown_Gym_1F_Text_ColeDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_1F_Text_ColePostBattle, MSGBOX_AUTOCLOSE end @@ -116,37 +116,37 @@ LavaridgeTown_Gym_EventScript_CheckTrainerScript:: end LavaridgeTown_Gym_1F_EventScript_Axle:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_AXLE, LOCALID_AXLE, LavaridgeTown_Gym_1F_Text_AxleIntro, LavaridgeTown_Gym_1F_Text_AxleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_AXLE, TRAINER_AXLE, LavaridgeTown_Gym_1F_Text_AxleIntro, LavaridgeTown_Gym_1F_Text_AxleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_1F_Text_AxlePostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_B1F_EventScript_Keegan:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_KEEGAN, LOCALID_KEEGAN, LavaridgeTown_Gym_B1F_Text_KeeganIntro, LavaridgeTown_Gym_B1F_Text_KeeganDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_KEEGAN, TRAINER_KEEGAN, LavaridgeTown_Gym_B1F_Text_KeeganIntro, LavaridgeTown_Gym_B1F_Text_KeeganDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_B1F_Text_KeeganPostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_1F_EventScript_Danielle:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_DANIELLE, LOCALID_DANIELLE, LavaridgeTown_Gym_1F_Text_DanielleIntro, LavaridgeTown_Gym_1F_Text_DanielleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_DANIELLE, TRAINER_DANIELLE, LavaridgeTown_Gym_1F_Text_DanielleIntro, LavaridgeTown_Gym_1F_Text_DanielleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_1F_Text_DaniellePostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_1F_EventScript_Gerald:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_GERALD, LOCALID_GERALD, LavaridgeTown_Gym_1F_Text_GeraldIntro, LavaridgeTown_Gym_1F_Text_GeraldDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_GERALD, TRAINER_GERALD, LavaridgeTown_Gym_1F_Text_GeraldIntro, LavaridgeTown_Gym_1F_Text_GeraldDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_1F_Text_GeraldPostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_B1F_EventScript_Jace:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_JACE, LOCALID_JACE, LavaridgeTown_Gym_B1F_Text_JaceIntro, LavaridgeTown_Gym_B1F_Text_JaceDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_JACE, TRAINER_JACE, LavaridgeTown_Gym_B1F_Text_JaceIntro, LavaridgeTown_Gym_B1F_Text_JaceDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_B1F_Text_JacePostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_B1F_EventScript_Jeff:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_JEFF, LOCALID_JEFF, LavaridgeTown_Gym_B1F_Text_JeffIntro, LavaridgeTown_Gym_B1F_Text_JeffDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_JEFF, TRAINER_JEFF, LavaridgeTown_Gym_B1F_Text_JeffIntro, LavaridgeTown_Gym_B1F_Text_JeffDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_B1F_Text_JeffPostBattle, MSGBOX_AUTOCLOSE end LavaridgeTown_Gym_B1F_EventScript_Eli:: - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_ELI, LOCALID_ELI, LavaridgeTown_Gym_B1F_Text_EliIntro, LavaridgeTown_Gym_B1F_Text_EliDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_ELI, TRAINER_ELI, LavaridgeTown_Gym_B1F_Text_EliIntro, LavaridgeTown_Gym_B1F_Text_EliDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE msgbox LavaridgeTown_Gym_B1F_Text_EliPostBattle, MSGBOX_AUTOCLOSE end diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc index 46aeeb0550..457ff8f670 100644 --- a/data/script_cmd_table.inc +++ b/data/script_cmd_table.inc @@ -1,9 +1,16 @@ +@ 'requests_effects' should be set to 1 if the command contains a call +@ to 'Script_RequestEffects', which allows it to be analyzed with +@ 'RunScriptImmediatelyUntilEffect'. .ifndef SCRIPT_CMD_TABLE_ENTRY_MACRO .set SCRIPT_CMD_TABLE_ENTRY_MACRO, 1 - .macro script_cmd_table_entry constant:req value:req + .macro script_cmd_table_entry constant:req value:req, requests_effects=0 .if ALLOCATE_SCRIPT_CMD_TABLE + .if \requests_effects == 0 .4byte \value .else + .4byte \value + ROM_SIZE + .endif + .else enum \constant .endif .endm @@ -15,235 +22,235 @@ .align 2 gScriptCmdTable:: .endif - script_cmd_table_entry SCR_OP_NOP ScrCmd_nop @ 0x00 - script_cmd_table_entry SCR_OP_NOP1 ScrCmd_nop1 @ 0x01 - script_cmd_table_entry SCR_OP_END ScrCmd_end @ 0x02 - script_cmd_table_entry SCR_OP_RETURN ScrCmd_return @ 0x03 - script_cmd_table_entry SCR_OP_CALL ScrCmd_call @ 0x04 - script_cmd_table_entry SCR_OP_GOTO ScrCmd_goto @ 0x05 - script_cmd_table_entry SCR_OP_GOTO_IF ScrCmd_goto_if @ 0x06 - script_cmd_table_entry SCR_OP_CALL_IF ScrCmd_call_if @ 0x07 - script_cmd_table_entry SCR_OP_GOTO_STD ScrCmd_gotostd @ 0x08 - script_cmd_table_entry SCR_OP_CALL_STD ScrCmd_callstd @ 0x09 - script_cmd_table_entry SCR_OP_GOTO_STD_IF ScrCmd_gotostd_if @ 0x0a - script_cmd_table_entry SCR_OP_CALL_STD_IF ScrCmd_callstd_if @ 0x0b - script_cmd_table_entry SCR_OP_RETURNRAM ScrCmd_returnram @ 0x0c - script_cmd_table_entry SCR_OP_ENDRAM ScrCmd_endram @ 0x0d - script_cmd_table_entry SCR_OP_SETMYSTERYEVENTSTATUS ScrCmd_setmysteryeventstatus @ 0x0e - script_cmd_table_entry SCR_OP_LOAD_WORD ScrCmd_loadword @ 0x0f - script_cmd_table_entry SCR_OP_LOAD_BYTE ScrCmd_loadbyte @ 0x10 - script_cmd_table_entry SCR_OP_SETPTR ScrCmd_setptr @ 0x11 - script_cmd_table_entry SCR_OP_LOADBYTEFROMPTR ScrCmd_loadbytefromptr @ 0x12 - script_cmd_table_entry SCR_OP_SETPTRBYTE ScrCmd_setptrbyte @ 0x13 - script_cmd_table_entry SCR_OP_COPYLOCAL ScrCmd_copylocal @ 0x14 - script_cmd_table_entry SCR_OP_COPYBYTE ScrCmd_copybyte @ 0x15 - script_cmd_table_entry SCR_OP_SETVAR ScrCmd_setvar @ 0x16 - script_cmd_table_entry SCR_OP_ADDVAR ScrCmd_addvar @ 0x17 - script_cmd_table_entry SCR_OP_SUBVAR ScrCmd_subvar @ 0x18 - script_cmd_table_entry SCR_OP_COPYVAR ScrCmd_copyvar @ 0x19 - script_cmd_table_entry SCR_OP_SETORCOPYVAR ScrCmd_setorcopyvar @ 0x1a - script_cmd_table_entry SCR_OP_COMPARE_LOCAL_TO_LOCAL ScrCmd_compare_local_to_local @ 0x1b - script_cmd_table_entry SCR_OP_COMPARE_LOCAL_TO_VALUE ScrCmd_compare_local_to_value @ 0x1c - script_cmd_table_entry SCR_OP_COMPARE_LOCAL_TO_PTR ScrCmd_compare_local_to_ptr @ 0x1d - script_cmd_table_entry SCR_OP_COMPARE_PTR_TO_LOCAL ScrCmd_compare_ptr_to_local @ 0x1e - script_cmd_table_entry SCR_OP_COMPARE_PTR_TO_VALUE ScrCmd_compare_ptr_to_value @ 0x1f - script_cmd_table_entry SCR_OP_COMPARE_PTR_TO_PTR ScrCmd_compare_ptr_to_ptr @ 0x20 - script_cmd_table_entry SCR_OP_COMPARE_VAR_TO_VALUE ScrCmd_compare_var_to_value @ 0x21 - script_cmd_table_entry SCR_OP_COMPARE_VAR_TO_VAR ScrCmd_compare_var_to_var @ 0x22 - script_cmd_table_entry SCR_OP_CALLNATIVE ScrCmd_callnative @ 0x23 - script_cmd_table_entry SCR_OP_GOTONATIVE ScrCmd_gotonative @ 0x24 - script_cmd_table_entry SCR_OP_SPECIAL ScrCmd_special @ 0x25 - script_cmd_table_entry SCR_OP_SPECIALVAR ScrCmd_specialvar @ 0x26 - script_cmd_table_entry SCR_OP_WAITSTATE ScrCmd_waitstate @ 0x27 - script_cmd_table_entry SCR_OP_DELAY ScrCmd_delay @ 0x28 - script_cmd_table_entry SCR_OP_SETFLAG ScrCmd_setflag @ 0x29 - script_cmd_table_entry SCR_OP_CLEARFLAG ScrCmd_clearflag @ 0x2a - script_cmd_table_entry SCR_OP_CHECKFLAG ScrCmd_checkflag @ 0x2b - script_cmd_table_entry SCR_OP_INITCLOCK ScrCmd_initclock @ 0x2c - script_cmd_table_entry SCR_OP_DOTIMEBASEDEVENTS ScrCmd_dotimebasedevents @ 0x2d - script_cmd_table_entry SCR_OP_GETTIME ScrCmd_gettime @ 0x2e - script_cmd_table_entry SCR_OP_PLAYSE ScrCmd_playse @ 0x2f - script_cmd_table_entry SCR_OP_WAITSE ScrCmd_waitse @ 0x30 - script_cmd_table_entry SCR_OP_PLAYFANFARE ScrCmd_playfanfare @ 0x31 - script_cmd_table_entry SCR_OP_WAITFANFARE ScrCmd_waitfanfare @ 0x32 - script_cmd_table_entry SCR_OP_PLAYBGM ScrCmd_playbgm @ 0x33 - script_cmd_table_entry SCR_OP_SAVEBGM ScrCmd_savebgm @ 0x34 - script_cmd_table_entry SCR_OP_FADEDEFAULTBGM ScrCmd_fadedefaultbgm @ 0x35 - script_cmd_table_entry SCR_OP_FADENEWBGM ScrCmd_fadenewbgm @ 0x36 - script_cmd_table_entry SCR_OP_FADEOUTBGM ScrCmd_fadeoutbgm @ 0x37 - script_cmd_table_entry SCR_OP_FADEINBGM ScrCmd_fadeinbgm @ 0x38 - script_cmd_table_entry SCR_OP_WARP ScrCmd_warp @ 0x39 - script_cmd_table_entry SCR_OP_WARPSILENT ScrCmd_warpsilent @ 0x3a - script_cmd_table_entry SCR_OP_WARPDOOR ScrCmd_warpdoor @ 0x3b - script_cmd_table_entry SCR_OP_WARPHOLE ScrCmd_warphole @ 0x3c - script_cmd_table_entry SCR_OP_WARPTELEPORT ScrCmd_warpteleport @ 0x3d - script_cmd_table_entry SCR_OP_SETWARP ScrCmd_setwarp @ 0x3e - script_cmd_table_entry SCR_OP_SETDYNAMICWARP ScrCmd_setdynamicwarp @ 0x3f - script_cmd_table_entry SCR_OP_SETDIVEWARP ScrCmd_setdivewarp @ 0x40 - script_cmd_table_entry SCR_OP_SETHOLEWARP ScrCmd_setholewarp @ 0x41 - script_cmd_table_entry SCR_OP_GETPLAYERXY ScrCmd_getplayerxy @ 0x42 - script_cmd_table_entry SCR_OP_GETPARTYSIZE ScrCmd_getpartysize @ 0x43 - script_cmd_table_entry SCR_OP_ADDITEM ScrCmd_additem @ 0x44 - script_cmd_table_entry SCR_OP_REMOVEITEM ScrCmd_removeitem @ 0x45 - script_cmd_table_entry SCR_OP_CHECKITEMSPACE ScrCmd_checkitemspace @ 0x46 - script_cmd_table_entry SCR_OP_CHECKITEM ScrCmd_checkitem @ 0x47 - script_cmd_table_entry SCR_OP_CHECKITEMTYPE ScrCmd_checkitemtype @ 0x48 - script_cmd_table_entry SCR_OP_ADDPCITEM ScrCmd_addpcitem @ 0x49 - script_cmd_table_entry SCR_OP_CHECKPCITEM ScrCmd_checkpcitem @ 0x4a - script_cmd_table_entry SCR_OP_ADDDECORATION ScrCmd_adddecoration @ 0x4b - script_cmd_table_entry SCR_OP_REMOVEDECORATION ScrCmd_removedecoration @ 0x4c - script_cmd_table_entry SCR_OP_CHECKDECOR ScrCmd_checkdecor @ 0x4d - script_cmd_table_entry SCR_OP_CHECKDECORSPACE ScrCmd_checkdecorspace @ 0x4e - script_cmd_table_entry SCR_OP_APPLYMOVEMENT ScrCmd_applymovement @ 0x4f - script_cmd_table_entry SCR_OP_APPLYMOVEMENTAT ScrCmd_applymovementat @ 0x50 - script_cmd_table_entry SCR_OP_WAITMOVEMENT ScrCmd_waitmovement @ 0x51 - script_cmd_table_entry SCR_OP_WAITMOVEMENTAT ScrCmd_waitmovementat @ 0x52 - script_cmd_table_entry SCR_OP_REMOVEOBJECT ScrCmd_removeobject @ 0x53 - script_cmd_table_entry SCR_OP_REMOVEOBJECTAT ScrCmd_removeobjectat @ 0x54 - script_cmd_table_entry SCR_OP_ADDOBJECT ScrCmd_addobject @ 0x55 - script_cmd_table_entry SCR_OP_ADDOBJECTAT ScrCmd_addobjectat @ 0x56 - script_cmd_table_entry SCR_OP_SETOBJECTXY ScrCmd_setobjectxy @ 0x57 - script_cmd_table_entry SCR_OP_SHOWOBJECTAT ScrCmd_showobjectat @ 0x58 - script_cmd_table_entry SCR_OP_HIDEOBJECTAT ScrCmd_hideobjectat @ 0x59 - script_cmd_table_entry SCR_OP_FACEPLAYER ScrCmd_faceplayer @ 0x5a - script_cmd_table_entry SCR_OP_TURNOBJECT ScrCmd_turnobject @ 0x5b - script_cmd_table_entry SCR_OP_TRAINERBATTLE ScrCmd_trainerbattle @ 0x5c - script_cmd_table_entry SCR_OP_DOTRAINERBATTLE ScrCmd_dotrainerbattle @ 0x5d - script_cmd_table_entry SCR_OP_GOTOPOSTBATTLESCRIPT ScrCmd_gotopostbattlescript @ 0x5e - script_cmd_table_entry SCR_OP_GOTOBEATENSCRIPT ScrCmd_gotobeatenscript @ 0x5f - script_cmd_table_entry SCR_OP_CHECKTRAINERFLAG ScrCmd_checktrainerflag @ 0x60 - script_cmd_table_entry SCR_OP_SETTRAINERFLAG ScrCmd_settrainerflag @ 0x61 - script_cmd_table_entry SCR_OP_CLEARTRAINERFLAG ScrCmd_cleartrainerflag @ 0x62 - script_cmd_table_entry SCR_OP_SETOBJECTXYPERM ScrCmd_setobjectxyperm @ 0x63 - script_cmd_table_entry SCR_OP_COPYOBJECTXYTOPERM ScrCmd_copyobjectxytoperm @ 0x64 - script_cmd_table_entry SCR_OP_SETOBJECTMOVEMENTTYPE ScrCmd_setobjectmovementtype @ 0x65 - script_cmd_table_entry SCR_OP_WAITMESSAGE ScrCmd_waitmessage @ 0x66 - script_cmd_table_entry SCR_OP_MESSAGE ScrCmd_message @ 0x67 - script_cmd_table_entry SCR_OP_CLOSEMESSAGE ScrCmd_closemessage @ 0x68 - script_cmd_table_entry SCR_OP_LOCKALL ScrCmd_lockall @ 0x69 - script_cmd_table_entry SCR_OP_LOCK ScrCmd_lock @ 0x6a - script_cmd_table_entry SCR_OP_RELEASEALL ScrCmd_releaseall @ 0x6b - script_cmd_table_entry SCR_OP_RELEASE ScrCmd_release @ 0x6c - script_cmd_table_entry SCR_OP_WAITBUTTONPRESS ScrCmd_waitbuttonpress @ 0x6d - script_cmd_table_entry SCR_OP_YESNOBOX ScrCmd_yesnobox @ 0x6e - script_cmd_table_entry SCR_OP_MULTICHOICE ScrCmd_multichoice @ 0x6f - script_cmd_table_entry SCR_OP_MULTICHOICEDEFAULT ScrCmd_multichoicedefault @ 0x70 - script_cmd_table_entry SCR_OP_MULTICHOICEGRID ScrCmd_multichoicegrid @ 0x71 - script_cmd_table_entry SCR_OP_DRAWBOX ScrCmd_drawbox @ 0x72 - script_cmd_table_entry SCR_OP_ERASEBOX ScrCmd_erasebox @ 0x73 - script_cmd_table_entry SCR_OP_DRAWBOXTEXT ScrCmd_drawboxtext @ 0x74 - script_cmd_table_entry SCR_OP_SHOWMONPIC ScrCmd_showmonpic @ 0x75 - script_cmd_table_entry SCR_OP_HIDEMONPIC ScrCmd_hidemonpic @ 0x76 - script_cmd_table_entry SCR_OP_SHOWCONTESTPAINTING ScrCmd_showcontestpainting @ 0x77 - script_cmd_table_entry SCR_OP_BRAILLEMESSAGE ScrCmd_braillemessage @ 0x78 - script_cmd_table_entry SCR_OP_GIVEMON ScrCmd_nop1 @ 0x79 - script_cmd_table_entry SCR_OP_GIVEEGG ScrCmd_giveegg @ 0x7a - script_cmd_table_entry SCR_OP_SETMONMOVE ScrCmd_setmonmove @ 0x7b - script_cmd_table_entry SCR_OP_CHECKPARTYMOVE ScrCmd_checkpartymove @ 0x7c - script_cmd_table_entry SCR_OP_BUFFERSPECIESNAME ScrCmd_bufferspeciesname @ 0x7d - script_cmd_table_entry SCR_OP_BUFFERLEADMONSPECIESNAME ScrCmd_bufferleadmonspeciesname @ 0x7e - script_cmd_table_entry SCR_OP_BUFFERPARTYMONNICK ScrCmd_bufferpartymonnick @ 0x7f - script_cmd_table_entry SCR_OP_BUFFERITEMNAME ScrCmd_bufferitemname @ 0x80 - script_cmd_table_entry SCR_OP_BUFFERDECORATIONNAME ScrCmd_bufferdecorationname @ 0x81 - script_cmd_table_entry SCR_OP_BUFFERMOVENAME ScrCmd_buffermovename @ 0x82 - script_cmd_table_entry SCR_OP_BUFFERNUMBERSTRING ScrCmd_buffernumberstring @ 0x83 - script_cmd_table_entry SCR_OP_BUFFERSTDSTRING ScrCmd_bufferstdstring @ 0x84 - script_cmd_table_entry SCR_OP_BUFFERSTRING ScrCmd_bufferstring @ 0x85 - script_cmd_table_entry SCR_OP_POKEMART ScrCmd_pokemart @ 0x86 - script_cmd_table_entry SCR_OP_POKEMARTDECORATION ScrCmd_pokemartdecoration @ 0x87 - script_cmd_table_entry SCR_OP_POKEMARTDECORATION2 ScrCmd_pokemartdecoration2 @ 0x88 - script_cmd_table_entry SCR_OP_PLAYSLOTMACHINE ScrCmd_playslotmachine @ 0x89 - script_cmd_table_entry SCR_OP_SETBERRYTREE ScrCmd_setberrytree @ 0x8a - script_cmd_table_entry SCR_OP_CHOOSECONTESTMON ScrCmd_choosecontestmon @ 0x8b - script_cmd_table_entry SCR_OP_STARTCONTEST ScrCmd_startcontest @ 0x8c - script_cmd_table_entry SCR_OP_SHOWCONTESTRESULTS ScrCmd_showcontestresults @ 0x8d - script_cmd_table_entry SCR_OP_CONTESTLINKTRANSFER ScrCmd_contestlinktransfer @ 0x8e - script_cmd_table_entry SCR_OP_RANDOM ScrCmd_random @ 0x8f - script_cmd_table_entry SCR_OP_ADDMONEY ScrCmd_addmoney @ 0x90 - script_cmd_table_entry SCR_OP_REMOVEMONEY ScrCmd_removemoney @ 0x91 - script_cmd_table_entry SCR_OP_CHECKMONEY ScrCmd_checkmoney @ 0x92 - script_cmd_table_entry SCR_OP_SHOWMONEYBOX ScrCmd_showmoneybox @ 0x93 - script_cmd_table_entry SCR_OP_HIDEMONEYBOX ScrCmd_hidemoneybox @ 0x94 - script_cmd_table_entry SCR_OP_UPDATEMONEYBOX ScrCmd_updatemoneybox @ 0x95 - script_cmd_table_entry SCR_OP_GETPOKENEWSACTIVE ScrCmd_getpokenewsactive @ 0x96 - script_cmd_table_entry SCR_OP_FADESCREEN ScrCmd_fadescreen @ 0x97 - script_cmd_table_entry SCR_OP_FADESCREENSPEED ScrCmd_fadescreenspeed @ 0x98 - script_cmd_table_entry SCR_OP_SETFLASHLEVEL ScrCmd_setflashlevel @ 0x99 - script_cmd_table_entry SCR_OP_ANIMATEFLASH ScrCmd_animateflash @ 0x9a - script_cmd_table_entry SCR_OP_MESSAGEAUTOSCROLL ScrCmd_messageautoscroll @ 0x9b - script_cmd_table_entry SCR_OP_DOFIELDEFFECT ScrCmd_dofieldeffect @ 0x9c - script_cmd_table_entry SCR_OP_SETFIELDEFFECTARGUMENT ScrCmd_setfieldeffectargument @ 0x9d - script_cmd_table_entry SCR_OP_WAITFIELDEFFECT ScrCmd_waitfieldeffect @ 0x9e - script_cmd_table_entry SCR_OP_SETRESPAWN ScrCmd_setrespawn @ 0x9f - script_cmd_table_entry SCR_OP_CHECKPLAYERGENDER ScrCmd_checkplayergender @ 0xa0 - script_cmd_table_entry SCR_OP_PLAYMONCRY ScrCmd_playmoncry @ 0xa1 - script_cmd_table_entry SCR_OP_SETMETATILE ScrCmd_setmetatile @ 0xa2 - script_cmd_table_entry SCR_OP_RESETWEATHER ScrCmd_resetweather @ 0xa3 - script_cmd_table_entry SCR_OP_SETWEATHER ScrCmd_setweather @ 0xa4 - script_cmd_table_entry SCR_OP_DOWEATHER ScrCmd_doweather @ 0xa5 - script_cmd_table_entry SCR_OP_SETSTEPCALLBACK ScrCmd_setstepcallback @ 0xa6 - script_cmd_table_entry SCR_OP_SETMAPLAYOUTINDEX ScrCmd_setmaplayoutindex @ 0xa7 - script_cmd_table_entry SCR_OP_SETOBJECTSUBPRIORITY ScrCmd_setobjectsubpriority @ 0xa8 - script_cmd_table_entry SCR_OP_RESETOBJECTSUBPRIORITY ScrCmd_resetobjectsubpriority @ 0xa9 - script_cmd_table_entry SCR_OP_CREATEVOBJECT ScrCmd_createvobject @ 0xaa - script_cmd_table_entry SCR_OP_TURNVOBJECT ScrCmd_turnvobject @ 0xab - script_cmd_table_entry SCR_OP_OPENDOOR ScrCmd_opendoor @ 0xac - script_cmd_table_entry SCR_OP_CLOSEDOOR ScrCmd_closedoor @ 0xad - script_cmd_table_entry SCR_OP_WAITDOORANIM ScrCmd_waitdooranim @ 0xae - script_cmd_table_entry SCR_OP_SETDOOROPEN ScrCmd_setdooropen @ 0xaf - script_cmd_table_entry SCR_OP_SETDOORCLOSED ScrCmd_setdoorclosed @ 0xb0 - script_cmd_table_entry SCR_OP_ADDELEVMENUITEM ScrCmd_addelevmenuitem @ 0xb1 - script_cmd_table_entry SCR_OP_SHOWELEVMENU ScrCmd_showelevmenu @ 0xb2 - script_cmd_table_entry SCR_OP_CHECKCOINS ScrCmd_checkcoins @ 0xb3 - script_cmd_table_entry SCR_OP_ADDCOINS ScrCmd_addcoins @ 0xb4 - script_cmd_table_entry SCR_OP_REMOVECOINS ScrCmd_removecoins @ 0xb5 - script_cmd_table_entry SCR_OP_SETWILDBATTLE ScrCmd_setwildbattle @ 0xb6 - script_cmd_table_entry SCR_OP_DOWILDBATTLE ScrCmd_dowildbattle @ 0xb7 - script_cmd_table_entry SCR_OP_SETVADDRESS ScrCmd_setvaddress @ 0xb8 - script_cmd_table_entry SCR_OP_VGOTO ScrCmd_vgoto @ 0xb9 - script_cmd_table_entry SCR_OP_VCALL ScrCmd_vcall @ 0xba - script_cmd_table_entry SCR_OP_VGOTO_IF ScrCmd_vgoto_if @ 0xbb - script_cmd_table_entry SCR_OP_VCALL_IF ScrCmd_vcall_if @ 0xbc - script_cmd_table_entry SCR_OP_VMESSAGE ScrCmd_vmessage @ 0xbd - script_cmd_table_entry SCR_OP_VBUFFERMESSAGE ScrCmd_vbuffermessage @ 0xbe - script_cmd_table_entry SCR_OP_VBUFFERSTRING ScrCmd_vbufferstring @ 0xbf - script_cmd_table_entry SCR_OP_SHOWCOINSBOX ScrCmd_showcoinsbox @ 0xc0 - script_cmd_table_entry SCR_OP_HIDECOINSBOX ScrCmd_hidecoinsbox @ 0xc1 - script_cmd_table_entry SCR_OP_UPDATECOINSBOX ScrCmd_updatecoinsbox @ 0xc2 - script_cmd_table_entry SCR_OP_INCREMENTGAMESTAT ScrCmd_incrementgamestat @ 0xc3 - script_cmd_table_entry SCR_OP_SETESCAPEWARP ScrCmd_setescapewarp @ 0xc4 - script_cmd_table_entry SCR_OP_WAITMONCRY ScrCmd_waitmoncry @ 0xc5 - script_cmd_table_entry SCR_OP_BUFFERBOXNAME ScrCmd_bufferboxname @ 0xc6 - script_cmd_table_entry SCR_OP_TEXTCOLOR ScrCmd_nop1 @ 0xc7 - script_cmd_table_entry SCR_OP_LOADHELP ScrCmd_nop1 @ 0xc8 - script_cmd_table_entry SCR_OP_UNLOADHELP ScrCmd_nop1 @ 0xc9 - script_cmd_table_entry SCR_OP_SIGNMSG ScrCmd_nop1 @ 0xca - script_cmd_table_entry SCR_OP_NORMALMSG ScrCmd_nop1 @ 0xcb - script_cmd_table_entry SCR_OP_COMPAREHIDDENVAR ScrCmd_nop1 @ 0xcc - script_cmd_table_entry SCR_OP_SETMODERNFATEFULENCOUNTER ScrCmd_setmodernfatefulencounter @ 0xcd - script_cmd_table_entry SCR_OP_CHECKMODERNFATEFULENCOUNTER ScrCmd_checkmodernfatefulencounter @ 0xce - script_cmd_table_entry SCR_OP_TRYWONDERCARDSCRIPT ScrCmd_trywondercardscript @ 0xcf - script_cmd_table_entry SCR_OP_SETWORLDMAPFLAG ScrCmd_nop1 @ 0xd0 - script_cmd_table_entry SCR_OP_WARPSPINENTER ScrCmd_warpspinenter @ 0xd1 - script_cmd_table_entry SCR_OP_SETMONMETLOCATION ScrCmd_setmonmetlocation @ 0xd2 - script_cmd_table_entry SCR_OP_MOVEROTATINGTILEOBJECTS ScrCmd_moverotatingtileobjects @ 0xd3 - script_cmd_table_entry SCR_OP_TURNROTATINGTILEOBJECTS ScrCmd_turnrotatingtileobjects @ 0xd4 - script_cmd_table_entry SCR_OP_INITROTATINGTILEPUZZLE ScrCmd_initrotatingtilepuzzle @ 0xd5 - script_cmd_table_entry SCR_OP_FREEROTATINGTILEPUZZLE ScrCmd_freerotatingtilepuzzle @ 0xd6 - script_cmd_table_entry SCR_OP_WARPMOSSDEEPGYM ScrCmd_warpmossdeepgym @ 0xd7 - script_cmd_table_entry SCR_OP_SELECTAPPROACHINGTRAINER ScrCmd_selectapproachingtrainer @ 0xd8 - script_cmd_table_entry SCR_OP_LOCKFORTRAINER ScrCmd_lockfortrainer @ 0xd9 - script_cmd_table_entry SCR_OP_CLOSEBRAILLEMESSAGE ScrCmd_closebraillemessage @ 0xda - script_cmd_table_entry SCR_OP_MESSAGEINSTANT ScrCmd_messageinstant @ 0xdb - script_cmd_table_entry SCR_OP_FADESCREENSWAPBUFFERS ScrCmd_fadescreenswapbuffers @ 0xdc - script_cmd_table_entry SCR_OP_BUFFERTRAINERCLASSNAME ScrCmd_buffertrainerclassname @ 0xdd - script_cmd_table_entry SCR_OP_BUFFERTRAINERNAME ScrCmd_buffertrainername @ 0xde - script_cmd_table_entry SCR_OP_POKENAVCALL ScrCmd_pokenavcall @ 0xdf - script_cmd_table_entry SCR_OP_WARPWHITEFADE ScrCmd_warpwhitefade @ 0xe0 - script_cmd_table_entry SCR_OP_BUFFERCONTESTNAME ScrCmd_buffercontestname @ 0xe1 - script_cmd_table_entry SCR_OP_BUFFERITEMNAMEPLURAL ScrCmd_bufferitemnameplural @ 0xe2 - script_cmd_table_entry SCR_OP_DYNMULTICHOICE ScrCmd_dynmultichoice @ 0xe3 - script_cmd_table_entry SCR_OP_DYNMULTIPUSH ScrCmd_dynmultipush @ 0xe4 + script_cmd_table_entry SCR_OP_NOP ScrCmd_nop, requests_effects=1 @ 0x00 + script_cmd_table_entry SCR_OP_NOP1 ScrCmd_nop1, requests_effects=1 @ 0x01 + script_cmd_table_entry SCR_OP_END ScrCmd_end, requests_effects=1 @ 0x02 + script_cmd_table_entry SCR_OP_RETURN ScrCmd_return, requests_effects=1 @ 0x03 + script_cmd_table_entry SCR_OP_CALL ScrCmd_call, requests_effects=1 @ 0x04 + script_cmd_table_entry SCR_OP_GOTO ScrCmd_goto, requests_effects=1 @ 0x05 + script_cmd_table_entry SCR_OP_GOTO_IF ScrCmd_goto_if, requests_effects=1 @ 0x06 + script_cmd_table_entry SCR_OP_CALL_IF ScrCmd_call_if, requests_effects=1 @ 0x07 + script_cmd_table_entry SCR_OP_GOTO_STD ScrCmd_gotostd, requests_effects=1 @ 0x08 + script_cmd_table_entry SCR_OP_CALL_STD ScrCmd_callstd, requests_effects=1 @ 0x09 + script_cmd_table_entry SCR_OP_GOTO_STD_IF ScrCmd_gotostd_if, requests_effects=1 @ 0x0a + script_cmd_table_entry SCR_OP_CALL_STD_IF ScrCmd_callstd_if, requests_effects=1 @ 0x0b + script_cmd_table_entry SCR_OP_RETURNRAM ScrCmd_returnram, requests_effects=1 @ 0x0c + script_cmd_table_entry SCR_OP_ENDRAM ScrCmd_endram, requests_effects=1 @ 0x0d + script_cmd_table_entry SCR_OP_SETMYSTERYEVENTSTATUS ScrCmd_setmysteryeventstatus, requests_effects=1 @ 0x0e + script_cmd_table_entry SCR_OP_LOAD_WORD ScrCmd_loadword, requests_effects=1 @ 0x0f + script_cmd_table_entry SCR_OP_LOAD_BYTE ScrCmd_loadbyte, requests_effects=1 @ 0x10 + script_cmd_table_entry SCR_OP_SETPTR ScrCmd_setptr, requests_effects=1 @ 0x11 + script_cmd_table_entry SCR_OP_LOADBYTEFROMPTR ScrCmd_loadbytefromptr, requests_effects=1 @ 0x12 + script_cmd_table_entry SCR_OP_SETPTRBYTE ScrCmd_setptrbyte, requests_effects=1 @ 0x13 + script_cmd_table_entry SCR_OP_COPYLOCAL ScrCmd_copylocal, requests_effects=1 @ 0x14 + script_cmd_table_entry SCR_OP_COPYBYTE ScrCmd_copybyte, requests_effects=1 @ 0x15 + script_cmd_table_entry SCR_OP_SETVAR ScrCmd_setvar, requests_effects=1 @ 0x16 + script_cmd_table_entry SCR_OP_ADDVAR ScrCmd_addvar, requests_effects=1 @ 0x17 + script_cmd_table_entry SCR_OP_SUBVAR ScrCmd_subvar, requests_effects=1 @ 0x18 + script_cmd_table_entry SCR_OP_COPYVAR ScrCmd_copyvar, requests_effects=1 @ 0x19 + script_cmd_table_entry SCR_OP_SETORCOPYVAR ScrCmd_setorcopyvar, requests_effects=1 @ 0x1a + script_cmd_table_entry SCR_OP_COMPARE_LOCAL_TO_LOCAL ScrCmd_compare_local_to_local, requests_effects=1 @ 0x1b + script_cmd_table_entry SCR_OP_COMPARE_LOCAL_TO_VALUE ScrCmd_compare_local_to_value, requests_effects=1 @ 0x1c + script_cmd_table_entry SCR_OP_COMPARE_LOCAL_TO_PTR ScrCmd_compare_local_to_ptr, requests_effects=1 @ 0x1d + script_cmd_table_entry SCR_OP_COMPARE_PTR_TO_LOCAL ScrCmd_compare_ptr_to_local, requests_effects=1 @ 0x1e + script_cmd_table_entry SCR_OP_COMPARE_PTR_TO_VALUE ScrCmd_compare_ptr_to_value, requests_effects=1 @ 0x1f + script_cmd_table_entry SCR_OP_COMPARE_PTR_TO_PTR ScrCmd_compare_ptr_to_ptr, requests_effects=1 @ 0x20 + script_cmd_table_entry SCR_OP_COMPARE_VAR_TO_VALUE ScrCmd_compare_var_to_value, requests_effects=1 @ 0x21 + script_cmd_table_entry SCR_OP_COMPARE_VAR_TO_VAR ScrCmd_compare_var_to_var, requests_effects=1 @ 0x22 + script_cmd_table_entry SCR_OP_CALLNATIVE ScrCmd_callnative, requests_effects=1 @ 0x23 + script_cmd_table_entry SCR_OP_GOTONATIVE ScrCmd_gotonative, requests_effects=1 @ 0x24 + script_cmd_table_entry SCR_OP_SPECIAL ScrCmd_special, requests_effects=1 @ 0x25 + script_cmd_table_entry SCR_OP_SPECIALVAR ScrCmd_specialvar, requests_effects=1 @ 0x26 + script_cmd_table_entry SCR_OP_WAITSTATE ScrCmd_waitstate, requests_effects=1 @ 0x27 + script_cmd_table_entry SCR_OP_DELAY ScrCmd_delay, requests_effects=1 @ 0x28 + script_cmd_table_entry SCR_OP_SETFLAG ScrCmd_setflag, requests_effects=1 @ 0x29 + script_cmd_table_entry SCR_OP_CLEARFLAG ScrCmd_clearflag, requests_effects=1 @ 0x2a + script_cmd_table_entry SCR_OP_CHECKFLAG ScrCmd_checkflag, requests_effects=1 @ 0x2b + script_cmd_table_entry SCR_OP_INITCLOCK ScrCmd_initclock, requests_effects=1 @ 0x2c + script_cmd_table_entry SCR_OP_DOTIMEBASEDEVENTS ScrCmd_dotimebasedevents, requests_effects=1 @ 0x2d + script_cmd_table_entry SCR_OP_GETTIME ScrCmd_gettime, requests_effects=1 @ 0x2e + script_cmd_table_entry SCR_OP_PLAYSE ScrCmd_playse, requests_effects=1 @ 0x2f + script_cmd_table_entry SCR_OP_WAITSE ScrCmd_waitse, requests_effects=1 @ 0x30 + script_cmd_table_entry SCR_OP_PLAYFANFARE ScrCmd_playfanfare, requests_effects=1 @ 0x31 + script_cmd_table_entry SCR_OP_WAITFANFARE ScrCmd_waitfanfare, requests_effects=1 @ 0x32 + script_cmd_table_entry SCR_OP_PLAYBGM ScrCmd_playbgm, requests_effects=1 @ 0x33 + script_cmd_table_entry SCR_OP_SAVEBGM ScrCmd_savebgm, requests_effects=1 @ 0x34 + script_cmd_table_entry SCR_OP_FADEDEFAULTBGM ScrCmd_fadedefaultbgm, requests_effects=1 @ 0x35 + script_cmd_table_entry SCR_OP_FADENEWBGM ScrCmd_fadenewbgm, requests_effects=1 @ 0x36 + script_cmd_table_entry SCR_OP_FADEOUTBGM ScrCmd_fadeoutbgm, requests_effects=1 @ 0x37 + script_cmd_table_entry SCR_OP_FADEINBGM ScrCmd_fadeinbgm, requests_effects=1 @ 0x38 + script_cmd_table_entry SCR_OP_WARP ScrCmd_warp, requests_effects=1 @ 0x39 + script_cmd_table_entry SCR_OP_WARPSILENT ScrCmd_warpsilent, requests_effects=1 @ 0x3a + script_cmd_table_entry SCR_OP_WARPDOOR ScrCmd_warpdoor, requests_effects=1 @ 0x3b + script_cmd_table_entry SCR_OP_WARPHOLE ScrCmd_warphole, requests_effects=1 @ 0x3c + script_cmd_table_entry SCR_OP_WARPTELEPORT ScrCmd_warpteleport, requests_effects=1 @ 0x3d + script_cmd_table_entry SCR_OP_SETWARP ScrCmd_setwarp, requests_effects=1 @ 0x3e + script_cmd_table_entry SCR_OP_SETDYNAMICWARP ScrCmd_setdynamicwarp, requests_effects=1 @ 0x3f + script_cmd_table_entry SCR_OP_SETDIVEWARP ScrCmd_setdivewarp, requests_effects=1 @ 0x40 + script_cmd_table_entry SCR_OP_SETHOLEWARP ScrCmd_setholewarp, requests_effects=1 @ 0x41 + script_cmd_table_entry SCR_OP_GETPLAYERXY ScrCmd_getplayerxy, requests_effects=1 @ 0x42 + script_cmd_table_entry SCR_OP_GETPARTYSIZE ScrCmd_getpartysize, requests_effects=1 @ 0x43 + script_cmd_table_entry SCR_OP_ADDITEM ScrCmd_additem, requests_effects=1 @ 0x44 + script_cmd_table_entry SCR_OP_REMOVEITEM ScrCmd_removeitem, requests_effects=1 @ 0x45 + script_cmd_table_entry SCR_OP_CHECKITEMSPACE ScrCmd_checkitemspace, requests_effects=1 @ 0x46 + script_cmd_table_entry SCR_OP_CHECKITEM ScrCmd_checkitem, requests_effects=1 @ 0x47 + script_cmd_table_entry SCR_OP_CHECKITEMTYPE ScrCmd_checkitemtype, requests_effects=1 @ 0x48 + script_cmd_table_entry SCR_OP_ADDPCITEM ScrCmd_addpcitem, requests_effects=1 @ 0x49 + script_cmd_table_entry SCR_OP_CHECKPCITEM ScrCmd_checkpcitem, requests_effects=1 @ 0x4a + script_cmd_table_entry SCR_OP_ADDDECORATION ScrCmd_adddecoration, requests_effects=1 @ 0x4b + script_cmd_table_entry SCR_OP_REMOVEDECORATION ScrCmd_removedecoration, requests_effects=1 @ 0x4c + script_cmd_table_entry SCR_OP_CHECKDECOR ScrCmd_checkdecor, requests_effects=1 @ 0x4d + script_cmd_table_entry SCR_OP_CHECKDECORSPACE ScrCmd_checkdecorspace, requests_effects=1 @ 0x4e + script_cmd_table_entry SCR_OP_APPLYMOVEMENT ScrCmd_applymovement, requests_effects=1 @ 0x4f + script_cmd_table_entry SCR_OP_APPLYMOVEMENTAT ScrCmd_applymovementat, requests_effects=1 @ 0x50 + script_cmd_table_entry SCR_OP_WAITMOVEMENT ScrCmd_waitmovement, requests_effects=1 @ 0x51 + script_cmd_table_entry SCR_OP_WAITMOVEMENTAT ScrCmd_waitmovementat, requests_effects=1 @ 0x52 + script_cmd_table_entry SCR_OP_REMOVEOBJECT ScrCmd_removeobject, requests_effects=1 @ 0x53 + script_cmd_table_entry SCR_OP_REMOVEOBJECTAT ScrCmd_removeobjectat, requests_effects=1 @ 0x54 + script_cmd_table_entry SCR_OP_ADDOBJECT ScrCmd_addobject, requests_effects=1 @ 0x55 + script_cmd_table_entry SCR_OP_ADDOBJECTAT ScrCmd_addobjectat, requests_effects=1 @ 0x56 + script_cmd_table_entry SCR_OP_SETOBJECTXY ScrCmd_setobjectxy, requests_effects=1 @ 0x57 + script_cmd_table_entry SCR_OP_SHOWOBJECTAT ScrCmd_showobjectat, requests_effects=1 @ 0x58 + script_cmd_table_entry SCR_OP_HIDEOBJECTAT ScrCmd_hideobjectat, requests_effects=1 @ 0x59 + script_cmd_table_entry SCR_OP_FACEPLAYER ScrCmd_faceplayer, requests_effects=1 @ 0x5a + script_cmd_table_entry SCR_OP_TURNOBJECT ScrCmd_turnobject, requests_effects=1 @ 0x5b + script_cmd_table_entry SCR_OP_TRAINERBATTLE ScrCmd_trainerbattle, requests_effects=1 @ 0x5c + script_cmd_table_entry SCR_OP_DOTRAINERBATTLE ScrCmd_dotrainerbattle, requests_effects=1 @ 0x5d + script_cmd_table_entry SCR_OP_GOTOPOSTBATTLESCRIPT ScrCmd_gotopostbattlescript, requests_effects=1 @ 0x5e + script_cmd_table_entry SCR_OP_GOTOBEATENSCRIPT ScrCmd_gotobeatenscript, requests_effects=1 @ 0x5f + script_cmd_table_entry SCR_OP_CHECKTRAINERFLAG ScrCmd_checktrainerflag, requests_effects=1 @ 0x60 + script_cmd_table_entry SCR_OP_SETTRAINERFLAG ScrCmd_settrainerflag, requests_effects=1 @ 0x61 + script_cmd_table_entry SCR_OP_CLEARTRAINERFLAG ScrCmd_cleartrainerflag, requests_effects=1 @ 0x62 + script_cmd_table_entry SCR_OP_SETOBJECTXYPERM ScrCmd_setobjectxyperm, requests_effects=1 @ 0x63 + script_cmd_table_entry SCR_OP_COPYOBJECTXYTOPERM ScrCmd_copyobjectxytoperm, requests_effects=1 @ 0x64 + script_cmd_table_entry SCR_OP_SETOBJECTMOVEMENTTYPE ScrCmd_setobjectmovementtype, requests_effects=1 @ 0x65 + script_cmd_table_entry SCR_OP_WAITMESSAGE ScrCmd_waitmessage, requests_effects=1 @ 0x66 + script_cmd_table_entry SCR_OP_MESSAGE ScrCmd_message, requests_effects=1 @ 0x67 + script_cmd_table_entry SCR_OP_CLOSEMESSAGE ScrCmd_closemessage, requests_effects=1 @ 0x68 + script_cmd_table_entry SCR_OP_LOCKALL ScrCmd_lockall, requests_effects=1 @ 0x69 + script_cmd_table_entry SCR_OP_LOCK ScrCmd_lock, requests_effects=1 @ 0x6a + script_cmd_table_entry SCR_OP_RELEASEALL ScrCmd_releaseall, requests_effects=1 @ 0x6b + script_cmd_table_entry SCR_OP_RELEASE ScrCmd_release, requests_effects=1 @ 0x6c + script_cmd_table_entry SCR_OP_WAITBUTTONPRESS ScrCmd_waitbuttonpress, requests_effects=1 @ 0x6d + script_cmd_table_entry SCR_OP_YESNOBOX ScrCmd_yesnobox, requests_effects=1 @ 0x6e + script_cmd_table_entry SCR_OP_MULTICHOICE ScrCmd_multichoice, requests_effects=1 @ 0x6f + script_cmd_table_entry SCR_OP_MULTICHOICEDEFAULT ScrCmd_multichoicedefault, requests_effects=1 @ 0x70 + script_cmd_table_entry SCR_OP_MULTICHOICEGRID ScrCmd_multichoicegrid, requests_effects=1 @ 0x71 + script_cmd_table_entry SCR_OP_DRAWBOX ScrCmd_drawbox, requests_effects=1 @ 0x72 + script_cmd_table_entry SCR_OP_ERASEBOX ScrCmd_erasebox, requests_effects=1 @ 0x73 + script_cmd_table_entry SCR_OP_DRAWBOXTEXT ScrCmd_drawboxtext, requests_effects=1 @ 0x74 + script_cmd_table_entry SCR_OP_SHOWMONPIC ScrCmd_showmonpic, requests_effects=1 @ 0x75 + script_cmd_table_entry SCR_OP_HIDEMONPIC ScrCmd_hidemonpic, requests_effects=1 @ 0x76 + script_cmd_table_entry SCR_OP_SHOWCONTESTPAINTING ScrCmd_showcontestpainting, requests_effects=1 @ 0x77 + script_cmd_table_entry SCR_OP_BRAILLEMESSAGE ScrCmd_braillemessage, requests_effects=1 @ 0x78 + script_cmd_table_entry SCR_OP_GIVEMON ScrCmd_nop1, requests_effects=1 @ 0x79 + script_cmd_table_entry SCR_OP_GIVEEGG ScrCmd_giveegg, requests_effects=1 @ 0x7a + script_cmd_table_entry SCR_OP_SETMONMOVE ScrCmd_setmonmove, requests_effects=1 @ 0x7b + script_cmd_table_entry SCR_OP_CHECKPARTYMOVE ScrCmd_checkpartymove, requests_effects=1 @ 0x7c + script_cmd_table_entry SCR_OP_BUFFERSPECIESNAME ScrCmd_bufferspeciesname, requests_effects=1 @ 0x7d + script_cmd_table_entry SCR_OP_BUFFERLEADMONSPECIESNAME ScrCmd_bufferleadmonspeciesname, requests_effects=1 @ 0x7e + script_cmd_table_entry SCR_OP_BUFFERPARTYMONNICK ScrCmd_bufferpartymonnick, requests_effects=1 @ 0x7f + script_cmd_table_entry SCR_OP_BUFFERITEMNAME ScrCmd_bufferitemname, requests_effects=1 @ 0x80 + script_cmd_table_entry SCR_OP_BUFFERDECORATIONNAME ScrCmd_bufferdecorationname, requests_effects=1 @ 0x81 + script_cmd_table_entry SCR_OP_BUFFERMOVENAME ScrCmd_buffermovename, requests_effects=1 @ 0x82 + script_cmd_table_entry SCR_OP_BUFFERNUMBERSTRING ScrCmd_buffernumberstring, requests_effects=1 @ 0x83 + script_cmd_table_entry SCR_OP_BUFFERSTDSTRING ScrCmd_bufferstdstring, requests_effects=1 @ 0x84 + script_cmd_table_entry SCR_OP_BUFFERSTRING ScrCmd_bufferstring, requests_effects=1 @ 0x85 + script_cmd_table_entry SCR_OP_POKEMART ScrCmd_pokemart, requests_effects=1 @ 0x86 + script_cmd_table_entry SCR_OP_POKEMARTDECORATION ScrCmd_pokemartdecoration, requests_effects=1 @ 0x87 + script_cmd_table_entry SCR_OP_POKEMARTDECORATION2 ScrCmd_pokemartdecoration2, requests_effects=1 @ 0x88 + script_cmd_table_entry SCR_OP_PLAYSLOTMACHINE ScrCmd_playslotmachine, requests_effects=1 @ 0x89 + script_cmd_table_entry SCR_OP_SETBERRYTREE ScrCmd_setberrytree, requests_effects=1 @ 0x8a + script_cmd_table_entry SCR_OP_CHOOSECONTESTMON ScrCmd_choosecontestmon, requests_effects=1 @ 0x8b + script_cmd_table_entry SCR_OP_STARTCONTEST ScrCmd_startcontest, requests_effects=1 @ 0x8c + script_cmd_table_entry SCR_OP_SHOWCONTESTRESULTS ScrCmd_showcontestresults, requests_effects=1 @ 0x8d + script_cmd_table_entry SCR_OP_CONTESTLINKTRANSFER ScrCmd_contestlinktransfer, requests_effects=1 @ 0x8e + script_cmd_table_entry SCR_OP_RANDOM ScrCmd_random, requests_effects=1 @ 0x8f + script_cmd_table_entry SCR_OP_ADDMONEY ScrCmd_addmoney, requests_effects=1 @ 0x90 + script_cmd_table_entry SCR_OP_REMOVEMONEY ScrCmd_removemoney, requests_effects=1 @ 0x91 + script_cmd_table_entry SCR_OP_CHECKMONEY ScrCmd_checkmoney, requests_effects=1 @ 0x92 + script_cmd_table_entry SCR_OP_SHOWMONEYBOX ScrCmd_showmoneybox, requests_effects=1 @ 0x93 + script_cmd_table_entry SCR_OP_HIDEMONEYBOX ScrCmd_hidemoneybox, requests_effects=1 @ 0x94 + script_cmd_table_entry SCR_OP_UPDATEMONEYBOX ScrCmd_updatemoneybox, requests_effects=1 @ 0x95 + script_cmd_table_entry SCR_OP_GETPOKENEWSACTIVE ScrCmd_getpokenewsactive, requests_effects=1 @ 0x96 + script_cmd_table_entry SCR_OP_FADESCREEN ScrCmd_fadescreen, requests_effects=1 @ 0x97 + script_cmd_table_entry SCR_OP_FADESCREENSPEED ScrCmd_fadescreenspeed, requests_effects=1 @ 0x98 + script_cmd_table_entry SCR_OP_SETFLASHLEVEL ScrCmd_setflashlevel, requests_effects=1 @ 0x99 + script_cmd_table_entry SCR_OP_ANIMATEFLASH ScrCmd_animateflash, requests_effects=1 @ 0x9a + script_cmd_table_entry SCR_OP_MESSAGEAUTOSCROLL ScrCmd_messageautoscroll, requests_effects=1 @ 0x9b + script_cmd_table_entry SCR_OP_DOFIELDEFFECT ScrCmd_dofieldeffect, requests_effects=1 @ 0x9c + script_cmd_table_entry SCR_OP_SETFIELDEFFECTARGUMENT ScrCmd_setfieldeffectargument, requests_effects=1 @ 0x9d + script_cmd_table_entry SCR_OP_WAITFIELDEFFECT ScrCmd_waitfieldeffect, requests_effects=1 @ 0x9e + script_cmd_table_entry SCR_OP_SETRESPAWN ScrCmd_setrespawn, requests_effects=1 @ 0x9f + script_cmd_table_entry SCR_OP_CHECKPLAYERGENDER ScrCmd_checkplayergender, requests_effects=1 @ 0xa0 + script_cmd_table_entry SCR_OP_PLAYMONCRY ScrCmd_playmoncry, requests_effects=1 @ 0xa1 + script_cmd_table_entry SCR_OP_SETMETATILE ScrCmd_setmetatile, requests_effects=1 @ 0xa2 + script_cmd_table_entry SCR_OP_RESETWEATHER ScrCmd_resetweather, requests_effects=1 @ 0xa3 + script_cmd_table_entry SCR_OP_SETWEATHER ScrCmd_setweather, requests_effects=1 @ 0xa4 + script_cmd_table_entry SCR_OP_DOWEATHER ScrCmd_doweather, requests_effects=1 @ 0xa5 + script_cmd_table_entry SCR_OP_SETSTEPCALLBACK ScrCmd_setstepcallback, requests_effects=1 @ 0xa6 + script_cmd_table_entry SCR_OP_SETMAPLAYOUTINDEX ScrCmd_setmaplayoutindex, requests_effects=1 @ 0xa7 + script_cmd_table_entry SCR_OP_SETOBJECTSUBPRIORITY ScrCmd_setobjectsubpriority, requests_effects=1 @ 0xa8 + script_cmd_table_entry SCR_OP_RESETOBJECTSUBPRIORITY ScrCmd_resetobjectsubpriority, requests_effects=1 @ 0xa9 + script_cmd_table_entry SCR_OP_CREATEVOBJECT ScrCmd_createvobject, requests_effects=1 @ 0xaa + script_cmd_table_entry SCR_OP_TURNVOBJECT ScrCmd_turnvobject, requests_effects=1 @ 0xab + script_cmd_table_entry SCR_OP_OPENDOOR ScrCmd_opendoor, requests_effects=1 @ 0xac + script_cmd_table_entry SCR_OP_CLOSEDOOR ScrCmd_closedoor, requests_effects=1 @ 0xad + script_cmd_table_entry SCR_OP_WAITDOORANIM ScrCmd_waitdooranim, requests_effects=1 @ 0xae + script_cmd_table_entry SCR_OP_SETDOOROPEN ScrCmd_setdooropen, requests_effects=1 @ 0xaf + script_cmd_table_entry SCR_OP_SETDOORCLOSED ScrCmd_setdoorclosed, requests_effects=1 @ 0xb0 + script_cmd_table_entry SCR_OP_ADDELEVMENUITEM ScrCmd_addelevmenuitem, requests_effects=1 @ 0xb1 + script_cmd_table_entry SCR_OP_SHOWELEVMENU ScrCmd_showelevmenu, requests_effects=1 @ 0xb2 + script_cmd_table_entry SCR_OP_CHECKCOINS ScrCmd_checkcoins, requests_effects=1 @ 0xb3 + script_cmd_table_entry SCR_OP_ADDCOINS ScrCmd_addcoins, requests_effects=1 @ 0xb4 + script_cmd_table_entry SCR_OP_REMOVECOINS ScrCmd_removecoins, requests_effects=1 @ 0xb5 + script_cmd_table_entry SCR_OP_SETWILDBATTLE ScrCmd_setwildbattle, requests_effects=1 @ 0xb6 + script_cmd_table_entry SCR_OP_DOWILDBATTLE ScrCmd_dowildbattle, requests_effects=1 @ 0xb7 + script_cmd_table_entry SCR_OP_SETVADDRESS ScrCmd_setvaddress, requests_effects=1 @ 0xb8 + script_cmd_table_entry SCR_OP_VGOTO ScrCmd_vgoto, requests_effects=1 @ 0xb9 + script_cmd_table_entry SCR_OP_VCALL ScrCmd_vcall, requests_effects=1 @ 0xba + script_cmd_table_entry SCR_OP_VGOTO_IF ScrCmd_vgoto_if, requests_effects=1 @ 0xbb + script_cmd_table_entry SCR_OP_VCALL_IF ScrCmd_vcall_if, requests_effects=1 @ 0xbc + script_cmd_table_entry SCR_OP_VMESSAGE ScrCmd_vmessage, requests_effects=1 @ 0xbd + script_cmd_table_entry SCR_OP_VBUFFERMESSAGE ScrCmd_vbuffermessage, requests_effects=1 @ 0xbe + script_cmd_table_entry SCR_OP_VBUFFERSTRING ScrCmd_vbufferstring, requests_effects=1 @ 0xbf + script_cmd_table_entry SCR_OP_SHOWCOINSBOX ScrCmd_showcoinsbox, requests_effects=1 @ 0xc0 + script_cmd_table_entry SCR_OP_HIDECOINSBOX ScrCmd_hidecoinsbox, requests_effects=1 @ 0xc1 + script_cmd_table_entry SCR_OP_UPDATECOINSBOX ScrCmd_updatecoinsbox, requests_effects=1 @ 0xc2 + script_cmd_table_entry SCR_OP_INCREMENTGAMESTAT ScrCmd_incrementgamestat, requests_effects=1 @ 0xc3 + script_cmd_table_entry SCR_OP_SETESCAPEWARP ScrCmd_setescapewarp, requests_effects=1 @ 0xc4 + script_cmd_table_entry SCR_OP_WAITMONCRY ScrCmd_waitmoncry, requests_effects=1 @ 0xc5 + script_cmd_table_entry SCR_OP_BUFFERBOXNAME ScrCmd_bufferboxname, requests_effects=1 @ 0xc6 + script_cmd_table_entry SCR_OP_TEXTCOLOR ScrCmd_nop1, requests_effects=1 @ 0xc7 + script_cmd_table_entry SCR_OP_LOADHELP ScrCmd_nop1, requests_effects=1 @ 0xc8 + script_cmd_table_entry SCR_OP_UNLOADHELP ScrCmd_nop1, requests_effects=1 @ 0xc9 + script_cmd_table_entry SCR_OP_SIGNMSG ScrCmd_nop1, requests_effects=1 @ 0xca + script_cmd_table_entry SCR_OP_NORMALMSG ScrCmd_nop1, requests_effects=1 @ 0xcb + script_cmd_table_entry SCR_OP_COMPAREHIDDENVAR ScrCmd_nop1, requests_effects=1 @ 0xcc + script_cmd_table_entry SCR_OP_SETMODERNFATEFULENCOUNTER ScrCmd_setmodernfatefulencounter, requests_effects=1 @ 0xcd + script_cmd_table_entry SCR_OP_CHECKMODERNFATEFULENCOUNTER ScrCmd_checkmodernfatefulencounter, requests_effects=1 @ 0xce + script_cmd_table_entry SCR_OP_TRYWONDERCARDSCRIPT ScrCmd_trywondercardscript, requests_effects=1 @ 0xcf + script_cmd_table_entry SCR_OP_SETWORLDMAPFLAG ScrCmd_nop1, requests_effects=1 @ 0xd0 + script_cmd_table_entry SCR_OP_WARPSPINENTER ScrCmd_warpspinenter, requests_effects=1 @ 0xd1 + script_cmd_table_entry SCR_OP_SETMONMETLOCATION ScrCmd_setmonmetlocation, requests_effects=1 @ 0xd2 + script_cmd_table_entry SCR_OP_MOVEROTATINGTILEOBJECTS ScrCmd_moverotatingtileobjects, requests_effects=1 @ 0xd3 + script_cmd_table_entry SCR_OP_TURNROTATINGTILEOBJECTS ScrCmd_turnrotatingtileobjects, requests_effects=1 @ 0xd4 + script_cmd_table_entry SCR_OP_INITROTATINGTILEPUZZLE ScrCmd_initrotatingtilepuzzle, requests_effects=1 @ 0xd5 + script_cmd_table_entry SCR_OP_FREEROTATINGTILEPUZZLE ScrCmd_freerotatingtilepuzzle, requests_effects=1 @ 0xd6 + script_cmd_table_entry SCR_OP_WARPMOSSDEEPGYM ScrCmd_warpmossdeepgym, requests_effects=1 @ 0xd7 + script_cmd_table_entry SCR_OP_SELECTAPPROACHINGTRAINER ScrCmd_selectapproachingtrainer, requests_effects=1 @ 0xd8 + script_cmd_table_entry SCR_OP_LOCKFORTRAINER ScrCmd_lockfortrainer, requests_effects=1 @ 0xd9 + script_cmd_table_entry SCR_OP_CLOSEBRAILLEMESSAGE ScrCmd_closebraillemessage, requests_effects=1 @ 0xda + script_cmd_table_entry SCR_OP_MESSAGEINSTANT ScrCmd_messageinstant, requests_effects=1 @ 0xdb + script_cmd_table_entry SCR_OP_FADESCREENSWAPBUFFERS ScrCmd_fadescreenswapbuffers, requests_effects=1 @ 0xdc + script_cmd_table_entry SCR_OP_BUFFERTRAINERCLASSNAME ScrCmd_buffertrainerclassname, requests_effects=1 @ 0xdd + script_cmd_table_entry SCR_OP_BUFFERTRAINERNAME ScrCmd_buffertrainername, requests_effects=1 @ 0xde + script_cmd_table_entry SCR_OP_POKENAVCALL ScrCmd_pokenavcall, requests_effects=1 @ 0xdf + script_cmd_table_entry SCR_OP_WARPWHITEFADE ScrCmd_warpwhitefade, requests_effects=1 @ 0xe0 + script_cmd_table_entry SCR_OP_BUFFERCONTESTNAME ScrCmd_buffercontestname, requests_effects=1 @ 0xe1 + script_cmd_table_entry SCR_OP_BUFFERITEMNAMEPLURAL ScrCmd_bufferitemnameplural, requests_effects=1 @ 0xe2 + script_cmd_table_entry SCR_OP_DYNMULTICHOICE ScrCmd_dynmultichoice, requests_effects=1 @ 0xe3 + script_cmd_table_entry SCR_OP_DYNMULTIPUSH ScrCmd_dynmultipush, requests_effects=1 @ 0xe4 .if ALLOCATE_SCRIPT_CMD_TABLE gScriptCmdTableEnd:: diff --git a/data/scripts/debug.inc b/data/scripts/debug.inc index 0be780609d..29640b2d2e 100644 --- a/data/scripts/debug.inc +++ b/data/scripts/debug.inc @@ -270,6 +270,11 @@ Debug_ShowExpansionVersion:: Debug_ExpansionVersion: .string "pokeemerald-expansion {STR_VAR_1}$" +Debug_EventScript_Steven_Multi:: + call MossdeepCity_SpaceCenter_2F_EventScript_ChoosePartyForMultiBattle + release + end + Debug_BerryPestsDisabled:: msgbox DebugText_BerryPestsDisabled, MSGBOX_DEFAULT release diff --git a/data/scripts/dexnav.inc b/data/scripts/dexnav.inc new file mode 100644 index 0000000000..698f501936 --- /dev/null +++ b/data/scripts/dexnav.inc @@ -0,0 +1,47 @@ +EventScript_StartDexNavBattle:: + lock + playse SE_PIN + applymovement OBJ_EVENT_ID_PLAYER Common_Movement_ExclamationMark + waitmovement 0 + waitse + dowildbattle + release + end + +EventScript_NotFoundNearby:: + msgbox sText_NotFoundNearby, MSGBOX_SIGN + end + +EventScript_MovedTooFast:: + msgbox sText_TryMovingSlower, MSGBOX_SIGN + end + +EventScript_PokemonGotAway:: + msgbox sText_PokemonGotAway, MSGBOX_SIGN + end + +EventScript_LostSignal:: + msgbox sText_LostSignal, MSGBOX_SIGN + end + +EventScript_TooDark:: + msgbox sText_TooDark, MSGBOX_SIGN + end + +sText_NotFoundNearby: + .string "It couldn't be found nearby.\n" + .string "Try looking in a different area!$" + +sText_TryMovingSlower: + .string "The Pokémon got away!\n" + .string "Try moving more slowly.$" + +sText_PokemonGotAway: + .string "The Pokémon got away!$" + +sText_LostSignal: + .string "There is no reaction.\n" + .string "The signal was lost!$" + +sText_TooDark: + .string "It's too dark to search\nfor a Pokémon!$" diff --git a/data/scripts/trainer_hill.inc b/data/scripts/trainer_hill.inc index 04bbe05e5a..877b48c3db 100644 --- a/data/scripts/trainer_hill.inc +++ b/data/scripts/trainer_hill.inc @@ -60,7 +60,7 @@ TrainerHill_1F_Movement_SetInvisible:: @ TRAINER_PHILLIP is an actual Trainer on the SS Tidal, but is used as a placeholder here TrainerHill_EventScript_TrainerBattle:: - trainerbattle TRAINER_BATTLE_HILL, TRAINER_PHILLIP, 0, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText + trainerbattle TRAINER_BATTLE_HILL, OBJ_ID_NONE, TRAINER_PHILLIP, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE trainerhill_postbattletext waitmessage waitbuttonpress diff --git a/data/scripts/trainer_script.inc b/data/scripts/trainer_script.inc index c0998aef8e..aad79334ab 100644 --- a/data/scripts/trainer_script.inc +++ b/data/scripts/trainer_script.inc @@ -20,3 +20,9 @@ EventScript_GotoTrainerScript:: gotobeatenscript releaseall end + +EventScript_ObjectApproachPlayer:: + lock + special DoTrainerApproach + waitstate + gotonative LoadTrainerObjectScript diff --git a/data/specials.inc b/data/specials.inc index 4d2bea3d33..c95cea9a7e 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -1,9 +1,16 @@ -.macro def_special ptr +@ 'requests_effects' should be set to 1 if the special contains a call +@ to 'Script_RequestEffects', which allows it to be analyzed with +@ 'RunScriptImmediatelyUntilEffect'. +.macro def_special ptr:req, requests_effects=0 .global SPECIAL_\ptr .set SPECIAL_\ptr, __special__ .set __special__, __special__ + 1 + .if \requests_effects == 0 .4byte \ptr - .endm + .else + .4byte \ptr + ROM_SIZE + .endif +.endm .set __special__, 0 .align 2 @@ -297,7 +304,7 @@ gSpecials:: def_special WaitWeather def_special BufferEReaderTrainerName def_special GetSlotMachineId - def_special GetPlayerFacingDirection + def_special GetPlayerFacingDirection, requests_effects=TRUE def_special FoundAbandonedShipRoom1Key def_special FoundAbandonedShipRoom2Key def_special FoundAbandonedShipRoom4Key @@ -554,3 +561,5 @@ gSpecials:: def_special Script_GetChosenMonOffensiveIVs def_special Script_GetChosenMonDefensiveIVs def_special UseBlankMessageToCancelPokemonPic + def_special EnterCode + def_special GetCodeFeedback diff --git a/data/text/pc_transfer.inc b/data/text/pc_transfer.inc index 3fa255340b..b6995d1111 100644 --- a/data/text/pc_transfer.inc +++ b/data/text/pc_transfer.inc @@ -22,6 +22,12 @@ gText_PkmnTransferredLanettesPCBoxFull:: .string "{STR_VAR_2} was transferred to\n" .string "BOX “{STR_VAR_1}.”$" +gText_PkmnSentToPCAfterCatch:: + .string "{STR_VAR_2} was sent to\n" + .string "{B_PC_CREATOR_NAME} PC.\p" + .string "It was placed in \n" + .string "BOX “{STR_VAR_1}”.$" + gText_NoMoreRoomForPokemon:: .string "There's no more room for POKéMON!\p" .string "The POKéMON BOXES are full and\n" diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 38c40252b4..193d2808a2 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -18,7 +18,10 @@ - [v1.7.x](tutorials/how_to_new_pokemon_1_7_0.md) - [v1.6.x](tutorials/how_to_new_pokemon_1_6_0.md) - [How to use the Testing System](tutorials/how_to_testing_system.md) + - [How to add new Trainer Slides](tutorials/how_to_new_trainer_slide.md) - [Changelog](./CHANGELOG.md) + - [1.11.x]() + - [Version 1.11.0](changelogs/1.11.x/1.11.0.md) - [1.10.x]() - [Version 1.10.3](changelogs/1.10.x/1.10.3.md) - [Version 1.10.2](changelogs/1.10.x/1.10.2.md) diff --git a/docs/changelogs/1.11.x/1.11.0.md b/docs/changelogs/1.11.x/1.11.0.md new file mode 100644 index 0000000000..1b2e97db6e --- /dev/null +++ b/docs/changelogs/1.11.x/1.11.0.md @@ -0,0 +1,385 @@ +```md +## How to update +- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. +- Once you have your remote set up, run the command `git pull RHH test +`. +``` + +## 🌋 *REFACTORS* 🌋 +📜 = Uses a migration script. +* Pursuit refactor by @PhallenTree in [#5707](https://github.com/rh-hideout/pokeemerald-expansion/pull/5707) +* Atk Canceller refactor / reorder / clean up by @AlexOn1ine in [#5885](https://github.com/rh-hideout/pokeemerald-expansion/pull/5885) +* Battle Weather Refactor by @AlexOn1ine in [#5833](https://github.com/rh-hideout/pokeemerald-expansion/pull/5833) +* Replace WEATHER_HAS_EFFECT with HasWeatherEffect by @AlexOn1ine in [#6069](https://github.com/rh-hideout/pokeemerald-expansion/pull/6069) +* Cleaned up Trainer Slides, added automated Trainer Slide tests, add new Enemy Critical Hit Slide by @pkmnsnfrn and @AlexOn1ine, @hedara90, @AsparagusEduardo, @mrgriffin in [#6018](https://github.com/rh-hideout/pokeemerald-expansion/pull/6018) + * If users created new entries in sTrainerSlides, they will need to be ported to the new system. +* Introduces BattleTurnCounter to simplify timer checks by @AlexOn1ine in [#6080](https://github.com/rh-hideout/pokeemerald-expansion/pull/6080) +* Convert max effects to normal move effects by @AlexOn1ine in [#6143](https://github.com/rh-hideout/pokeemerald-expansion/pull/6143) +* Redefine IsBattlerAlive in battle.h as a static inline by @AlexOn1ine in [#6211](https://github.com/rh-hideout/pokeemerald-expansion/pull/6211) +* Consolidated Frontier teams into battle_frontier_trainers.h by @fdeblasio in [#5892](https://github.com/rh-hideout/pokeemerald-expansion/pull/5892) + +## 🧬 General 🧬 +### Added +* Add Script Cmd for Forcing Save Game by @ghoulslash in [#6090](https://github.com/rh-hideout/pokeemerald-expansion/pull/6090) +* Trainer Party Pools by @hedara90 in [#5731](https://github.com/rh-hideout/pokeemerald-expansion/pull/5731) + - Documentation on how to use this can be found under `docs/tutorials/how_to_trainer_party_pool.md` +* Add Code Entry functionality by @Pawkkie and @PCG06 for the Mystery Gift iteration in [#5951](https://github.com/rh-hideout/pokeemerald-expansion/pull/5951) + +### Changed +* Added "Game Clear" flag toggle to debug menu by @AsparagusEduardo in [#5929](https://github.com/rh-hideout/pokeemerald-expansion/pull/5929) +* Initialize m4a and IRQ handler in a loaded section by @SBird1337 in [#5912](https://github.com/rh-hideout/pokeemerald-expansion/pull/5912) +* Debug menu and `createmon` additions/cleanup by @AsparagusEduardo in [#5994](https://github.com/rh-hideout/pokeemerald-expansion/pull/5994) + - Added Tera Type, Dynamax Level, and Gigantamax Factor to the "Give Pokémon (complex)" debug menu option. + - Added `dmaxLevel` option to `givemon` and `createmon`. + - Added `WEATHER_COUNT`. + - Cleaned up repeated code instances in debug menu. + - Fixed mislabel of `ggMaxFactor` in `givemon` and `createmon`. Now it's `gmaxFactor`. +* Introduces BattlerState struct for the Battle Engine by @AlexOn1ine and @mrgriffin provided the framework for this change in [#5954](https://github.com/rh-hideout/pokeemerald-expansion/pull/5954) +* Reorder Makefile rules so that pokeemerald-test.elf builds in build/test by @mrgriffin in [#6004](https://github.com/rh-hideout/pokeemerald-expansion/pull/6004) +* Use SET8 and SET32 consistently by @AZero13 in [#5544](https://github.com/rh-hideout/pokeemerald-expansion/pull/5544) +* Ewram and unused function cleanup sweep by @hedara90 in [#6019](https://github.com/rh-hideout/pokeemerald-expansion/pull/6019) +* Re-removed trainers.h trailing whitespace by @fdeblasio in [#6048](https://github.com/rh-hideout/pokeemerald-expansion/pull/6048) +* Add Steven Multi to debug menu by @Pawkkie in [#6064](https://github.com/rh-hideout/pokeemerald-expansion/pull/6064) +* Remove gDecompressionBuffer by @DizzyEggg in [#6029](https://github.com/rh-hideout/pokeemerald-expansion/pull/6029) +* Trainer Battle Parameter Consolidation by @u8-Salem in [#5982](https://github.com/rh-hideout/pokeemerald-expansion/pull/5982) + Breaking: raw uses of `trainerbattle` need to be adjusted to provide all possible parameter. Unused parameter musst be 0 or an alias. already parameterized macros like `trainerbattle_single` work out of the box. +* Consolidated contest opponent filters into gContestOpponents by @fdeblasio in [#6119](https://github.com/rh-hideout/pokeemerald-expansion/pull/6119) +* Don't use SeedRng some places where it isn't necessary by @tertu-m in [#6156](https://github.com/rh-hideout/pokeemerald-expansion/pull/6156) +* Removed Trainer Slides footgun by @AsparagusEduardo in [#6205](https://github.com/rh-hideout/pokeemerald-expansion/pull/6205) +* Consolidate duplicate dialogue of nature girl in Battle Frontier by @fdeblasio in [#6195](https://github.com/rh-hideout/pokeemerald-expansion/pull/6195) +* Prevented fanfares from playing in headless mode by @pkmnsnfrn and @hedara90, @AsparagusEduardo in [#6219](https://github.com/rh-hideout/pokeemerald-expansion/pull/6219) + +### Fixed +* Don't write to NULL in TryFindHiddenPokemon by @DizzyEggg in [#5983](https://github.com/rh-hideout/pokeemerald-expansion/pull/5983) +* Allow Party Menu with 0 Pokemon by @DizzyEggg in [#5997](https://github.com/rh-hideout/pokeemerald-expansion/pull/5997) +* Revert map related enum conversion by @hedara90 in [#6078](https://github.com/rh-hideout/pokeemerald-expansion/pull/6078) +* Revert "Revert map related enum conversion" by @hedara90 in [#6079](https://github.com/rh-hideout/pokeemerald-expansion/pull/6079) +* Revert "Converts a bunch of defines to enums" by @Bassoonian in [#6082](https://github.com/rh-hideout/pokeemerald-expansion/pull/6082) +* Fix upcoming not working on no cash by @DizzyEggg in [#6121](https://github.com/rh-hideout/pokeemerald-expansion/pull/6121) +* Add the header required for TPP tags to work by @hedara90 in [#6162](https://github.com/rh-hideout/pokeemerald-expansion/pull/6162) +* Fixed regression from master/upcoming merge by @AsparagusEduardo and @hedara90 , for doing the original merge when I couldn't in [#6199](https://github.com/rh-hideout/pokeemerald-expansion/pull/6199) +* Fix Using a Safari Ball crashes the game #6206 by @ExMingYan in [#6220](https://github.com/rh-hideout/pokeemerald-expansion/pull/6220) +* Fixed typo in requests_effects by @hedara90 and @purrfectdoodle in [#6215](https://github.com/rh-hideout/pokeemerald-expansion/pull/6215) +* Try a new solution to Fix Safari #6206 by @ExMingYan in [#6228](https://github.com/rh-hideout/pokeemerald-expansion/pull/6228) +* Remove obsolete check for steven when retrieving partner name by @u8-Salem and @hedara90 in [#6283](https://github.com/rh-hideout/pokeemerald-expansion/pull/6283) +* Fix spit up getting skipped by @cawtds in [#6295](https://github.com/rh-hideout/pokeemerald-expansion/pull/6295) + +## 🗺️ Overworld 🗺️ +### Added +* Adds Dexnav by @ghoulslash in [#4818](https://github.com/rh-hideout/pokeemerald-expansion/pull/4818) +* Fly from Pokenav by @khbsd in [#5679](https://github.com/rh-hideout/pokeemerald-expansion/pull/5679) +* Expanded Pokémon Follower transformation functionality by @AsparagusEduardo in [#5048](https://github.com/rh-hideout/pokeemerald-expansion/pull/5048) + +### Changed +* Arbitrary trainer scripts + on frame/trigger softlock prevention by @mrgriffin in [#5033](https://github.com/rh-hideout/pokeemerald-expansion/pull/5033) +* Removed OW_AUTO_SIGNPOST by @pkmnsnfrn in [#5974](https://github.com/rh-hideout/pokeemerald-expansion/pull/5974) +* Fix leftover test change from #5033 by @mrgriffin in [#5987](https://github.com/rh-hideout/pokeemerald-expansion/pull/5987) +* Match current gen behavior for battle environment after fishing by @kittenchilly in [#6099](https://github.com/rh-hideout/pokeemerald-expansion/pull/6099) +* Add Mega Evolution, Primal Reversion, and Ultra Necrozma overworld sprites by @khbsd in [#5874](https://github.com/rh-hideout/pokeemerald-expansion/pull/5874) +* Replaced hardcoded numbers in DexNav with variables by @fdeblasio in [#6241](https://github.com/rh-hideout/pokeemerald-expansion/pull/6241) +* Merrp merge (12th of February) by @hedara90 in [#6244](https://github.com/rh-hideout/pokeemerald-expansion/pull/6244) +* Adds a follower flag define to disable followers on the fly by @AlexOn1ine in [#6174](https://github.com/rh-hideout/pokeemerald-expansion/pull/6174) + +### Fixed +* Fix Trainer Hill OOB array access by @SBird1337 in [#5930](https://github.com/rh-hideout/pokeemerald-expansion/pull/5930) +* Revert #5033 change to MapHeaderRunScriptType by @mrgriffin in [#5975](https://github.com/rh-hideout/pokeemerald-expansion/pull/5975) +* Restore lock/lockall/locktrainer/release/releaseall in triggers by @mrgriffin in [#5976](https://github.com/rh-hideout/pokeemerald-expansion/pull/5976) +* Follower Object Event refactor by @hedara90 and @AsparagusEduardo in [#6129](https://github.com/rh-hideout/pokeemerald-expansion/pull/6129) + - Fixes `OBJ_EVENT_GFX_SPECIES_SHINY` + - Adds `OBJ_EVENT_GFX_SPECIES_FEMALE` and `OBJ_EVENT_GFX_SPECIES_SHINY_FEMALE` +* Fixes Static Assert from pr #6174 by @AlexOn1ine in [#6258](https://github.com/rh-hideout/pokeemerald-expansion/pull/6258) +* Fixed Kecleon Shiny palette by @hedara90 in [#6298](https://github.com/rh-hideout/pokeemerald-expansion/pull/6298) + +## 🐉 Pokémon 🐉 +### Added +* IV/EV Info on Summary Screen by @khbsd in [#6027](https://github.com/rh-hideout/pokeemerald-expansion/pull/6027) +* Add caught mon to full party by sending a different mon to the Box by @fakuzatsu in [#6058](https://github.com/rh-hideout/pokeemerald-expansion/pull/6058) + +### Changed +* Remove form change function footguns by @AsparagusEduardo and @AlexOn1ine for letting me know of this potential issue. in [#5995](https://github.com/rh-hideout/pokeemerald-expansion/pull/5995) + - `GetBattleFormChangeTargetSpecies`, `GetFormChangeTargetSpecies` and `GetFormChangeTargetSpeciesBoxMon` now return the current species of the Pokémon instead of `SPECIES_NONE` as a precaution to avoid accidental deletions of Pokémon when using these functions. +* Remove redundant calls to GetMonData in pokemon.c by @AZero13 in [#5545](https://github.com/rh-hideout/pokeemerald-expansion/pull/5545) +* Rename Furfrou Species tags to match Pokemon Showdown exports by @moostoet in [#6041](https://github.com/rh-hideout/pokeemerald-expansion/pull/6041) +* Add Mega Evolution, Primal Reversion, and Ultra Necrozma overworld sprites by @khbsd in [#5874](https://github.com/rh-hideout/pokeemerald-expansion/pull/5874) +* Add Poltchageist family form data by @Bassoonian and @wiz1989 in [#6163](https://github.com/rh-hideout/pokeemerald-expansion/pull/6163) + +### Fixed +* Evolution level 1 learn by @hedara90 in [#5791](https://github.com/rh-hideout/pokeemerald-expansion/pull/5791) +* Fixed non-regional forms breeding incorrectly by @AsparagusEduardo and @cawtds in [#4985](https://github.com/rh-hideout/pokeemerald-expansion/pull/4985) +* Fixed compilation error when turning P_GENDER_DIFFERENCES off by @AsparagusEduardo in [#6223](https://github.com/rh-hideout/pokeemerald-expansion/pull/6223) +* Reverted compound literal OW mon pic tables by @AsparagusEduardo in [#6216](https://github.com/rh-hideout/pokeemerald-expansion/pull/6216) + +## ⚔️ Battle General ⚔️ +### Added +* Add B_FLAG_SLEEP_CLAUSE by @Pawkkie, @Pawkkie and @iriv24 in [#5566](https://github.com/rh-hideout/pokeemerald-expansion/pull/5566) + - Based on Smogon's sleep clause [philosophy](https://www.smogon.com/xy/articles/clauses#:~:text=Sleep%20Clause,t%20be%20put%20to%20sleep.) + - Toggleable per-battle by setting / unsetting the flag assigned to B_FLAG_SLEEP_CLAUSE +* Variadic IS_BATTLER_OF_TYPE and GetBattlerTypes by @mrgriffin in [#5708](https://github.com/rh-hideout/pokeemerald-expansion/pull/5708) +* Simultaneous HP Reduction (CFRU Port) by @AsparagusEduardo and @AlexOn1ine for the port to expansion. @Skeli789 for the CFRU implementation. in [#5770](https://github.com/rh-hideout/pokeemerald-expansion/pull/5770) +* Destiny Bond fails on repeated use in Gen 7+ by @Pawkkie in [#5652](https://github.com/rh-hideout/pokeemerald-expansion/pull/5652) +* Adds Pledge Side Statuses as Starting Statuses by @AlexOn1ine in [#5899](https://github.com/rh-hideout/pokeemerald-expansion/pull/5899) +* Adds B_VAR_DIFFICULTY and related functions READ DESC by @pkmnsnfrn in [#5337](https://github.com/rh-hideout/pokeemerald-expansion/pull/5337) +* Config for move slot rearrangement in battle by @hedara90 and @ghoulslash for pointing out the exact point in the code where move slot rearrangement is handled. in [#6017](https://github.com/rh-hideout/pokeemerald-expansion/pull/6017) + - Move slot rearrangement is disabled by default in battle, set `B_MOVE_REARRANGEMENT_IN_BATTLE` to `GEN_3` to enable rearrangement again. + +### Changed +* Sleep Clause global config by @Pawkkie in [#5762](https://github.com/rh-hideout/pokeemerald-expansion/pull/5762) +* Pursuit refactor by @PhallenTree in [#5707](https://github.com/rh-hideout/pokeemerald-expansion/pull/5707) +* Changes Various defines to an Enum by @AlexOn1ine in [#5839](https://github.com/rh-hideout/pokeemerald-expansion/pull/5839) +* move overwrittenAbilities field to DisableStruct by @ghoulslash in [#5946](https://github.com/rh-hideout/pokeemerald-expansion/pull/5946) +* Battle Weather Refactor by @AlexOn1ine in [#5833](https://github.com/rh-hideout/pokeemerald-expansion/pull/5833) +* Easy customizable Hidden Move types by @AsparagusEduardo in [#5872](https://github.com/rh-hideout/pokeemerald-expansion/pull/5872) + - `gTypesInfo` now has a `isHiddenPowerType` field that inserts them into the Hidden Power type calculation. + - ***Warning:*** Changing this from the vanilla settings will change any existing Hidden Power's type, and external calculators will not work either. +* Introduces BattlerState struct for the Battle Engine by @AlexOn1ine and @mrgriffin provided the framework for this change in [#5954](https://github.com/rh-hideout/pokeemerald-expansion/pull/5954) +* Cleaned up Trainer Slides, added automated Trainer Slide tests, add new Enemy Critical Hit Slide by @pkmnsnfrn and @AlexOn1ine, @hedara90, @AsparagusEduardo, @mrgriffin in [#6018](https://github.com/rh-hideout/pokeemerald-expansion/pull/6018) + * If users created new entries in sTrainerSlides, they will need to be ported to the new system. +* Introduces BattleTurnCounter to simplfy timer checks by @AlexOn1ine in [#6080](https://github.com/rh-hideout/pokeemerald-expansion/pull/6080) +* Replace BattleStruct members quickClawRandom/quickDrawRandom with locals by @AlexOn1ine in [#6136](https://github.com/rh-hideout/pokeemerald-expansion/pull/6136) +* Added Difficulty Fallback for Trainer Slides by @pkmnsnfrn in [#6088](https://github.com/rh-hideout/pokeemerald-expansion/pull/6088) +* CanAbilityX Function Cleanup by @ghoulslash in [#6183](https://github.com/rh-hideout/pokeemerald-expansion/pull/6183) +* Unify setreflect/setlightscreen and MOVE_EFFECT_REFLECT/LIGHT_SCREEN by @ghoulslash in [#6196](https://github.com/rh-hideout/pokeemerald-expansion/pull/6196) + +### Fixed +* Fix Sleep Clause AI handling of partner sleeping moves by @Pawkkie in [#5761](https://github.com/rh-hideout/pokeemerald-expansion/pull/5761) +* Fix fixed point damage calculation off-by-1s by @SBird1337 in [#5775](https://github.com/rh-hideout/pokeemerald-expansion/pull/5775) + Fixes a bunch of rounding errors that cause wrong outputs in the damage calculation. +* Fixes simu hp reduction when no partner was on field by @AlexOn1ine in [#5799](https://github.com/rh-hideout/pokeemerald-expansion/pull/5799) +* Fixes Regenerator healing past maxHP by @PhallenTree in [#5861](https://github.com/rh-hideout/pokeemerald-expansion/pull/5861) +* Fixes Pursuit + Emergency Exit causing double switches and Pursuit user fainting causing target to not finish switch by @PhallenTree in [#5849](https://github.com/rh-hideout/pokeemerald-expansion/pull/5849) +* Fixes regression caused by argument refactor by @AlexOn1ine in [#5870](https://github.com/rh-hideout/pokeemerald-expansion/pull/5870) +* Fixes Sparkling Aria Shield Dust / Covert Cloak interaction by @AlexOn1ine in [#5911](https://github.com/rh-hideout/pokeemerald-expansion/pull/5911) +* Battle Weather Refactor oversight by @AlexOn1ine in [#5960](https://github.com/rh-hideout/pokeemerald-expansion/pull/5960) +* Shell Bell Clean up / Simplification and Tests by @AlexOn1ine in [#5924](https://github.com/rh-hideout/pokeemerald-expansion/pull/5924) +* Dynamic move type was ignored in doubles for spread moves by @AlexOn1ine in [#5984](https://github.com/rh-hideout/pokeemerald-expansion/pull/5984) +* Fixes self effect moves not procing for spread moves when battler 3 w… by @AlexOn1ine in [#6020](https://github.com/rh-hideout/pokeemerald-expansion/pull/6020) +* Fix UB when accessing move result flags by @cawtds in [#6030](https://github.com/rh-hideout/pokeemerald-expansion/pull/6030) +* Fix Powder (status) config and some terrain timers not using gBattleTurnCounter by @PhallenTree in [#6109](https://github.com/rh-hideout/pokeemerald-expansion/pull/6109) +* Fix Powder config not checking for Powder status by @PhallenTree in [#6113](https://github.com/rh-hideout/pokeemerald-expansion/pull/6113) +* Fixes battler mutation during the intim script by @AlexOn1ine in [#6151](https://github.com/rh-hideout/pokeemerald-expansion/pull/6151) +* Fixes Dynamic Moves types in SumScreen while in Battle by @AlexOn1ine in [#6145](https://github.com/rh-hideout/pokeemerald-expansion/pull/6145) +* Fixes Dragon Tail missing timing against Rocky Helmet / Iron Barbs by @AlexOn1ine in [#6154](https://github.com/rh-hideout/pokeemerald-expansion/pull/6154) +* Prevent sameMoveTurns from incrementing when unable to use move by @moostoet in [#6167](https://github.com/rh-hideout/pokeemerald-expansion/pull/6167) +* Fixes Suction Cups ability popup and Red Card + Guard Dog interaction by @PhallenTree in [#6171](https://github.com/rh-hideout/pokeemerald-expansion/pull/6171) +* Fixed Unnerve message and wrote tests by @hedara90 in [#6192](https://github.com/rh-hideout/pokeemerald-expansion/pull/6192) +* Fixes Spectral Thief stealing boost at the wrong time by @AlexOn1ine in [#6197](https://github.com/rh-hideout/pokeemerald-expansion/pull/6197) +* Fixes BATTLER_TURN_DAMAGED battler id by @AlexOn1ine in [#6236](https://github.com/rh-hideout/pokeemerald-expansion/pull/6236) +* Fixed multi battle forced switches by @hedara90 in [#6243](https://github.com/rh-hideout/pokeemerald-expansion/pull/6243) +* Fixes ability Embody Aspect triggering multiple times by @AlexOn1ine in [#6259](https://github.com/rh-hideout/pokeemerald-expansion/pull/6259) +* Fixes Called moves ignoring redirection by @PhallenTree in [#6267](https://github.com/rh-hideout/pokeemerald-expansion/pull/6267) +* Fixes Protean not restoring types after ai damage calcs by @AlexOn1ine in [#6280](https://github.com/rh-hideout/pokeemerald-expansion/pull/6280) +* Restoretarget in Rototiller script + Tests by @AlexOn1ine in [#6296](https://github.com/rh-hideout/pokeemerald-expansion/pull/6296) +* Fixes inconsistency for Kings rock. by @AlexOn1ine in [#6302](https://github.com/rh-hideout/pokeemerald-expansion/pull/6302) +* Fixes Shell Bell for Spread Moves by @AlexOn1ine in [#6303](https://github.com/rh-hideout/pokeemerald-expansion/pull/6303) +* Fixes Brick Break/Psychic Fangs/Raging Bull breaking screens if target is immune by @PhallenTree in [#6308](https://github.com/rh-hideout/pokeemerald-expansion/pull/6308) +* Fixes doesnt effect message for Thunder Wave by @AlexOn1ine in [#6304](https://github.com/rh-hideout/pokeemerald-expansion/pull/6304) +* Fixes Tera Shell activating on moves that have no effect on target by @AlexOn1ine in [#6271](https://github.com/rh-hideout/pokeemerald-expansion/pull/6271) +* Fixes fainted battler being able to select an action by @PhallenTree in [#6339](https://github.com/rh-hideout/pokeemerald-expansion/pull/6339) + +## 🤹 Moves 🤹 +### Added +* Added missing in-battle "Move Info" button prompt by @AsparagusEduardo and @TeamAquasHideout from who I got the source from and @BelialClover from who Archie got the source from. in [#6155](https://github.com/rh-hideout/pokeemerald-expansion/pull/6155) + +### Changed +* New Volt Switch Animation by @AlexOn1ine in [#5729](https://github.com/rh-hideout/pokeemerald-expansion/pull/5729) +* Refactors argument into a union by @AlexOn1ine in [#5853](https://github.com/rh-hideout/pokeemerald-expansion/pull/5853) +* Encapsulate move data by @AsparagusEduardo in [#5852](https://github.com/rh-hideout/pokeemerald-expansion/pull/5852) +* Removes Resource Flags and moves fields to DisableStruct by @AlexOn1ine in [#5945](https://github.com/rh-hideout/pokeemerald-expansion/pull/5945) +* Tera starstorm by @hedara90 in [#6073](https://github.com/rh-hideout/pokeemerald-expansion/pull/6073) +* Tachyon Cutter and Salt Cure animations by @hedara90 in [#6182](https://github.com/rh-hideout/pokeemerald-expansion/pull/6182) +* Heal Bell/Aromatherapy/Sparkly Swirl improvements and fixes by @AsparagusEduardo in [#6210](https://github.com/rh-hideout/pokeemerald-expansion/pull/6210) + - Removed `EFFECT_SPARKLY_SWIRL` in favor of `MOVE_EFFECT_AROMATHEROPY`. +* Moved sValidApprenticeMove into gMovesInfo by @fdeblasio in [#6254](https://github.com/rh-hideout/pokeemerald-expansion/pull/6254) +* Fixes non-Ghost type Curse animation by @PhallenTree in [#6299](https://github.com/rh-hideout/pokeemerald-expansion/pull/6299) +* Remove pursuitSwitchByMove and additional if statement by @PhallenTree in [#6326](https://github.com/rh-hideout/pokeemerald-expansion/pull/6326) + +### Fixed +* Fixes moves based on Dragon Darts with strikeCount > 2 always hitting the same battler from the second hit onwards by @PhallenTree in [#5830](https://github.com/rh-hideout/pokeemerald-expansion/pull/5830) +* Last fix for Sparkling Aria / Covert Cloak / Shield Dust interaction by @AlexOn1ine in [#5956](https://github.com/rh-hideout/pokeemerald-expansion/pull/5956) +* Added WEATHER_DOWNPOUR to Weather Ball's dynamic type by @fdeblasio in [#6100](https://github.com/rh-hideout/pokeemerald-expansion/pull/6100) +* Fixed Future Sight not being affected by Electrify by @AsparagusEduardo in [#6213](https://github.com/rh-hideout/pokeemerald-expansion/pull/6213) +* Fixes Expanding Force and Spectral Thief move animations by @PhallenTree in [#6185](https://github.com/rh-hideout/pokeemerald-expansion/pull/6185) +* Made some move animations fit in VRAM by @hedara90 in [#6289](https://github.com/rh-hideout/pokeemerald-expansion/pull/6289) + +## 🧶 Items 🧶 +### Fixed +* Adds missing Friend Ball friendship bonus upon catching by @PhallenTree in [#5795](https://github.com/rh-hideout/pokeemerald-expansion/pull/5795) + +## 🤖 Battle AI 🤖 +### Added +* Smart Switching handles Soundproof by @Pawkkie and @Robdeezy for the idea! in [#5703](https://github.com/rh-hideout/pokeemerald-expansion/pull/5703) +* Add Revival Blessing AI by @Pawkkie in [#5704](https://github.com/rh-hideout/pokeemerald-expansion/pull/5704) +* Add AI_FLAG_WEIGH_ABILITY_PREDICTION by @Pawkkie and @khbsd and @ghoulslash for the idea, @AlexOn1ine and @mrgriffin for getting it working :) in [#5636](https://github.com/rh-hideout/pokeemerald-expansion/pull/5636) +* Add AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE by @Pawkkie in [#6025](https://github.com/rh-hideout/pokeemerald-expansion/pull/6025) +* Add AI_FLAG_PREDICT_SWITCH by @Pawkkie and @kithr1 in [#6028](https://github.com/rh-hideout/pokeemerald-expansion/pull/6028) +* Add AI_FLAG_PREDICT_INCOMING_MON: AI will score against predicted switchin if predicting switch by @Pawkkie in [#6037](https://github.com/rh-hideout/pokeemerald-expansion/pull/6037) +* Switch trapping AI will consider Trace by @Pawkkie in [#6059](https://github.com/rh-hideout/pokeemerald-expansion/pull/6059) +* AI adds score to Pursuit if it OHKOs by @Pawkkie in [#6166](https://github.com/rh-hideout/pokeemerald-expansion/pull/6166) +* Switch chance config support by @Pawkkie in [#6187](https://github.com/rh-hideout/pokeemerald-expansion/pull/6187) + - Config can be changed in config/ai.h +* Add function to adjust AI scoring for generalized item effects by @moostoet and @AlexOn1ine and @Pawkkie for the input on slight changes to make to the logic (config, no magic numbers...) in [#6247](https://github.com/rh-hideout/pokeemerald-expansion/pull/6247) + +### Changed +* Fixed AI not handling type effectiveness beyond x8 by @AsparagusEduardo and @/sshadowzkmao in [#6127](https://github.com/rh-hideout/pokeemerald-expansion/pull/6127) + - Removed the use of `AI_EFFECTIVENESS_` in favor of storing the actual type effectiveness. + - Renamed `AI_GetTypeEffectiveness` to `AI_GetMoveEffectiveness`, removing the original one. +* Remove global sBattler_AI by @AlexOn1ine in [#6128](https://github.com/rh-hideout/pokeemerald-expansion/pull/6128) +* SwitchType enum to clean up GetMostSuitableMonToSwitchInto by @Pawkkie in [#6184](https://github.com/rh-hideout/pokeemerald-expansion/pull/6184) + +### Fixed +* Eject item ace flag switch AI fixes by @Pawkkie and @wiz1989 for reporting the bug in [#6098](https://github.com/rh-hideout/pokeemerald-expansion/pull/6098) +* Fix Choice'd mons referring to incorrect move when switching by @Pawkkie and @/capncrunch in [#6204](https://github.com/rh-hideout/pokeemerald-expansion/pull/6204) +* Fix AI switching in absorbing mon incorrectly by @Pawkkie in [#6227](https://github.com/rh-hideout/pokeemerald-expansion/pull/6227) +* Improve Yawn and Status Switching by @Pawkkie and @/Chape for finding this behaviour in [#6202](https://github.com/rh-hideout/pokeemerald-expansion/pull/6202) +* Fix AI wrongly thinking it strikes first with priority even if player is using priority themselves by @moostoet in [#6274](https://github.com/rh-hideout/pokeemerald-expansion/pull/6274) +* Fix AI hazard move handling, minor AI tweaks by @Pawkkie and @ShadowzLmao2 in [#6311](https://github.com/rh-hideout/pokeemerald-expansion/pull/6311) +* Fix Overzealous Absorber Switching by @Pawkkie and @iriv24 and @ravepossum for squinting at a conditional for nearly 30mins with me to find a semicolon in [#6318](https://github.com/rh-hideout/pokeemerald-expansion/pull/6318) +* Fix Substitute / Shed Tail Switch AI by @Pawkkie in [#6334](https://github.com/rh-hideout/pokeemerald-expansion/pull/6334) + +## 🧹 Other Cleanup 🧹 +* Split "Do nothing" move effects by @AsparagusEduardo in [#5613](https://github.com/rh-hideout/pokeemerald-expansion/pull/5613) +* Sleep Clause global config by @Pawkkie in [#5762](https://github.com/rh-hideout/pokeemerald-expansion/pull/5762) +* Converts multi-choice options to COMPOUND_STRINGs by @fdeblasio in [#5686](https://github.com/rh-hideout/pokeemerald-expansion/pull/5686) +* Converted item-related variables to COMPOUND_STRINGs by @fdeblasio in [#5714](https://github.com/rh-hideout/pokeemerald-expansion/pull/5714) +* Adds SleepClauseBlock enum to CanBeSlept by @Pawkkie and @AlexOn1ine in [#5773](https://github.com/rh-hideout/pokeemerald-expansion/pull/5773) +* Swapped DESELECT and CHECK_TAG to be in right places by @fdeblasio in [#5794](https://github.com/rh-hideout/pokeemerald-expansion/pull/5794) +* Changes target TURN_DAMAGED and MAX_HP to inlines by @AlexOn1ine in [#5822](https://github.com/rh-hideout/pokeemerald-expansion/pull/5822) +* Changes Various defines to an Enum by @AlexOn1ine in [#5839](https://github.com/rh-hideout/pokeemerald-expansion/pull/5839) +* Remove fno-toplevel-reorder by @DizzyEggg in [#5809](https://github.com/rh-hideout/pokeemerald-expansion/pull/5809) +* Refactors argument into a union by @AlexOn1ine in [#5853](https://github.com/rh-hideout/pokeemerald-expansion/pull/5853) +* Clean up redundancy for mugshots by @AlexOn1ine in [#5906](https://github.com/rh-hideout/pokeemerald-expansion/pull/5906) +* Encapsulate move data by @AsparagusEduardo in [#5852](https://github.com/rh-hideout/pokeemerald-expansion/pull/5852) +* Initialize m4a and IRQ handler in a loaded section by @SBird1337 in [#5912](https://github.com/rh-hideout/pokeemerald-expansion/pull/5912) +* Remove EWRAM gHpDealt (not needed anymore) by @AlexOn1ine in [#5925](https://github.com/rh-hideout/pokeemerald-expansion/pull/5925) +* Fix DexNav static asserts by @Bassoonian in [#5944](https://github.com/rh-hideout/pokeemerald-expansion/pull/5944) +* Move overwrittenAbilities field to DisableStruct by @ghoulslash in [#5946](https://github.com/rh-hideout/pokeemerald-expansion/pull/5946) +* Converted 2 various to callnative by @AsparagusEduardo in [#5950](https://github.com/rh-hideout/pokeemerald-expansion/pull/5950) + - Removed `VARIOUS_SWAP_SIDE_STATUSES` and `VARIOUS_SWAP_STATS`. +* Shell Bell Clean up / Simplification and Tests by @AlexOn1ine in [#5924](https://github.com/rh-hideout/pokeemerald-expansion/pull/5924) +* Removed OW_AUTO_SIGNPOST by @pkmnsnfrn, @doejohn126 discovered the issue in [#5974](https://github.com/rh-hideout/pokeemerald-expansion/pull/5974) +* Fix leftover test change from #5033 by @mrgriffin in [#5987](https://github.com/rh-hideout/pokeemerald-expansion/pull/5987) +* Multiple removals of hardcoded move IDs by @AsparagusEduardo in [#5964](https://github.com/rh-hideout/pokeemerald-expansion/pull/5964) +* Missed two uses of new hazard type enum by @Pawkkie in [#5996](https://github.com/rh-hideout/pokeemerald-expansion/pull/5996) +* Debug menu and `createmon` additions/cleanup by @AsparagusEduardo in [#5994](https://github.com/rh-hideout/pokeemerald-expansion/pull/5994) + - Added Tera Type, Dynamax Level, and Gigantamax Factor to the "Give Pokémon (complex)" debug menu option. + - Added `dmaxLevel` option to `givemon` and `createmon`. + - Added `WEATHER_COUNT`. + - Cleaned up repeated code instances in debug menu. + - Fixed mislabel of `ggMaxFactor` in `givemon` and `createmon`. Now it's `gmaxFactor`. +* Free some IWRAM by @DizzyEggg in [#6000](https://github.com/rh-hideout/pokeemerald-expansion/pull/6000) +* Removes Resource Flags and moves fields to DisableStruct by @AlexOn1ine in [#5945](https://github.com/rh-hideout/pokeemerald-expansion/pull/5945) +* Future Sight Innards Out follow up for upcoming by @AlexOn1ine in [#5998](https://github.com/rh-hideout/pokeemerald-expansion/pull/5998) +* Remove redundant calls to GetMonData in pokemon.c by @AZero13 in [#5545](https://github.com/rh-hideout/pokeemerald-expansion/pull/5545) +* Use SET8 and SET32 consistently by @AZero13 in [#5544](https://github.com/rh-hideout/pokeemerald-expansion/pull/5544) +* Rename Furfrou Species tags to match Pokemon Showdown exports by @moostoet in [#6041](https://github.com/rh-hideout/pokeemerald-expansion/pull/6041) +* Rename DexNav flags and vars by @Bassoonian in [#6044](https://github.com/rh-hideout/pokeemerald-expansion/pull/6044) +* Re-removed trainers.h trailing whitespace by @fdeblasio in [#6048](https://github.com/rh-hideout/pokeemerald-expansion/pull/6048) +* Moved front animations frames to gSpeciesInfo by @AsparagusEduardo in [#5605](https://github.com/rh-hideout/pokeemerald-expansion/pull/5605) +* Clean up array access by using index instead of dereferencing the value by @AlexOn1ine in [#6057](https://github.com/rh-hideout/pokeemerald-expansion/pull/6057) +* Add a uniquely striking pair of brackets by @Pawkkie in [#6068](https://github.com/rh-hideout/pokeemerald-expansion/pull/6068) +* Replace WEATHER_HAS_EFFECT with HasWeatherEffect by @AlexOn1ine in [#6069](https://github.com/rh-hideout/pokeemerald-expansion/pull/6069) +* Converts a bunch of defines to enums by @Bassoonian in [#6071](https://github.com/rh-hideout/pokeemerald-expansion/pull/6071) + - Replaced `BATTLE_TERRAIN` #defines with the `BattleTerrain` enum + - Replaced `MAP_TYPE` #defines with the `MapType` enum + - Replaced `MAP_BATTLE_SCENE` #defines with the `MapBattleScene` enum + - Replaced `BACK_ANIM` #defines with the `BackAnim` enum + - Replaced `ANIM` #defines with the `AnimFunctionIDs` enum + - Replaced `INGAME_TRADE` #defines with the `InGameTradeID` enum + - Replaced `TRAINER_CLASS` #defines with the `TRAINER_CLASS` enum +* Return the universe to a state of balanced quilibrium by @Pawkkie in [#6074](https://github.com/rh-hideout/pokeemerald-expansion/pull/6074) +* Cleaned up Debug Menu by @AsparagusEduardo in [#6070](https://github.com/rh-hideout/pokeemerald-expansion/pull/6070) +* Remove gDecompressionBuffer by @DizzyEggg in [#6029](https://github.com/rh-hideout/pokeemerald-expansion/pull/6029) +* Cleaned up Trainer Slides, added automated Trainer Slide tests, add new Enemy Critical Hit Slide by @pkmnsnfrn and @AlexOn1ine, @hedara90, @AsparagusEduardo, @mrgriffin in [#6018](https://github.com/rh-hideout/pokeemerald-expansion/pull/6018) + * If users created new entries in sTrainerSlides, they will need to be ported to the new system. +* Terrain function standarization by @fdeblasio in [#6097](https://github.com/rh-hideout/pokeemerald-expansion/pull/6097) +* Updated trainer pic tutorial by @fdeblasio in [#6049](https://github.com/rh-hideout/pokeemerald-expansion/pull/6049) +* Remove UnusedBattleInit from battle_bg.c by @DizzyEggg in [#6116](https://github.com/rh-hideout/pokeemerald-expansion/pull/6116) +* Consolidated contest opponent filters into gContestOpponents by @fdeblasio in [#6119](https://github.com/rh-hideout/pokeemerald-expansion/pull/6119) +* Replace BattleStruct members quickClawRandom/quickDrawRandom with locals by @AlexOn1ine in [#6136](https://github.com/rh-hideout/pokeemerald-expansion/pull/6136) +* Updated Trainer Ids used in Trainer Slides tests by @pkmnsnfrn and @AlexOn1ine found the original bug, @AsparagusEduardo confirmed it in [#6138](https://github.com/rh-hideout/pokeemerald-expansion/pull/6138) +* Added Difficulty Fallback for Trainer Slides by @pkmnsnfrn in [#6088](https://github.com/rh-hideout/pokeemerald-expansion/pull/6088) +* Clean up follow up for Simultaneous Reduction HP by @AlexOn1ine in [#6139](https://github.com/rh-hideout/pokeemerald-expansion/pull/6139) +* Remove global sBattler_AI by @AlexOn1ine in [#6128](https://github.com/rh-hideout/pokeemerald-expansion/pull/6128) +* Clarify MOVE_EFFECT_SLEEP sleep clause handling by @Pawkkie in [#6161](https://github.com/rh-hideout/pokeemerald-expansion/pull/6161) +* Remove unused PainSplit scripting global by @AlexOn1ine in [#6164](https://github.com/rh-hideout/pokeemerald-expansion/pull/6164) +* Don't use SeedRng some places where it isn't necessary by @tertu-m in [#6156](https://github.com/rh-hideout/pokeemerald-expansion/pull/6156) +* Cleaned up party data access GetPartyBattlerData by @AsparagusEduardo in [#6172](https://github.com/rh-hideout/pokeemerald-expansion/pull/6172) +* Changed two LocalRandom calls to new LocalRandom32 by @hedara90 in [#6173](https://github.com/rh-hideout/pokeemerald-expansion/pull/6173) +* Cleanup some global battler ID usage by @ghoulslash in [#6181](https://github.com/rh-hideout/pokeemerald-expansion/pull/6181) +* Clean up - Add ability args instead of calcing the ability again by @AlexOn1ine in [#6186](https://github.com/rh-hideout/pokeemerald-expansion/pull/6186) +* CanAbilityX Function Cleanup by @ghoulslash in [#6183](https://github.com/rh-hideout/pokeemerald-expansion/pull/6183) +* SwitchType enum to clean up GetMostSuitableMonToSwitchInto by @Pawkkie in [#6184](https://github.com/rh-hideout/pokeemerald-expansion/pull/6184) +* Unify setreflect/setlightscreen and MOVE_EFFECT_REFLECT/LIGHT_SCREEN by @ghoulslash in [#6196](https://github.com/rh-hideout/pokeemerald-expansion/pull/6196) +* Removed Trainer Slides footgun by @AsparagusEduardo in [#6205](https://github.com/rh-hideout/pokeemerald-expansion/pull/6205) +* Fix typo in Nuzzle's description by @Bassoonian in [#6209](https://github.com/rh-hideout/pokeemerald-expansion/pull/6209) +* Consolidate duplicate dialogue of nature girl in Battle Frontier by @fdeblasio in [#6195](https://github.com/rh-hideout/pokeemerald-expansion/pull/6195) +* Fixed missing move encapsulation in upcoming by @AsparagusEduardo in [#6226](https://github.com/rh-hideout/pokeemerald-expansion/pull/6226) +* Consolidated Frontier teams into battle_frontier_trainers.h by @fdeblasio in [#5892](https://github.com/rh-hideout/pokeemerald-expansion/pull/5892) +* Add abstraction layer for battler positions by @AlexOn1ine in [#6212](https://github.com/rh-hideout/pokeemerald-expansion/pull/6212) +* Revert unintentional change by @AlexOn1ine in [#6239](https://github.com/rh-hideout/pokeemerald-expansion/pull/6239) +* Remove whitespace from trainers data file by @AsparagusEduardo in [#6234](https://github.com/rh-hideout/pokeemerald-expansion/pull/6234) +* Replaced hardcoded numbers in DexNav with variables by @fdeblasio in [#6241](https://github.com/rh-hideout/pokeemerald-expansion/pull/6241) +* fix for battle ui for add to party menu (#6229) by @fakuzatsu in [#6240](https://github.com/rh-hideout/pokeemerald-expansion/pull/6240) +* Changed bit order for follower graphicsId creation by @hedara90 in [#6249](https://github.com/rh-hideout/pokeemerald-expansion/pull/6249) +* Minor Clean up for CanAbilityX. Follow up for #6183 by @AlexOn1ine in [#6252](https://github.com/rh-hideout/pokeemerald-expansion/pull/6252) +* Moved sValidApprenticeMove into gMovesInfo by @fdeblasio in [#6254](https://github.com/rh-hideout/pokeemerald-expansion/pull/6254) +* Use more accurate count in MovesInfo by @AlexOn1ine in [#6260](https://github.com/rh-hideout/pokeemerald-expansion/pull/6260) +* Fix Extra `task->tState++` and `break` in `Task_DrawFieldMessageBox` by @Deokishisu in [#6261](https://github.com/rh-hideout/pokeemerald-expansion/pull/6261) +* Expand usage of IsBattlerAlly (rename from IsAlly) by @AlexOn1ine in [#6251](https://github.com/rh-hideout/pokeemerald-expansion/pull/6251) +* Rename SetPhotonGeyser to a more general use and clean up by @AlexOn1ine in [#6272](https://github.com/rh-hideout/pokeemerald-expansion/pull/6272) +* Fix padding amount in MoveInfo by @AlexOn1ine in [#6307](https://github.com/rh-hideout/pokeemerald-expansion/pull/6307) +* Refactor testing flags and vars to not conflict with user ones by @hedara90 in [#6301](https://github.com/rh-hideout/pokeemerald-expansion/pull/6301) +* Clean up leftover from simu hp reduction development by @AlexOn1ine in [#6323](https://github.com/rh-hideout/pokeemerald-expansion/pull/6323) +* Remove pursuitSwitchByMove and additional if statement by @PhallenTree in [#6326](https://github.com/rh-hideout/pokeemerald-expansion/pull/6326) + +## 🧪 Test Runner 🧪 +### Changed +* New Ally Switch test fails on CI by @AlexOn1ine in [#5896](https://github.com/rh-hideout/pokeemerald-expansion/pull/5896) +* Added final Sparkling Aria+Shield Dust interaction test by @hedara90 in [#5923](https://github.com/rh-hideout/pokeemerald-expansion/pull/5923) +* Converted 2 various to callnative by @AsparagusEduardo in [#5950](https://github.com/rh-hideout/pokeemerald-expansion/pull/5950) + - Removed `VARIOUS_SWAP_SIDE_STATUSES` and `VARIOUS_SWAP_STATS`. +* Cleaned up Trainer Slides, added automated Trainer Slide tests, add new Enemy Critical Hit Slide by @pkmnsnfrn and @AlexOn1ine, @hedara90, @AsparagusEduardo, @mrgriffin in [#6018](https://github.com/rh-hideout/pokeemerald-expansion/pull/6018) + * If users created new entries in sTrainerSlides, they will need to be ported to the new system. +* Tests for Big Pecks by @hedara90 in [#6158](https://github.com/rh-hideout/pokeemerald-expansion/pull/6158) +* Water Compaction tests by @hedara90 in [#6159](https://github.com/rh-hideout/pokeemerald-expansion/pull/6159) +* Wrote tests for Electrify by @hedara90 in [#6179](https://github.com/rh-hideout/pokeemerald-expansion/pull/6179) +* Sheer Force Test Fixes by @ghoulslash in [#6198](https://github.com/rh-hideout/pokeemerald-expansion/pull/6198) +* Minor Terrain Seed Test Improvement by @ghoulslash in [#6207](https://github.com/rh-hideout/pokeemerald-expansion/pull/6207) +* Fix Liquid Ooze + Leech Seed Test by @ghoulslash in [#6217](https://github.com/rh-hideout/pokeemerald-expansion/pull/6217) +* Prevented fanfares from playing in headless mode by @pkmnsnfrn and @hedara90, @AsparagusEduardo in [#6219](https://github.com/rh-hideout/pokeemerald-expansion/pull/6219) +* Added test support for 5 battle configs by @AsparagusEduardo in [#5914](https://github.com/rh-hideout/pokeemerald-expansion/pull/5914) +* Added missing Dream Eater and Reflect Type tests by @AsparagusEduardo in [#6245](https://github.com/rh-hideout/pokeemerald-expansion/pull/6245) +* Refactor testing flags and vars to not conflict with user ones by @hedara90 in [#6301](https://github.com/rh-hideout/pokeemerald-expansion/pull/6301) + +### Fixed +* Fix ASSUMPTIONS not working by @DizzyEggg in [#5869](https://github.com/rh-hideout/pokeemerald-expansion/pull/5869) +* Updated Trainer Ids used in Trainer Slides tests by @pkmnsnfrn and @AlexOn1ine found the original bug, @AsparagusEduardo confirmed it in [#6138](https://github.com/rh-hideout/pokeemerald-expansion/pull/6138) +* Adjusted G-Max Depletion test by @AsparagusEduardo and @AlexOn1ine for being a cool dude being patient with me during the PR. in [#6201](https://github.com/rh-hideout/pokeemerald-expansion/pull/6201) +* Do not add TRAINER_FLAG_DOUBLE_BATTLE to recorded battles by @mrgriffin in [#6285](https://github.com/rh-hideout/pokeemerald-expansion/pull/6285) +* Fixes Brick Break/Psychic Fangs/Raging Bull breaking screens if target is immune by @PhallenTree in [#6308](https://github.com/rh-hideout/pokeemerald-expansion/pull/6308) + +## 📚 Documentation 📚 +* Updating install instructions by @hedara90 in [#5610](https://github.com/rh-hideout/pokeemerald-expansion/pull/5610) + - Install instructions have been moved into individual files under `docs/install/ ` +* Documentation for DisableStruct by @AlexOn1ine in [#6066](https://github.com/rh-hideout/pokeemerald-expansion/pull/6066) +* Cleaned up Trainer Slides, added automated Trainer Slide tests, add new Enemy Critical Hit Slide by @pkmnsnfrn and @AlexOn1ine, @hedara90, @AsparagusEduardo, @mrgriffin in [#6018](https://github.com/rh-hideout/pokeemerald-expansion/pull/6018) + * If users created new entries in sTrainerSlides, they will need to be ported to the new system. +* Updated trainer pic tutorial by @fdeblasio in [#6049](https://github.com/rh-hideout/pokeemerald-expansion/pull/6049) +* Update how_to_testing_system.md by @hedara90 in [#6281](https://github.com/rh-hideout/pokeemerald-expansion/pull/6281) + +## 📦 Branch Synchronisation 📦 +### pret +* 11th of February in [#6231](https://github.com/rh-hideout/pokeemerald-expansion/pull/6231) + * Replace easy_chat alphabetialOrder magic numbers with EC_INDEX values by @rayrobdod in [pret#2096](https://github.com/pret/pokeemerald/pull/2096) + * Fixed switchout bug in multibattle where order of mons gets messed up by @shachar700 in [pret#2099](https://github.com/pret/pokeemerald/pull/2099) + +## New Contributors +* @khbsd made their first contribution in [#5679](https://github.com/rh-hideout/pokeemerald-expansion/pull/5679) +* @ExMingYan made their first contribution in [#6220](https://github.com/rh-hideout/pokeemerald-expansion/pull/6220) +* @Deokishisu made their first contribution in [#6261](https://github.com/rh-hideout/pokeemerald-expansion/pull/6261) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.10.2...test + + + + diff --git a/docs/tutorials/ai_flags.md b/docs/tutorials/ai_flags.md index 4d0b7ca6aa..d0ff706143 100644 --- a/docs/tutorials/ai_flags.md +++ b/docs/tutorials/ai_flags.md @@ -29,12 +29,14 @@ This section lists all of expansion’s AI Flags and briefly describes the effec ## Composite AI Flags -Expansion has two "composite" AI flags, `AI_FLAG_BASIC_TRAINER` and `AI_FLAG_SMART_TRAINER`. This means that these flags have no unique functionality themselves, and can instead be thought of as groups of other flags that are all enabled when this flag is enabled. The idea behind these flags is that if you don't care to manage the detailed behaviour of a particular trainer, you can use these as a baseline instead, and expansion will keep them updated for you. +Expansion has a few "composite" AI flags. This means that these flags have no unique functionality themselves, and can instead be thought of as groups of other flags that are all enabled when this flag is enabled. The idea behind these flags is that if you don't care to manage the detailed behaviour of a particular trainer, you can use these as a baseline instead, and expansion will keep them updated for you. `AI_FLAG_BASIC_TRAINER` is expansion's version of generic, normal AI behaviour. It includes `AI_FLAG_CHECK_BAD_MOVE` (don't use bad moves), `AI_FLAG_TRY_TO_FAINT` (faint the player where possible), and `AI_FLAG_CHECK_VIABILITY` (choose the most effective move to use in the current context). Trainers with this flag will still be smarter than they are in vanilla as there have been dramatic improvements made to move selection, but not incredibly so. Trainers with this flag should feel like normal trainers. In general we recommend these three flags be used in all cases, unless you specifically want a trainer who makes obvious mistakes in battle. `AI_FLAG_SMART_TRAINER` is expansion's version of a "smart AI". It includes everything in `AI_FLAG_BASIC_TRAINER` along with `AI_FLAG_SMART_SWITCHING` (make smart decisions about when to switch), `AI_FLAG_SMART_MON_CHOICES` (make smart decisions about what mon to send in after a switch / KO), and `AI_FLAG_OMNISCIENT` (awareness of what moves, items, and abilities the player's mons have to better inform decisions). Expansion will keep this updated to represent the most objectively intelligent behaviour our flags are capable of producing. +`AI_FLAG_PREDICTION` will enable all of the prediction flags at once, so the AI can perform as well as possible. It is best paired with the flags in `AI_FLAG_SMART_TRAINER` for optimal behaviour. This currently includes `AI_FLAG_PREDICT_SWITCH` and `AI_FLAG_PREDICT_INCOMING_MON`, but will likely be expanded in the future. + Expansion has LOADS of flags, which will be covered in the rest of this guide. If you don't want to engage with detailed trainer AI tuning though, you can just use these two composite flags, and trust that expansion will keep their contents updated to always represent the most standard and the smartest behaviour we can. ## `AI_FLAG_CHECK_BAD_MOVE` @@ -165,3 +167,15 @@ AI always assumes it will roll the lowest possible result when comparing damage ## `AI_FLAG_SEQUENCE_SWITCHING` AI will always switch out after a KO in exactly party order as defined in the trainer data (ie. slot 1, then 2, then 3, etc.). The AI will never switch out mid-battle unless forced to (Roar etc.). If the AI uses a move that requires a switch where it makes a decision about what to send in (U-Turn etc.), it will always switch out into the lowest available party index. + +## `AI_FLAG_WEIGH_ABILITY_PREDICTION` +AI will predict the player's ability based to its aiRating. Without this flag the AI randomly assumes an ability with an even distribution between all possible abilities until one is confirmed. With this flag, it instead guesses proportionally to each ability's aiRating, making it far more likely to guess an ability like Water Absorb than Damp if both are options. + +## `AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE` +AI will add score to its highest damaging move, regardless of accuracy or secondary effects. Replaces deprecated `AI_FLAG_PREFER_STRONGEST_MOVE`. + +## `AI_FLAG_PREDICT_SWITCH` +AI will determine whether it would switch out in the player's situation or not, and predict the player to switch accordingly. In any case where the AI would consider switching, it will assume the player will switch. This is modulated by a 50% failure rate, so the behaviour is non-deterministic and can change from turn to turn to emulate the inconsistency in human predictions. This behaviour is improved significantly by using `AI_FLAG_SMART_SWITCHING` and `AI_FLAG_SMART_MON_CHOICES` as they improve the AI's ability to determine good situations to switch, and also by `AI_FLAG_OMNISCIENT` so the AI can use all its knowledge of the player's team to make the decision. + +## `AI_FLAG_PREDICT_INCOMING_MON` +This flag requires `AI_FLAG_PREDICT_SWITCH` to function. If the AI predicts that the player will switch, this flag allows the AI to run its move scoring calculation against the Pokémon it expects the player to switch into, instead of the Pokémon that it expects to switch out. diff --git a/docs/tutorials/how_to_code_entry.md b/docs/tutorials/how_to_code_entry.md new file mode 100644 index 0000000000..19219835d9 --- /dev/null +++ b/docs/tutorials/how_to_code_entry.md @@ -0,0 +1,395 @@ +## How to use the code entry system + +This system involves using the `EnterCode` special to prompt the player to enter a text string, and then the `GetCodeFeedback` special to perform some function based on the string entered. Using this system to make your own cheat codes or mystery gifts will involve both scripting and editing the `GetCodeFeedback` function itself to include your new functionality, and may involve further changes to the codebase if you want to implement something more far reaching (ie. a grindrunning mode). + +This tutorial will use the example of entering the string "CaughtEmAll" to flag every Pokemon as caught + +### 1. Choose where to initiaze your event scripting + +This can be anywhere or anything, pre-existing or added by you in porymap. I usually like using signs for testing things but this can be anything. I'm going to give the main script a more generic name, and you can attach it to whatever object you like. + +In that object's event script, add the following: +```diff +EventScript_CodeEntry:: + special EnterCode + waitstate + special GetCodeFeedback + end +``` + +This will prompt text entry from the object and prepare it to handle reading the entered text after it's been entered, but it won't do anything yet. Next we need to add our functionality to `GetCodeFeedback`. + +### 2. Add code string and code function to `GetCodeFeedback` + +You can find `GetCodeFeedback` in `src/field_specials.c`. Let's start by taking a look at the function: +``` +void GetCodeFeedback(void) +{ + static const u8 sText_SampleCode[] = _("SampleCode"); + if (!StringCompare(gStringVar2, sText_SampleCode)) + gSpecialVar_Result = 1; + else + gSpecialVar_Result = 0; +} +``` + +What this function does is compare the input string (`gStringVar2`) against a specified string (`sText_SampleCode`) and returns a value depending on whether the strings matched (`gSpecialVar_Result`). Note that due to the way `StringCompare` works, the comparison does need to be negated with `!`. By default, this sample setup returns 1 when the string "SampleCode" is entered by the player. + +Let's leave that functionality alone in case we ever want to reference it again, and just add a brand new code instead. We want to use the string "CaughtEmAll" as our code, so we'll start by making a string for it, and a new conditional that checks if the entered string matches. We'll also want to make sure we return a new unique number for `gSpecialVar_Result` so our event script knows what happened. + +```diff +void GetCodeFeedback(void) +{ + static const u8 sText_SampleCode[] = _("SampleCode"); ++ static const u8 sText_CaughtEmAll_[] = _("CaughtEmAll"); // Mark entire Pokedex as caught + if (!StringCompare(gStringVar2, sText_SampleCode)) + gSpecialVar_Result = 1; ++ else if (!StringCompare(gStringVar2, sText_CaughtEmAll)) ++ { ++ // TODO ++ gSpecialVar_Result = 2; ++ } + else + gSpecialVar_Result = 0; +} +``` + +Great! Now we have a new case to handle our new code, but it still doesn't do anything. This is the part that will change dramatically depending on what you want to do, and you can do anything you want, from setting flags to calling other functions or anything else! Just make sure you do it from within the conditional that matches your code. In our case we want to iterate through the Pokedex to mark everything as caught, which I'll just do here for simplicity. + +```diff +void GetCodeFeedback(void) +{ + static const u8 sText_SampleCode[] = _("SampleCode"); + static const u8 sText_CaughtEmAll_[] = _("CaughtEmAll"); // Mark entire Pokedex as caught + if (!StringCompare(gStringVar2, sText_SampleCode)) + gSpecialVar_Result = 1; + else if (!StringCompare(gStringVar2, sText_CaughtEmAll)) + { ++ u32 i; ++ for (i = 0; i < NATIONAL_DEX_COUNT; i++) ++ { ++ GetSetPokedexFlag(i + 1, FLAG_SET_CAUGHT); ++ } + gSpecialVar_Result = 2; + } + else + gSpecialVar_Result = 0; +} +``` + +Awesome! Now our `GetCodeFeedback` function performs the task we want it to, and returns a 2 to our event script so it can handle the situation appropriately. That's our next and final step! + +### 3. Handle new `GetCodeFeedback` case in event script + +To clarify, this step is *optional*. You don't need to do anything else after `GetCodeFeedback` has run if you don't want to, as all the functionality is there; once that function finishes, everything in the Pokedex will be marked as caught. + +The reason we might want to do this step, and the reason we pass results back to the event script in the first place, is so we can handle providing the player with some dialogue based on what they're doing. + +Let's go back to our event script. + +``` +EventScript_CodeEntry:: + special EnterCode + waitstate + special GetCodeFeedback + end +``` + +Maybe we first want to prompt the player with a message that says something like "Enter a code?" + +```diff +EventScript_CodeEntry:: ++ lockall ++ msgbox EnterCode_EnterCodeText, MSGBOX_YESNO ++ compare VAR_RESULT, 0 ++ goto_if_eq CodeExit + special EnterCode + waitstate + special GetCodeFeedback + end + ++CodeExit:: ++ releaseall ++ end ++ ++EnterCode_EnterCodeText: ++ .string "Enter a code?$" +``` + +This is all straightforward scripting stuff, the sign will first give the player a YES / NO box and ask whether they'd like to enter a code. Let's now add some cases and messages that handle the different results of the code entry from `GetCodeFeedback`. Let's look at the sign first: + +```diff +EventScript_CodeEntry:: + lockall + msgbox EnterCode_EnterCodeText, MSGBOX_YESNO + compare VAR_RESULT, 0 + goto_if_eq CodeExit + special EnterCode + waitstate + special GetCodeFeedback ++ goto_if_eq VAR_RESULT, 0, CodeFailed ++ goto_if_eq VAR_RESULT, 1, CodeSampleCode ++ goto_if_eq VAR_RESULT, 2, CodeCaughtEmAll + end +``` + +Now we're handling cases for each of the possible return values from `GetCodeFeedback`! except we don't have any of those functions, so this will cause errors as the script has nothing to `goto_if_eq`. Let's write those too: + +```diff +CodeFailed:: + msgbox EnterCode_FailedText, MSGBOX_DEFAULT + releaseall + end + +CodeSampleString:: + msgbox EnterCode_SucceededText, MSGBOX_DEFAULT + msgbox CodeSampleCode_Text, MSGBOX_DEFAULT + releaseall + end + +CodeCaughtEmAll:: + msgbox EnterCode_SucceededText, MSGBOX_DEFAULT + msgbox CodeCaughtEmAll_Text, MSGBOX_DEFAULT + releaseall + end +``` + +And lastly, we'll need to add all of the strings we now need to reference: + +``` +EnterCode_FailedText: + .string "...nothing happened.$" + +EnterCode_SucceededText: + .string "The code worked!$" + +CodeSampleCode_Text + .string "You entered the sample code!$" + +CodeCaughtEmAll_Text + .string "Encyclopedic knowledge fills your head.\n" + .string "It's like you've caught 'em all!$" +``` + +So to finish up, our event script file now looks like this, with all said and done: + +``` +EventScript_CodeEntry:: + lockall + msgbox EnterCode_EnterCodeText, MSGBOX_YESNO + compare VAR_RESULT, 0 + goto_if_eq CodeExit + special EnterCode + waitstate + special GetCodeFeedback + goto_if_eq VAR_RESULT, 0, CodeFailed + goto_if_eq VAR_RESULT, 1, CodeSampleCode + goto_if_eq VAR_RESULT, 2, CodeCaughtEmAll + end + +CodeExit:: + releaseall + end + +CodeFailed:: + msgbox EnterCode_FailedText, MSGBOX_DEFAULT + releaseall + end + +CodeSampleString:: + msgbox EnterCode_SucceededText, MSGBOX_DEFAULT + msgbox CodeSampleCode_Text, MSGBOX_DEFAULT + releaseall + end + +CodeCaughtEmAll:: + msgbox EnterCode_SucceededText, MSGBOX_DEFAULT + msgbox CodeCaughtEmAll_Text, MSGBOX_DEFAULT + releaseall + end + +EnterCode_EnterCodeText: + .string "Enter a code?$" + +EnterCode_FailedText: + .string "...nothing happened.$" + +EnterCode_SucceededText: + .string "The code worked!$" + +CodeSampleCode_Text + .string "You entered the sample code!$" + +CodeCaughtEmAll_Text + .string "Encyclopedic knowledge fills your head.\n" + .string "It's like you've caught 'em all!$" + +``` + +And that's it! Feel free to expand this in whatever way you wish, the pattern can just be repeated as much as you like, and you can made the code called from `GetCodeFeedback` do whatever you like. + +## Can I change the icon on the name entry screen? + +Absolutely! In `naming_screen.c`, look for the `NamingScreen_CreateCodeIcon` function. It's very short. There's one relevant line that needs to be changed: + +``` +spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_MYSTERY_GIFT_MAN, SpriteCallbackDummy, 56, 37, 0); +``` + +Just swap out `OBJ_EVENT_GFX_MYSTERY_GIFT_MAN` for whatever event object sprite you'd like to use instead. You may need to adjust the position (the 56 and 37 in this example) depending on your sprite. + +## What about a mystery gift setup? + +I'd like to cover this separately because it's best handled via `givemon` script commands, which means we don't do much in `GetCodeFeedback` other than return a unique identifier. I'm gonna reference @PCG06's mystery gift implementation which is based on this code entry system for a clean and really thorough example. + +### 3. Mystery Gift `GetCodeFeedback` + +Let's say you have two mystery gift mons and no other cases you want to handle, one for Celebi and one for Jirachi. Your `GetCodeFeedback` function will look something like this: + +``` +{ + static const u8 sText_CodeCelebi[] = _("Celebi"); + static const u8 sText_CodeJirachi[] = _("Jirachi"); + if (!StringCompare(gStringVar2, sText_CodeCelebi)) + gSpecialVar_Result = 1; + else if (!StringCompare(gStringVar2, sText_CodeJirachi)) + gSpecialVar_Result = 2; + else + gSpecialVar_Result = 0; +} +``` +and that's it, super simple. All of the other handling will have to be done on the scripting end, as we'll be leaning on `givemon` and its associated handling. + +### 2. Mystery Gift Scripting + +Let's return back to our EventScript_CodeEntry pattern from before, but instead use our new codes. + +``` +EventScript_CodeEntry:: + lockall + msgbox EnterCode_EnterCodeText, MSGBOX_YESNO + compare VAR_RESULT, 0 + goto_if_eq CodeExit + special EnterCode + waitstate + special GetCodeFeedback + goto_if_eq VAR_RESULT, 0, CodeFailed + goto_if_eq VAR_RESULT, 1, MysteryGift_EventScript_Celebi + goto_if_eq VAR_RESULT, 2, MysteryGift_EventScript_Jirachi + end +``` + +Straightforward enough! The actual work is in writing `MysteryGift_EventScript_Celebi` and `MysteryGift_EventScript_Jirachi` to handle their givemons appropriately, prompt nicknaming, send them to the PC if the party is full, etc. We should also keep in mind that each Mystery Gift should only be entered once, so we'll want to track that with a flag; conveniently, expansion already has 15 flags we can use for the purpose. Let's do Celebi first. + +``` +MysteryGift_EventScript_Celebi:: + goto_if_set FLAG_MYSTERY_GIFT_1, MysteryGift_EventScript_Redeemed + bufferspeciesname STR_VAR_1, SPECIES_CELEBI + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_CELEBI + givemon SPECIES_CELEBI, 100, ITEM_LIFE_ORB, ITEM_CHERISH_BALL, NATURE_TIMID, 0, MON_GENDERLESS, 0, 0, 4, 252, 252, 0, 31, 31, 31, 30, 31, 31, MOVE_ENERGY_BALL, MOVE_PSYCHIC, MOVE_NASTY_PLOT, MOVE_CELEBRATE, TRUE, FALSE, TYPE_PSYCHIC + setflag FLAG_MYSTERY_GIFT_1 + call MysteryGift_EventScript_ReceivedMon + releaseall + end +``` + +Walking through this, it's clear we'll need some more scripting. We first check if Celebi's corresponding Mystery Gift flag has been set, and if it has, we need to tell the player they've already redeemed it and can't again. If they haven't though, we get ourselves setup for the givemon, do the givemon, and set the mystery gift flag. Then we need soem more generic handling to prompt nicknaming and some fanfare. + +Two things, then; an event script to handle the case where a mystery gift mon has already been redeemed, and an event script to handle when a mystery gift mon has successfully been received. + +Just for the sake of simplicity, I'm going to handle entering a used mystery gift code the same way I'd handle an incorrect code. You're welcome to add more complex scripting if you prefer. + +``` +MysteryGift_EventScript_Redeemed:: + msgbox EnterCode_FailedText, MSGBOX_DEFAULT + releaseall + end +``` + +And then the scripto handle the player having successfully received a mon: + +``` +MysteryGift_EventScript_ReceivedMon:: + msgbox MysteryGift_Text_SucceededText, MSGBOX_DEFAULT + playfanfare MUS_OBTAIN_ITEM + message MysteryGift_Text_ReceivedGiftMon + waitfanfare + goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, MysteryGift_EventScript_NicknamePartyMon + goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, MysteryGift_EventScript_NicknamePCMon + goto Common_EventScript_NoMoreRoomForPokemon + msgbox MysteryGift_Text_PleaseVisitAgain, MSGBOX_DEFAULT + end +``` + +Almost done! Just need to handle the specific nicknaming scripts, and then add all of the text. + +``` +MysteryGift_EventScript_NicknamePartyMon:: + msgbox gText_NicknameThisPokemon, MSGBOX_YESNO + goto_if_eq VAR_RESULT, NO, MysteryGift_EventScript_Exit + call Common_EventScript_GetGiftMonPartySlot + call Common_EventScript_NameReceivedPartyMon + goto MysteryGift_EventScript_Exit + end + +MysteryGift_EventScript_NicknamePCMon:: + msgbox gText_NicknameThisPokemon, MSGBOX_YESNO + goto_if_eq VAR_RESULT, NO, MysteryGift_EventScript_TransferredToPC + call Common_EventScript_NameReceivedBoxMon + call Common_EventScript_TransferredToPC + releaseall + end + +MysteryGift_EventScript_TransferredToPC:: + call Common_EventScript_TransferredToPC + releaseall + end + +MysteryGift_Text_WelcomeToMysteryGiftSystem: + .string "Hello, {PLAYER}!\p" + .string "Welcome to the Mystery Gift System!\p" + .string "Would you like to enter a code?$" + +MysteryGift_Text_CurrentlyUnavailable: + .string "I'm sorry, but the Mystery Gift System\n" + .string "is currently unavailable.\p" + .string "Please try again later.\p" + .string "Thank you!$" + +MysteryGift_Text_PleaseVisitAgain: + .string "Please visit again!$" + +MysteryGift_Text_EnterCode: + .string "Please enter the code.$" + +MysteryGift_Text_SucceededText: + .string "The code was valid!\p" + .string "Enjoy your gift!$" + +MysteryGift_Text_FailedText: + .string "The code was invalid!\p" + .string "Would you like to enter a new code?$" + +MysteryGift_Text_RedeemedText: + .string "This code was already redeemed!\p" + .string "Would you like you enter a new code?$" + +MysteryGift_Text_ReceivedGiftMon: + .string "{PLAYER} received a {STR_VAR_1}!$" +``` + +Goodness, so much infrastructure scripting! The nice thing is that now that all the infrastructure is set up, much like before, adding new cases becomes really straightforward. With Celebi and all of the skeleton scripting finished, let's add Jirachi. + +``` +MysteryGift_EventScript_Jirachi:: + goto_if_set FLAG_MYSTERY_GIFT_2, MysteryGift_EventScript_Redeemed + bufferspeciesname STR_VAR_1, SPECIES_JIRACHI + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_JIRACHI + givemon SPECIES_JIRACHI, 100, ITEM_LIFE_ORB, ITEM_CHERISH_BALL, NATURE_ADAMANT, 0, MON_GENDERLESS, 0, 252, 4, 252, 0, 0, 31, 31, 31, 31, 31, 31, MOVE_IRON_HEAD, MOVE_ZEN_HEADBUTT, MOVE_PLAY_ROUGH, MOVE_CELEBRATE, TRUE, FALSE, TYPE_STEEL + setflag FLAG_MYSTERY_GIFT_2 + call MysteryGift_EventScript_ReceivedMon + releaseall + end +``` + +And that's it! Super straightforward from here, just make sure to iterate `FLAG_MYSTERY_GIFT` each time you add a new mon, and of course add their code to both `GetCodeFeedback` and the main script controlling code entry. diff --git a/docs/tutorials/how_to_new_trainer_slide.md b/docs/tutorials/how_to_new_trainer_slide.md new file mode 100644 index 0000000000..67c29a437d --- /dev/null +++ b/docs/tutorials/how_to_new_trainer_slide.md @@ -0,0 +1,205 @@ +# Adding New Trainer Slides +## Define Slides Per Trainer + +We are going to add a Trainer Slide to Wally's first Victory Road battle, before he Mega Evolves his Gallade. This battle takes place outside a Battle Facility, so `sTrainerSlides` must be edited. + +### `src/trainer_slide.c` +```diff ++ const u8 gText_ThatsTheWay[] = _("That's the way, Gallade! Go!{PAUSE_UNTIL_PRESS}"); + +static const u8* const sTrainerSlides[DIFFICULTY_COUNT][TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = +{ + [DIFFICULTY_NORMAL] = + { ++ [TRAINER_WALLY_VR_1] = // use the Trainer's Id from include/constants/opponents.h ++ { ++ [TRAINER_SLIDE_MEGA_EVOLUTION] = COMPOUND_STRING("That's the way, Gallade! Go!{PAUSE_UNTIL_PRESS}"), // find the id for the slide to be used. ++ //[TRAINER_SLIDE_MEGA_EVOLUTION] = gText_ThatsTheWay, // You can use globals or COMPOUND_STRING to define text here. ++ } + }, +}; +``` + +If we were to edit a Trainer that appears in a Battle Facility, `sFrontierTrainerSlides` would be edited instead. Here, we'll give Anabel a line before she uses a Z-Move. + +### `src/trainer_slide.c` +```diff +static const u8* const sFrontierTrainerSlides[DIFFICULTY_COUNT][FRONTIER_TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = +{ + [DIFFICULTY_NORMAL] = + { ++ [TRAINER_ANABEL] = ++ { ++ [TRAINER_SLIDE_Z_MOVE] = COMPOUND_STRING("Victory...is ours!"), //{PAUSE_UNTIL_PRESS} is omitted, so the battle will continue as soon as the next is finished printing. ++ } + }, +}; +``` + +## Add New Slides +* [Example Commit]() +* [Patch]() +* [Diff]() + +### `include/constants/trainer_slide.h` +```diff +enum TrainerSlideType +{ + TRAINER_SLIDE_BEFORE_FIRST_TURN, + TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT, ++ TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT, // Each Trainer Slide has a unqiue id. + TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT, + TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE, + TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN, + TRAINER_SLIDE_ENEMY_MON_UNAFFECTED, + TRAINER_SLIDE_LAST_SWITCHIN, + TRAINER_SLIDE_LAST_HALF_HP, + TRAINER_SLIDE_LAST_LOW_HP, + TRAINER_SLIDE_MEGA_EVOLUTION, + TRAINER_SLIDE_Z_MOVE, + TRAINER_SLIDE_DYNAMAX, + TRAINER_SLIDE_COUNT, +}; +``` + +Each Trainer Slide has a unique id and needs to be added to this list. + +### `include/trainer_slide.h` + +If your new Trainer Slide needs to check for beforen initalized, a function is declared here to be used externally. Critical hits are used to initalize this Trainer Slide but the slide doesn't play instantly, so we will create an function to initialize it. + +```diff +void SetTrainerSlideMessage(enum DifficultyLevel, u32, u32); +void TryInitializeFirstSTABMoveTrainerSlide(u32, u32, u32); +void TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(u32); ++ void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32); +void TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32); +void TryInitializeTrainerSlideEnemyMonUnaffected(u32); +bool32 IsTrainerSlideInitialized(enum TrainerSlideType); +``` +### `src/trainer_slide.c` + +```diff + return IsTrainerSlideInitialized(slideId); + } + ++static bool32 ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(enum TrainerSlideType slideId) ++{ ++ return IsTrainerSlideInitialized(slideId); ++} ++ + static bool32 ShouldRunTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 battler, enum TrainerSlideType slideId) + { + if (!IsTrainerSlideInitialized(slideId)) +``` + +```diff + case TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT: + shouldRun = ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(slideId); + break; ++ case TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT: ++ shouldRun = ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(slideId); ++ break; + case TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT: + shouldRun = ShouldRunTrainerSlidePlayerLandsFirstSuperEffectiveHit(battler, slideId); + break; +``` + +The function that determines if a Slide should play has different function for most Slides. We need to check if this Slide was initialized by a critical hit previously, so a function is created here. This function and the Id and then added to the switch statement in `ShouldDoTrainerSlide`. + +```diff + InitalizeTrainerSlide(slideId); + } + ++void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target) ++{ ++ enum TrainerSlideType slideId = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; ++ ++ if (IsSlideInitalizedOrPlayed(slideId)) ++ return; ++ ++ if (GetBattlerSide(target) == B_SIDE_OPPONENT) ++ return; ++ ++ InitalizeTrainerSlide(slideId); ++} ++ +``` + +The function to check if this slide SHOULD be initalized is added to the bottom of this file. + +### `src/battle_main.c` + +```diff + BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); + else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT))) + BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); ++ else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT))) ++ BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); + else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT))) + BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); + else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE))) +diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c +``` + +In `BattleTurnPassed`, most Trainer Slides are checked to see if they should run, so our new call is added here. + +### `src/battle_script_commands.c` + +```diff + { + PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker); + ++ TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(gBattlerTarget); + TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(gBattlerTarget); + + gBattleCommunication[MSG_DISPLAY] = 1; +``` + +The actual usage of `TryInitializeTrainerSlideEnemyLandsFirstCriticalHit` is added and is checked whenever a critical hit is scored. + +### `test/battle/trainer_slides.c` +```diff + } + } + ++SINGLE_BATTLE_TEST("Trainer Slide: Enemy Lands First Critical Hit") ++{ ++ gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; ++ ++ GIVEN { ++ ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); ++ PLAYER(SPECIES_WOBBUFFET); ++ OPPONENT(SPECIES_WOBBUFFET); ++ } WHEN { ++ TURN { MOVE(opponent, MOVE_LASER_FOCUS); } ++ TURN { MOVE(opponent, MOVE_TACKLE); } ++ } SCENE { ++ ANIMATION(ANIM_TYPE_MOVE, MOVE_LASER_FOCUS, opponent); ++ ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); ++ MESSAGE("A critical hit!"); ++ MESSAGE("This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"); ++ } ++} ++ + SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First STAB Hit") + { + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; +diff --git a/test/battle/trainer_slides.h b/test/battle/trainer_slides.h +``` + +### `test/battle/trainer_slides.h` +```diff + + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"), + }, ++ [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = ++ { ++ [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"), ++ }, + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = + { + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = COMPOUND_STRING("This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"), +``` + +Tests are added to make sure the new Trainer Slide works. A test is added to the c file, and the trainer to run the entry in the test is added to `sTestTrainerSlides`. diff --git a/docs/tutorials/how_to_testing_system.md b/docs/tutorials/how_to_testing_system.md index 8a97800f87..2e5f83ff76 100644 --- a/docs/tutorials/how_to_testing_system.md +++ b/docs/tutorials/how_to_testing_system.md @@ -32,7 +32,7 @@ This can be translated to an automated test as follows: ``` ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE); + ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_PARALYZE); } SINGLE_BATTLE_TEST("Stun Spore inflicts paralysis") @@ -78,7 +78,7 @@ This can again be translated as follows: SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types") { GIVEN { - ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove); + ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); PLAYER(SPECIES_ODDISH); // 1. OPPONENT(SPECIES_ODDISH); // 2. @@ -111,7 +111,7 @@ SINGLE_BATTLE_TEST("Meditate raises Attack", s16 damage) PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -146,7 +146,7 @@ The overworld is not available, so it is only possible to test commands which do ### `ASSUME` `ASSUME(cond)` Causes the test to be skipped if `cond` is false. Used to document any prerequisites of the test, e.g. to test Burn reducing the Attack of a Pokémon we can observe the damage of a physical attack with and without the burn. To document that this test assumes the attack is physical we can use: -`ASSUME(gMovesInfo[MOVE_WHATEVER].category == DAMAGE_CATEGORY_PHYSICAL);` +`ASSUME(GetMoveCategory(MOVE_WHATEVER) == DAMAGE_CATEGORY_PHYSICAL);` ### `ASSUMPTIONS` ``` @@ -159,7 +159,7 @@ Should be placed immediately after any `#includes` and contain any `ASSUME` stat ``` ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_POISON_STING].effect == EFFECT_POISON_HIT); + ASSUME(GetMoveEffect(MOVE_POISON_STING) == EFFECT_POISON_HIT); } ``` @@ -201,7 +201,7 @@ SINGLE_BATTLE_TEST("Blaze boosts Fire-type moves in a pinch", s16 damage) PARAMETRIZE { hp = 99; } PARAMETRIZE { hp = 33; } GIVEN { - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); MaxHP(99); HP(hp); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -233,7 +233,7 @@ SINGLE_BATTLE_TEST("Paralysis has a 25% chance of skipping the turn") All `BattleRandom` calls involving tag will return the same number, so this cannot be used to have two moves independently hit or miss, for example. If the tag is not provided, runs the test 50 times and computes an approximate pass ratio. -`PASSES_RANDOMLY(gMovesInfo[move].accuracy, 100);` +`PASSES_RANDOMLY(GetMoveAccuracy(move), 100);` Note that this mode of PASSES_RANDOMLY makes the tests run very slowly and should be avoided where possible. If the mechanic you are testing is missing its tag, you should add it. ### `GIVEN` diff --git a/docs/tutorials/how_to_trainer_class.md b/docs/tutorials/how_to_trainer_class.md deleted file mode 100644 index 3ce0217c28..0000000000 --- a/docs/tutorials/how_to_trainer_class.md +++ /dev/null @@ -1,178 +0,0 @@ -# How to add a new trainer class - -## Content -* [Quick Summary](#quick-summary) -* [The Graphics](#the-graphics) - * [1. Edit the sprites](#2-edit-the-sprites) - * [2. Register the sprites](#2-register-the-sprites) - * [3. The Animation](#2-the-animation) - * [4. Connecting pictures to the data](#2-connecting-pictures-to-the-data) -* [The Data](#the-data) - * [5. Defining the trainer class](#2-defining-the-trainer-class) -* [Usage](#usage) - -## Quick Summary -(Page contains out of date information, [new instructions for Sprites here](https://github.com/rh-hideout/pokeemerald-expansion/pull/3597).) -If you've done this before and just need a quick lookup, here's what files you need: -1. GFX into [graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) -2. Palette into [graphics/trainers/palettes](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/palettes) -3. Register sprites to [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h) -4. Point game to where graphic files are found: [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) -5. Add animation to: [src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h) -6. Add the trainer to all three structs in: [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h) -7. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h) - -## The Graphics - -### 1. Edit the sprites -We will start with a graphic that we want to use for our new trainer class. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder: -[graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) - -**Remember to limit yourself to 16 colors including transparency in the first slot!** - -Export the pallette and place into the same folder. - -### 2. Register the sprites -Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths. -Edit [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h): -```diff -extern const u32 gTrainerFrontPic_RubySapphireMay[]; -+ extern const u32 gTrainerFrontPic_myTrainerClass[]; - -extern const u32 gTrainerPalette_Hiker[]; -... - -... -extern const u32 gTrainerPalette_RubySapphireMay[]; -+ extern const u32 gTrainerPalette_myTrainerClass[]; - -extern const u8 gTrainerBackPic_Brendan[]; -``` - -Now link the graphic files. -[src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h): -```diff -const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz"); - -const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz"); -const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz"); - -+ const u32 gTrainerFrontPic_Sheriff[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass_front_pic.4bpp.lz"); -+ const u32 gTrainerPalette_Sheriff[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz"); - -const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan_back_pic.4 -``` - -### 3. The Animation -Add the Animation of the trainer here: -[src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h) - -The trainers don't really move, but in theory they could, it's just that the animation defined for each trainer just shows one frame: - -```diff -static const union AnimCmd *const sAnims_RubySapphireMay[] ={ - sAnim_GeneralFrame0, -}; - -+ static const union AnimCmd *const sAnims_MyTrainerClass[] ={ -+ sAnim_GeneralFrame0, -+ }; - -const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[] = -{ - [TRAINER_PIC_HIKER] = sAnims_Hiker, - [TRAINER_PIC_AQUA_GRUNT_M] = sAnims_AquaGruntM, - [TRAINER_PIC_POKEMON_BREEDER_F] = sAnims_PokemonBreederF, -... - -... - [TRAINER_PIC_RS_BRENDAN] = sAnims_RubySapphireBrendan, - [TRAINER_PIC_RS_MAY] = sAnims_RubySapphireMay, -+ [TRAINER_PIC_MYTRAINERCLASS] = sAnims_MyTrainerClass, -}; -``` - -### 4. Connecting the Pictures to the Data -The last few things we have to do is prepare the graphics for usage. In [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h) you'll find the structs, we need to add the trainer to all of these. You can just copy the last trainer type defined and edit it, but as far as I understand, these are what they do: - -1. gTrainerFrontPicCoords: Pretty self explanatory. Coordinates like size and offset on the y-axis to position the sprite on screen. -2. gTrainerFrontPicTable: Connects the trainer type with the image we defined earlier. -3. gTrainerFrontPicPaletteTable: Connects the trainer type with the palette we defined earlier. - -So, finally, it needs to look like this: -```diff -const struct MonCoords gTrainerFrontPicCoords[] = -{ - [TRAINER_PIC_HIKER] = {.size = 8, .y_offset = 1}, - [TRAINER_PIC_AQUA_GRUNT_M] = {.size = 8, .y_offset = 1}, -... - -... - [TRAINER_PIC_RS_BRENDAN] = {.size = 8, .y_offset = 1}, - [TRAINER_PIC_RS_MAY] = {.size = 8, .y_offset = 1}, -+ [TRAINER_PIC_MYTRAINERCLASS] = {.size = 8, .y_offset = 1}, -}; - -#define TRAINER_SPRITE(trainerPic, sprite, size) [TRAINER_PIC_##trainerPic] = {sprite, size, TRAINER_PIC_##trainerPic} - -const struct CompressedSpriteSheet gTrainerFrontPicTable[] = -{ - TRAINER_SPRITE(HIKER, gTrainerFrontPic_Hiker, 0x800), - TRAINER_SPRITE(AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, 0x800), - TRAINER_SPRITE(POKEMON_BREEDER_F, gTrainerFrontPic_PokemonBreederF, 0x800), - TRAINER_SPRITE(COOLTRAINER_M, gTrainerFrontPic_CoolTrainerM, 0x800), -... - -... - TRAINER_SPRITE(RS_BRENDAN, gTrainerFrontPic_RubySapphireBrendan, 0x800), - TRAINER_SPRITE(RS_MAY, gTrainerFrontPic_RubySapphireMay, 0x800), -+ TRAINER_SPRITE(MYTRAINERCLASS, gTrainerFrontPic_MyTrainerClass, 0x800), -}; - -#define TRAINER_PAL(trainerPic, pal) [TRAINER_PIC_##trainerPic] = {pal, TRAINER_PIC_##trainerPic} - -const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[] = -{ - TRAINER_PAL(HIKER, gTrainerPalette_Hiker), - TRAINER_PAL(AQUA_GRUNT_M, gTrainerPalette_AquaGruntM), - TRAINER_PAL(POKEMON_BREEDER_F, gTrainerPalette_PokemonBreederF), -... - -... - TRAINER_PAL(RS_BRENDAN, gTrainerPalette_RubySapphireBrendan), - TRAINER_PAL(RS_MAY, gTrainerPalette_RubySapphireMay), -+ TRAINER_PAL(MYTRAINERCLASS, gTrainerPalette_MyTrainerClass), -}; - -``` -### The Data -#### 5. Defining the trainer class -Finally, let's bring it all together by defining our new trainer class in [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h): - -```diff -#define TRAINER_PIC_RS_MAY 92 -+ #define TRAINER_PIC_MYTRAINERCLASS 93 - -#define TRAINER_BACK_PIC_BRENDAN 0 -#define TRAINER_BACK_PIC_MAY 1 -``` -Remember to count the number next to the trainer class up by one! - -## Usage -You can test your trainer type by going to [src/data/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h) and changing a trainer type. For example: -```diff - [TRAINER_BRENDAN_PLACEHOLDER] = - { - .partyFlags = 0, - .trainerClass = TRAINER_CLASS_RS_PROTAG, - .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, -- .trainerPic = TRAINER_PIC_RS_BRENDAN, -+ .trainerPic = TRAINER_PIC_MYTRAINERCLASS, - .trainerName = _("BRENDAN"), - .items = {}, - .doubleBattle = FALSE, - .aiFlags = 0, - .partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder), - .party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder}, - }, -``` diff --git a/docs/tutorials/how_to_trainer_party_pool.md b/docs/tutorials/how_to_trainer_party_pool.md new file mode 100644 index 0000000000..e0e7639de3 --- /dev/null +++ b/docs/tutorials/how_to_trainer_party_pool.md @@ -0,0 +1,122 @@ +# How to use Trainer Party Pools +Trainer Party Pools (TPP) is a way to introduce a bit of unpredictability to trainer battles by allowing trainer to generate parties from pools defined by the user. + +The maximum number of mons that can be in a single trainer's pool is 255. + +## Turning on TPP with `trainer.sparty` +To use TPP with `trainers.party`, all that's needed is to define a `Party Size` that's smaller than than the number of defined mons for the trainer. + +## Turning on TPP with `trainers.h` +To use TPP with `trainers.h`, the trainer need to have the `.poolSize` field set to a value that's larger than the `.partySize` and equal to the number of mons defined in the trainer. + +## How the pool works +When generating a party for a trainer with a pool, the party is picked from the pool randomly according to rules set for the pool and tags assigned to individual mons in the pool. + +### Pool Rules +Pool rules are defined in `src/data/battle_pool_rules.h`. To begin with some default pools are defined, `defaultPoolRules` which any trainer that doesn't otherwise have a specified pool ruleset uses, and some custom rules for common scenarios. + +- `POOL_RULESET_BASIC`, a ruleset that will pick a mon from the pool with the tag `MON_POOL_TAG_LEAD` if possible to put in the first slot and `MON_POOL_TAG_ACE` in the last slot, and not pick mons with those tags for any other position. +- `POOL_RULESET_DOUBLES`, a ruleset that will pick up to two mons from the pool with the tag `MON_POOL_TAG_LEAD` if possible to put in the first two slots and `MON_POOL_TAG_ACE` in the last two slots, and not pick mons with those tags for any other position. +- `POOL_RULESET_WEATHER_SINGLES`, a ruleset that will pick at most one mon with the tag `MON_POOL_TAG_WEATHER_SETTER` if possible, and at least one mon with the tag `MON_POOL_TAG_WEATHER_ABUSER` if possible, in addition to the same conditions as `POOL_RULESET_BASIC`. +- `POOL_RULESET_WEATHER_DOUBLES`, a ruleset that will pick at most one mon with the tag `MON_POOL_TAG_WEATHER_SETTER` if possible, and at least one mon with the tag `MON_POOL_TAG_WEATHER_ABUSER` if possible, in addition to the same conditions as `POOL_RULESET_DOUBLES`. +- `POOL_RULESET_SUPPORT_DOUBLES`, a ruleset that will pick at most one mon with the tag `MON_POOL_TAG_SUPPORT` if possible, in addition to the same conditions as `POOL_RULESET_DOUBLES`. + +All these pools also have the options `.speciesClause`, `.excludeForms`, `.itemClause` and `.itemClauseExclusions` set to the values defined in `include/config/battle.h` under `B_POOL_RULE_`. + +- `.speciesClause` if set to `TRUE` means that the same exact species as defined by `.species` can't be picked twice for the party from the pool. +- `.excludeForms` if set to `FALSE` means that the same exact species as defined by NetDex number can't be picked twice for the party from the pool. +- `.itemClause` if set to `TRUE` means that pokemon with the same held item can't be picked twice for the party from the pool. +- `.itemClauseExclusions` if set to `TRUE` means that multiple pokemon with the same item can be picked for the party if the item is listed in `poolItemClauseExclusions`. By default `ITEM_ORAN_BERRY` and `ITEM_SITRUS_BERRY` are the only items in the list of exclusions. + +Individual tags can have rules which change how they're included. +By setting the `.tagMaxMembers[POOL_TAG_]` field to a number, only that many mons with that tag will at max be part of the party, or if set to `POOL_MEMBER_COUNT_NONE` no mons with this tag will be included, and if set to `POOL_MEMBER_COUNT_UNLIMITED` no restrictions on the number of mons with the tag will apply. + +By setting `.tagRequired[POOL_TAG_]` option field to `TRUE`, this tag will be picked before any tags that are not required, after the tag has been picked for the pool it will be set to `FALSE` for that tag. + +The tags `Lead` and `Ace` has special handling where they will be picked for the first or last party position respectively. + +### Tags +There are currently 8 tags specified in the TPP implementation, `Lead`, `Ace`, `Weather Setter`, `Weather Abuser`, `Support`, `Tag 5`, `Tag 6` and `Tag 7`. + +If using `trainers.party`, these tags are applied to mons with the field `Tags: `, separated by `/`. Example `Tags: Lead / Weather Setter` + +If using `trainers.h`, these tags are applied to mons with the field `.tags`, separated by `|`. Example: `.tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER` + +Pokemon can have up to 32 different tags, but anything beyond the 8 initial tags has to be implemented. The numbered tags can be renamed too to better signify their purpose for developers. + +## Trainer options +A few more trainer options are introduced in order to further customize how the pool picking process works. + +- `Pool Pick Functions` (`.poolPickIndex`) controls which functons are used to pick mons from the pool, they're split into Lead, Ace, and Other. +By default, only `DefaultPickFunction` and `PickLowest` are implemented. Must be an `enum` value in `enum PoolPickFunctions`. +- `Pool Prune` (`.poolPruneIndex`) controls if members in the pool should be removed before party members are picked from the pool. +By default, only `POOL_PRUNE_NONE`, which doesn't remove anything from the pool, and `POOL_PRUNE_TEST`, which removes Wobbuffet from the pool, are implemented. Must be an `enum` value in `enum PoolPruneOptions`. + +## Example pool +``` +=== TRAINER_TIANA === +Name: TIANA +Class: Lass +Pic: Lass +Gender: Female +Music: Female +Double Battle: Yes +AI: Check Bad Move +Party Size: 4 +Pool Rules: Weather Doubles +Pool Pick Index: Default + +Zigzagoon +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe + +Shroomish +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe + +Psyduck +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe + +Shellder +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe + +Mew +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe +Tags: Ace + +Giratina +Level: 4 +IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe +Tags: Ace + +Vulpix +Ability: Drought +Level: 4 +Tags: Lead / Weather Setter + +Torkoal +Ability: Drought +Level: 4 +Tags: Lead / Weather Setter + +Bulbasaur +Ability: Chlorophyll +Level: 4 +Tags: Lead / Weather Abuser + +Cherrim +Level: 4 +Tags: Lead / Weather Abuser +``` +Here Tiana has been given a pool that's set up for a double battle with weather. Using the default pool rule `Weather Doubles` it will only pick one of each of the weather setters and abusers which Tiana will lead with. Tiana will also pick either Mew or Giratina as her Ace mon, and the last slot will be filled with one of Zigzagoon, Shroomish, Psyduck or Shellder. + +## Pool settings +If no pool rule is specified in the trainer, the default rules will be used, which sets rules according to some defaults from `include/config/battle.h`. +This file also has settings for other pool options. + +- `B_POOL_SETTING_CONSISTENT_RNG`, `TRUE` or `FALSE`, the party generated will always be the same on a particular save (RNG dependant on trainerId and encountered trainer). +- `B_POOL_SETTING_USE_FIXED_SEED`, `TRUE` or `FALSE`, the party generated will always be the same on a particular compiled ROM (RNG dependant on a chosen seed and encountered trainer). +- `B_POOL_SETTING_FIXED_SEED`, seed to use for fixed seed, does nothing if `B_POOL_SETTING_USE_FIXED_SEED` is `FALSE`. diff --git a/docs/tutorials/how_to_trainer_pic.md b/docs/tutorials/how_to_trainer_pic.md new file mode 100644 index 0000000000..78f8a717e4 --- /dev/null +++ b/docs/tutorials/how_to_trainer_pic.md @@ -0,0 +1,98 @@ +# How to add a new trainer pic + +## Content +* [Quick Summary](#quick-summary) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#2-edit-the-sprites) + * [2. Register the sprites](#2-register-the-sprites) + * [3. Connecting pictures to the data](#2-connecting-pictures-to-the-data) +* [The Data](#the-data) + * [4. Defining the trainer pic](#2-defining-the-trainer-pic) +* [Usage](#usage) + +## Quick Summary +If you've done this before and just need a quick lookup, here's what files you need: +1. GFX into [graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) +2. Palette into [graphics/trainers/palettes](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/palettes) +3. Point game to where graphic files are found: [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) +4. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h) + +## The Graphics + +### 1. Edit the sprites +We will start with a graphic that we want to use for our new trainer pic. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder: +[graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) + +**Remember to limit yourself to 16 colors including transparency in the first slot!** + +Export the palette and place into the same folder. + +### 2. Register the sprites +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files. +[src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h): +```diff +const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz"); + +const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire.4bpp.lz"); +const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz"); + ++ const u32 gTrainerFrontPic_myTrainerClass[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass.4bpp.lz"); ++ const u32 gTrainerPalette_myTrainerClass[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz"); + +const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp"); +``` + +### 3. Connecting the Pictures to the Data +The last few things we have to do is prepare the graphics for usage. In [src/data/graphics/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) you'll find the gTrainerSprites struct, we need to add the trainer to this. You can just copy the last trainer type defined and edit it, but this is what it does: Connects the trainer type with the image we defined earlier. + +So, finally, it needs to look like this: +```diff +define TRAINER_SPRITE(trainerPic, picFile, paletteFile, ...) \ + [trainerPic] = \ + { \ + .frontPic = {picFile, TRAINER_PIC_SIZE, trainerPic}, \ + .palette = {paletteFile, trainerPic}, \ + .mugshotCoords = {DEFAULT(0, __VA_ARGS__), DEFAULT_2(0, __VA_ARGS__)}, \ + .mugshotRotation = DEFAULT_3(0x200, __VA_ARGS__), \ + } + +const struct TrainerSprite gTrainerSprites[] = +{ + TRAINER_SPRITE(TRAINER_PIC_HIKER, gTrainerFrontPic_Hiker, gTrainerPalette_Hiker), + TRAINER_SPRITE(TRAINER_PIC_AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, gTrainerPalette_AquaGruntM), + ... + TRAINER_SPRITE(TRAINER_PIC_RS_MAY, gTrainerFrontPic_RubySapphireMay, gTrainerPalette_RubySapphireMay), + TRAINER_SPRITE(TRAINER_PIC_MY_TRAINER_CLASS, gTrainerFrontPic_myTrainerClass, gTrainerPalette_myTrainerClass) +}; +``` +### The Data +#### 4. Defining the trainer pic +Finally, let's bring it all together by defining our new trainer pic in [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h): + +```diff +#define TRAINER_PIC_RS_MAY 92 ++ #define TRAINER_PIC_MY_TRAINER_CLASS 93 + +#define TRAINER_BACK_PIC_BRENDAN 0 +#define TRAINER_BACK_PIC_MAY 1 +``` +Remember to count the number next to the trainer pic up by one! + +## Usage +You can test your trainer type by going to [src/data/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h) and changing a trainer type. For example: +```diff + [TRAINER_BRENDAN_PLACEHOLDER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_RS_PROTAG, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, +- .trainerPic = TRAINER_PIC_RS_BRENDAN, ++ .trainerPic = TRAINER_PIC_MY_TRAINER_CLASS, + .trainerName = _("BRENDAN"), + .items = {}, + .doubleBattle = FALSE, + .aiFlags = 0, + .partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder), + .party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder}, + }, +``` diff --git a/graphics/battle_anims/sprites/salt_particle.png b/graphics/battle_anims/sprites/salt_particle.png new file mode 100644 index 0000000000..a418f0a172 Binary files /dev/null and b/graphics/battle_anims/sprites/salt_particle.png differ diff --git a/graphics/battle_anims/sprites/starstorm_beam.png b/graphics/battle_anims/sprites/starstorm_beam.png new file mode 100644 index 0000000000..f4dced0a35 Binary files /dev/null and b/graphics/battle_anims/sprites/starstorm_beam.png differ diff --git a/graphics/dexnav/captured_all.png b/graphics/dexnav/captured_all.png new file mode 100644 index 0000000000..2ed8b40ca9 Binary files /dev/null and b/graphics/dexnav/captured_all.png differ diff --git a/graphics/dexnav/cursor.png b/graphics/dexnav/cursor.png new file mode 100644 index 0000000000..0b64cf95b8 Binary files /dev/null and b/graphics/dexnav/cursor.png differ diff --git a/graphics/dexnav/gui.pal b/graphics/dexnav/gui.pal new file mode 100644 index 0000000000..77939a5aba --- /dev/null +++ b/graphics/dexnav/gui.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 255 255 +217 73 73 +4 4 4 +1 81 113 +1 121 193 +119 177 75 +93 97 101 +91 179 211 +153 32 32 +111 141 81 +173 173 173 +187 217 167 +75 147 189 +177 219 235 +105 22 22 diff --git a/graphics/dexnav/gui_tilemap.bin b/graphics/dexnav/gui_tilemap.bin new file mode 100644 index 0000000000..0f62abbef9 Binary files /dev/null and b/graphics/dexnav/gui_tilemap.bin differ diff --git a/graphics/dexnav/gui_tiles.png b/graphics/dexnav/gui_tiles.png new file mode 100644 index 0000000000..4e3327b8ee Binary files /dev/null and b/graphics/dexnav/gui_tiles.png differ diff --git a/graphics/dexnav/hidden.png b/graphics/dexnav/hidden.png new file mode 100644 index 0000000000..2ad2e22e08 Binary files /dev/null and b/graphics/dexnav/hidden.png differ diff --git a/graphics/dexnav/hidden_search.png b/graphics/dexnav/hidden_search.png new file mode 100644 index 0000000000..d462ddef93 Binary files /dev/null and b/graphics/dexnav/hidden_search.png differ diff --git a/graphics/dexnav/no_data.png b/graphics/dexnav/no_data.png new file mode 100644 index 0000000000..a26515b5b1 Binary files /dev/null and b/graphics/dexnav/no_data.png differ diff --git a/graphics/dexnav/owned_icon.png b/graphics/dexnav/owned_icon.png new file mode 100644 index 0000000000..fdc5ef7113 Binary files /dev/null and b/graphics/dexnav/owned_icon.png differ diff --git a/graphics/dexnav/star.png b/graphics/dexnav/star.png new file mode 100644 index 0000000000..5d4b034a45 Binary files /dev/null and b/graphics/dexnav/star.png differ diff --git a/graphics/dexnav/vision.png b/graphics/dexnav/vision.png new file mode 100644 index 0000000000..74b6a14eed Binary files /dev/null and b/graphics/dexnav/vision.png differ diff --git a/graphics/field_effects/palettes/cave_dust.pal b/graphics/field_effects/palettes/cave_dust.pal new file mode 100644 index 0000000000..ed31236c4e --- /dev/null +++ b/graphics/field_effects/palettes/cave_dust.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 1 255 +159 122 85 +207 189 157 +199 181 149 +114 88 61 +132 101 70 +199 173 141 +225 209 193 +189 165 133 +181 149 115 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/field_effects/pics/cave_dust.png b/graphics/field_effects/pics/cave_dust.png new file mode 100644 index 0000000000..1f477c7803 Binary files /dev/null and b/graphics/field_effects/pics/cave_dust.png differ diff --git a/graphics/pokemon/abomasnow/mega/overworld.png b/graphics/pokemon/abomasnow/mega/overworld.png new file mode 100644 index 0000000000..319e37016e Binary files /dev/null and b/graphics/pokemon/abomasnow/mega/overworld.png differ diff --git a/graphics/pokemon/abomasnow/mega/overworld_normal.pal b/graphics/pokemon/abomasnow/mega/overworld_normal.pal new file mode 100644 index 0000000000..124ab1628b --- /dev/null +++ b/graphics/pokemon/abomasnow/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 72 56 +48 120 64 +50 86 102 +80 80 80 +122 122 122 +48 152 72 +120 120 152 +0 0 0 +160 168 200 +192 136 208 +184 192 208 +156 233 255 +216 216 232 +201 255 255 +232 232 248 diff --git a/graphics/pokemon/abomasnow/mega/overworld_shiny.pal b/graphics/pokemon/abomasnow/mega/overworld_shiny.pal new file mode 100644 index 0000000000..91c1c05271 --- /dev/null +++ b/graphics/pokemon/abomasnow/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +41 66 79 +26 113 141 +50 86 102 +80 80 80 +122 122 122 +16 141 183 +120 120 152 +0 0 0 +160 168 200 +192 136 208 +184 192 208 +156 233 255 +216 216 232 +201 255 255 +232 232 248 diff --git a/graphics/pokemon/absol/mega/overworld.png b/graphics/pokemon/absol/mega/overworld.png new file mode 100644 index 0000000000..609bcb4ff5 Binary files /dev/null and b/graphics/pokemon/absol/mega/overworld.png differ diff --git a/graphics/pokemon/absol/mega/overworld_normal.pal b/graphics/pokemon/absol/mega/overworld_normal.pal new file mode 100644 index 0000000000..f112d97f63 --- /dev/null +++ b/graphics/pokemon/absol/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +40 48 64 +64 72 88 +64 72 96 +128 32 32 +96 104 128 +120 128 160 +0 0 0 +176 184 200 +208 216 232 +232 232 248 +96 104 128 +120 128 160 +40 48 64 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/absol/mega/overworld_shiny.pal b/graphics/pokemon/absol/mega/overworld_shiny.pal new file mode 100644 index 0000000000..189f1f4771 --- /dev/null +++ b/graphics/pokemon/absol/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +72 32 40 +124 38 38 +64 72 96 +128 32 32 +192 56 56 +240 88 88 +0 0 0 +176 184 200 +208 216 232 +232 232 248 +96 104 128 +120 128 160 +40 48 64 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/aerodactyl/mega/overworld.png b/graphics/pokemon/aerodactyl/mega/overworld.png new file mode 100644 index 0000000000..286e436967 Binary files /dev/null and b/graphics/pokemon/aerodactyl/mega/overworld.png differ diff --git a/graphics/pokemon/aerodactyl/mega/overworld_normal.pal b/graphics/pokemon/aerodactyl/mega/overworld_normal.pal new file mode 100644 index 0000000000..1a4ef75e75 --- /dev/null +++ b/graphics/pokemon/aerodactyl/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +62 62 62 +96 16 16 +92 92 92 +72 64 96 +122 122 122 +128 88 128 +128 112 176 +0 0 0 +144 136 200 +184 136 192 +176 176 224 +200 200 208 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/aerodactyl/mega/overworld_shiny.pal b/graphics/pokemon/aerodactyl/mega/overworld_shiny.pal new file mode 100644 index 0000000000..a2869cb405 --- /dev/null +++ b/graphics/pokemon/aerodactyl/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +62 62 62 +96 16 16 +92 92 92 +72 64 96 +122 122 122 +79 76 138 +169 112 176 +0 0 0 +186 136 200 +112 116 222 +208 176 224 +200 200 208 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/aggron/mega/overworld.png b/graphics/pokemon/aggron/mega/overworld.png new file mode 100644 index 0000000000..fbceb62a39 Binary files /dev/null and b/graphics/pokemon/aggron/mega/overworld.png differ diff --git a/graphics/pokemon/aggron/mega/overworld_normal.pal b/graphics/pokemon/aggron/mega/overworld_normal.pal new file mode 100644 index 0000000000..e7ed20af2a --- /dev/null +++ b/graphics/pokemon/aggron/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +48 40 56 +72 64 80 +104 96 112 +97 97 120 +97 108 120 +208 88 88 +64 96 128 +104 144 200 +128 128 144 +153 153 174 +176 176 192 +0 0 0 +208 208 216 +232 232 248 +104 96 112 diff --git a/graphics/pokemon/aggron/mega/overworld_shiny.pal b/graphics/pokemon/aggron/mega/overworld_shiny.pal new file mode 100644 index 0000000000..8a3048a374 --- /dev/null +++ b/graphics/pokemon/aggron/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +16 56 48 +32 88 88 +48 128 120 +120 110 97 +120 99 97 +208 88 88 +64 96 128 +208 88 88 +64 167 157 +174 164 153 +192 185 176 +0 0 0 +216 212 208 +248 241 232 +108 105 100 diff --git a/graphics/pokemon/alakazam/mega/overworld.png b/graphics/pokemon/alakazam/mega/overworld.png new file mode 100644 index 0000000000..7eecdd28d6 Binary files /dev/null and b/graphics/pokemon/alakazam/mega/overworld.png differ diff --git a/graphics/pokemon/alakazam/mega/overworld_normal.pal b/graphics/pokemon/alakazam/mega/overworld_normal.pal new file mode 100644 index 0000000000..f9858b0bc4 --- /dev/null +++ b/graphics/pokemon/alakazam/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +37 37 40 +71 42 23 +111 79 63 +93 93 99 +144 120 56 +201 65 59 +144 109 96 +216 168 48 +248 216 96 +176 176 184 +176 176 188 +0 0 0 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/alakazam/mega/overworld_shiny.pal b/graphics/pokemon/alakazam/mega/overworld_shiny.pal new file mode 100644 index 0000000000..73211d068e --- /dev/null +++ b/graphics/pokemon/alakazam/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +37 37 40 +71 42 23 +142 72 100 +93 93 99 +144 120 56 +201 65 59 +193 103 130 +216 168 48 +248 216 96 +176 176 184 +176 176 188 +0 0 0 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/altaria/mega/overworld.png b/graphics/pokemon/altaria/mega/overworld.png new file mode 100644 index 0000000000..d85233b8ae Binary files /dev/null and b/graphics/pokemon/altaria/mega/overworld.png differ diff --git a/graphics/pokemon/altaria/mega/overworld_normal.pal b/graphics/pokemon/altaria/mega/overworld_normal.pal new file mode 100644 index 0000000000..af72a688cb --- /dev/null +++ b/graphics/pokemon/altaria/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +0 32 96 +0 64 104 +72 80 104 +40 104 152 +40 128 168 +112 128 144 +64 168 216 +96 192 232 +0 0 0 +168 176 192 +208 224 232 +248 248 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/altaria/mega/overworld_shiny.pal b/graphics/pokemon/altaria/mega/overworld_shiny.pal new file mode 100644 index 0000000000..b15eb80b80 --- /dev/null +++ b/graphics/pokemon/altaria/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +77 96 16 +104 95 18 +72 80 104 +151 146 55 +167 149 58 +112 128 144 +215 194 85 +231 209 115 +0 0 0 +168 176 192 +208 224 232 +248 248 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/ampharos/mega/overworld.png b/graphics/pokemon/ampharos/mega/overworld.png new file mode 100644 index 0000000000..c96d8e2bec Binary files /dev/null and b/graphics/pokemon/ampharos/mega/overworld.png differ diff --git a/graphics/pokemon/ampharos/mega/overworld_normal.pal b/graphics/pokemon/ampharos/mega/overworld_normal.pal new file mode 100644 index 0000000000..38bd7636cf --- /dev/null +++ b/graphics/pokemon/ampharos/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +104 88 8 +48 56 64 +80 96 112 +128 24 8 +184 56 16 +240 88 80 +152 128 24 +200 160 32 +240 208 88 +112 128 152 +136 152 176 +184 200 224 +0 0 0 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/ampharos/mega/overworld_shiny.pal b/graphics/pokemon/ampharos/mega/overworld_shiny.pal new file mode 100644 index 0000000000..53ddfe807a --- /dev/null +++ b/graphics/pokemon/ampharos/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +98 43 91 +48 56 64 +80 96 112 +8 62 128 +16 74 184 +80 165 240 +147 75 141 +187 98 185 +226 161 225 +112 128 152 +136 152 176 +184 200 224 +0 0 0 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/audino/mega/overworld.png b/graphics/pokemon/audino/mega/overworld.png new file mode 100644 index 0000000000..180d9a788d Binary files /dev/null and b/graphics/pokemon/audino/mega/overworld.png differ diff --git a/graphics/pokemon/audino/mega/overworld_normal.pal b/graphics/pokemon/audino/mega/overworld_normal.pal new file mode 100644 index 0000000000..e7058d01f2 --- /dev/null +++ b/graphics/pokemon/audino/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +112 64 72 +128 88 24 +184 144 24 +216 192 72 +226 115 139 +209 165 186 +0 0 0 +248 224 136 +240 202 222 +248 228 238 +248 248 248 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/audino/mega/overworld_shiny.pal b/graphics/pokemon/audino/mega/overworld_shiny.pal new file mode 100644 index 0000000000..71b23c24b6 --- /dev/null +++ b/graphics/pokemon/audino/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +112 64 104 +128 88 24 +184 144 24 +216 192 72 +184 144 24 +209 165 186 +0 0 0 +248 224 136 +233 202 240 +245 228 248 +248 248 248 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/banette/mega/overworld.png b/graphics/pokemon/banette/mega/overworld.png new file mode 100644 index 0000000000..cd5a63078e Binary files /dev/null and b/graphics/pokemon/banette/mega/overworld.png differ diff --git a/graphics/pokemon/banette/mega/overworld_normal.pal b/graphics/pokemon/banette/mega/overworld_normal.pal new file mode 100644 index 0000000000..f98360fa12 --- /dev/null +++ b/graphics/pokemon/banette/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +44 36 58 +72 56 16 +120 96 24 +71 58 87 +100 87 115 +160 128 40 +200 160 48 +178 90 154 +135 115 144 +213 106 188 +243 120 219 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/banette/mega/overworld_shiny.pal b/graphics/pokemon/banette/mega/overworld_shiny.pal new file mode 100644 index 0000000000..1ebf612ac2 --- /dev/null +++ b/graphics/pokemon/banette/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +32 59 58 +72 56 16 +120 96 24 +52 85 89 +81 114 117 +160 128 40 +200 160 48 +178 90 154 +109 135 146 +213 106 188 +243 120 219 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/beedrill/mega/overworld.png b/graphics/pokemon/beedrill/mega/overworld.png new file mode 100644 index 0000000000..8bc2cb6748 Binary files /dev/null and b/graphics/pokemon/beedrill/mega/overworld.png differ diff --git a/graphics/pokemon/beedrill/mega/overworld_normal.pal b/graphics/pokemon/beedrill/mega/overworld_normal.pal new file mode 100644 index 0000000000..660a716519 --- /dev/null +++ b/graphics/pokemon/beedrill/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +51 49 47 +51 50 47 +104 80 40 +80 80 80 +192 40 64 +183 143 49 +245 202 48 +144 144 144 +154 152 145 +245 231 171 +0 0 0 +192 192 192 +210 220 221 +232 232 248 +255 255 255 diff --git a/graphics/pokemon/beedrill/mega/overworld_shiny.pal b/graphics/pokemon/beedrill/mega/overworld_shiny.pal new file mode 100644 index 0000000000..8a6ca6e8e7 --- /dev/null +++ b/graphics/pokemon/beedrill/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +51 49 47 +51 50 47 +69 104 42 +80 80 80 +44 81 173 +100 183 54 +107 245 56 +144 144 144 +154 152 145 +245 231 171 +0 0 0 +192 192 192 +210 220 221 +232 232 248 +255 255 255 diff --git a/graphics/pokemon/blastoise/mega/overworld.png b/graphics/pokemon/blastoise/mega/overworld.png new file mode 100644 index 0000000000..ec3ad397c0 Binary files /dev/null and b/graphics/pokemon/blastoise/mega/overworld.png differ diff --git a/graphics/pokemon/blastoise/mega/overworld_normal.pal b/graphics/pokemon/blastoise/mega/overworld_normal.pal new file mode 100644 index 0000000000..58d6f0db2e --- /dev/null +++ b/graphics/pokemon/blastoise/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +72 40 8 +48 56 88 +80 80 80 +160 8 48 +128 80 8 +176 112 24 +152 136 80 +200 168 80 +240 200 80 +64 120 216 +112 152 224 +136 136 136 +184 184 184 +0 0 0 +232 232 248 diff --git a/graphics/pokemon/blastoise/mega/overworld_shiny.pal b/graphics/pokemon/blastoise/mega/overworld_shiny.pal new file mode 100644 index 0000000000..7bde8b938b --- /dev/null +++ b/graphics/pokemon/blastoise/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +56 67 11 +66 56 79 +80 80 80 +160 8 48 +86 118 14 +128 165 32 +152 136 80 +200 168 80 +240 200 80 +120 96 184 +154 135 200 +136 136 136 +184 184 184 +0 0 0 +232 232 248 diff --git a/graphics/pokemon/blaziken/mega/overworld.png b/graphics/pokemon/blaziken/mega/overworld.png new file mode 100644 index 0000000000..ec68330263 Binary files /dev/null and b/graphics/pokemon/blaziken/mega/overworld.png differ diff --git a/graphics/pokemon/blaziken/mega/overworld_normal.pal b/graphics/pokemon/blaziken/mega/overworld_normal.pal new file mode 100644 index 0000000000..243ecb7697 --- /dev/null +++ b/graphics/pokemon/blaziken/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +97 21 7 +114 42 38 +78 78 78 +112 88 64 +176 38 38 +219 60 53 +238 122 36 +237 106 99 +176 128 80 +208 184 88 +248 208 80 +32 96 184 +240 224 152 +255 242 183 +0 0 0 diff --git a/graphics/pokemon/blaziken/mega/overworld_shiny.pal b/graphics/pokemon/blaziken/mega/overworld_shiny.pal new file mode 100644 index 0000000000..cec00622de --- /dev/null +++ b/graphics/pokemon/blaziken/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +97 48 7 +114 42 38 +78 78 78 +112 88 64 +176 80 38 +219 110 53 +238 122 36 +237 148 99 +176 128 80 +208 184 88 +248 208 80 +32 96 184 +240 224 152 +255 242 183 +0 0 0 diff --git a/graphics/pokemon/camerupt/mega/overworld.png b/graphics/pokemon/camerupt/mega/overworld.png new file mode 100644 index 0000000000..38fd221e92 Binary files /dev/null and b/graphics/pokemon/camerupt/mega/overworld.png differ diff --git a/graphics/pokemon/camerupt/mega/overworld_normal.pal b/graphics/pokemon/camerupt/mega/overworld_normal.pal new file mode 100644 index 0000000000..395fb07c85 --- /dev/null +++ b/graphics/pokemon/camerupt/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +32 37 41 +88 32 32 +48 56 64 +96 85 64 +88 96 96 +178 53 27 +213 77 26 +227 111 51 +128 112 80 +217 132 42 +235 192 61 +160 152 120 +192 184 152 +0 0 0 +248 248 248 diff --git a/graphics/pokemon/camerupt/mega/overworld_shiny.pal b/graphics/pokemon/camerupt/mega/overworld_shiny.pal new file mode 100644 index 0000000000..2de7faa9aa --- /dev/null +++ b/graphics/pokemon/camerupt/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +32 37 41 +57 57 62 +48 56 64 +96 85 64 +88 96 96 +96 94 118 +213 77 26 +142 134 159 +128 112 80 +217 132 42 +235 192 61 +160 152 120 +192 184 152 +0 0 0 +248 248 248 diff --git a/graphics/pokemon/charizard/mega_x/overworld.png b/graphics/pokemon/charizard/mega_x/overworld.png new file mode 100644 index 0000000000..47ef85b671 Binary files /dev/null and b/graphics/pokemon/charizard/mega_x/overworld.png differ diff --git a/graphics/pokemon/charizard/mega_x/overworld_normal.pal b/graphics/pokemon/charizard/mega_x/overworld_normal.pal new file mode 100644 index 0000000000..32de717e27 --- /dev/null +++ b/graphics/pokemon/charizard/mega_x/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +30 31 36 +80 29 52 +126 40 64 +74 78 90 +91 94 103 +107 109 115 +40 96 142 +74 132 189 +57 173 255 +126 178 213 +160 160 160 +0 0 0 +149 209 241 +165 231 255 +216 216 248 diff --git a/graphics/pokemon/charizard/mega_x/overworld_shiny.pal b/graphics/pokemon/charizard/mega_x/overworld_shiny.pal new file mode 100644 index 0000000000..ca80ec4de0 --- /dev/null +++ b/graphics/pokemon/charizard/mega_x/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +30 31 36 +80 29 52 +126 40 64 +45 83 75 +62 116 105 +71 136 123 +142 40 54 +189 74 84 +57 173 255 +126 178 213 +160 160 160 +0 0 0 +149 209 241 +165 231 255 +216 216 248 diff --git a/graphics/pokemon/charizard/mega_y/overworld.png b/graphics/pokemon/charizard/mega_y/overworld.png new file mode 100644 index 0000000000..ec153e5a30 Binary files /dev/null and b/graphics/pokemon/charizard/mega_y/overworld.png differ diff --git a/graphics/pokemon/charizard/mega_y/overworld_normal.pal b/graphics/pokemon/charizard/mega_y/overworld_normal.pal new file mode 100644 index 0000000000..7bf6f4e8ef --- /dev/null +++ b/graphics/pokemon/charizard/mega_y/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +96 48 0 +96 64 0 +40 72 88 +192 16 32 +144 64 32 +200 88 40 +248 120 56 +248 184 16 +216 168 48 +240 208 112 +64 128 128 +160 160 160 +0 0 0 +216 216 248 +0 0 0 diff --git a/graphics/pokemon/charizard/mega_y/overworld_shiny.pal b/graphics/pokemon/charizard/mega_y/overworld_shiny.pal new file mode 100644 index 0000000000..6aedfdfd26 --- /dev/null +++ b/graphics/pokemon/charizard/mega_y/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +53 34 65 +77 76 80 +118 33 45 +192 16 32 +86 72 106 +115 96 142 +146 122 178 +248 184 16 +163 161 167 +196 194 199 +160 61 70 +160 160 160 +0 0 0 +216 216 248 +0 0 0 diff --git a/graphics/pokemon/diancie/mega/overworld.png b/graphics/pokemon/diancie/mega/overworld.png new file mode 100644 index 0000000000..2843e4fc33 Binary files /dev/null and b/graphics/pokemon/diancie/mega/overworld.png differ diff --git a/graphics/pokemon/diancie/mega/overworld_normal.pal b/graphics/pokemon/diancie/mega/overworld_normal.pal new file mode 100644 index 0000000000..004fc37319 --- /dev/null +++ b/graphics/pokemon/diancie/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +45 46 58 +75 77 101 +167 41 91 +198 152 98 +116 120 150 +217 95 170 +182 166 178 +227 199 137 +242 154 218 +0 0 0 +225 213 222 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/diancie/mega/overworld_shiny.pal b/graphics/pokemon/diancie/mega/overworld_shiny.pal new file mode 100644 index 0000000000..32e0636913 --- /dev/null +++ b/graphics/pokemon/diancie/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +45 46 58 +144 36 77 +161 42 109 +198 152 98 +116 120 150 +217 100 143 +211 127 159 +227 199 137 +243 148 184 +0 0 0 +255 177 207 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/furfrou/dandy_trim/anim_front.png b/graphics/pokemon/furfrou/dandy/anim_front.png similarity index 100% rename from graphics/pokemon/furfrou/dandy_trim/anim_front.png rename to graphics/pokemon/furfrou/dandy/anim_front.png diff --git a/graphics/pokemon/furfrou/dandy_trim/back.png b/graphics/pokemon/furfrou/dandy/back.png similarity index 100% rename from graphics/pokemon/furfrou/dandy_trim/back.png rename to graphics/pokemon/furfrou/dandy/back.png diff --git a/graphics/pokemon/furfrou/dandy_trim/icon.png b/graphics/pokemon/furfrou/dandy/icon.png similarity index 100% rename from graphics/pokemon/furfrou/dandy_trim/icon.png rename to graphics/pokemon/furfrou/dandy/icon.png diff --git a/graphics/pokemon/furfrou/dandy_trim/normal.pal b/graphics/pokemon/furfrou/dandy/normal.pal similarity index 100% rename from graphics/pokemon/furfrou/dandy_trim/normal.pal rename to graphics/pokemon/furfrou/dandy/normal.pal diff --git a/graphics/pokemon/furfrou/dandy_trim/overworld.png b/graphics/pokemon/furfrou/dandy/overworld.png similarity index 100% rename from graphics/pokemon/furfrou/dandy_trim/overworld.png rename to graphics/pokemon/furfrou/dandy/overworld.png diff --git a/graphics/pokemon/furfrou/dandy_trim/overworld_normal.pal b/graphics/pokemon/furfrou/dandy/overworld_normal.pal similarity index 100% rename from graphics/pokemon/furfrou/dandy_trim/overworld_normal.pal rename to graphics/pokemon/furfrou/dandy/overworld_normal.pal diff --git a/graphics/pokemon/furfrou/dandy_trim/overworld_shiny.pal b/graphics/pokemon/furfrou/dandy/overworld_shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/dandy_trim/overworld_shiny.pal rename to graphics/pokemon/furfrou/dandy/overworld_shiny.pal diff --git a/graphics/pokemon/furfrou/dandy_trim/shiny.pal b/graphics/pokemon/furfrou/dandy/shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/dandy_trim/shiny.pal rename to graphics/pokemon/furfrou/dandy/shiny.pal diff --git a/graphics/pokemon/furfrou/debutante_trim/anim_front.png b/graphics/pokemon/furfrou/debutante/anim_front.png similarity index 100% rename from graphics/pokemon/furfrou/debutante_trim/anim_front.png rename to graphics/pokemon/furfrou/debutante/anim_front.png diff --git a/graphics/pokemon/furfrou/debutante_trim/back.png b/graphics/pokemon/furfrou/debutante/back.png similarity index 100% rename from graphics/pokemon/furfrou/debutante_trim/back.png rename to graphics/pokemon/furfrou/debutante/back.png diff --git a/graphics/pokemon/furfrou/debutante_trim/icon.png b/graphics/pokemon/furfrou/debutante/icon.png similarity index 100% rename from graphics/pokemon/furfrou/debutante_trim/icon.png rename to graphics/pokemon/furfrou/debutante/icon.png diff --git a/graphics/pokemon/furfrou/debutante_trim/normal.pal b/graphics/pokemon/furfrou/debutante/normal.pal similarity index 100% rename from graphics/pokemon/furfrou/debutante_trim/normal.pal rename to graphics/pokemon/furfrou/debutante/normal.pal diff --git a/graphics/pokemon/furfrou/debutante_trim/overworld.png b/graphics/pokemon/furfrou/debutante/overworld.png similarity index 100% rename from graphics/pokemon/furfrou/debutante_trim/overworld.png rename to graphics/pokemon/furfrou/debutante/overworld.png diff --git a/graphics/pokemon/furfrou/debutante_trim/overworld_normal.pal b/graphics/pokemon/furfrou/debutante/overworld_normal.pal similarity index 100% rename from graphics/pokemon/furfrou/debutante_trim/overworld_normal.pal rename to graphics/pokemon/furfrou/debutante/overworld_normal.pal diff --git a/graphics/pokemon/furfrou/debutante_trim/overworld_shiny.pal b/graphics/pokemon/furfrou/debutante/overworld_shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/debutante_trim/overworld_shiny.pal rename to graphics/pokemon/furfrou/debutante/overworld_shiny.pal diff --git a/graphics/pokemon/furfrou/debutante_trim/shiny.pal b/graphics/pokemon/furfrou/debutante/shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/debutante_trim/shiny.pal rename to graphics/pokemon/furfrou/debutante/shiny.pal diff --git a/graphics/pokemon/furfrou/diamond_trim/anim_front.png b/graphics/pokemon/furfrou/diamond/anim_front.png similarity index 100% rename from graphics/pokemon/furfrou/diamond_trim/anim_front.png rename to graphics/pokemon/furfrou/diamond/anim_front.png diff --git a/graphics/pokemon/furfrou/diamond_trim/back.png b/graphics/pokemon/furfrou/diamond/back.png similarity index 100% rename from graphics/pokemon/furfrou/diamond_trim/back.png rename to graphics/pokemon/furfrou/diamond/back.png diff --git a/graphics/pokemon/furfrou/diamond_trim/icon.png b/graphics/pokemon/furfrou/diamond/icon.png similarity index 100% rename from graphics/pokemon/furfrou/diamond_trim/icon.png rename to graphics/pokemon/furfrou/diamond/icon.png diff --git a/graphics/pokemon/furfrou/diamond_trim/normal.pal b/graphics/pokemon/furfrou/diamond/normal.pal similarity index 100% rename from graphics/pokemon/furfrou/diamond_trim/normal.pal rename to graphics/pokemon/furfrou/diamond/normal.pal diff --git a/graphics/pokemon/furfrou/diamond_trim/overworld.png b/graphics/pokemon/furfrou/diamond/overworld.png similarity index 100% rename from graphics/pokemon/furfrou/diamond_trim/overworld.png rename to graphics/pokemon/furfrou/diamond/overworld.png diff --git a/graphics/pokemon/furfrou/diamond_trim/overworld_normal.pal b/graphics/pokemon/furfrou/diamond/overworld_normal.pal similarity index 100% rename from graphics/pokemon/furfrou/diamond_trim/overworld_normal.pal rename to graphics/pokemon/furfrou/diamond/overworld_normal.pal diff --git a/graphics/pokemon/furfrou/diamond_trim/overworld_shiny.pal b/graphics/pokemon/furfrou/diamond/overworld_shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/diamond_trim/overworld_shiny.pal rename to graphics/pokemon/furfrou/diamond/overworld_shiny.pal diff --git a/graphics/pokemon/furfrou/diamond_trim/shiny.pal b/graphics/pokemon/furfrou/diamond/shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/diamond_trim/shiny.pal rename to graphics/pokemon/furfrou/diamond/shiny.pal diff --git a/graphics/pokemon/furfrou/heart_trim/anim_front.png b/graphics/pokemon/furfrou/heart/anim_front.png similarity index 100% rename from graphics/pokemon/furfrou/heart_trim/anim_front.png rename to graphics/pokemon/furfrou/heart/anim_front.png diff --git a/graphics/pokemon/furfrou/heart_trim/back.png b/graphics/pokemon/furfrou/heart/back.png similarity index 100% rename from graphics/pokemon/furfrou/heart_trim/back.png rename to graphics/pokemon/furfrou/heart/back.png diff --git a/graphics/pokemon/furfrou/heart_trim/icon.png b/graphics/pokemon/furfrou/heart/icon.png similarity index 100% rename from graphics/pokemon/furfrou/heart_trim/icon.png rename to graphics/pokemon/furfrou/heart/icon.png diff --git a/graphics/pokemon/furfrou/heart_trim/normal.pal b/graphics/pokemon/furfrou/heart/normal.pal similarity index 100% rename from graphics/pokemon/furfrou/heart_trim/normal.pal rename to graphics/pokemon/furfrou/heart/normal.pal diff --git a/graphics/pokemon/furfrou/heart_trim/overworld.png b/graphics/pokemon/furfrou/heart/overworld.png similarity index 100% rename from graphics/pokemon/furfrou/heart_trim/overworld.png rename to graphics/pokemon/furfrou/heart/overworld.png diff --git a/graphics/pokemon/furfrou/heart_trim/overworld_normal.pal b/graphics/pokemon/furfrou/heart/overworld_normal.pal similarity index 100% rename from graphics/pokemon/furfrou/heart_trim/overworld_normal.pal rename to graphics/pokemon/furfrou/heart/overworld_normal.pal diff --git a/graphics/pokemon/furfrou/heart_trim/overworld_shiny.pal b/graphics/pokemon/furfrou/heart/overworld_shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/heart_trim/overworld_shiny.pal rename to graphics/pokemon/furfrou/heart/overworld_shiny.pal diff --git a/graphics/pokemon/furfrou/heart_trim/shiny.pal b/graphics/pokemon/furfrou/heart/shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/heart_trim/shiny.pal rename to graphics/pokemon/furfrou/heart/shiny.pal diff --git a/graphics/pokemon/furfrou/kabuki_trim/anim_front.png b/graphics/pokemon/furfrou/kabuki/anim_front.png similarity index 100% rename from graphics/pokemon/furfrou/kabuki_trim/anim_front.png rename to graphics/pokemon/furfrou/kabuki/anim_front.png diff --git a/graphics/pokemon/furfrou/kabuki_trim/back.png b/graphics/pokemon/furfrou/kabuki/back.png similarity index 100% rename from graphics/pokemon/furfrou/kabuki_trim/back.png rename to graphics/pokemon/furfrou/kabuki/back.png diff --git a/graphics/pokemon/furfrou/kabuki_trim/icon.png b/graphics/pokemon/furfrou/kabuki/icon.png similarity index 100% rename from graphics/pokemon/furfrou/kabuki_trim/icon.png rename to graphics/pokemon/furfrou/kabuki/icon.png diff --git a/graphics/pokemon/furfrou/kabuki_trim/normal.pal b/graphics/pokemon/furfrou/kabuki/normal.pal similarity index 100% rename from graphics/pokemon/furfrou/kabuki_trim/normal.pal rename to graphics/pokemon/furfrou/kabuki/normal.pal diff --git a/graphics/pokemon/furfrou/kabuki_trim/overworld.png b/graphics/pokemon/furfrou/kabuki/overworld.png similarity index 100% rename from graphics/pokemon/furfrou/kabuki_trim/overworld.png rename to graphics/pokemon/furfrou/kabuki/overworld.png diff --git a/graphics/pokemon/furfrou/kabuki_trim/overworld_normal.pal b/graphics/pokemon/furfrou/kabuki/overworld_normal.pal similarity index 100% rename from graphics/pokemon/furfrou/kabuki_trim/overworld_normal.pal rename to graphics/pokemon/furfrou/kabuki/overworld_normal.pal diff --git a/graphics/pokemon/furfrou/kabuki_trim/overworld_shiny.pal b/graphics/pokemon/furfrou/kabuki/overworld_shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/kabuki_trim/overworld_shiny.pal rename to graphics/pokemon/furfrou/kabuki/overworld_shiny.pal diff --git a/graphics/pokemon/furfrou/kabuki_trim/shiny.pal b/graphics/pokemon/furfrou/kabuki/shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/kabuki_trim/shiny.pal rename to graphics/pokemon/furfrou/kabuki/shiny.pal diff --git a/graphics/pokemon/furfrou/la_reine_trim/anim_front.png b/graphics/pokemon/furfrou/la_reine/anim_front.png similarity index 100% rename from graphics/pokemon/furfrou/la_reine_trim/anim_front.png rename to graphics/pokemon/furfrou/la_reine/anim_front.png diff --git a/graphics/pokemon/furfrou/la_reine_trim/back.png b/graphics/pokemon/furfrou/la_reine/back.png similarity index 100% rename from graphics/pokemon/furfrou/la_reine_trim/back.png rename to graphics/pokemon/furfrou/la_reine/back.png diff --git a/graphics/pokemon/furfrou/la_reine_trim/icon.png b/graphics/pokemon/furfrou/la_reine/icon.png similarity index 100% rename from graphics/pokemon/furfrou/la_reine_trim/icon.png rename to graphics/pokemon/furfrou/la_reine/icon.png diff --git a/graphics/pokemon/furfrou/la_reine_trim/normal.pal b/graphics/pokemon/furfrou/la_reine/normal.pal similarity index 100% rename from graphics/pokemon/furfrou/la_reine_trim/normal.pal rename to graphics/pokemon/furfrou/la_reine/normal.pal diff --git a/graphics/pokemon/furfrou/la_reine_trim/overworld.png b/graphics/pokemon/furfrou/la_reine/overworld.png similarity index 100% rename from graphics/pokemon/furfrou/la_reine_trim/overworld.png rename to graphics/pokemon/furfrou/la_reine/overworld.png diff --git a/graphics/pokemon/furfrou/la_reine_trim/overworld_normal.pal b/graphics/pokemon/furfrou/la_reine/overworld_normal.pal similarity index 100% rename from graphics/pokemon/furfrou/la_reine_trim/overworld_normal.pal rename to graphics/pokemon/furfrou/la_reine/overworld_normal.pal diff --git a/graphics/pokemon/furfrou/la_reine_trim/overworld_shiny.pal b/graphics/pokemon/furfrou/la_reine/overworld_shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/la_reine_trim/overworld_shiny.pal rename to graphics/pokemon/furfrou/la_reine/overworld_shiny.pal diff --git a/graphics/pokemon/furfrou/la_reine_trim/shiny.pal b/graphics/pokemon/furfrou/la_reine/shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/la_reine_trim/shiny.pal rename to graphics/pokemon/furfrou/la_reine/shiny.pal diff --git a/graphics/pokemon/furfrou/matron_trim/anim_front.png b/graphics/pokemon/furfrou/matron/anim_front.png similarity index 100% rename from graphics/pokemon/furfrou/matron_trim/anim_front.png rename to graphics/pokemon/furfrou/matron/anim_front.png diff --git a/graphics/pokemon/furfrou/matron_trim/back.png b/graphics/pokemon/furfrou/matron/back.png similarity index 100% rename from graphics/pokemon/furfrou/matron_trim/back.png rename to graphics/pokemon/furfrou/matron/back.png diff --git a/graphics/pokemon/furfrou/matron_trim/icon.png b/graphics/pokemon/furfrou/matron/icon.png similarity index 100% rename from graphics/pokemon/furfrou/matron_trim/icon.png rename to graphics/pokemon/furfrou/matron/icon.png diff --git a/graphics/pokemon/furfrou/matron_trim/normal.pal b/graphics/pokemon/furfrou/matron/normal.pal similarity index 100% rename from graphics/pokemon/furfrou/matron_trim/normal.pal rename to graphics/pokemon/furfrou/matron/normal.pal diff --git a/graphics/pokemon/furfrou/matron_trim/overworld.png b/graphics/pokemon/furfrou/matron/overworld.png similarity index 100% rename from graphics/pokemon/furfrou/matron_trim/overworld.png rename to graphics/pokemon/furfrou/matron/overworld.png diff --git a/graphics/pokemon/furfrou/matron_trim/overworld_normal.pal b/graphics/pokemon/furfrou/matron/overworld_normal.pal similarity index 100% rename from graphics/pokemon/furfrou/matron_trim/overworld_normal.pal rename to graphics/pokemon/furfrou/matron/overworld_normal.pal diff --git a/graphics/pokemon/furfrou/matron_trim/overworld_shiny.pal b/graphics/pokemon/furfrou/matron/overworld_shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/matron_trim/overworld_shiny.pal rename to graphics/pokemon/furfrou/matron/overworld_shiny.pal diff --git a/graphics/pokemon/furfrou/matron_trim/shiny.pal b/graphics/pokemon/furfrou/matron/shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/matron_trim/shiny.pal rename to graphics/pokemon/furfrou/matron/shiny.pal diff --git a/graphics/pokemon/furfrou/pharaoh_trim/anim_front.png b/graphics/pokemon/furfrou/pharaoh/anim_front.png similarity index 100% rename from graphics/pokemon/furfrou/pharaoh_trim/anim_front.png rename to graphics/pokemon/furfrou/pharaoh/anim_front.png diff --git a/graphics/pokemon/furfrou/pharaoh_trim/back.png b/graphics/pokemon/furfrou/pharaoh/back.png similarity index 100% rename from graphics/pokemon/furfrou/pharaoh_trim/back.png rename to graphics/pokemon/furfrou/pharaoh/back.png diff --git a/graphics/pokemon/furfrou/pharaoh_trim/icon.png b/graphics/pokemon/furfrou/pharaoh/icon.png similarity index 100% rename from graphics/pokemon/furfrou/pharaoh_trim/icon.png rename to graphics/pokemon/furfrou/pharaoh/icon.png diff --git a/graphics/pokemon/furfrou/pharaoh_trim/normal.pal b/graphics/pokemon/furfrou/pharaoh/normal.pal similarity index 100% rename from graphics/pokemon/furfrou/pharaoh_trim/normal.pal rename to graphics/pokemon/furfrou/pharaoh/normal.pal diff --git a/graphics/pokemon/furfrou/pharaoh_trim/overworld.png b/graphics/pokemon/furfrou/pharaoh/overworld.png similarity index 100% rename from graphics/pokemon/furfrou/pharaoh_trim/overworld.png rename to graphics/pokemon/furfrou/pharaoh/overworld.png diff --git a/graphics/pokemon/furfrou/pharaoh_trim/overworld_normal.pal b/graphics/pokemon/furfrou/pharaoh/overworld_normal.pal similarity index 100% rename from graphics/pokemon/furfrou/pharaoh_trim/overworld_normal.pal rename to graphics/pokemon/furfrou/pharaoh/overworld_normal.pal diff --git a/graphics/pokemon/furfrou/pharaoh_trim/overworld_shiny.pal b/graphics/pokemon/furfrou/pharaoh/overworld_shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/pharaoh_trim/overworld_shiny.pal rename to graphics/pokemon/furfrou/pharaoh/overworld_shiny.pal diff --git a/graphics/pokemon/furfrou/pharaoh_trim/shiny.pal b/graphics/pokemon/furfrou/pharaoh/shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/pharaoh_trim/shiny.pal rename to graphics/pokemon/furfrou/pharaoh/shiny.pal diff --git a/graphics/pokemon/furfrou/star_trim/anim_front.png b/graphics/pokemon/furfrou/star/anim_front.png similarity index 100% rename from graphics/pokemon/furfrou/star_trim/anim_front.png rename to graphics/pokemon/furfrou/star/anim_front.png diff --git a/graphics/pokemon/furfrou/star_trim/back.png b/graphics/pokemon/furfrou/star/back.png similarity index 100% rename from graphics/pokemon/furfrou/star_trim/back.png rename to graphics/pokemon/furfrou/star/back.png diff --git a/graphics/pokemon/furfrou/star_trim/icon.png b/graphics/pokemon/furfrou/star/icon.png similarity index 100% rename from graphics/pokemon/furfrou/star_trim/icon.png rename to graphics/pokemon/furfrou/star/icon.png diff --git a/graphics/pokemon/furfrou/star_trim/normal.pal b/graphics/pokemon/furfrou/star/normal.pal similarity index 100% rename from graphics/pokemon/furfrou/star_trim/normal.pal rename to graphics/pokemon/furfrou/star/normal.pal diff --git a/graphics/pokemon/furfrou/star_trim/overworld.png b/graphics/pokemon/furfrou/star/overworld.png similarity index 100% rename from graphics/pokemon/furfrou/star_trim/overworld.png rename to graphics/pokemon/furfrou/star/overworld.png diff --git a/graphics/pokemon/furfrou/star_trim/overworld_normal.pal b/graphics/pokemon/furfrou/star/overworld_normal.pal similarity index 100% rename from graphics/pokemon/furfrou/star_trim/overworld_normal.pal rename to graphics/pokemon/furfrou/star/overworld_normal.pal diff --git a/graphics/pokemon/furfrou/star_trim/overworld_shiny.pal b/graphics/pokemon/furfrou/star/overworld_shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/star_trim/overworld_shiny.pal rename to graphics/pokemon/furfrou/star/overworld_shiny.pal diff --git a/graphics/pokemon/furfrou/star_trim/shiny.pal b/graphics/pokemon/furfrou/star/shiny.pal similarity index 100% rename from graphics/pokemon/furfrou/star_trim/shiny.pal rename to graphics/pokemon/furfrou/star/shiny.pal diff --git a/graphics/pokemon/gallade/mega/overworld.png b/graphics/pokemon/gallade/mega/overworld.png new file mode 100644 index 0000000000..7efa8f18b2 Binary files /dev/null and b/graphics/pokemon/gallade/mega/overworld.png differ diff --git a/graphics/pokemon/gallade/mega/overworld_normal.pal b/graphics/pokemon/gallade/mega/overworld_normal.pal new file mode 100644 index 0000000000..6e6012ba48 --- /dev/null +++ b/graphics/pokemon/gallade/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +88 22 39 +0 72 16 +24 104 96 +72 72 80 +128 32 56 +184 48 72 +222 65 90 +24 144 48 +48 176 64 +23 175 192 +104 200 224 +136 136 152 +0 0 0 +208 208 224 +232 232 248 diff --git a/graphics/pokemon/gallade/mega/overworld_shiny.pal b/graphics/pokemon/gallade/mega/overworld_shiny.pal new file mode 100644 index 0000000000..ba676df6c8 --- /dev/null +++ b/graphics/pokemon/gallade/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +110 43 28 +0 37 72 +54 69 73 +72 72 80 +174 69 44 +229 114 66 +242 135 82 +24 88 144 +48 125 176 +87 112 128 +149 164 178 +136 136 152 +0 0 0 +208 208 224 +232 232 248 diff --git a/graphics/pokemon/garchomp/mega/overworld.png b/graphics/pokemon/garchomp/mega/overworld.png new file mode 100644 index 0000000000..47c06907fc Binary files /dev/null and b/graphics/pokemon/garchomp/mega/overworld.png differ diff --git a/graphics/pokemon/garchomp/mega/overworld_normal.pal b/graphics/pokemon/garchomp/mega/overworld_normal.pal new file mode 100644 index 0000000000..8cb1c3d56f --- /dev/null +++ b/graphics/pokemon/garchomp/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 48 80 +72 80 120 +104 104 104 +128 48 16 +184 64 24 +192 152 0 +248 224 8 +96 112 160 +120 152 200 +168 168 168 +0 0 0 +232 232 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/garchomp/mega/overworld_shiny.pal b/graphics/pokemon/garchomp/mega/overworld_shiny.pal new file mode 100644 index 0000000000..7b8bc45d81 --- /dev/null +++ b/graphics/pokemon/garchomp/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +80 48 73 +120 72 118 +104 104 104 +122 35 93 +177 52 139 +192 152 0 +248 224 8 +157 96 160 +185 120 200 +168 168 168 +0 0 0 +232 232 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/gardevoir/mega/overworld.png b/graphics/pokemon/gardevoir/mega/overworld.png new file mode 100644 index 0000000000..77fbfb4c43 Binary files /dev/null and b/graphics/pokemon/gardevoir/mega/overworld.png differ diff --git a/graphics/pokemon/gardevoir/mega/overworld_normal.pal b/graphics/pokemon/gardevoir/mega/overworld_normal.pal new file mode 100644 index 0000000000..bad96ae0c4 --- /dev/null +++ b/graphics/pokemon/gardevoir/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +16 64 32 +72 72 80 +128 32 56 +184 48 72 +240 104 104 +40 128 56 +72 176 88 +104 200 128 +128 128 144 +168 168 176 +0 0 0 +200 200 216 +232 232 248 +200 200 216 +168 168 176 diff --git a/graphics/pokemon/gardevoir/mega/overworld_shiny.pal b/graphics/pokemon/gardevoir/mega/overworld_shiny.pal new file mode 100644 index 0000000000..471722d4e8 --- /dev/null +++ b/graphics/pokemon/gardevoir/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +48 64 80 +48 48 48 +152 96 48 +216 136 64 +240 176 80 +72 166 198 +122 207 217 +158 217 241 +128 128 144 +208 192 216 +0 0 0 +232 216 248 +248 248 248 +96 104 120 +48 64 80 diff --git a/graphics/pokemon/gengar/mega/overworld.png b/graphics/pokemon/gengar/mega/overworld.png new file mode 100644 index 0000000000..40390d4aa1 Binary files /dev/null and b/graphics/pokemon/gengar/mega/overworld.png differ diff --git a/graphics/pokemon/gengar/mega/overworld_normal.pal b/graphics/pokemon/gengar/mega/overworld_normal.pal new file mode 100644 index 0000000000..baacd711d7 --- /dev/null +++ b/graphics/pokemon/gengar/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +57 42 72 +87 59 107 +96 66 116 +200 16 40 +179 124 91 +213 83 98 +230 160 26 +158 81 143 +130 97 153 +221 97 170 +177 155 189 +0 0 0 +216 202 224 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/gengar/mega/overworld_shiny.pal b/graphics/pokemon/gengar/mega/overworld_shiny.pal new file mode 100644 index 0000000000..69259927f8 --- /dev/null +++ b/graphics/pokemon/gengar/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +108 108 108 +147 147 147 +178 178 178 +200 16 40 +179 124 91 +75 75 75 +230 160 26 +224 139 211 +231 231 231 +251 159 231 +205 183 216 +0 0 0 +236 226 241 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/glalie/mega/overworld.png b/graphics/pokemon/glalie/mega/overworld.png new file mode 100644 index 0000000000..a36606538e Binary files /dev/null and b/graphics/pokemon/glalie/mega/overworld.png differ diff --git a/graphics/pokemon/glalie/mega/overworld_normal.pal b/graphics/pokemon/glalie/mega/overworld_normal.pal new file mode 100644 index 0000000000..e10d60b62e --- /dev/null +++ b/graphics/pokemon/glalie/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +29 29 33 +40 40 56 +57 57 65 +34 82 113 +86 86 90 +80 80 96 +218 21 21 +112 120 136 +40 129 192 +98 189 238 +152 160 176 +169 175 188 +0 0 0 +215 221 220 +197 205 230 diff --git a/graphics/pokemon/glalie/mega/overworld_shiny.pal b/graphics/pokemon/glalie/mega/overworld_shiny.pal new file mode 100644 index 0000000000..da25f12f0b --- /dev/null +++ b/graphics/pokemon/glalie/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +29 29 33 +40 40 56 +57 57 65 +34 82 113 +86 86 90 +80 80 96 +218 21 21 +112 120 136 +186 98 71 +98 189 238 +152 160 176 +169 175 188 +0 0 0 +215 221 220 +197 205 230 diff --git a/graphics/pokemon/groudon/primal/overworld.png b/graphics/pokemon/groudon/primal/overworld.png new file mode 100644 index 0000000000..79dbede948 Binary files /dev/null and b/graphics/pokemon/groudon/primal/overworld.png differ diff --git a/graphics/pokemon/groudon/primal/overworld_normal.pal b/graphics/pokemon/groudon/primal/overworld_normal.pal new file mode 100644 index 0000000000..95041cbb07 --- /dev/null +++ b/graphics/pokemon/groudon/primal/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +19 21 27 +32 40 56 +48 51 59 +114 10 16 +53 57 66 +61 67 72 +66 70 80 +98 98 106 +190 23 38 +234 48 77 +250 94 117 +238 102 102 +229 229 166 +184 200 216 +0 0 0 diff --git a/graphics/pokemon/groudon/primal/overworld_shiny.pal b/graphics/pokemon/groudon/primal/overworld_shiny.pal new file mode 100644 index 0000000000..7f44addd16 --- /dev/null +++ b/graphics/pokemon/groudon/primal/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +19 21 27 +32 40 56 +48 51 59 +37 37 37 +53 57 66 +61 67 72 +66 70 80 +98 98 106 +64 64 64 +84 84 84 +103 103 103 +238 102 102 +229 229 166 +184 200 216 +0 0 0 diff --git a/graphics/pokemon/gyarados/mega/overworld.png b/graphics/pokemon/gyarados/mega/overworld.png new file mode 100644 index 0000000000..e204b06025 Binary files /dev/null and b/graphics/pokemon/gyarados/mega/overworld.png differ diff --git a/graphics/pokemon/gyarados/mega/overworld_normal.pal b/graphics/pokemon/gyarados/mega/overworld_normal.pal new file mode 100644 index 0000000000..88ab19a395 --- /dev/null +++ b/graphics/pokemon/gyarados/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +24 24 24 +48 48 48 +64 0 12 +88 63 20 +48 56 80 +80 72 72 +136 0 24 +190 74 114 +179 138 49 +252 218 116 +32 96 128 +64 120 152 +68 161 233 +0 0 0 +198 198 214 diff --git a/graphics/pokemon/gyarados/mega/overworld_shiny.pal b/graphics/pokemon/gyarados/mega/overworld_shiny.pal new file mode 100644 index 0000000000..06527bc415 --- /dev/null +++ b/graphics/pokemon/gyarados/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +146 124 78 +220 202 148 +64 0 12 +88 63 20 +79 37 49 +239 57 106 +136 0 24 +190 74 114 +179 138 49 +252 218 116 +128 24 56 +159 53 84 +239 57 106 +0 0 0 +198 198 214 diff --git a/graphics/pokemon/heracross/mega/overworld.png b/graphics/pokemon/heracross/mega/overworld.png new file mode 100644 index 0000000000..dc10314d1c Binary files /dev/null and b/graphics/pokemon/heracross/mega/overworld.png differ diff --git a/graphics/pokemon/heracross/mega/overworld_normal.pal b/graphics/pokemon/heracross/mega/overworld_normal.pal new file mode 100644 index 0000000000..f8e603f12d --- /dev/null +++ b/graphics/pokemon/heracross/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +16 16 16 +8 48 64 +16 72 96 +32 96 120 +176 40 48 +224 32 56 +152 88 0 +248 96 120 +216 136 8 +240 176 64 +56 120 144 +80 152 176 +128 192 200 +0 0 0 +248 248 248 diff --git a/graphics/pokemon/heracross/mega/overworld_shiny.pal b/graphics/pokemon/heracross/mega/overworld_shiny.pal new file mode 100644 index 0000000000..520daaa6f0 --- /dev/null +++ b/graphics/pokemon/heracross/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +16 16 16 +70 15 58 +106 27 88 +133 47 115 +176 40 48 +224 32 56 +152 88 0 +248 96 120 +216 136 8 +240 176 64 +160 76 143 +194 104 178 +218 158 215 +0 0 0 +248 248 248 diff --git a/graphics/pokemon/houndoom/mega/overworld.png b/graphics/pokemon/houndoom/mega/overworld.png new file mode 100644 index 0000000000..7cf4de427a Binary files /dev/null and b/graphics/pokemon/houndoom/mega/overworld.png differ diff --git a/graphics/pokemon/houndoom/mega/overworld_normal.pal b/graphics/pokemon/houndoom/mega/overworld_normal.pal new file mode 100644 index 0000000000..8471c56c2c --- /dev/null +++ b/graphics/pokemon/houndoom/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +40 40 48 +56 56 64 +72 56 80 +80 80 88 +104 112 112 +144 24 40 +136 96 64 +184 136 96 +136 128 144 +168 160 184 +224 184 160 +0 0 0 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/houndoom/mega/overworld_shiny.pal b/graphics/pokemon/houndoom/mega/overworld_shiny.pal new file mode 100644 index 0000000000..cc0bf08c9a --- /dev/null +++ b/graphics/pokemon/houndoom/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +38 53 69 +56 56 64 +72 56 80 +45 75 105 +72 100 129 +144 24 40 +162 41 29 +215 68 52 +136 128 144 +168 160 184 +246 128 128 +0 0 0 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/kangaskhan/mega/overworld.png b/graphics/pokemon/kangaskhan/mega/overworld.png new file mode 100644 index 0000000000..de152c74f3 Binary files /dev/null and b/graphics/pokemon/kangaskhan/mega/overworld.png differ diff --git a/graphics/pokemon/kangaskhan/mega/overworld_normal.pal b/graphics/pokemon/kangaskhan/mega/overworld_normal.pal new file mode 100644 index 0000000000..1b696b1769 --- /dev/null +++ b/graphics/pokemon/kangaskhan/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +40 39 45 +104 8 1 +88 72 40 +120 80 56 +56 56 64 +80 56 64 +72 72 72 +112 112 112 +160 120 40 +184 120 112 +208 168 96 +248 200 120 +0 0 0 +168 184 208 +232 232 248 diff --git a/graphics/pokemon/kangaskhan/mega/overworld_shiny.pal b/graphics/pokemon/kangaskhan/mega/overworld_shiny.pal new file mode 100644 index 0000000000..ee394a6ea7 --- /dev/null +++ b/graphics/pokemon/kangaskhan/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +40 39 45 +104 8 1 +88 72 40 +136 120 128 +56 56 64 +80 56 64 +64 88 64 +120 144 96 +160 120 40 +176 168 144 +230 186 109 +230 186 109 +0 0 0 +234 170 223 +232 232 248 diff --git a/graphics/pokemon/kyogre/primal/overworld.png b/graphics/pokemon/kyogre/primal/overworld.png new file mode 100644 index 0000000000..a1da31fd68 Binary files /dev/null and b/graphics/pokemon/kyogre/primal/overworld.png differ diff --git a/graphics/pokemon/kyogre/primal/overworld_normal.pal b/graphics/pokemon/kyogre/primal/overworld_normal.pal new file mode 100644 index 0000000000..7731a6b32e --- /dev/null +++ b/graphics/pokemon/kyogre/primal/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +56 56 56 +24 56 88 +18 82 110 +161 103 64 +227 88 88 +227 144 88 +250 229 87 +56 56 188 +80 80 198 +98 98 201 +75 75 227 +35 132 207 +62 167 255 +0 0 0 +253 254 255 diff --git a/graphics/pokemon/kyogre/primal/overworld_shiny.pal b/graphics/pokemon/kyogre/primal/overworld_shiny.pal new file mode 100644 index 0000000000..b2a123d274 --- /dev/null +++ b/graphics/pokemon/kyogre/primal/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +56 56 56 +32 32 32 +87 74 40 +68 127 160 +118 180 196 +125 194 165 +236 225 154 +69 69 69 +79 79 79 +85 85 85 +86 86 86 +222 205 69 +252 245 121 +0 0 0 +253 254 255 diff --git a/graphics/pokemon/latias/mega/overworld.png b/graphics/pokemon/latias/mega/overworld.png new file mode 100644 index 0000000000..5e768685df Binary files /dev/null and b/graphics/pokemon/latias/mega/overworld.png differ diff --git a/graphics/pokemon/latias/mega/overworld_normal.pal b/graphics/pokemon/latias/mega/overworld_normal.pal new file mode 100644 index 0000000000..a6b47e99d6 --- /dev/null +++ b/graphics/pokemon/latias/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +32 40 40 +51 44 70 +75 61 110 +68 68 68 +168 124 28 +103 81 154 +120 100 169 +144 114 197 +124 142 150 +152 168 176 +0 0 0 +168 128 222 +184 200 208 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/latias/mega/overworld_shiny.pal b/graphics/pokemon/latias/mega/overworld_shiny.pal new file mode 100644 index 0000000000..927ce5aece --- /dev/null +++ b/graphics/pokemon/latias/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +32 40 40 +51 44 70 +44 109 44 +68 68 68 +34 93 135 +63 152 63 +76 165 75 +90 164 92 +124 142 150 +152 168 176 +0 0 0 +98 205 100 +184 200 208 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/latios/mega/overworld.png b/graphics/pokemon/latios/mega/overworld.png new file mode 100644 index 0000000000..cb781b85ef Binary files /dev/null and b/graphics/pokemon/latios/mega/overworld.png differ diff --git a/graphics/pokemon/latios/mega/overworld_normal.pal b/graphics/pokemon/latios/mega/overworld_normal.pal new file mode 100644 index 0000000000..babb8855dc --- /dev/null +++ b/graphics/pokemon/latios/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +32 40 40 +51 44 70 +75 61 110 +68 68 68 +192 32 32 +103 81 154 +120 100 169 +144 114 197 +124 142 150 +152 168 176 +0 0 0 +168 128 222 +184 200 208 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/latios/mega/overworld_shiny.pal b/graphics/pokemon/latios/mega/overworld_shiny.pal new file mode 100644 index 0000000000..016c1dc733 --- /dev/null +++ b/graphics/pokemon/latios/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +32 40 40 +51 44 70 +44 109 44 +68 68 68 +192 32 32 +63 152 63 +76 165 75 +90 164 92 +124 142 150 +152 168 176 +0 0 0 +98 205 100 +184 200 208 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/lopunny/mega/overworld.png b/graphics/pokemon/lopunny/mega/overworld.png new file mode 100644 index 0000000000..d87a196fa4 Binary files /dev/null and b/graphics/pokemon/lopunny/mega/overworld.png differ diff --git a/graphics/pokemon/lopunny/mega/overworld_normal.pal b/graphics/pokemon/lopunny/mega/overworld_normal.pal new file mode 100644 index 0000000000..b5c8981adc --- /dev/null +++ b/graphics/pokemon/lopunny/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +35 27 18 +56 48 32 +60 60 53 +80 80 72 +96 80 64 +128 96 56 +144 120 64 +208 120 120 +168 128 88 +200 168 104 +232 216 168 +0 0 0 +253 199 199 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/lopunny/mega/overworld_shiny.pal b/graphics/pokemon/lopunny/mega/overworld_shiny.pal new file mode 100644 index 0000000000..e86ff95985 --- /dev/null +++ b/graphics/pokemon/lopunny/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +35 27 18 +56 48 32 +60 60 53 +80 80 72 +96 80 64 +128 96 56 +144 120 64 +208 120 120 +168 128 88 +215 88 153 +242 157 194 +0 0 0 +253 199 199 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/lucario/mega/overworld.png b/graphics/pokemon/lucario/mega/overworld.png new file mode 100644 index 0000000000..8ff2fdd478 Binary files /dev/null and b/graphics/pokemon/lucario/mega/overworld.png differ diff --git a/graphics/pokemon/lucario/mega/overworld_normal.pal b/graphics/pokemon/lucario/mega/overworld_normal.pal new file mode 100644 index 0000000000..64a2ed1916 --- /dev/null +++ b/graphics/pokemon/lucario/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +40 40 40 +68 11 21 +120 96 40 +48 56 88 +72 72 72 +96 96 96 +187 30 57 +176 136 56 +232 184 80 +56 104 144 +72 136 192 +112 184 240 +168 184 200 +0 0 0 +232 232 248 diff --git a/graphics/pokemon/lucario/mega/overworld_shiny.pal b/graphics/pokemon/lucario/mega/overworld_shiny.pal new file mode 100644 index 0000000000..5f97d7165f --- /dev/null +++ b/graphics/pokemon/lucario/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +40 40 40 +68 11 21 +120 96 40 +66 80 55 +72 72 72 +96 96 96 +187 30 57 +176 136 56 +232 184 80 +116 127 72 +152 169 94 +200 215 136 +168 184 200 +0 0 0 +232 232 248 diff --git a/graphics/pokemon/manectric/mega/overworld.png b/graphics/pokemon/manectric/mega/overworld.png new file mode 100644 index 0000000000..bc36a99f18 Binary files /dev/null and b/graphics/pokemon/manectric/mega/overworld.png differ diff --git a/graphics/pokemon/manectric/mega/overworld_normal.pal b/graphics/pokemon/manectric/mega/overworld_normal.pal new file mode 100644 index 0000000000..1cfb140de9 --- /dev/null +++ b/graphics/pokemon/manectric/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +96 72 48 +24 48 88 +64 64 72 +152 0 0 +192 56 56 +192 144 32 +224 192 72 +32 120 152 +80 152 184 +248 248 144 +128 184 216 +136 216 248 +0 0 0 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/manectric/mega/overworld_shiny.pal b/graphics/pokemon/manectric/mega/overworld_shiny.pal new file mode 100644 index 0000000000..648a273aac --- /dev/null +++ b/graphics/pokemon/manectric/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +96 72 48 +39 39 39 +64 64 72 +152 0 0 +192 56 56 +192 123 32 +224 171 72 +64 64 64 +92 92 92 +248 234 144 +121 121 121 +134 134 134 +0 0 0 +232 232 248 +0 0 0 diff --git a/graphics/pokemon/mawile/mega/overworld.png b/graphics/pokemon/mawile/mega/overworld.png new file mode 100644 index 0000000000..b65c2c37d7 Binary files /dev/null and b/graphics/pokemon/mawile/mega/overworld.png differ diff --git a/graphics/pokemon/mawile/mega/overworld_normal.pal b/graphics/pokemon/mawile/mega/overworld_normal.pal new file mode 100644 index 0000000000..474b856da6 --- /dev/null +++ b/graphics/pokemon/mawile/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +40 40 40 +126 25 55 +80 72 56 +72 72 72 +118 118 118 +129 63 63 +161 33 71 +128 104 72 +200 168 88 +196 88 145 +242 135 158 +0 0 0 +248 216 128 +176 184 200 +232 232 248 diff --git a/graphics/pokemon/mawile/mega/overworld_shiny.pal b/graphics/pokemon/mawile/mega/overworld_shiny.pal new file mode 100644 index 0000000000..21d02a3d3c --- /dev/null +++ b/graphics/pokemon/mawile/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +68 37 61 +63 35 115 +80 72 56 +113 66 99 +184 112 152 +66 45 105 +82 46 147 +128 104 72 +200 168 88 +109 99 185 +183 146 231 +0 0 0 +248 216 128 +176 184 200 +232 232 248 diff --git a/graphics/pokemon/medicham/mega/overworld.png b/graphics/pokemon/medicham/mega/overworld.png new file mode 100644 index 0000000000..d3f0d04bf5 Binary files /dev/null and b/graphics/pokemon/medicham/mega/overworld.png differ diff --git a/graphics/pokemon/medicham/mega/overworld_normal.pal b/graphics/pokemon/medicham/mega/overworld_normal.pal new file mode 100644 index 0000000000..dad60f896f --- /dev/null +++ b/graphics/pokemon/medicham/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 24 32 +56 56 64 +86 88 94 +144 56 88 +184 80 104 +185 159 44 +255 216 49 +200 96 128 +88 144 192 +136 136 152 +232 136 160 +0 0 0 +176 184 200 +216 224 232 +232 232 248 diff --git a/graphics/pokemon/medicham/mega/overworld_shiny.pal b/graphics/pokemon/medicham/mega/overworld_shiny.pal new file mode 100644 index 0000000000..d163e9eff8 --- /dev/null +++ b/graphics/pokemon/medicham/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +24 32 48 +56 56 64 +86 88 94 +56 88 144 +80 104 184 +185 159 44 +255 216 49 +96 128 200 +88 144 192 +136 136 152 +136 160 232 +0 0 0 +208 195 168 +237 223 210 +232 232 248 diff --git a/graphics/pokemon/metagross/mega/overworld.png b/graphics/pokemon/metagross/mega/overworld.png new file mode 100644 index 0000000000..d0a6ae4fb7 Binary files /dev/null and b/graphics/pokemon/metagross/mega/overworld.png differ diff --git a/graphics/pokemon/metagross/mega/overworld_normal.pal b/graphics/pokemon/metagross/mega/overworld_normal.pal new file mode 100644 index 0000000000..cfdfcb38ee --- /dev/null +++ b/graphics/pokemon/metagross/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +39 44 55 +32 64 80 +72 80 96 +64 96 120 +152 40 40 +191 163 12 +227 202 32 +249 221 73 +112 120 136 +88 128 168 +104 144 208 +0 0 0 +144 192 232 +208 208 208 +232 232 248 diff --git a/graphics/pokemon/metagross/mega/overworld_shiny.pal b/graphics/pokemon/metagross/mega/overworld_shiny.pal new file mode 100644 index 0000000000..ee4a5c6018 --- /dev/null +++ b/graphics/pokemon/metagross/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +39 44 55 +72 72 72 +72 80 96 +118 118 118 +152 40 40 +8 107 183 +25 133 227 +55 147 227 +185 133 36 +162 162 162 +192 192 192 +0 0 0 +220 220 220 +245 191 84 +255 220 148 diff --git a/graphics/pokemon/mewtwo/mega_x/overworld.png b/graphics/pokemon/mewtwo/mega_x/overworld.png new file mode 100644 index 0000000000..6adbe5652a Binary files /dev/null and b/graphics/pokemon/mewtwo/mega_x/overworld.png differ diff --git a/graphics/pokemon/mewtwo/mega_x/overworld_normal.pal b/graphics/pokemon/mewtwo/mega_x/overworld_normal.pal new file mode 100644 index 0000000000..6ec07f7967 --- /dev/null +++ b/graphics/pokemon/mewtwo/mega_x/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +50 42 55 +64 48 80 +68 68 68 +129 72 136 +128 120 152 +184 88 208 +176 152 192 +0 0 0 +216 200 216 +232 232 248 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/mewtwo/mega_x/overworld_shiny.pal b/graphics/pokemon/mewtwo/mega_x/overworld_shiny.pal new file mode 100644 index 0000000000..b1353cc5b1 --- /dev/null +++ b/graphics/pokemon/mewtwo/mega_x/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +50 42 55 +58 80 48 +68 68 68 +72 136 75 +128 120 152 +92 208 88 +176 152 192 +0 0 0 +216 200 216 +232 232 248 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/mewtwo/mega_y/overworld.png b/graphics/pokemon/mewtwo/mega_y/overworld.png new file mode 100644 index 0000000000..1119dc6ee0 Binary files /dev/null and b/graphics/pokemon/mewtwo/mega_y/overworld.png differ diff --git a/graphics/pokemon/mewtwo/mega_y/overworld_normal.pal b/graphics/pokemon/mewtwo/mega_y/overworld_normal.pal new file mode 100644 index 0000000000..6d3f605307 --- /dev/null +++ b/graphics/pokemon/mewtwo/mega_y/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +94 12 15 +64 48 80 +64 64 64 +96 96 96 +193 98 104 +136 72 136 +128 120 152 +184 88 208 +230 128 132 +0 0 0 +176 152 192 +216 200 216 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/mewtwo/mega_y/overworld_shiny.pal b/graphics/pokemon/mewtwo/mega_y/overworld_shiny.pal new file mode 100644 index 0000000000..6aca25458b --- /dev/null +++ b/graphics/pokemon/mewtwo/mega_y/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +94 12 15 +58 80 48 +64 64 64 +96 96 96 +193 98 104 +72 136 75 +128 120 152 +92 208 88 +230 128 132 +0 0 0 +176 152 192 +216 200 216 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/necrozma/ultra/overworld.png b/graphics/pokemon/necrozma/ultra/overworld.png new file mode 100644 index 0000000000..85d2902dfa Binary files /dev/null and b/graphics/pokemon/necrozma/ultra/overworld.png differ diff --git a/graphics/pokemon/necrozma/ultra/overworld_normal.pal b/graphics/pokemon/necrozma/ultra/overworld_normal.pal new file mode 100644 index 0000000000..28fabb96d9 --- /dev/null +++ b/graphics/pokemon/necrozma/ultra/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 233 127 +53 46 7 +121 109 57 +44 77 106 +194 54 54 +150 133 35 +230 207 53 +235 216 89 +219 199 118 +0 0 0 +125 52 134 +61 168 194 +250 237 207 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/necrozma/ultra/overworld_shiny.pal b/graphics/pokemon/necrozma/ultra/overworld_shiny.pal new file mode 100644 index 0000000000..79f1fc8cdb --- /dev/null +++ b/graphics/pokemon/necrozma/ultra/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 233 127 +53 46 7 +74 106 133 +151 163 36 +189 75 177 +54 107 159 +70 150 232 +115 188 246 +130 181 222 +0 0 0 +46 131 58 +255 214 46 +228 245 253 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/pidgeot/mega/overworld.png b/graphics/pokemon/pidgeot/mega/overworld.png new file mode 100644 index 0000000000..4364335afe Binary files /dev/null and b/graphics/pokemon/pidgeot/mega/overworld.png differ diff --git a/graphics/pokemon/pidgeot/mega/overworld_normal.pal b/graphics/pokemon/pidgeot/mega/overworld_normal.pal new file mode 100644 index 0000000000..c18feb0a77 --- /dev/null +++ b/graphics/pokemon/pidgeot/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +17 48 59 +80 56 24 +126 32 86 +149 91 50 +208 112 40 +242 57 71 +176 64 96 +184 176 99 +29 110 141 +48 150 203 +177 170 153 +244 138 140 +0 0 0 +235 237 171 +242 245 229 diff --git a/graphics/pokemon/pidgeot/mega/overworld_shiny.pal b/graphics/pokemon/pidgeot/mega/overworld_shiny.pal new file mode 100644 index 0000000000..69da1cc4ac --- /dev/null +++ b/graphics/pokemon/pidgeot/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 29 88 +76 70 27 +110 77 47 +149 91 50 +196 158 50 +211 208 87 +157 139 82 +184 176 99 +91 48 164 +126 59 215 +233 193 97 +224 226 155 +0 0 0 +235 237 171 +248 255 219 diff --git a/graphics/pokemon/pinsir/mega/overworld.png b/graphics/pokemon/pinsir/mega/overworld.png new file mode 100644 index 0000000000..1c851f84f2 Binary files /dev/null and b/graphics/pokemon/pinsir/mega/overworld.png differ diff --git a/graphics/pokemon/pinsir/mega/overworld_normal.pal b/graphics/pokemon/pinsir/mega/overworld_normal.pal new file mode 100644 index 0000000000..4a7eb110b8 --- /dev/null +++ b/graphics/pokemon/pinsir/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +48 48 48 +88 44 28 +80 64 48 +96 80 56 +120 104 80 +104 104 104 +142 64 34 +221 149 23 +152 128 96 +224 227 91 +144 144 144 +0 0 0 +192 192 208 +232 232 248 +221 149 23 diff --git a/graphics/pokemon/pinsir/mega/overworld_shiny.pal b/graphics/pokemon/pinsir/mega/overworld_shiny.pal new file mode 100644 index 0000000000..4b03f94e57 --- /dev/null +++ b/graphics/pokemon/pinsir/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +48 48 48 +88 44 28 +50 54 93 +62 60 118 +95 93 154 +134 134 93 +142 64 34 +74 135 51 +118 119 194 +131 227 91 +173 173 132 +0 0 0 +217 217 175 +232 232 248 +221 142 23 diff --git a/graphics/pokemon/rayquaza/mega/overworld.png b/graphics/pokemon/rayquaza/mega/overworld.png new file mode 100644 index 0000000000..09bd6792dc Binary files /dev/null and b/graphics/pokemon/rayquaza/mega/overworld.png differ diff --git a/graphics/pokemon/rayquaza/mega/overworld_normal.pal b/graphics/pokemon/rayquaza/mega/overworld_normal.pal new file mode 100644 index 0000000000..59daaaf12f --- /dev/null +++ b/graphics/pokemon/rayquaza/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 48 48 +88 16 8 +11 72 54 +63 74 65 +43 111 79 +164 75 24 +255 123 101 +74 150 114 +192 160 40 +240 200 48 +104 190 140 +231 153 184 +152 224 144 +0 0 0 +173 190 198 diff --git a/graphics/pokemon/rayquaza/mega/overworld_shiny.pal b/graphics/pokemon/rayquaza/mega/overworld_shiny.pal new file mode 100644 index 0000000000..82199ef8e0 --- /dev/null +++ b/graphics/pokemon/rayquaza/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +48 48 48 +88 16 8 +41 41 41 +63 74 65 +77 77 77 +148 40 39 +255 151 101 +112 112 112 +175 56 70 +255 89 89 +147 147 147 +231 153 184 +184 184 184 +0 0 0 +173 190 198 diff --git a/graphics/pokemon/sableye/mega/overworld.png b/graphics/pokemon/sableye/mega/overworld.png new file mode 100644 index 0000000000..0439ee4046 Binary files /dev/null and b/graphics/pokemon/sableye/mega/overworld.png differ diff --git a/graphics/pokemon/sableye/mega/overworld_normal.pal b/graphics/pokemon/sableye/mega/overworld_normal.pal new file mode 100644 index 0000000000..7479f563fc --- /dev/null +++ b/graphics/pokemon/sableye/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +64 48 104 +179 15 55 +192 56 56 +216 24 64 +227 56 103 +232 88 112 +24 152 120 +88 64 144 +120 96 176 +255 121 160 +255 150 181 +255 176 181 +144 128 216 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/sableye/mega/overworld_shiny.pal b/graphics/pokemon/sableye/mega/overworld_shiny.pal new file mode 100644 index 0000000000..3b03e34b92 --- /dev/null +++ b/graphics/pokemon/sableye/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +93 90 43 +12 148 31 +192 56 56 +19 187 47 +45 201 62 +232 88 112 +24 152 120 +144 141 64 +176 173 96 +98 255 111 +122 255 133 +145 255 172 +216 202 128 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/salamence/mega/overworld.png b/graphics/pokemon/salamence/mega/overworld.png new file mode 100644 index 0000000000..65e63e5029 Binary files /dev/null and b/graphics/pokemon/salamence/mega/overworld.png differ diff --git a/graphics/pokemon/salamence/mega/overworld_normal.pal b/graphics/pokemon/salamence/mega/overworld_normal.pal new file mode 100644 index 0000000000..2f27627493 --- /dev/null +++ b/graphics/pokemon/salamence/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +96 32 32 +56 56 64 +48 72 112 +160 64 64 +192 80 96 +216 88 120 +40 144 168 +80 184 200 +128 128 144 +160 160 176 +0 0 0 +152 200 208 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/salamence/mega/overworld_shiny.pal b/graphics/pokemon/salamence/mega/overworld_shiny.pal new file mode 100644 index 0000000000..2d9ae90a6b --- /dev/null +++ b/graphics/pokemon/salamence/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +74 48 24 +56 56 64 +40 88 40 +160 101 62 +193 114 78 +214 132 77 +48 168 64 +104 192 112 +128 128 144 +160 160 176 +0 0 0 +136 224 152 +232 232 248 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/sceptile/mega/overworld.png b/graphics/pokemon/sceptile/mega/overworld.png new file mode 100644 index 0000000000..fa9b6409cb Binary files /dev/null and b/graphics/pokemon/sceptile/mega/overworld.png differ diff --git a/graphics/pokemon/sceptile/mega/overworld_normal.pal b/graphics/pokemon/sceptile/mega/overworld_normal.pal new file mode 100644 index 0000000000..79c68cf856 --- /dev/null +++ b/graphics/pokemon/sceptile/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +0 34 17 +104 24 24 +40 80 16 +10 69 59 +0 116 58 +120 104 24 +165 43 43 +136 68 0 +204 102 0 +80 144 48 +200 160 56 +128 176 72 +160 208 104 +248 216 88 +0 0 0 diff --git a/graphics/pokemon/sceptile/mega/overworld_shiny.pal b/graphics/pokemon/sceptile/mega/overworld_shiny.pal new file mode 100644 index 0000000000..0fa6a06d4b --- /dev/null +++ b/graphics/pokemon/sceptile/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +0 34 17 +124 77 3 +24 64 56 +10 69 59 +0 116 79 +120 104 24 +231 157 15 +136 68 0 +204 102 0 +72 120 112 +200 160 56 +96 152 128 +136 216 192 +206 53 49 +0 0 0 diff --git a/graphics/pokemon/scizor/mega/overworld.png b/graphics/pokemon/scizor/mega/overworld.png new file mode 100644 index 0000000000..1a72458fc7 Binary files /dev/null and b/graphics/pokemon/scizor/mega/overworld.png differ diff --git a/graphics/pokemon/scizor/mega/overworld_normal.pal b/graphics/pokemon/scizor/mega/overworld_normal.pal new file mode 100644 index 0000000000..d6c5a61f64 --- /dev/null +++ b/graphics/pokemon/scizor/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +27 32 44 +88 16 8 +40 48 64 +57 68 91 +80 88 112 +160 32 32 +208 56 56 +104 112 136 +58 128 152 +167 164 150 +144 152 176 +191 189 179 +0 0 0 +184 200 216 +232 232 248 diff --git a/graphics/pokemon/scizor/mega/overworld_shiny.pal b/graphics/pokemon/scizor/mega/overworld_shiny.pal new file mode 100644 index 0000000000..b3c240401a --- /dev/null +++ b/graphics/pokemon/scizor/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +12 64 33 +48 93 8 +36 118 56 +71 154 57 +80 88 112 +110 170 34 +150 219 59 +104 112 136 +58 128 152 +167 164 150 +144 152 176 +191 189 179 +0 0 0 +184 200 216 +232 232 248 diff --git a/graphics/pokemon/sharpedo/mega/overworld.png b/graphics/pokemon/sharpedo/mega/overworld.png new file mode 100644 index 0000000000..28409873c0 Binary files /dev/null and b/graphics/pokemon/sharpedo/mega/overworld.png differ diff --git a/graphics/pokemon/sharpedo/mega/overworld_normal.pal b/graphics/pokemon/sharpedo/mega/overworld_normal.pal new file mode 100644 index 0000000000..a6e3ea418e --- /dev/null +++ b/graphics/pokemon/sharpedo/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +112 24 48 +96 80 16 +60 69 78 +32 64 104 +192 88 112 +208 168 48 +248 208 80 +32 88 136 +64 112 160 +88 144 192 +128 136 144 +160 168 176 +0 0 0 +184 200 240 +232 232 248 diff --git a/graphics/pokemon/sharpedo/mega/overworld_shiny.pal b/graphics/pokemon/sharpedo/mega/overworld_shiny.pal new file mode 100644 index 0000000000..5fdd9eab63 --- /dev/null +++ b/graphics/pokemon/sharpedo/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +112 24 48 +96 80 16 +60 69 78 +104 32 92 +192 88 112 +208 168 48 +248 208 80 +136 32 129 +160 64 150 +192 88 185 +128 136 144 +160 168 176 +0 0 0 +184 200 240 +232 232 248 diff --git a/graphics/pokemon/slowbro/mega/overworld.png b/graphics/pokemon/slowbro/mega/overworld.png new file mode 100644 index 0000000000..1569737877 Binary files /dev/null and b/graphics/pokemon/slowbro/mega/overworld.png differ diff --git a/graphics/pokemon/slowbro/mega/overworld_normal.pal b/graphics/pokemon/slowbro/mega/overworld_normal.pal new file mode 100644 index 0000000000..f447c1383d --- /dev/null +++ b/graphics/pokemon/slowbro/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +34 34 34 +112 48 56 +68 68 68 +176 96 104 +216 192 88 +208 120 128 +152 152 152 +240 168 176 +0 0 0 +240 240 168 +192 200 208 +232 232 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/slowbro/mega/overworld_shiny.pal b/graphics/pokemon/slowbro/mega/overworld_shiny.pal new file mode 100644 index 0000000000..14445e3628 --- /dev/null +++ b/graphics/pokemon/slowbro/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +34 34 34 +75 48 112 +82 71 58 +132 96 176 +216 192 88 +149 121 187 +177 160 109 +200 168 240 +0 0 0 +240 240 168 +247 222 152 +232 232 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/steelix/mega/overworld.png b/graphics/pokemon/steelix/mega/overworld.png new file mode 100644 index 0000000000..d2c39bbd09 Binary files /dev/null and b/graphics/pokemon/steelix/mega/overworld.png differ diff --git a/graphics/pokemon/steelix/mega/overworld_normal.pal b/graphics/pokemon/steelix/mega/overworld_normal.pal new file mode 100644 index 0000000000..98d4f25b85 --- /dev/null +++ b/graphics/pokemon/steelix/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +55 56 59 +60 65 72 +96 105 118 +86 171 190 +150 162 178 +220 174 232 +182 195 214 +152 221 234 +0 0 0 +239 245 205 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/steelix/mega/overworld_shiny.pal b/graphics/pokemon/steelix/mega/overworld_shiny.pal new file mode 100644 index 0000000000..b319f73ee4 --- /dev/null +++ b/graphics/pokemon/steelix/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +55 56 59 +74 71 50 +131 126 83 +86 171 190 +202 193 116 +220 174 232 +223 218 157 +152 221 234 +0 0 0 +239 245 205 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/swampert/mega/overworld.png b/graphics/pokemon/swampert/mega/overworld.png new file mode 100644 index 0000000000..5c958759c0 Binary files /dev/null and b/graphics/pokemon/swampert/mega/overworld.png differ diff --git a/graphics/pokemon/swampert/mega/overworld_normal.pal b/graphics/pokemon/swampert/mega/overworld_normal.pal new file mode 100644 index 0000000000..b25f6a76d8 --- /dev/null +++ b/graphics/pokemon/swampert/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +28 36 40 +127 55 55 +48 64 72 +48 72 112 +67 78 90 +160 72 16 +167 71 71 +247 114 64 +240 128 16 +87 119 156 +74 156 210 +105 177 241 +0 0 0 +160 160 192 +200 200 224 diff --git a/graphics/pokemon/swampert/mega/overworld_shiny.pal b/graphics/pokemon/swampert/mega/overworld_shiny.pal new file mode 100644 index 0000000000..fda8f013c0 --- /dev/null +++ b/graphics/pokemon/swampert/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +136 245 178 +28 36 40 +127 55 55 +48 64 72 +127 55 129 +67 78 90 +160 72 16 +167 71 71 +247 114 64 +240 128 16 +103 117 133 +198 86 229 +234 121 249 +0 0 0 +160 160 192 +200 200 224 diff --git a/graphics/pokemon/tyranitar/mega/overworld.png b/graphics/pokemon/tyranitar/mega/overworld.png new file mode 100644 index 0000000000..9452e416be Binary files /dev/null and b/graphics/pokemon/tyranitar/mega/overworld.png differ diff --git a/graphics/pokemon/tyranitar/mega/overworld_normal.pal b/graphics/pokemon/tyranitar/mega/overworld_normal.pal new file mode 100644 index 0000000000..2c15c90a73 --- /dev/null +++ b/graphics/pokemon/tyranitar/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +32 40 40 +120 32 32 +40 72 48 +88 120 80 +184 48 48 +112 160 88 +136 184 104 +176 216 120 +120 136 144 +160 184 200 +0 0 0 +232 232 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/tyranitar/mega/overworld_shiny.pal b/graphics/pokemon/tyranitar/mega/overworld_shiny.pal new file mode 100644 index 0000000000..c4a90c104c --- /dev/null +++ b/graphics/pokemon/tyranitar/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +34 42 42 +84 28 131 +74 65 43 +124 119 85 +143 93 186 +169 151 98 +191 164 113 +222 198 130 +126 143 152 +169 194 210 +0 0 0 +239 239 250 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/pokemon/venusaur/mega/overworld.png b/graphics/pokemon/venusaur/mega/overworld.png new file mode 100644 index 0000000000..45ddccb401 Binary files /dev/null and b/graphics/pokemon/venusaur/mega/overworld.png differ diff --git a/graphics/pokemon/venusaur/mega/overworld_normal.pal b/graphics/pokemon/venusaur/mega/overworld_normal.pal new file mode 100644 index 0000000000..5092c7a73f --- /dev/null +++ b/graphics/pokemon/venusaur/mega/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +35 59 35 +104 32 40 +64 96 48 +144 64 32 +96 168 16 +64 152 96 +192 128 40 +136 224 32 +248 224 8 +232 192 112 +200 72 128 +240 120 160 +104 216 192 +0 0 0 +232 232 248 diff --git a/graphics/pokemon/venusaur/mega/overworld_shiny.pal b/graphics/pokemon/venusaur/mega/overworld_shiny.pal new file mode 100644 index 0000000000..938d061579 --- /dev/null +++ b/graphics/pokemon/venusaur/mega/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +179 226 255 +35 59 35 +104 77 32 +50 96 49 +144 64 32 +96 168 16 +135 152 64 +192 128 40 +136 224 32 +248 224 8 +232 192 112 +182 160 42 +240 219 120 +147 216 104 +0 0 0 +232 232 248 diff --git a/graphics/summary_screen/iv_ev_tiles.png b/graphics/summary_screen/iv_ev_tiles.png new file mode 100644 index 0000000000..66774f1438 Binary files /dev/null and b/graphics/summary_screen/iv_ev_tiles.png differ diff --git a/graphics/text_window/dexnav_pal.pal b/graphics/text_window/dexnav_pal.pal new file mode 100644 index 0000000000..cb6acc371d --- /dev/null +++ b/graphics/text_window/dexnav_pal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 6 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +46 46 46 +0 0 0 +255 255 255 diff --git a/include/battle.h b/include/battle.h index 4e9313d10d..27227544d9 100644 --- a/include/battle.h +++ b/include/battle.h @@ -17,7 +17,10 @@ #include "battle_dynamax.h" #include "battle_terastal.h" #include "battle_gimmick.h" +#include "generational_changes.h" +#include "move.h" #include "random.h" // for rng_value_t +#include "trainer_slide.h" // Helper for accessing command arguments and advancing gBattlescriptCurrInstr. // @@ -67,37 +70,7 @@ #define BATTLE_BUFFER_LINK_SIZE 0x1000 -// Special indicator value for shellBellDmg in SpecialStatus -#define IGNORE_SHELL_BELL 0xFFFF - -// For defining EFFECT_HIT etc. with battle TV scores and flags etc. -struct __attribute__((packed, aligned(2))) BattleMoveEffect -{ - const u8 *battleScript; - u16 battleTvScore:3; - u16 encourageEncore:1; - u16 twoTurnEffect:1; - u16 semiInvulnerableEffect:1; - u16 usesProtectCounter:1; - u16 padding:9; -}; - -#define GET_MOVE_BATTLESCRIPT(move) gBattleMoveEffects[gMovesInfo[move].effect].battleScript - -struct ResourceFlags -{ - u32 flags[MAX_BATTLERS_COUNT]; -}; - -#define RESOURCE_FLAG_FLASH_FIRE 0x1 -#define RESOURCE_FLAG_ROOST 0x2 -#define RESOURCE_FLAG_UNBURDEN 0x4 -#define RESOURCE_FLAG_UNUSED 0x8 -#define RESOURCE_FLAG_UNUSED_2 0x10 -#define RESOURCE_FLAG_EMERGENCY_EXIT 0x20 -#define RESOURCE_FLAG_NEUTRALIZING_GAS 0x40 -#define RESOURCE_FLAG_ICE_FACE 0x80 - +// Cleared each time a mon leaves the field, either by switching out or fainting struct DisableStruct { u32 transformedMonPersonality; @@ -134,6 +107,7 @@ struct DisableStruct u8 laserFocusTimer; u8 throatChopTimer; u8 wrapTurns; + u8 syrupBombTimer; u8 tormentTimer:4; // used for G-Max Meltdown u8 usedMoves:4; u8 truantCounter:1; @@ -146,14 +120,23 @@ struct DisableStruct u8 toxicSpikesDone:1; u8 stickyWebDone:1; u8 stealthRockDone:1; - u8 syrupBombTimer; - u8 syrupBombIsShiny:1; - u8 steelSurgeDone:1; u8 weatherAbilityDone:1; u8 terrainAbilityDone:1; + u8 syrupBombIsShiny:1; + u8 steelSurgeDone:1; u8 usedProteanLibero:1; + u8 flashFireBoosted:1; + u16 overwrittenAbility; // abilities overwritten during battle (keep separate from battle history in case of switching) + u8 boosterEnergyActivates:1; + u8 roostActive:1; + u8 unburdenActive:1; + u8 startEmergencyExit:1; + u8 neutralizingGas:1; + u8 iceFaceActivationPrevention:1; // fixes hit escape move edge case + u8 padding:2; }; +// Fully Cleared each turn after end turn effects are done. A few things are cleared before end turn effects struct ProtectStruct { u32 protected:1; @@ -207,12 +190,11 @@ struct ProtectStruct u32 specialDmg; u8 physicalBattlerId; u8 specialBattlerId; - }; +// Cleared at the start of HandleAction_ActionFinished struct SpecialStatus { - s32 shellBellDmg; s32 physicalDmg; s32 specialDmg; u8 physicalBattlerId; @@ -224,7 +206,8 @@ struct SpecialStatus u8 faintedHasReplacement:1; u8 focusBanded:1; u8 focusSashed:1; - u8 unused:2; + u8 emergencyExited:1; + u8 afterYou:1; // End of byte u8 sturdied:1; u8 stormDrainRedirected:1; @@ -243,61 +226,62 @@ struct SpecialStatus u8 neutralizingGasRemoved:1; // See VARIOUS_TRY_END_NEUTRALIZING_GAS u8 affectionEndured:1; // End of byte - u8 damagedMons:4; // Mons that have been damaged directly by using a move, includes substitute. u8 dancerUsedMove:1; u8 dancerOriginalTarget:3; - // End of byte - u8 emergencyExited:1; - u8 afterYou:1; u8 preventLifeOrbDamage:1; // So that Life Orb doesn't activate various effects. u8 distortedTypeMatchups:1; + u8 teraShellAbilityDone:1; + u8 criticalHit:1; + // End of byte + u8 enduredDamage:1; + u8 padding:7; }; struct SideTimer { - u8 reflectTimer; + u16 reflectTimer; u8 reflectBattlerId; - u8 lightscreenTimer; + u16 lightscreenTimer; u8 lightscreenBattlerId; - u8 mistTimer; + u16 mistTimer; u8 mistBattlerId; - u8 safeguardTimer; + u16 safeguardTimer; u8 safeguardBattlerId; - u8 spikesAmount; - u8 toxicSpikesAmount; - u8 stealthRockAmount; - u8 stickyWebAmount; + u16 spikesAmount; // debug menu complains. might be better to solve there instead if possible + u16 toxicSpikesAmount; + u16 stealthRockAmount; + u16 stickyWebAmount; u8 stickyWebBattlerId; u8 stickyWebBattlerSide; // Used for Court Change - u8 auroraVeilTimer; + u16 auroraVeilTimer; u8 auroraVeilBattlerId; - u8 tailwindTimer; + u16 tailwindTimer; u8 tailwindBattlerId; - u8 luckyChantTimer; + u16 luckyChantTimer; u8 luckyChantBattlerId; - u8 steelsurgeAmount; + u16 steelsurgeAmount; // Timers below this point are not swapped by Court Change - u8 followmeTimer; + u16 followmeTimer; u8 followmeTarget:3; u8 followmePowder:1; // Rage powder, does not affect grass type pokemon. - u8 retaliateTimer; - u8 damageNonTypesTimer; + u16 retaliateTimer; + u16 damageNonTypesTimer; u8 damageNonTypesType; - u8 rainbowTimer; - u8 seaOfFireTimer; - u8 swampTimer; + u16 rainbowTimer; + u16 seaOfFireTimer; + u16 swampTimer; }; struct FieldTimer { - u8 mudSportTimer; - u8 waterSportTimer; - u8 wonderRoomTimer; - u8 magicRoomTimer; - u8 trickRoomTimer; - u8 terrainTimer; - u8 gravityTimer; - u8 fairyLockTimer; + u16 mudSportTimer; + u16 waterSportTimer; + u16 wonderRoomTimer; + u16 magicRoomTimer; + u16 trickRoomTimer; + u16 terrainTimer; + u16 gravityTimer; + u16 fairyLockTimer; }; struct WishFutureKnock @@ -306,11 +290,10 @@ struct WishFutureKnock u8 futureSightBattlerIndex[MAX_BATTLERS_COUNT]; u8 futureSightPartyIndex[MAX_BATTLERS_COUNT]; u16 futureSightMove[MAX_BATTLERS_COUNT]; - u8 wishCounter[MAX_BATTLERS_COUNT]; + u16 wishCounter[MAX_BATTLERS_COUNT]; u8 wishPartyId[MAX_BATTLERS_COUNT]; u8 weatherDuration; u8 knockedOffMons[NUM_BATTLE_SIDES]; // Each battler is represented by a bit. - s16 futureSightDmg; }; struct AI_SavedBattleMon @@ -368,18 +351,21 @@ struct AiLogicData u16 partnerMove; u16 speedStats[MAX_BATTLERS_COUNT]; // Speed stats for all battles, calculated only once, same way as damages struct SimulatedDamage simulatedDmg[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex - u8 effectiveness[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex + uq4_12_t effectiveness[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex u8 moveAccuracy[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex u8 moveLimitations[MAX_BATTLERS_COUNT]; u8 monToSwitchInId[MAX_BATTLERS_COUNT]; // ID of the mon to switch in. u8 mostSuitableMonId[MAX_BATTLERS_COUNT]; // Stores result of GetMostSuitableMonToSwitchInto, which decides which generic mon the AI would switch into if they decide to switch. This can be overruled by specific mons found in ShouldSwitch; the final resulting mon is stored in AI_monToSwitchIntoId. struct SwitchinCandidate switchinCandidate; // Struct used for deciding which mon to switch to in battle_ai_switch_items.c - u8 weatherHasEffect:1; // The same as WEATHER_HAS_EFFECT. Stored here, so it's called only once. + u8 weatherHasEffect:1; // The same as HasWeatherEffect(). Stored here, so it's called only once. u8 ejectButtonSwitch:1; // Tracks whether current switch out was from Eject Button u8 ejectPackSwitch:1; // Tracks whether current switch out was from Eject Pack - u8 padding:5; + u8 predictingSwitch:1; // Determines whether AI will use predictions this turn or not + u8 aiSwitchPredictionInProgress:1; // Tracks whether the AI is in the middle of running prediction calculations + u8 padding:3; u8 shouldSwitch; // Stores result of ShouldSwitch, which decides whether a mon should be switched out u8 aiCalcInProgress:1; + u8 battlerDoingPrediction; // Stores which battler is currently running its prediction calcs }; struct AI_ThinkingStruct @@ -429,7 +415,6 @@ struct StatsArray struct BattleResources { struct SecretBase* secretBase; - struct ResourceFlags *flags; struct BattleScriptsStack* battleScriptsStack; struct BattleCallbacksStack* battleCallbackStack; struct StatsArray* beforeLvlUp; @@ -637,8 +622,32 @@ enum BattleIntroStates BATTLE_INTRO_STATE_SET_DEX_AND_BATTLE_VARS }; +struct BattlerState +{ + u8 targetsDone[MAX_BATTLERS_COUNT]; + + u32 commandingDondozo:1; + u32 absentBattlerFlags:1; + u32 focusPunchBattlers:1; + u32 multipleSwitchInBattlers:1; + u32 alreadyStatusedMoveAttempt:1; // For example when using Thunder Wave on an already paralyzed Pokémon. + u32 activeAbilityPopUps:1; + u32 lastMoveFailed:1; // For Stomping Tantrum + u32 forcedSwitch:1; + u32 storedHealingWish:1; + u32 storedLunarDance:1; + u32 usedEjectItem:1; + u32 sleepClauseEffectExempt:1; // Stores whether effect should be exempt from triggering Sleep Clause (Effect Spore) + u32 usedMicleBerry:1; + u32 pursuitTarget:1; + u32 padding:17; + // End of Word +}; + +// Cleared at the beginning of the battle. Fields need to be cleared when needed manually otherwise. struct BattleStruct { + struct BattlerState battlerState[MAX_BATTLERS_COUNT]; u8 turnEffectsTracker; u8 turnEffectsBattlerId; u8 turnCountersTracker; @@ -656,7 +665,6 @@ struct BattleStruct u8 wildVictorySong; u8 dynamicMoveType; u8 wrappedBy[MAX_BATTLERS_COUNT]; - u8 focusPunchBattlers; // as bits u8 battlerPreventingSwitchout; u8 moneyMultiplier:6; u8 moneyMultiplierItem:1; @@ -696,9 +704,9 @@ struct BattleStruct u8 hpScale; u16 synchronizeMoveEffect; u8 anyMonHasTransformed:1; // Only used in battle_tv.c - u8 multipleSwitchInBattlers:4; // One bit per battler u8 multipleSwitchInState:2; u8 multipleSwitchInCursor:3; + u8 padding1:2; u8 multipleSwitchInSortedBattlers[MAX_BATTLERS_COUNT]; void (*savedCallback)(void); u16 usedHeldItems[PARTY_SIZE][NUM_BATTLE_SIDES]; // For each party member and side. For harvest, recycle @@ -735,7 +743,6 @@ struct BattleStruct u16 arenaStartHp[2]; u8 arenaLostPlayerMons; // Bits for party member, lost as in referee's decision, not by fainting. u8 arenaLostOpponentMons; - u8 alreadyStatusedMoveAttempt; // As bits for battlers; For example when using Thunder Wave on an already paralyzed Pokémon. u8 debugBattler; u8 magnitudeBasePower; u8 presentBasePower; @@ -745,7 +752,6 @@ struct BattleStruct u8 savedTargetCount:4; u8 savedAttackerCount:4; bool8 ateBoost[MAX_BATTLERS_COUNT]; - u8 activeAbilityPopUps; // as bits for each battler u8 abilityPopUpSpriteIds[MAX_BATTLERS_COUNT][2]; // two per battler struct ZMoveData zmove; struct DynamaxData dynamax; @@ -754,7 +760,6 @@ struct BattleStruct enum BattleIntroStates introState:8; u8 ateBerry[2]; // array id determined by side, each party pokemon as bit 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 u16 tracedAbility[MAX_BATTLERS_COUNT]; u16 hpBefore[MAX_BATTLERS_COUNT]; // Hp of battlers before using a move. For Berserk and Anger Shell. @@ -769,8 +774,6 @@ struct BattleStruct u16 changedSpecies[NUM_BATTLE_SIDES][PARTY_SIZE]; // For forms when multiple mons can change into the same pokemon. u8 quickClawBattlerId; struct LostItem itemLost[NUM_BATTLE_SIDES][PARTY_SIZE]; // Pokemon that had items consumed or stolen (two bytes per party member per side) - u8 forcedSwitch:4; // For each battler - u8 additionalEffectsCounter:4; // A counter for the additionalEffects applied by the current move in Cmd_setadditionaleffects u8 blunderPolicy:1; // should blunder policy activate u8 swapDamageCategory:1; // Photon Geyser, Shell Side Arm, Light That Burns the Sky u8 bouncedMoveIsUsed:1; @@ -789,50 +792,48 @@ struct BattleStruct u8 hitSwitchTargetFailed:1; u8 effectsBeforeUsingMoveDone:1; // Mega Evo and Focus Punch/Shell Trap effects. u8 spriteIgnore0Hp:1; - u8 targetsDone[MAX_BATTLERS_COUNT]; // Each battler as a bit. - u16 overwrittenAbilities[MAX_BATTLERS_COUNT]; // abilities overwritten during battle (keep separate from battle history in case of switching) 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. u8 bonusCritStages[MAX_BATTLERS_COUNT]; // G-Max Chi Strike boosts crit stages of allies. u8 itemPartyIndex[MAX_BATTLERS_COUNT]; u8 itemMoveIndex[MAX_BATTLERS_COUNT]; - u8 trainerSlideFirstCriticalHitMsgState:2; - u8 trainerSlideFirstSuperEffectiveHitMsgState:2; - u8 trainerSlideFirstSTABMoveMsgState:2; - u8 trainerSlidePlayerMonUnaffectedMsgState:2; - u8 trainerSlideHalfHpMsgDone:1; - u8 trainerSlideMegaEvolutionMsgDone:1; - u8 trainerSlideZMoveMsgDone:1; - u8 trainerSlideBeforeFirstTurnMsgDone:1; - u8 trainerSlideDynamaxMsgDone:1; - u8 trainerSlideLowHpMsgDone:1; u8 pledgeMove:1; u8 isSkyBattle:1; u32 aiDelayTimer; // Counts number of frames AI takes to choose an action. u32 aiDelayFrames; // Number of frames it took to choose an action. u8 timesGotHit[NUM_BATTLE_SIDES][PARTY_SIZE]; - u8 enduredDamage; u8 transformZeroToHero[NUM_BATTLE_SIDES]; u8 stickySyrupdBy[MAX_BATTLERS_COUNT]; u8 intrepidSwordBoost[NUM_BATTLE_SIDES]; u8 dauntlessShieldBoost[NUM_BATTLE_SIDES]; u8 supersweetSyrup[NUM_BATTLE_SIDES]; u8 supremeOverlordCounter[MAX_BATTLERS_COUNT]; - u8 quickClawRandom[MAX_BATTLERS_COUNT]; - u8 quickDrawRandom[MAX_BATTLERS_COUNT]; u8 shellSideArmCategory[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; u8 speedTieBreaks; // MAX_BATTLERS_COUNT! values. - u8 boosterEnergyActivates; u8 categoryOverride; // for Z-Moves and Max Moves - u8 commandingDondozo; u16 commanderActive[MAX_BATTLERS_COUNT]; u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side + u8 monCausingSleepClause[NUM_BATTLE_SIDES]; // Stores which pokemon on a given side is causing Sleep Clause to be active as the mon's index in the party + u8 additionalEffectsCounter:4; // A counter for the additionalEffects applied by the current move in Cmd_setadditionaleffects u8 redCardActivates:1; + u8 padding2:2; // padding in the middle so pursuit fields are together + u8 pursuitStoredSwitch; // Stored id for the Pursuit target's switch + s32 battlerExpReward; + u16 prevTurnSpecies[MAX_BATTLERS_COUNT]; // Stores species the AI has in play at start of turn + s32 moveDamage[MAX_BATTLERS_COUNT]; + s32 critChance[MAX_BATTLERS_COUNT]; + u16 moveResultFlags[MAX_BATTLERS_COUNT]; + u8 missStringId[MAX_BATTLERS_COUNT]; + u8 noResultString[MAX_BATTLERS_COUNT]; + u8 doneDoublesSpreadHit:1; + u8 calculatedDamageDone:1; + u8 calculatedSpreadMoveAccuracy:1; + u8 printedStrongWindsWeakenedAttack:1; + u8 numSpreadTargets:2; u8 bypassMoldBreakerChecks:1; // for ABILITYEFFECT_IMMUNITY - u8 padding:6; + u8 padding3:1; u8 usedEjectItem; u8 usedMicleBerry; + struct MessageStatus slideMessageStatus; u8 trainerSlideSpriteIds[MAX_BATTLERS_COUNT]; u8 embodyAspectBoost[NUM_BATTLE_SIDES]; }; @@ -846,19 +847,49 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define F_DYNAMIC_TYPE_IGNORE_PHYSICALITY (1 << 6) // If set, the dynamic type's physicality won't be used for certain move effects. #define F_DYNAMIC_TYPE_SET (1 << 7) // Set for all dynamic types to distinguish a dynamic type of Normal (0) from no dynamic type. -#define IS_MOVE_PHYSICAL(move) (GetBattleMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) -#define IS_MOVE_SPECIAL(move) (GetBattleMoveCategory(move) == DAMAGE_CATEGORY_SPECIAL) -#define IS_MOVE_STATUS(move) (gMovesInfo[move].category == DAMAGE_CATEGORY_STATUS) +static inline bool32 IsBattleMovePhysical(u32 move) +{ + return GetBattleMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL; +} -#define IS_MOVE_RECOIL(move)(gMovesInfo[move].recoil > 0 || gMovesInfo[move].effect == EFFECT_RECOIL_IF_MISS) +static inline bool32 IsBattleMoveSpecial(u32 move) +{ + return GetBattleMoveCategory(move) == DAMAGE_CATEGORY_SPECIAL; +} -#define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP) -#define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0) || (gBattleStruct->enduredDamage & (1u << gBattlerTarget))) -#define BATTLER_TURN_DAMAGED(battlerId) ((gSpecialStatuses[battlerId].physicalDmg != 0 || gSpecialStatuses[battlerId].specialDmg != 0) || (gBattleStruct->enduredDamage & (1u << battlerId))) +static inline bool32 IsBattleMoveStatus(u32 move) +{ + return GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS; +} -#define IS_BATTLER_OF_TYPE(battlerId, type)((GetBattlerType(battlerId, 0, FALSE) == type || GetBattlerType(battlerId, 1, FALSE) == type || (GetBattlerType(battlerId, 2, FALSE) != TYPE_MYSTERY && GetBattlerType(battlerId, 2, FALSE) == type))) -#define IS_BATTLER_OF_BASE_TYPE(battlerId, type)((GetBattlerType(battlerId, 0, TRUE) == type || GetBattlerType(battlerId, 1, TRUE) == type || (GetBattlerType(battlerId, 2, TRUE) != TYPE_MYSTERY && GetBattlerType(battlerId, 2, TRUE) == type))) -#define IS_BATTLER_TYPELESS(battlerId)(GetBattlerType(battlerId, 0, FALSE) == TYPE_MYSTERY && GetBattlerType(battlerId, 1, FALSE) == TYPE_MYSTERY && GetBattlerType(battlerId, 2, FALSE) == TYPE_MYSTERY) +static inline bool32 IsBattleMoveRecoil(u32 move) +{ + return GetMoveRecoil(move) > 0 || GetMoveEffect(move) == EFFECT_RECOIL_IF_MISS; +} + +/* Checks if 'battlerId' is any of the types. + * Passing multiple types is more efficient than calling this multiple + * times with one type because it shares the 'GetBattlerTypes' result. */ +#define _IS_BATTLER_ANY_TYPE(battlerId, ignoreTera, ...) \ + ({ \ + u32 types[3]; \ + GetBattlerTypes(battlerId, ignoreTera, types); \ + RECURSIVELY(R_FOR_EACH(_IS_BATTLER_ANY_TYPE_HELPER, __VA_ARGS__)) FALSE; \ + }) + +#define _IS_BATTLER_ANY_TYPE_HELPER(type) (types[0] == type) || (types[1] == type) || (types[2] == type) || + +#define IS_BATTLER_ANY_TYPE(battlerId, ...) _IS_BATTLER_ANY_TYPE(battlerId, FALSE, __VA_ARGS__) +#define IS_BATTLER_OF_TYPE IS_BATTLER_ANY_TYPE +#define IS_BATTLER_ANY_BASE_TYPE(battlerId, ...) _IS_BATTLER_ANY_TYPE(battlerId, TRUE, __VA_ARGS__) +#define IS_BATTLER_OF_BASE_TYPE IS_BATTLER_ANY_BASE_TYPE + +#define IS_BATTLER_TYPELESS(battlerId) \ + ({ \ + u32 types[3]; \ + GetBattlerTypes(battlerId, FALSE, types); \ + types[0] == TYPE_MYSTERY && types[1] == TYPE_MYSTERY && types[2] == TYPE_MYSTERY; \ + }) #define SET_BATTLER_TYPE(battlerId, type) \ { \ @@ -896,6 +927,8 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define SET_STATCHANGER(statId, stage, goesDown) (gBattleScripting.statChanger = (statId) + ((stage) << 3) + (goesDown << 7)) #define SET_STATCHANGER2(dst, statId, stage, goesDown)(dst = (statId) + ((stage) << 3) + (goesDown << 7)) +#define DO_ACCURACY_CHECK 2 // Don't skip the accuracy check before the move might be absorbed + // NOTE: The members of this struct have hard-coded offsets // in include/constants/battle_script_commands.h struct BattleScripting @@ -1076,8 +1109,6 @@ extern u8 gChosenMovePos; extern u16 gCurrentMove; extern u16 gChosenMove; extern u16 gCalledMove; -extern s32 gBattleMoveDamage; -extern s32 gHpDealt; extern s32 gBideDmg[MAX_BATTLERS_COUNT]; extern u16 gLastUsedItem; extern u16 gLastUsedAbility; @@ -1087,7 +1118,6 @@ extern u8 gBattlerFainted; extern u8 gEffectBattler; extern u8 gPotentialItemEffectBattler; extern u8 gAbsentBattlerFlags; -extern u8 gIsCriticalHit; extern u8 gMultiHitCounter; extern const u8 *gBattlescriptCurrInstr; extern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT]; @@ -1103,7 +1133,6 @@ extern u16 gLockedMoves[MAX_BATTLERS_COUNT]; extern u16 gLastUsedMove; extern u8 gLastHitBy[MAX_BATTLERS_COUNT]; extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT]; -extern u16 gMoveResultFlags; extern u32 gHitMarker; extern u8 gBideTarget[MAX_BATTLERS_COUNT]; extern u32 gSideStatuses[NUM_BATTLE_SIDES]; @@ -1141,9 +1170,9 @@ extern u16 gBattleMovePower; extern u16 gMoveToLearn; extern u32 gFieldStatuses; extern struct FieldTimer gFieldTimers; +extern u16 gBattleTurnCounter; extern u8 gBattlerAbility; extern struct QueuedStatBoost gQueuedStatBoosts[MAX_BATTLERS_COUNT]; -extern const struct BattleMoveEffect gBattleMoveEffects[]; extern void (*gPreBattleCallback1)(void); extern void (*gBattleMainFunc)(void); @@ -1160,16 +1189,71 @@ extern bool8 gLastUsedBallMenuPresent; extern u8 gPartyCriticalHits[PARTY_SIZE]; extern u8 gCategoryIconSpriteId; +static inline bool32 IsBattlerAlive(u32 battler) +{ + if (gBattleMons[battler].hp == 0) + return FALSE; + else if (battler >= gBattlersCount) + return FALSE; + else if (gAbsentBattlerFlags & (1u << battler)) + return FALSE; + else + return TRUE; +} + +static inline bool32 IsBattlerTurnDamaged(u32 battler) +{ + return gSpecialStatuses[battler].physicalDmg != 0 + || gSpecialStatuses[battler].specialDmg != 0 + || gSpecialStatuses[battler].enduredDamage; +} + +static inline bool32 IsBattlerAtMaxHp(u32 battler) +{ + return gBattleMons[battler].hp == gBattleMons[battler].maxHP; +} + static inline u32 GetBattlerPosition(u32 battler) { return gBattlerPositions[battler]; } +static inline u32 GetBattlerAtPosition(u32 position) +{ + u32 battler; + for (battler = 0; battler < gBattlersCount; battler++) + { + if (GetBattlerPosition(battler) == position) + break; + } + return battler; +} + +static inline u32 GetPartnerBattler(u32 battler) +{ + return GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); +} + +static inline u32 GetOppositeBattler(u32 battler) +{ + return GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); +} + static inline u32 GetBattlerSide(u32 battler) { return GetBattlerPosition(battler) & BIT_SIDE; } +static inline bool32 IsBattlerAlly(u32 battlerAtk, u32 battlerDef) +{ + return (GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef)); +} + +static inline u32 GetOpposingSideBattler(u32 battler) +{ + return GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(battler))); +} + static inline struct Pokemon* GetPartyBattlerData(u32 battler) { u32 index = gBattlerPartyIndexes[battler]; @@ -1191,5 +1275,24 @@ static inline bool32 IsDoubleBattle(void) return gBattleTypeFlags & BATTLE_TYPE_DOUBLE; } +static inline bool32 IsSpreadMove(u32 moveTarget) +{ + return IsDoubleBattle() && (moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY); +} + +static inline bool32 IsDoubleSpreadMove(void) +{ + return gBattleStruct->numSpreadTargets > 1 + && !(gHitMarker & (HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_UNABLE_TO_USE_MOVE)) + && IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove)); +} + +static inline bool32 IsBattlerInvalidForSpreadMove(u32 battlerAtk, u32 battlerDef, u32 moveTarget) +{ + return battlerDef == battlerAtk + || !IsBattlerAlive(battlerDef) + || (battlerDef == BATTLE_PARTNER(battlerAtk) && (moveTarget == MOVE_TARGET_BOTH)); +} + #endif // GUARD_BATTLE_H diff --git a/include/battle_ai_main.h b/include/battle_ai_main.h index 3617be910f..b21b20751d 100644 --- a/include/battle_ai_main.h +++ b/include/battle_ai_main.h @@ -35,7 +35,7 @@ typedef s32 (*AiScoreFunc)(u32, u32, u32, s32); #define POWERFUL_STATUS_MOVE 10 // Moves with this score will be chosen over a move that faints target #define NO_DAMAGE_OR_FAILS -20 // Move fails or does no damage -// Scores given in AI_CalcMoveEffectScore +// Scores given in AI_CalcMoveEffectScore and AI_CalcHoldEffectMoveScore #define NO_INCREASE 0 #define WEAK_EFFECT 1 #define DECENT_EFFECT 2 @@ -57,21 +57,30 @@ typedef s32 (*AiScoreFunc)(u32, u32, u32, s32); #define SET_SCORE(battler, movesetIndex, val) \ do \ { \ - TestRunner_Battle_AISetScore(__FILE__, __LINE__, battler, movesetIndex, val); \ + if (TESTING) \ + { \ + TestRunner_Battle_AISetScore(__FILE__, __LINE__, battler, movesetIndex, val); \ + } \ AI_THINKING_STRUCT->score[movesetIndex] = val; \ } while (0) \ #define ADJUST_SCORE(val) \ do \ { \ - TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, sBattler_AI, AI_THINKING_STRUCT->movesetIndex, val); \ + if (TESTING) \ + { \ + TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, AI_THINKING_STRUCT->movesetIndex, val); \ + } \ score += val; \ } while (0) \ #define ADJUST_AND_RETURN_SCORE(val) \ do \ { \ - TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, sBattler_AI, AI_THINKING_STRUCT->movesetIndex, val); \ + if (TESTING) \ + { \ + TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, AI_THINKING_STRUCT->movesetIndex, val); \ + } \ score += val; \ return score; \ } while (0) \ @@ -79,7 +88,10 @@ typedef s32 (*AiScoreFunc)(u32, u32, u32, s32); #define ADJUST_SCORE_PTR(val) \ do \ { \ - TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, sBattler_AI, AI_THINKING_STRUCT->movesetIndex, val); \ + if (TESTING) \ + { \ + TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, AI_THINKING_STRUCT->movesetIndex, val); \ + } \ (*score) += val; \ } while (0) \ @@ -98,13 +110,11 @@ typedef s32 (*AiScoreFunc)(u32, u32, u32, s32); void BattleAI_SetupItems(void); void BattleAI_SetupFlags(void); void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler); -u32 BattleAI_ChooseMoveOrAction(void); +u32 BattleAI_ChooseMoveOrAction(u32 battler); void Ai_InitPartyStruct(void); void Ai_UpdateSwitchInData(u32 battler); void Ai_UpdateFaintData(u32 battler); void SetAiLogicDataForTurn(struct AiLogicData *aiData); void ResetDynamicAiFunc(void); -extern u8 sBattler_AI; - #endif // GUARD_BATTLE_AI_MAIN_H diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index 28eb318b2f..f6cabcc684 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -1,9 +1,48 @@ #ifndef GUARD_BATTLE_AI_SWITCH_ITEMS_H #define GUARD_BATTLE_AI_SWITCH_ITEMS_H +enum ShouldSwitchScenario +{ + SHOULD_SWITCH_WONDER_GUARD, + SHOULD_SWITCH_ABSORBS_MOVE, + SHOULD_SWITCH_TRAPPER, + SHOULD_SWITCH_FREE_TURN, + SHOULD_SWITCH_TRUANT, + SHOULD_SWITCH_ALL_MOVES_BAD, + SHOULD_SWITCH_PERISH_SONG, + SHOULD_SWITCH_YAWN, + SHOULD_SWITCH_BADLY_POISONED, + SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED, + SHOULD_SWITCH_CURSED, + SHOULD_SWITCH_CURSED_STATS_RAISED, + SHOULD_SWITCH_NIGHTMARE, + SHOULD_SWITCH_NIGHTMARE_STATS_RAISED, + SHOULD_SWITCH_SEEDED, + SHOULD_SWITCH_SEEDED_STATS_RAISED, + SHOULD_SWITCH_INFATUATION, + SHOULD_SWITCH_HASBADODDS, + SHOULD_SWITCH_NATURAL_CURE_STRONG, + SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED, + SHOULD_SWITCH_NATURAL_CURE_WEAK, + SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED, + SHOULD_SWITCH_REGENERATOR, + SHOULD_SWITCH_REGENERATOR_STATS_RAISED, + SHOULD_SWITCH_ENCORE_STATUS, + SHOULD_SWITCH_ENCORE_DAMAGE, + SHOULD_SWITCH_CHOICE_LOCKED, + SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO, + SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS, +}; + +enum SwitchType +{ + SWITCH_AFTER_KO, + SWITCH_MID_BATTLE, +}; + void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); void AI_TrySwitchOrUseItem(u32 battler); -u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd); +u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType); bool32 ShouldSwitch(u32 battler); bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2); diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index eb8ca35cf8..4855184fac 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -44,7 +44,7 @@ void RestoreBattlerData(u32 battlerId); u32 GetAIChosenMove(u32 battlerId); u32 GetTotalBaseStat(u32 species); bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler); -bool32 AtMaxHp(u32 battler); +bool32 AI_BattlerAtMaxHp(u32 battler); u32 GetHealthPercentage(u32 battler); bool32 IsBattlerTrapped(u32 battler, bool32 switching); s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler2, u32 moveConsidered); @@ -56,8 +56,8 @@ bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits) bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dmgMod); s32 AI_DecideKnownAbilityForTurn(u32 battlerId); u32 AI_DecideHoldEffectForTurn(u32 battlerId); -bool32 DoesBattlerIgnoreAbilityChecks(u32 atkAbility, u32 move); -u32 AI_GetWeather(struct AiLogicData *aiData); +bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move); +u32 AI_GetWeather(void); bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits); bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, u32 numHits); bool32 HasDamagingMove(u32 battlerId); @@ -80,10 +80,11 @@ bool32 IsAbilityOfRating(u32 ability, s8 rating); bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); bool32 AI_MoveMakesContact(u32 ability, u32 holdEffect, u32 move); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); +u32 AI_GetBattlerAbility(u32 battler); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); -bool32 ShouldLowerStat(u32 battler, u32 battlerAbility, u32 stat); +bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 battlerAbility, u32 stat); bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat); bool32 AreBattlersStatsMaxed(u32 battler); u32 CountPositiveStatStages(u32 battlerId); @@ -100,15 +101,14 @@ bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility); bool32 IsAffectedByPowder(u32 battler, u32 ability, u32 holdEffect); bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category); s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); -struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectiveness, bool32 considerZPower, enum DamageRollType rollType); -struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectiveness, bool32 considerZPower, u32 weather, enum DamageRollType rollType); +struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, enum DamageRollType rollType); +struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, u32 weather, enum DamageRollType rollType); bool32 AI_IsDamagedByRecoil(u32 battler); u32 GetNoOfHitsToKO(u32 dmg, s32 hp); u32 GetNoOfHitsToKOBattlerDmg(u32 dmg, u32 battlerDef); u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex); u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef); -uq4_12_t AI_GetTypeEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); -u32 AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); +uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); u16 *GetMovesArray(u32 battler); bool32 IsConfusionMoveEffect(u32 moveEffect); bool32 HasMove(u32 battlerId, u32 move); @@ -116,18 +116,18 @@ bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensiv bool32 HasMoveWithCategory(u32 battler, u32 category); bool32 HasMoveWithType(u32 battler, u32 type); bool32 HasMoveEffect(u32 battlerId, u32 moveEffect); -bool32 HasMoveEffectANDArg(u32 battlerId, u32 effect, u32 argument); +bool32 IsPowerBasedOnStatus(u32 battlerId, u32 effect, u32 argument); bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect); bool32 HasMoveWithCriticalHitChance(u32 battlerId); bool32 HasMoveWithMoveEffectExcept(u32 battlerId, u32 moveEffect, u32 exception); bool32 HasMoveThatLowersOwnStats(u32 battlerId); bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); bool32 HasAnyKnownMove(u32 battlerId); -bool32 IsAromaVeilProtectedMove(u32 move); +bool32 IsAromaVeilProtectedEffect(u32 moveEffect); bool32 IsNonVolatileStatusMoveEffect(u32 moveEffect); -bool32 IsMoveRedirectionPrevented(u32 move, u32 atkAbility); +bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility); bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move); -bool32 IsHazardMoveEffect(u32 moveEffect); +bool32 IsHazardMove(u32 move); bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move); void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, s32 *score); bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect); @@ -146,6 +146,7 @@ bool32 IsStatRaisingEffect(u32 effect); bool32 IsStatLoweringEffect(u32 effect); bool32 IsSelfStatLoweringEffect(u32 effect); bool32 IsSwitchOutEffect(u32 effect); +bool32 IsChaseEffect(u32 effect); bool32 IsAttackBoostMoveEffect(u32 effect); bool32 IsUngroundingEffect(u32 effect); bool32 IsSemiInvulnerable(u32 battlerDef, u32 move); @@ -153,6 +154,8 @@ bool32 HasSubstituteIgnoringMove(u32 battler); bool32 HasHighCritRatioMove(u32 battler); bool32 HasMagicCoatAffectedMove(u32 battler); bool32 HasSnatchAffectedMove(u32 battler); +bool32 IsHazardClearingMove(u32 move); +bool32 IsSubstituteEffect(u32 effect); // status checks bool32 AI_CanGetFrostbite(u32 battler, u32 ability); @@ -182,9 +185,11 @@ bool32 PartnerHasSameMoveEffectWithoutTarget(u32 battlerAtkPartner, u32 move, u3 bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove); bool32 IsMoveEffectWeather(u32 move); bool32 PartnerMoveEffectIsTerrain(u32 battlerAtkPartner, u32 partnerMove); +bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, u32 effectCheck); bool32 PartnerMoveIs(u32 battlerAtkPartner, u32 partnerMove, u32 moveCheck); bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove); bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove); +bool32 PartnerMoveActivatesSleepClause(u32 move); bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move); // party logic @@ -212,7 +217,9 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef); bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData); -void IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); +u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsBattlerItemEnabled(u32 battler); +bool32 IsBattlerPredictedToSwitch(u32 battler); +bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef); #endif //GUARD_BATTLE_AI_UTIL_H diff --git a/include/battle_anim.h b/include/battle_anim.h index 96ba0c52ab..ce94f667e3 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -165,7 +165,6 @@ void Trade_MoveSelectedMonToTarget(struct Sprite *sprite); void DestroyAnimVisualTaskAndDisableBlend(u8 taskId); void DestroySpriteAndFreeResources_(struct Sprite *sprite); void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId); -u8 GetBattlerAtPosition(u8 position); void ConvertPosDataToTranslateLinearData(struct Sprite *sprite); void InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite); @@ -267,6 +266,7 @@ void AnimConversion(struct Sprite *sprite); void AnimCuttingSlice(struct Sprite *sprite); void AnimThoughtBubble(struct Sprite *sprite); void AnimTranslateLinearSingleSineWave(struct Sprite *sprite); +void AnimTeraStarstormStars(struct Sprite *sprite); void AnimGrantingStars(struct Sprite *sprite); void AnimFollowMeFinger(struct Sprite *sprite); extern const union AnimCmd *const gRazorLeafParticleAnimTable[]; @@ -464,6 +464,7 @@ void AnimElectricPuff(struct Sprite *sprite); void AnimSparkElectricityFlashing(struct Sprite *sprite); void AnimGrowingShockWaveOrb(struct Sprite *sprite); void AnimElectricity(struct Sprite *); +void AnimTask_VoltSwitch(struct Sprite* sprite); extern const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb[]; extern const union AffineAnimCmd *const gAffineAnims_FlashingSpark[]; extern const union AnimCmd *const gAnims_ThunderboltOrb[]; diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 6bd17f90b9..0b7ea171c9 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -168,10 +168,6 @@ enum CONTROLLER_CHOSENMONRETURNVALUE, CONTROLLER_ONERETURNVALUE, CONTROLLER_ONERETURNVALUE_DUPLICATE, - CONTROLLER_CLEARUNKVAR, - CONTROLLER_SETUNKVAR, - CONTROLLER_CLEARUNKFLAG, - CONTROLLER_TOGGLEUNKFLAG, CONTROLLER_HITANIMATION, CONTROLLER_CANTSWITCH, CONTROLLER_PLAYSE, @@ -323,6 +319,7 @@ void SetControllerToRecordedPlayer(u32 battler); // opponent controller void SetControllerToOpponent(u32 battler); +void OpponentHandleTrainerSlide(u32 battler); // player partner controller void Controller_PlayerPartnerShowIntroHealthbox(u32 battler); // Also used by the link partner. diff --git a/include/battle_dynamax.h b/include/battle_dynamax.h index 9957c37a10..0762601c89 100644 --- a/include/battle_dynamax.h +++ b/include/battle_dynamax.h @@ -3,59 +3,6 @@ #define DYNAMAX_TURNS_COUNT 3 -enum MaxMoveEffect -{ - MAX_EFFECT_NONE, - MAX_EFFECT_RAISE_TEAM_ATTACK, - MAX_EFFECT_RAISE_TEAM_DEFENSE, - MAX_EFFECT_RAISE_TEAM_SPEED, - MAX_EFFECT_RAISE_TEAM_SP_ATK, - MAX_EFFECT_RAISE_TEAM_SP_DEF, - MAX_EFFECT_LOWER_ATTACK, - MAX_EFFECT_LOWER_DEFENSE, - MAX_EFFECT_LOWER_SPEED, - MAX_EFFECT_LOWER_SP_ATK, - MAX_EFFECT_LOWER_SP_DEF, - MAX_EFFECT_SUN, - MAX_EFFECT_RAIN, - MAX_EFFECT_SANDSTORM, - MAX_EFFECT_HAIL, - MAX_EFFECT_MISTY_TERRAIN, - MAX_EFFECT_GRASSY_TERRAIN, - MAX_EFFECT_ELECTRIC_TERRAIN, - MAX_EFFECT_PSYCHIC_TERRAIN, - MAX_EFFECT_VINE_LASH, - MAX_EFFECT_WILDFIRE, - MAX_EFFECT_CANNONADE, - MAX_EFFECT_EFFECT_SPORE_FOES, - MAX_EFFECT_PARALYZE_FOES, - MAX_EFFECT_CONFUSE_FOES_PAY_DAY, - MAX_EFFECT_CRIT_PLUS, - MAX_EFFECT_MEAN_LOOK, - MAX_EFFECT_AURORA_VEIL, - MAX_EFFECT_INFATUATE_FOES, - MAX_EFFECT_RECYCLE_BERRIES, - MAX_EFFECT_POISON_FOES, - MAX_EFFECT_STEALTH_ROCK, - MAX_EFFECT_DEFOG, - MAX_EFFECT_POISON_PARALYZE_FOES, - MAX_EFFECT_HEAL_TEAM, - MAX_EFFECT_SPITE, - MAX_EFFECT_GRAVITY, - MAX_EFFECT_VOLCALITH, - MAX_EFFECT_SANDBLAST_FOES, - MAX_EFFECT_YAWN_FOE, - MAX_EFFECT_LOWER_EVASIVENESS_FOES, - MAX_EFFECT_AROMATHERAPY, - MAX_EFFECT_CONFUSE_FOES, - MAX_EFFECT_STEELSURGE, - MAX_EFFECT_TORMENT_FOES, - MAX_EFFECT_LOWER_SPEED_2_FOES, - MAX_EFFECT_FIRE_SPIN_FOES, - MAX_EFFECT_FIXED_POWER, - MAX_EFFECT_BYPASS_PROTECT, -}; - bool32 CanDynamax(u32 battler); bool32 IsGigantamaxed(u32 battler); void ApplyDynamaxHPMultiplier(struct Pokemon* mon); @@ -67,12 +14,11 @@ bool32 IsMoveBlockedByMaxGuard(u32 move); bool32 IsMoveBlockedByDynamax(u32 move); u16 GetMaxMove(u32 battler, u32 baseMove); -u8 GetMaxMovePower(u32 move); +u32 GetMaxMovePower(u32 move); bool32 IsMaxMove(u32 move); void ChooseDamageNonTypesString(u8 type); void BS_UpdateDynamax(void); -void BS_SetMaxMoveEffect(void); void BS_SetSteelsurge(void); void BS_TrySetStatus1(void); void BS_TrySetStatus2(void); diff --git a/include/battle_main.h b/include/battle_main.h index 7e3206c554..e8368f82d6 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -72,7 +72,7 @@ void SwapTurnOrder(u8 id1, u8 id2); u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect); u32 GetBattlerTotalSpeedStat(u32 battler); s8 GetChosenMovePriority(u32 battlerId); -s8 GetMovePriority(u32 battlerId, u16 move); +s8 GetBattleMovePriority(u32 battlerId, u16 move); s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, u32 ability1, u32 ability2, u32 holdEffectBattler1, u32 holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); diff --git a/include/battle_message.h b/include/battle_message.h index 7d000d289f..adc399dd3c 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -73,8 +73,8 @@ #define B_TXT_DEF_NAME 0x39 #define B_TXT_DEF_TEAM1 0x3A // Your/The opposing #define B_TXT_DEF_TEAM2 0x3B // your/the opposing -// #define B_TXT_SELECTION_NAME 0x3C - removed -// #define B_TXT_SELECTION_NAME2 0x3D no Illusion check - removed +#define B_TXT_DEF_PARTNER_NAME 0x3C +// #define B_UNUSED_0x3D 0x3D #define B_TXT_ATK_NAME_WITH_PREFIX2 0x3E //lowercase #define B_TXT_DEF_NAME_WITH_PREFIX2 0x3F //lowercase #define B_TXT_EFF_NAME_WITH_PREFIX2 0x40 //lowercase @@ -245,35 +245,18 @@ struct BattleMsgData u8 textBuffs[3][TEXT_BUFF_ARRAY_COUNT]; }; -enum -{ - TRAINER_SLIDE_LAST_SWITCHIN, - TRAINER_SLIDE_LAST_LOW_HP, - TRAINER_SLIDE_FIRST_DOWN, - TRAINER_SLIDE_LAST_HALF_HP, - TRAINER_SLIDE_FIRST_CRITICAL_HIT, - TRAINER_SLIDE_FIRST_SUPER_EFFECTIVE_HIT, - TRAINER_SLIDE_FIRST_STAB_MOVE, - TRAINER_SLIDE_PLAYER_MON_UNAFFECTED, - TRAINER_SLIDE_MEGA_EVOLUTION, - TRAINER_SLIDE_Z_MOVE, - TRAINER_SLIDE_BEFORE_FIRST_TURN, - TRAINER_SLIDE_DYNAMAX, -}; - void BufferStringBattle(u16 stringID, u32 battler); u32 BattleStringExpandPlaceholdersToDisplayedString(const u8 *src); u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize); void BattlePutTextOnWindow(const u8 *text, u8 windowId); void SetPpNumbersPaletteInMoveSelection(u32 battler); u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp); -u32 ShouldDoTrainerSlide(u32 battler, u32 which); // return 1 for TrainerA, 2 forTrainerB void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst); extern struct BattleMsgData *gBattleMsgDataPtr; extern const u8 *const gBattleStringsTable[]; -extern const u8 *const gStatNamesTable[]; +extern const u8 *const gStatNamesTable[NUM_BATTLE_STATS]; extern const u8 *const gPokeblockWasTooXStringTable[]; extern const u8 *const gRefereeStringsTable[]; extern const u8 *const gRoundsStringTable[]; diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 32d8fc0238..cc6c09012c 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -41,9 +41,9 @@ bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget); bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget); bool32 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); -u32 IsLeafGuardProtected(u32 battler); -bool32 IsShieldsDownProtected(u32 battler); -u32 IsAbilityStatusProtected(u32 battler); +u32 IsLeafGuardProtected(u32 battler, u32 ability); +bool32 IsShieldsDownProtected(u32 battler, u32 ability); +u32 IsAbilityStatusProtected(u32 battler, u32 ability); bool32 TryResetBattlerStatChanges(u8 battler); bool32 CanCamouflage(u8 battlerId); u32 GetNaturePowerMove(u32 battler); @@ -51,7 +51,6 @@ void StealTargetItem(u8 battlerStealer, u8 battlerItem); u8 GetCatchingBattler(void); u32 GetHighestStatId(u32 battlerId); bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType); -bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef); bool32 IsMoveNotAllowedInSkyBattles(u32 move); bool32 DoSwitchInAbilities(u32 battlerId); u8 GetFirstFaintedPartyIndex(u8 battlerId); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 40352b88e4..ffa18d0343 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -46,19 +46,16 @@ extern const u8 BattleScript_PrintFailedToRunString[]; extern const u8 BattleScript_PrintCantEscapeFromBattle[]; extern const u8 BattleScript_PrintFullBox[]; extern const u8 BattleScript_ActionSwitch[]; +extern const u8 BattleScript_DoSwitchOut[]; +extern const u8 BattleScript_MoveSwitchOpenPartyScreen[]; extern const u8 BattleScript_Pausex20[]; extern const u8 BattleScript_LevelUp[]; -extern const u8 BattleScript_RainContinuesOrEnds[]; -extern const u8 BattleScript_SnowContinuesOrEnds[]; +extern const u8 BattleScript_WeatherContinues[]; +extern const u8 BattleScript_WeatherFaded[]; extern const u8 BattleScript_DamagingWeatherContinues[]; extern const u8 BattleScript_DamagingWeather[]; -extern const u8 BattleScript_IceBodyHeal[]; -extern const u8 BattleScript_SandStormHailSnowEnds[]; -extern const u8 BattleScript_SunlightContinues[]; -extern const u8 BattleScript_SunlightFaded[]; -extern const u8 BattleScript_FogContinues[]; extern const u8 BattleScript_FogEnded_Ret[]; -extern const u8 BattleScript_FogEnded[]; +extern const u8 BattleScript_IceBodyHeal[]; extern const u8 BattleScript_OverworldStatusStarts[]; extern const u8 BattleScript_OverworldWeatherStarts[]; extern const u8 BattleScript_OverworldTerrain[]; @@ -358,7 +355,6 @@ extern const u8 BattleScript_SelectingNotAllowedMoveThroatChopInPalace[]; extern const u8 BattleScript_ThroatChopEndTurn[]; extern const u8 BattleScript_GemActivates[]; extern const u8 BattleScript_BerryReduceDmg[]; -extern const u8 BattleScript_PrintBerryReduceString[]; extern const u8 BattleScript_WeaknessPolicy[]; extern const u8 BattleScript_TargetItemStatRaise[]; extern const u8 BattleScript_RockyHelmetActivates[]; @@ -520,6 +516,7 @@ extern const u8 BattleScript_BoosterEnergyEnd2[]; extern const u8 BattleScript_BoosterEnergyRet[]; extern const u8 BattleScript_TeraShellDistortingTypeMatchups[]; extern const u8 BattleScript_TeraFormChange[]; +extern const u8 BattleScript_SleepClausePreventsEnd[]; // zmoves extern const u8 BattleScript_ZMoveActivateDamaging[]; @@ -546,12 +543,17 @@ extern const u8 BattleScript_EffectAuroraVeilSuccess[]; extern const u8 BattleScript_EffectGravitySuccess[]; extern const u8 BattleScript_EffectYawnSuccess[]; extern const u8 BattleScript_EffectTryReducePP[]; -extern const u8 BattleScript_EffectStatus1Foes[]; -extern const u8 BattleScript_EffectStatus2Foes[]; +extern const u8 BattleScript_EffectParalyzeSide[]; +extern const u8 BattleScript_EffectPoisonSide[]; +extern const u8 BattleScript_EffectPoisonParalyzeSide[]; +extern const u8 BattleScript_EffectEffectSporeSide[]; +extern const u8 BattleScript_EffectConfuseSide[]; +extern const u8 BattleScript_EffectInfatuateSide[]; +extern const u8 BattleScript_EffectTormentSide[]; +extern const u8 BattleScript_EffectMeanLookSide[]; extern const u8 BattleScript_TormentEnds[]; extern const u8 BattleScript_EffectRaiseCritAlliesAnim[]; extern const u8 BattleScript_EffectHealOneSixthAllies[]; -extern const u8 BattleScript_EffectCureStatusAllies[]; extern const u8 BattleScript_EffectRecycleBerriesAllies[]; extern const u8 BattleScript_RemoveGenericType[]; @@ -624,6 +626,9 @@ extern const u8 BattleScript_EffectMimic[]; extern const u8 BattleScript_EffectMetronome[]; extern const u8 BattleScript_EffectLeechSeed[]; extern const u8 BattleScript_EffectDoNothing[]; +extern const u8 BattleScript_EffectHoldHands[]; +extern const u8 BattleScript_EffectCelebrate[]; +extern const u8 BattleScript_EffectHappyHour[]; extern const u8 BattleScript_EffectDisable[]; extern const u8 BattleScript_EffectLevelDamage[]; extern const u8 BattleScript_EffectPsywave[]; @@ -638,6 +643,7 @@ extern const u8 BattleScript_EffectSleepTalk[]; extern const u8 BattleScript_EffectDestinyBond[]; extern const u8 BattleScript_EffectSpite[]; extern const u8 BattleScript_EffectHealBell[]; +extern const u8 BattleScript_EffectHealBell_FromHeal[]; extern const u8 BattleScript_EffectMeanLook[]; extern const u8 BattleScript_EffectNightmare[]; extern const u8 BattleScript_EffectMinimize[]; @@ -816,11 +822,10 @@ extern const u8 BattleScript_MoveEffectLightScreen[]; extern const u8 BattleScript_MoveEffectReflect[]; extern const u8 BattleScript_MoveEffectLeechSeed[]; extern const u8 BattleScript_MoveEffectHaze[]; -extern const u8 BattleScript_EffectSparklySwirl[]; extern const u8 BattleScript_MoveEffectIonDeluge[]; extern const u8 BattleScript_EffectHyperspaceFury[]; extern const u8 BattleScript_EffectAuraWheel[]; -extern const u8 BattleScript_EffectPhotonGeyser[]; +extern const u8 BattleScript_EffectDynamicCategory[]; extern const u8 BattleScript_EffectNoRetreat[]; extern const u8 BattleScript_EffectTarShot[]; extern const u8 BattleScript_EffectPoltergeist[]; diff --git a/include/battle_setup.h b/include/battle_setup.h index a2009eea41..f8eda0d8dc 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -12,12 +12,43 @@ struct RematchTrainer u16 mapNum; }; +/* +the layout of the first byte can be confusing here +isDoubleBattle is the least lsb. msb is in the mode. +*/ +typedef union PACKED TrainerBattleParameter +{ + struct PACKED _TrainerBattleParameter + { + u8 isDoubleBattle:1; + u8 isRematch:1; + u8 playMusicA:1; + u8 playMusicB:1; + u8 mode:4; + u8 objEventLocalIdA; + u16 opponentA; + u8 *introTextA; + u8 *defeatTextA; + u8 *battleScriptRetAddrA; + u8 objEventLocalIdB; + u16 opponentB; + u8 *introTextB; + u8 *defeatTextB; + u8 *battleScriptRetAddrB; + u8 *victoryText; + u8 *cannotBattleText; + } params; + u8 data[sizeof(struct _TrainerBattleParameter)]; +} TrainerBattleParameter; + + extern const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES]; -extern u16 gTrainerBattleOpponent_A; -extern u16 gTrainerBattleOpponent_B; +extern TrainerBattleParameter gTrainerBattleParameter; extern u16 gPartnerTrainerId; +#define TRAINER_BATTLE_PARAM gTrainerBattleParameter.params + void BattleSetup_StartWildBattle(void); void BattleSetup_StartDoubleWildBattle(void); void BattleSetup_StartBattlePikeWildBattle(void); @@ -35,7 +66,8 @@ u8 GetTrainerBattleTransition(void); u8 GetSpecialBattleTransition(s32 id); void ChooseStarter(void); void ResetTrainerOpponentIds(void); -void SetMapVarsToTrainer(void); +void SetMapVarsToTrainerA(void); +void SetMapVarsToTrainerB(void); const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data); void ConfigureAndSetUpOneTrainerBattle(u8 trainerObjEventId, const u8 *trainerScript); void ConfigureTwoTrainersBattle(u8 trainerObjEventId, const u8 *trainerScript); @@ -67,6 +99,10 @@ bool8 ShouldTryRematchBattle(void); bool8 IsTrainerReadyForRematch(void); void ShouldTryGetTrainerScript(void); u16 CountBattledRematchTeams(u16 trainerId); +void TrainerBattleLoadArgs(const u8 *data); +void TrainerBattleLoadArgsTrainerA(const u8 *data); +void TrainerBattleLoadArgsTrainerB(const u8 *data); +void TrainerBattleLoadArgsSecondTrainer(const u8 *data); void DoStandardWildBattle_Debug(void); void BattleSetup_StartTrainerBattle_Debug(void); diff --git a/include/battle_transition.h b/include/battle_transition.h index eba514b09f..8bc80dc642 100644 --- a/include/battle_transition.h +++ b/include/battle_transition.h @@ -11,6 +11,7 @@ void GetBg0TilesDst(u16 **tilemap, u16 **tileset); extern const struct SpritePalette gSpritePalette_Pokeball; enum { + MUGSHOT_COLOR_NONE, MUGSHOT_COLOR_PURPLE, MUGSHOT_COLOR_GREEN, MUGSHOT_COLOR_PINK, diff --git a/include/battle_util.h b/include/battle_util.h index 636428854b..6b7fdef74a 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -1,6 +1,8 @@ #ifndef GUARD_BATTLE_UTIL_H #define GUARD_BATTLE_UTIL_H +#include "move.h" + #define MOVE_LIMITATION_ZEROMOVE (1 << 0) #define MOVE_LIMITATION_PP (1 << 1) #define MOVE_LIMITATION_DISABLED (1 << 2) @@ -20,13 +22,10 @@ #define MOVE_LIMITATION_PLACEHOLDER (1 << 15) #define MOVE_LIMITATIONS_ALL 0xFFFF -enum MoveBlocked +enum AbilityEffectOptions { - MOVE_BLOCKED_BY_NO_ABILITY, - MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF, - MOVE_BLOCKED_BY_DAZZLING, - MOVE_BLOCKED_BY_PARTNER_DAZZLING, - MOVE_BLOCKED_BY_GOOD_AS_GOLD, + ABILITY_CHECK_TRIGGER, + ABILITY_RUN_SCRIPT, }; enum MoveAbsorbed @@ -90,8 +89,6 @@ enum ItemEffect ITEM_STATS_CHANGE, }; -#define WEATHER_HAS_EFFECT ((!IsAbilityOnField(ABILITY_CLOUD_NINE) && !IsAbilityOnField(ABILITY_AIR_LOCK))) - #define IS_WHOLE_SIDE_ALIVE(battler) ((IsBattlerAlive(battler) && IsBattlerAlive(BATTLE_PARTNER(battler)))) #define IS_ALIVE_AND_PRESENT(battler) (IsBattlerAlive(battler) && IsBattlerSpritePresent(battler)) @@ -110,34 +107,37 @@ struct TypePower enum { CANCELLER_FLAGS, - CANCELLER_SKY_DROP, CANCELLER_STANCE_CHANGE_1, + CANCELLER_SKY_DROP, + CANCELLER_RECHARGE, CANCELLER_ASLEEP, CANCELLER_FROZEN, CANCELLER_OBEDIENCE, CANCELLER_TRUANT, - CANCELLER_RECHARGE, CANCELLER_FLINCH, + CANCELLER_IN_LOVE, CANCELLER_DISABLED, - CANCELLER_GRAVITY, CANCELLER_HEAL_BLOCKED, + CANCELLER_GRAVITY, + CANCELLER_THROAT_CHOP, CANCELLER_TAUNTED, CANCELLER_IMPRISONED, CANCELLER_CONFUSED, CANCELLER_PARALYSED, - CANCELLER_IN_LOVE, CANCELLER_BIDE, CANCELLER_THAW, CANCELLER_STANCE_CHANGE_2, + CANCELLER_WEATHER_PRIMAL, + CANCELLER_DYNAMAX_BLOCKED, CANCELLER_POWDER_MOVE, CANCELLER_POWDER_STATUS, - CANCELLER_THROAT_CHOP, + CANCELLER_PROTEAN, + CANCELLER_PSYCHIC_TERRAIN, CANCELLER_EXPLODING_DAMP, CANCELLER_MULTIHIT_MOVES, CANCELLER_Z_MOVES, + CANCELLER_MULTI_TARGET_MOVES, CANCELLER_END, - CANCELLER_PSYCHIC_TERRAIN, - CANCELLER_END2, }; enum { @@ -164,6 +164,12 @@ struct DamageCalculationData }; STATIC_ASSERT(sizeof(struct DamageCalculationData) <= 4, StructExceedsFourBytes); +enum SleepClauseBlock +{ + NOT_BLOCKED_BY_SLEEP_CLAUSE, + BLOCKED_BY_SLEEP_CLAUSE, +}; + void HandleAction_ThrowBall(void); bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move); bool32 HandleMoveTargetRedirection(void); @@ -204,14 +210,12 @@ u8 DoBattlerEndTurnEffects(void); bool32 HandleWishPerishSongOnTurnEnd(void); bool32 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); -u8 AtkCanceller_UnableToUseMove(u32 moveType); +u32 AtkCanceller_MoveSuccessOrder(void); void SetAtkCancellerForCalledMove(void); -u8 AtkCanceller_UnableToUseMove2(void); bool32 HasNoMonsToSwitch(u32 battler, u8 r1, u8 r2); -bool32 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility); -u32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef); -u32 CanPartnerAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef); -u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType); +bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility); +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef, enum AbilityEffectOptions option); +bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum AbilityEffectOptions option); u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg); bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); @@ -230,7 +234,7 @@ u32 ItemBattleEffects(enum ItemCaseId, u32 battler, bool32 moveTurn); void ClearVariousBattlerFlags(u32 battler); void HandleAction_RunBattleScript(void); u32 SetRandomTarget(u32 battler); -u32 GetMoveTarget(u16 move, u8 setTarget); +u32 GetBattleMoveTarget(u16 move, u8 setTarget); u8 GetAttackerObedienceForAction(); u32 GetBattlerHoldEffect(u32 battler, bool32 checkNegating); u32 GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating); @@ -238,7 +242,6 @@ u32 GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 check u32 GetBattlerHoldEffectParam(u32 battler); bool32 IsMoveMakingContact(u32 move, u32 battlerAtk); bool32 IsBattlerGrounded(u32 battler); -bool32 IsBattlerAlive(u32 battler); u32 GetMoveSlot(u16 *moves, u32 move); u32 GetBattlerWeight(u32 battler); u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); @@ -250,8 +253,9 @@ uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); uq4_12_t GetTypeModifier(u32 atkType, u32 defType); uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType); -s32 GetStealthHazardDamage(u8 hazardType, u32 battler); -s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 maxHp); +void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags); +s32 GetStealthHazardDamage(enum TypeSideHazard hazardType, u32 battler); +s32 GetStealthHazardDamageByTypesAndHP(enum TypeSideHazard hazardType, u8 type1, u8 type2, u32 maxHp); bool32 CanMegaEvolve(u32 battler); bool32 CanUltraBurst(u32 battler); void ActivateMegaEvolution(u32 battler); @@ -304,12 +308,12 @@ bool32 IsGen6ExpShareEnabled(void); bool32 MoveHasAdditionalEffect(u32 move, u32 moveEffect); bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance); bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect); -bool32 MoveHasAdditionalEffectSelfArg(u32 move, u32 moveEffect, u32 argument); +bool32 IsMoveEffectRemoveSpeciesType(u32 move, u32 moveEffect, u32 argument); bool32 MoveHasChargeTurnAdditionalEffect(u32 move); bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef); bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef); -bool32 CanBeSlept(u32 battler, u32 ability); +bool32 CanBeSlept(u32 battler, u32 ability, enum SleepClauseBlock isBlockedBySleepClause); bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 defAbility); bool32 CanBeBurned(u32 battler, u32 ability); bool32 CanBeParalyzed(u32 battler, u32 ability); @@ -327,10 +331,23 @@ bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2); bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2); u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); -u8 GetBattlerType(u32 battler, u8 typeIndex, bool32 ignoreTera); +void GetBattlerTypes(u32 battler, bool32 ignoreTera, u32 types[static 3]); +u32 GetBattlerType(u32 battler, u32 typeIndex, bool32 ignoreTera); bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon); bool8 IsMonBannedFromSkyBattles(u16 species); void RemoveBattlerType(u32 battler, u8 type); -u32 GetMoveType(u32 move); +u32 GetBattleMoveType(u32 move); +void TryActivateSleepClause(u32 battler, u32 indexInParty); +void TryDeactivateSleepClause(u32 battlerSide, u32 indexInParty); +bool32 IsSleepClauseActiveForSide(u32 battlerSide); +bool32 IsSleepClauseEnabled(); +void ClearDamageCalcResults(void); +u32 DoesDestinyBondFail(u32 battler); +bool32 IsMoveEffectBlockedByTarget(u32 ability); +u32 NumAffectedSpreadMoveTargets(void); +bool32 IsPursuitTargetSet(void); +void ClearPursuitValuesIfSet(u32 battler); +void ClearPursuitValues(void); +bool32 HasWeatherEffect(void); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/bg.h b/include/bg.h index f981ed4b8c..89ffc8d8eb 100644 --- a/include/bg.h +++ b/include/bg.h @@ -80,7 +80,8 @@ u8 Unused_AdjustBgMosaic(u8 val, u32 mode); void SetBgTilemapBuffer(u32 bg, void *tilemap); void UnsetBgTilemapBuffer(u32 bg); void *GetBgTilemapBuffer(u32 bg); -void CopyToBgTilemapBuffer(u32 bg, const void *src, u16 mode, u16 destOffset); +void CopyToBgTilemapBuffer(u32 bg, const void *src, u32 mode, u32 destOffset); +void DecompressAndCopyToBgTilemapBuffer(u32 bg, const u32 *src, u32 mode, u32 destOffset); void CopyBgTilemapBufferToVram(u32 bg); void CopyToBgTilemapBufferRect(u32 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height); void CopyToBgTilemapBufferRect_ChangePalette(u32 bg, const void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette); diff --git a/include/config/ai.h b/include/config/ai.h new file mode 100644 index 0000000000..1fe0c822d2 --- /dev/null +++ b/include/config/ai.h @@ -0,0 +1,53 @@ +#ifndef GUARD_CONFIG_AI_H +#define GUARD_CONFIG_AI_H + +// For the details on what specific factors the switching functions are considering, go read the corresponding function inside ShouldSwitch in src/battle_ai_switch_items.c +// These configuration options control how likely the AI is to switch if it determines that a switch meets all of its criteria +// Think of them almost like success rates; if the AI has determined that it needs to switch out to hit Wonder Guard, how often do you want it to actually take that course of action? Etc. + +// AI switch chances; if you want more complex behaviour, modify GetSwitchChance +#define SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE 100 +#define SHOULD_SWITCH_TRUANT_PERCENTAGE 100 +#define SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE 100 +#define STAY_IN_STATS_RAISED 2 // Number of stat stages that must be raised across any stats before the AI won't switch mon out in certain cases + +// AI smart switching chances; if you want more complex behaviour, modify GetSwitchChance +#define SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE 100 +#define SHOULD_SWITCH_TRAPPER_PERCENTAGE 100 +#define SHOULD_SWITCH_FREE_TURN_PERCENTAGE 100 +#define STAY_IN_ABSORBING_PERCENTAGE 66 // Chance to stay in if outgoing mon has super effective move against player, will prevent switching out for an absorber with this likelihood +#define SHOULD_SWITCH_HASBADODDS_PERCENTAGE 50 +#define SHOULD_SWITCH_ENCORE_STATUS_PERCENTAGE 100 +#define SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE 50 +#define SHOULD_SWITCH_CHOICE_LOCKED_PERCENTAGE 100 // Only if locked into status move +#define SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO_PERCENTAGE 50 +#define SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS_PERCENTAGE 100 + +// AI smart switching chances for bad statuses +#define SHOULD_SWITCH_PERISH_SONG_PERCENTAGE 100 +#define SHOULD_SWITCH_YAWN_PERCENTAGE 100 +#define SHOULD_SWITCH_BADLY_POISONED_PERCENTAGE 50 +#define SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED_PERCENTAGE 20 +#define SHOULD_SWITCH_CURSED_PERCENTAGE 50 +#define SHOULD_SWITCH_CURSED_STATS_RAISED_PERCENTAGE 20 +#define SHOULD_SWITCH_NIGHTMARE_PERCENTAGE 33 +#define SHOULD_SWITCH_NIGHTMARE_STATS_RAISED_PERCENTAGE 15 +#define SHOULD_SWITCH_SEEDED_PERCENTAGE 25 +#define SHOULD_SWITCH_SEEDED_STATS_RAISED_PERCENTAGE 10 +#define SHOULD_SWITCH_INFATUATION_PERCENTAGE 100 + +// AI smart switching chances for beneficial abilities +#define SHOULD_SWITCH_NATURAL_CURE_STRONG_PERCENTAGE 66 +#define SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED_PERCENTAGE 10 +#define SHOULD_SWITCH_NATURAL_CURE_WEAK_PERCENTAGE 25 +#define SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED_PERCENTAGE 10 +#define SHOULD_SWITCH_REGENERATOR_PERCENTAGE 50 +#define SHOULD_SWITCH_REGENERATOR_STATS_RAISED_PERCENTAGE 20 + +// AI held item-based move scoring +#define LOW_ACCURACY_THRESHOLD 75 // Moves with accuracy equal OR below this value are considered low accuracy + +// AI prediction chances +#define PREDICT_SWITCH_CHANCE 50 + +#endif // GUARD_CONFIG_AI_H diff --git a/include/config/battle.h b/include/config/battle.h index 34e022f5eb..bacdc770d9 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -126,6 +126,8 @@ #define B_POWDER_RAIN GEN_LATEST // In Gen7+, Powder doesn't damage the user of a Fire type move in heavy rain. #define B_AFTER_YOU_TURN_ORDER GEN_LATEST // In Gen8+, After You doesn't fail if the turn order wouldn't change after use. #define B_QUASH_TURN_ORDER GEN_LATEST // In Gen8+, Quash-affected battlers move according to speed order. Before Gen8, Quash-affected battlers move in the order they were affected by Quash. +#define B_DESTINY_BOND_FAIL GEN_LATEST // In Gen7+, Destiny Bond fails if used repeatedly. +#define B_PURSUIT_TARGET GEN_LATEST // In Gen4+, Pursuit attacks a switching opponent even if they weren't targeting them. Before Gen4, Pursuit only attacks a switching opponent that it originally targeted. // Ability settings #define B_ABILITY_WEATHER GEN_LATEST // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move or a different weather-affecting ability. @@ -182,6 +184,7 @@ #define B_DREAM_BALL_MODIFIER GEN_LATEST // In Gen8+, Dream Ball's catch multiplier is x4 when the target is asleep or has the ability Comatose. #define B_SPORT_BALL_MODIFIER GEN_LATEST // In Gen8+, Sport Ball's catch multiplier was reduced from x1.5 to x1. #define B_SAFARI_BALL_MODIFIER GEN_LATEST // In Gen8+, Safari Ball's catch multiplier was reduced from x1.5 to x1. +#define B_FRIEND_BALL_MODIFIER GEN_LATEST // In Gen8+, Friend Ball's friendship boost was reduced from 200 to 150. #define B_SERENE_GRACE_BOOST GEN_LATEST // In Gen5+, Serene Grace boosts the added flinch chance of King's Rock and Razor Fang. // Flag settings @@ -197,6 +200,7 @@ #define B_FLAG_DYNAMAX_BATTLE 0 // If this flag is set, the ability to Dynamax in battle is enabled for all trainers. #define B_FLAG_TERA_ORB_CHARGED 0 // If this flag is set, the Tera Orb is charged. It is automatically set upon healing and cleared upon Terastallizing once configured. #define B_FLAG_TERA_ORB_NO_COST 0 // If this flag is set, the Tera Orb does not use up its charge upon Terastallization. In S/V, this occurs after an event with Terapagos. +#define B_FLAG_SLEEP_CLAUSE 0 // If this flag is set, sleep clause is enabled; if the player / AI has already put a Pokémon on the opponent's side to sleep and it is still sleeping, another one can't be put to sleep. AI requires AI_FLAG_CHECK_BAD_MOVE to understand. // Var Settings // To use the following features in scripting, replace the 0s with the var ID you're assigning it to. @@ -204,6 +208,7 @@ #define B_VAR_STARTING_STATUS 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active. #define B_VAR_STARTING_STATUS_TIMER 0 // If this var has a value greater or equal than 1 field terrains will last that number of turns, otherwise they will last until they're overwritten. #define B_VAR_WILD_AI_FLAGS 0 // If not 0, you can use this var to add to default wild AI flags. NOT usable with flags above (1 << 15) +#define B_VAR_DIFFICULTY 0 // If not 0, you can use this var to control which difficulty version of a Trainer is loaded. This should be manually set by the developer using Script_SetDifficulty AFTER NewGameInitData has run. // Sky Battles #define B_FLAG_SKY_BATTLE 0 // If this flag has a value, the player will be able to engage in scripted Sky Battles. @@ -246,6 +251,8 @@ #define B_LAST_USED_BALL TRUE // If TRUE, the "last used ball" feature from Gen 7 will be implemented #define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. #define B_LAST_USED_BALL_CYCLE TRUE // If TRUE, then holding B_LAST_USED_BALL_BUTTON while pressing the D-Pad cycles through the balls +#define B_CATCH_SWAP_INTO_PARTY GEN_LATEST // In Gen 7+, the option to swap the caught wild mon to the party will appear, allowing you to send a different mon to the box. +#define B_CATCH_SWAP_CHECK_HMS TRUE // If TRUE, the catch swap feature above will prevent returning mons to the box if they know HMs. // Other settings #define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. @@ -262,6 +269,7 @@ #define B_OVERWORLD_FOG GEN_LATEST // In Gen8+, overworld Fog summons Misty Terrain in battle. In Gen4 only, overworld Fog summons the unique fog weather condition in battle. #define B_TOXIC_REVERSAL GEN_LATEST // In Gen5+, bad poison will change to regular poison at the end of battles. #define B_TRY_CATCH_TRAINER_BALL GEN_LATEST // In Gen4+, trying to catch a Trainer's Pokémon does not consume the Poké Ball. +#define B_SLEEP_CLAUSE FALSE // Enables Sleep Clause all the time in every case, overriding B_FLAG_SLEEP_CLAUSE. Use that for modularity. // Animation Settings #define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle. @@ -294,4 +302,15 @@ // Pokémon battle sprite settings #define B_ENEMY_MON_SHADOW_STYLE GEN_LATEST // In Gen4+, all enemy Pokemon will have a shadow drawn beneath them. +// Battle UI settings +#define B_MOVE_REARRANGEMENT_IN_BATTLE GEN_LATEST // In Gen 4+ move slots cannot be rearranged in battle + +#define B_POOL_SETTING_CONSISTENT_RNG FALSE // If set to true, the same trainer will always generate the same pool on the same save file +#define B_POOL_SETTING_USE_FIXED_SEED FALSE // If set to true, will use the fixed seed defined in B_POOL_SETTING_FIXED_SEED +#define B_POOL_SETTING_FIXED_SEED 0x1D4127 // "Random" number, unless a mistake was made, it's へだら in Emerald charmap which should spell he-da-ra +#define B_POOL_RULE_SPECIES_CLAUSE FALSE // Only pick a single pokemon of a unique NatDex number +#define B_POOL_RULE_EXCLUDE_FORMS FALSE // Exclude different forms from the Species Clause +#define B_POOL_RULE_ITEM_CLAUSE FALSE // Only allow each item to be picked once +#define B_POOL_RULES_USE_ITEM_EXCLUSIONS FALSE // Exclude items listed in poolItemClauseExclusions + #endif // GUARD_CONFIG_BATTLE_H diff --git a/include/config/dexnav.h b/include/config/dexnav.h new file mode 100644 index 0000000000..7b4e3ba285 --- /dev/null +++ b/include/config/dexnav.h @@ -0,0 +1,72 @@ +#ifndef GUARD_CONFIG_DEXNAV_H +#define GUARD_CONFIG_DEXNAV_H + +#define DEXNAV_ENABLED FALSE // Whether or not DexNav is enabled. If TRUE, flags/vars below must all be non-zero +#define USE_DEXNAV_SEARCH_LEVELS FALSE /* WARNING: POSSIBLY EXCEEDS SAVEBLOCK SPACE! REQUIRES 1 BYTE PER SPECIES */ + +// Flag/var defines +#define DN_FLAG_SEARCHING 0 // Searching for mon +#define DN_FLAG_DEXNAV_GET 0 // DexNav shows in start menu +#define DN_FLAG_DETECTOR_MODE 0 // Allow player to find hidden mons +#define DN_VAR_SPECIES 0 // Registered DexNav species +#define DN_VAR_STEP_COUNTER 0 // Steps for finding hidden pokemon + +// Search parameters +#define DEXNAV_TIMEOUT 15 // 15 seconds is the time out. Max of 1092 seconds allowed +#define SNEAKING_PROXIMITY 4 // Tile amount +#define CREEPING_PROXIMITY 2 +#define MAX_PROXIMITY 20 + +#define DEXNAV_CHAIN_MAX 100 // maximum chain value + +// hidden pokemon options - an approximation of values to due to lack of available data +#define HIDDEN_MON_STEP_COUNT 100 // Look for hidden pokemon every x steps +#define HIDDEN_MON_SEARCH_RATE 25 // x% chance of finding hidden pokemon every x steps +#define HIDDEN_MON_PROBABILTY 15 // x% chance of finding hidden mon compared to regular encounter data + +//// SEARCH PROBABILITIES +// See https://bulbapedia.bulbagarden.net/wiki/DexNav#Benefits +// Chance of encountering egg move at search levels +#define SEARCHLEVEL0_MOVECHANCE 0 +#define SEARCHLEVEL5_MOVECHANCE 21 +#define SEARCHLEVEL10_MOVECHANCE 46 +#define SEARCHLEVEL25_MOVECHANCE 58 +#define SEARCHLEVEL50_MOVECHANCE 63 +#define SEARCHLEVEL100_MOVECHANCE 83 +// Chance of encountering Hidden Abilities at search levels +#define SEARCHLEVEL0_ABILITYCHANCE 0 +#define SEARCHLEVEL5_ABILITYCHANCE 0 +#define SEARCHLEVEL10_ABILITYCHANCE 5 +#define SEARCHLEVEL25_ABILITYCHANCE 15 +#define SEARCHLEVEL50_ABILITYCHANCE 20 +#define SEARCHLEVEL100_ABILITYCHANCE 23 +// Chance of encountering held item +#define SEARCHLEVEL0_ITEM 0 +#define SEARCHLEVEL5_ITEM 0 +#define SEARCHLEVEL10_ITEM 1 +#define SEARCHLEVEL25_ITEM 7 +#define SEARCHLEVEL50_ITEM 6 +#define SEARCHLEVEL100_ITEM 12 +// Chance of encountering one star potential +#define SEARCHLEVEL0_ONESTAR 0 +#define SEARCHLEVEL5_ONESTAR 14 +#define SEARCHLEVEL10_ONESTAR 17 +#define SEARCHLEVEL25_ONESTAR 17 +#define SEARCHLEVEL50_ONESTAR 15 +#define SEARCHLEVEL100_ONESTAR 8 +// Chance of encountering two star potential +#define SEARCHLEVEL0_TWOSTAR 0 +#define SEARCHLEVEL5_TWOSTAR 1 +#define SEARCHLEVEL10_TWOSTAR 9 +#define SEARCHLEVEL25_TWOSTAR 16 +#define SEARCHLEVEL50_TWOSTAR 17 +#define SEARCHLEVEL100_TWOSTAR 24 +// Chance of encountering three star potential +#define SEARCHLEVEL0_THREESTAR 0 +#define SEARCHLEVEL5_THREESTAR 0 +#define SEARCHLEVEL10_THREESTAR 1 +#define SEARCHLEVEL25_THREESTAR 7 +#define SEARCHLEVEL50_THREESTAR 6 +#define SEARCHLEVEL100_THREESTAR 12 + +#endif // GUARD_CONFIG_DEXNAV_H diff --git a/include/config/item.h b/include/config/item.h index dce2682959..96156b0db8 100644 --- a/include/config/item.h +++ b/include/config/item.h @@ -41,6 +41,7 @@ // Fishing #define I_FISHING_BITE_ODDS GEN_LATEST // In Gen 1 and Gen 2, the Old Rod has a 100% chance for a bite, Good Rod has a 66% chance for a bite, and Super Rod has a 50% chance for a bite. In Gen 3, all rods have a base 50% chance for a bite. In Gen 4 onwards, the Old Rod has a base 25% chance for a bite, Good Rod has a 50% chance for a bite, and Super Rod has a 75% chance for a bite. #define I_FISHING_MINIGAME GEN_3 // Each generation uses a variation of reeling in Pokémon once they have been hooked. NOTE: Only the Gen 1/2 and Gen 3 minigames are implemented right now! +#define I_FISHING_ENVIRONMENT GEN_LATEST // In Gen 3, the battle environment when fighting a hooked Pokémon is based on the tile the player is standing on. In Gen 4 onwards, the environment is based on tile that is being fished in, resulting in it usually being a water environment. #define I_FISHING_STICKY_BOOST GEN_LATEST // In Gen 3, a Pokemon with Suction Cups or Sticky Hold in the first slot of the party causes the chance for a bite to increase by about 35%. In Gen 4 onwards, it doubles the base bite chance. #define I_FISHING_FOLLOWER_BOOST FALSE // In HGSS, fishing bite odds are increased depending on the friendship of the current following Pokémon. #define I_FISHING_CHAIN FALSE // Introduced in XY, hooking the same Pokémon repeatedly will increase the odds of that mon being shiny. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. diff --git a/include/config/overworld.h b/include/config/overworld.h index e09e423a35..35a90407b9 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -55,8 +55,12 @@ #define OW_MON_WANDER_WALK TRUE // If true, OW pokemon with MOVEMENT_TYPE_WANDER will walk-in-place in between steps. // Follower Pokémon #define OW_FOLLOWERS_ENABLED FALSE // Enables follower Pokémon, HGSS style. Requires OW_POKEMON_OBJECT_EVENTS. Note that additional scripting may be required for them to be fully supported! -#define OW_FOLLOWERS_BOBBING TRUE // If true, follower pokemon will bob up and down during their idle & walking animations -#define OW_FOLLOWERS_POKEBALLS TRUE // Followers will emerge from the pokeball they are stored in, instead of a normal pokeball +#define OW_FOLLOWERS_BOBBING TRUE // If TRUE, follower Pokémon will bob up and down during their idle & walking animations +#define OW_FOLLOWERS_POKEBALLS TRUE // If TRUE, follower Pokémon will emerge from the Poké Ball they are stored in, instead of a normal Poké Ball +#define OW_FOLLOWERS_WEATHER_FORMS FALSE // If TRUE, Castform and Cherrim gain FORM_CHANGE_OVERWORLD_WEATHER, which will make them transform in the overworld based on the weather. +#define OW_FOLLOWERS_COPY_WILD_PKMN FALSE // If TRUE, follower Pokémon that know Transform or have Illusion/Imposter will copy wild Pokémon at random. +#define OW_BATTLE_ONLY_FORMS TRUE // If TRUE, loads overworld sprites for battle-only forms like Mega Evos. Requires OW_POKEMON_OBJECT_EVENTS. +#define B_FLAG_FOLLOWERS_DISABLED 0 // Enables / Disables followers by using a flag. Helpful to disable followers for a period of time. #define OW_FOLLOWERS_SCRIPT_MOVEMENT TRUE // TRUE: Script collisions hide follower, FLAG_SAFE_FOLLOWER_MOVEMENT on by default @@ -109,6 +113,7 @@ #define OW_FLAG_NO_ENCOUNTER 0 // If this flag is set, wild encounters will be disabled. #define OW_FLAG_NO_TRAINER_SEE 0 // If this flag is set, trainers will not battle the player unless they're talked to. #define OW_FLAG_NO_COLLISION 0 // If this flag is set, the player will be able to walk over tiles with collision. Mainly intended for debugging purposes. +#define OW_FLAG_POKE_RIDER 0 // If this flag is set, the player will be able to use fly from the Pokenav Region Map and the Town Map key item by pressing 'R' on a city/location they are able to fly to. #define BATTLE_PYRAMID_RANDOM_ENCOUNTERS FALSE // If set to TRUE, battle pyramid Pokemon will be generated randomly based on the round's challenge instead of hardcoded in src/data/battle_frontier/battle_pyramid_level_50_wild_mons.h (or open_level_wild_mons.h) @@ -135,4 +140,7 @@ #define OW_UNION_DISABLE_CHECK FALSE // When TRUE, the nurse does not inform the player if there is a trainer waiting in the Union Room. This speeds up the loading of the Pokémon Center. #define OW_FLAG_MOVE_UNION_ROOM_CHECK 0 // If this flag is set, the game will only check if players are in the Union Room while healing Pokémon, and not when players enter the Pokémon Center. This speeds up the loading of the Pokémon Center. This is ignored if OW_UNION_DISABLE_CHECK is TRUE. +// Berry Blender +#define BERRY_BLENDER_THROW_ALL_BERRIES_AT_ONCE TRUE // This is a small little addition, that basically speeds up the animation where all players' berries are thrown into the blender. Self-explanatory I hope! + #endif // GUARD_CONFIG_OVERWORLD_H diff --git a/include/config/pokemon.h b/include/config/pokemon.h index 259ad3c117..3288065f7c 100644 --- a/include/config/pokemon.h +++ b/include/config/pokemon.h @@ -17,6 +17,7 @@ // GEN_1/2/3/4/5/6/7: Yellow, Crystal, RSE, HGSS, B2W2, ORAS, USUM learnsets respectively. // GEN_8: Use the following priority: BDSP for Gen1-4 Pokémon, then LA for species introduced in that game, then SwSh for species present in those games. Otherwise, use GEN_7. // GEN_9: SV For species present in those games. Otherwise use GEN_8. +#define P_EVOLUTION_LEVEL_1_LEARN GEN_LATEST // In Gen 8+, Pokémon evolving while at level 1 do not get the chance to learn their level 1 moves, while before they did. // Evolution settings #define P_FRIENDSHIP_EVO_THRESHOLD GEN_LATEST // Since Gen 8, Pokémon that evolve by friendship evolve at or above 160 friendship instead of 220. @@ -59,18 +60,15 @@ #define P_ONLY_OBTAINABLE_SHINIES FALSE // If TRUE, Pokémon encountered in the Battle Pyramid won't be shiny. #define P_NO_SHINIES_WITHOUT_POKEBALLS FALSE // If TRUE, Pokémon encountered when the player is out of Poké Balls won't be shiny #define P_SHOW_DYNAMIC_TYPES FALSE // If TRUE, all moves with dynamic type changes will be reflected as their current type in battle/summary screens instead of just select ones like in vanilla. -#define P_SUMMARY_SCREEN_MOVE_RELEARNER TRUE // If TRUE, shows an option for Pokémon to relearn moves on the summary screen moves page. -#define P_SUMMARY_MOVE_RELEARNER_FULL_PP TRUE // If TRUE, the move relearner in the summary screen restores relearned moves' PP to full. -#define P_SUMMARY_SCREEN_RENAME TRUE // If TRUE, an option to change Pokémon nicknames replaces the cancel prompt on the summary screen info page. // Learnset helper toggles -#define P_LEARNSET_HELPER_TEACHABLE TRUE // If TRUE, teachable_learnsets.h will be populated by tools/learnset_helpers/teachable.py using the included JSON files based on available TMs and tutors. +#define P_LEARNSET_HELPER_TEACHABLE TRUE // If TRUE, teachable_learnsets.h will be populated by tools/learnset_helpers/teachable.py using the included JSON files based on available TMs and tutors. // Flag settings // To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. // Eg: Replace with FLAG_UNUSED_0x264 so you can use that flag to toggle the feature. -#define P_FLAG_FORCE_SHINY 0 // If this flag is set, all wild and gift Pokémon will forced into being Shiny. -#define P_FLAG_FORCE_NO_SHINY 0 // If this flag is set, all wild and gift Pokémon will forced into NOT being Shiny. +#define P_FLAG_FORCE_SHINY 0 // If this flag is set, all wild and gift Pokémon will forced into being Shiny. +#define P_FLAG_FORCE_NO_SHINY 0 // If this flag is set, all wild and gift Pokémon will forced into NOT being Shiny. // Go here if you want to disable specific families of Pokémon. #include "config/species_enabled.h" diff --git a/include/config/summary_screen.h b/include/config/summary_screen.h new file mode 100644 index 0000000000..9407d93c7e --- /dev/null +++ b/include/config/summary_screen.h @@ -0,0 +1,30 @@ +#ifndef GUARD_CONFIG_SUMMARY_SCREEN_H +#define GUARD_CONFIG_SUMMARY_SCREEN_H + +// Settings +#define P_SUMMARY_SCREEN_MOVE_RELEARNER TRUE // If TRUE, shows an option for Pokémon to relearn moves on the summary screen moves page. +#define P_SUMMARY_MOVE_RELEARNER_FULL_PP TRUE // If TRUE, the move relearner in the summary screen restores relearned moves' PP to full. +#define P_SUMMARY_SCREEN_RENAME TRUE // If TRUE, an option to change Pokémon nicknames replaces the cancel prompt on the summary screen info page. +#define P_SUMMARY_SCREEN_IV_EV_INFO FALSE // If TRUE, will allow player to cycle through the Stats, IVs, and EVs in the summary screen skills page. +#define P_SUMMARY_SCREEN_IV_EV_BOX_ONLY FALSE // If TRUE, will allow player to cycle through the Stats, IVs, and EVs in the summary screen skills page, but only in the PC storage box. +#define P_SUMMARY_SCREEN_IV_EV_TILESET FALSE // If TRUE, loads an alternate tileset to allow changing the "STATS" label in the summary screen skills page. Note: if it's still loading the alternate tileset after changing this and recompiling, you may need a `make clean` before compilation. +#define P_SUMMARY_SCREEN_IV_EV_VALUES FALSE // If TRUE, will show the actual IV value instead of the letter grade. +/* +LETTER GRADE GUIDE: + + F = 0 + D = 1 - 15 + C = 16 - 25 + B = 26 - 29 + A = 30 + S = 31 + +Info taken from https://bulbapedia.bulbagarden.net/wiki/Stats_judge. +*/ +#define P_SUMMARY_SCREEN_IV_ONLY FALSE // If TRUE, will only show IV info in the summary screen. +#define P_SUMMARY_SCREEN_EV_ONLY FALSE // If TRUE, will only show EV info in the summary screen. + +// Flags +#define P_FLAG_SUMMARY_SCREEN_IV_EV_INFO 0 // If this flag is set, will allow player to cycle through the Stats, IVs, and EVs in the summary screen skills page. Note: if P_SUMMARY_SCREEN_IV_EV_INFO is TRUE, this flag does nothing. + +#endif // GUARD_CONFIG_SUMMARY_SCREEN_H diff --git a/include/config/test.h b/include/config/test.h index 708c2ca581..a8e2f4ab11 100644 --- a/include/config/test.h +++ b/include/config/test.h @@ -1129,4 +1129,12 @@ #undef P_FAMILY_PECHARUNT #define P_FAMILY_PECHARUNT TRUE +// Vars +#undef B_VAR_DIFFICULTY +#define B_VAR_DIFFICULTY TESTING_VAR_DIFFICULTY + +// Flags +#undef B_FLAG_SLEEP_CLAUSE +#define B_FLAG_SLEEP_CLAUSE TESTING_FLAG_SLEEP_CLAUSE + #endif // GUARD_CONFIG_TEST_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 93c61bdd59..ce1cf0e948 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -86,7 +86,7 @@ #define WILD_DOUBLE_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER)))) #define RECORDED_WILD_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_RECORDED) && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FRONTIER))) -#define BATTLE_TWO_VS_ONE_OPPONENT ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gTrainerBattleOpponent_B == 0xFFFF)) +#define BATTLE_TWO_VS_ONE_OPPONENT ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && TRAINER_BATTLE_PARAM.opponentB == 0xFFFF)) #define BATTLE_TYPE_HAS_AI (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER | BATTLE_TYPE_INGAME_PARTNER) // Battle Outcome defines @@ -253,6 +253,13 @@ #define SIDE_STATUS_SCREEN_ANY (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) #define SIDE_STATUS_PLEDGE_ANY (SIDE_STATUS_RAINBOW | SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_SWAMP) +// Used for damaging entry hazards based on type +enum TypeSideHazard +{ + TYPE_SIDE_HAZARD_POINTED_STONES = TYPE_ROCK, + TYPE_SIDE_HAZARD_SHARP_STEEL = TYPE_STEEL, +}; + // Field affecting statuses. #define STATUS_FIELD_MAGIC_ROOM (1 << 0) #define STATUS_FIELD_TRICK_ROOM (1 << 1) @@ -266,7 +273,6 @@ #define STATUS_FIELD_PSYCHIC_TERRAIN (1 << 9) #define STATUS_FIELD_ION_DELUGE (1 << 10) #define STATUS_FIELD_FAIRY_LOCK (1 << 11) -#define STATUS_FIELD_TERRAIN_PERMANENT (1 << 12) // Overworld thunderstorm generates electric terrain #define STATUS_FIELD_TERRAIN_ANY (STATUS_FIELD_GRASSY_TERRAIN | STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_PSYCHIC_TERRAIN) @@ -283,140 +289,182 @@ #define MOVE_RESULT_FOE_ENDURED_AFFECTION (1 << 9) #define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED) +enum BattleWeather +{ + BATTLE_WEATHER_RAIN, + BATTLE_WEATHER_RAIN_PRIMAL, + BATTLE_WEATHER_RAIN_DOWNPOUR, + BATTLE_WEATHER_SUN, + BATTLE_WEATHER_SUN_PRIMAL, + BATTLE_WEATHER_SANDSTORM, + BATTLE_WEATHER_HAIL, + BATTLE_WEATHER_SNOW, + BATTLE_WEATHER_FOG, + BATTLE_WEATHER_STRONG_WINDS, + BATTLE_WEATHER_COUNT, +}; + // Battle Weather flags -#define B_WEATHER_NONE 0 -#define B_WEATHER_RAIN_TEMPORARY (1 << 0) -#define B_WEATHER_RAIN_DOWNPOUR (1 << 1) // unused -#define B_WEATHER_RAIN_PERMANENT (1 << 2) -#define B_WEATHER_RAIN_PRIMAL (1 << 3) -#define B_WEATHER_RAIN (B_WEATHER_RAIN_TEMPORARY | B_WEATHER_RAIN_DOWNPOUR | B_WEATHER_RAIN_PERMANENT | B_WEATHER_RAIN_PRIMAL) -#define B_WEATHER_SANDSTORM_TEMPORARY (1 << 4) -#define B_WEATHER_SANDSTORM_PERMANENT (1 << 5) -#define B_WEATHER_SANDSTORM (B_WEATHER_SANDSTORM_TEMPORARY | B_WEATHER_SANDSTORM_PERMANENT) -#define B_WEATHER_SUN_TEMPORARY (1 << 6) -#define B_WEATHER_SUN_PERMANENT (1 << 7) -#define B_WEATHER_SUN_PRIMAL (1 << 8) -#define B_WEATHER_SUN (B_WEATHER_SUN_TEMPORARY | B_WEATHER_SUN_PERMANENT | B_WEATHER_SUN_PRIMAL) -#define B_WEATHER_HAIL_TEMPORARY (1 << 9) -#define B_WEATHER_HAIL_PERMANENT (1 << 10) -#define B_WEATHER_HAIL (B_WEATHER_HAIL_TEMPORARY | B_WEATHER_HAIL_PERMANENT) -#define B_WEATHER_STRONG_WINDS (1 << 11) -#define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL | B_WEATHER_STRONG_WINDS | B_WEATHER_SNOW | B_WEATHER_FOG) -#define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) -#define B_WEATHER_SNOW_TEMPORARY (1 << 12) -#define B_WEATHER_SNOW_PERMANENT (1 << 13) -#define B_WEATHER_SNOW (B_WEATHER_SNOW_TEMPORARY | B_WEATHER_SNOW_PERMANENT) -#define B_WEATHER_FOG_TEMPORARY (1 << 14) -#define B_WEATHER_FOG_PERMANENT (1 << 15) -#define B_WEATHER_FOG (B_WEATHER_FOG_TEMPORARY | B_WEATHER_FOG_PERMANENT) +#define B_WEATHER_NONE 0 +#define B_WEATHER_RAIN_NORMAL (1 << BATTLE_WEATHER_RAIN) +#define B_WEATHER_RAIN_PRIMAL (1 << BATTLE_WEATHER_RAIN_PRIMAL) +#define B_WEATHER_RAIN_DOWNPOUR (1 << BATTLE_WEATHER_RAIN_DOWNPOUR) // unused +#define B_WEATHER_RAIN (B_WEATHER_RAIN_NORMAL | B_WEATHER_RAIN_PRIMAL | B_WEATHER_RAIN_DOWNPOUR) +#define B_WEATHER_SUN_NORMAL (1 << BATTLE_WEATHER_SUN) +#define B_WEATHER_SUN_PRIMAL (1 << BATTLE_WEATHER_SUN_PRIMAL) +#define B_WEATHER_SUN (B_WEATHER_SUN_NORMAL | B_WEATHER_SUN_PRIMAL) +#define B_WEATHER_SANDSTORM (1 << BATTLE_WEATHER_SANDSTORM) +#define B_WEATHER_HAIL (1 << BATTLE_WEATHER_HAIL) +#define B_WEATHER_SNOW (1 << BATTLE_WEATHER_SNOW) +#define B_WEATHER_FOG (1 << BATTLE_WEATHER_FOG) +#define B_WEATHER_STRONG_WINDS (1 << BATTLE_WEATHER_STRONG_WINDS) -// Battle Weather as enum -#define ENUM_WEATHER_NONE 0 -#define ENUM_WEATHER_RAIN 1 -#define ENUM_WEATHER_SUN 2 -#define ENUM_WEATHER_SANDSTORM 3 -#define ENUM_WEATHER_HAIL 4 -#define ENUM_WEATHER_SUN_PRIMAL 5 -#define ENUM_WEATHER_RAIN_PRIMAL 6 -#define ENUM_WEATHER_STRONG_WINDS 7 -#define ENUM_WEATHER_SNOW 8 -#define ENUM_WEATHER_FOG 9 +#define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL | B_WEATHER_STRONG_WINDS | B_WEATHER_SNOW | B_WEATHER_FOG) +#define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) + +enum MoveEffects +{ + MOVE_EFFECT_NONE, + MOVE_EFFECT_SLEEP, + MOVE_EFFECT_POISON, + MOVE_EFFECT_BURN, + MOVE_EFFECT_FREEZE, + MOVE_EFFECT_PARALYSIS, + MOVE_EFFECT_TOXIC, + MOVE_EFFECT_FROSTBITE, + MOVE_EFFECT_CONFUSION, + MOVE_EFFECT_FLINCH, + MOVE_EFFECT_TRI_ATTACK, + MOVE_EFFECT_UPROAR, + MOVE_EFFECT_PAYDAY, + MOVE_EFFECT_CHARGING, + MOVE_EFFECT_WRAP, + MOVE_EFFECT_ATK_PLUS_1, + MOVE_EFFECT_DEF_PLUS_1, + MOVE_EFFECT_SPD_PLUS_1, + MOVE_EFFECT_SP_ATK_PLUS_1, + MOVE_EFFECT_SP_DEF_PLUS_1, + MOVE_EFFECT_ACC_PLUS_1, + MOVE_EFFECT_EVS_PLUS_1, + MOVE_EFFECT_ATK_MINUS_1, + MOVE_EFFECT_DEF_MINUS_1, + MOVE_EFFECT_SPD_MINUS_1, + MOVE_EFFECT_SP_ATK_MINUS_1, + MOVE_EFFECT_SP_DEF_MINUS_1, + MOVE_EFFECT_ACC_MINUS_1, + MOVE_EFFECT_EVS_MINUS_1, + MOVE_EFFECT_REMOVE_ARG_TYPE, + MOVE_EFFECT_RECHARGE, + MOVE_EFFECT_RAGE, + MOVE_EFFECT_STEAL_ITEM, + MOVE_EFFECT_PREVENT_ESCAPE, + MOVE_EFFECT_NIGHTMARE, + MOVE_EFFECT_ALL_STATS_UP, + MOVE_EFFECT_REMOVE_STATUS, + MOVE_EFFECT_ATK_DEF_DOWN, + MOVE_EFFECT_ATK_PLUS_2, + MOVE_EFFECT_DEF_PLUS_2, + MOVE_EFFECT_SPD_PLUS_2, + MOVE_EFFECT_SP_ATK_PLUS_2, + MOVE_EFFECT_SP_DEF_PLUS_2, + MOVE_EFFECT_ACC_PLUS_2, + MOVE_EFFECT_EVS_PLUS_2, + MOVE_EFFECT_ATK_MINUS_2, + MOVE_EFFECT_DEF_MINUS_2, + MOVE_EFFECT_SPD_MINUS_2, + MOVE_EFFECT_SP_ATK_MINUS_2, + MOVE_EFFECT_SP_DEF_MINUS_2, + MOVE_EFFECT_ACC_MINUS_2, + MOVE_EFFECT_EVS_MINUS_2, + MOVE_EFFECT_SCALE_SHOT, + MOVE_EFFECT_THRASH, + MOVE_EFFECT_KNOCK_OFF, + MOVE_EFFECT_DEF_SPDEF_DOWN, + MOVE_EFFECT_CLEAR_SMOG, + MOVE_EFFECT_SMACK_DOWN, + MOVE_EFFECT_FLAME_BURST, + MOVE_EFFECT_FEINT, + MOVE_EFFECT_V_CREATE, + MOVE_EFFECT_HAPPY_HOUR, + MOVE_EFFECT_CORE_ENFORCER, + MOVE_EFFECT_THROAT_CHOP, + MOVE_EFFECT_INCINERATE, + MOVE_EFFECT_BUG_BITE, + MOVE_EFFECT_RECOIL_HP_25, + MOVE_EFFECT_TRAP_BOTH, + MOVE_EFFECT_ROUND, + MOVE_EFFECT_STOCKPILE_WORE_OFF, + MOVE_EFFECT_DIRE_CLAW, + MOVE_EFFECT_STEALTH_ROCK, + MOVE_EFFECT_SPIKES, + MOVE_EFFECT_SYRUP_BOMB, + MOVE_EFFECT_FLORAL_HEALING, + MOVE_EFFECT_SECRET_POWER, + MOVE_EFFECT_PSYCHIC_NOISE, + MOVE_EFFECT_TERA_BLAST, + MOVE_EFFECT_ORDER_UP, + MOVE_EFFECT_ION_DELUGE, + MOVE_EFFECT_HAZE, + MOVE_EFFECT_LEECH_SEED, + MOVE_EFFECT_REFLECT, + MOVE_EFFECT_LIGHT_SCREEN, + MOVE_EFFECT_SALT_CURE, + MOVE_EFFECT_EERIE_SPELL, + MOVE_EFFECT_RAISE_TEAM_ATTACK, + MOVE_EFFECT_RAISE_TEAM_DEFENSE, + MOVE_EFFECT_RAISE_TEAM_SPEED, + MOVE_EFFECT_RAISE_TEAM_SP_ATK, + MOVE_EFFECT_RAISE_TEAM_SP_DEF, + MOVE_EFFECT_LOWER_ATTACK_SIDE, + MOVE_EFFECT_LOWER_DEFENSE_SIDE, + MOVE_EFFECT_LOWER_SPEED_SIDE, + MOVE_EFFECT_LOWER_SP_ATK_SIDE, + MOVE_EFFECT_LOWER_SP_DEF_SIDE, + MOVE_EFFECT_SUN, + MOVE_EFFECT_RAIN, + MOVE_EFFECT_SANDSTORM, + MOVE_EFFECT_HAIL, + MOVE_EFFECT_MISTY_TERRAIN, + MOVE_EFFECT_GRASSY_TERRAIN, + MOVE_EFFECT_ELECTRIC_TERRAIN, + MOVE_EFFECT_PSYCHIC_TERRAIN, + MOVE_EFFECT_VINE_LASH, + MOVE_EFFECT_WILDFIRE, + MOVE_EFFECT_CANNONADE, + MOVE_EFFECT_EFFECT_SPORE_SIDE, + MOVE_EFFECT_PARALYZE_SIDE, + MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE, + MOVE_EFFECT_CRIT_PLUS_SIDE, + MOVE_EFFECT_PREVENT_ESCAPE_SIDE, + MOVE_EFFECT_AURORA_VEIL, + MOVE_EFFECT_INFATUATE_SIDE, + MOVE_EFFECT_RECYCLE_BERRIES, + MOVE_EFFECT_POISON_SIDE, + MOVE_EFFECT_DEFOG, + MOVE_EFFECT_POISON_PARALYZE_SIDE, + MOVE_EFFECT_HEAL_TEAM, + MOVE_EFFECT_SPITE, + MOVE_EFFECT_GRAVITY, + MOVE_EFFECT_VOLCALITH, + MOVE_EFFECT_SANDBLAST_SIDE, + MOVE_EFFECT_YAWN_FOE, + MOVE_EFFECT_LOWER_EVASIVENESS_SIDE, + MOVE_EFFECT_AROMATHERAPY, + MOVE_EFFECT_CONFUSE_SIDE, + MOVE_EFFECT_STEELSURGE, + MOVE_EFFECT_TORMENT_SIDE, + MOVE_EFFECT_LOWER_SPEED_2_SIDE, + MOVE_EFFECT_FIRE_SPIN_SIDE, + MOVE_EFFECT_FIXED_POWER, + NUM_MOVE_EFFECTS +}; -// Move Effects -#define MOVE_EFFECT_SLEEP 1 -#define MOVE_EFFECT_POISON 2 -#define MOVE_EFFECT_BURN 3 -#define MOVE_EFFECT_FREEZE 4 -#define MOVE_EFFECT_PARALYSIS 5 -#define MOVE_EFFECT_TOXIC 6 -#define MOVE_EFFECT_FROSTBITE 7 #define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_FROSTBITE // All above move effects apply primary status #if B_USE_FROSTBITE == TRUE #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FROSTBITE #else #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FREEZE #endif -#define MOVE_EFFECT_CONFUSION 8 -#define MOVE_EFFECT_FLINCH 9 -#define MOVE_EFFECT_TRI_ATTACK 10 -#define MOVE_EFFECT_UPROAR 11 -#define MOVE_EFFECT_PAYDAY 12 -#define MOVE_EFFECT_CHARGING 13 -#define MOVE_EFFECT_WRAP 14 -#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_REMOVE_ARG_TYPE 29 -#define MOVE_EFFECT_RECHARGE 30 -#define MOVE_EFFECT_RAGE 31 -#define MOVE_EFFECT_STEAL_ITEM 32 -#define MOVE_EFFECT_PREVENT_ESCAPE 33 -#define MOVE_EFFECT_NIGHTMARE 34 -#define MOVE_EFFECT_ALL_STATS_UP 35 -#define MOVE_EFFECT_REMOVE_STATUS 36 -#define MOVE_EFFECT_ATK_DEF_DOWN 37 -#define MOVE_EFFECT_ATK_PLUS_2 38 -#define MOVE_EFFECT_DEF_PLUS_2 39 -#define MOVE_EFFECT_SPD_PLUS_2 40 -#define MOVE_EFFECT_SP_ATK_PLUS_2 41 -#define MOVE_EFFECT_SP_DEF_PLUS_2 42 -#define MOVE_EFFECT_ACC_PLUS_2 43 -#define MOVE_EFFECT_EVS_PLUS_2 44 -#define MOVE_EFFECT_ATK_MINUS_2 45 -#define MOVE_EFFECT_DEF_MINUS_2 46 -#define MOVE_EFFECT_SPD_MINUS_2 47 -#define MOVE_EFFECT_SP_ATK_MINUS_2 48 -#define MOVE_EFFECT_SP_DEF_MINUS_2 49 -#define MOVE_EFFECT_ACC_MINUS_2 50 -#define MOVE_EFFECT_EVS_MINUS_2 51 -#define MOVE_EFFECT_SCALE_SHOT 52 -#define MOVE_EFFECT_THRASH 53 -#define MOVE_EFFECT_KNOCK_OFF 54 -#define MOVE_EFFECT_DEF_SPDEF_DOWN 55 -#define MOVE_EFFECT_CLEAR_SMOG 56 -#define MOVE_EFFECT_SMACK_DOWN 57 -#define MOVE_EFFECT_FLAME_BURST 58 -#define MOVE_EFFECT_FEINT 59 -#define MOVE_EFFECT_V_CREATE 60 -#define MOVE_EFFECT_HAPPY_HOUR 61 -#define MOVE_EFFECT_CORE_ENFORCER 62 -#define MOVE_EFFECT_THROAT_CHOP 63 -#define MOVE_EFFECT_INCINERATE 64 -#define MOVE_EFFECT_BUG_BITE 65 -#define MOVE_EFFECT_RECOIL_HP_25 66 -#define MOVE_EFFECT_TRAP_BOTH 67 -#define MOVE_EFFECT_ROUND 68 -#define MOVE_EFFECT_STOCKPILE_WORE_OFF 69 -#define MOVE_EFFECT_DIRE_CLAW 70 -#define MOVE_EFFECT_STEALTH_ROCK 71 -#define MOVE_EFFECT_SPIKES 72 -#define MOVE_EFFECT_SYRUP_BOMB 73 -#define MOVE_EFFECT_FLORAL_HEALING 74 -#define MOVE_EFFECT_SECRET_POWER 75 -#define MOVE_EFFECT_PSYCHIC_NOISE 76 -#define MOVE_EFFECT_TERA_BLAST 77 -#define MOVE_EFFECT_ORDER_UP 78 -#define MOVE_EFFECT_ION_DELUGE 79 -#define MOVE_EFFECT_AROMATHERAPY 80 // No functionality yet -#define MOVE_EFFECT_HAZE 81 -#define MOVE_EFFECT_LEECH_SEED 82 -#define MOVE_EFFECT_REFLECT 83 -#define MOVE_EFFECT_LIGHT_SCREEN 84 -#define MOVE_EFFECT_SALT_CURE 85 -#define MOVE_EFFECT_EERIE_SPELL 86 - -#define NUM_MOVE_EFFECTS 87 #define MOVE_EFFECT_AFFECTS_USER 0x2000 #define MOVE_EFFECT_CERTAIN 0x4000 @@ -519,7 +567,7 @@ #define MOVE_TARGET_ALLY (1 << 7) #define MOVE_TARGET_ALL_BATTLERS ((1 << 8) | MOVE_TARGET_USER) // No functionality for status moves -// For the second argument of GetMoveTarget, when no target override is needed +// For the second argument of GetBattleMoveTarget, when no target override is needed #define NO_TARGET_OVERRIDE 0 // Constants for Parental Bond @@ -537,15 +585,24 @@ // Constants for B_VAR_STARTING_STATUS // Timer value controlled by B_VAR_STARTING_STATUS_TIMER -#define STARTING_STATUS_NONE 0 -#define STARTING_STATUS_ELECTRIC_TERRAIN 1 -#define STARTING_STATUS_MISTY_TERRAIN 2 -#define STARTING_STATUS_GRASSY_TERRAIN 3 -#define STARTING_STATUS_PSYCHIC_TERRAIN 4 -#define STARTING_STATUS_TRICK_ROOM 5 -#define STARTING_STATUS_MAGIC_ROOM 6 -#define STARTING_STATUS_WONDER_ROOM 7 -#define STARTING_STATUS_TAILWIND_PLAYER 8 -#define STARTING_STATUS_TAILWIND_OPPONENT 9 +enum StartingStatus +{ + STARTING_STATUS_NONE, + STARTING_STATUS_ELECTRIC_TERRAIN, + STARTING_STATUS_MISTY_TERRAIN, + STARTING_STATUS_GRASSY_TERRAIN, + STARTING_STATUS_PSYCHIC_TERRAIN, + STARTING_STATUS_TRICK_ROOM, + STARTING_STATUS_MAGIC_ROOM, + STARTING_STATUS_WONDER_ROOM, + STARTING_STATUS_TAILWIND_PLAYER, + STARTING_STATUS_TAILWIND_OPPONENT, + STARTING_STATUS_RAINBOW_PLAYER, + STARTING_STATUS_RAINBOW_OPPONENT, + STARTING_STATUS_SEA_OF_FIRE_PLAYER, + STARTING_STATUS_SEA_OF_FIRE_OPPONENT, + STARTING_STATUS_SWAMP_PLAYER, + STARTING_STATUS_SWAMP_OPPONENT, +}; #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index 5057a04152..8ba2c72096 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -14,47 +14,42 @@ #define AI_TYPE2_USER 3 #define AI_TYPE_MOVE 4 -// type effectiveness -#define AI_EFFECTIVENESS_x8 7 -#define AI_EFFECTIVENESS_x4 6 -#define AI_EFFECTIVENESS_x2 5 -#define AI_EFFECTIVENESS_x1 4 -#define AI_EFFECTIVENESS_x0_5 3 -#define AI_EFFECTIVENESS_x0_25 2 -#define AI_EFFECTIVENESS_x0_125 1 -#define AI_EFFECTIVENESS_x0 0 - // AI Flags. Most run specific functions to update score, new flags are used for internal logic in other scripts // See docs/ai_flags.md for more details. -#define AI_FLAG_CHECK_BAD_MOVE (1 << 0) // AI will avoid using moves that are likely to fail or be ineffective in the current situation. -#define AI_FLAG_TRY_TO_FAINT (1 << 1) // AI will prioritize KOing the player's mon if able. -#define AI_FLAG_CHECK_VIABILITY (1 << 2) // AI damaging moves and move effects to determine the best available move in the current situation. -#define AI_FLAG_FORCE_SETUP_FIRST_TURN (1 << 3) // AI will prioritize using setup moves on the first turn at the expensve of all else. AI_FLAG_CHECK_VIABILITY will instead do this when the AI determines it makes sense. -#define AI_FLAG_RISKY (1 << 4) // AI will generally behave more recklessly, prioritizing damage over accuracy, explosions, etc. -#define AI_FLAG_TRY_TO_2HKO (1 << 5) // AI adds score bonus to any move the AI has that either OHKOs or 2HKOs the player. -#define AI_FLAG_PREFER_BATON_PASS (1 << 6) // AI prefers raising its own stats and setting for / using Baton Pass. -#define AI_FLAG_DOUBLE_BATTLE (1 << 7) // Automatically set for double battles, handles AI behaviour with partner. -#define AI_FLAG_HP_AWARE (1 << 8) // AI will favour certain move effects based on how much remaining HP it and the player's mon have. -#define AI_FLAG_POWERFUL_STATUS (1 << 9) // AI prefers moves that set up field effects or side statuses, even if the user can faint the target. +#define AI_FLAG_CHECK_BAD_MOVE (1 << 0) // AI will avoid using moves that are likely to fail or be ineffective in the current situation. +#define AI_FLAG_TRY_TO_FAINT (1 << 1) // AI will prioritize KOing the player's mon if able. +#define AI_FLAG_CHECK_VIABILITY (1 << 2) // AI damaging moves and move effects to determine the best available move in the current situation. +#define AI_FLAG_FORCE_SETUP_FIRST_TURN (1 << 3) // AI will prioritize using setup moves on the first turn at the expensve of all else. AI_FLAG_CHECK_VIABILITY will instead do this when the AI determines it makes sense. +#define AI_FLAG_RISKY (1 << 4) // AI will generally behave more recklessly, prioritizing damage over accuracy, explosions, etc. +#define AI_FLAG_TRY_TO_2HKO (1 << 5) // AI adds score bonus to any move the AI has that either OHKOs or 2HKOs the player. +#define AI_FLAG_PREFER_BATON_PASS (1 << 6) // AI prefers raising its own stats and setting for / using Baton Pass. +#define AI_FLAG_DOUBLE_BATTLE (1 << 7) // Automatically set for double battles, handles AI behaviour with partner. +#define AI_FLAG_HP_AWARE (1 << 8) // AI will favour certain move effects based on how much remaining HP it and the player's mon have. +#define AI_FLAG_POWERFUL_STATUS (1 << 9) // AI prefers moves that set up field effects or side statuses, even if the user can faint the target. // New, Trainer Handicap Flags -#define AI_FLAG_NEGATE_UNAWARE (1 << 10) // AI is NOT aware of negating effects like wonder room, mold breaker, etc. -#define AI_FLAG_WILL_SUICIDE (1 << 11) // AI will use explosion / self destruct / final gambit / etc. +#define AI_FLAG_NEGATE_UNAWARE (1 << 10) // AI is NOT aware of negating effects like wonder room, mold breaker, etc. +#define AI_FLAG_WILL_SUICIDE (1 << 11) // AI will use explosion / self destruct / final gambit / etc. // New, Trainer Strategy Flags -#define AI_FLAG_PREFER_STATUS_MOVES (1 << 12) // AI gets a score bonus for status moves. Should be combined with AI_FLAG_CHECK_BAD_MOVE to prevent using only status moves. -#define AI_FLAG_STALL (1 << 13) // AI stalls battle and prefers secondary damage/trapping/etc. TODO not finished. -#define AI_FLAG_SMART_SWITCHING (1 << 14) // AI includes a lot more switching checks. Automatically includes AI_FLAG_SMART_MON_CHOICES. -#define AI_FLAG_ACE_POKEMON (1 << 15) // 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 << 16) // AI has full knowledge of player moves, abilities, hold items. -#define AI_FLAG_SMART_MON_CHOICES (1 << 17) // AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are separate decisions. Automatically included by AI_FLAG_SMART_SWITCHING. -#define AI_FLAG_CONSERVATIVE (1 << 18) // AI assumes all moves will low roll damage. -#define AI_FLAG_SEQUENCE_SWITCHING (1 << 19) // AI switches in mons in exactly party order, and never switches mid-battle. -#define AI_FLAG_DOUBLE_ACE_POKEMON (1 << 20) // AI has *two* Ace Pokémon. The last two Pokémons in the party won't be used unless they're the last ones remaining. Goes well in battles where the trainer ID equals to twins, couples, etc. +#define AI_FLAG_PREFER_STATUS_MOVES (1 << 12) // AI gets a score bonus for status moves. Should be combined with AI_FLAG_CHECK_BAD_MOVE to prevent using only status moves. +#define AI_FLAG_STALL (1 << 13) // AI stalls battle and prefers secondary damage/trapping/etc. TODO not finished. +#define AI_FLAG_SMART_SWITCHING (1 << 14) // AI includes a lot more switching checks. Automatically includes AI_FLAG_SMART_MON_CHOICES. +#define AI_FLAG_ACE_POKEMON (1 << 15) // 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 << 16) // AI has full knowledge of player moves, abilities, hold items. +#define AI_FLAG_SMART_MON_CHOICES (1 << 17) // AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are separate decisions. Automatically included by AI_FLAG_SMART_SWITCHING. +#define AI_FLAG_CONSERVATIVE (1 << 18) // AI assumes all moves will low roll damage. +#define AI_FLAG_SEQUENCE_SWITCHING (1 << 19) // AI switches in mons in exactly party order, and never switches mid-battle. +#define AI_FLAG_DOUBLE_ACE_POKEMON (1 << 20) // AI has *two* Ace Pokémon. The last two Pokémons in the party won't be used unless they're the last ones remaining. Goes well in battles where the trainer ID equals to twins, couples, etc. +#define AI_FLAG_WEIGH_ABILITY_PREDICTION (1 << 21) // AI will predict player's ability based on aiRating +#define AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE (1 << 22) // AI adds score to highest damage move regardless of accuracy or secondary effect +#define AI_FLAG_PREDICT_SWITCH (1 << 23) // AI will predict the player's switches and switchins based on how it would handle the situation. Recommend using AI_FLAG_OMNISCIENT +#define AI_FLAG_PREDICT_INCOMING_MON (1 << 24) // AI will score against the predicting incoming mon if it predicts the player to switch. Requires AI_FLAG_PREDICT_SWITCH -#define AI_FLAG_COUNT 21 +#define AI_FLAG_COUNT 25 // The following options are enough to have a basic/smart trainer. Any other addtion could make the trainer worse/better depending on the flag #define AI_FLAG_BASIC_TRAINER (AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY) -#define AI_FLAG_SMART_TRAINER (AI_FLAG_BASIC_TRAINER | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES) +#define AI_FLAG_SMART_TRAINER (AI_FLAG_BASIC_TRAINER | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_WEIGH_ABILITY_PREDICTION) +#define AI_FLAG_PREDICTION (AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON) // 'other' ai logic flags #define AI_FLAG_DYNAMIC_FUNC (1 << 28) // Create custom AI functions for specific battles via "setdynamicaifunc" cmd diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 0025364247..b5ccb7bf25 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -417,6 +417,8 @@ #define ANIM_TAG_RED_EXPLOSION (ANIM_SPRITES_START + 403) #define ANIM_TAG_PURPLE_CHAIN (ANIM_SPRITES_START + 404) #define ANIM_TAG_PINKVIO_ORB (ANIM_SPRITES_START + 405) +#define ANIM_TAG_STARSTORM (ANIM_SPRITES_START + 406) +#define ANIM_TAG_SALT_PARTICLE (ANIM_SPRITES_START + 407) // battlers #define ANIM_ATTACKER 0 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index b321f488b0..6525cf1544 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -67,6 +67,9 @@ enum { EFFECT_METRONOME, EFFECT_LEECH_SEED, EFFECT_DO_NOTHING, + EFFECT_HOLD_HANDS, + EFFECT_CELEBRATE, + EFFECT_HAPPY_HOUR, EFFECT_DISABLE, EFFECT_LEVEL_DAMAGE, EFFECT_PSYWAVE, @@ -292,7 +295,6 @@ enum { EFFECT_RECOIL_HP_25, EFFECT_STUFF_CHEEKS, EFFECT_GRAV_APPLE, - EFFECT_SPARKLY_SWIRL, EFFECT_HYPERSPACE_FURY, EFFECT_AURA_WHEEL, EFFECT_PHOTON_GEYSER, diff --git a/include/constants/battle_partner.h b/include/constants/battle_partner.h index 5622349a88..c609ee5aa2 100644 --- a/include/constants/battle_partner.h +++ b/include/constants/battle_partner.h @@ -2,7 +2,8 @@ #ifndef GUARD_CONSTANTS_BATTLE_PARTNERS_H #define GUARD_CONSTANTS_BATTLE_PARTNERS_H -#define PARTNER_NONE 0 -#define PARTNER_STEVEN 1 +#define PARTNER_NONE 0 +#define PARTNER_STEVEN 1 +#define PARTNER_COUNT 2 #endif // GUARD_CONSTANTS_BATTLE_PARTNERS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 5d5eb54e04..2cbc25b003 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -2,8 +2,8 @@ #define GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H // The following correspond to the struct members of BattleScripting by adding their offset -#define sPAINSPLIT_HP (gBattleScripting + 0x00) // painSplitHp -#define sBIDE_DMG (gBattleScripting + 0x04) // bideDmg +#define sUNUSED_0x00 (gBattleScripting + 0x00) // unused_0x00 +#define sUNUSED_0x04 (gBattleScripting + 0x04) // unused_0x04 #define sMULTIHIT_STRING (gBattleScripting + 0x08) // multihitString #define sEXP_CATCH (gBattleScripting + 0x0E) // expOnCatch #define sUNUSED (gBattleScripting + 0x0F) // unused @@ -215,19 +215,17 @@ enum CmdVarious VARIOUS_SAVE_BATTLER_ITEM, VARIOUS_RESTORE_BATTLER_ITEM, VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM, - VARIOUS_SWAP_SIDE_STATUSES, - VARIOUS_SWAP_STATS, }; // Cmd_manipulatedamage -#define DMG_CHANGE_SIGN 0 -#define DMG_RECOIL_FROM_MISS 1 -#define DMG_DOUBLED 2 -#define DMG_1_8_TARGET_HP 3 -#define DMG_FULL_ATTACKER_HP 4 -#define DMG_CURR_ATTACKER_HP 5 -#define DMG_BIG_ROOT 6 -#define DMG_RECOIL_FROM_IMMUNE 7 // Used to calculate recoil for the Gen 4 version of Jump Kick +#define DMG_CHANGE_SIGN 1 +#define DMG_RECOIL_FROM_MISS 2 +#define DMG_DOUBLED 3 +#define DMG_1_8_TARGET_HP 4 +#define DMG_FULL_ATTACKER_HP 5 +#define DMG_CURR_ATTACKER_HP 6 +#define DMG_BIG_ROOT 7 +#define DMG_RECOIL_FROM_IMMUNE 8 // Used to calculate recoil for the Gen 4 version of Jump Kick // Cmd_jumpifcantswitch #define SWITCH_IGNORE_ESCAPE_PREVENTION (1 << 7) @@ -302,6 +300,7 @@ enum MoveEndEffects MOVEEND_SAME_MOVE_TURNS, MOVEEND_SET_EVOLUTION_TRACKER, MOVEEND_CLEAR_BITS, + MOVEEND_PURSUIT_NEXT_ACTION, MOVEEND_COUNT, }; diff --git a/include/constants/battle_setup.h b/include/constants/battle_setup.h index bb7f9adefa..91c89d0631 100644 --- a/include/constants/battle_setup.h +++ b/include/constants/battle_setup.h @@ -11,8 +11,7 @@ #define TRAINER_BATTLE_REMATCH_DOUBLE 7 #define TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC 8 #define TRAINER_BATTLE_PYRAMID 9 -#define TRAINER_BATTLE_SET_TRAINER_A 10 -#define TRAINER_BATTLE_SET_TRAINER_B 11 +#define TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE 10 #define TRAINER_BATTLE_HILL 12 #define TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO 13 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 563e70fc06..3ba637c690 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -531,201 +531,206 @@ #define STRINGID_LASERFOCUS 529 #define STRINGID_GEMACTIVATES 530 #define STRINGID_BERRYDMGREDUCES 531 -#define STRINGID_TARGETATEITEM 532 -#define STRINGID_AIRBALLOONFLOAT 533 -#define STRINGID_AIRBALLOONPOP 534 -#define STRINGID_INCINERATEBURN 535 -#define STRINGID_BUGBITE 536 -#define STRINGID_ILLUSIONWOREOFF 537 -#define STRINGID_ATTACKERCUREDTARGETSTATUS 538 -#define STRINGID_ATTACKERLOSTFIRETYPE 539 -#define STRINGID_HEALERCURE 540 -#define STRINGID_SCRIPTINGABILITYSTATRAISE 541 -#define STRINGID_RECEIVERABILITYTAKEOVER 542 -#define STRINGID_PKNMABSORBINGPOWER 543 -#define STRINGID_NOONEWILLBEABLETORUNAWAY 544 -#define STRINGID_DESTINYKNOTACTIVATES 545 -#define STRINGID_CLOAKEDINAFREEZINGLIGHT 546 -#define STRINGID_CLEARAMULETWONTLOWERSTATS 547 -#define STRINGID_FERVENTWISHREACHED 548 -#define STRINGID_AIRLOCKACTIVATES 549 -#define STRINGID_PRESSUREENTERS 550 -#define STRINGID_DARKAURAENTERS 551 -#define STRINGID_FAIRYAURAENTERS 552 -#define STRINGID_AURABREAKENTERS 553 -#define STRINGID_COMATOSEENTERS 554 -#define STRINGID_SCREENCLEANERENTERS 555 -#define STRINGID_FETCHEDPOKEBALL 556 -#define STRINGID_BATTLERABILITYRAISEDSTAT 557 -#define STRINGID_ASANDSTORMKICKEDUP 558 -#define STRINGID_PKMNSWILLPERISHIN3TURNS 559 -#define STRINGID_ABILITYRAISEDSTATDRASTICALLY 560 -#define STRINGID_AURAFLAREDTOLIFE 561 -#define STRINGID_ASONEENTERS 562 -#define STRINGID_CURIOUSMEDICINEENTERS 563 -#define STRINGID_CANACTFASTERTHANKSTO 564 -#define STRINGID_MICLEBERRYACTIVATES 565 -#define STRINGID_PKMNSHOOKOFFTHETAUNT 566 -#define STRINGID_PKMNGOTOVERITSINFATUATION 567 -#define STRINGID_ITEMCANNOTBEREMOVED 568 -#define STRINGID_STICKYBARBTRANSFER 569 -#define STRINGID_PKMNBURNHEALED 570 -#define STRINGID_REDCARDACTIVATE 571 -#define STRINGID_EJECTBUTTONACTIVATE 572 -#define STRINGID_ATKGOTOVERINFATUATION 573 -#define STRINGID_TORMENTEDNOMORE 574 -#define STRINGID_HEALBLOCKEDNOMORE 575 -#define STRINGID_ATTACKERBECAMEFULLYCHARGED 576 -#define STRINGID_ATTACKERBECAMEASHSPECIES 577 -#define STRINGID_EXTREMELYHARSHSUNLIGHT 578 -#define STRINGID_EXTREMESUNLIGHTFADED 579 -#define STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT 580 -#define STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED 581 -#define STRINGID_HEAVYRAIN 582 -#define STRINGID_HEAVYRAINLIFTED 583 -#define STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN 584 -#define STRINGID_NORELIEFROMHEAVYRAIN 585 -#define STRINGID_MYSTERIOUSAIRCURRENT 586 -#define STRINGID_STRONGWINDSDISSIPATED 587 -#define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 588 -#define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 589 -#define STRINGID_STUFFCHEEKSCANTSELECT 590 -#define STRINGID_PKMNREVERTEDTOPRIMAL 591 -#define STRINGID_BUTPOKEMONCANTUSETHEMOVE 592 -#define STRINGID_BUTHOOPACANTUSEIT 593 -#define STRINGID_BROKETHROUGHPROTECTION 594 -#define STRINGID_ABILITYALLOWSONLYMOVE 595 -#define STRINGID_SWAPPEDABILITIES 596 -#define STRINGID_PASTELVEILPROTECTED 597 -#define STRINGID_PASTELVEILENTERS 598 -#define STRINGID_BATTLERTYPECHANGEDTO 599 -#define STRINGID_BOTHCANNOLONGERESCAPE 600 -#define STRINGID_CANTESCAPEDUETOUSEDMOVE 601 -#define STRINGID_PKMNBECAMEWEAKERTOFIRE 602 -#define STRINGID_ABOUTTOUSEPOLTERGEIST 603 -#define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 604 -#define STRINGID_NEUTRALIZINGGASENTERS 605 -#define STRINGID_NEUTRALIZINGGASOVER 606 -#define STRINGID_TARGETTOOHEAVY 607 -#define STRINGID_PKMNTOOKTARGETHIGH 608 -#define STRINGID_PKMNINSNAPTRAP 609 -#define STRINGID_METEORBEAMCHARGING 610 -#define STRINGID_HEATUPBEAK 611 -#define STRINGID_COURTCHANGE 612 -#define STRINGID_PLAYERLOSTTOENEMYTRAINER 613 -#define STRINGID_PLAYERPAIDPRIZEMONEY 614 -#define STRINGID_ZPOWERSURROUNDS 615 -#define STRINGID_ZMOVEUNLEASHED 616 -#define STRINGID_ZMOVERESETSSTATS 617 -#define STRINGID_ZMOVEALLSTATSUP 618 -#define STRINGID_ZMOVEZBOOSTCRIT 619 -#define STRINGID_ZMOVERESTOREHP 620 -#define STRINGID_ZMOVESTATUP 621 -#define STRINGID_ZMOVEHPTRAP 622 -#define STRINGID_ATTACKEREXPELLEDTHEPOISON 623 -#define STRINGID_ATTACKERSHOOKITSELFAWAKE 624 -#define STRINGID_ATTACKERBROKETHROUGHPARALYSIS 625 -#define STRINGID_ATTACKERHEALEDITSBURN 626 -#define STRINGID_ATTACKERMELTEDTHEICE 627 -#define STRINGID_TARGETTOUGHEDITOUT 628 -#define STRINGID_ATTACKERLOSTELECTRICTYPE 629 -#define STRINGID_ATTACKERSWITCHEDSTATWITHTARGET 630 -#define STRINGID_BEINGHITCHARGEDPKMNWITHPOWER 631 -#define STRINGID_SUNLIGHTACTIVATEDABILITY 632 -#define STRINGID_STATWASHEIGHTENED 633 -#define STRINGID_ELECTRICTERRAINACTIVATEDABILITY 634 -#define STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT 635 -#define STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN 636 -#define STRINGID_PKMNSABILITYPREVENTSABILITY 637 -#define STRINGID_PREPARESHELLTRAP 638 -#define STRINGID_SHELLTRAPDIDNTWORK 639 -#define STRINGID_SPIKESDISAPPEAREDFROMTEAM 640 -#define STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM 641 -#define STRINGID_STICKYWEBDISAPPEAREDFROMTEAM 642 -#define STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM 643 -#define STRINGID_COULDNTFULLYPROTECT 644 -#define STRINGID_STOCKPILEDEFFECTWOREOFF 645 -#define STRINGID_PKMNREVIVEDREADYTOFIGHT 646 -#define STRINGID_ITEMRESTOREDSPECIESHEALTH 647 -#define STRINGID_ITEMCUREDSPECIESSTATUS 648 -#define STRINGID_ITEMRESTOREDSPECIESPP 649 -#define STRINGID_THUNDERCAGETRAPPED 650 -#define STRINGID_PKMNHURTBYFROSTBITE 651 -#define STRINGID_PKMNGOTFROSTBITE 652 -#define STRINGID_PKMNSITEMHEALEDFROSTBITE 653 -#define STRINGID_ATTACKERHEALEDITSFROSTBITE 654 -#define STRINGID_PKMNFROSTBITEHEALED 655 -#define STRINGID_PKMNFROSTBITEHEALED2 656 -#define STRINGID_PKMNFROSTBITEHEALEDBY 657 -#define STRINGID_MIRRORHERBCOPIED 658 -#define STRINGID_STARTEDSNOW 659 -#define STRINGID_SNOWCONTINUES 660 -#define STRINGID_SNOWSTOPPED 661 -#define STRINGID_SNOWWARNINGSNOW 662 -#define STRINGID_PKMNITEMMELTED 663 -#define STRINGID_ULTRABURSTREACTING 664 -#define STRINGID_ULTRABURSTCOMPLETED 665 -#define STRINGID_TEAMGAINEDEXP 666 -#define STRINGID_CURRENTMOVECANTSELECT 667 -#define STRINGID_TARGETISBEINGSALTCURED 668 -#define STRINGID_TARGETISHURTBYSALTCURE 669 -#define STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP 670 -#define STRINGID_SHARPSTEELFLOATS 671 -#define STRINGID_SHARPSTEELDMG 672 -#define STRINGID_PKMNBLEWAWAYSHARPSTEEL 673 -#define STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM 674 -#define STRINGID_TEAMTRAPPEDWITHVINES 675 -#define STRINGID_PKMNHURTBYVINES 676 -#define STRINGID_TEAMCAUGHTINVORTEX 677 -#define STRINGID_PKMNHURTBYVORTEX 678 -#define STRINGID_TEAMSURROUNDEDBYFIRE 679 -#define STRINGID_PKMNBURNINGUP 680 -#define STRINGID_TEAMSURROUNDEDBYROCKS 681 -#define STRINGID_PKMNHURTBYROCKSTHROWN 682 -#define STRINGID_MOVEBLOCKEDBYDYNAMAX 683 -#define STRINGID_ZEROTOHEROTRANSFORMATION 684 -#define STRINGID_THETWOMOVESBECOMEONE 685 -#define STRINGID_ARAINBOWAPPEAREDONSIDE 686 -#define STRINGID_THERAINBOWDISAPPEARED 687 -#define STRINGID_WAITINGFORPARTNERSMOVE 688 -#define STRINGID_SEAOFFIREENVELOPEDSIDE 689 -#define STRINGID_HURTBYTHESEAOFFIRE 690 -#define STRINGID_THESEAOFFIREDISAPPEARED 691 -#define STRINGID_SWAMPENVELOPEDSIDE 692 -#define STRINGID_THESWAMPDISAPPEARED 693 -#define STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE 694 -#define STRINGID_HOSPITALITYRESTORATION 695 -#define STRINGID_ELECTROSHOTCHARGING 696 -#define STRINGID_ITEMWASUSEDUP 697 -#define STRINGID_ATTACKERLOSTITSTYPE 698 -#define STRINGID_SHEDITSTAIL 699 -#define STRINGID_CLOAKEDINAHARSHLIGHT 700 -#define STRINGID_SUPERSWEETAROMAWAFTS 701 -#define STRINGID_DIMENSIONSWERETWISTED 702 -#define STRINGID_BIZARREARENACREATED 703 -#define STRINGID_BIZARREAREACREATED 704 -#define STRINGID_TIDYINGUPCOMPLETE 705 -#define STRINGID_PKMNTERASTALLIZEDINTO 706 -#define STRINGID_BOOSTERENERGYACTIVATES 707 -#define STRINGID_FOGCREPTUP 708 -#define STRINGID_FOGISDEEP 709 -#define STRINGID_FOGLIFTED 710 -#define STRINGID_PKMNMADESHELLGLEAM 711 -#define STRINGID_FICKLEBEAMDOUBLED 712 -#define STRINGID_COMMANDERACTIVATES 713 -#define STRINGID_POKEFLUTECATCHY 714 -#define STRINGID_POKEFLUTE 715 -#define STRINGID_MONHEARINGFLUTEAWOKE 716 -#define STRINGID_SUNLIGHTISHARSH 717 -#define STRINGID_ITISHAILING 718 -#define STRINGID_ITISSNOWING 719 -#define STRINGID_ISCOVEREDWITHGRASS 720 -#define STRINGID_MISTSWIRLSAROUND 721 -#define STRINGID_ELECTRICCURRENTISRUNNING 722 -#define STRINGID_SEEMSWEIRD 723 -#define STRINGID_WAGGLINGAFINGER 724 +#define STRINGID_AIRBALLOONFLOAT 532 +#define STRINGID_AIRBALLOONPOP 533 +#define STRINGID_INCINERATEBURN 534 +#define STRINGID_BUGBITE 535 +#define STRINGID_ILLUSIONWOREOFF 536 +#define STRINGID_ATTACKERCUREDTARGETSTATUS 537 +#define STRINGID_ATTACKERLOSTFIRETYPE 538 +#define STRINGID_HEALERCURE 539 +#define STRINGID_SCRIPTINGABILITYSTATRAISE 540 +#define STRINGID_RECEIVERABILITYTAKEOVER 541 +#define STRINGID_PKNMABSORBINGPOWER 542 +#define STRINGID_NOONEWILLBEABLETORUNAWAY 543 +#define STRINGID_DESTINYKNOTACTIVATES 544 +#define STRINGID_CLOAKEDINAFREEZINGLIGHT 545 +#define STRINGID_CLEARAMULETWONTLOWERSTATS 546 +#define STRINGID_FERVENTWISHREACHED 547 +#define STRINGID_AIRLOCKACTIVATES 548 +#define STRINGID_PRESSUREENTERS 549 +#define STRINGID_DARKAURAENTERS 550 +#define STRINGID_FAIRYAURAENTERS 551 +#define STRINGID_AURABREAKENTERS 552 +#define STRINGID_COMATOSEENTERS 553 +#define STRINGID_SCREENCLEANERENTERS 554 +#define STRINGID_FETCHEDPOKEBALL 555 +#define STRINGID_BATTLERABILITYRAISEDSTAT 556 +#define STRINGID_ASANDSTORMKICKEDUP 557 +#define STRINGID_PKMNSWILLPERISHIN3TURNS 558 +#define STRINGID_ABILITYRAISEDSTATDRASTICALLY 559 +#define STRINGID_AURAFLAREDTOLIFE 560 +#define STRINGID_ASONEENTERS 561 +#define STRINGID_CURIOUSMEDICINEENTERS 562 +#define STRINGID_CANACTFASTERTHANKSTO 563 +#define STRINGID_MICLEBERRYACTIVATES 564 +#define STRINGID_PKMNSHOOKOFFTHETAUNT 565 +#define STRINGID_PKMNGOTOVERITSINFATUATION 566 +#define STRINGID_ITEMCANNOTBEREMOVED 567 +#define STRINGID_STICKYBARBTRANSFER 568 +#define STRINGID_PKMNBURNHEALED 569 +#define STRINGID_REDCARDACTIVATE 570 +#define STRINGID_EJECTBUTTONACTIVATE 571 +#define STRINGID_ATKGOTOVERINFATUATION 572 +#define STRINGID_TORMENTEDNOMORE 573 +#define STRINGID_HEALBLOCKEDNOMORE 574 +#define STRINGID_ATTACKERBECAMEFULLYCHARGED 575 +#define STRINGID_ATTACKERBECAMEASHSPECIES 576 +#define STRINGID_EXTREMELYHARSHSUNLIGHT 577 +#define STRINGID_EXTREMESUNLIGHTFADED 578 +#define STRINGID_MOVEEVAPORATEDINTHEHARSHSUNLIGHT 579 +#define STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED 580 +#define STRINGID_HEAVYRAIN 581 +#define STRINGID_HEAVYRAINLIFTED 582 +#define STRINGID_MOVEFIZZLEDOUTINTHEHEAVYRAIN 583 +#define STRINGID_NORELIEFROMHEAVYRAIN 584 +#define STRINGID_MYSTERIOUSAIRCURRENT 585 +#define STRINGID_STRONGWINDSDISSIPATED 586 +#define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 587 +#define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 588 +#define STRINGID_STUFFCHEEKSCANTSELECT 589 +#define STRINGID_PKMNREVERTEDTOPRIMAL 590 +#define STRINGID_BUTPOKEMONCANTUSETHEMOVE 591 +#define STRINGID_BUTHOOPACANTUSEIT 592 +#define STRINGID_BROKETHROUGHPROTECTION 593 +#define STRINGID_ABILITYALLOWSONLYMOVE 594 +#define STRINGID_SWAPPEDABILITIES 595 +#define STRINGID_PASTELVEILPROTECTED 596 +#define STRINGID_PASTELVEILENTERS 597 +#define STRINGID_BATTLERTYPECHANGEDTO 598 +#define STRINGID_BOTHCANNOLONGERESCAPE 599 +#define STRINGID_CANTESCAPEDUETOUSEDMOVE 600 +#define STRINGID_PKMNBECAMEWEAKERTOFIRE 601 +#define STRINGID_ABOUTTOUSEPOLTERGEIST 602 +#define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 603 +#define STRINGID_NEUTRALIZINGGASENTERS 604 +#define STRINGID_NEUTRALIZINGGASOVER 605 +#define STRINGID_TARGETTOOHEAVY 606 +#define STRINGID_PKMNTOOKTARGETHIGH 607 +#define STRINGID_PKMNINSNAPTRAP 608 +#define STRINGID_METEORBEAMCHARGING 609 +#define STRINGID_HEATUPBEAK 610 +#define STRINGID_COURTCHANGE 611 +#define STRINGID_PLAYERLOSTTOENEMYTRAINER 612 +#define STRINGID_PLAYERPAIDPRIZEMONEY 613 +#define STRINGID_ZPOWERSURROUNDS 614 +#define STRINGID_ZMOVEUNLEASHED 615 +#define STRINGID_ZMOVERESETSSTATS 616 +#define STRINGID_ZMOVEALLSTATSUP 617 +#define STRINGID_ZMOVEZBOOSTCRIT 618 +#define STRINGID_ZMOVERESTOREHP 619 +#define STRINGID_ZMOVESTATUP 620 +#define STRINGID_ZMOVEHPTRAP 621 +#define STRINGID_ATTACKEREXPELLEDTHEPOISON 622 +#define STRINGID_ATTACKERSHOOKITSELFAWAKE 623 +#define STRINGID_ATTACKERBROKETHROUGHPARALYSIS 624 +#define STRINGID_ATTACKERHEALEDITSBURN 625 +#define STRINGID_ATTACKERMELTEDTHEICE 626 +#define STRINGID_TARGETTOUGHEDITOUT 627 +#define STRINGID_ATTACKERLOSTELECTRICTYPE 628 +#define STRINGID_ATTACKERSWITCHEDSTATWITHTARGET 629 +#define STRINGID_BEINGHITCHARGEDPKMNWITHPOWER 630 +#define STRINGID_SUNLIGHTACTIVATEDABILITY 631 +#define STRINGID_STATWASHEIGHTENED 632 +#define STRINGID_ELECTRICTERRAINACTIVATEDABILITY 633 +#define STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT 634 +#define STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN 635 +#define STRINGID_PKMNSABILITYPREVENTSABILITY 636 +#define STRINGID_PREPARESHELLTRAP 637 +#define STRINGID_SHELLTRAPDIDNTWORK 638 +#define STRINGID_SPIKESDISAPPEAREDFROMTEAM 639 +#define STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM 640 +#define STRINGID_STICKYWEBDISAPPEAREDFROMTEAM 641 +#define STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM 642 +#define STRINGID_COULDNTFULLYPROTECT 643 +#define STRINGID_STOCKPILEDEFFECTWOREOFF 644 +#define STRINGID_PKMNREVIVEDREADYTOFIGHT 645 +#define STRINGID_ITEMRESTOREDSPECIESHEALTH 646 +#define STRINGID_ITEMCUREDSPECIESSTATUS 647 +#define STRINGID_ITEMRESTOREDSPECIESPP 648 +#define STRINGID_THUNDERCAGETRAPPED 649 +#define STRINGID_PKMNHURTBYFROSTBITE 650 +#define STRINGID_PKMNGOTFROSTBITE 651 +#define STRINGID_PKMNSITEMHEALEDFROSTBITE 652 +#define STRINGID_ATTACKERHEALEDITSFROSTBITE 653 +#define STRINGID_PKMNFROSTBITEHEALED 654 +#define STRINGID_PKMNFROSTBITEHEALED2 655 +#define STRINGID_PKMNFROSTBITEHEALEDBY 656 +#define STRINGID_MIRRORHERBCOPIED 657 +#define STRINGID_STARTEDSNOW 658 +#define STRINGID_SNOWCONTINUES 659 +#define STRINGID_SNOWSTOPPED 660 +#define STRINGID_SNOWWARNINGSNOW 661 +#define STRINGID_PKMNITEMMELTED 662 +#define STRINGID_ULTRABURSTREACTING 663 +#define STRINGID_ULTRABURSTCOMPLETED 664 +#define STRINGID_TEAMGAINEDEXP 665 +#define STRINGID_CURRENTMOVECANTSELECT 666 +#define STRINGID_TARGETISBEINGSALTCURED 667 +#define STRINGID_TARGETISHURTBYSALTCURE 668 +#define STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP 669 +#define STRINGID_SHARPSTEELFLOATS 670 +#define STRINGID_SHARPSTEELDMG 671 +#define STRINGID_PKMNBLEWAWAYSHARPSTEEL 672 +#define STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM 673 +#define STRINGID_TEAMTRAPPEDWITHVINES 674 +#define STRINGID_PKMNHURTBYVINES 675 +#define STRINGID_TEAMCAUGHTINVORTEX 676 +#define STRINGID_PKMNHURTBYVORTEX 677 +#define STRINGID_TEAMSURROUNDEDBYFIRE 678 +#define STRINGID_PKMNBURNINGUP 679 +#define STRINGID_TEAMSURROUNDEDBYROCKS 680 +#define STRINGID_PKMNHURTBYROCKSTHROWN 681 +#define STRINGID_MOVEBLOCKEDBYDYNAMAX 682 +#define STRINGID_ZEROTOHEROTRANSFORMATION 683 +#define STRINGID_THETWOMOVESBECOMEONE 684 +#define STRINGID_ARAINBOWAPPEAREDONSIDE 685 +#define STRINGID_THERAINBOWDISAPPEARED 686 +#define STRINGID_WAITINGFORPARTNERSMOVE 687 +#define STRINGID_SEAOFFIREENVELOPEDSIDE 688 +#define STRINGID_HURTBYTHESEAOFFIRE 689 +#define STRINGID_THESEAOFFIREDISAPPEARED 690 +#define STRINGID_SWAMPENVELOPEDSIDE 691 +#define STRINGID_THESWAMPDISAPPEARED 692 +#define STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE 693 +#define STRINGID_HOSPITALITYRESTORATION 694 +#define STRINGID_ELECTROSHOTCHARGING 695 +#define STRINGID_ITEMWASUSEDUP 696 +#define STRINGID_ATTACKERLOSTITSTYPE 697 +#define STRINGID_SHEDITSTAIL 698 +#define STRINGID_CLOAKEDINAHARSHLIGHT 699 +#define STRINGID_SUPERSWEETAROMAWAFTS 700 +#define STRINGID_DIMENSIONSWERETWISTED 701 +#define STRINGID_BIZARREARENACREATED 702 +#define STRINGID_BIZARREAREACREATED 703 +#define STRINGID_TIDYINGUPCOMPLETE 704 +#define STRINGID_PKMNTERASTALLIZEDINTO 705 +#define STRINGID_BOOSTERENERGYACTIVATES 706 +#define STRINGID_FOGCREPTUP 707 +#define STRINGID_FOGISDEEP 708 +#define STRINGID_FOGLIFTED 709 +#define STRINGID_PKMNMADESHELLGLEAM 710 +#define STRINGID_FICKLEBEAMDOUBLED 711 +#define STRINGID_COMMANDERACTIVATES 712 +#define STRINGID_POKEFLUTECATCHY 713 +#define STRINGID_POKEFLUTE 714 +#define STRINGID_MONHEARINGFLUTEAWOKE 715 +#define STRINGID_SUNLIGHTISHARSH 716 +#define STRINGID_ITISHAILING 717 +#define STRINGID_ITISSNOWING 718 +#define STRINGID_ISCOVEREDWITHGRASS 719 +#define STRINGID_MISTSWIRLSAROUND 720 +#define STRINGID_ELECTRICCURRENTISRUNNING 721 +#define STRINGID_SEEMSWEIRD 722 +#define STRINGID_WAGGLINGAFINGER 723 +#define STRINGID_BLOCKEDBYSLEEPCLAUSE 724 +#define STRINGID_SUPEREFFECTIVETWOFOES 725 +#define STRINGID_NOTVERYEFFECTIVETWOFOES 726 +#define STRINGID_ITDOESNTAFFECTTWOFOES 727 +#define STRINGID_SENDCAUGHTMONPARTYORBOX 728 +#define STRINGID_PKMNSENTTOPCAFTERCATCH 729 -#define BATTLESTRINGS_COUNT 725 +#define BATTLESTRINGS_COUNT 730 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, @@ -781,14 +786,25 @@ // gWeatherEndsStringIds #define B_MSG_WEATHER_END_RAIN 0 -#define B_MSG_WEATHER_END_SANDSTORM 1 -#define B_MSG_WEATHER_END_SUN 2 +#define B_MSG_WEATHER_END_SUN 1 +#define B_MSG_WEATHER_END_SANDSTORM 2 #define B_MSG_WEATHER_END_HAIL 3 -#define B_MSG_WEATHER_END_STRONG_WINDS 4 -#define B_MSG_WEATHER_END_SNOW 5 -#define B_MSG_WEATHER_END_FOG 6 +#define B_MSG_WEATHER_END_SNOW 4 +#define B_MSG_WEATHER_END_FOG 5 +#define B_MSG_WEATHER_END_STRONG_WINDS 6 #define B_MSG_WEATHER_END_COUNT 7 +// gWeatherTurnStringIds +#define B_MSG_WEATHER_TURN_RAIN 0 +#define B_MSG_WEATHER_TURN_DOWNPOUR 1 +#define B_MSG_WEATHER_TURN_SUN 2 +#define B_MSG_WEATHER_TURN_SANDSTORM 3 +#define B_MSG_WEATHER_TURN_HAIL 4 +#define B_MSG_WEATHER_TURN_SNOW 5 +#define B_MSG_WEATHER_TURN_FOG 6 +#define B_MSG_WEATHER_TURN_STRONG_WINDS 7 +#define B_MSG_WEATHER_TURN_COUNT 8 + // gRainContinuesStringIds #define B_MSG_RAIN_CONTINUES 0 #define B_MSG_DOWNPOUR_CONTINUES 1 @@ -878,10 +894,12 @@ #define B_MSG_WEAKEN_FIRE 1 // gCaughtMonStringIds -#define B_MSG_SENT_SOMEONES_PC 0 -#define B_MSG_SENT_LANETTES_PC 1 -#define B_MSG_SOMEONES_BOX_FULL 2 -#define B_MSG_LANETTES_BOX_FULL 3 +#define B_MSG_NO_MESSSAGE_SKIP 0 +#define B_MSG_SENT_SOMEONES_PC 1 +#define B_MSG_SENT_LANETTES_PC 2 +#define B_MSG_SOMEONES_BOX_FULL 3 +#define B_MSG_LANETTES_BOX_FULL 4 +#define B_MSG_SWAPPED_INTO_PARTY 5 // gPrimalWeatherBlocksStringIds #define B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN 0 @@ -1007,9 +1025,11 @@ #define B_MSG_SET_TRICK_ROOM 4 #define B_MSG_SET_MAGIC_ROOM 5 #define B_MSG_SET_WONDER_ROOM 6 -#define B_MSG_SET_TAILWIND_PLAYER 7 -#define B_MSG_SET_TAILWIND_OPPONENT 8 -#define B_MSG_STARTING_STATUS_COUNT 9 +#define B_MSG_SET_TAILWIND 7 +#define B_MSG_SET_RAINBOW 8 +#define B_MSG_SET_SEA_OF_FIRE 9 +#define B_MSG_SET_SWAMP 10 +#define B_MSG_STARTING_STATUS_COUNT 11 // gWrappedStringIds diff --git a/include/constants/difficulty.h b/include/constants/difficulty.h new file mode 100644 index 0000000000..44ef8d9d71 --- /dev/null +++ b/include/constants/difficulty.h @@ -0,0 +1,15 @@ +#ifndef GUARD_DIFFICULTY_CONSTANTS_H +#define GUARD_DIFFICULTY_CONSTANTS_H + +enum DifficultyLevel +{ + DIFFICULTY_EASY, + DIFFICULTY_NORMAL, //If you rename this, the word "Normal" in fprint_trainers must be replaced with the new difficulty name. + DIFFICULTY_HARD, + DIFFICULTY_COUNT, +}; + +#define DIFFICULTY_MIN 0 +#define DIFFICULTY_MAX (DIFFICULTY_COUNT - 1) + +#endif // GUARD_DIFFICULTY_CONSTANTS_H diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 482321502e..b3510c9845 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,13 +1,13 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.10.3 +// Last version: 1.11.0 #define EXPANSION_VERSION_MAJOR 1 -#define EXPANSION_VERSION_MINOR 10 -#define EXPANSION_VERSION_PATCH 3 +#define EXPANSION_VERSION_MINOR 11 +#define EXPANSION_VERSION_PATCH 1 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE TRUE +#define EXPANSION_TAGGED_RELEASE FALSE #endif diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index f6e6106d90..48406195f0 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -20,9 +20,9 @@ #define FLDEFF_JUMP_SMALL_SPLASH 16 #define FLDEFF_LONG_GRASS 17 #define FLDEFF_JUMP_LONG_GRASS 18 -#define FLDEFF_UNUSED_GRASS 19 -#define FLDEFF_UNUSED_GRASS_2 20 -#define FLDEFF_UNUSED_SAND 21 +#define FLDEFF_SHAKING_GRASS 19 +#define FLDEFF_SHAKING_LONG_GRASS 20 +#define FLDEFF_SAND_HOLE 21 #define FLDEFF_WATER_SURFACING 22 #define FLDEFF_BERRY_TREE_GROWTH_SPARKLE 23 #define FLDEFF_DEEP_SAND_FOOTPRINTS 24 @@ -75,6 +75,7 @@ #define FLDEFF_TRACKS_SLITHER 70 #define FLDEFF_TRACKS_SPOT 71 #define FLDEFF_TRACKS_BUG 72 +#define FLDEFF_CAVE_DUST 73 #define FLDEFFOBJ_SHADOW_S 0 #define FLDEFFOBJ_SHADOW_M 1 @@ -116,6 +117,7 @@ #define FLDEFFOBJ_TRACKS_SLITHER 37 #define FLDEFFOBJ_TRACKS_SPOT 38 #define FLDEFFOBJ_TRACKS_BUG 39 +#define FLDEFFOBJ_CAVE_DUST 40 #define FLDEFF_PAL_TAG_CUT_GRASS 0x1000 #define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003 @@ -129,5 +131,6 @@ #define FLDEFF_PAL_TAG_SMALL_SPARKLE 0x100F #define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010 #define FLDEFF_PAL_TAG_UNKNOWN 0x1011 +#define FLDEFF_PAL_TAG_CAVE_DUST 0x1012 #endif // GUARD_FIELD_EFFECT_CONSTANTS_H diff --git a/include/constants/flags.h b/include/constants/flags.h index 8685faca6f..aec9ebbd92 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -1660,4 +1660,16 @@ #define FLAG_TEMP_HIDE_FOLLOWER FLAG_TEMP_E #define FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE FLAG_TEMP_11 +#if TESTING +#define TESTING_FLAGS_START 0x5000 +#define TESTING_FLAG_SLEEP_CLAUSE (TESTING_FLAGS_START + 0x0) +#define TESTING_FLAG_UNUSED_1 (TESTING_FLAGS_START + 0x1) +#define TESTING_FLAG_UNUSED_2 (TESTING_FLAGS_START + 0x2) +#define TESTING_FLAG_UNUSED_3 (TESTING_FLAGS_START + 0x3) +#define TESTING_FLAG_UNUSED_4 (TESTING_FLAGS_START + 0x4) +#define TESTING_FLAG_UNUSED_5 (TESTING_FLAGS_START + 0x5) +#define TESTING_FLAG_UNUSED_6 (TESTING_FLAGS_START + 0x6) +#define TESTING_FLAG_UNUSED_7 (TESTING_FLAGS_START + 0x7) +#endif // TESTING + #endif // GUARD_CONSTANTS_FLAGS_H diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index 8af9740cad..8cf2e37e1b 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -144,4 +144,11 @@ // param2: ability to check, optional #define FORM_CHANGE_BATTLE_BEFORE_MOVE_CATEGORY 25 +// Form change that activates when overworld weather changes. +// param1: weather to check. +#define FORM_CHANGE_OVERWORLD_WEATHER 26 + +// Form change that activates when the Pokémon is deposited into the PC or Daycare. +#define FORM_CHANGE_DEPOSIT 27 + #endif // GUARD_CONSTANTS_FORM_CHANGE_TYPES_H diff --git a/include/constants/game_stat.h b/include/constants/game_stat.h index 5796afbaec..17e328d5be 100644 --- a/include/constants/game_stat.h +++ b/include/constants/game_stat.h @@ -53,8 +53,9 @@ #define GAME_STAT_ENTERED_HOT_SPRINGS 49 #define GAME_STAT_NUM_UNION_ROOM_BATTLES 50 #define GAME_STAT_PLAYED_BERRY_CRUSH 51 +#define GAME_STAT_DEXNAV_SCANNED 52 -#define NUM_USED_GAME_STATS 52 +#define NUM_USED_GAME_STATS 53 #define NUM_GAME_STATS 64 #endif // GUARD_CONSTANTS_GAME_STAT_H diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index b4c5db43b7..f80db1c1a7 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -10,6 +10,7 @@ enum GenConfigTag GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, GEN_CONFIG_MULTI_HIT_CHANCE, GEN_CONFIG_GALE_WINGS, + GEN_CONFIG_HEAL_BELL_SOUNDPROOF, GEN_CONFIG_COUNT }; diff --git a/include/constants/global.h b/include/constants/global.h index 5c60a3de60..8ca3861709 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -8,6 +8,9 @@ #include "config/caps.h" #include "config/pokemon.h" #include "config/overworld.h" +#include "config/dexnav.h" +#include "config/summary_screen.h" +#include "config/ai.h" // Invalid Versions show as "----------" in Gen 4 and Gen 5's summary screen. // In Gens 6 and 7, invalid versions instead show "a distant land" in the summary screen. @@ -121,6 +124,7 @@ #define TYPE_NAME_LENGTH 8 #define ABILITY_NAME_LENGTH 16 #define TRAINER_NAME_LENGTH 10 +#define CODE_NAME_LENGTH 11 #define MAX_STAMP_CARD_STAMPS 7 diff --git a/include/constants/party_menu.h b/include/constants/party_menu.h index 1f37f3416c..76360d8ee8 100644 --- a/include/constants/party_menu.h +++ b/include/constants/party_menu.h @@ -48,7 +48,7 @@ #define PARTY_ACTION_CHOOSE_AND_CLOSE 11 #define PARTY_ACTION_MOVE_TUTOR 12 #define PARTY_ACTION_MINIGAME 13 -#define PARTY_ACTION_REUSABLE_ITEM 14 // Unused. The only reusable items are handled separately +#define PARTY_ACTION_SEND_MON_TO_BOX 14 #define PARTY_ACTION_CHOOSE_FAINTED_MON 15 // IDs for DisplayPartyMenuStdMessage, to display the message at the bottom of the party menu @@ -81,6 +81,9 @@ #define PARTY_MSG_ALREADY_HOLDING_ONE 26 #define PARTY_MSG_WHICH_APPLIANCE 27 #define PARTY_MSG_CHOOSE_SECOND_FUSION 28 +#define PARTY_MSG_NO_POKEMON 29 +#define PARTY_MSG_CHOOSE_MON_FOR_BOX 30 + #define PARTY_MSG_NONE 127 // IDs for DisplayPartyPokemonDescriptionText, to display a message in the party pokemon's box diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index eef34716f4..dc6d399acf 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -324,8 +324,9 @@ enum EvolutionMode { // - Unown has 1 frame, presumably to avoid the work of animating all 28 of its forms #define MAX_MON_PIC_FRAMES 2 -#define BATTLE_ALIVE_EXCEPT_BATTLER 0 -#define BATTLE_ALIVE_SIDE 1 +#define BATTLE_ALIVE_EXCEPT_BATTLER 0 +#define BATTLE_ALIVE_EXCEPT_BATTLER_SIDE 1 +#define BATTLE_ALIVE_SIDE 2 #define SKIP_FRONT_ANIM (1 << 7) diff --git a/include/constants/species.h b/include/constants/species.h index b94a15a396..3656d7664e 100644 --- a/include/constants/species.h +++ b/include/constants/species.h @@ -1214,15 +1214,15 @@ #define SPECIES_FLORGES_ORANGE 1143 #define SPECIES_FLORGES_BLUE 1144 #define SPECIES_FLORGES_WHITE 1145 -#define SPECIES_FURFROU_HEART_TRIM 1146 -#define SPECIES_FURFROU_STAR_TRIM 1147 -#define SPECIES_FURFROU_DIAMOND_TRIM 1148 -#define SPECIES_FURFROU_DEBUTANTE_TRIM 1149 -#define SPECIES_FURFROU_MATRON_TRIM 1150 -#define SPECIES_FURFROU_DANDY_TRIM 1151 -#define SPECIES_FURFROU_LA_REINE_TRIM 1152 -#define SPECIES_FURFROU_KABUKI_TRIM 1153 -#define SPECIES_FURFROU_PHARAOH_TRIM 1154 +#define SPECIES_FURFROU_HEART 1146 +#define SPECIES_FURFROU_STAR 1147 +#define SPECIES_FURFROU_DIAMOND 1148 +#define SPECIES_FURFROU_DEBUTANTE 1149 +#define SPECIES_FURFROU_MATRON 1150 +#define SPECIES_FURFROU_DANDY 1151 +#define SPECIES_FURFROU_LA_REINE 1152 +#define SPECIES_FURFROU_KABUKI 1153 +#define SPECIES_FURFROU_PHARAOH 1154 #define SPECIES_MEOWSTIC_F 1155 #define SPECIES_AEGISLASH_BLADE 1156 #define SPECIES_PUMPKABOO_SMALL 1157 diff --git a/include/constants/trainer_slide.h b/include/constants/trainer_slide.h new file mode 100644 index 0000000000..26635b164b --- /dev/null +++ b/include/constants/trainer_slide.h @@ -0,0 +1,43 @@ +#ifndef GUARD_CONSTANTS_TRAINER_SLIDE_H +#define GUARD_CONSTANTS_TRAINER_SLIDE_H + +enum ComparisonOperators +{ + LESS_THAN, + EQUAL, + GREATER_THAN, + LESS_THAN_OR_EQUAL, + GREATER_THAN_OR_EQUAL, + NOT_EQUAL, +}; + +enum TrainerSlideType +{ + TRAINER_SLIDE_NONE, + TRAINER_SLIDE_BEFORE_FIRST_TURN, + TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT, + TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT, + TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT, + TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE, + TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN, + TRAINER_SLIDE_ENEMY_MON_UNAFFECTED, + TRAINER_SLIDE_LAST_SWITCHIN, + TRAINER_SLIDE_LAST_HALF_HP, + TRAINER_SLIDE_LAST_LOW_HP, + TRAINER_SLIDE_MEGA_EVOLUTION, + TRAINER_SLIDE_Z_MOVE, + TRAINER_SLIDE_DYNAMAX, + TRAINER_SLIDE_COUNT, +}; + +#define TRAINER_SLIDES_PER_ARRAY 8 +#define TRAINER_SLIDE_ARRAY_SIZE ((TRAINER_SLIDE_COUNT + TRAINER_SLIDES_PER_ARRAY - 1) / TRAINER_SLIDES_PER_ARRAY) + +enum TrainerSlideTargets +{ + TRAINER_SLIDE_TARGET_NONE, + TRAINER_SLIDE_TARGET_TRAINER_A, + TRAINER_SLIDE_TARGET_TRAINER_B, +}; + +#endif // GUARD_CONSTANTS_TRAINER_SLIDE_H diff --git a/include/constants/vars.h b/include/constants/vars.h index 1b71134593..aac52dec0e 100644 --- a/include/constants/vars.h +++ b/include/constants/vars.h @@ -301,7 +301,7 @@ #define VAR_MON_BOX_ID 0x8012 #define VAR_MON_BOX_POS 0x8013 #define VAR_UNUSED_0x8014 0x8014 -#define VAR_TRAINER_BATTLE_OPPONENT_A 0x8015 // Alias of gTrainerBattleOpponent_A +#define VAR_TRAINER_BATTLE_OPPONENT_A 0x8015 // Alias of TRAINER_BATTLE_PARAM.opponentA #define SPECIAL_VARS_END 0x8015 @@ -324,4 +324,16 @@ #define VAR_TEMP_TRANSFERRED_SPECIES VAR_TEMP_1 +#if TESTING +#define TESTING_VARS_START 0x9000 +#define TESTING_VAR_DIFFICULTY (TESTING_VARS_START + 0x0) +#define TESTING_VAR_UNUSED_1 (TESTING_VARS_START + 0x1) +#define TESTING_VAR_UNUSED_2 (TESTING_VARS_START + 0x2) +#define TESTING_VAR_UNUSED_3 (TESTING_VARS_START + 0x3) +#define TESTING_VAR_UNUSED_4 (TESTING_VARS_START + 0x4) +#define TESTING_VAR_UNUSED_5 (TESTING_VARS_START + 0x5) +#define TESTING_VAR_UNUSED_6 (TESTING_VARS_START + 0x6) +#define TESTING_VAR_UNUSED_7 (TESTING_VARS_START + 0x7) +#endif // TESTING + #endif // GUARD_CONSTANTS_VARS_H diff --git a/include/constants/weather.h b/include/constants/weather.h index c4a23a18bc..32dc97a1a2 100644 --- a/include/constants/weather.h +++ b/include/constants/weather.h @@ -19,6 +19,7 @@ #define WEATHER_ABNORMAL 15 // The alternating weather during Groudon/Kyogre conflict #define WEATHER_ROUTE119_CYCLE 20 #define WEATHER_ROUTE123_CYCLE 21 +#define WEATHER_COUNT 22 // These are used in maps' coord_weather_event entries. // They are not a one-to-one mapping with the engine's diff --git a/include/constants/wild_encounter.h b/include/constants/wild_encounter.h index ae669a2c35..364d18350f 100644 --- a/include/constants/wild_encounter.h +++ b/include/constants/wild_encounter.h @@ -5,6 +5,7 @@ #define WATER_WILD_COUNT 5 #define ROCK_WILD_COUNT 5 #define FISH_WILD_COUNT 10 +#define HIDDEN_WILD_COUNT 3 #define NUM_ALTERING_CAVE_TABLES 9 diff --git a/include/contest.h b/include/contest.h index 8a3b6a3c65..a10ec5babd 100644 --- a/include/contest.h +++ b/include/contest.h @@ -109,9 +109,9 @@ struct ContestPokemon bool8 gameCleared; u8 isShiny:1; u8 unused1:7; - u8 unused2[9]; u32 personality; u32 otId; + u8 filter; }; struct ContestTempSave diff --git a/include/data.h b/include/data.h index ef59aae569..8b1e9c22d1 100644 --- a/include/data.h +++ b/include/data.h @@ -3,6 +3,8 @@ #include "constants/moves.h" #include "constants/trainers.h" +#include "constants/battle.h" +#include "difficulty.h" #define MAX_TRAINER_ITEMS 4 @@ -74,6 +76,7 @@ struct TrainerMon u8 padding1:1; u8 dynamaxLevel:4; u8 padding2:4; + u32 tags; }; #define TRAINER_PARTY(partyArray) partyArray, .partySize = ARRAY_COUNT(partyArray) @@ -88,10 +91,14 @@ struct Trainer /*0x12*/ u8 trainerPic; /*0x13*/ u8 trainerName[TRAINER_NAME_LENGTH + 1]; /*0x1E*/ bool8 doubleBattle:1; - bool8 mugshotEnabled:1; + bool8 padding:1; u8 startingStatus:6; // this trainer starts a battle with a given status. see include/constants/battle.h for values /*0x1F*/ u8 mugshotColor; /*0x20*/ u8 partySize; + /*0x21*/ u8 poolSize; + /*0x22*/ u8 poolRuleIndex; + /*0x23*/ u8 poolPickIndex; + /*0x24*/ u8 poolPruneIndex; }; struct TrainerClass @@ -112,7 +119,8 @@ struct TypeInfo u16 damageCategory:2; // Used for B_PHYSICAL_SPECIAL_SPLIT <= GEN_3 u16 useSecondTypeIconPalette:1; u16 isSpecialCaseType:1; - u16 padding:12; + u16 isHiddenPowerType:1; // Changing this for any type will change the distribution of all Hidden Power types from vanilla. + u16 padding:11; const u32 *const paletteTMHM; //u16 enhanceItem; //u16 berry; @@ -160,12 +168,12 @@ extern const union AffineAnimCmd *const gAffineAnims_BattleSpriteContest[]; extern const union AnimCmd sAnim_GeneralFrame0[]; extern const union AnimCmd sAnim_GeneralFrame3[]; extern const union AnimCmd *const gAnims_MonPic[]; -extern const union AnimCmd *const sAnims_Trainer[]; +extern const union AnimCmd *const gAnims_Trainer[]; extern const struct TrainerSprite gTrainerSprites[]; extern const struct TrainerBacksprite gTrainerBacksprites[]; -extern const struct Trainer gTrainers[]; -extern const struct Trainer gBattlePartners[]; +extern const struct Trainer gTrainers[DIFFICULTY_COUNT][TRAINERS_COUNT]; +extern const struct Trainer gBattlePartners[DIFFICULTY_COUNT][PARTNER_COUNT]; extern const struct TrainerClass gTrainerClasses[TRAINER_CLASS_COUNT]; @@ -191,71 +199,103 @@ static inline u16 SanitizeTrainerId(u16 trainerId) static inline const struct Trainer *GetTrainerStructFromId(u16 trainerId) { - return &gTrainers[SanitizeTrainerId(trainerId)]; + u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + + return &gTrainers[difficulty][sanitizedTrainerId]; } static inline const u8 GetTrainerClassFromId(u16 trainerId) { - return gTrainers[SanitizeTrainerId(trainerId)].trainerClass; + u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + + return gTrainers[difficulty][sanitizedTrainerId].trainerClass; } static inline const u8 *GetTrainerClassNameFromId(u16 trainerId) { + enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(trainerId); + if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) - return gTrainerClasses[gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerClass].name; + return gTrainerClasses[gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerClass].name; return gTrainerClasses[GetTrainerClassFromId(trainerId)].name; } static inline const u8 *GetTrainerNameFromId(u16 trainerId) { + u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + + enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + + enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); + if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) - return gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName; - return gTrainers[SanitizeTrainerId(trainerId)].trainerName; + return gBattlePartners[partnerDifficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName; + return gTrainers[difficulty][sanitizedTrainerId].trainerName; } static inline const u8 GetTrainerPicFromId(u16 trainerId) { - return gTrainers[SanitizeTrainerId(trainerId)].trainerPic; + u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + + return gTrainers[difficulty][sanitizedTrainerId].trainerPic; } static inline const u8 GetTrainerStartingStatusFromId(u16 trainerId) { - return gTrainers[SanitizeTrainerId(trainerId)].startingStatus; + return gTrainers[GetCurrentDifficultyLevel()][SanitizeTrainerId(trainerId)].startingStatus; } static inline const bool32 IsTrainerDoubleBattle(u16 trainerId) { - return gTrainers[SanitizeTrainerId(trainerId)].doubleBattle; + u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + + return gTrainers[difficulty][sanitizedTrainerId].doubleBattle; } static inline const u8 GetTrainerPartySizeFromId(u16 trainerId) { - return gTrainers[SanitizeTrainerId(trainerId)].partySize; + u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + + return gTrainers[difficulty][sanitizedTrainerId].partySize; } static inline const bool32 DoesTrainerHaveMugshot(u16 trainerId) { - return gTrainers[SanitizeTrainerId(trainerId)].mugshotEnabled; + return gTrainers[GetCurrentDifficultyLevel()][SanitizeTrainerId(trainerId)].mugshotColor; } static inline const u8 GetTrainerMugshotColorFromId(u16 trainerId) { - return gTrainers[SanitizeTrainerId(trainerId)].mugshotColor; + return gTrainers[GetCurrentDifficultyLevel()][SanitizeTrainerId(trainerId)].mugshotColor; } static inline const u16 *GetTrainerItemsFromId(u16 trainerId) { - return gTrainers[SanitizeTrainerId(trainerId)].items; + u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + + return gTrainers[difficulty][sanitizedTrainerId].items; } static inline const struct TrainerMon *GetTrainerPartyFromId(u16 trainerId) { - return gTrainers[SanitizeTrainerId(trainerId)].party; + u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + + return gTrainers[difficulty][sanitizedTrainerId].party; } static inline const bool32 GetTrainerAIFlagsFromId(u16 trainerId) { - return gTrainers[SanitizeTrainerId(trainerId)].aiFlags; + u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + + return gTrainers[difficulty][sanitizedTrainerId].aiFlags; } #endif // GUARD_DATA_H diff --git a/include/daycare.h b/include/daycare.h index 37a325d655..3023c87af0 100644 --- a/include/daycare.h +++ b/include/daycare.h @@ -35,5 +35,6 @@ void ChooseSendDaycareMon(void); u8 GetEggMovesBySpecies(u16 species, u16 *eggMoves); bool8 SpeciesCanLearnEggMove(u16 species, u16 move); void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycareMon); +u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves); #endif // GUARD_DAYCARE_H diff --git a/include/decompress.h b/include/decompress.h index 178ab9a6eb..1c6ab7ee24 100644 --- a/include/decompress.h +++ b/include/decompress.h @@ -3,20 +3,20 @@ #include "sprite.h" -extern u8 ALIGNED(4) gDecompressionBuffer[0x4000]; +#define MAX_DECOMPRESSION_BUFFER_SIZE 0x4000 void LZDecompressWram(const u32 *src, void *dest); void LZDecompressVram(const u32 *src, void *dest); u32 IsLZ77Data(const void *ptr, u32 minSize, u32 maxSize); -u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src); -u16 LoadCompressedSpriteSheetByTemplate(const struct SpriteTemplate *template, s32 offset); -void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer); +u32 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src); +u32 LoadCompressedSpriteSheetByTemplate(const struct SpriteTemplate *template, s32 offset); +u32 LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer); bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src); -void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src); -void LoadCompressedSpritePaletteWithTag(const u32 *pal, u16 tag); +u32 LoadCompressedSpritePalette(const struct CompressedSpritePalette *src); +u32 LoadCompressedSpritePaletteWithTag(const u32 *pal, u16 tag); void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *src, void *buffer); bool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src); diff --git a/include/dexnav.h b/include/dexnav.h new file mode 100644 index 0000000000..baa8f8c5a7 --- /dev/null +++ b/include/dexnav.h @@ -0,0 +1,77 @@ +#ifndef GUARD_DEXNAV_H +#define GUARD_DEXNAV_H + +#include "config/dexnav.h" + +// GUI Info +#define ROW_WATER 0 +#define ROW_LAND_TOP 1 +#define ROW_LAND_BOT 2 +#define ROW_HIDDEN 3 +#define ROWS_COUNT 4 + +#define ROW_WATER_ICON_X 30 +#define ROW_WATER_ICON_Y 35 + +#define ROW_LAND_ICON_X 20 +#define ROW_LAND_TOP_ICON_Y 72 +#define ROW_LAND_BOT_ICON_Y (ROW_LAND_TOP_ICON_Y + 28) + +#define ROW_HIDDEN_ICON_X 52 +#define ROW_HIDDEN_ICON_Y 138 + +#define ENCOUNTER_TYPE_LAND 0 +#define ENCOUNTER_TYPE_WATER 1 +#define ENCOUNTER_TYPE_HIDDEN 2 // Get from species + +#define COL_WATER_COUNT 5 +#define COL_LAND_COUNT 6 +#define COL_HIDDEN_COUNT 3 + +#define COL_WATER_MAX (COL_WATER_COUNT - 1) +#define COL_LAND_MAX (COL_LAND_COUNT - 1) +#define COL_HIDDEN_MAX (COL_HIDDEN_COUNT - 1) + +// SEARCH INFO +#define SCANSTART_X 0 +#define SCANSTART_Y 0 +#define SCANSIZE_X 12 +#define SCANSIZE_Y 12 + +#define SPECIES_INFO_Y 5 +#define TYPE_ICONS_Y (SPECIES_INFO_Y + 24) +#define SEARCH_LEVEL_Y (TYPE_ICONS_Y + 24) +#define HA_INFO_Y (SEARCH_LEVEL_Y + 24) +#define CHAIN_BONUS_Y (HA_INFO_Y + 24) + +#define MON_LEVEL_NONEXISTENT 255 // If mon not in area GetEncounterLevel returns this to exit the search + +// GUI tags +#define ICON_PAL_TAG 56000 +#define ICON_GFX_TAG 55130 +#define SELECTION_CURSOR_TAG 0x4005 +#define CAPTURED_ALL_TAG 0x4002 + +// Search tags +#define OWNED_ICON_TAG 0x4003 +#define HIDDEN_SEARCH_TAG SELECTION_CURSOR_TAG +#define HIDDEN_MON_ICON_TAG 0x4006 +#define LIT_STAR_TILE_TAG 0x4010 +#define HELD_ITEM_TAG 0xd750 + +// DexNav search variable +#define DEXNAV_MASK_SPECIES 0x3FFF // First 14 bits +#define DEXNAV_MASK_ENVIRONMENT 0xC000 // Last two bit + +void EndDexNavSearch(u8 taskId); +void Task_OpenDexNavFromStartMenu(u8 taskId); +bool8 TryStartDexNavSearch(void); +void TryIncrementSpeciesSearchLevel(u16 dexNum); +void ResetDexNavSearch(void); +bool8 TryFindHiddenPokemon(void); +u32 CalculateDexNavShinyRolls(void); +void IncrementDexNavChain(void); + +extern bool8 gDexNavBattle; + +#endif // GUARD_DEXNAV_H diff --git a/include/difficulty.h b/include/difficulty.h new file mode 100644 index 0000000000..c8443367c9 --- /dev/null +++ b/include/difficulty.h @@ -0,0 +1,17 @@ +#ifndef GUARD_DIFFICULTY_H +#define GUARD_DIFFICULTY_H + +#include "constants/difficulty.h" +#include "script.h" + +enum DifficultyLevel GetCurrentDifficultyLevel(void); +void SetCurrentDifficultyLevel(enum DifficultyLevel); + +enum DifficultyLevel GetBattlePartnerDifficultyLevel(u16); +enum DifficultyLevel GetTrainerDifficultyLevel(u16); +void Script_IncreaseDifficulty(void); +void Script_DecreaseDifficulty(void); +void Script_GetDifficulty(void); +void Script_SetDifficulty(struct ScriptContext *); + +#endif // GUARD_DIFFICULTY_H diff --git a/include/event_data.h b/include/event_data.h index 04287b7ed6..ef229b2ffc 100644 --- a/include/event_data.h +++ b/include/event_data.h @@ -48,4 +48,6 @@ extern u16 gSpecialVar_MonBoxId; extern u16 gSpecialVar_MonBoxPos; extern u16 gSpecialVar_Unused_0x8014; +extern const u16 gBadgeFlags[NUM_BADGES]; + #endif // GUARD_EVENT_DATA_H diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 40a0e30c21..0170baf910 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -141,6 +141,7 @@ void ClearObjectEventMovement(struct ObjectEvent *objectEvent, struct Sprite *sp void ObjectEventClearHeldMovement(struct ObjectEvent *); void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *); struct Pokemon *GetFirstLiveMon(void); +u16 GetOverworldWeatherSpecies(u16 species); void UpdateFollowingPokemon(void); void RemoveFollowingPokemon(void); struct ObjectEvent *GetFollowerObject(void); @@ -309,6 +310,7 @@ u8 GetJumpMovementAction(u32); u8 GetJump2MovementAction(u32); u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); +bool8 IsElevationMismatchAt(u8, s16, s16); u8 MovementType_WanderAround_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_WanderAround_Step1(struct ObjectEvent *, struct Sprite *); diff --git a/include/event_scripts.h b/include/event_scripts.h index 04bcf32760..772a7a955d 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -36,6 +36,7 @@ extern const u8 EventScript_TryDoDoubleTrainerBattle[]; extern const u8 EventScript_TryDoNormalTrainerBattle[]; extern const u8 EventScript_TryDoDoubleRematchBattle[]; extern const u8 EventScript_TryDoRematchBattle[]; +extern const u8 EventScript_ObjectApproachPlayer[]; extern const u8 BerryTreeScript[]; @@ -654,5 +655,13 @@ extern const u8 Common_Movement_FollowerSafeEnd[]; extern const u8 EventScript_CancelMessageBox[]; extern const u8 Common_EventScript_ShowPokemonCenterSign[]; extern const u8 Common_EventScript_ShowPokemartSign[]; +// DexNav +extern const u8 EventScript_StartDexNavBattle[]; +extern const u8 EventScript_NotFoundNearby[]; +extern const u8 EventScript_PokemonGotAway[]; +extern const u8 EventScript_LostSignal[]; +extern const u8 EventScript_TooDark[]; +extern const u8 EventScript_MovedTooFast[]; + #endif // GUARD_EVENT_SCRIPTS_H diff --git a/include/field_control_avatar.h b/include/field_control_avatar.h index da23fe4336..9a55f9e7bf 100644 --- a/include/field_control_avatar.h +++ b/include/field_control_avatar.h @@ -11,7 +11,7 @@ struct FieldInput bool8 heldDirection2:1; bool8 tookStep:1; bool8 pressedBButton:1; - bool8 input_field_1_0:1; + bool8 pressedRButton:1; bool8 input_field_1_1:1; bool8 input_field_1_2:1; bool8 input_field_1_3:1; diff --git a/include/field_effect.h b/include/field_effect.h index 93a74f1ba2..3db86bc219 100644 --- a/include/field_effect.h +++ b/include/field_effect.h @@ -48,5 +48,7 @@ void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b); void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId); u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority); void StartEscapeRopeFieldEffect(void); +void FieldEffectFreeGraphicsResources(struct Sprite *sprite); +void FieldEff_CaveDust(void); #endif // GUARD_FIELD_EFFECTS_H diff --git a/include/field_weather.h b/include/field_weather.h index ba45d161b7..cff2eb5bc3 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -33,7 +33,6 @@ struct Weather } s1; struct { - u8 filler0[0xA0]; struct Sprite *fogHSprites[NUM_FOG_HORIZONTAL_SPRITES]; struct Sprite *ashSprites[NUM_ASH_SPRITES]; struct Sprite *fogDSprites[NUM_FOG_DIAGONAL_SPRITES]; @@ -129,7 +128,6 @@ struct Weather s16 droughtLastBrightnessStage; s16 droughtTimer; s16 droughtState; - u8 droughtUnused[9]; u8 loadDroughtPalsIndex; u8 loadDroughtPalsOffset; }; diff --git a/include/fpmath.h b/include/fpmath.h index 6e3edd64e0..69265652e6 100644 --- a/include/fpmath.h +++ b/include/fpmath.h @@ -12,7 +12,8 @@ typedef u32 uq4_12_t; // 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)) +#define UQ_4_12(n) ((uq4_12_t)((n) * 4096 + 0.5)) +#define UQ_4_12_FLOORED(n) ((uq4_12_t)((n) * 4096)) // Converts a number to Q24.8 fixed-point format #define Q_24_8(n) ((s32)((n) << 8)) diff --git a/include/gba/defines.h b/include/gba/defines.h index c54dac8c13..2a68042421 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -12,6 +12,9 @@ #define EWRAM_INIT __attribute__((section(".ewram"))) #define COMMON_DATA __attribute__((section("common_data"))) #define UNUSED __attribute__((unused)) +#define USED __attribute__((used)) + +#define ARM_FUNC __attribute__((target("arm"))) #if MODERN #define NOINLINE __attribute__((noinline)) diff --git a/include/generational_changes.h b/include/generational_changes.h index fa404845b0..540b51e20b 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -13,6 +13,7 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = [GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE] = B_CONFUSION_SELF_DMG_CHANCE, [GEN_CONFIG_MULTI_HIT_CHANCE] = B_MULTI_HIT_CHANCE, [GEN_CONFIG_GALE_WINGS] = B_GALE_WINGS, + [GEN_CONFIG_HEAL_BELL_SOUNDPROOF] = B_HEAL_BELL_SOUNDPROOF, }; #if TESTING diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index d686a624a2..8540d7b185 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -323,7 +323,8 @@ struct PlayerAvatar { /*0x00*/ u8 flags; /*0x01*/ u8 transitionFlags; // used to be named bike, but its definitely not that. seems to be some transition flags - /*0x02*/ u8 runningState; // this is a static running state. 00 is not moving, 01 is turn direction, 02 is moving. + /*0x02*/ u8 runningState:7; // this is a static running state. 00 is not moving, 01 is turn direction, 02 is moving. + u8 creeping:1; /*0x03*/ u8 tileTransitionState; // this is a transition running state: 00 is not moving, 01 is transition between tiles, 02 means you are on the frame in which you have centered on a tile but are about to keep moving, even if changing directions. 2 is also used for a ledge hop, since you are transitioning. /*0x04*/ u8 spriteId; /*0x05*/ u8 objectEventId; diff --git a/include/global.h b/include/global.h index dc238d995b..c033ab9b35 100644 --- a/include/global.h +++ b/include/global.h @@ -211,7 +211,11 @@ struct SaveBlock3 #if OW_SHOW_ITEM_DESCRIPTIONS == OW_ITEM_DESCRIPTIONS_FIRST_TIME u8 itemFlags[ITEM_FLAGS_COUNT]; #endif -}; +#if USE_DEXNAV_SEARCH_LEVELS == TRUE + u8 dexNavSearchLevels[NUM_SPECIES]; +#endif + u8 dexNavChain; +}; /* max size 1624 bytes */ extern struct SaveBlock3 *gSaveBlock3Ptr; diff --git a/include/graphics.h b/include/graphics.h index 527f793d37..e0109f8b20 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2893,6 +2893,10 @@ extern const u32 gBattleAnimSpritePal_IvyCudgelRock[]; extern const u32 gBattleAnimSpritePal_IvyCudgelWater[]; extern const u32 gBattleAnimSpriteGfx_PinkVioletOrb[]; extern const u32 gBattleAnimSpritePal_PinkVioletOrb[]; +extern const u32 gBattleAnimSpriteGfx_TeraStarstormBeam[]; +extern const u32 gBattleAnimSpritePal_TeraStarstormBeam[]; +extern const u32 gBattleAnimSpriteGfx_SaltParticle[]; +extern const u32 gBattleAnimSpritePal_SaltParticle[]; extern const u32 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; diff --git a/include/hall_of_fame.h b/include/hall_of_fame.h index f1f4567135..53c913b86a 100644 --- a/include/hall_of_fame.h +++ b/include/hall_of_fame.h @@ -1,6 +1,23 @@ #ifndef GUARD_HALL_OF_FAME_H #define GUARD_HALL_OF_FAME_H +struct HallofFameMon +{ + u32 tid; + u32 personality; + u16 isShiny:1; + u16 species:15; + u8 lvl; + u8 nickname[POKEMON_NAME_LENGTH]; +}; + +struct HallofFameTeam +{ + struct HallofFameMon mon[PARTY_SIZE]; +}; + +extern struct HallofFameTeam *gHoFSaveBuffer; + void CB2_DoHallOfFameScreen(void); void CB2_DoHallOfFameScreenDontSaveData(void); void CB2_DoHallOfFamePC(void); diff --git a/include/item_menu_icons.h b/include/item_menu_icons.h index d01dcccf5f..c0eb67a6aa 100644 --- a/include/item_menu_icons.h +++ b/include/item_menu_icons.h @@ -17,9 +17,19 @@ void RemoveBagItemIconSprite(u8 id); void CreateItemMenuSwapLine(void); void SetItemMenuSwapLineInvisibility(bool8 invisible); void UpdateItemMenuSwapLinePos(u8 y); -u8 CreateBerryTagSprite(u8 id, s16 x, s16 y); -void FreeBerryTagSpritePalette(void); -u8 CreateSpinningBerrySprite(u8 berryId, u8 x, u8 y, bool8 startAffine); + +// Note: Because of removing gDecompressionBuffer and allowing to create more than one berry sprite at a time, the memory for gfx is allocated dynamically. +// For CreateBerryTagSprite and CreateSpinningBerrySprite, the allocated ptr is stored in two last data fields(data[6], data[7]), so make sure to NOT put anything in there! +// The corresponding code has already been edited in berry_tag_screen.c and berry_blender.c +#define BERRY_ICON_GFX_PTR_DATA_ID 6 +u32 CreateBerryTagSprite(u32 id, s32 x, s32 y); +u32 CreateSpinningBerrySprite(u32 berryId, s32 x, s32 y, bool32 startAffine); +// Needs to always call either of these after creating a Berry Icon sprite, because it frees allocated memory! +void DestroyBerryIconSprite(u32 spriteId, u32 berryId, bool32 freePal); +void DestroyBerryIconSpritePtr(struct Sprite *sprite, u32 berryId, bool32 freePal); + +void FreeBerryIconSpritePalette(u32 berryId); // Unused atm, because it's also handled by DestroyBerryIconSprite. Leaving it as it is, because it may still be useful in some custom cases. + u8 CreateBerryFlavorCircleSprite(s16 x); #endif // GUARD_ITEM_MENU_ICONS_H diff --git a/include/main.h b/include/main.h index eba04cbaa9..b64c9349a8 100644 --- a/include/main.h +++ b/include/main.h @@ -53,7 +53,6 @@ extern u16 gKeyRepeatContinueDelay; extern bool8 gSoftResetDisabled; extern IntrFunc gIntrTable[]; extern u8 gLinkVSyncDisabled; -extern u32 IntrMain_Buffer[]; extern s8 gPcmDmaCounter; void AgbMain(void); diff --git a/include/move.h b/include/move.h new file mode 100644 index 0000000000..5537840703 --- /dev/null +++ b/include/move.h @@ -0,0 +1,540 @@ +#ifndef GUARD_MOVES_H +#define GUARD_MOVES_H + +#include "contest_effect.h" +#include "constants/battle_move_effects.h" +#include "constants/moves.h" + +// For defining EFFECT_HIT etc. with battle TV scores and flags etc. +struct __attribute__((packed, aligned(2))) BattleMoveEffect +{ + const u8 *battleScript; + u16 battleTvScore:3; + u16 encourageEncore:1; + u16 twoTurnEffect:1; + u16 semiInvulnerableEffect:1; + u16 usesProtectCounter:1; + u16 padding:9; +}; + +#define EFFECTS_ARR(...) (const struct AdditionalEffect[]) {__VA_ARGS__} +#define ADDITIONAL_EFFECTS(...) EFFECTS_ARR( __VA_ARGS__ ), .numAdditionalEffects = ARRAY_COUNT(EFFECTS_ARR( __VA_ARGS__ )) + +enum SheerForceBoost +{ + SHEER_FORCE_AUTO_BOOST, // This is the default state when a move has a move effect with a chance + SHEER_FORCE_BOOST, // If a move effect doesn't have an effect with a chance this can force a boost + SHEER_FORCE_NO_BOOST, // Prevents a Sheer Force boost +}; + +struct AdditionalEffect +{ + u16 moveEffect; + u8 self:1; + u8 onlyIfTargetRaisedStats:1; + u8 onChargeTurnOnly:1; + u8 sheerForceBoost:2; // Handles edge cases for Sheer Force + u8 padding:3; + u8 chance; // 0% = effect certain, primary effect +}; + +struct MoveInfo +{ + const u8 *name; + const u8 *description; + u16 effect; + u16 type:5; // Up to 32 + u16 category:2; + u16 power:9; // up to 511 + // end of word + u16 accuracy:7; + u16 target:9; + u8 pp; + union { + u8 effect; + u8 powerOverride; + } zMove; + // end of word + s32 priority:4; + u32 recoil:7; + u32 strikeCount:4; // Max 15 hits. Defaults to 1 if not set. May apply its effect on each hit. + u32 criticalHitStage:2; + bool32 alwaysCriticalHit:1; + u32 numAdditionalEffects:2; // limited to 3 - don't want to get too crazy + // Flags + bool32 makesContact:1; + bool32 ignoresProtect:1; + bool32 magicCoatAffected:1; + bool32 snatchAffected:1; + bool32 ignoresKingsRock:1; + bool32 punchingMove:1; + bool32 bitingMove:1; + bool32 pulseMove:1; + bool32 soundMove:1; + bool32 ballisticMove:1; + bool32 powderMove:1; + bool32 danceMove:1; + // end of word + bool32 windMove:1; + bool32 slicingMove:1; + bool32 healingMove:1; + bool32 minimizeDoubleDamage:1; + bool32 ignoresTargetAbility:1; + bool32 ignoresTargetDefenseEvasionStages:1; + bool32 damagesUnderground:1; + bool32 damagesUnderwater:1; + bool32 damagesAirborne:1; + bool32 damagesAirborneDoubleDamage:1; + bool32 ignoreTypeIfFlyingAndUngrounded:1; + bool32 thawsUser:1; + bool32 ignoresSubstitute:1; + bool32 forcePressure:1; + bool32 cantUseTwice:1; + // Ban flags + bool32 gravityBanned:1; + bool32 mirrorMoveBanned:1; + bool32 meFirstBanned:1; + bool32 mimicBanned:1; + bool32 metronomeBanned:1; + bool32 copycatBanned:1; + bool32 assistBanned:1; // Matches same moves as copycatBanned + semi-invulnerable moves and Mirror Coat. + bool32 sleepTalkBanned:1; + bool32 instructBanned:1; + bool32 encoreBanned:1; + bool32 parentalBondBanned:1; + bool32 skyBattleBanned:1; + bool32 sketchBanned:1; + //Other + bool32 validApprenticeMove:1; + u32 padding:3; + // end of word + + union { + struct { + u16 stringId; + u16 status; + } twoTurnAttack; + struct { + u16 side; + u16 property; // can be used to remove the hardcoded values + } protect; + u32 status; + u16 moveProperty; + u16 holdEffect; + u16 type; + u16 fixedDamage; + u16 absorbPercentage; + } argument; + + // primary/secondary effects + const struct AdditionalEffect *additionalEffects; + + // contest parameters + u8 contestEffect; + u8 contestCategory:3; + u8 contestComboStarterId; + u8 contestComboMoves[MAX_COMBO_MOVES]; + const u8 *battleAnimScript; +}; + +extern const struct MoveInfo gMovesInfo[]; +extern const u8 gNotDoneYetDescription[]; +extern const struct BattleMoveEffect gBattleMoveEffects[]; + +static inline u32 SanitizeMoveId(u32 moveId) +{ + if (moveId >= MOVES_COUNT_ALL) + return MOVE_NONE; + else + return moveId; +} + +static inline const u8 *GetMoveName(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].name; +} + +static inline const u8 *GetMoveDescription(u32 moveId) +{ + moveId = SanitizeMoveId(moveId); + if (gMovesInfo[moveId].effect == EFFECT_PLACEHOLDER) + return gNotDoneYetDescription; + return gMovesInfo[moveId].description; +} + +static inline u32 GetMoveEffect(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].effect; +} + +static inline u32 GetMoveType(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].type; +} + +static inline u32 GetMoveCategory(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].category; +} + +static inline u32 GetMovePower(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].power; +} + +static inline u32 GetMoveAccuracy(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].accuracy; +} + +static inline u32 GetMoveTarget(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].target; +} + +static inline u32 GetMovePP(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].pp; +} + +static inline u32 GetMoveZEffect(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].zMove.effect; +} + +static inline u32 GetMoveZPowerOverride(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].zMove.powerOverride; +} + +static inline s32 GetMovePriority(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].priority; +} + +static inline u32 GetMoveRecoil(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].recoil; +} + +static inline u32 GetMoveStrikeCount(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].strikeCount; +} + +static inline u32 GetMoveCriticalHitStage(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].criticalHitStage; +} + +static inline bool32 MoveAlwaysCrits(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].alwaysCriticalHit; +} + +static inline u32 GetMoveAdditionalEffectCount(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].numAdditionalEffects; +} + +static inline bool32 MoveMakesContact(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].makesContact; +} + +static inline bool32 MoveIgnoresProtect(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].ignoresProtect; +} + +static inline bool32 MoveCanBeBouncedBack(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].magicCoatAffected; +} + +static inline bool32 MoveCanBeSnatched(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].snatchAffected; +} + +static inline bool32 MoveIgnoresKingsRock(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].ignoresKingsRock; +} + +static inline bool32 IsPunchingMove(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].punchingMove; +} + +static inline bool32 IsBitingMove(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].bitingMove; +} + +static inline bool32 IsPulseMove(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].pulseMove; +} + +static inline bool32 IsSoundMove(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].soundMove; +} + +static inline bool32 IsBallisticMove(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].ballisticMove; +} + +static inline bool32 IsPowderMove(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].powderMove; +} + +static inline bool32 IsDanceMove(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].danceMove; +} + +static inline bool32 IsWindMove(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].windMove; +} + +static inline bool32 IsSlicingMove(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].slicingMove; +} + +static inline bool32 IsHealingMove(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].healingMove; +} + +static inline bool32 MoveIncreasesPowerToMinimizedTargets(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].minimizeDoubleDamage; +} + +static inline bool32 MoveIgnoresTargetAbility(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].ignoresTargetAbility; +} + +static inline bool32 MoveIgnoresDefenseEvasionStages(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].ignoresTargetDefenseEvasionStages; +} + +static inline bool32 MoveDamagesUnderground(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].damagesUnderground; +} + +static inline bool32 MoveDamagesUnderWater(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].damagesUnderwater; +} + +static inline bool32 MoveDamagesAirborne(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].damagesAirborne; +} + +static inline bool32 MoveDamagesAirborneDoubleDamage(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].damagesAirborneDoubleDamage; +} + +static inline bool32 MoveIgnoresTypeIfFlyingAndUngrounded(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].ignoreTypeIfFlyingAndUngrounded; +} + +static inline bool32 MoveThawsUser(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].thawsUser; +} + +static inline bool32 MoveIgnoresSubstitute(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].ignoresSubstitute; +} + +static inline bool32 MoveForcesPressure(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].forcePressure; +} + +static inline bool32 MoveCantBeUsedTwice(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].cantUseTwice; +} + +static inline bool32 IsMoveGravityBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].gravityBanned; +} + +static inline bool32 IsMoveMirrorMoveBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].mirrorMoveBanned; +} + +static inline bool32 IsMoveMeFirstBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].meFirstBanned; +} + +static inline bool32 IsMoveMimicBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].mimicBanned; +} + +static inline bool32 IsMoveMetronomeBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].metronomeBanned; +} + +static inline bool32 IsMoveCopycatBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].copycatBanned; +} + +static inline bool32 IsMoveAssistBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].assistBanned; +} + +static inline bool32 IsMoveSleepTalkBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].sleepTalkBanned; +} + +static inline bool32 IsMoveInstructBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].instructBanned; +} + +static inline bool32 IsMoveEncoreBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].encoreBanned; +} + +static inline bool32 IsMoveParentalBondBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].parentalBondBanned; +} + +static inline bool32 IsMoveSkyBattleBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].skyBattleBanned; +} + +static inline bool32 IsMoveSketchBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].sketchBanned; +} + +static inline u32 GetMoveTwoTurnAttackStringId(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.stringId; +} + +static inline u32 GetMoveTwoTurnAttackStatus(u32 moveId) +{ + return UNCOMPRESS_BITS(gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.status); +} + +static inline u32 GetMoveTwoTurnAttackWeather(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.status; +} + +static inline u32 GetMoveProtectSide(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].argument.protect.side; +} + +static inline u32 GetMoveEffectArg_Status(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].argument.status; +} + +static inline u32 GetMoveEffectArg_MoveProperty(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].argument.moveProperty; +} + +static inline u32 GetMoveEffectArg_HoldEffect(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].argument.holdEffect; +} + +static inline u32 GetMoveArgType(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].argument.type; +} + +static inline u32 GetMoveFixedDamage(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].argument.fixedDamage; +} + +static inline u32 GetMoveAbsorbPercentage(u32 moveId) +{ + moveId = SanitizeMoveId(moveId); + if (gMovesInfo[moveId].argument.absorbPercentage == 0) + return 50; + return gMovesInfo[moveId].argument.absorbPercentage; +} + +static inline const struct AdditionalEffect *GetMoveAdditionalEffectById(u32 moveId, u32 effect) +{ + return &gMovesInfo[SanitizeMoveId(moveId)].additionalEffects[effect]; +} + +static inline u32 GetMoveContestEffect(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].contestEffect; +} + +static inline u32 GetMoveContestCategory(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].contestCategory; +} + +static inline u32 GetMoveContestComboStarter(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].contestComboStarterId; +} + +static inline u32 GetMoveContestComboMoves(u32 moveId, u32 comboMove) +{ + return gMovesInfo[SanitizeMoveId(moveId)].contestComboMoves[comboMove]; +} + +static inline const u8 *GetMoveAnimationScript(u32 moveId) +{ + moveId = SanitizeMoveId(moveId); + if (gMovesInfo[moveId].battleAnimScript == NULL) + { + DebugPrintfLevel(MGBA_LOG_WARN, "No animation for moveId=%u", moveId); + return gMovesInfo[MOVE_NONE].battleAnimScript; + } + return gMovesInfo[moveId].battleAnimScript; +} + +static inline const u8 *GetMoveBattleScript(u32 moveId) +{ + moveId = SanitizeMoveId(moveId); + if (gBattleMoveEffects[gMovesInfo[moveId].effect].battleScript == NULL) + { + DebugPrintfLevel(MGBA_LOG_WARN, "No effect for moveId=%u", moveId); + return gBattleMoveEffects[EFFECT_PLACEHOLDER].battleScript; + } + return gBattleMoveEffects[gMovesInfo[moveId].effect].battleScript; +} + +#endif // GUARD_MOVES_H diff --git a/include/mystery_gift_client.h b/include/mystery_gift_client.h index 8214d69eff..a17778f41a 100644 --- a/include/mystery_gift_client.h +++ b/include/mystery_gift_client.h @@ -81,6 +81,7 @@ struct MysteryGiftClient void * msg; struct MysteryGiftLink link; bool32 isWonderNews; + ALIGNED(4) u8 bufferScript[MG_LINK_BUFFER_SIZE]; }; void MysteryGiftClient_Create(bool32 isWonderNews); diff --git a/include/naming_screen.h b/include/naming_screen.h index 93527640e5..315868c3ab 100644 --- a/include/naming_screen.h +++ b/include/naming_screen.h @@ -9,8 +9,11 @@ enum { NAMING_SCREEN_CAUGHT_MON, NAMING_SCREEN_NICKNAME, NAMING_SCREEN_WALDA, + NAMING_SCREEN_CODE, }; +extern void BattleMainCB2(void); + void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback); #endif // GUARD_NAMING_SCREEN_H diff --git a/include/overworld.h b/include/overworld.h index 28a4aa9277..ea23c15b30 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -52,6 +52,7 @@ extern bool8 (*gFieldCallback2)(void); extern u8 gLocalLinkPlayerId; extern u8 gFieldLinkPlayerCount; extern bool8 gExitStairsMovementDisabled; +extern bool8 gSkipShowMonAnim; extern const struct UCoords32 gDirectionToVectors[]; diff --git a/include/party_menu.h b/include/party_menu.h index a34f06cec6..5236dd27a7 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -27,6 +27,9 @@ extern MainCallback gPostMenuFieldCallback; extern u8 gSelectedOrderFromParty[MAX_FRONTIER_PARTY_SIZE]; extern u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2]; +extern const struct SpriteSheet gSpriteSheet_HeldItem; +extern const u16 gHeldItemPalette[]; + extern void (*gItemUseCB)(u8, TaskFunc); extern const struct SpriteTemplate gSpriteTemplate_StatusIcons; diff --git a/include/player_pc.h b/include/player_pc.h index 2521eac131..305c661766 100644 --- a/include/player_pc.h +++ b/include/player_pc.h @@ -9,7 +9,6 @@ struct PlayerPCItemPageStruct u16 itemsAbove; u8 pageItems; u8 count; - u8 filler[3]; u8 scrollIndicatorTaskId; }; diff --git a/include/pokemon.h b/include/pokemon.h index ff3d06cdd1..1326e81329 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -480,109 +480,6 @@ struct SpeciesInfo /*0xC4*/ #endif //OW_POKEMON_OBJECT_EVENTS }; -struct MoveInfo -{ - const u8 *name; - const u8 *description; - u16 effect; - u16 type:5; - u16 category:2; - u16 power:9; // up to 511 - u16 accuracy:7; - u16 target:9; - u8 pp; - union { - u8 effect; - u8 powerOverride; - } zMove; - - s32 priority:4; - u32 recoil:7; - u32 strikeCount:4; // Max 15 hits. Defaults to 1 if not set. May apply its effect on each hit. - u32 criticalHitStage:2; - u32 alwaysCriticalHit:1; - u32 numAdditionalEffects:2; // limited to 3 - don't want to get too crazy - // 12 bits left to complete this word - continues into flags - - // Flags - u32 makesContact:1; - u32 ignoresProtect:1; - u32 magicCoatAffected:1; - u32 snatchAffected:1; - u32 ignoresKingsRock:1; - u32 punchingMove:1; - u32 bitingMove:1; - u32 pulseMove:1; - u32 soundMove:1; - u32 ballisticMove:1; - u32 powderMove:1; - u32 danceMove:1; - u32 windMove:1; - u32 slicingMove:1; // end of word - u32 healingMove:1; - u32 minimizeDoubleDamage:1; - u32 ignoresTargetAbility:1; - u32 ignoresTargetDefenseEvasionStages:1; - u32 damagesUnderground:1; - u32 damagesUnderwater:1; - u32 damagesAirborne:1; - u32 damagesAirborneDoubleDamage:1; - u32 ignoreTypeIfFlyingAndUngrounded:1; - u32 thawsUser:1; - u32 ignoresSubstitute:1; - u32 forcePressure:1; - u32 cantUseTwice:1; - - // Ban flags - u32 gravityBanned:1; - u32 mirrorMoveBanned:1; - u32 meFirstBanned:1; - u32 mimicBanned:1; - u32 metronomeBanned:1; - u32 copycatBanned:1; - u32 assistBanned:1; // Matches same moves as copycatBanned + semi-invulnerable moves and Mirror Coat. - u32 sleepTalkBanned:1; - u32 instructBanned:1; - u32 encoreBanned:1; - u32 parentalBondBanned:1; - u32 skyBattleBanned:1; - u32 sketchBanned:1; - u32 padding:5; // end of word - - u32 argument; - - // primary/secondary effects - const struct AdditionalEffect *additionalEffects; - - // contest parameters - u8 contestEffect; - u8 contestCategory:3; - u8 contestComboStarterId; - u8 contestComboMoves[MAX_COMBO_MOVES]; - const u8 *battleAnimScript; -}; - -#define EFFECTS_ARR(...) (const struct AdditionalEffect[]) {__VA_ARGS__} -#define ADDITIONAL_EFFECTS(...) EFFECTS_ARR( __VA_ARGS__ ), .numAdditionalEffects = ARRAY_COUNT(EFFECTS_ARR( __VA_ARGS__ )) - -enum SheerForceBoost -{ - SHEER_FORCE_AUTO_BOOST, // This is the default state when a move has a move effect with a chance - SHEER_FORCE_BOOST, // If a move effect doesn't have an effect with a chance this can force a boost - SHEER_FORCE_NO_BOOST, // Prevents a Sheer Force boost -}; - -struct AdditionalEffect -{ - u16 moveEffect; - u8 self:1; - u8 onlyIfTargetRaisedStats:1; - u8 onChargeTurnOnly:1; - u8 sheerForceBoost:2; // Handles edge cases for Sheer Force - u8 padding:3; - u8 chance; // 0% = effect certain, primary effect -}; - struct Ability { u8 name[ABILITY_NAME_LENGTH + 1]; @@ -712,7 +609,6 @@ extern struct Pokemon gEnemyParty[PARTY_SIZE]; extern struct SpriteTemplate gMultiuseSpriteTemplate; extern u16 gFollowerSteps; -extern const struct MoveInfo gMovesInfo[]; extern const u8 gFacilityClassToPicIndex[]; extern const u8 gFacilityClassToTrainerClass[]; extern const struct SpeciesInfo gSpeciesInfo[]; @@ -889,8 +785,8 @@ void DestroyMonSpritesGfxManager(u8 managerId); u8 *MonSpritesGfxManager_GetSpritePtr(u8 managerId, u8 spriteNum); u16 GetFormSpeciesId(u16 speciesId, u8 formId); u8 GetFormIdFromFormSpeciesId(u16 formSpeciesId); -u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg); -u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 arg); +u32 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg); +u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 arg); bool32 DoesSpeciesHaveFormChangeMethod(u16 species, u16 method); u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove); void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv); @@ -907,8 +803,6 @@ u16 GetCryIdBySpecies(u16 species); u16 GetSpeciesPreEvolution(u16 species); void HealPokemon(struct Pokemon *mon); void HealBoxPokemon(struct BoxPokemon *boxMon); -const u8 *GetMoveName(u16 moveId); -const u8 *GetMoveAnimationScript(u16 moveId); void UpdateDaysPassedSinceFormChange(u16 days); void TrySetDayLimitToFormChange(struct Pokemon *mon); u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler); diff --git a/include/pokemon_icon.h b/include/pokemon_icon.h index 9e51e1bc4d..3986f8948b 100644 --- a/include/pokemon_icon.h +++ b/include/pokemon_icon.h @@ -24,5 +24,6 @@ void LoadMonIconPalettePersonality(u16 species, u32 personality); void SpriteCB_MonIcon(struct Sprite *sprite); void SetPartyHPBarSprite(struct Sprite *sprite, u8 animNum); u8 GetMonIconPaletteIndexFromSpecies(u16 species); +void SafeFreeMonIconPalette(u16 species); #endif // GUARD_POKEMON_ICON_H diff --git a/include/pokemon_summary_screen.h b/include/pokemon_summary_screen.h index fe299c48b4..3aa8460a17 100755 --- a/include/pokemon_summary_screen.h +++ b/include/pokemon_summary_screen.h @@ -2,10 +2,10 @@ #define GUARD_POKEMON_SUMMARY_SCREEN_H #include "main.h" +#include "config/summary_screen.h" extern u8 gLastViewedMonIndex; -extern const u8 gNotDoneYetDescription[]; extern const struct SpriteTemplate gSpriteTemplate_MoveTypes; extern const struct CompressedSpriteSheet gSpriteSheet_MoveTypes; extern const struct CompressedSpriteSheet gSpriteSheet_CategoryIcons; @@ -41,4 +41,11 @@ enum PokemonSummaryScreenPage PSS_PAGE_COUNT, }; +enum PokemonSummarySkillsMode +{ + SUMMARY_SKILLS_MODE_STATS, + SUMMARY_SKILLS_MODE_IVS, + SUMMARY_SKILLS_MODE_EVS, +}; + #endif // GUARD_POKEMON_SUMMARY_SCREEN_H diff --git a/include/pokenav.h b/include/pokenav.h index 174c338e27..5c238a6c54 100644 --- a/include/pokenav.h +++ b/include/pokenav.h @@ -171,6 +171,8 @@ enum HELPBAR_NONE, HELPBAR_MAP_ZOOMED_OUT, HELPBAR_MAP_ZOOMED_IN, + HELPBAR_MAP_ZOOMED_OUT_CANFLY, + HELPBAR_MAP_ZOOMED_IN_CANFLY, HELPBAR_CONDITION_MON_LIST, HELPBAR_CONDITION_MON_STATUS, HELPBAR_CONDITION_MARKINGS, @@ -295,6 +297,7 @@ enum POKENAV_MAP_FUNC_ZOOM_OUT, POKENAV_MAP_FUNC_ZOOM_IN, POKENAV_MAP_FUNC_EXIT, + POKENAV_MAP_FUNC_FLY }; // Modes for PokenavFadeScreen @@ -438,6 +441,7 @@ void CreateRegionMapLoopedTask(s32); bool32 IsRegionMapLoopedTaskActive(void); void FreeRegionMapSubstruct1(void); void FreeRegionMapSubstruct2(void); +void UpdateRegionMapHelpBarText(void); // pokenav_conditions.c u32 PokenavCallback_Init_ConditionGraph_Party(void); diff --git a/include/random.h b/include/random.h index 2409a1a883..c8b4a039b5 100644 --- a/include/random.h +++ b/include/random.h @@ -30,7 +30,7 @@ struct Sfc32State { typedef struct Sfc32State rng_value_t; -#define RNG_VALUE_EMPTY {} +#define RNG_VALUE_EMPTY {0} // Calling this function directly is discouraged. // Use LocalRandom() instead. @@ -43,9 +43,14 @@ static inline u32 _SFC32_Next(struct Sfc32State *state) return result; } +static inline u32 LocalRandom32(rng_value_t *val) +{ + return _SFC32_Next(val); +} + static inline u16 LocalRandom(rng_value_t *val) { - return _SFC32_Next(val) >> 16; + return LocalRandom32(val) >> 16; } u32 Random32(void); @@ -166,15 +171,28 @@ enum RandomTag RNG_AI_SWITCH_CURSED, RNG_AI_SWITCH_NIGHTMARE, RNG_AI_SWITCH_SEEDED, + RNG_AI_SWITCH_YAWN, + RNG_AI_SWITCH_PERISH_SONG, + RNG_AI_SWITCH_INFATUATION, RNG_AI_SWITCH_ABSORBING, + RNG_AI_SWITCH_ABSORBING_STAY_IN, RNG_AI_SWITCH_NATURAL_CURE, RNG_AI_SWITCH_REGENERATOR, RNG_AI_SWITCH_ENCORE, + RNG_AI_SWITCH_CHOICE_LOCKED, RNG_AI_SWITCH_STATS_LOWERED, RNG_AI_SWITCH_SE_DEFENSIVE, + RNG_AI_SWITCH_TRUANT, + RNG_AI_SWITCH_WONDER_GUARD, + RNG_AI_SWITCH_TRAPPER, + RNG_AI_SWITCH_FREE_TURN, + RNG_AI_SWITCH_ALL_MOVES_BAD, RNG_SHELL_SIDE_ARM, RNG_RANDOM_TARGET, + RNG_AI_PREDICT_ABILITY, + RNG_AI_PREDICT_SWITCH, RNG_HEALER, + RNG_DEXNAV_ENCOUNTER_LEVEL, }; #define RandomWeighted(tag, ...) \ diff --git a/include/region_map.h b/include/region_map.h index 9f0b110a65..08277651de 100644 --- a/include/region_map.h +++ b/include/region_map.h @@ -14,6 +14,7 @@ enum MAP_INPUT_MOVE_END, MAP_INPUT_A_BUTTON, MAP_INPUT_B_BUTTON, + MAP_INPUT_R_BUTTON }; enum { @@ -115,6 +116,10 @@ void TrySetPlayerIconBlink(void); void BlendRegionMap(u16 color, u32 coeff); void SetRegionMapDataForZoom(void); +//Pokenav Fly funcs +u32 FilterFlyDestination(struct RegionMap* regionMap); +void SetFlyDestination(struct RegionMap* regionMap); + extern const struct RegionMapLocation gRegionMapEntries[]; #endif //GUARD_REGION_MAP_H diff --git a/include/reshow_battle_screen.h b/include/reshow_battle_screen.h index 07958bf6c0..59f9c79106 100644 --- a/include/reshow_battle_screen.h +++ b/include/reshow_battle_screen.h @@ -3,6 +3,7 @@ void ReshowBattleScreenDummy(void); void ReshowBattleScreenAfterMenu(void); +void ReshowBlankBattleScreenAfterMenu(void); void CreateBattlerSprite(u32 battler); #endif // GUARD_RESHOW_BATTLE_SCREEN_H diff --git a/include/scanline_effect.h b/include/scanline_effect.h index 80d9df764d..0b395d4f60 100644 --- a/include/scanline_effect.h +++ b/include/scanline_effect.h @@ -30,8 +30,6 @@ struct ScanlineEffect void (*setFirstScanlineReg)(void); u8 srcBuffer; u8 state; - u8 unused16; - u8 unused17; u8 waveTaskId; }; diff --git a/include/script.h b/include/script.h index 1f3c4f7afb..4fc2189035 100644 --- a/include/script.h +++ b/include/script.h @@ -11,6 +11,7 @@ struct ScriptContext u8 stackDepth; u8 mode; u8 comparisonResult; + bool8 breakOnTrainerBattle; u8 (*nativePtr)(void); const u8 *scriptPtr; const u8 *stack[20]; @@ -39,12 +40,13 @@ void ScriptContext_Init(void); bool8 ScriptContext_IsEnabled(void); bool8 ScriptContext_RunScript(void); void ScriptContext_SetupScript(const u8 *ptr); +void ScriptContext_ContinueScript(struct ScriptContext *ctx); void ScriptContext_Stop(void); void ScriptContext_Enable(void); void RunScriptImmediately(const u8 *ptr); -u8 *MapHeaderGetScriptTable(u8 tag); +const u8 *MapHeaderGetScriptTable(u8 tag); void MapHeaderRunScriptType(u8 tag); -u8 *MapHeaderCheckScriptTable(u8 tag); +const u8 *MapHeaderCheckScriptTable(u8 tag); void RunOnLoadMapScript(void); void RunOnTransitionMapScript(void); void RunOnResumeMapScript(void); @@ -66,4 +68,110 @@ void SetMovingNpcId(u16 npcId); extern u8 gMsgIsSignPost; extern u8 gMsgBoxIsCancelable; +/* Script effects analysis. + * + * 'RunScriptImmediatelyUntilEffect' executes a script until it reaches + * the first command which calls 'Script_RequestEffects' with an + * effect in 'effects' in which case it returns 'TRUE' and stores the + * current state in 'ctx'; or until it reaches an 'end'/'return' in + * which case it returns 'FALSE'. + * + * 'Script_HasNoEffect' wraps 'RunScriptImmediatelyUntilEffect' and + * returns 'TRUE' if the script exits without an effect on the save or + * the hardware, or 'FALSE' if it would have an effect (the effect is + * not performed). + * + * Commands, natives, and specials which call 'Script_RequestEffects' + * must be explicitly tagged with 'requests_effects=1', and must call + * the function before any of those effects occur. An untagged function + * could cause any effect, so execution is stopped to be safe. If the + * code has no effects it must call 'Script_RequestEffects(SCREFF_V1)' + * to note that explicitly. + * + * Regular variables are in the save (so should use 'SCREFF_SAVE'), but + * special variables are not in the save, so 'Script_RequestWriteVar' is + * provided to only request the 'SCREFF_SAVE' effect for a non-special + * variable. + * + * The 'effects' parameter to 'RunScriptImmediatelyUntilEffect' and + * 'Script_RequestEffects' must be the bitwise or of an effects version + * (currently 'SCREFF_V1') and any number of effects. For example + * 'Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE)'. */ + +enum // effects +{ + SCREFF_SAVE = 1 << 0, // writes to the save. + SCREFF_HARDWARE = 1 << 1, // writes to a hardware register. + SCREFF_TRAINERBATTLE = 1 << 2, // 'trainerbattle' command. +}; + +#define SCREFF_ANY (SCREFF_SAVE | SCREFF_HARDWARE | SCREFF_TRAINERBATTLE) + +enum // effects versions +{ + SCREFF_V1 = 0xFFFFFFF8, +}; + +extern struct ScriptEffectContext *gScriptEffectContext; + +bool32 RunScriptImmediatelyUntilEffect_Internal(u32 effects, const u8 *ptr, struct ScriptContext *ctx); +bool32 Script_HasNoEffect(const u8 *ptr); +void Script_GotoBreak_Internal(void); +void Script_RequestEffects_Internal(u32 effects); +void Script_RequestWriteVar_Internal(u32 varId); + +static inline bool32 Script_IsAnalyzingEffects(void) +{ + return gScriptEffectContext != NULL; +} + +#define RunScriptImmediatelyUntilEffect(effects, ptr, ctx) \ + ({ \ + _Static_assert((effects) & 0x80000000, "RunScriptImmediatelyUntilEffect requires an effects version"); \ + RunScriptImmediatelyUntilEffect_Internal(effects, ptr, ctx); \ + }) + +/* Optimize 'Script_RequestEffects' to a no-op if it would have no + * effect. 'Script_RequestEffects' must be called in all commands and + * natives/specials with 'requests_effects=TRUE' even if it would have + * no effect to future-proof against new effects. */ +#define Script_RequestEffects(effects) \ + ({ \ + _Static_assert((effects) & 0x80000000, "Script_RequestEffects requires an effects version"); \ + if ((effects) != SCREFF_V1) \ + if (Script_IsAnalyzingEffects()) \ + Script_RequestEffects_Internal((effects) & SCREFF_ANY); \ + }) + +/* Optimize 'Script_RequestWriteVar' to a no-op if it would have no + * effect. */ +#define Script_RequestWriteVar(varId) \ + ({ \ + if (Script_IsAnalyzingEffects()) \ + Script_RequestWriteVar_Internal(varId); \ + }) + +static inline void Script_CheckEffectInstrumentedSpecial(u32 specialId) +{ + typedef u16 (*SpecialFunc)(void); + extern const SpecialFunc gSpecials[]; + // In ROM mirror 1. + if (Script_IsAnalyzingEffects() && (((uintptr_t)gSpecials[specialId]) & 0xE000000) != 0xA000000) + Script_GotoBreak_Internal(); +} + +static inline void Script_CheckEffectInstrumentedGotoNative(bool8 (*func)(void)) +{ + // In ROM mirror 1. + if (Script_IsAnalyzingEffects() && (((uintptr_t)func) & 0xE000000) != 0xA000000) + Script_GotoBreak_Internal(); +} + +static inline void Script_CheckEffectInstrumentedCallNative(void (*func)(struct ScriptContext *)) +{ + // In ROM mirror 1. + if (Script_IsAnalyzingEffects() && (((uintptr_t)func) & 0xE000000) != 0xA000000) + Script_GotoBreak_Internal(); +} + #endif // GUARD_SCRIPT_H diff --git a/include/sprite.h b/include/sprite.h index 6a7b585bf3..138c2ea506 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -317,10 +317,10 @@ u16 GetSpriteTileTagByTileStart(u16 start); void RequestSpriteSheetCopy(const struct SpriteSheet *sheet); u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet); void FreeAllSpritePalettes(void); -u8 LoadSpritePalette(const struct SpritePalette *palette); +u32 LoadSpritePalette(const struct SpritePalette *palette); void LoadSpritePalettes(const struct SpritePalette *palettes); -u8 AllocSpritePalette(u16 tag); -u8 IndexOfSpritePaletteTag(u16 tag); +u32 AllocSpritePalette(u16 tag); +u32 IndexOfSpritePaletteTag(u16 tag); u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum); void FreeSpritePaletteByTag(u16 tag); void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables); diff --git a/include/strings.h b/include/strings.h index 45bbeb9707..588d513d4b 100644 --- a/include/strings.h +++ b/include/strings.h @@ -177,12 +177,7 @@ extern const u8 gMenuText_Toss[]; extern const u8 gMenuText_Give[]; extern const u8 gMenuText_Give2[]; extern const u8 gMenuText_Register[]; -extern const u8 gMenuText_Check[]; -extern const u8 gMenuText_Walk[]; -extern const u8 gMenuText_Deselect[]; -extern const u8 gMenuText_CheckTag[]; extern const u8 gMenuText_Confirm[]; -extern const u8 gMenuText_Show[]; extern const u8 gMenuText_Give2[]; extern const u8 gText_EggNickname[]; @@ -214,6 +209,7 @@ extern const u8 gText_MenuOption[]; extern const u8 gText_MenuExit[]; extern const u8 gText_MenuRetire[]; extern const u8 gText_MenuRest[]; +extern const u8 gText_MenuDexNav[]; extern const u8 gText_Floor1[]; extern const u8 gText_Floor2[]; extern const u8 gText_Floor3[]; @@ -318,15 +314,10 @@ extern const u8 gText_ThrewAwayVar2Var1s[]; extern const u8 gText_CantWriteMail[]; extern const u8 gText_NoPokemon[]; extern const u8 gText_Var1CantBeHeld[]; -extern const u8 gText_Var1CantBeHeldHere[]; extern const u8 gText_CantBuyKeyItem[]; extern const u8 gText_HowManyToSell[]; extern const u8 gText_ICanPayVar1[]; extern const u8 gText_TurnedOverVar1ForVar2[]; -extern const u8 gText_DepositHowManyVar1[]; -extern const u8 gText_CantStoreImportantItems[]; -extern const u8 gText_DepositedVar2Var1s[]; -extern const u8 gText_NoRoomForItems[]; extern const u8 gText_ThreeDashes[]; extern const u8 *const gPocketNamesStringsTable[]; @@ -450,28 +441,12 @@ extern const u8 gBirchDexRatingText_LessThan190[]; extern const u8 gBirchDexRatingText_LessThan200[]; extern const u8 gBirchDexRatingText_DexCompleted[]; -// player pc text +// player PC text extern const u8 gText_WhatWouldYouLike[]; extern const u8 gText_NoMailHere[]; - -extern const u8 gText_TakeOutItemsFromPC[]; -extern const u8 gText_StoreItemsInPC[]; -extern const u8 gText_ThrowAwayItemsInPC[]; extern const u8 gText_GoBackPrevMenu[]; - -extern const u8 gText_ItemStorage[]; -extern const u8 gText_Mailbox[]; -extern const u8 gText_Decoration[]; -extern const u8 gText_TurnOff[]; - -extern const u8 gText_WithdrawItem[]; -extern const u8 gText_DepositItem[]; -extern const u8 gText_TossItem[]; extern const u8 gText_Cancel[]; -extern const u8 gText_Read[]; -extern const u8 gText_MoveToBag[]; -extern const u8 gText_Give2[]; extern const u8 gText_Cancel2[]; extern const u8 gText_NoItems[]; @@ -481,12 +456,8 @@ extern const u8 gText_BagIsFull[]; extern const u8 gText_MailToBagMessageErased[]; extern const u8 gText_GoBackPrevMenu[]; -extern const u8 gText_WithdrawHowManyItems[]; -extern const u8 gText_WithdrawXItems[]; extern const u8 gText_TossHowManyVar1s[]; extern const u8 gText_ThrewAwayVar2Var1s[]; -extern const u8 gText_NoRoomInBag[]; -extern const u8 gText_TooImportantToToss[]; extern const u8 gText_ConfirmTossItems[]; extern const u8 gText_MoveVar1Where[]; @@ -509,16 +480,6 @@ extern const u8 gText_HealthboxGender_None[]; extern const u8 gText_HealthboxGender_Male[]; extern const u8 gText_HealthboxGender_Female[]; -extern const u8 gText_99TimesPlus[]; -extern const u8 gText_1MinutePlus[]; -extern const u8 gText_SpaceSeconds[]; -extern const u8 gText_SpaceTimes[]; - -extern const u8 gText_BigGuy[]; -extern const u8 gText_BigGirl[]; -extern const u8 gText_Son[]; -extern const u8 gText_Daughter[]; - // Multichoice strings extern const u8 gText_Exit[]; extern const u8 gText_1F[]; @@ -539,73 +500,6 @@ extern const u8 gText_B4F[]; extern const u8 gText_Rooftop[]; extern const u8 gText_ElevatorNowOn[]; -extern const u8 gText_BlueFlute[]; -extern const u8 gText_YellowFlute[]; -extern const u8 gText_RedFlute[]; -extern const u8 gText_WhiteFlute[]; -extern const u8 gText_BlackFlute[]; -extern const u8 gText_PrettyChair[]; -extern const u8 gText_PrettyDesk[]; - -extern const u8 gText_0Pts[]; -extern const u8 gText_10Pts[]; -extern const u8 gText_20Pts[]; -extern const u8 gText_30Pts[]; -extern const u8 gText_40Pts[]; -extern const u8 gText_50Pts[]; -extern const u8 gText_60Pts[]; -extern const u8 gText_70Pts[]; -extern const u8 gText_80Pts[]; -extern const u8 gText_90Pts[]; -extern const u8 gText_100Pts[]; -extern const u8 gText_QuestionMark[]; - -extern const u8 gText_KissPoster16BP[]; -extern const u8 gText_KissCushion32BP[]; -extern const u8 gText_SmoochumDoll32BP[]; -extern const u8 gText_TogepiDoll48BP[]; -extern const u8 gText_MeowthDoll48BP[]; -extern const u8 gText_ClefairyDoll48BP[]; -extern const u8 gText_DittoDoll48BP[]; -extern const u8 gText_CyndaquilDoll80BP[]; -extern const u8 gText_ChikoritaDoll80BP[]; -extern const u8 gText_TotodileDoll80BP[]; - -extern const u8 gText_LaprasDoll128BP[]; -extern const u8 gText_SnorlaxDoll128BP[]; -extern const u8 gText_VenusaurDoll256BP[]; -extern const u8 gText_CharizardDoll256BP[]; -extern const u8 gText_BlastoiseDoll256BP[]; - -extern const u8 gText_Protein1BP[]; -extern const u8 gText_Calcium1BP[]; -extern const u8 gText_Iron1BP[]; -extern const u8 gText_Zinc1BP[]; -extern const u8 gText_Carbos1BP[]; -extern const u8 gText_HpUp1BP[]; - -extern const u8 gText_Leftovers48BP[]; -extern const u8 gText_WhiteHerb48BP[]; -extern const u8 gText_QuickClaw48BP[]; -extern const u8 gText_MentalHerb48BP[]; -extern const u8 gText_BrightPowder64BP[]; -extern const u8 gText_ChoiceBand64BP[]; -extern const u8 gText_KingsRock64BP[]; -extern const u8 gText_FocusBand64BP[]; -extern const u8 gText_ScopeLens64BP[]; - -extern const u8 gText_EnergyPowder50[]; -extern const u8 gText_EnergyRoot80[]; -extern const u8 gText_HealPowder50[]; -extern const u8 gText_RevivalHerb300[]; -extern const u8 gText_Protein1000[]; -extern const u8 gText_Iron1000[]; -extern const u8 gText_Carbos1000[]; -extern const u8 gText_Calcium1000[]; -extern const u8 gText_Zinc1000[]; -extern const u8 gText_HPUp1000[]; -extern const u8 gText_PPUp3000[]; - extern const u8 gText_BattleTower2[]; extern const u8 gText_BattleDome[]; extern const u8 gText_BattlePalace[]; @@ -616,28 +510,6 @@ extern const u8 gText_BattlePyramid[]; extern const u8 gText_RankingHall[]; extern const u8 gText_ExchangeService[]; -// Battle Frontier Move Tutors -extern const u8 gText_Softboiled16BP[]; -extern const u8 gText_SeismicToss24BP[]; -extern const u8 gText_DreamEater24BP[]; -extern const u8 gText_MegaPunch24BP[]; -extern const u8 gText_MegaKick48BP[]; -extern const u8 gText_BodySlam48BP[]; -extern const u8 gText_RockSlide48BP[]; -extern const u8 gText_Counter48BP[]; -extern const u8 gText_ThunderWave48BP[]; -extern const u8 gText_SwordsDance48BP[]; -extern const u8 gText_DefenseCurl16BP[]; -extern const u8 gText_Snore24BP[]; -extern const u8 gText_MudSlap24BP[]; -extern const u8 gText_Swift24BP[]; -extern const u8 gText_IcyWind24BP[]; -extern const u8 gText_Endure48BP[]; -extern const u8 gText_PsychUp48BP[]; -extern const u8 gText_IcePunch48BP[]; -extern const u8 gText_ThunderPunch48BP[]; -extern const u8 gText_FirePunch48BP[]; - extern const u8 gText_SlateportCity[]; extern const u8 gText_BattleFrontier[]; extern const u8 gText_SouthernIsland[]; @@ -681,28 +553,15 @@ extern const u8 BattleFrontier_Lounge2_Text_PyramidKingSilverMons[]; extern const u8 BattleFrontier_Lounge2_Text_PyramidKingGoldMons[]; // Battle Frontier Nature Girl -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlHardy[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlLonely[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlBrave[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlAdamant[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlNaughty[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlBold[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlRelaxed[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlImpish[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlLax[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlTimid[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlHasty[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlSerious[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlJolly[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlModest[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlMild[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlBashful[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlRash[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlCalm[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlGentle[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlSassy[]; -extern const u8 BattleFrontier_Lounge5_Text_NatureGirlCareful[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlAttackHighDefenseLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlAttackHighSupportLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlDefenseHighAttackLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlDefenseHighSupportLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlSupportHighAttackLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlSupportHighDefenseLow[]; +extern const u8 BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow[]; // Battle Frontier Gambler extern const u8 BattleFrontier_Lounge3_Text_ChallengeBattleTowerSingle[]; @@ -816,26 +675,12 @@ extern const u8 gText_Gabby[]; extern const u8 gText_Anna[]; extern const u8 gText_DadsAdvice[]; -extern const u8 gText_CantDismountBike[]; -extern const u8 gText_ItemFinderNothing[]; -extern const u8 gText_ItemFinderNearby[]; -extern const u8 gText_ItemFinderOnTop[]; -extern const u8 gText_CoinCase[]; -extern const u8 gText_PowderQty[]; -extern const u8 gText_BootedUpHM[]; -extern const u8 gText_BootedUpTM[]; -extern const u8 gText_TMHMContainedVar1[]; extern const u8 gText_PlayerUsedVar2[]; extern const u8 gText_RepelEffectsLingered[]; extern const u8 gText_LureEffectsLingered[]; -extern const u8 gText_UsedVar2WildLured[]; -extern const u8 gText_UsedVar2WildRepelled[]; extern const u8 gText_BoxFull[]; extern const u8 gText_WontHaveEffect[]; extern const u8 gText_NextFusionMon[]; -extern const u8 gText_PlayedPokeFluteCatchy[]; -extern const u8 gText_PlayedPokeFlute[]; -extern const u8 gText_PokeFluteAwakenedMon[]; extern const u8 gText_LevelSymbol[]; extern const u8 gText_PkmnInfo[]; @@ -934,31 +779,13 @@ extern const u8 gText_SomeonesPC[]; extern const u8 gText_PlayersPC[]; extern const u8 gText_WhichPCShouldBeAccessed[]; -extern const u8 gText_Petalburg[]; -extern const u8 gText_Slateport[]; -extern const u8 gText_Enter2[]; extern const u8 gText_Info2[]; -extern const u8 gText_WhatsAContest[]; -extern const u8 gText_TypesOfContests[]; -extern const u8 gText_Ranks[]; extern const u8 gText_Decoration2[]; extern const u8 gText_PackUp[]; extern const u8 gText_Registry[]; extern const u8 gText_Information[]; -extern const u8 gText_Mach[]; -extern const u8 gText_Acro[]; -extern const u8 gText_Psn[]; -extern const u8 gText_Par[]; -extern const u8 gText_Slp[]; -extern const u8 gText_Brn[]; -extern const u8 gText_Frz[]; -extern const u8 gText_Dewford[]; -extern const u8 gText_SawIt[]; -extern const u8 gText_NotYet[]; extern const u8 gText_Yes[]; extern const u8 gText_No[]; -extern const u8 gText_Challenge[]; -extern const u8 gText_Info3[]; // Pokédex strings extern const u8 gText_SearchForPkmnBasedOnParameters[]; @@ -1009,41 +836,7 @@ extern const u8 gText_DexEmptyString[]; extern const u8 gText_DexSearchDontSpecify[]; extern const u8 gText_DexSearchTypeNone[]; -extern const u8 gText_FreshWaterAndPrice[]; -extern const u8 gText_SodaPopAndPrice[]; -extern const u8 gText_LemonadeAndPrice[]; -extern const u8 gText_HowToRide[]; -extern const u8 gText_HowToTurn[]; -extern const u8 gText_SandySlopes[]; -extern const u8 gText_Wheelies[]; -extern const u8 gText_BunnyHops[]; -extern const u8 gText_Jump[]; -extern const u8 gText_Satisfied[]; -extern const u8 gText_Dissatisfied[]; -extern const u8 gText_DeepSeaTooth[]; -extern const u8 gText_DeepSeaScale[]; -extern const u8 gText_BlueFlute2[]; -extern const u8 gText_YellowFlute2[]; -extern const u8 gText_RedFlute2[]; -extern const u8 gText_WhiteFlute2[]; -extern const u8 gText_BlackFlute2[]; -extern const u8 gText_GlassChair[]; -extern const u8 gText_GlassDesk[]; -extern const u8 gText_TreeckoDollAndPrice[]; -extern const u8 gText_TorchicDollAndPrice[]; -extern const u8 gText_MudkipDollAndPrice[]; -extern const u8 gText_TM32AndPrice[]; -extern const u8 gText_TM29AndPrice[]; -extern const u8 gText_TM35AndPrice[]; -extern const u8 gText_TM24AndPrice[]; -extern const u8 gText_TM13AndPrice[]; -extern const u8 gText_50CoinsAndPrice[]; -extern const u8 gText_500CoinsAndPrice[]; -extern const u8 gText_Excellent2[]; -extern const u8 gText_NotSoGood[]; extern const u8 gText_LilycoveCity[]; -extern const u8 gText_Right[]; -extern const u8 gText_Left[]; extern const u8 gText_RedShard[]; extern const u8 gText_YellowShard[]; extern const u8 gText_BlueShard[]; @@ -1054,79 +847,20 @@ extern const u8 gText_ReadyToStart[]; extern const u8 gText_Record2[]; extern const u8 gText_Rest[]; extern const u8 gText_Retire[]; -extern const u8 gText_RedTent[]; -extern const u8 gText_BlueTent[]; extern const u8 gText_TradeCenter[]; extern const u8 gText_Colosseum[]; extern const u8 gText_RecordCorner[]; -extern const u8 gText_SingleBattle[]; -extern const u8 gText_DoubleBattle[]; -extern const u8 gText_MultiBattle[]; extern const u8 gText_BerryCrush3[]; -extern const u8 gText_PokemonJump[]; -extern const u8 gText_DodrioBerryPicking[]; -extern const u8 gText_JoinGroup[]; -extern const u8 gText_BecomeLeader[]; -extern const u8 gText_NormalRank[]; -extern const u8 gText_SuperRank[]; -extern const u8 gText_HyperRank[]; -extern const u8 gText_MasterRank[]; -extern const u8 gText_BattleBag[]; -extern const u8 gText_HeldItem[]; -extern const u8 gText_LinkContest[]; -extern const u8 gText_AboutE_Mode[]; -extern const u8 gText_AboutG_Mode[]; -extern const u8 gText_E_Mode[]; -extern const u8 gText_G_Mode[]; extern const u8 gText_Blank[]; -extern const u8 gText_5BP[]; -extern const u8 gText_10BP[]; -extern const u8 gText_15BP[]; -extern const u8 gText_ClawFossil[]; -extern const u8 gText_RootFossil[]; -extern const u8 gText_No4[]; -extern const u8 gText_TwoStyles[]; -extern const u8 gText_Lv50_3[]; -extern const u8 gText_OpenLevel2[]; -extern const u8 gText_MonTypeAndNo[]; -extern const u8 gText_HoldItems[]; -extern const u8 gText_Symbols2[]; -extern const u8 gText_Record3[]; -extern const u8 gText_BattlePts[]; extern const u8 gText_BattleRules[]; extern const u8 gText_JudgeMind[]; extern const u8 gText_JudgeSkill[]; extern const u8 gText_JudgeBody[]; -extern const u8 gText_TowerInfo[]; -extern const u8 gText_BattleMon[]; -extern const u8 gText_BattleSalon[]; -extern const u8 gText_MultiLink2[]; -extern const u8 gText_Matchup[]; -extern const u8 gText_TourneyTree[]; -extern const u8 gText_DoubleKO[]; extern const u8 gText_BasicRules[]; extern const u8 gText_SwapPartners[]; extern const u8 gText_SwapNumber[]; extern const u8 gText_SwapNotes[]; -extern const u8 gText_OpenLevel3[]; -extern const u8 gText_PyramidPokemon[]; -extern const u8 gText_PyramidTrainers[]; -extern const u8 gText_PyramidMaze[]; -extern const u8 gText_BattleBag2[]; -extern const u8 gText_PokenavAndBag[]; -extern const u8 gText_HeldItems[]; -extern const u8 gText_PokemonOrder[]; extern const u8 gText_GoOn[]; -extern const u8 gText_Red[]; -extern const u8 gText_Blue[]; -extern const u8 gText_IllBattleNow[]; -extern const u8 gText_IWon[]; -extern const u8 gText_ILost[]; -extern const u8 gText_IWontTell[]; -extern const u8 gText_CaveOfOrigin[]; -extern const u8 gText_MtPyre[]; -extern const u8 gText_SkyPillar[]; -extern const u8 gText_DontRemember[]; extern const u8 gText_BattlePokemon[]; extern const u8 gText_NormalTagMatch[]; extern const u8 gText_VarietyTagMatch[]; @@ -1150,19 +884,6 @@ extern const u8 CableClub_Text_YouMayBattleHere[]; extern const u8 CableClub_Text_CanMixRecords[]; extern const u8 CableClub_Text_CanMakeBerryPowder[]; -// Rotom Catalog text -extern const u8 gText_LightBulb[]; -extern const u8 gText_MicrowaveOven[]; -extern const u8 gText_WashingMachine[]; -extern const u8 gText_Refrigerator[]; -extern const u8 gText_ElectricFan[]; -extern const u8 gText_LawnMower[]; -extern const u8 gText_Exit[]; - -// Zygarde Cube text -extern const u8 gText_ChangeForm[]; -extern const u8 gText_ChangeAbility[]; - // Frontier records. extern const u8 gText_WinStreak[]; extern const u8 gText_Record[]; @@ -1817,6 +1538,7 @@ extern const u8 gText_PkmnTransferredSomeonesPCBoxFull[]; extern const u8 gText_PkmnTransferredLanettesPCBoxFull[]; extern const u8 gText_PkmnTransferredSomeonesPC[]; extern const u8 gText_PkmnTransferredLanettesPC[]; +extern const u8 gText_PkmnSentToPCAfterCatch[]; // hall of fame extern const u8 gText_LeagueChamp[]; @@ -1850,6 +1572,7 @@ extern const u8 gDaycareText_PlayOther[]; extern const u8 gText_ChoosePokemon[]; extern const u8 gText_ChoosePokemonCancel[]; extern const u8 gText_ChoosePokemonConfirm[]; +extern const u8 gText_SendWhichMonToPC[]; extern const u8 gText_MoveToWhere[]; extern const u8 gText_TeachWhichPokemon[]; extern const u8 gText_UseOnWhichPokemon[]; @@ -1887,21 +1610,8 @@ extern const u8 gText_NotAble2[]; extern const u8 gText_Learned[]; extern const u8 gText_Have[]; extern const u8 gText_DontHave[]; -extern const u8 gText_Take[]; -extern const u8 gText_Mail[]; -extern const u8 gText_Take2[]; -extern const u8 gText_Read2[]; extern const u8 gText_Cancel2[]; -extern const u8 gText_Shift[]; -extern const u8 gText_SendOut[]; -extern const u8 gText_Enter[]; -extern const u8 gText_NoEntry[]; -extern const u8 gText_Store[]; extern const u8 gText_Register[]; -extern const u8 gText_Trade4[]; -extern const u8 gText_Summary5[]; -extern const u8 gText_Switch2[]; -extern const u8 gText_Item[]; extern const u8 gText_NotPkmnOtherTrainerWants[]; extern const u8 gText_ThatIsntAnEgg[]; extern const u8 gText_OtherTrainersPkmnCantBeTraded[]; @@ -2697,9 +2407,6 @@ extern const u8 gText_ExpShareOff[]; extern const u8 gText_BasePointsResetToZero[]; -extern const u8 gText_Fertilize[]; -extern const u8 gText_PlantBerry[]; - // Map name pop-up extern const u8 gText_AM[]; extern const u8 gText_PM[]; @@ -2711,4 +2418,7 @@ extern const u8 gText_PlayerScurriedBackHome[]; extern const u8 gText_Relearn[]; // move relearner from summary screen extern const u8 gText_Rename[]; // change nickname from summary screen +// Switch Caught Mon into Party +extern const u8 gText_CannotSendMonToBoxHM[]; + #endif // GUARD_STRINGS_H diff --git a/include/test/battle.h b/include/test/battle.h index c8ab519ba0..1c044fd6e2 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -29,7 +29,7 @@ * * ASSUMPTIONS * { - * ASSUME(gMovesInfo[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE); + * ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_PARALYZE); * } * * SINGLE_BATTLE_TEST("Stun Spore inflicts paralysis") @@ -87,7 +87,7 @@ * SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types") * { * GIVEN { - * ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove); + * ASSUME(IsPowderMove(MOVE_STUN_SPORE)); * ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); * PLAYER(SPECIES_ODDISH); // 1. * OPPONENT(SPECIES_ODDISH); // 2. @@ -129,7 +129,7 @@ * PARAMETRIZE { raiseAttack = FALSE; } * PARAMETRIZE { raiseAttack = TRUE; } * GIVEN { - * ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + * ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); * PLAYER(SPECIES_WOBBUFFET); * OPPONENT(SPECIES_WOBBUFFET); * } WHEN { @@ -176,7 +176,7 @@ * Pokémon we can observe the damage of a physical attack with and * without the burn. To document that this test assumes the attack is * physical we can use: - * ASSUME(gMovesInfo[MOVE_WHATEVER].category == DAMAGE_CATEGORY_PHYSICAL); + * ASSUME(GetMoveCategory(MOVE_WHATEVER) == DAMAGE_CATEGORY_PHYSICAL); * * ASSUMPTIONS * Should be placed immediately after any #includes and contain any @@ -186,7 +186,7 @@ * move_effect_poison_hit.c should be: * ASSUMPTIONS * { - * ASSUME(gMovesInfo[MOVE_POISON_STING].effect == EFFECT_POISON_HIT); + * ASSUME(GetMoveEffect(MOVE_POISON_STING) == EFFECT_POISON_HIT); * } * * SINGLE_BATTLE_TEST(name, results...) and DOUBLE_BATTLE_TEST(name, results...) @@ -228,7 +228,7 @@ * PARAMETRIZE { hp = 99; } * PARAMETRIZE { hp = 33; } * GIVEN { - * ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + * ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); * PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); MaxHP(99); HP(hp); } * OPPONENT(SPECIES_WOBBUFFET); * } WHEN { @@ -265,7 +265,7 @@ * * If the tag is not provided, runs the test 50 times and computes an * approximate pass ratio. - * PASSES_RANDOMLY(gMovesInfo[move].accuracy, 100); + * PASSES_RANDOMLY(GetMoveAccuracy(move), 100); * Note that this mode of PASSES_RANDOMLY makes the tests run very * slowly and should be avoided where possible. If the mechanic you are * testing is missing its tag, you should add it. diff --git a/include/test/overworld_script.h b/include/test/overworld_script.h index 2a6422834a..e849f87e0c 100644 --- a/include/test/overworld_script.h +++ b/include/test/overworld_script.h @@ -42,6 +42,17 @@ #define RUN_OVERWORLD_SCRIPT(...) RunScriptImmediately(OVERWORLD_SCRIPT(__VA_ARGS__)) +// Make important constants available. +// TODO: Find a better approach to this. +asm(".set FALSE, 0\n" + ".set TRUE, 1\n" + ".set PARTY_SIZE, " STR(PARTY_SIZE) "\n" + ".set VARS_START, " STR(VARS_START) "\n" + ".set VARS_END, " STR(VARS_END) "\n" + ".set SPECIAL_VARS_START, " STR(SPECIAL_VARS_START) "\n" + ".set SPECIAL_VARS_END, " STR(SPECIAL_VARS_END) "\n"); +asm(".include \"constants/gba_constants.inc\"\n"); + // Make overworld script macros available. asm(".include \"constants/gba_constants.inc\"\n" ".include \"asm/macros/asm.inc\"\n" diff --git a/include/test/test.h b/include/test/test.h index 1a9d8a237e..ccfc589c21 100644 --- a/include/test/test.h +++ b/include/test/test.h @@ -95,7 +95,7 @@ s32 Test_MgbaPrintf(const char *fmt, ...); #define ASSUMPTIONS \ static void Assumptions(void); \ - __attribute__((section(".tests"), used)) static const struct Test sAssumptions = \ + __attribute__((section(".tests"), used, no_reorder)) static const struct Test sAssumptions = \ { \ .name = "ASSUMPTIONS: " __FILE__, \ .filename = __FILE__, \ diff --git a/include/text_window.h b/include/text_window.h index a292d1309e..98776193f6 100644 --- a/include/text_window.h +++ b/include/text_window.h @@ -25,5 +25,6 @@ void rbox_fill_rectangle(u8 windowId); const u16 *GetTextWindowPalette(u8 id); const u16 *GetOverworldTextboxPalettePtr(void); void LoadSignPostWindowFrameGfx(void); +void LoadDexNavWindowGfx(u8 windowId, u16 destOffset, u8 palOffset); #endif // GUARD_TEXT_WINDOW_H diff --git a/include/trainer_card.h b/include/trainer_card.h index 7c37a84a6c..9e5e53df66 100644 --- a/include/trainer_card.h +++ b/include/trainer_card.h @@ -50,7 +50,6 @@ struct TrainerCard u32 frontier; } linkPoints; // This field is used differently by FRLG vs Emerald /*0x40*/ u32 unionRoomNum; - /*0x44*/ u8 filler[8]; /*0x4C*/ bool8 shouldDrawStickers; // FRLG only /*0x4D*/ u8 unused; /*0x4E*/ u8 monIconTint; // FRLG only diff --git a/include/trainer_pools.h b/include/trainer_pools.h new file mode 100644 index 0000000000..196657a55f --- /dev/null +++ b/include/trainer_pools.h @@ -0,0 +1,76 @@ +#ifndef GUARD_TRAINER_POOLS_H +#define GUARD_TRAINER_POOLS_H + +#include "pokemon.h" +#include "data.h" +#include "global.h" + +#define POOL_SLOT_DISABLED 0xff + +// Unlimited is set to 0 so that the default is unlimited +#define POOL_MEMBER_COUNT_UNLIMITED 0 +#define POOL_MEMBER_COUNT_NONE 0xff + +enum PoolRulesets { + POOL_RULESET_BASIC, + POOL_RULESET_DOUBLES, + POOL_RULESET_WEATHER_SINGLES, + POOL_RULESET_WEATHER_DOUBLES, + POOL_RULESET_SUPPORT_DOUBLES, +}; + +enum PoolPickFunctions { + POOL_PICK_DEFAULT, + POOL_PICK_LOWEST, +}; + +enum PoolPruneOptions { + POOL_PRUNE_NONE, + POOL_PRUNE_TEST, + POOL_PRUNE_RANDOM_TAG, +}; + +enum PoolTags { + // Lead and Ace has special handling, leave them be + POOL_TAG_LEAD = 0, + POOL_TAG_ACE = 1, + // No special handling for these + POOL_TAG_WEATHER_SETTER = 2, + POOL_TAG_WEATHER_ABUSER = 3, + POOL_TAG_SUPPORT = 4, + POOL_TAG_TAG6 = 5, + POOL_TAG_TAG7 = 6, + POOL_TAG_TAG8 = 7, + // Must be the last element + POOL_NUM_TAGS = 8 +}; + +#define MON_POOL_TAG_LEAD 1 << POOL_TAG_LEAD +#define MON_POOL_TAG_ACE 1 << POOL_TAG_ACE +#define MON_POOL_TAG_WEATHER_SETTER 1 << POOL_TAG_WEATHER_SETTER +#define MON_POOL_TAG_WEATHER_ABUSER 1 << POOL_TAG_WEATHER_ABUSER +#define MON_POOL_TAG_SUPPORT 1 << POOL_TAG_SUPPORT +#define MON_POOL_TAG_TAG6 1 << POOL_TAG_TAG6 +#define MON_POOL_TAG_TAG7 1 << POOL_TAG_TAG7 +#define MON_POOL_TAG_TAG8 1 << POOL_TAG_TAG8 + +struct PoolRules +{ + bool8 speciesClause; + bool8 excludeForms; + bool8 itemClause; + bool8 itemClauseExclusions; + u8 tagMaxMembers[POOL_NUM_TAGS]; + bool8 tagRequired[POOL_NUM_TAGS]; +}; + +struct PickFunctions +{ + u32 (*LeadFunction)(const struct Trainer *, u8 *, u32, u32, u32, struct PoolRules *); + u32 (*AceFunction)(const struct Trainer *, u8 *, u32, u32, u32, struct PoolRules *); + u32 (*OtherFunction)(const struct Trainer *, u8 *, u32, u32, u32, struct PoolRules *); +}; + +void DoTrainerPartyPool(const struct Trainer *trainer, u32 *monIndices, u8 monsCount, u32 battleTypeFlags); + +#endif diff --git a/include/trainer_slide.h b/include/trainer_slide.h new file mode 100644 index 0000000000..19fdf7c24a --- /dev/null +++ b/include/trainer_slide.h @@ -0,0 +1,25 @@ +#ifndef GUARD_TRAINER_SLIDE_H +#define GUARD_TRAINER_SLIDE_H + +#include "constants/trainer_slide.h" + + +struct MessageStatus +{ + u8 messageInitalized[TRAINER_SLIDE_ARRAY_SIZE]; + u8 messagePlayed[TRAINER_SLIDE_ARRAY_SIZE]; +}; + +void SetTrainerSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId); +enum TrainerSlideTargets ShouldDoTrainerSlide(u32 battler, enum TrainerSlideType slideId); +void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 moveType); +void TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(u32 target); +void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target); +void TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 target); +void TryInitializeTrainerSlideEnemyMonUnaffected(u32 target); +bool32 IsTrainerSlideInitialized(enum TrainerSlideType slideId); +bool32 IsTrainerSlidePlayed(enum TrainerSlideType slideId); +void InitalizeTrainerSlide(enum TrainerSlideType slideId); +void MarkTrainerSlideAsPlayed(enum TrainerSlideType slideId); + +#endif // GUARD_TRAINER_SLIDE_H diff --git a/include/wild_encounter.h b/include/wild_encounter.h index 63289f081c..c7abb72aa1 100644 --- a/include/wild_encounter.h +++ b/include/wild_encounter.h @@ -23,6 +23,7 @@ struct WildPokemonHeader const struct WildPokemonInfo *landMonsInfo; const struct WildPokemonInfo *waterMonsInfo; const struct WildPokemonInfo *rockSmashMonsInfo; + const struct WildPokemonInfo *hiddenMonsInfo; const struct WildPokemonInfo *fishingMonsInfo; }; @@ -43,5 +44,11 @@ bool8 UpdateRepelCounter(void); bool8 TryDoDoubleWildBattle(void); bool8 StandardWildEncounter_Debug(void); u32 CalculateChainFishingShinyRolls(void); +void CreateWildMon(u16 species, u8 level); +u16 GetCurrentMapWildMonHeaderId(void); +u8 ChooseWildMonIndex_Land(void); +u8 ChooseWildMonIndex_WaterRock(void); +u8 ChooseHiddenMonIndex(void); +bool32 MapHasNoEncounterData(void); #endif // GUARD_WILD_ENCOUNTER_H diff --git a/ld_script_test.ld b/ld_script_test.ld index 8972a97b00..d279d6b4f6 100644 --- a/ld_script_test.ld +++ b/ld_script_test.ld @@ -38,7 +38,7 @@ SECTIONS { __iwram_end = .; } > IWRAM - .iwram.sbss (NOLOAD) : + .iwram.bss (NOLOAD) : ALIGN(4) { src/*.o(.bss); @@ -55,13 +55,17 @@ SECTIONS { data/*.o(COMMON); test/*.o(COMMON); *libc.a:sbrkr.o(COMMON); - . = ALIGN(4); + } > IWRAM - /* .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); + /* .persistent starts at 0x3007F00 */ + /* WARNING: This is the end of the IRQ stack, if there's too + * much data it WILL be overwritten. */ + + . = 0x03007F00; + .iwram.persistent (NOLOAD) : + ALIGN(4) + { + test/*.o(.persistent); } > IWRAM /* BEGIN ROM DATA */ @@ -79,7 +83,7 @@ SECTIONS { script_data : ALIGN(4) { - data/*.o(script_data); + data/*.o(script_data); } > ROM =0 lib_text : @@ -114,7 +118,7 @@ SECTIONS { } > ROM =0 .data.iwram : - ALIGN(4) + ALIGN(8) { __iwram_lma = .; . = . + (__iwram_end - __iwram_start); diff --git a/migration_scripts/1.11/consolidate_contest_opponent_filters.py b/migration_scripts/1.11/consolidate_contest_opponent_filters.py new file mode 100644 index 0000000000..240152cea2 --- /dev/null +++ b/migration_scripts/1.11/consolidate_contest_opponent_filters.py @@ -0,0 +1,45 @@ +import glob +import re +import os + +if not os.path.exists("Makefile"): + print("Please run this script from your root folder.") + quit() + +# Read contest_opponents.h +for file in glob.glob('./src/data/contest_opponents.h'): + with open(file, 'r') as f: + source_content = f.read() + +# Extract party info from contest_opponents.h +source_pattern = re.compile(r'(\[CONTEST_OPPONENT_.*\])\s*=\s(CONTEST_FILTER_.*)*') +source_data = {} +for match in source_pattern.findall(source_content): + if len(match) == 2: + trainer_name, contest_filter = match + source_data[trainer_name] = (contest_filter) + +# Read contest_opponents.h content +for file in glob.glob('./src/data/contest_opponents.h'): + with open(file, 'r') as f: + destination_content = f.read() + +# Modify contest_opponents.h content +def add_filter_data(match): + trainer_name = match.group(1) + if trainer_name in source_data: + contest_filter = source_data[trainer_name] + print(f"Updating {trainer_name}: adding {contest_filter}") + #return f'{trainer_name} = {{\n .filter = {contest_filter}' + return f'{match.group(0)}\n .filter = {contest_filter}' + else: + return match.group(0) + +destination_pattern = re.compile(r'(\[CONTEST_OPPONENT_[A-Z_0-9]+\])\s*=\s*{') +modified_content = destination_pattern.sub(add_filter_data, destination_content) + +# Write the modified content back to contest_opponents.h +for file in glob.glob('./src/data/contest_opponents.h'): + with open(file, 'w') as f: + f.write(modified_content) + print("contest_opponents.h has been updated") diff --git a/migration_scripts/1.11/convert_battle_frontier_trainers.py b/migration_scripts/1.11/convert_battle_frontier_trainers.py new file mode 100644 index 0000000000..b218c79e31 --- /dev/null +++ b/migration_scripts/1.11/convert_battle_frontier_trainers.py @@ -0,0 +1,44 @@ +import glob +import re +import os + +if not os.path.exists("Makefile"): + print("Please run this script from your root folder.") + quit() + +# Read battle_frontier_trainer_mons.h and extract the party information +for file in glob.glob('./src/data/battle_frontier/battle_frontier_trainer_mons.h'): + with open(file, 'r') as f: + source_content = f.read() + +# Extract party info from battle_frontier_trainer_mons.h +source_pattern = re.compile(r'gBattleFrontierTrainerMons_(.*)\[\]\s*=\s*\n\{\n\s*(FRONTIER.*)') +source_data = {} +for match in source_pattern.findall(source_content): + if len(match) == 2: + trainer_name, party_group = match + source_data[trainer_name] = (party_group) + +# Read battle_frontier_trainers.h content +for file in glob.glob('./src/data/battle_frontier/battle_frontier_trainers.h'): + with open(file, 'r') as f: + destination_content = f.read() + +# Modify battle_frontier_trainers.h content +def add_party_data(match): + trainer_name = match.group(1) + if trainer_name in source_data: + party_group = source_data[trainer_name] + print(f"Updating {trainer_name}: adding {party_group}") + return f'(const u16[]){{{party_group}}}' + else: + return match.group(0) + +destination_pattern = re.compile(r'gBattleFrontierTrainerMons_(.*)') +modified_content = destination_pattern.sub(add_party_data, destination_content) + +# Write the modified content back to battle_frontier_trainers.h +for file in glob.glob('./src/data/battle_frontier/battle_frontier_trainers.h'): + with open(file, 'w') as f: + f.write(modified_content) + print("battle_frontier_trainers.h has been updated") diff --git a/migration_scripts/README.md b/migration_scripts/README.md index 696f146f14..0b1eb50583 100644 --- a/migration_scripts/README.md +++ b/migration_scripts/README.md @@ -17,6 +17,48 @@ python3 migration_scripts/*.py ; #run the migration script `*` will need to be replaced with the name of the appropriate script. +## 1.10.x to 1.11.x+ + +### Contest Opponents + +* Filepath [`migration_scripts/1.11/consolidate_contest_opponent_filters.py`](1.11/consolidate_contest_opponent_filters.py) +* Introduced in [Consolidated contest opponent filters into gContestOpponents #6119](https://github.com/rh-hideout/pokeemerald-expansion/pull/6119) + +Moves the contest opponent filters in src/data/contest_opponents.h from gPostgameContestOpponentFilter to gContestOpponents + +#### [src/data/contest_opponents.h](../src/data/contest_opponents.h) +```diff +const struct ContestPokemon gContestOpponents[] = +{ + [CONTEST_OPPONENT_JIMMY] = { ++ .filter = CONTEST_FILTER_NONE, +... +- const u8 gPostgameContestOpponentFilter[] = +- { +- [CONTEST_OPPONENT_JIMMY] = CONTEST_FILTER_NONE, +``` + +### Battle Frontier Trainers + +* Filepath [`migration_scripts/1.11/convert_battle_frontier_trainers.py`](1.11/convert_battle_frontier_trainers.py) +* Introduced in [Consolidated Frontier teams into battle_frontier_trainers.h #5892](https://github.com/rh-hideout/pokeemerald-expansion/pull/5892) + +Moves the Battle Frontier trainer parties from battle_frontier_trainer_mons.h to battle_frontier_trainers.h + +#### [src/data/battle_frontier/battle_frontier_trainer_mons.h](../src/data/battle_frontier/battle_frontier_trainer_mons.h) +```diff +- const u16 gBattleFrontierTrainerMons_Brady[] = +- { +- FRONTIER_MONS_YOUNGSTER_LASS_1 +- }; +``` + +#### [src/data/battle_frontier/battle_frontier_trainers.h](../src/data/battle_frontier/battle_frontier_trainers.h) +```diff +- .monSet = gBattleFrontierTrainerMons_Brady ++ .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} +``` + ## 1.8.x to 1.9.x+ ### Battle Anim Moves diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index 88725dda66..37074cb048 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -747,6 +747,9 @@ $(POKEMONGFXDIR)/venusaur/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/venusaur/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/venusaur/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/charmander/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -756,6 +759,12 @@ $(POKEMONGFXDIR)/charmeleon/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/charizard/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/charizard/mega_x/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/charizard/mega_y/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/squirtle/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -765,6 +774,9 @@ $(POKEMONGFXDIR)/wartortle/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/blastoise/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/blastoise/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/caterpie/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -786,6 +798,9 @@ $(POKEMONGFXDIR)/kakuna/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/beedrill/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/beedrill/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/pidgey/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -795,6 +810,9 @@ $(POKEMONGFXDIR)/pidgeotto/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/pidgeot/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/pidgeot/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/rattata/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -963,6 +981,9 @@ $(POKEMONGFXDIR)/kadabra/overworldf.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/alakazam/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/alakazam/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/alakazam/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1011,6 +1032,9 @@ $(POKEMONGFXDIR)/slowpoke/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/slowbro/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/slowbro/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/magnemite/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1059,6 +1083,9 @@ $(POKEMONGFXDIR)/haunter/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/gengar/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/gengar/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/onix/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1131,6 +1158,9 @@ $(POKEMONGFXDIR)/tangela/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/kangaskhan/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/kangaskhan/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/horsea/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1176,6 +1206,9 @@ $(POKEMONGFXDIR)/magmar/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/pinsir/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/pinsir/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/tauros/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1191,6 +1224,9 @@ $(POKEMONGFXDIR)/gyarados/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/gyarados/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/gyarados/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/lapras/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1230,6 +1266,9 @@ $(POKEMONGFXDIR)/kabutops/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/aerodactyl/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/aerodactyl/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/snorlax/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1254,6 +1293,12 @@ $(POKEMONGFXDIR)/dragonite/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/mewtwo/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/mewtwo/mega_x/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/mewtwo/mega_y/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/mew/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1359,6 +1404,9 @@ $(POKEMONGFXDIR)/flaaffy/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/ampharos/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/ampharos/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/bellossom/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1551,6 +1599,9 @@ $(POKEMONGFXDIR)/steelix/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/steelix/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 8 -mheight 8 +$(POKEMONGFXDIR)/steelix/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + $(POKEMONGFXDIR)/snubbull/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1566,6 +1617,9 @@ $(POKEMONGFXDIR)/scizor/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/scizor/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/scizor/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/shuckle/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1575,6 +1629,9 @@ $(POKEMONGFXDIR)/heracross/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/heracross/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/heracross/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/sneasel/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1635,6 +1692,9 @@ $(POKEMONGFXDIR)/houndoom/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/houndoom/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/houndoom/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/kingdra/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1695,6 +1755,9 @@ $(POKEMONGFXDIR)/pupitar/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/tyranitar/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/tyranitar/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/lugia/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 8 -mheight 8 @@ -1713,6 +1776,9 @@ $(POKEMONGFXDIR)/grovyle/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/sceptile/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/sceptile/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/torchic/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1731,6 +1797,9 @@ $(POKEMONGFXDIR)/blaziken/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/blaziken/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/blaziken/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/mudkip/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1740,6 +1809,9 @@ $(POKEMONGFXDIR)/marshtomp/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/swampert/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/swampert/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/poochyena/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1821,6 +1893,9 @@ $(POKEMONGFXDIR)/kirlia/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/gardevoir/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/gardevoir/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/surskit/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1881,9 +1956,15 @@ $(POKEMONGFXDIR)/delcatty/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/sableye/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/sableye/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/mawile/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/mawile/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/aron/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1893,6 +1974,9 @@ $(POKEMONGFXDIR)/lairon/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/aggron/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/aggron/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/meditite/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1905,12 +1989,18 @@ $(POKEMONGFXDIR)/medicham/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/medicham/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/medicham/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/electrike/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/manectric/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/manectric/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/plusle/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1947,6 +2037,9 @@ $(POKEMONGFXDIR)/carvanha/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/sharpedo/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/sharpedo/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/wailmer/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -1965,6 +2058,9 @@ $(POKEMONGFXDIR)/camerupt/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/camerupt/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/camerupt/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/torkoal/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2001,6 +2097,9 @@ $(POKEMONGFXDIR)/swablu/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/altaria/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/altaria/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/zangoose/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2073,6 +2172,9 @@ $(POKEMONGFXDIR)/shuppet/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/banette/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/banette/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/duskull/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2088,6 +2190,9 @@ $(POKEMONGFXDIR)/chimecho/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/absol/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/absol/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/wynaut/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2097,6 +2202,9 @@ $(POKEMONGFXDIR)/snorunt/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/glalie/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/glalie/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/spheal/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2133,6 +2241,9 @@ $(POKEMONGFXDIR)/shelgon/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/salamence/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/salamence/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/beldum/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2142,6 +2253,9 @@ $(POKEMONGFXDIR)/metang/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/metagross/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/metagross/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/regirock/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2154,18 +2268,33 @@ $(POKEMONGFXDIR)/registeel/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/latias/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/latias/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + $(POKEMONGFXDIR)/latios/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/latios/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + $(POKEMONGFXDIR)/kyogre/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 8 -mheight 8 +$(POKEMONGFXDIR)/kyogre/primal/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + $(POKEMONGFXDIR)/groudon/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 8 -mheight 8 +$(POKEMONGFXDIR)/groudon/primal/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + $(POKEMONGFXDIR)/rayquaza/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 8 -mheight 8 +$(POKEMONGFXDIR)/rayquaza/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 8 + $(POKEMONGFXDIR)/jirachi/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2346,6 +2475,9 @@ $(POKEMONGFXDIR)/buneary/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/lopunny/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/lopunny/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/mismagius/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2406,6 +2538,9 @@ $(POKEMONGFXDIR)/garchomp/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/garchomp/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/garchomp/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/munchlax/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2415,6 +2550,9 @@ $(POKEMONGFXDIR)/riolu/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/lucario/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/lucario/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/hippopotas/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2475,6 +2613,9 @@ $(POKEMONGFXDIR)/abomasnow/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/abomasnow/overworldf.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/abomasnow/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/weavile/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2532,6 +2673,9 @@ $(POKEMONGFXDIR)/porygon_z/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/gallade/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/gallade/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/probopass/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -2703,6 +2847,9 @@ $(POKEMONGFXDIR)/excadrill/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/audino/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/audino/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/timburr/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -3282,6 +3429,9 @@ $(POKEMONGFXDIR)/zygarde/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/diancie/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/diancie/mega/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/hoopa/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -3537,6 +3687,9 @@ $(POKEMONGFXDIR)/necrozma/dawn_wings/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/necrozma/dusk_mane/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/necrozma/ultra/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/magearna/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 @@ -4212,31 +4365,31 @@ $(POKEMONGFXDIR)/florges/orange/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/florges/white/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 -$(POKEMONGFXDIR)/furfrou/heart_trim/overworld.4bpp: %.4bpp: %.png +$(POKEMONGFXDIR)/furfrou/heart/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 -$(POKEMONGFXDIR)/furfrou/star_trim/overworld.4bpp: %.4bpp: %.png +$(POKEMONGFXDIR)/furfrou/star/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 -$(POKEMONGFXDIR)/furfrou/diamond_trim/overworld.4bpp: %.4bpp: %.png +$(POKEMONGFXDIR)/furfrou/diamond/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 -$(POKEMONGFXDIR)/furfrou/debutante_trim/overworld.4bpp: %.4bpp: %.png +$(POKEMONGFXDIR)/furfrou/debutante/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 -$(POKEMONGFXDIR)/furfrou/matron_trim/overworld.4bpp: %.4bpp: %.png +$(POKEMONGFXDIR)/furfrou/matron/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 -$(POKEMONGFXDIR)/furfrou/dandy_trim/overworld.4bpp: %.4bpp: %.png +$(POKEMONGFXDIR)/furfrou/dandy/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 -$(POKEMONGFXDIR)/furfrou/la_reine_trim/overworld.4bpp: %.4bpp: %.png +$(POKEMONGFXDIR)/furfrou/la_reine/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 -$(POKEMONGFXDIR)/furfrou/kabuki_trim/overworld.4bpp: %.4bpp: %.png +$(POKEMONGFXDIR)/furfrou/kabuki/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 -$(POKEMONGFXDIR)/furfrou/pharaoh_trim/overworld.4bpp: %.4bpp: %.png +$(POKEMONGFXDIR)/furfrou/pharaoh/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 $(POKEMONGFXDIR)/hoopa/unbound/overworld.4bpp: %.4bpp: %.png diff --git a/src/agb_flash_1m.c b/src/agb_flash_1m.c index 6fc4f3d600..037f7a964d 100644 --- a/src/agb_flash_1m.c +++ b/src/agb_flash_1m.c @@ -1,7 +1,7 @@ #include "gba/gba.h" #include "gba/flash_internal.h" -static const char AgbLibFlashVersion[] = "FLASH1M_V103"; +USED static const char AgbLibFlashVersion[] = "FLASH1M_V103"; static const struct FlashSetupInfo * const sSetupInfos[] = { diff --git a/src/apprentice.c b/src/apprentice.c index 66011fe76c..7769dde6e3 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -339,7 +339,7 @@ static u16 GetRandomAlternateMove(u8 monId) numLearnsetMoves = j; i = 0; - // i < 5 here is arbitrary, i isnt used and is only incremented when the selected move isnt in sValidApprenticeMoves + // i < 5 here is arbitrary, i isn't used and is only incremented when the selected move isn't valid (determined by the validApprenticeMove value) // This while loop contains 3 potential infinite loops, though none of them would occur in the base game while (i < 5) { @@ -411,7 +411,7 @@ static u16 GetRandomAlternateMove(u8 monId) if (TrySetMove(monId, moveId)) { - if (sValidApprenticeMoves[moveId]) + if (gMovesInfo[moveId].validApprenticeMove) break; i++; } diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 584d60d4dd..6244245d82 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -35,11 +35,11 @@ static u32 ChooseMoveOrAction_Singles(u32 battlerAi); static u32 ChooseMoveOrAction_Doubles(u32 battlerAi); static inline void BattleAI_DoAIProcessing(struct AI_ThinkingStruct *aiThink, u32 battlerAi, u32 battlerDef); +static inline void BattleAI_DoAIProcessing_PredictedSwitchin(struct AI_ThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAi, u32 battlerDef); static bool32 IsPinchBerryItemEffect(u32 holdEffect); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; // Still used in contests -EWRAM_DATA u8 sBattler_AI = 0; EWRAM_DATA AiScoreFunc sDynamicAiFunc = NULL; // const rom data @@ -57,7 +57,7 @@ static s32 AI_FirstBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_DynamicFunc(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); - +static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 (*const sBattleAiFuncTable[])(u32, u32, u32, s32) = { @@ -84,7 +84,7 @@ static s32 (*const sBattleAiFuncTable[])(u32, u32, u32, s32) = [20] = NULL, // Unused [21] = NULL, // Unused [22] = NULL, // Unused - [23] = NULL, // Unused + [23] = AI_PredictSwitch, // AI_FLAG_PREDICT_SWITCH [24] = NULL, // Unused [25] = NULL, // Unused [26] = NULL, // Unused @@ -100,7 +100,7 @@ void BattleAI_SetupItems(void) { s32 i; u8 *data = (u8 *)BATTLE_HISTORY; - const u16 *items = GetTrainerItemsFromId(gTrainerBattleOpponent_A); + const u16 *items = GetTrainerItemsFromId(TRAINER_BATTLE_PARAM.opponentA); for (i = 0; i < sizeof(struct BattleHistory); i++) data[i] = 0; @@ -183,6 +183,10 @@ static u32 GetAiFlags(u16 trainerId) if (flags & AI_FLAG_SMART_SWITCHING) flags |= AI_FLAG_SMART_MON_CHOICES; + // Automatically includes AI_FLAG_PREDICT_SWITCH if AI_FLAG_PREDICT_INCOMING_MON is being used + if (flags & AI_FLAG_PREDICT_INCOMING_MON) + flags |= AI_FLAG_PREDICT_SWITCH; + if (sDynamicAiFunc != NULL) flags |= AI_FLAG_DYNAMIC_FUNC; @@ -211,9 +215,9 @@ void BattleAI_SetupFlags(void) } else { - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(gTrainerBattleOpponent_A); - if (gTrainerBattleOpponent_B != 0) - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(gTrainerBattleOpponent_B); + AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA); + if (TRAINER_BATTLE_PARAM.opponentB != 0) + AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); else AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] = AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT]; } @@ -263,25 +267,24 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) SET_SCORE(battler, i, 0); } - //sBattler_AI = battler; - gBattlerTarget = SetRandomTarget(sBattler_AI); - gBattleStruct->aiChosenTarget[sBattler_AI] = gBattlerTarget; + gBattlerTarget = SetRandomTarget(battler); + gBattleStruct->aiChosenTarget[battler] = gBattlerTarget; } -u32 BattleAI_ChooseMoveOrAction(void) +u32 BattleAI_ChooseMoveOrAction(u32 battler) { u32 ret; if (!IsDoubleBattle()) - ret = ChooseMoveOrAction_Singles(sBattler_AI); + ret = ChooseMoveOrAction_Singles(battler); else - ret = ChooseMoveOrAction_Doubles(sBattler_AI); + ret = ChooseMoveOrAction_Doubles(battler); // Clear protect structures, some flags may be set during AI calcs - // e.g. pranksterElevated from GetMovePriority + // e.g. pranksterElevated from GetBattleMovePriority memset(&gProtectStructs, 0, MAX_BATTLERS_COUNT * sizeof(struct ProtectStruct)); #if TESTING - TestRunner_Battle_CheckAiMoveScores(sBattler_AI); + TestRunner_Battle_CheckAiMoveScores(battler); #endif // TESTING return ret; } @@ -399,7 +402,7 @@ static u32 Ai_SetMoveAccuracy(struct AiLogicData *aiData, u32 battlerAtk, u32 ba u32 accuracy; u32 abilityAtk = aiData->abilities[battlerAtk]; u32 abilityDef = aiData->abilities[battlerDef]; - if (abilityAtk == ABILITY_NO_GUARD || abilityDef == ABILITY_NO_GUARD || gMovesInfo[move].accuracy == 0) // Moves with accuracy 0 or no guard ability always hit. + if (abilityAtk == ABILITY_NO_GUARD || abilityDef == ABILITY_NO_GUARD || GetMoveAccuracy(move) == 0) // Moves with accuracy 0 or no guard ability always hit. accuracy = 100; else accuracy = GetTotalAccuracy(battlerAtk, battlerDef, move, abilityAtk, abilityDef, aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]); @@ -407,14 +410,35 @@ static u32 Ai_SetMoveAccuracy(struct AiLogicData *aiData, u32 battlerAtk, u32 ba return accuracy; } +static void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 weather) +{ + u32 moveIndex, move; + u32 rollType = GetDmgRollType(battlerAtk); + u16 *moves = GetMovesArray(battlerAtk); + + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + struct SimulatedDamage dmg = {0}; + uq4_12_t effectiveness = Q_4_12(0.0); + move = moves[moveIndex]; + + if (move != MOVE_NONE + && move != MOVE_UNAVAILABLE + //&& !IsBattleMoveStatus(move) /* we want to get effectiveness and accuracy of status moves */ + && !(aiData->moveLimitations[battlerAtk] & (1u << moveIndex))) + { + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, TRUE, weather, rollType); + aiData->moveAccuracy[battlerAtk][battlerDef][moveIndex] = Ai_SetMoveAccuracy(aiData, battlerAtk, battlerDef, move); + } + aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex] = dmg; + aiData->effectiveness[battlerAtk][battlerDef][moveIndex] = effectiveness; + } +} + static void SetBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u32 battlersCount, u32 weather) { - u16 *moves; - u32 battlerDef, moveIndex, move; - u32 rollType = GetDmgRollType(battlerAtk); + u32 battlerDef; SaveBattlerData(battlerAtk); - moves = GetMovesArray(battlerAtk); - SetBattlerData(battlerAtk); // Simulate dmg for both ai controlled mons and for player controlled mons. @@ -425,23 +449,7 @@ static void SetBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u3 SaveBattlerData(battlerDef); SetBattlerData(battlerDef); - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) - { - struct SimulatedDamage dmg = {0}; - u8 effectiveness = AI_EFFECTIVENESS_x0; - move = moves[moveIndex]; - - if (move != 0 - && move != 0xFFFF - //&& !IS_MOVE_STATUS(gMovesInfo[move]) /* we want to get effectiveness and accuracy of status moves */ - && !(aiData->moveLimitations[battlerAtk] & (1u << moveIndex))) - { - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, TRUE, weather, rollType); - aiData->moveAccuracy[battlerAtk][battlerDef][moveIndex] = Ai_SetMoveAccuracy(aiData, battlerAtk, battlerDef, move); - } - aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex] = dmg; - aiData->effectiveness[battlerAtk][battlerDef][moveIndex] = effectiveness; - } + CalcBattlerAiMovesData(aiData, battlerAtk, battlerDef, weather); RestoreBattlerData(battlerDef); } RestoreBattlerData(battlerAtk); @@ -458,8 +466,8 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) // Set delay timer to count how long it takes for AI to choose action/move gBattleStruct->aiDelayTimer = gMain.vblankCounter1; - aiData->weatherHasEffect = WEATHER_HAS_EFFECT; - weather = AI_GetWeather(aiData); + aiData->weatherHasEffect = HasWeatherEffect(); + weather = AI_GetWeather(); // get/assume all battler data and simulate AI damage battlersCount = gBattlersCount; @@ -496,7 +504,10 @@ static u32 ChooseMoveOrAction_Singles(u32 battlerAi) { if (flags & 1) { - BattleAI_DoAIProcessing(AI_THINKING_STRUCT, battlerAi, gBattlerTarget); + if (IsBattlerPredictedToSwitch(gBattlerTarget) && (AI_THINKING_STRUCT->aiFlags[battlerAi] & AI_FLAG_PREDICT_INCOMING_MON)) + BattleAI_DoAIProcessing_PredictedSwitchin(AI_THINKING_STRUCT, AI_DATA, battlerAi, gBattlerTarget); + else + BattleAI_DoAIProcessing(AI_THINKING_STRUCT, battlerAi, gBattlerTarget); } flags >>= 1; AI_THINKING_STRUCT->aiLogicId++; @@ -570,13 +581,16 @@ static u32 ChooseMoveOrAction_Doubles(u32 battlerAi) AI_DATA->partnerMove = GetAllyChosenMove(battlerAi); AI_THINKING_STRUCT->aiLogicId = 0; AI_THINKING_STRUCT->movesetIndex = 0; - flags = AI_THINKING_STRUCT->aiFlags[sBattler_AI]; + flags = AI_THINKING_STRUCT->aiFlags[battlerAi]; while (flags != 0) { if (flags & 1) { - BattleAI_DoAIProcessing(AI_THINKING_STRUCT, battlerAi, gBattlerTarget); + if (IsBattlerPredictedToSwitch(gBattlerTarget) && (AI_THINKING_STRUCT->aiFlags[battlerAi] & AI_FLAG_PREDICT_INCOMING_MON)) + BattleAI_DoAIProcessing_PredictedSwitchin(AI_THINKING_STRUCT, AI_DATA, battlerAi, gBattlerTarget); + else + BattleAI_DoAIProcessing(AI_THINKING_STRUCT, battlerAi, gBattlerTarget); } flags >>= 1; AI_THINKING_STRUCT->aiLogicId++; @@ -661,7 +675,8 @@ static inline bool32 ShouldConsiderMoveForBattler(u32 battlerAi, u32 battlerDef, { if (battlerAi == BATTLE_PARTNER(battlerDef)) { - if (gMovesInfo[move].target == MOVE_TARGET_BOTH || gMovesInfo[move].target == MOVE_TARGET_OPPONENTS_FIELD) + u32 target = GetBattlerMoveTargetType(battlerAi, move); + if (target == MOVE_TARGET_BOTH || target == MOVE_TARGET_OPPONENTS_FIELD) return FALSE; } return TRUE; @@ -702,17 +717,127 @@ static inline void BattleAI_DoAIProcessing(struct AI_ThinkingStruct *aiThink, u3 aiThink->movesetIndex = 0; } +void BattleAI_DoAIProcessing_PredictedSwitchin(struct AI_ThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef) +{ + struct BattlePokemon switchoutCandidate = gBattleMons[battlerDef]; + struct SimulatedDamage simulatedDamageSwitchout[MAX_MON_MOVES]; + uq4_12_t effectivenessSwitchout[MAX_MON_MOVES]; + u8 moveAccuracySwitchout[MAX_MON_MOVES]; + + struct BattlePokemon switchinCandidate; + struct SimulatedDamage simulatedDamageSwitchin[MAX_MON_MOVES]; + uq4_12_t effectivenessSwitchin[MAX_MON_MOVES]; + u8 moveAccuracySwitchin[MAX_MON_MOVES]; + + struct Pokemon *party = GetBattlerParty(battlerDef); + struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); + u32 moveIndex; + + // Store battler moves data to save time over recalculating it + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + simulatedDamageSwitchout[moveIndex] = aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex]; + effectivenessSwitchout[moveIndex] = aiData->effectiveness[battlerAtk][battlerDef][moveIndex]; + moveAccuracySwitchout[moveIndex] = aiData->moveAccuracy[battlerAtk][battlerDef][moveIndex]; + } + + // Get battler and move data for predicted switchin + PokemonToBattleMon(&party[aiData->mostSuitableMonId[battlerDef]], &switchinCandidate); + gBattleMons[battlerDef] = switchinCandidate; + SetBattlerAiData(battlerDef, aiData); + CalcBattlerAiMovesData(aiData, battlerAtk, battlerDef, AI_GetWeather()); + + // Regular processing with new battler + do + { + if (gBattleMons[battlerAtk].pp[aiThink->movesetIndex] == 0) + aiThink->moveConsidered = MOVE_NONE; + else + aiThink->moveConsidered = gBattleMons[battlerAtk].moves[aiThink->movesetIndex]; + + // There is no point in calculating scores for all 3 battlers(2 opponents + 1 ally) with certain moves. + if (aiThink->moveConsidered != MOVE_NONE + && aiThink->score[aiThink->movesetIndex] > 0 + && ShouldConsiderMoveForBattler(battlerAtk, battlerDef, aiThink->moveConsidered)) + { + if (IsChaseEffect(GetMoveEffect(aiThink->moveConsidered))) + { + // Save new switchin data + simulatedDamageSwitchin[aiThink->movesetIndex] = aiData->simulatedDmg[battlerAtk][battlerDef][aiThink->movesetIndex]; + effectivenessSwitchin[aiThink->movesetIndex] = aiData->effectiveness[battlerAtk][battlerDef][aiThink->movesetIndex]; + moveAccuracySwitchin[aiThink->movesetIndex] = aiData->moveAccuracy[battlerAtk][battlerDef][aiThink->movesetIndex]; + + // Restore old switchout data + gBattleMons[battlerDef] = switchoutCandidate; + SetBattlerAiData(battlerDef, aiData); + aiData->simulatedDmg[battlerAtk][battlerDef][aiThink->movesetIndex] = simulatedDamageSwitchout[aiThink->movesetIndex]; + aiData->effectiveness[battlerAtk][battlerDef][aiThink->movesetIndex] = effectivenessSwitchout[aiThink->movesetIndex]; + aiData->moveAccuracy[battlerAtk][battlerDef][aiThink->movesetIndex] = moveAccuracySwitchout[aiThink->movesetIndex]; + + if (aiThink->aiLogicId < ARRAY_COUNT(sBattleAiFuncTable) + && sBattleAiFuncTable[aiThink->aiLogicId] != NULL) + { + // Call AI function + aiThink->score[aiThink->movesetIndex] = + sBattleAiFuncTable[aiThink->aiLogicId](battlerAtk, + battlerDef, + aiThink->moveConsidered, + aiThink->score[aiThink->movesetIndex]); + } + + // Restore new switchin data + gBattleMons[battlerDef] = switchinCandidate; + SetBattlerAiData(battlerDef, aiData); + aiData->simulatedDmg[battlerAtk][battlerDef][aiThink->movesetIndex] = simulatedDamageSwitchin[aiThink->movesetIndex]; + aiData->effectiveness[battlerAtk][battlerDef][aiThink->movesetIndex] = effectivenessSwitchin[aiThink->movesetIndex]; + aiData->moveAccuracy[battlerAtk][battlerDef][aiThink->movesetIndex] = moveAccuracySwitchin[aiThink->movesetIndex]; + } + + else + { + if (aiThink->aiLogicId < ARRAY_COUNT(sBattleAiFuncTable) + && sBattleAiFuncTable[aiThink->aiLogicId] != NULL) + { + // Call AI function + aiThink->score[aiThink->movesetIndex] = + sBattleAiFuncTable[aiThink->aiLogicId](battlerAtk, + battlerDef, + aiThink->moveConsidered, + aiThink->score[aiThink->movesetIndex]); + } + } + } + else + { + aiThink->score[aiThink->movesetIndex] = 0; + } + aiThink->movesetIndex++; + } while (aiThink->movesetIndex < MAX_MON_MOVES && !(aiThink->aiAction & AI_ACTION_DO_NOT_ATTACK)); + + aiThink->movesetIndex = 0; + + // Restore original battler data and moves + FreeRestoreBattleMons(savedBattleMons); + SetBattlerAiData(battlerDef, aiData); + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex] = simulatedDamageSwitchout[moveIndex]; + aiData->effectiveness[battlerAtk][battlerDef][moveIndex] = effectivenessSwitchout[moveIndex]; + aiData->moveAccuracy[battlerAtk][battlerDef][moveIndex] = moveAccuracySwitchout[moveIndex]; + } +} + // AI Score Functions // AI_FLAG_CHECK_BAD_MOVE - decreases move scores static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { // move data - s8 atkPriority = GetMovePriority(battlerAtk, move); - u32 moveEffect = gMovesInfo[move].effect; + s8 atkPriority = GetBattleMovePriority(battlerAtk, move); + u32 moveEffect = GetMoveEffect(move); s32 moveType; u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); struct AiLogicData *aiData = AI_DATA; - u32 effectiveness = aiData->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; + uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); u32 i; u32 weather; @@ -722,9 +847,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; SetTypeBeforeUsingMove(move, battlerAtk); - moveType = GetMoveType(move); + moveType = GetBattleMoveType(move); - if (gMovesInfo[move].powderMove && !IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) + if (IsPowderMove(move) && !IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) RETURN_SCORE_MINUS(10); if (IsSemiInvulnerable(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move)) @@ -733,17 +858,15 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsTwoTurnNotSemiInvulnerableMove(battlerAtk, move) && CanTargetFaintAi(battlerDef, battlerAtk)) RETURN_SCORE_MINUS(10); - if (gBattleStruct->commandingDondozo & (1u << battlerDef)) + if (gBattleStruct->battlerState[battlerDef].commandingDondozo) RETURN_SCORE_MINUS(20); - // check if negates type - switch (effectiveness) + if (effectiveness == UQ_4_12(0.0)) { - case AI_EFFECTIVENESS_x0: RETURN_SCORE_MINUS(20); - break; - case AI_EFFECTIVENESS_x0_125: - case AI_EFFECTIVENESS_x0_25: + } + else if (effectiveness < UQ_4_12(0.5)) + { switch (moveEffect) { case EFFECT_FIXED_DAMAGE_ARG: @@ -762,19 +885,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) default: RETURN_SCORE_MINUS(10); } - break; } // check non-user target if (!(moveTarget & MOVE_TARGET_USER)) { // target ability checks - if (!DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) + if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { - if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef])) + if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], ABILITY_CHECK_TRIGGER)) RETURN_SCORE_MINUS(20); - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType)) + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, ABILITY_CHECK_TRIGGER)) RETURN_SCORE_MINUS(20); switch (aiData->abilities[battlerDef]) @@ -795,20 +917,20 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case ABILITY_WONDER_GUARD: - if (effectiveness < AI_EFFECTIVENESS_x2) + if (effectiveness < UQ_4_12(2.0)) RETURN_SCORE_MINUS(20); break; case ABILITY_JUSTIFIED: - if (moveType == TYPE_DARK && !IS_MOVE_STATUS(move)) + if (moveType == TYPE_DARK && !IsBattleMoveStatus(move)) RETURN_SCORE_MINUS(10); break; case ABILITY_RATTLED: - if (!IS_MOVE_STATUS(move) + if (!IsBattleMoveStatus(move) && (moveType == TYPE_DARK || moveType == TYPE_GHOST || moveType == TYPE_BUG)) RETURN_SCORE_MINUS(10); break; case ABILITY_AROMA_VEIL: - if (IsAromaVeilProtectedMove(move)) + if (IsAromaVeilProtectedEffect(moveEffect)) RETURN_SCORE_MINUS(10); break; case ABILITY_SWEET_VEIL: @@ -820,7 +942,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); break; case ABILITY_MAGIC_BOUNCE: - if (gMovesInfo[move].magicCoatAffected) + if (MoveCanBeBouncedBack(move)) RETURN_SCORE_MINUS(20); break; case ABILITY_CONTRARY: @@ -861,11 +983,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); break; case ABILITY_SHIELDS_DOWN: - if (IsShieldsDownProtected(battlerAtk) && IsNonVolatileStatusMoveEffect(moveEffect)) + if (IsShieldsDownProtected(battlerAtk, aiData->abilities[battlerAtk]) && IsNonVolatileStatusMoveEffect(moveEffect)) RETURN_SCORE_MINUS(10); break; case ABILITY_LEAF_GUARD: - if ((AI_GetWeather(aiData) & B_WEATHER_SUN) + if ((AI_GetWeather() & B_WEATHER_SUN) && aiData->holdEffects[battlerDef] != HOLD_EFFECT_UTILITY_UMBRELLA && IsNonVolatileStatusMoveEffect(moveEffect)) RETURN_SCORE_MINUS(10); @@ -875,21 +997,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // target partner ability checks & not attacking partner if (isDoubleBattle) { - if (CanPartnerAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[BATTLE_PARTNER(battlerDef)])) - RETURN_SCORE_MINUS(20); - switch (aiData->abilities[BATTLE_PARTNER(battlerDef)]) { case ABILITY_LIGHTNING_ROD: - if (moveType == TYPE_ELECTRIC && !IsMoveRedirectionPrevented(move, aiData->abilities[battlerAtk])) + if (moveType == TYPE_ELECTRIC && !IsMoveRedirectionPrevented(battlerAtk, move, aiData->abilities[battlerAtk])) RETURN_SCORE_MINUS(20); break; case ABILITY_STORM_DRAIN: - if (moveType == TYPE_WATER && !IsMoveRedirectionPrevented(move, aiData->abilities[battlerAtk])) + if (moveType == TYPE_WATER && !IsMoveRedirectionPrevented(battlerAtk, move, aiData->abilities[battlerAtk])) RETURN_SCORE_MINUS(20); break; case ABILITY_MAGIC_BOUNCE: - if (gMovesInfo[move].magicCoatAffected && moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD)) + if (MoveCanBeBouncedBack(move) && moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD)) RETURN_SCORE_MINUS(20); break; case ABILITY_SWEET_VEIL: @@ -901,7 +1020,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); break; case ABILITY_AROMA_VEIL: - if (IsAromaVeilProtectedMove(move)) + if (IsAromaVeilProtectedEffect(moveEffect)) RETURN_SCORE_MINUS(10); break; } @@ -910,7 +1029,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // gen7+ dark type mons immune to priority->elevated moves from prankster if (B_PRANKSTER_DARK_TYPES >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) - && aiData->abilities[battlerAtk] == ABILITY_PRANKSTER && IS_MOVE_STATUS(move) + && aiData->abilities[battlerAtk] == ABILITY_PRANKSTER && IsBattleMoveStatus(move) && !(moveTarget & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER))) RETURN_SCORE_MINUS(10); @@ -936,26 +1055,27 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // the following checks apply to any target (including user) // throat chop check - if (gDisableStructs[battlerAtk].throatChopTimer && gMovesInfo[move].soundMove) + if (gDisableStructs[battlerAtk].throatChopTimer && IsSoundMove(move)) return 0; // Can't even select move at all // heal block check if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(battlerAtk, move)) return 0; // Can't even select heal blocked move // primal weather check - weather = AI_GetWeather(aiData); + weather = AI_GetWeather(); if (weather & B_WEATHER_PRIMAL_ANY) { - switch (move) + switch (moveEffect) { - case MOVE_SUNNY_DAY: - case MOVE_RAIN_DANCE: - case MOVE_HAIL: - case MOVE_SANDSTORM: + case EFFECT_SUNNY_DAY: + case EFFECT_RAIN_DANCE: + case EFFECT_HAIL: + case EFFECT_SNOWSCAPE: + case EFFECT_SANDSTORM: RETURN_SCORE_MINUS(30); } - if (!IS_MOVE_STATUS(move)) + if (!IsBattleMoveStatus(move)) { if (weather & B_WEATHER_SUN_PRIMAL) { @@ -974,7 +1094,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (moveEffect) { case EFFECT_HIT: // only applies to Vital Throw - if (gMovesInfo[move].priority < 0 && AI_IsFaster(battlerAtk, battlerDef, move) && aiData->hpPercents[battlerAtk] < 40) + if (GetBattleMovePriority(battlerAtk, move) < 0 && AI_IsFaster(battlerAtk, battlerDef, move) && aiData->hpPercents[battlerAtk] < 40) ADJUST_SCORE(-2); // don't want to move last break; default: @@ -982,16 +1102,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_SLEEP: if (!AI_CanPutToSleep(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, aiData->partnerMove)) ADJUST_SCORE(-10); + if (PartnerMoveActivatesSleepClause(aiData->partnerMove)) + ADJUST_SCORE(-20); break; case EFFECT_EXPLOSION: if (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE)) ADJUST_SCORE(-2); - if (effectiveness == AI_EFFECTIVENESS_x0) + if (effectiveness == UQ_4_12(0.0)) { ADJUST_SCORE(-10); } - else if (IsAbilityOnField(ABILITY_DAMP) && !DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) + else if (IsAbilityOnField(ABILITY_DAMP) && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { ADJUST_SCORE(-10); } @@ -1230,36 +1352,36 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // stat lowering effects case EFFECT_ATTACK_DOWN: case EFFECT_ATTACK_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) ADJUST_SCORE(-10); else if (aiData->abilities[battlerDef] == ABILITY_HYPER_CUTTER) ADJUST_SCORE(-10); break; case EFFECT_DEFENSE_DOWN: case EFFECT_DEFENSE_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_DEF)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_DEF)) ADJUST_SCORE(-10); break; case EFFECT_SPEED_DOWN: case EFFECT_SPEED_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) ADJUST_SCORE(-10); else if (aiData->abilities[battlerDef] == ABILITY_SPEED_BOOST) ADJUST_SCORE(-10); break; case EFFECT_SPECIAL_ATTACK_DOWN: case EFFECT_SPECIAL_ATTACK_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) ADJUST_SCORE(-10); break; case EFFECT_SPECIAL_DEFENSE_DOWN: case EFFECT_SPECIAL_DEFENSE_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPDEF)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPDEF)) ADJUST_SCORE(-10); break; case EFFECT_ACCURACY_DOWN: case EFFECT_ACCURACY_DOWN_2: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ACC)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ACC)) ADJUST_SCORE(-10); else if (aiData->abilities[battlerDef] == ABILITY_KEEN_EYE || aiData->abilities[battlerDef] == ABILITY_MINDS_EYE || (B_ILLUMINATE_EFFECT >= GEN_9 && aiData->abilities[battlerDef] == ABILITY_ILLUMINATE)) @@ -1268,9 +1390,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_EVASION_DOWN: case EFFECT_EVASION_DOWN_2: case EFFECT_TICKLE: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_DEF)) + else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_DEF)) ADJUST_SCORE(-8); break; case EFFECT_VENOM_DRENCH: @@ -1280,18 +1402,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) + else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) ADJUST_SCORE(-8); - else if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) ADJUST_SCORE(-6); } break; case EFFECT_NOBLE_ROAR: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) ADJUST_SCORE(-8); break; case EFFECT_CAPTIVATE: @@ -1322,7 +1444,15 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_FIXED_DAMAGE_ARG: case EFFECT_FOCUS_PUNCH: // AI_CBM_HighRiskForDamage - if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < AI_EFFECTIVENESS_x2) + if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) + ADJUST_SCORE(-10); + if (HasDamagingMove(battlerDef) && !((gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE) + || IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) + || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION))) + ADJUST_SCORE(-10); + if (HasMoveEffect(battlerAtk, EFFECT_SUBSTITUTE) && !(gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE)) + ADJUST_SCORE(-10); + if (HasMoveEffect(battlerAtk, EFFECT_SLEEP) && ! (gBattleMons[battlerDef].status1 & STATUS1_SLEEP)) ADJUST_SCORE(-10); break; case EFFECT_COUNTER: @@ -1344,7 +1474,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_TOXIC_THREAD: - if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) + if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_SPEED)) ADJUST_SCORE(-1); // may still want to just poison //fallthrough case EFFECT_POISON: @@ -1661,7 +1791,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - if (AtMaxHp(battlerAtk)) + if (AI_BattlerAtMaxHp(battlerAtk)) ADJUST_SCORE(-10); else if (aiData->hpPercents[battlerAtk] >= 80) ADJUST_SCORE(-5); // do it if nothing better @@ -1694,8 +1824,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!isDoubleBattle || !IsBattlerAlive(BATTLE_PARTNER(battlerAtk)) || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) - || (aiData->partnerMove != MOVE_NONE && IS_MOVE_STATUS(aiData->partnerMove)) - || *(gBattleStruct->monToSwitchIntoId + BATTLE_PARTNER(battlerAtk)) != PARTY_SIZE) //Partner is switching out. + || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove)) + || gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battlerAtk)] != PARTY_SIZE) //Partner is switching out. ADJUST_SCORE(-10); break; case EFFECT_TRICK: @@ -1759,7 +1889,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_STRENGTH_SAP: if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) ADJUST_SCORE(-10); break; case EFFECT_COPYCAT: @@ -1790,17 +1920,17 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_CONVERSION: //Check first move type - if (IS_BATTLER_OF_TYPE(battlerAtk, gMovesInfo[gBattleMons[battlerAtk].moves[0]].type)) + if (IS_BATTLER_OF_TYPE(battlerAtk, GetMoveType(gBattleMons[battlerAtk].moves[0]))) ADJUST_SCORE(-10); break; case EFFECT_REST: - if (!CanBeSlept(battlerAtk, aiData->abilities[battlerAtk])) + if (!CanBeSlept(battlerAtk, aiData->abilities[battlerAtk], NOT_BLOCKED_BY_SLEEP_CLAUSE)) ADJUST_SCORE(-10); //fallthrough case EFFECT_RESTORE_HP: case EFFECT_SOFTBOILED: case EFFECT_ROOST: - if (AtMaxHp(battlerAtk)) + if (AI_BattlerAtMaxHp(battlerAtk)) ADJUST_SCORE(-10); else if (aiData->hpPercents[battlerAtk] >= 90) ADJUST_SCORE(-9); //No point in healing, but should at least do it if nothing better @@ -1808,9 +1938,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_MORNING_SUN: case EFFECT_SYNTHESIS: case EFFECT_MOONLIGHT: - if ((AI_GetWeather(aiData) & (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_HAIL | B_WEATHER_SNOW | B_WEATHER_FOG))) + if ((AI_GetWeather() & (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_HAIL | B_WEATHER_SNOW | B_WEATHER_FOG))) ADJUST_SCORE(-3); - else if (AtMaxHp(battlerAtk)) + else if (AI_BattlerAtMaxHp(battlerAtk)) ADJUST_SCORE(-10); else if (aiData->hpPercents[battlerAtk] >= 90) ADJUST_SCORE(-9); //No point in healing, but should at least do it if nothing better @@ -1820,7 +1950,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); else if (battlerDef == BATTLE_PARTNER(battlerAtk)) break; //Always heal your ally - else if (AtMaxHp(battlerAtk)) + else if (AI_BattlerAtMaxHp(battlerAtk)) ADJUST_SCORE(-10); else if (aiData->hpPercents[battlerAtk] >= 90) ADJUST_SCORE(-8); //No point in healing, but should at least do it if nothing better @@ -1873,13 +2003,15 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_DESTINY_BOND: + if (DoesDestinyBondFail(battlerAtk)) + ADJUST_SCORE(-10); if (gBattleMons[battlerDef].status2 & STATUS2_DESTINY_BOND) ADJUST_SCORE(-10); else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) ADJUST_SCORE(-10); break; case EFFECT_HEAL_BELL: - if (!AnyPartyMemberStatused(battlerAtk, gMovesInfo[move].soundMove) || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (!AnyPartyMemberStatused(battlerAtk, IsSoundMove(move)) || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_ENDURE: @@ -1962,8 +2094,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_DEFOG: if (gSideStatuses[GetBattlerSide(battlerDef)] - & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) - || gSideTimers[GetBattlerSide(battlerDef)].auroraVeilTimer != 0 + & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) || gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY) { if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) @@ -1981,7 +2112,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (isDoubleBattle) { - if (IsHazardMoveEffect(gMovesInfo[aiData->partnerMove].effect) // partner is going to set up hazards + if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove)) // partner is going to set up before the potential Defog { ADJUST_SCORE(-10); @@ -2011,11 +2142,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_SEMI_INVULNERABLE: if (predictedMove != MOVE_NONE && AI_IsSlower(battlerAtk, battlerDef, move) - && gMovesInfo[predictedMove].effect == EFFECT_SEMI_INVULNERABLE) + && GetMoveEffect(predictedMove) == EFFECT_SEMI_INVULNERABLE) ADJUST_SCORE(-10); // Don't Fly/dig/etc if opponent is going to fly/dig/etc after you if (BattlerWillFaintFromWeather(battlerAtk, aiData->abilities[battlerAtk]) - && (move == MOVE_FLY || move == MOVE_BOUNCE)) + && GetMoveTwoTurnAttackStatus(move) == STATUS3_ON_AIR) ADJUST_SCORE(-10); // Attacker will faint while in the air break; case EFFECT_HEALING_WISH: //healing wish, lunar dance @@ -2061,7 +2192,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-4); break; case EFFECT_WISH: - if (gWishFutureKnock.wishCounter[battlerAtk] != 0) + if (gWishFutureKnock.wishCounter[battlerAtk] > gBattleTurnCounter) ADJUST_SCORE(-10); break; case EFFECT_ASSIST: @@ -2077,6 +2208,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); else if (!AI_CanPutToSleep(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, aiData->partnerMove)) ADJUST_SCORE(-10); + if (PartnerMoveActivatesSleepClause(aiData->partnerMove)) + ADJUST_SCORE(-20); break; case EFFECT_SKILL_SWAP: if (aiData->abilities[battlerAtk] == ABILITY_NONE || aiData->abilities[battlerDef] == ABILITY_NONE @@ -2239,7 +2372,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (isDoubleBattle && gBattleMons[BATTLE_PARTNER(battlerAtk)].hp > 0) { if (aiData->partnerMove != MOVE_NONE - && gMovesInfo[aiData->partnerMove].effect == EFFECT_PLEDGE + && GetMoveEffect(aiData->partnerMove) == EFFECT_PLEDGE && move != aiData->partnerMove) // Different pledge moves { if (gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) @@ -2249,7 +2382,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_TRICK_ROOM: - if (PartnerMoveIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, MOVE_TRICK_ROOM)) + if (PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_TRICK_ROOM)) { ADJUST_SCORE(-10); } @@ -2347,24 +2480,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_SOAK: + { + u32 types[3]; + GetBattlerTypes(battlerDef, FALSE, types); + // TODO: Use the type of the move like 'VARIOUS_TRY_SOAK'? if (PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) - || (GetBattlerType(battlerDef, 0, FALSE) == TYPE_WATER - && GetBattlerType(battlerDef, 1, FALSE) == TYPE_WATER - && GetBattlerType(battlerDef, 2, FALSE) == TYPE_MYSTERY)) + || (types[0] == TYPE_WATER && types[1] == TYPE_WATER && types[2] == TYPE_MYSTERY)) ADJUST_SCORE(-10); // target is already water-only break; + } case EFFECT_THIRD_TYPE: - switch (move) - { - case MOVE_TRICK_OR_TREAT: - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) || GetActiveGimmick(battlerDef) == GIMMICK_TERA) - ADJUST_SCORE(-10); - break; - case MOVE_FORESTS_CURSE: - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) || GetActiveGimmick(battlerDef) == GIMMICK_TERA) - ADJUST_SCORE(-10); - break; - } + if (IS_BATTLER_OF_TYPE(battlerDef, GetMoveArgType(move)) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) || GetActiveGimmick(battlerDef) == GIMMICK_TERA) + ADJUST_SCORE(-10); break; case EFFECT_HEAL_PULSE: // and floral healing if (!IS_TARGETING_PARTNER(battlerAtk, battlerDef)) // Don't heal enemies @@ -2378,7 +2505,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK) return 0; // cannot even select - if (AtMaxHp(battlerDef)) + if (AI_BattlerAtMaxHp(battlerDef)) ADJUST_SCORE(-10); else if (gBattleMons[battlerDef].hp > gBattleMons[battlerDef].maxHP / 2) ADJUST_SCORE(-5); @@ -2409,6 +2536,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: ADJUST_SCORE(-10); break; case EFFECT_INSTRUCT: @@ -2420,7 +2550,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) instructedMove = gLastMoves[battlerDef]; if (instructedMove == MOVE_NONE - || gMovesInfo[instructedMove].instructBanned + || IsMoveInstructBanned(instructedMove) || MoveHasAdditionalEffectSelf(instructedMove, MOVE_EFFECT_RECHARGE) || IsZMove(instructedMove) || (gLockedMoves[battlerDef] != 0 && gLockedMoves[battlerDef] != 0xFFFF) @@ -2467,18 +2597,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_SUCKER_PUNCH: if (predictedMove != MOVE_NONE) { - if (IS_MOVE_STATUS(predictedMove) || AI_IsSlower(battlerAtk, battlerDef, move)) // Opponent going first + if (IsBattleMoveStatus(predictedMove) || AI_IsSlower(battlerAtk, battlerDef, move)) // Opponent going first ADJUST_SCORE(-10); } break; case EFFECT_TAILWIND: - if (gSideTimers[GetBattlerSide(battlerAtk)].tailwindTimer != 0 - || PartnerMoveIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, MOVE_TAILWIND) - || (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 1)) // Trick Room active and not ending this turn + if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_TAILWIND + || PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_TAILWIND) + || gFieldStatuses & STATUS_FIELD_TRICK_ROOM) ADJUST_SCORE(-10); break; case EFFECT_LUCKY_CHANT: - if (gSideTimers[GetBattlerSide(battlerAtk)].luckyChantTimer != 0 + if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_LUCKY_CHANT || PartnerMoveIsSameNoTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; @@ -2542,17 +2672,16 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_JUNGLE_HEALING: - if (AtMaxHp(battlerAtk) - && AtMaxHp(BATTLE_PARTNER(battlerAtk)) + if (AI_BattlerAtMaxHp(battlerAtk) + && AI_BattlerAtMaxHp(BATTLE_PARTNER(battlerAtk)) && !(gBattleMons[battlerAtk].status1 & STATUS1_ANY) && !(gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_ANY)) ADJUST_SCORE(-10); break; case EFFECT_TAKE_HEART: if ((!(gBattleMons[battlerAtk].status1 & STATUS1_ANY) - || PartnerMoveIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, MOVE_JUNGLE_HEALING) - || PartnerMoveIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, MOVE_HEAL_BELL) - || PartnerMoveIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, MOVE_AROMATHERAPY)) + || PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_JUNGLE_HEALING) + || PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_HEAL_BELL)) && !BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK) && !BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPDEF)) ADJUST_SCORE(-10); @@ -2566,7 +2695,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_UPPER_HAND: - if (predictedMove == MOVE_NONE || IS_MOVE_STATUS(predictedMove) || AI_IsSlower(battlerAtk, battlerDef, move) || GetMovePriority(battlerDef, predictedMove) < 1 || GetMovePriority(battlerDef, predictedMove) > 3) // Opponent going first or not using priority move + if (predictedMove == MOVE_NONE || IsBattleMoveStatus(predictedMove) || AI_IsSlower(battlerAtk, battlerDef, move) || GetBattleMovePriority(battlerDef, predictedMove) < 1 || GetBattleMovePriority(battlerDef, predictedMove) > 3) // Opponent going first or not using priority move ADJUST_SCORE(-10); break; case EFFECT_PLACEHOLDER: @@ -2579,7 +2708,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Don't use user-target moves ie. Swords Dance, with exceptions if ((moveTarget & MOVE_TARGET_USER) && moveEffect != EFFECT_DESTINY_BOND && moveEffect != EFFECT_WISH && moveEffect != EFFECT_HEALING_WISH - && !(moveEffect == EFFECT_AURORA_VEIL && (AI_GetWeather(aiData) & (B_WEATHER_SNOW | B_WEATHER_HAIL)))) + && !(moveEffect == EFFECT_AURORA_VEIL && (AI_GetWeather() & (B_WEATHER_SNOW | B_WEATHER_HAIL)))) ADJUST_SCORE(-30); // Don't use a status move if the mon is the last one in the party, has no good switchin, or is trapped else if (GetBattleMoveCategory(move) == DAMAGE_CATEGORY_STATUS @@ -2602,10 +2731,10 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) return score; - if (IS_MOVE_STATUS(move)) + if (IsBattleMoveStatus(move)) return score; // status moves aren't accounted here - if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, 0) && gMovesInfo[move].effect != EFFECT_EXPLOSION) + if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, 0) && GetMoveEffect(move) != EFFECT_EXPLOSION) { if (AI_IsFaster(battlerAtk, battlerDef, move)) ADJUST_SCORE(FAST_KILL); @@ -2614,7 +2743,7 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else if (CanTargetFaintAi(battlerDef, battlerAtk) && GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) != AI_IS_FASTER - && GetMovePriority(battlerAtk, move) > 0) + && GetBattleMovePriority(battlerAtk, move) > 0) { ADJUST_SCORE(LAST_CHANCE); } @@ -2626,29 +2755,30 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { // move data - u32 moveType = gMovesInfo[move].type; - u32 effect = gMovesInfo[move].effect; + u32 moveType = GetMoveType(move); + u32 effect = GetMoveEffect(move); u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); // ally data u32 battlerAtkPartner = BATTLE_PARTNER(battlerAtk); struct AiLogicData *aiData = AI_DATA; u32 atkPartnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; u32 atkPartnerHoldEffect = aiData->holdEffects[BATTLE_PARTNER(battlerAtk)]; - bool32 partnerProtecting = (gMovesInfo[aiData->partnerMove].effect == EFFECT_PROTECT); + u32 partnerEffect = GetMoveEffect(aiData->partnerMove); + bool32 partnerProtecting = (partnerEffect == EFFECT_PROTECT); bool32 attackerHasBadAbility = (gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating < 0); bool32 partnerHasBadAbility = (gAbilitiesInfo[atkPartnerAbility].aiRating < 0); u32 predictedMove = aiData->lastUsedMove[battlerDef]; SetTypeBeforeUsingMove(move, battlerAtk); - moveType = GetMoveType(move); + moveType = GetBattleMoveType(move); // check what effect partner is using if (aiData->partnerMove != 0) { - switch (gMovesInfo[aiData->partnerMove].effect) + switch (partnerEffect) { case EFFECT_HELPING_HAND: - if (IS_MOVE_STATUS(move)) + if (IsBattleMoveStatus(move)) ADJUST_SCORE(-7); break; case EFFECT_PERISH_SONG: @@ -2672,7 +2802,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // check partner move effect // Adjust for always crit moves - if (gMovesInfo[aiData->partnerMove].alwaysCriticalHit && aiData->abilities[battlerAtk] == ABILITY_ANGER_POINT) + if (MoveAlwaysCrits(aiData->partnerMove) && aiData->abilities[battlerAtk] == ABILITY_ANGER_POINT) { if (AI_IsSlower(battlerAtk, battlerAtkPartner, move)) // Partner moving first { @@ -2680,7 +2810,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsAttackBoostMoveEffect(effect)) ADJUST_SCORE(-3); // encourage moves hitting multiple opponents - if (!IS_MOVE_STATUS(move) && (moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) + if (!IsBattleMoveStatus(move) && (moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) ADJUST_SCORE(GOOD_EFFECT); } } @@ -2699,7 +2829,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_MAGNET_RISE: if (IsBattlerGrounded(battlerAtk) && (HasMove(battlerAtkPartner, MOVE_EARTHQUAKE) || HasMove(battlerAtkPartner, MOVE_MAGNITUDE)) - && (AI_GetMoveEffectiveness(MOVE_EARTHQUAKE, battlerAtk, battlerAtkPartner) != AI_EFFECTIVENESS_x0)) // Doesn't resist ground move + && (AI_GetMoveEffectiveness(MOVE_EARTHQUAKE, battlerAtk, battlerAtkPartner) != UQ_4_12(0.0))) // Doesn't resist ground move { RETURN_SCORE_PLUS(DECENT_EFFECT); // partner has earthquake or magnitude -> good idea to use magnet rise } @@ -2709,7 +2839,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-5); else if (atkPartnerHoldEffect == HOLD_EFFECT_SCOPE_LENS || IS_BATTLER_OF_TYPE(battlerAtkPartner, TYPE_DRAGON) - || gMovesInfo[aiData->partnerMove].criticalHitStage > 0 + || GetMoveCriticalHitStage(aiData->partnerMove) > 0 || HasMoveWithCriticalHitChance(battlerAtkPartner)) ADJUST_SCORE(GOOD_EFFECT); break; @@ -2757,12 +2887,12 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) { // partner ability checks - if (!partnerProtecting && moveTarget != MOVE_TARGET_BOTH && !DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) + if (!partnerProtecting && moveTarget != MOVE_TARGET_BOTH && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { switch (atkPartnerAbility) { case ABILITY_ANGER_POINT: - if (gMovesInfo[move].alwaysCriticalHit == TRUE + if (MoveAlwaysCrits(move) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) && AI_IsFaster(battlerAtk, battlerAtkPartner, move) && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, 1)) @@ -2818,7 +2948,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_FLASH_FIRE: if (moveType == TYPE_FIRE && HasMoveWithType(battlerAtkPartner, TYPE_FIRE) - && !(gBattleResources->flags->flags[battlerAtkPartner] & RESOURCE_FLAG_FLASH_FIRE)) + && !gDisableStructs[battlerAtkPartner].flashFireBoosted) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -2833,7 +2963,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case ABILITY_JUSTIFIED: if (moveType == TYPE_DARK - && !IS_MOVE_STATUS(move) + && !IsBattleMoveStatus(move) && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, 1)) @@ -2842,7 +2972,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case ABILITY_RATTLED: - if (!IS_MOVE_STATUS(move) + if (!IsBattleMoveStatus(move) && (moveType == TYPE_DARK || moveType == TYPE_GHOST || moveType == TYPE_BUG) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_SPEED) && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, 1)) @@ -2899,7 +3029,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_BEAT_UP: if (atkPartnerAbility == ABILITY_JUSTIFIED && moveType == TYPE_DARK - && !IS_MOVE_STATUS(move) + && !IsBattleMoveStatus(move) && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, 0)) @@ -2969,7 +3099,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) instructedMove = gLastMoves[battlerAtkPartner]; if (instructedMove != MOVE_NONE - && !IS_MOVE_STATUS(instructedMove) + && !IsBattleMoveStatus(instructedMove) && (GetBattlerMoveTargetType(battlerAtkPartner, instructedMove) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) // Use instruct on multi-target moves { RETURN_SCORE_PLUS(WEAK_EFFECT); @@ -2980,7 +3110,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (AI_IsSlower(battlerAtkPartner, FOE(battlerAtkPartner), aiData->partnerMove) // Opponent mon 1 goes before partner || AI_IsSlower(battlerAtkPartner, BATTLE_PARTNER(FOE(battlerAtkPartner)), aiData->partnerMove)) // Opponent mon 2 goes before partner { - if (gMovesInfo[aiData->partnerMove].effect == EFFECT_COUNTER || gMovesInfo[aiData->partnerMove].effect == EFFECT_MIRROR_COAT) + if (partnerEffect == EFFECT_COUNTER || partnerEffect == EFFECT_MIRROR_COAT) break; // These moves need to go last RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3054,7 +3184,7 @@ static inline bool32 ShouldUseSpreadDamageMove(u32 battlerAtk, u32 move, u32 mov return (IsDoubleBattle() && noOfHitsToFaintPartner != 0 // Immunity check && IsBattlerAlive(partnerBattler) - && gMovesInfo[move].target == MOVE_TARGET_FOES_AND_ALLY + && GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY && !(noOfHitsToFaintPartner < 4 && hitsToFaintOpposingBattler == 1) && noOfHitsToFaintPartner < 7); } @@ -3073,7 +3203,7 @@ static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId) for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && gMovesInfo[moves[i]].power) + if (moves[i] != MOVE_NONE && GetMovePower(moves[i]) != 0) { noOfHits[i] = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, i); if (ShouldUseSpreadDamageMove(battlerAtk,moves[i], i, noOfHits[i])) @@ -3162,30 +3292,59 @@ static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId) return score; } +static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) +{ + struct AiLogicData *aiData = AI_DATA; + u32 holdEffect = aiData->holdEffects[battlerAtk]; + + s32 score = 0; + + switch (holdEffect) + { + case HOLD_EFFECT_BLUNDER_POLICY: + { + u32 moveAcc = aiData->moveAccuracy[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; + + if (moveAcc <= LOW_ACCURACY_THRESHOLD) + { + ADJUST_SCORE(GOOD_EFFECT); + } + else + { + ADJUST_SCORE(-DECENT_EFFECT); + } + } + break; + } + + return score; +} + static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { // move data - u32 moveEffect = gMovesInfo[move].effect; + u32 moveEffect = GetMoveEffect(move); struct AiLogicData *aiData = AI_DATA; u32 movesetIndex = AI_THINKING_STRUCT->movesetIndex; - u32 effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; + uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; s32 score = 0; u32 predictedMove = aiData->lastUsedMove[battlerDef]; + u32 predictedType = GetMoveType(predictedMove); u32 predictedMoveSlot = GetMoveSlot(GetMovesArray(battlerDef), predictedMove); bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); u32 i; // The AI should understand that while Dynamaxed, status moves function like Protect. - if (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX && gMovesInfo[move].category == DAMAGE_CATEGORY_STATUS) + if (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX && GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS) moveEffect = EFFECT_PROTECT; // check status move preference - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IS_MOVE_STATUS(move) && effectiveness != AI_EFFECTIVENESS_x0) + if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(10); // check thawing moves - if ((gBattleMons[battlerAtk].status1 & (STATUS1_FREEZE | STATUS1_FROSTBITE)) && gMovesInfo[move].thawsUser) + if ((gBattleMons[battlerAtk].status1 & (STATUS1_FREEZE | STATUS1_FROSTBITE)) && MoveThawsUser(move)) ADJUST_SCORE(10); // check burn / frostbite @@ -3204,7 +3363,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) IncreaseSleepScore(battlerAtk, battlerDef, move, &score); break; case EFFECT_ABSORB: - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT && effectiveness >= AI_EFFECTIVENESS_x1) + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT && effectiveness >= UQ_4_12(1.0)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_DREAM_EATER: @@ -3380,7 +3539,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) score += AI_TryToClearStats(battlerAtk, battlerDef, isDoubleBattle); break; case EFFECT_ROAR: - if ((gMovesInfo[move].soundMove && aiData->abilities[battlerDef] == ABILITY_SOUNDPROOF) + if ((IsSoundMove(move) && aiData->abilities[battlerDef] == ABILITY_SOUNDPROOF) || aiData->abilities[battlerDef] == ABILITY_SUCTION_CUPS) break; else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) @@ -3396,7 +3555,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(-2); break; case EFFECT_CONVERSION: - if (!IS_BATTLER_OF_TYPE(battlerAtk, gMovesInfo[gBattleMons[battlerAtk].moves[0]].type)) + if (!IS_BATTLER_OF_TYPE(battlerAtk, GetMoveType(gBattleMons[battlerAtk].moves[0]))) ADJUST_SCORE(WEAK_EFFECT); break; case EFFECT_SWALLOW: @@ -3450,7 +3609,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_REST: - if (!(CanBeSlept(battlerAtk, aiData->abilities[battlerAtk]))) + if (!(CanBeSlept(battlerAtk, aiData->abilities[battlerAtk], NOT_BLOCKED_BY_SLEEP_CLAUSE))) { break; } @@ -3462,7 +3621,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) || HasMoveEffect(EFFECT_SNORE, battlerAtk) || aiData->abilities[battlerAtk] == ABILITY_SHED_SKIN || aiData->abilities[battlerAtk] == ABILITY_EARLY_BIRD - || (AI_GetWeather(aiData) & B_WEATHER_RAIN && gWishFutureKnock.weatherDuration != 1 && aiData->abilities[battlerAtk] == ABILITY_HYDRATION && aiData->holdEffects[battlerAtk] != HOLD_EFFECT_UTILITY_UMBRELLA)) + || (AI_GetWeather() & B_WEATHER_RAIN && gWishFutureKnock.weatherDuration != 1 && aiData->abilities[battlerAtk] == ABILITY_HYDRATION && aiData->holdEffects[battlerAtk] != HOLD_EFFECT_UTILITY_UMBRELLA)) ADJUST_SCORE(GOOD_EFFECT); } break; @@ -3492,7 +3651,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_SUBSTITUTE: case EFFECT_SHED_TAIL: - IncreaseSubstituteMoveScore(battlerAtk, battlerDef, move, &score); + ADJUST_SCORE(IncreaseSubstituteMoveScore(battlerAtk, battlerDef, move)); + break; case EFFECT_MIMIC: if (AI_IsFaster(battlerAtk, battlerDef, move)) { @@ -3513,6 +3673,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: //todo - check z splash, z celebrate, z happy hour (lol) break; case EFFECT_TELEPORT: // Either remove or add better logic @@ -3569,7 +3732,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; else if (gDisableStructs[battlerDef].encoreTimer == 0 && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) - && (gBattleMoveEffects[gMovesInfo[gLastMoves[battlerDef]].effect].encourageEncore)) + && (gBattleMoveEffects[GetMoveEffect(gLastMoves[battlerDef])].encourageEncore)) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_SLEEP_TALK: @@ -3617,7 +3780,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) switch (move) { case MOVE_QUICK_GUARD: - if (predictedMove != MOVE_NONE && gMovesInfo[predictedMove].priority > 0) + if (predictedMove != MOVE_NONE && GetMovePriority(predictedMove) > 0) ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); break; case MOVE_WIDE_GUARD: @@ -3632,13 +3795,13 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case MOVE_CRAFTY_SHIELD: - if (predictedMove != MOVE_NONE && IS_MOVE_STATUS(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) + if (predictedMove != MOVE_NONE && IsBattleMoveStatus(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); break; case MOVE_MAT_BLOCK: if (gDisableStructs[battlerAtk].isFirstTurn && predictedMove != MOVE_NONE - && !IS_MOVE_STATUS(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) + && !IsBattleMoveStatus(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); break; case MOVE_KINGS_SHIELD: @@ -3786,10 +3949,11 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_SEMI_INVULNERABLE: if (predictedMove != MOVE_NONE && !isDoubleBattle) { + u32 predictedEffect = GetMoveEffect(predictedMove); if ((AI_IsFaster(battlerAtk, battlerDef, move)) - && (gMovesInfo[predictedMove].effect == EFFECT_EXPLOSION || gMovesInfo[predictedMove].effect == EFFECT_PROTECT)) + && (predictedEffect == EFFECT_EXPLOSION || predictedEffect == EFFECT_PROTECT)) ADJUST_SCORE(GOOD_EFFECT); - else if (gMovesInfo[predictedMove].effect == EFFECT_SEMI_INVULNERABLE && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) + else if (predictedEffect == EFFECT_SEMI_INVULNERABLE && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) ADJUST_SCORE(GOOD_EFFECT); } break; @@ -3844,13 +4008,6 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) //if (CountUsablePartyMons(battlerDef) != 0) //ADJUST_SCORE(8); break; - case EFFECT_PURSUIT: - // TODO - // if (IsPredictedToSwitch(battlerDef, battlerAtk)) - // ADJUST_SCORE(GOOD_EFFECT); - // else if (IsPredictedToUsePursuitableMove(battlerDef, battlerAtk) && !MoveWouldHitFirst(move, battlerAtk, battlerDef)) //Pursuit against fast U-Turn - // ADJUST_SCORE(GOOD_EFFECT); - // break; case EFFECT_DEFOG: if ((gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) || (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST))) @@ -3861,7 +4018,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { if (isDoubleBattle) { - if (IsHazardMoveEffect(gMovesInfo[aiData->partnerMove].effect) // Partner is going to set up hazards + if (IsHazardMove(aiData->partnerMove) // Partner is going to set up hazards && AI_IsSlower(battlerAtk, BATTLE_PARTNER(battlerAtk), move)) // Partner going first break; // Don't use Defog if partner is going to set up hazards } @@ -3876,13 +4033,13 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_FOLLOW_ME: if (isDoubleBattle - && move != MOVE_SPOTLIGHT + && GetMoveTarget(move) == MOVE_TARGET_USER && !IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) - && (move != MOVE_RAGE_POWDER || IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) // Rage Powder doesn't affect powder immunities + && (!IsPowderMove(move) || IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) // Rage Powder doesn't affect powder immunities && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) { u32 predictedMoveOnPartner = gLastMoves[BATTLE_PARTNER(battlerAtk)]; - if (predictedMoveOnPartner != MOVE_NONE && !IS_MOVE_STATUS(predictedMoveOnPartner)) + if (predictedMoveOnPartner != MOVE_NONE && !IsBattleMoveStatus(predictedMoveOnPartner)) ADJUST_SCORE(GOOD_EFFECT); } break; @@ -3893,7 +4050,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); break; case EFFECT_TAUNT: - if (IS_MOVE_STATUS(predictedMove)) + if (IsBattleMoveStatus(predictedMove)) ADJUST_SCORE(GOOD_EFFECT); else if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_STATUS)) ADJUST_SCORE(DECENT_EFFECT); @@ -3939,12 +4096,12 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) switch (aiData->abilities[battlerDef]) { case ABILITY_SWIFT_SWIM: - if (AI_GetWeather(aiData) & B_WEATHER_RAIN) + if (AI_GetWeather() & B_WEATHER_RAIN) ADJUST_SCORE(DECENT_EFFECT); // Slow 'em down break; case ABILITY_CHLOROPHYLL: case ABILITY_FLOWER_GIFT: - if (AI_GetWeather(aiData) & B_WEATHER_SUN) + if (AI_GetWeather() & B_WEATHER_SUN) ADJUST_SCORE(DECENT_EFFECT); // Slow 'em down break; } @@ -3957,7 +4114,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); // Force 'em out next turn break; default: - if (gMovesInfo[move].effect != EFFECT_BESTOW && aiData->items[battlerAtk] == ITEM_NONE && aiData->items[battlerDef] != ITEM_NONE) + if (GetMoveEffect(move) != EFFECT_BESTOW && aiData->items[battlerAtk] == ITEM_NONE && aiData->items[battlerDef] != ITEM_NONE) { switch (aiData->holdEffects[battlerDef]) { @@ -4018,7 +4175,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_MAGIC_COAT: - if (IS_MOVE_STATUS(predictedMove) && GetBattlerMoveTargetType(battlerDef, predictedMove) & (MOVE_TARGET_SELECTED | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_BOTH)) + if (IsBattleMoveStatus(predictedMove) && GetBattlerMoveTargetType(battlerDef, predictedMove) & (MOVE_TARGET_SELECTED | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_BOTH)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_RECYCLE: @@ -4102,7 +4259,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_GRUDGE: break; case EFFECT_SNATCH: - if (predictedMove != MOVE_NONE && gMovesInfo[predictedMove].snatchAffected) + if (predictedMove != MOVE_NONE && MoveCanBeSnatched(predictedMove)) ADJUST_SCORE(GOOD_EFFECT); // Steal move break; case EFFECT_MUD_SPORT: @@ -4269,7 +4426,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if ((aiData->abilities[battlerAtk] == ABILITY_VOLT_ABSORB || aiData->abilities[battlerAtk] == ABILITY_MOTOR_DRIVE || (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD)) - && gMovesInfo[predictedMove].type == TYPE_NORMAL) + && predictedType == TYPE_NORMAL) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_FLING: @@ -4300,7 +4457,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_POWDER: - if (predictedMove != MOVE_NONE && !IS_MOVE_STATUS(predictedMove) && gMovesInfo[predictedMove].type == TYPE_FIRE) + if (predictedMove != MOVE_NONE && !IsBattleMoveStatus(predictedMove) && predictedType == TYPE_FIRE) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TELEKINESIS: @@ -4316,7 +4473,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_SOAK: - if (HasMoveWithType(battlerAtk, TYPE_ELECTRIC) || HasMoveWithType(battlerAtk, TYPE_GRASS) || (HasMoveEffect(battlerAtk, EFFECT_SUPER_EFFECTIVE_ON_ARG) && gMovesInfo[move].argument == TYPE_WATER) ) + if (HasMoveWithType(battlerAtk, TYPE_ELECTRIC) || HasMoveWithType(battlerAtk, TYPE_GRASS) || (HasMoveEffect(battlerAtk, EFFECT_SUPER_EFFECTIVE_ON_ARG) && GetMoveArgType(move) == TYPE_WATER) ) ADJUST_SCORE(DECENT_EFFECT); // Get some super effective moves break; case EFFECT_THIRD_TYPE: @@ -4354,11 +4511,11 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_MAGNET_RISE: if (IsBattlerGrounded(battlerAtk) && HasDamagingMoveOfType(battlerDef, TYPE_ELECTRIC) - && !(AI_GetMoveEffectiveness(MOVE_EARTHQUAKE, battlerDef, battlerAtk) == AI_EFFECTIVENESS_x0)) // Doesn't resist ground move + && !(effectiveness == UQ_4_12(0.0))) // Doesn't resist ground move { if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker goes first { - if (gMovesInfo[predictedMove].type == TYPE_GROUND) + if (predictedType == TYPE_GROUND) ADJUST_SCORE(GOOD_EFFECT); // Cause the enemy's move to fail break; } @@ -4372,7 +4529,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_CAMOUFLAGE: if (predictedMove != MOVE_NONE && AI_IsFaster(battlerAtk, battlerDef, move) // Attacker goes first - && !IS_MOVE_STATUS(move) && AI_GetMoveEffectiveness(predictedMove, battlerDef, battlerAtk) != AI_EFFECTIVENESS_x0) + && !IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TOXIC_THREAD: @@ -4392,7 +4549,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SHORE_UP: - if ((AI_GetWeather(aiData) & B_WEATHER_SANDSTORM) && ShouldRecover(battlerAtk, battlerDef, move, 67)) + if ((AI_GetWeather() & B_WEATHER_SANDSTORM) && ShouldRecover(battlerAtk, battlerDef, move, 67)) ADJUST_SCORE(DECENT_EFFECT); else if (ShouldRecover(battlerAtk, battlerDef, move, 50)) ADJUST_SCORE(DECENT_EFFECT); @@ -4403,7 +4560,13 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_REVIVAL_BLESSING: if (GetFirstFaintedPartyIndex(battlerAtk) != PARTY_SIZE) + { ADJUST_SCORE(DECENT_EFFECT); + if (AI_DATA->shouldSwitch & (1u << battlerAtk)) // Bad matchup + ADJUST_SCORE(WEAK_EFFECT); + if (AI_DATA->mostSuitableMonId[battlerAtk] != PARTY_SIZE) // Good mon to send in after + ADJUST_SCORE(WEAK_EFFECT); + } break; //case EFFECT_EXTREME_EVOBOOST: // TODO //break; @@ -4429,28 +4592,30 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; } // move effect checks + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); // check move additional effects that are likely to happen - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + for (i = 0; i < additionalEffectCount; i++) { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); // Only consider effects with a guaranteed chance to happen - if (!MoveEffectIsGuaranteed(battlerAtk, aiData->abilities[battlerAtk], &gMovesInfo[move].additionalEffects[i])) + if (!MoveEffectIsGuaranteed(battlerAtk, aiData->abilities[battlerAtk], additionalEffect)) continue; // Consider move effects that target self - if (gMovesInfo[move].additionalEffects[i].self) + if (additionalEffect->self) { u32 StageStatId; if (aiData->abilities[battlerAtk] != ABILITY_CONTRARY) { - switch (gMovesInfo[move].additionalEffects[i].moveEffect) + switch (additionalEffect->moveEffect) { case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_DEF_PLUS_1: case MOVE_EFFECT_SPD_PLUS_1: case MOVE_EFFECT_SP_ATK_PLUS_1: case MOVE_EFFECT_SP_DEF_PLUS_1: - StageStatId = STAT_CHANGE_ATK + gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_PLUS_1; + StageStatId = STAT_CHANGE_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_PLUS_1; ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, StageStatId)); break; case MOVE_EFFECT_ATK_PLUS_2: @@ -4458,7 +4623,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case MOVE_EFFECT_SPD_PLUS_2: case MOVE_EFFECT_SP_ATK_PLUS_2: case MOVE_EFFECT_SP_DEF_PLUS_2: - StageStatId = STAT_CHANGE_ATK_2 + gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_PLUS_1; + StageStatId = STAT_CHANGE_ATK_2 + additionalEffect->moveEffect - MOVE_EFFECT_ATK_PLUS_1; ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, StageStatId)); break; case MOVE_EFFECT_ACC_PLUS_1: @@ -4473,14 +4638,14 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } else { - switch (gMovesInfo[move].additionalEffects[i].moveEffect) + switch (additionalEffect->moveEffect) { case MOVE_EFFECT_ATK_MINUS_1: case MOVE_EFFECT_DEF_MINUS_1: case MOVE_EFFECT_SPD_MINUS_1: case MOVE_EFFECT_SP_ATK_MINUS_1: case MOVE_EFFECT_SP_DEF_MINUS_1: - StageStatId = STAT_CHANGE_ATK + gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_1; + StageStatId = STAT_CHANGE_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1; ADJUST_SCORE(IncreaseStatUpScoreContrary(battlerAtk, battlerDef, StageStatId)); break; case MOVE_EFFECT_ATK_MINUS_2: @@ -4488,7 +4653,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case MOVE_EFFECT_SPD_MINUS_2: case MOVE_EFFECT_SP_ATK_MINUS_2: case MOVE_EFFECT_SP_DEF_MINUS_2: - StageStatId = STAT_CHANGE_ATK + gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_2; + StageStatId = STAT_CHANGE_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2; ADJUST_SCORE(IncreaseStatUpScoreContrary(battlerAtk, battlerDef, StageStatId)); break; case MOVE_EFFECT_ACC_MINUS_1: @@ -4517,7 +4682,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } else // consider move effects that hinder the target { - switch (gMovesInfo[move].additionalEffects[i].moveEffect) + switch (additionalEffect->moveEffect) { case MOVE_EFFECT_FLINCH: score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move); @@ -4647,11 +4812,11 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case MOVE_EFFECT_FEINT: - if (gMovesInfo[predictedMove].effect == EFFECT_PROTECT) + if (GetMoveEffect(predictedMove) == EFFECT_PROTECT) ADJUST_SCORE(GOOD_EFFECT); break; case MOVE_EFFECT_THROAT_CHOP: - if (gMovesInfo[GetBestDmgMoveFromBattler(battlerDef, battlerAtk)].soundMove) + if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk))) { if (AI_IsFaster(battlerAtk, battlerDef, move)) ADJUST_SCORE(GOOD_EFFECT); @@ -4682,13 +4847,14 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) return score; - if (gMovesInfo[move].power) + if (GetMovePower(move) != 0) { if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex) == 0) ADJUST_AND_RETURN_SCORE(NO_DAMAGE_OR_FAILS); // No point in checking the move further so return early else { - if ((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY) && GetBestDmgMoveFromBattler(battlerAtk, battlerDef) == move) + if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE) + && GetBestDmgMoveFromBattler(battlerAtk, battlerDef) == move) ADJUST_SCORE(BEST_DAMAGE_MOVE); else ADJUST_SCORE(AI_CompareDamagingMoves(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex)); @@ -4696,6 +4862,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score } ADJUST_SCORE(AI_CalcMoveEffectScore(battlerAtk, battlerDef, move)); + ADJUST_SCORE(AI_CalcHoldEffectMoveScore(battlerAtk, battlerDef, move)); return score; } @@ -4711,13 +4878,13 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING && AI_IsSlower(battlerAtk, battlerDef, move) && CanTargetFaintAi(battlerDef, battlerAtk) - && GetMovePriority(battlerAtk, move) == 0) + && GetBattleMovePriority(battlerAtk, move) == 0) { RETURN_SCORE_MINUS(20); // No point in setting up if you will faint. Should just switch if possible.. } // check effects to prioritize first turn - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_ATTACK_UP: case EFFECT_ATTACK_UP_USER_ALLY: @@ -4809,9 +4976,11 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 { // TEMPORARY - should applied to all moves regardless of EFFECT // Consider move effects - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + for (i = 0; i < additionalEffectCount; i++) { - switch (gMovesInfo[move].additionalEffects[i].moveEffect) + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + switch (additionalEffect->moveEffect) { case MOVE_EFFECT_STEALTH_ROCK: case MOVE_EFFECT_SPIKES: @@ -4838,11 +5007,11 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) return score; - if (gMovesInfo[move].criticalHitStage > 0) + if (GetMoveCriticalHitStage(move) > 0) ADJUST_SCORE(DECENT_EFFECT); // +3 Score - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_COUNTER: if (gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack + 10) @@ -4881,9 +5050,11 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { // TEMPORARY - should applied to all moves regardless of EFFECT // Consider move effects - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + for (i = 0; i < additionalEffectCount; i++) { - switch (gMovesInfo[move].additionalEffects[i].moveEffect) + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + switch (additionalEffect->moveEffect) { case MOVE_EFFECT_ALL_STATS_UP: if (Random() & 1) @@ -4920,12 +5091,14 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor { if (IS_TARGETING_PARTNER(battlerAtk, battlerDef) || CountUsablePartyMons(battlerAtk) == 0 - || !IS_MOVE_STATUS(move) + || !IsBattleMoveStatus(move) || !HasMoveEffect(battlerAtk, EFFECT_BATON_PASS) || IsBattlerTrapped(battlerAtk, TRUE)) return score; - if (IsStatRaisingEffect(gMovesInfo[move].effect)) + u32 effect = GetMoveEffect(move); + + if (IsStatRaisingEffect(effect)) { if (gBattleResults.battleTurnCounter == 0) ADJUST_SCORE(GOOD_EFFECT); @@ -4936,7 +5109,7 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor } // other specific checks - switch (gMovesInfo[move].effect) + switch (effect) { case EFFECT_INGRAIN: if (!(gStatuses3[battlerAtk] & STATUS3_ROOTED)) @@ -4968,11 +5141,11 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { - u32 effect = gMovesInfo[move].effect; + u32 effect = GetMoveEffect(move); u32 moveType = 0; SetTypeBeforeUsingMove(move, battlerAtk); - moveType = GetMoveType(move); + moveType = GetBattleMoveType(move); if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) { @@ -5150,7 +5323,7 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else { // low HP - if (IS_MOVE_STATUS(move)) + if (IsBattleMoveStatus(move)) ADJUST_SCORE(-2); // don't use status moves if target is at low health } } @@ -5160,15 +5333,15 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { - u32 moveEffect = gMovesInfo[move].effect; + u32 moveEffect = GetMoveEffect(move); - if (gMovesInfo[move].category != DAMAGE_CATEGORY_STATUS || gMovesInfo[AI_DATA->partnerMove].effect == moveEffect) + if (GetMoveCategory(move) != DAMAGE_CATEGORY_STATUS || GetMoveEffect(AI_DATA->partnerMove) == moveEffect) return score; switch (moveEffect) { case EFFECT_TAILWIND: - if (!gSideTimers[GetBattlerSide(battlerAtk)].tailwindTimer && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 1)) + if (!gSideTimers[GetBattlerSide(battlerAtk)].tailwindTimer && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_TRICK_ROOM: @@ -5225,29 +5398,179 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_SANDSTORM: - if (!(AI_GetWeather(AI_DATA) & (B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY))) + if (!(AI_GetWeather() & (B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY))) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_SUNNY_DAY: - if (!(AI_GetWeather(AI_DATA) & (B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY))) + if (!(AI_GetWeather() & (B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY))) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_RAIN_DANCE: - if (!(AI_GetWeather(AI_DATA) & (B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY))) + if (!(AI_GetWeather() & (B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY))) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_HAIL: - if (!(AI_GetWeather(AI_DATA) & (B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY))) + if (!(AI_GetWeather() & (B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY))) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_SNOWSCAPE: - if (!(AI_GetWeather(AI_DATA) & (B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY))) + if (!(AI_GetWeather() & (B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY))) ADJUST_SCORE(POWERFUL_STATUS_MOVE); } return score; } +static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +{ + u32 i; + u32 unmodifiedScore = score; + u32 ability = gBattleMons[battlerAtk].ability; + u32 opposingHazardFlags = gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_TOXIC_SPIKES); + u32 aiHazardFlags = gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_HAZARDS_ANY); + u32 moveEffect = GetMoveEffect(move); + struct AiLogicData *aiData = AI_DATA; + uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; + + // Switch benefit + switch (moveEffect) + { + case EFFECT_PURSUIT: + { + u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex); + if (hitsToKO == 2) + ADJUST_SCORE(GOOD_EFFECT); + else if (hitsToKO == 1) + ADJUST_SCORE(BEST_EFFECT); + // else if (IsPredictedToUsePursuitableMove(battlerDef, battlerAtk) && !MoveWouldHitFirst(move, battlerAtk, battlerDef)) //Pursuit against fast U-Turn + // ADJUST_SCORE(GOOD_EFFECT); + break; + } + + case EFFECT_FOCUS_PUNCH: + ADJUST_SCORE(DECENT_EFFECT); + if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_CHECK_BAD_MOVE) + { + if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) + ADJUST_SCORE(10); + if (HasDamagingMove(battlerDef) && !((gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE) + || IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) + || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION))) + ADJUST_SCORE(10); + } + break; + + // Free setup (U-Turn etc. handled in Check Viability by ShouldPivot) + case EFFECT_BOLT_BEAK: + case EFFECT_LIGHT_SCREEN: + case EFFECT_REFLECT: + case EFFECT_MAGNET_RISE: + case EFFECT_TRICK_ROOM: + case EFFECT_STEALTH_ROCK: + case EFFECT_SPIKES: + case EFFECT_TOXIC_SPIKES: + ADJUST_SCORE(BEST_EFFECT); + break; + case EFFECT_FUTURE_SIGHT: + case EFFECT_TELEKINESIS: + case EFFECT_GRAVITY: + case EFFECT_RAIN_DANCE: + case EFFECT_SANDSTORM: + case EFFECT_SNOWSCAPE: + case EFFECT_HAIL: + case EFFECT_SUNNY_DAY: + case EFFECT_AQUA_RING: + case EFFECT_ELECTRIC_TERRAIN: + case EFFECT_PSYCHIC_TERRAIN: + case EFFECT_GRASSY_TERRAIN: + case EFFECT_MISTY_TERRAIN: + ADJUST_SCORE(GOOD_EFFECT); + break; + case EFFECT_HIT_SWITCH_TARGET: + if (opposingHazardFlags != 0) + ADJUST_SCORE(BEST_EFFECT); + else + ADJUST_SCORE(GOOD_EFFECT); + break; + case EFFECT_ROAR: + if (opposingHazardFlags != 0) + ADJUST_SCORE(GOOD_EFFECT); + break; + case EFFECT_RAPID_SPIN: + if (aiHazardFlags != 0) + ADJUST_SCORE(BEST_EFFECT); + break; + case EFFECT_DEFOG: + if (aiHazardFlags != 0) + ADJUST_SCORE(GOOD_EFFECT); + break; + case EFFECT_WISH: + case EFFECT_HEAL_BELL: + if (ShouldUseWishAromatherapy(battlerAtk, battlerDef, move)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case EFFECT_RESTORE_HP: + if (AI_DATA->hpPercents[battlerAtk] < 60) + ADJUST_SCORE(GOOD_EFFECT); + break; + + // Fails if opponent switches + case EFFECT_PROTECT: + case EFFECT_COUNTER: + case EFFECT_MIRROR_COAT: + case EFFECT_SHELL_TRAP: + case EFFECT_METAL_BURST: + case EFFECT_SUCKER_PUNCH: + case EFFECT_UPPER_HAND: + case EFFECT_ENCORE: + case EFFECT_FOLLOW_ME: + case EFFECT_ME_FIRST: + case EFFECT_DISABLE: + case EFFECT_ELECTRIFY: + case EFFECT_ENDURE: + case EFFECT_HAZE: + case EFFECT_TOPSY_TURVY: + case EFFECT_ION_DELUGE: + case EFFECT_MAGIC_COAT: + case EFFECT_SNATCH: + ADJUST_SCORE(-BEST_EFFECT); + break; + + // Get stuck in bad matchup + case EFFECT_IMPRISON: + case EFFECT_EMBARGO: + case EFFECT_TAUNT: + case EFFECT_INGRAIN: + case EFFECT_NO_RETREAT: + case EFFECT_MEAN_LOOK: + ADJUST_SCORE(-GOOD_EFFECT); + break; + } + + // Additional effects + for (i = 0; i < GetMoveAdditionalEffectCount(move); i++) + { + switch (GetMoveAdditionalEffectById(move, i)->moveEffect) + { + case MOVE_EFFECT_WRAP: + ADJUST_SCORE(-GOOD_EFFECT); + break; + case MOVE_EFFECT_FEINT: + ADJUST_SCORE(-BEST_EFFECT); + break; + } + } + + // Take advantage of ability damage bonus + if ((ability == ABILITY_STAKEOUT || ability == ABILITY_ANALYTIC) && IsBattleMoveStatus(move)) + ADJUST_SCORE(-WEAK_EFFECT); + + // This must be last or the player can gauge whether the AI is predicting based on how long it thinks + if (!IsBattlerPredictedToSwitch(battlerDef)) + return unmodifiedScore; + return score; +} + static void AI_Flee(void) { AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); @@ -5325,6 +5648,8 @@ static s32 AI_DynamicFunc(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) void ScriptSetDynamicAiFunc(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + AiScoreFunc func = (AiScoreFunc)ScriptReadWord(ctx); sDynamicAiFunc = func; } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index e5ff01fab6..ef8f45fb17 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -37,19 +37,108 @@ static void InitializeSwitchinCandidate(struct Pokemon *mon) AI_DATA->switchinCandidate.hypotheticalStatus = FALSE; } +u32 GetSwitchChance(enum ShouldSwitchScenario shouldSwitchScenario) +{ + // Modify these cases if you want unique behaviour based on other data (trainer class, difficulty, etc.) + switch(shouldSwitchScenario) + { + case SHOULD_SWITCH_WONDER_GUARD: + return SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE; + case SHOULD_SWITCH_ABSORBS_MOVE: + return SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE; + case SHOULD_SWITCH_TRAPPER: + return SHOULD_SWITCH_TRAPPER_PERCENTAGE; + case SHOULD_SWITCH_FREE_TURN: + return SHOULD_SWITCH_FREE_TURN_PERCENTAGE; + case SHOULD_SWITCH_TRUANT: + return SHOULD_SWITCH_TRUANT_PERCENTAGE; + case SHOULD_SWITCH_ALL_MOVES_BAD: + return SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE; + case SHOULD_SWITCH_PERISH_SONG: + return SHOULD_SWITCH_PERISH_SONG_PERCENTAGE; + case SHOULD_SWITCH_YAWN: + return SHOULD_SWITCH_YAWN_PERCENTAGE; + case SHOULD_SWITCH_BADLY_POISONED: + return SHOULD_SWITCH_BADLY_POISONED_PERCENTAGE; + case SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED: + return SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_CURSED: + return SHOULD_SWITCH_CURSED_PERCENTAGE; + case SHOULD_SWITCH_CURSED_STATS_RAISED: + return SHOULD_SWITCH_CURSED_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_NIGHTMARE: + return SHOULD_SWITCH_NIGHTMARE_PERCENTAGE; + case SHOULD_SWITCH_NIGHTMARE_STATS_RAISED: + return SHOULD_SWITCH_NIGHTMARE_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_SEEDED: + return SHOULD_SWITCH_SEEDED_PERCENTAGE; + case SHOULD_SWITCH_SEEDED_STATS_RAISED: + return SHOULD_SWITCH_SEEDED_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_INFATUATION: + return SHOULD_SWITCH_INFATUATION_PERCENTAGE; + case SHOULD_SWITCH_HASBADODDS: + return SHOULD_SWITCH_HASBADODDS_PERCENTAGE; + case SHOULD_SWITCH_NATURAL_CURE_STRONG: + return SHOULD_SWITCH_NATURAL_CURE_STRONG_PERCENTAGE; + case SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED: + return SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_NATURAL_CURE_WEAK: + return SHOULD_SWITCH_NATURAL_CURE_WEAK_PERCENTAGE; + case SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED: + return SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_REGENERATOR: + return SHOULD_SWITCH_REGENERATOR_PERCENTAGE; + case SHOULD_SWITCH_REGENERATOR_STATS_RAISED: + return SHOULD_SWITCH_REGENERATOR_STATS_RAISED_PERCENTAGE; + case SHOULD_SWITCH_ENCORE_STATUS: + return SHOULD_SWITCH_ENCORE_STATUS_PERCENTAGE; + case SHOULD_SWITCH_ENCORE_DAMAGE: + return SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE; + case SHOULD_SWITCH_CHOICE_LOCKED: + return SHOULD_SWITCH_CHOICE_LOCKED_PERCENTAGE; + case SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO: + return SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO_PERCENTAGE; + case SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS: + return SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS_PERCENTAGE; + default: + return 100; + } +} + +u32 GetThinkingBattler(u32 battler) +{ + if (AI_DATA->aiSwitchPredictionInProgress) + return AI_DATA->battlerDoingPrediction; + return battler; +} + static bool32 IsAceMon(u32 battler, u32 monPartyId) { - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_ACE_POKEMON - && !(gBattleStruct->forcedSwitch & (1u << battler)) + if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_ACE_POKEMON + && !gBattleStruct->battlerState[battler].forcedSwitch && monPartyId == CalculateEnemyPartyCountInSide(battler)-1) return TRUE; - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON - && !(gBattleStruct->forcedSwitch & (1u << battler)) + if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_DOUBLE_ACE_POKEMON + && !gBattleStruct->battlerState[battler].forcedSwitch && (monPartyId == CalculateEnemyPartyCount()-1 || monPartyId == CalculateEnemyPartyCount()-2)) return TRUE; return FALSE; } +static bool32 AreStatsRaised(u32 battler) +{ + u8 buffedStatsValue = 0; + s32 i; + + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[battler].statStages[i] > DEFAULT_STAT_STAGE) + buffedStatsValue += gBattleMons[battler].statStages[i] - DEFAULT_STAT_STAGE; + } + + return (buffedStatsValue > STAY_IN_STATS_RAISED); +} + void GetAIPartyIndexes(u32 battler, s32 *firstId, s32 *lastId) { if (BATTLE_TWO_VS_ONE_OPPONENT && (battler & BIT_SIDE) == B_SIDE_OPPONENT) @@ -81,14 +170,15 @@ static inline bool32 SetSwitchinAndSwitch(u32 battler, u32 switchinId) static bool32 ShouldSwitchIfHasBadOdds(u32 battler) { //Variable initialization - u8 opposingPosition, atkType1, atkType2, defType1, defType2, effectiveness; + u8 opposingPosition, atkType1, atkType2, defType1, defType2; s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0; - u32 aiMove, playerMove, aiBestMove = MOVE_NONE, aiAbility = AI_DATA->abilities[battler], opposingBattler, weather = AI_GetWeather(AI_DATA); + u32 aiMove, playerMove, aiBestMove = MOVE_NONE, aiAbility = AI_DATA->abilities[battler], opposingBattler, weather = AI_GetWeather(); bool32 getsOneShot = FALSE, hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; u16 typeEffectiveness = UQ_4_12(1.0), aiMoveEffect; //baseline typing damage + uq4_12_t effectiveness; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) + if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic @@ -108,7 +198,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) for (i = 0; i < MAX_MON_MOVES; i++) { aiMove = gBattleMons[battler].moves[i]; - aiMoveEffect = gMovesInfo[aiMove].effect; + aiMoveEffect = GetMoveEffect(aiMove); if (aiMove != MOVE_NONE) { // Check if mon has an "important" status move @@ -123,10 +213,10 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) } // Only check damage if it's a damaging move - if (!IS_MOVE_STATUS(aiMove)) + if (!IsBattleMoveStatus(aiMove)) { // Check if mon has a super effective move - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0)) hasSuperEffectiveMove = TRUE; // Get maximum damage mon can deal @@ -156,7 +246,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) for (i = 0; i < MAX_MON_MOVES; i++) { playerMove = gBattleMons[opposingBattler].moves[i]; - if (playerMove != MOVE_NONE && !IS_MOVE_STATUS(playerMove)) + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) { damageTaken = AI_CalcDamage(playerMove, opposingBattler, battler, &effectiveness, FALSE, weather, DMG_ROLL_HIGHEST).expected; if (damageTaken > maxDamageTaken) @@ -190,7 +280,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 4))) { // 50% chance to stay in regardless - if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, 50)) + if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, (100 - GetSwitchChance(SHOULD_SWITCH_HASBADODDS))) && !AI_DATA->aiSwitchPredictionInProgress) return FALSE; // Switch mon out @@ -210,7 +300,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) return FALSE; // 50% chance to stay in regardless - if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, 50)) + if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, (100 - GetSwitchChance(SHOULD_SWITCH_HASBADODDS))) && !AI_DATA->aiSwitchPredictionInProgress) return FALSE; // Switch mon out @@ -229,7 +319,8 @@ static bool32 ShouldSwitchIfTruant(u32 battler) && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) { - return SetSwitchinAndSwitch(battler, PARTY_SIZE); + if (RandomPercentage(RNG_AI_SWITCH_TRUANT, GetSwitchChance(SHOULD_SWITCH_TRUANT))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); } return FALSE; } @@ -237,7 +328,7 @@ static bool32 ShouldSwitchIfTruant(u32 battler) static bool32 ShouldSwitchIfAllMovesBad(u32 battler) { u32 moveIndex; - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 aiMove; // Switch if no moves affect opponents @@ -247,8 +338,8 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiMove = gBattleMons[battler].moves[moveIndex]; - if ((AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > AI_EFFECTIVENESS_x0 - || AI_GetMoveEffectiveness(aiMove, battler, opposingPartner) > AI_EFFECTIVENESS_x0) + if ((AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > UQ_4_12(0.0) + || AI_GetMoveEffectiveness(aiMove, battler, opposingPartner) > UQ_4_12(0.0)) && aiMove != MOVE_NONE) return FALSE; } @@ -258,17 +349,19 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiMove = gBattleMons[battler].moves[moveIndex]; - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > AI_EFFECTIVENESS_x0 && aiMove != MOVE_NONE) + if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > UQ_4_12(0.0) && aiMove != MOVE_NONE) return FALSE; } } - return SetSwitchinAndSwitch(battler, PARTY_SIZE); + if (RandomPercentage(RNG_AI_SWITCH_ALL_MOVES_BAD, GetSwitchChance(SHOULD_SWITCH_ALL_MOVES_BAD))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); + return FALSE; } static bool32 FindMonThatHitsWonderGuard(u32 battler) { - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); s32 i, j; s32 firstId; s32 lastId; // + 1 @@ -287,7 +380,7 @@ static bool32 FindMonThatHitsWonderGuard(u32 battler) move = gBattleMons[battler].moves[i]; if (move != MOVE_NONE) { - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) return FALSE; } } @@ -312,7 +405,7 @@ static bool32 FindMonThatHitsWonderGuard(u32 battler) if (move != MOVE_NONE) { // Found a mon - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0) && RandomPercentage(RNG_AI_SWITCH_WONDER_GUARD, GetSwitchChance(SHOULD_SWITCH_WONDER_GUARD))) return SetSwitchinAndSwitch(battler, i); } } @@ -329,25 +422,46 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) s32 firstId; s32 lastId; struct Pokemon *party; - u16 monAbility; - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u16 monAbility, aiMove; + u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = AI_DATA->lastUsedMove[opposingBattler]; + u32 incomingType = GetMoveType(incomingMove); u32 predictedMove = incomingMove; // Update for move prediction + u32 predictedType = GetMoveType(predictedMove); bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); s32 i, j; - if (!(AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) + if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; - if (HasSuperEffectiveMoveAgainstOpponents(battler, TRUE) && RandomPercentage(RNG_AI_SWITCH_ABSORBING, 66)) + if (gBattleStruct->prevTurnSpecies[battler] != gBattleMons[battler].species) // AI mon has changed, player's behaviour no longer reliable; note to override this if using AI_FLAG_PREDICT_MOVE + return FALSE; + if (HasSuperEffectiveMoveAgainstOpponents(battler, TRUE) && (RandomPercentage(RNG_AI_SWITCH_ABSORBING_STAY_IN, STAY_IN_ABSORBING_PERCENTAGE) || AI_DATA->aiSwitchPredictionInProgress)) return FALSE; + if (AreStatsRaised(battler)) + return FALSE; + + // Don't switch if mon could OHKO + for (i = 0; i < MAX_MON_MOVES; i++) + { + aiMove = gBattleMons[battler].moves[i]; + if (aiMove != MOVE_NONE) + { + // Only check damage if it's a damaging move + if (!IsBattleMoveStatus(aiMove)) + { + if (AI_DATA->simulatedDmg[battler][opposingBattler][i].expected > gBattleMons[opposingBattler].hp) + return FALSE; + } + } + } if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); } else { @@ -356,31 +470,36 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) } // Create an array of possible absorb abilities so the AI considers all of them - if (gMovesInfo[predictedMove].type == TYPE_FIRE) + if (predictedType == TYPE_FIRE) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_FLASH_FIRE; } - else if (gMovesInfo[predictedMove].type == TYPE_WATER || (isOpposingBattlerChargingOrInvulnerable && gMovesInfo[incomingMove].type == TYPE_WATER)) + else if (predictedType == TYPE_WATER || (isOpposingBattlerChargingOrInvulnerable && incomingType == TYPE_WATER)) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_WATER_ABSORB; absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_DRY_SKIN; if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_STORM_DRAIN; } - else if (gMovesInfo[predictedMove].type == TYPE_ELECTRIC || (isOpposingBattlerChargingOrInvulnerable && gMovesInfo[incomingMove].type == TYPE_ELECTRIC)) + else if (predictedType == TYPE_ELECTRIC || (isOpposingBattlerChargingOrInvulnerable && incomingType == TYPE_ELECTRIC)) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_VOLT_ABSORB; absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_MOTOR_DRIVE; if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_LIGHTNING_ROD; } - else if (gMovesInfo[predictedMove].type == TYPE_GRASS || (isOpposingBattlerChargingOrInvulnerable && gMovesInfo[incomingMove].type == TYPE_GRASS)) + else if (predictedType == TYPE_GRASS || (isOpposingBattlerChargingOrInvulnerable && incomingType == TYPE_GRASS)) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_SAP_SIPPER; } - else if (gMovesInfo[predictedMove].type == TYPE_GROUND || (isOpposingBattlerChargingOrInvulnerable && gMovesInfo[incomingMove].type == TYPE_GROUND)) + else if (predictedType == TYPE_GROUND || (isOpposingBattlerChargingOrInvulnerable && incomingType == TYPE_GROUND)) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_EARTH_EATER; + absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_LEVITATE; + } + else if (IsSoundMove(predictedMove) || (isOpposingBattlerChargingOrInvulnerable && IsSoundMove(incomingMove))) + { + absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_SOUNDPROOF; } else { @@ -418,7 +537,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) for (j = 0; j < numAbsorbingAbilities; j++) { // Found a mon - if (absorbingTypeAbilities[j] == monAbility) + if (absorbingTypeAbilities[j] == monAbility && RandomPercentage(RNG_AI_SWITCH_ABSORBING, GetSwitchChance(SHOULD_SWITCH_ABSORBS_MOVE))) return SetSwitchinAndSwitch(battler, i); } } @@ -427,14 +546,14 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) { - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = AI_DATA->lastUsedMove[opposingBattler]; bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); - if (IsDoubleBattle() || !(AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) + if (IsDoubleBattle() || !(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; - if (isOpposingBattlerChargingOrInvulnerable && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) + if (isOpposingBattlerChargingOrInvulnerable && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); return FALSE; @@ -447,10 +566,10 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) struct Pokemon *party; s32 i; u16 monAbility; - s32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + s32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) + if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Check if current mon has an ability that traps opponent @@ -468,10 +587,10 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) monAbility = GetMonAbility(&party[i]); - if (CanAbilityTrapOpponent(monAbility, opposingBattler)) + if (CanAbilityTrapOpponent(monAbility, opposingBattler) || (CanAbilityTrapOpponent(AI_GetBattlerAbility(opposingBattler), opposingBattler) && monAbility == ABILITY_TRACE)) { // If mon in slot i is the most suitable switchin candidate, then it's a trapper than wins 1v1 - if (i == AI_DATA->mostSuitableMonId[battler]) + if (i == AI_DATA->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } } @@ -490,18 +609,24 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) //Perish Song if (gStatuses3[battler] & STATUS3_PERISH_SONG && gDisableStructs[battler].perishSongTimer == 0 - && monAbility != ABILITY_SOUNDPROOF) - switchMon = TRUE; + && monAbility != ABILITY_SOUNDPROOF + && RandomPercentage(RNG_AI_SWITCH_PERISH_SONG, GetSwitchChance(SHOULD_SWITCH_PERISH_SONG))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) + if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) { //Yawn if (gStatuses3[battler] & STATUS3_YAWN - && CanBeSlept(battler, monAbility) - && gBattleMons[battler].hp > gBattleMons[battler].maxHP / 3) + && CanBeSlept(battler, monAbility, BLOCKED_BY_SLEEP_CLAUSE) + && gBattleMons[battler].hp > gBattleMons[battler].maxHP / 3 + && RandomPercentage(RNG_AI_SWITCH_YAWN, GetSwitchChance(SHOULD_SWITCH_YAWN))) { switchMon = TRUE; + // If we don't have a good switchin, not worth switching + if (AI_DATA->mostSuitableMonId[battler] == PARTY_SIZE) + switchMon = FALSE; + // Check if Active Pokemon can KO opponent instead of switching // Will still fall asleep, but take out opposing Pokemon first if (AiExpectsToFaintPlayer(battler)) @@ -513,7 +638,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) || monAbility == ABILITY_EARLY_BIRD) || holdEffect == (HOLD_EFFECT_CURE_SLP | HOLD_EFFECT_CURE_STATUS) || HasMove(battler, MOVE_SLEEP_TALK) - || (HasMoveEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + || (HasMoveEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= UQ_4_12(2.0)) || (IsBattlerGrounded(battler) && (HasMove(battler, MOVE_MISTY_TERRAIN) || HasMove(battler, MOVE_ELECTRIC_TERRAIN))) ) @@ -528,45 +653,48 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) && !(gBattleMons[battler].status2 & STATUS2_FORESIGHT) && !(gStatuses3[battler] & STATUS3_MIRACLE_EYED)) switchMon = FALSE; + + if (switchMon) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // Secondary Damage if (monAbility != ABILITY_MAGIC_GUARD - && !AiExpectsToFaintPlayer(battler)) + && !AiExpectsToFaintPlayer(battler) + && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) { //Toxic if (((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >= STATUS1_TOXIC_TURN(2)) && gBattleMons[battler].hp >= (gBattleMons[battler].maxHP / 3) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, 20) : RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, 50))) - switchMon = TRUE; + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, GetSwitchChance(SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, GetSwitchChance(SHOULD_SWITCH_BADLY_POISONED)))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Cursed if (gBattleMons[battler].status2 & STATUS2_CURSED - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_CURSED, 20) : RandomPercentage(RNG_AI_SWITCH_CURSED, 50))) - switchMon = TRUE; + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_CURSED, GetSwitchChance(SHOULD_SWITCH_CURSED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_CURSED, GetSwitchChance(SHOULD_SWITCH_CURSED)))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Nightmare if (gBattleMons[battler].status2 & STATUS2_NIGHTMARE - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, 15) : RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, 33))) - switchMon = TRUE; + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, GetSwitchChance(SHOULD_SWITCH_NIGHTMARE_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, GetSwitchChance(SHOULD_SWITCH_NIGHTMARE)))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Leech Seed if (gStatuses3[battler] & STATUS3_LEECHSEED - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_SEEDED, 10) : RandomPercentage(RNG_AI_SWITCH_SEEDED, 25))) - switchMon = TRUE; + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_SEEDED, GetSwitchChance(SHOULD_SWITCH_SEEDED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_SEEDED, GetSwitchChance(SHOULD_SWITCH_SEEDED)))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // Infatuation if (gBattleMons[battler].status2 & STATUS2_INFATUATION - && !AiExpectsToFaintPlayer(battler)) - switchMon = TRUE; + && !AiExpectsToFaintPlayer(battler) + && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE + && RandomPercentage(RNG_AI_SWITCH_INFATUATION, GetSwitchChance(SHOULD_SWITCH_INFATUATION))) + return SetSwitchinAndSwitch(battler, PARTY_SIZE); } - if (switchMon) - return SetSwitchinAndSwitch(battler, PARTY_SIZE); - else - return FALSE; + return FALSE; } static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) @@ -584,13 +712,13 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) //Attempt to cure bad ailment if (gBattleMons[battler].status1 & (STATUS1_SLEEP | STATUS1_FREEZE | STATUS1_TOXIC_POISON) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, 10) : RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, 66))) + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_STRONG)))) break; //Attempt to cure lesser ailment if ((gBattleMons[battler].status1 & STATUS1_ANY) && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, 10) : RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, 25))) + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_WEAK)))) break; return FALSE; @@ -601,7 +729,7 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) return FALSE; if ((gBattleMons[battler].hp <= ((gBattleMons[battler].maxHP * 2) / 3)) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE - && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_REGENERATOR, 20) : RandomPercentage(RNG_AI_SWITCH_REGENERATOR, 50))) + && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_REGENERATOR, GetSwitchChance(SHOULD_SWITCH_REGENERATOR_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_REGENERATOR, GetSwitchChance(SHOULD_SWITCH_REGENERATOR)))) break; return FALSE; @@ -629,7 +757,7 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) if (move == MOVE_NONE) continue; - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) { if (noRng) return TRUE; @@ -651,7 +779,7 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) if (move == MOVE_NONE) continue; - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) { if (noRng) return TRUE; @@ -664,20 +792,6 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) return FALSE; } -static bool32 AreStatsRaised(u32 battler) -{ - u8 buffedStatsValue = 0; - s32 i; - - for (i = 0; i < NUM_BATTLE_STATS; i++) - { - if (gBattleMons[battler].statStages[i] > DEFAULT_STAT_STAGE) - buffedStatsValue += gBattleMons[battler].statStages[i] - DEFAULT_STAT_STAGE; - } - - return (buffedStatsValue > 3); -} - static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 percentChance) { u32 battlerIn1, battlerIn2; @@ -688,7 +802,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc u16 move; // Similar functionality handled more thoroughly by ShouldSwitchIfHasBadOdds - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) + if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) return FALSE; if (gLastLandedMoves[battler] == MOVE_NONE) @@ -697,16 +811,16 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc return FALSE; if (gLastHitBy[battler] == 0xFF) return FALSE; - if (IS_MOVE_STATUS(gLastLandedMoves[battler])) + if (IsBattleMoveStatus(gLastLandedMoves[battler])) return FALSE; if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); } else { @@ -720,6 +834,8 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc for (i = firstId; i < lastId; i++) { u16 species, monAbility; + uq4_12_t typeMultiplier; + u16 moveFlags = 0; if (!IsValidForBattle(&party[i])) continue; @@ -736,8 +852,9 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); monAbility = GetMonAbility(&party[i]); - CalcPartyMonTypeEffectivenessMultiplier(gLastLandedMoves[battler], species, monAbility); - if (gMoveResultFlags & flags) + typeMultiplier = CalcPartyMonTypeEffectivenessMultiplier(gLastLandedMoves[battler], species, monAbility); + UpdateMoveResultFlags(typeMultiplier, &moveFlags); + if (moveFlags & flags) { battlerIn1 = gLastHitBy[battler]; @@ -747,7 +864,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc if (move == 0) continue; - if (AI_GetMoveEffectiveness(move, battler, battlerIn1) >= AI_EFFECTIVENESS_x2 && RandomPercentage(RNG_AI_SWITCH_SE_DEFENSIVE, percentChance)) + if (AI_GetMoveEffectiveness(move, battler, battlerIn1) >= UQ_4_12(2.0) && (RandomPercentage(RNG_AI_SWITCH_SE_DEFENSIVE, percentChance) || AI_DATA->aiSwitchPredictionInProgress)) return SetSwitchinAndSwitch(battler, i); } } @@ -775,10 +892,10 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); } else { @@ -807,13 +924,8 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) for (j = 0; j < MAX_MON_MOVES; j++) { aiMove = GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL); - if (gMovesInfo[aiMove].effect == EFFECT_RAPID_SPIN - || (B_DEFOG_EFFECT_CLEARING >= GEN_6 && gMovesInfo[aiMove].effect == EFFECT_DEFOG) - || gMovesInfo[aiMove].effect == EFFECT_TIDY_UP) - { - // Have a mon that can clear the hazards, so switching out is okay + if (IsHazardClearingMove(aiMove)) // Have a mon that can clear the hazards, so switching out is okay return TRUE; - } } } // Faints to hazards and party can't clear them, don't switch out @@ -825,10 +937,10 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) static bool32 ShouldSwitchIfEncored(u32 battler) { u32 encoredMove = gDisableStructs[battler].encoredMove; - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) + if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // If not Encore'd don't switch @@ -836,15 +948,15 @@ static bool32 ShouldSwitchIfEncored(u32 battler) return FALSE; // Switch out if status move - if (gMovesInfo[encoredMove].category == DAMAGE_CATEGORY_STATUS) + if (GetMoveCategory(encoredMove) == DAMAGE_CATEGORY_STATUS && RandomPercentage(RNG_AI_SWITCH_ENCORE, GetSwitchChance(SHOULD_SWITCH_ENCORE_STATUS))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); // Stay in if effective move - else if (AI_GetMoveEffectiveness(encoredMove, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + else if (AI_GetMoveEffectiveness(encoredMove, battler, opposingBattler) >= UQ_4_12(2.0)) return FALSE; // Switch out 50% of the time otherwise - else if (RandomPercentage(RNG_AI_SWITCH_ENCORE, 50) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) + else if ((RandomPercentage(RNG_AI_SWITCH_ENCORE, GetSwitchChance(SHOULD_SWITCH_ENCORE_DAMAGE)) || AI_DATA->aiSwitchPredictionInProgress) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) return SetSwitchinAndSwitch(battler, PARTY_SIZE); return FALSE; @@ -856,7 +968,7 @@ static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) if (HOLD_EFFECT_CHOICE(holdEffect) && IsBattlerItemEnabled(battler)) { - if (gMovesInfo[gLastUsedMove].category == DAMAGE_CATEGORY_STATUS) + if (GetMoveCategory(AI_DATA->lastUsedMove[battler]) == DAMAGE_CATEGORY_STATUS && RandomPercentage(RNG_AI_SWITCH_CHOICE_LOCKED, GetSwitchChance(SHOULD_SWITCH_CHOICE_LOCKED))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } @@ -870,7 +982,7 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) s8 spAttackingStage = gBattleMons[battler].statStages[STAT_SPATK]; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) + if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Physical attacker @@ -882,11 +994,11 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) // 50% chance if attack at -2 and have a good candidate mon else if (attackingStage == DEFAULT_STAT_STAGE - 2) { - if (AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, 50)) + if (AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && (RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO)) || AI_DATA->aiSwitchPredictionInProgress)) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // If at -3 or worse, switch out regardless - else if (attackingStage < DEFAULT_STAT_STAGE - 2) + else if ((attackingStage < DEFAULT_STAT_STAGE - 2) && RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } @@ -899,16 +1011,33 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) // 50% chance if attack at -2 and have a good candidate mon else if (spAttackingStage == DEFAULT_STAT_STAGE - 2) { - if (AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, 50)) + if (AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && (RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO)) || AI_DATA->aiSwitchPredictionInProgress)) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // If at -3 or worse, switch out regardless - else if (spAttackingStage < DEFAULT_STAT_STAGE - 2) + else if ((spAttackingStage < DEFAULT_STAT_STAGE - 2) && RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } return FALSE; } +static bool32 HasGoodSubstituteMove(u32 battler) +{ + int i; + u32 aiMove, aiMoveEffect, opposingBattler = GetOppositeBattler(battler); + for (i = 0; i < MAX_MON_MOVES; i++) + { + aiMove = gBattleMons[battler].moves[i]; + aiMoveEffect = GetMoveEffect(aiMove); + if (IsSubstituteEffect(aiMoveEffect)) + { + if (IncreaseSubstituteMoveScore(battler, opposingBattler, aiMove) > 0) + return TRUE; + } + } + return FALSE; +} + bool32 ShouldSwitch(u32 battler) { u32 battlerIn1, battlerIn2; @@ -928,7 +1057,7 @@ bool32 ShouldSwitch(u32 battler) return FALSE; // Sequence Switching AI never switches mid-battle - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SEQUENCE_SWITCHING) + if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) return FALSE; availableToSwitch = 0; @@ -973,19 +1102,21 @@ bool32 ShouldSwitch(u32 battler) return FALSE; // NOTE: The sequence of the below functions matter! Do not change unless you have carefully considered the outcome. - // Since the order is sequencial, and some of these functions prompt switch to specific party members. + // Since the order is sequential, and some of these functions prompt switch to specific party members. + + // FindMon functions can prompt a switch to specific party members that override GetMostSuitableMonToSwitchInto + // The rest can prompt a switch to party member returned by GetMostSuitableMonToSwitchInto - // These Functions can prompt switch to specific party members that override GetMostSuitableMonToSwitchInto if (FindMonThatHitsWonderGuard(battler)) return TRUE; - if (FindMonThatAbsorbsOpponentsMove(battler)) - return TRUE; - - // These Functions can prompt switch to party member returned by GetMostSuitableMonToSwitchInto - if ((AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) + if ((AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) + return FALSE; + if (HasGoodSubstituteMove(battler)) return FALSE; if (ShouldSwitchIfTrapperInParty(battler)) return TRUE; + if (FindMonThatAbsorbsOpponentsMove(battler)) + return TRUE; if (ShouldSwitchIfOpponentChargingOrInvulnerable(battler)) return TRUE; if (ShouldSwitchIfTruant(battler)) @@ -1008,7 +1139,7 @@ bool32 ShouldSwitch(u32 battler) // Removing switch capabilites under specific conditions // These Functions prevent the "FindMonWithFlagsAndSuperEffective" from getting out of hand. // We don't use FindMonWithFlagsAndSuperEffective with AI_FLAG_SMART_SWITCHING, so we can bail early. - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) + if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) return FALSE; if (HasSuperEffectiveMoveAgainstOpponents(battler, FALSE)) return FALSE; @@ -1102,7 +1233,7 @@ void AI_TrySwitchOrUseItem(u32 battler) gBattleStruct->AI_monToSwitchIntoId[battler] = monToSwitchId; } - *(gBattleStruct->monToSwitchIntoId + battler) = gBattleStruct->AI_monToSwitchIntoId[battler]; + gBattleStruct->monToSwitchIntoId[battler] = gBattleStruct->AI_monToSwitchIntoId[battler]; AI_DATA->monToSwitchInId[battler] = gBattleStruct->AI_monToSwitchIntoId[battler]; return; } @@ -1192,7 +1323,7 @@ static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, for (i = 0; i < MAX_MON_MOVES; i++) { u32 move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i); - if (move != MOVE_NONE && AI_GetMoveEffectiveness(move, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (move != MOVE_NONE && AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) break; } @@ -1219,7 +1350,6 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva u32 aiMove; - gMoveResultFlags = 0; // If we couldn't find the best mon in terms of typing, find the one that deals most damage. for (i = firstId; i < lastId; i++) { @@ -1229,7 +1359,7 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva for (j = 0; j < MAX_MON_MOVES; j++) { aiMove = AI_DATA->switchinCandidate.battleMon.moves[j]; - if (aiMove != MOVE_NONE && !IS_MOVE_STATUS(aiMove)) + if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) { aiMove = GetMonData(&party[i], MON_DATA_MOVE1 + j); dmg = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, AI_DATA->switchinCandidate.battleMon, TRUE, rollType); @@ -1276,10 +1406,10 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon { // Stealth Rock if ((hazardFlags & SIDE_STATUS_STEALTH_ROCK) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) - hazardDamage += GetStealthHazardDamageByTypesAndHP(gMovesInfo[MOVE_STEALTH_ROCK].type, defType1, defType2, battleMon->maxHP); + hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_POINTED_STONES, defType1, defType2, battleMon->maxHP); // G-Max Steelsurge if ((hazardFlags & SIDE_STATUS_STEELSURGE) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) - hazardDamage += GetStealthHazardDamageByTypesAndHP(gMovesInfo[MOVE_G_MAX_STEELSURGE].type, defType1, defType2, battleMon->maxHP); + hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_SHARP_STEEL, defType1, defType2, battleMon->maxHP); // Spikes if ((hazardFlags & SIDE_STATUS_SPIKES) && IsMonGrounded(heldItemEffect, ability, defType1, defType2)) { @@ -1294,9 +1424,9 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon && ability != ABILITY_IMMUNITY && ability != ABILITY_POISON_HEAL && ability != ABILITY_COMATOSE && status == 0 && !(hazardFlags & SIDE_STATUS_SAFEGUARD) - && !(IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL)) - && !(IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) - && !(IsAbilityStatusProtected(battler)) + && !IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL) + && !IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) + && !IsAbilityStatusProtected(battler, ability) && heldItemEffect != HOLD_EFFECT_CURE_PSN && heldItemEffect != HOLD_EFFECT_CURE_STATUS && IsMonGrounded(heldItemEffect, ability, defType1, defType2))) { @@ -1325,7 +1455,7 @@ static s32 GetSwitchinWeatherImpact(void) s32 weatherImpact = 0, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, ability = AI_DATA->switchinCandidate.battleMon.ability; u32 holdEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); - if (WEATHER_HAS_EFFECT) + if (HasWeatherEffect()) { // Damage if (holdEffect != HOLD_EFFECT_SAFETY_GOGGLES && ability != ABILITY_MAGIC_GUARD && ability != ABILITY_OVERCOAT) @@ -1533,7 +1663,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) u32 hitsToKO = 0, singleUseItemHeal = 0; u16 maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, item = AI_DATA->switchinCandidate.battleMon.item, heldItemEffect = ItemId_GetHoldEffect(item); u8 weatherDuration = gWishFutureKnock.weatherDuration, holdEffectParam = ItemId_GetHoldEffectParam(item); - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 opposingAbility = gBattleMons[opposingBattler].ability, ability = AI_DATA->switchinCandidate.battleMon.ability; bool32 usedSingleUseHealingItem = FALSE, opponentCanBreakMold = IsMoldBreakerTypeAbility(opposingBattler, opposingAbility); s32 currentHP = startingHP; @@ -1685,7 +1815,7 @@ static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattle for (i = 0; i < MAX_MON_MOVES; i++) { playerMove = gBattleMons[opposingBattler].moves[i]; - if (playerMove != MOVE_NONE && !IS_MOVE_STATUS(playerMove)) + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) { damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, FALSE, DMG_ROLL_HIGHEST); if (damageTaken > maxDamageTaken) @@ -1714,21 +1844,22 @@ static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent) return FALSE; } -static inline bool32 IsFreeSwitch(bool32 isSwitchAfterKO, u32 battlerSwitchingOut, u32 opposingBattler) +static inline bool32 IsFreeSwitch(enum SwitchType switchType, u32 battlerSwitchingOut, u32 opposingBattler) { bool32 movedSecond = GetBattlerTurnOrderNum(battlerSwitchingOut) > GetBattlerTurnOrderNum(opposingBattler) ? TRUE : FALSE; // Switch out effects if (!IsDoubleBattle()) // Not handling doubles' additional complexity { - if (IsSwitchOutEffect(gMovesInfo[gLastUsedMove].effect) && movedSecond) + if (IsSwitchOutEffect(GetMoveEffect(gLastUsedMove)) && movedSecond) return TRUE; if (AI_DATA->ejectButtonSwitch) return TRUE; if (AI_DATA->ejectPackSwitch) { + u32 opposingAbility = AI_GetBattlerAbility(opposingBattler); // If faster, not a free switch; likely lowered own stats - if (!movedSecond) + if (!movedSecond && opposingAbility != ABILITY_INTIMIDATE && opposingAbility != ABILITY_SUPERSWEET_SYRUP) // Intimidate triggers switches before turn starts return FALSE; // Otherwise, free switch return TRUE; @@ -1736,7 +1867,7 @@ static inline bool32 IsFreeSwitch(bool32 isSwitchAfterKO, u32 battlerSwitchingOu } // Post KO check has to be last because the GetMostSuitableMonToSwitchInto call in OpponentHandleChoosePokemon assumes a KO rather than a forced switch choice - if (isSwitchAfterKO) + if (switchType == SWITCH_AFTER_KO) return TRUE; else return FALSE; @@ -1758,7 +1889,7 @@ static inline bool32 CanSwitchinWin1v1(u32 hitsToKOAI, u32 hitsToKOPlayer, bool3 // This function splits switching behaviour depending on whether the switch is free. // Everything runs in the same loop to minimize computation time. This makes it harder to read, but hopefully the comments can guide you! -static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, u32 battler, u32 opposingBattler, u32 battlerIn1, u32 battlerIn2, bool32 isSwitchAfterKO) +static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, u32 battler, u32 opposingBattler, u32 battlerIn1, u32 battlerIn2, enum SwitchType switchType) { int revengeKillerId = PARTY_SIZE, slowRevengeKillerId = PARTY_SIZE, fastThreatenId = PARTY_SIZE, slowThreatenId = PARTY_SIZE, damageMonId = PARTY_SIZE; int batonPassId = PARTY_SIZE, typeMatchupId = PARTY_SIZE, typeMatchupEffectiveId = PARTY_SIZE, defensiveMonId = PARTY_SIZE, aceMonId = PARTY_SIZE, trapperId = PARTY_SIZE; @@ -1767,7 +1898,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0; u32 aiMove, hitsToKOAI, maxHitsToKO = 0; u16 bestResist = UQ_4_12(1.0), bestResistEffective = UQ_4_12(1.0), typeMatchup; - bool32 isFreeSwitch = IsFreeSwitch(isSwitchAfterKO, battlerIn1, opposingBattler), isSwitchinFirst, canSwitchinWin1v1; + bool32 isFreeSwitch = IsFreeSwitch(switchType, battlerIn1, opposingBattler), isSwitchinFirst, canSwitchinWin1v1; // Iterate through mons for (i = firstId; i < lastId; i++) @@ -1814,9 +1945,9 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, { aiMove = AI_DATA->switchinCandidate.battleMon.moves[j]; - if (aiMove != MOVE_NONE && !IS_MOVE_STATUS(aiMove)) + if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) { - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_CONSERVATIVE) + if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_CONSERVATIVE) damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, AI_DATA->switchinCandidate.battleMon, TRUE, DMG_ROLL_LOWEST); else damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, AI_DATA->switchinCandidate.battleMon, TRUE, DMG_ROLL_DEFAULT); @@ -1844,11 +1975,11 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, } // Check for mon with resistance and super effective move for best type matchup mon with effective move - if (aiMove != MOVE_NONE && !IS_MOVE_STATUS(aiMove)) + if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) { if (typeMatchup < bestResistEffective) { - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= AI_EFFECTIVENESS_x2) + if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0)) { if (canSwitchinWin1v1) { @@ -1859,7 +1990,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, } // If a self destruction move doesn't OHKO, don't factor it into revenge killing - if (gMovesInfo[aiMove].effect == EFFECT_EXPLOSION && damageDealt < playerMonHP) + if (GetMoveEffect(aiMove) == EFFECT_EXPLOSION && damageDealt < playerMonHP) continue; // Check that mon isn't one shot and set best damage mon @@ -1898,7 +2029,8 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, } // If mon can trap - if (CanAbilityTrapOpponent(AI_DATA->switchinCandidate.battleMon.ability, opposingBattler) + if ((CanAbilityTrapOpponent(AI_DATA->switchinCandidate.battleMon.ability, opposingBattler) + || (CanAbilityTrapOpponent(AI_GetBattlerAbility(opposingBattler), opposingBattler) && AI_DATA->switchinCandidate.battleMon.ability == ABILITY_TRACE)) && CountUsablePartyMons(opposingBattler) > 0 && canSwitchinWin1v1) trapperId = i; @@ -1931,8 +2063,9 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, else if (defensiveMonId != PARTY_SIZE) return defensiveMonId; else if (batonPassId != PARTY_SIZE) return batonPassId; } - // If ace mon is the last available Pokemon and U-Turn/Volt Switch was used - switch to the mon. - if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount && IsSwitchOutEffect(gMovesInfo[gLastUsedMove].effect)) + // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. + if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount + && (IsSwitchOutEffect(GetMoveEffect(gLastUsedMove)) || AI_DATA->ejectButtonSwitch || AI_DATA->ejectPackSwitch)) return aceMonId; return PARTY_SIZE; @@ -1958,7 +2091,7 @@ static u32 GetNextMonInParty(struct Pokemon *party, int firstId, int lastId, u32 return PARTY_SIZE; } -u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) +u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) { u32 opposingBattler = 0; u32 bestMonId = PARTY_SIZE; @@ -1967,18 +2100,18 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) s32 lastId = 0; // + 1 struct Pokemon *party; - if (*(gBattleStruct->monToSwitchIntoId + battler) != PARTY_SIZE) - return *(gBattleStruct->monToSwitchIntoId + battler); + if (gBattleStruct->monToSwitchIntoId[battler] != PARTY_SIZE) + return gBattleStruct->monToSwitchIntoId[battler]; if (gBattleTypeFlags & BATTLE_TYPE_ARENA) return gBattlerPartyIndexes[battler] + 1; if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); opposingBattler = BATTLE_OPPOSITE(battlerIn1); if (gAbsentBattlerFlags & (1u << opposingBattler)) @@ -1986,7 +2119,7 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) } else { - opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + opposingBattler = GetOppositeBattler(battler); battlerIn1 = battler; battlerIn2 = battler; } @@ -1994,16 +2127,16 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SEQUENCE_SWITCHING) + if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) { bestMonId = GetNextMonInParty(party, firstId, lastId, battlerIn1, battlerIn2); return bestMonId; } // Only use better mon selection if AI_FLAG_SMART_MON_CHOICES is set for the trainer. - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic + if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic { - bestMonId = GetBestMonIntegrated(party, firstId, lastId, battler, opposingBattler, battlerIn1, battlerIn2, switchAfterMonKOd); + bestMonId = GetBestMonIntegrated(party, firstId, lastId, battler, opposingBattler, battlerIn1, battlerIn2, switchType); return bestMonId; } @@ -2047,8 +2180,9 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, bool32 switchAfterMonKOd) if (bestMonId != PARTY_SIZE) return bestMonId; - // If ace mon is the last available Pokemon and U-Turn/Volt Switch was used - switch to the mon. - if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount && IsSwitchOutEffect(gMovesInfo[gLastUsedMove].effect)) + // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. + if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount + && (IsSwitchOutEffect(GetMoveEffect(gLastUsedMove)) || AI_DATA->ejectButtonSwitch || AI_DATA->ejectPackSwitch)) return aceMonId; return PARTY_SIZE; @@ -2156,7 +2290,7 @@ static bool32 ShouldUseItem(u32 battler) break; case EFFECT_ITEM_SET_MIST: battlerSide = GetBattlerSide(battler); - if (gDisableStructs[battler].isFirstTurn && gSideTimers[battlerSide].mistTimer == 0) + if (gDisableStructs[battler].isFirstTurn && !(gSideStatuses[battlerSide] & SIDE_STATUS_MIST)) shouldUse = TRUE; break; case EFFECT_ITEM_REVIVE: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 622426f2bd..f7b5ab9c64 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -11,6 +11,7 @@ #include "event_data.h" #include "data.h" #include "item.h" +#include "move.h" #include "pokemon.h" #include "random.h" #include "recorded_battle.h" @@ -22,18 +23,6 @@ #include "constants/moves.h" #include "constants/items.h" -#define CHECK_MOVE_FLAG(flag) \ - s32 i; \ - u16 *moves = GetMovesArray(battler); \ - for (i = 0; i < MAX_MON_MOVES; i++) \ - { \ - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && gMovesInfo[moves[i]].flag) \ - return TRUE; \ - } \ - return FALSE - -static u32 AI_GetEffectiveness(uq4_12_t multiplier); - // Functions u32 GetDmgRollType(u32 battlerAtk) { @@ -102,6 +91,27 @@ bool32 IsAiBattlerAware(u32 battlerId) return BattlerHasAi(battlerId); } +bool32 IsAiBattlerPredictingAbility(u32 battlerId) +{ + if (AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_WEIGH_ABILITY_PREDICTION + || AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_WEIGH_ABILITY_PREDICTION) + return TRUE; + + return BattlerHasAi(battlerId); +} + +bool32 IsBattlerPredictedToSwitch(u32 battler) +{ + // Check for prediction flag on AI, whether they're using those predictions this turn, and whether the AI thinks the player should switch + if (AI_THINKING_STRUCT->aiFlags[AI_DATA->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH + || AI_THINKING_STRUCT->aiFlags[AI_DATA->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH) + { + if (AI_DATA->predictingSwitch && AI_DATA->shouldSwitch & (1u << battler)) + return TRUE; + } + return FALSE; +} + void ClearBattlerMoveHistory(u32 battlerId) { memset(BATTLE_HISTORY->usedMoves[battlerId], 0, sizeof(BATTLE_HISTORY->usedMoves[battlerId])); @@ -281,7 +291,7 @@ u32 GetHealthPercentage(u32 battlerId) return (u32)((100 * gBattleMons[battlerId].hp) / gBattleMons[battlerId].maxHP); } -bool32 AtMaxHp(u32 battlerId) +bool32 AI_BattlerAtMaxHp(u32 battlerId) { if (AI_DATA->hpPercents[battlerId] == 100) return TRUE; @@ -329,9 +339,10 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) for (i = 0; i < MAX_MON_MOVES; i++) { u32 move = gBattleResources->battleHistory->usedMoves[opposingBattler][i]; - if (gMovesInfo[move].effect == EFFECT_PROTECT && move != MOVE_ENDURE) + u32 effect = GetMoveEffect(move); + if (effect == EFFECT_PROTECT && move != MOVE_ENDURE) return TRUE; - if (gMovesInfo[move].effect == EFFECT_SEMI_INVULNERABLE && AI_IsSlower(battlerAI, opposingBattler, GetAIChosenMove(battlerAI))) + if (effect == EFFECT_SEMI_INVULNERABLE && AI_IsSlower(battlerAI, opposingBattler, GetAIChosenMove(battlerAI))) return TRUE; } return FALSE; @@ -364,7 +375,7 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) && !(unusable & (1u << i))) { SetTypeBeforeUsingMove(moves[i], attacker); - moveType = GetMoveType(moves[i]); + moveType = GetBattleMoveType(moves[i]); if (CalcTypeEffectivenessMultiplier(moves[i], moveType, attacker, target, AI_DATA->abilities[target], FALSE) != 0) usable |= 1u << i; } @@ -374,7 +385,7 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) } // To save computation time this function has 2 variants. One saves, sets and restores battlers, while the other doesn't. -struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectiveness, bool32 considerZPower, enum DamageRollType rollType) +struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, enum DamageRollType rollType) { struct SimulatedDamage dmg; @@ -382,7 +393,7 @@ struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 b SaveBattlerData(battlerDef); SetBattlerData(battlerAtk); SetBattlerData(battlerDef); - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerZPower, AI_GetWeather(AI_DATA), rollType); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerZPower, AI_GetWeather(), rollType); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); return dmg; @@ -412,26 +423,17 @@ static inline s32 DmgRoll(s32 dmg) bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveType) { struct AiLogicData *aiData = AI_DATA; - u32 partnerBattlerDefAbility; - if (DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) - partnerBattlerDefAbility = ABILITY_NONE; - else - partnerBattlerDefAbility = aiData->abilities[BATTLE_PARTNER(battlerDef)]; - - if (gBattleStruct->commandingDondozo & (1u << battlerDef)) + if (gBattleStruct->battlerState[battlerDef].commandingDondozo) return TRUE; - if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef])) + if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], ABILITY_CHECK_TRIGGER)) return TRUE; - if (CanPartnerAbilityBlockMove(battlerAtk, battlerDef, move, partnerBattlerDefAbility)) + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, ABILITY_CHECK_TRIGGER)) return TRUE; - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType)) - return TRUE; - - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_DREAM_EATER: if (!AI_IsBattlerAsleepOrComatose(battlerDef)) @@ -451,11 +453,11 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy return TRUE; break; case EFFECT_FAIL_IF_NOT_ARG_TYPE: - if (!IS_BATTLER_OF_TYPE(battlerAtk, gMovesInfo[move].argument)) + if (!IS_BATTLER_OF_TYPE(battlerAtk, GetMoveArgType(move))) return TRUE; break; case EFFECT_HIT_SET_REMOVE_TERRAIN: - if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) && gMovesInfo[move].argument == ARG_TRY_REMOVE_TERRAIN_FAIL) + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) && GetMoveEffectArg_MoveProperty(move) == ARG_TRY_REMOVE_TERRAIN_FAIL) return TRUE; break; case EFFECT_POLTERGEIST: @@ -466,16 +468,6 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy if (!gDisableStructs[battlerAtk].isFirstTurn) return TRUE; break; - case EFFECT_FOCUS_PUNCH: - if (HasDamagingMove(battlerDef) && !((gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE) - || IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) - || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION))) - // TODO: || IsPredictedToSwitch(battlerDef, battlerAtk) - return TRUE; - // If AI could Sub and doesn't have a Sub, don't Punch yet - if (HasMoveEffect(battlerAtk, EFFECT_SUBSTITUTE) && !(gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE)) - return TRUE; - break; } return FALSE; @@ -493,7 +485,7 @@ static inline s32 GetDamageByRollType(s32 dmg, enum DamageRollType rollType) static inline void SetMoveDamageCategory(u32 battlerAtk, u32 battlerDef, u32 move) { - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_PHOTON_GEYSER: gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(battlerAtk) == DAMAGE_CATEGORY_PHYSICAL); @@ -516,14 +508,14 @@ static inline void SetMoveDamageCategory(u32 battlerAtk, u32 battlerDef, u32 mov static inline s32 SetFixedMoveBasePower(u32 battlerAtk, u32 move) { s32 fixedBasePower = 0, n = 0; - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_ROLLOUT: n = gDisableStructs[battlerAtk].rolloutTimer - 1; - fixedBasePower = CalcRolloutBasePower(battlerAtk, gMovesInfo[move].power, n < 0 ? 5 : n); + fixedBasePower = CalcRolloutBasePower(battlerAtk, GetMovePower(move), n < 0 ? 5 : n); break; case EFFECT_FURY_CUTTER: - fixedBasePower = CalcFuryCutterBasePower(gMovesInfo[move].power, min(gDisableStructs[battlerAtk].furyCutterCounter + 1, 5)); + fixedBasePower = CalcFuryCutterBasePower(GetMovePower(move), min(gDisableStructs[battlerAtk].furyCutterCounter + 1, 5)); break; default: fixedBasePower = 0; @@ -549,10 +541,11 @@ static inline void AI_RestoreBattlerTypes(u32 battlerAtk, u32 *types) static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCalcData, s32 *expectedDamage, s32 *minimumDamage, u32 holdEffectAtk, u32 abilityAtk) { u32 move = damageCalcData->move; + u32 effect = GetMoveEffect(move); s32 expected = *expectedDamage; s32 minimum = *minimumDamage; - switch (gMovesInfo[move].effect) + switch (effect) { case EFFECT_LEVEL_DAMAGE: expected = minimum = gBattleMons[damageCalcData->battlerAtk].level * (abilityAtk == ABILITY_PARENTAL_BOND ? 2 : 1); @@ -561,7 +554,7 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal expected = minimum = gBattleMons[damageCalcData->battlerAtk].level * (abilityAtk == ABILITY_PARENTAL_BOND ? 2 : 1); break; case EFFECT_FIXED_DAMAGE_ARG: - expected = minimum = gMovesInfo[move].argument * (abilityAtk == ABILITY_PARENTAL_BOND ? 2 : 1); + expected = minimum = GetMoveFixedDamage(move) * (abilityAtk == ABILITY_PARENTAL_BOND ? 2 : 1); break; case EFFECT_MULTI_HIT: if (move == MOVE_WATER_SHURIKEN && gBattleMons[damageCalcData->battlerAtk].species == SPECIES_GRENINJA_ASH) @@ -615,10 +608,11 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal } // Handle other multi-strike moves - if (gMovesInfo[move].strikeCount > 1 && gMovesInfo[move].effect != EFFECT_TRIPLE_KICK) + u32 strikeCount = GetMoveStrikeCount(move); + if (strikeCount > 1 && effect != EFFECT_TRIPLE_KICK) { - expected *= gMovesInfo[move].strikeCount; - minimum *= gMovesInfo[move].strikeCount; + expected *= strikeCount; + minimum *= strikeCount; } if (expected == 0) @@ -630,11 +624,11 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal *minimumDamage = minimum; } -struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectiveness, bool32 considerZPower, u32 weather, enum DamageRollType rollType) +struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, u32 weather, enum DamageRollType rollType) { struct SimulatedDamage simDamage; s32 moveType; - u32 moveEffect = gMovesInfo[move].effect; + u32 moveEffect = GetMoveEffect(move); uq4_12_t effectivenessMultiplier; bool32 isDamageMoveUnusable = FALSE; bool32 toggledGimmick = FALSE; @@ -658,13 +652,14 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u SetMoveDamageCategory(battlerAtk, battlerDef, move); SetTypeBeforeUsingMove(move, battlerAtk); - moveType = GetMoveType(move); + moveType = GetBattleMoveType(move); effectivenessMultiplier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, aiData->abilities[battlerDef], FALSE); - if (gMovesInfo[move].power) + u32 movePower = GetMovePower(move); + if (movePower) isDamageMoveUnusable = IsDamageMoveUnusable(battlerAtk, battlerDef, move, moveType); - if (gMovesInfo[move].power && !isDamageMoveUnusable) + if (movePower && !isDamageMoveUnusable) { s32 critChanceIndex, fixedBasePower; @@ -721,7 +716,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u s32 nonCritDmg = 0; if (moveEffect == EFFECT_TRIPLE_KICK) { - for (gMultiHitCounter = gMovesInfo[move].strikeCount; gMultiHitCounter > 0; gMultiHitCounter--) // The global is used to simulate actual damage done + for (gMultiHitCounter = GetMoveStrikeCount(move); gMultiHitCounter > 0; gMultiHitCounter--) // The global is used to simulate actual damage done { nonCritDmg += CalculateMoveDamageVars(&damageCalcData, fixedBasePower, effectivenessMultiplier, weather, @@ -758,7 +753,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u } // convert multiper to AI_EFFECTIVENESS_xX - *typeEffectiveness = AI_GetEffectiveness(effectivenessMultiplier); + *typeEffectiveness = effectivenessMultiplier; // Undo temporary settings gBattleStruct->dynamicMoveType = 0; @@ -785,25 +780,31 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 u32 abilityDef = AI_DATA->abilities[battlerDef]; u32 abilityAtk = AI_DATA->abilities[battlerAtk]; - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_HIT_ESCAPE: if (CountUsablePartyMons(battlerAtk) != 0 && ShouldPivot(battlerAtk, battlerDef, abilityDef, move, AI_THINKING_STRUCT->movesetIndex)) return TRUE; break; case EFFECT_FELL_STINGER: - if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK)) + if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK) && noOfHitsToKo == 1) + return TRUE; + break; + case EFFECT_PURSUIT: + if(noOfHitsToKo == 1) return TRUE; break; } // check ADDITIONAL_EFFECTS - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + for (i = 0; i < additionalEffectCount; i++) { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); // Consider move effects that target self - if (gMovesInfo[move].additionalEffects[i].self) + if (additionalEffect->self) { - switch (gMovesInfo[move].additionalEffects[i].moveEffect) + switch (additionalEffect->moveEffect) { case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_ATK_PLUS_2: @@ -846,7 +847,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 } else // consider move effects that hinder the target { - switch (gMovesInfo[move].additionalEffects[i].moveEffect) + switch (additionalEffect->moveEffect) { case MOVE_EFFECT_POISON: case MOVE_EFFECT_TOXIC: @@ -880,7 +881,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) + if (ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) return TRUE; break; case MOVE_EFFECT_ATK_MINUS_2: @@ -890,7 +891,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_2: case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) + if (ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) return TRUE; break; } @@ -907,10 +908,10 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s u8 i; // recoil - if (gMovesInfo[move].recoil > 0 && AI_IsDamagedByRecoil(battlerAtk)) + if (GetMoveRecoil(move) > 0 && AI_IsDamagedByRecoil(battlerAtk)) return TRUE; - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_MAX_HP_50_RECOIL: case EFFECT_MIND_BLOWN: @@ -923,9 +924,11 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s break; default: { - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + for (i = 0; i < additionalEffectCount; i++) { - switch (gMovesInfo[move].additionalEffects[i].moveEffect) + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + switch (additionalEffect->moveEffect) { case MOVE_EFFECT_ATK_MINUS_1: case MOVE_EFFECT_DEF_MINUS_1: @@ -944,12 +947,12 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s case MOVE_EFFECT_V_CREATE: case MOVE_EFFECT_ATK_DEF_DOWN: case MOVE_EFFECT_DEF_SPDEF_DOWN: - if ((gMovesInfo[move].additionalEffects[i].self && abilityAtk != ABILITY_CONTRARY) - || (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(abilityAtk, move))) + if ((additionalEffect->self && abilityAtk != ABILITY_CONTRARY) + || (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move))) return TRUE; break; case MOVE_EFFECT_RECHARGE: - return gMovesInfo[move].additionalEffects[i].self; + return additionalEffect->self; case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_DEF_PLUS_1: case MOVE_EFFECT_SPD_PLUS_1: @@ -965,8 +968,8 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s case MOVE_EFFECT_EVS_PLUS_2: case MOVE_EFFECT_ACC_PLUS_2: case MOVE_EFFECT_ALL_STATS_UP: - if ((gMovesInfo[move].additionalEffects[i].self && abilityAtk == ABILITY_CONTRARY) - || (noOfHitsToKo != 1 && !(abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(abilityAtk, move)))) + if ((additionalEffect->self && abilityAtk == ABILITY_CONTRARY) + || (noOfHitsToKo != 1 && !(abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move)))) return TRUE; break; } @@ -989,9 +992,11 @@ s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 && (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_ROCKY_HELMET || defAbility == ABILITY_IRON_BARBS || defAbility == ABILITY_ROUGH_SKIN)) { - if (gMovesInfo[move1].makesContact && !gMovesInfo[move2].makesContact) + bool32 moveContact1 = MoveMakesContact(move1); + bool32 moveContact2 = MoveMakesContact(move2); + if (moveContact1 && !moveContact2) return -1; - if (gMovesInfo[move2].makesContact && !gMovesInfo[move1].makesContact) + if (moveContact2 && !moveContact1) return 1; } @@ -1037,7 +1042,7 @@ u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef) return (bestDmg * 100) / gBattleMons[battlerDef].maxHP; } -uq4_12_t AI_GetTypeEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) +uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) { uq4_12_t typeEffectiveness; u32 moveType; @@ -1050,7 +1055,7 @@ uq4_12_t AI_GetTypeEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) gBattleStruct->dynamicMoveType = 0; SetTypeBeforeUsingMove(move, battlerAtk); - moveType = GetMoveType(move); + moveType = GetBattleMoveType(move); typeEffectiveness = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], FALSE); RestoreBattlerData(battlerAtk); @@ -1059,36 +1064,6 @@ uq4_12_t AI_GetTypeEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) return typeEffectiveness; } -u32 AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) -{ - gMoveResultFlags = 0; - return AI_GetEffectiveness(AI_GetTypeEffectiveness(move, battlerAtk, battlerDef)); -} - -static u32 AI_GetEffectiveness(uq4_12_t multiplier) -{ - switch (multiplier) - { - case UQ_4_12(0.0): - return AI_EFFECTIVENESS_x0; - case UQ_4_12(0.125): - return AI_EFFECTIVENESS_x0_125; - case UQ_4_12(0.25): - return AI_EFFECTIVENESS_x0_25; - case UQ_4_12(0.5): - return AI_EFFECTIVENESS_x0_5; - case UQ_4_12(1.0): - default: - return AI_EFFECTIVENESS_x1; - case UQ_4_12(2.0): - return AI_EFFECTIVENESS_x2; - case UQ_4_12(4.0): - return AI_EFFECTIVENESS_x4; - case UQ_4_12(8.0): - return AI_EFFECTIVENESS_x8; - } -} - /* Checks to see if AI will move ahead of another battler * The function uses a stripped down version of the checks from GetWhichBattlerFasterArgs * Output: @@ -1105,8 +1080,8 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered) u32 predictedMove = AI_DATA->lastUsedMove[battler]; // TODO update for move prediction - s8 aiPriority = GetMovePriority(battlerAI, moveConsidered); - s8 playerPriority = GetMovePriority(battler, predictedMove); + s8 aiPriority = GetBattleMovePriority(battlerAI, moveConsidered); + s8 playerPriority = GetBattleMovePriority(battler, predictedMove); if (aiPriority > playerPriority) return AI_IS_FASTER; @@ -1150,14 +1125,15 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered) static bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) { - if (!BATTLER_MAX_HP(battlerTarget) || gMovesInfo[move].effect == EFFECT_MULTI_HIT) + u32 effect = GetMoveEffect(move); + if (!AI_BattlerAtMaxHp(battlerTarget) || effect == EFFECT_MULTI_HIT) return FALSE; - if (gMovesInfo[move].strikeCount > 1 && !(gMovesInfo[move].effect == EFFECT_DRAGON_DARTS && IsValidDoubleBattle(battlerTarget))) + if (GetMoveStrikeCount(move) > 1 && !(effect == EFFECT_DRAGON_DARTS && IsValidDoubleBattle(battlerTarget))) return FALSE; if (AI_DATA->holdEffects[battlerTarget] == HOLD_EFFECT_FOCUS_SASH) return TRUE; - if (!DoesBattlerIgnoreAbilityChecks(AI_DATA->abilities[battler], move)) + if (!DoesBattlerIgnoreAbilityChecks(battler, AI_DATA->abilities[battler], move)) { if (B_STURDY >= GEN_5 && AI_DATA->abilities[battlerTarget] == ABILITY_STURDY) return TRUE; @@ -1349,10 +1325,12 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId) u32 validAbilities[NUM_ABILITY_SLOTS]; u8 i, numValidAbilities = 0; u32 knownAbility = AI_GetBattlerAbility(battlerId); + u32 indexAbility; + u32 abilityAiRatings[NUM_ABILITY_SLOTS] = {0}; // We've had ability overwritten by e.g. Worry Seed. It is not part of AI_PARTY in case of switching - if (gBattleStruct->overwrittenAbilities[battlerId]) - return gBattleStruct->overwrittenAbilities[battlerId]; + if (gDisableStructs[battlerId].overwrittenAbility) + return gDisableStructs[battlerId].overwrittenAbility; // The AI knows its own ability. if (IsAiBattlerAware(battlerId)) @@ -1371,10 +1349,17 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId) for (i = 0; i < NUM_ABILITY_SLOTS; i++) { - if (gSpeciesInfo[gBattleMons[battlerId].species].abilities[i] != ABILITY_NONE) - validAbilities[numValidAbilities++] = gSpeciesInfo[gBattleMons[battlerId].species].abilities[i]; + indexAbility = gSpeciesInfo[gBattleMons[battlerId].species].abilities[i]; + if (indexAbility != ABILITY_NONE) + { + abilityAiRatings[numValidAbilities] = gAbilitiesInfo[indexAbility].aiRating; + validAbilities[numValidAbilities++] = indexAbility; + } } + if (numValidAbilities > 0 && IsAiBattlerPredictingAbility(battlerId)) + return validAbilities[RandomWeighted(RNG_AI_PREDICT_ABILITY, abilityAiRatings[0], abilityAiRatings[1], abilityAiRatings[2])]; + if (numValidAbilities > 0) return validAbilities[RandomUniform(RNG_AI_ABILITY, 0, numValidAbilities - 1)]; @@ -1403,44 +1388,45 @@ u32 AI_DecideHoldEffectForTurn(u32 battlerId) return holdEffect; } -bool32 DoesBattlerIgnoreAbilityChecks(u32 atkAbility, u32 move) +bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move) { - if (AI_THINKING_STRUCT->aiFlags[sBattler_AI] & AI_FLAG_NEGATE_UNAWARE) + if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; // AI handicap flag: doesn't understand ability suppression concept - if (IsMoldBreakerTypeAbility(sBattler_AI, atkAbility) || gMovesInfo[move].ignoresTargetAbility) + if (IsMoldBreakerTypeAbility(battlerAtk, atkAbility) || MoveIgnoresTargetAbility(move)) return TRUE; return FALSE; } -static inline bool32 AI_WeatherHasEffect(struct AiLogicData *aiData) +static inline bool32 AI_WeatherHasEffect(void) { - if (AI_THINKING_STRUCT->aiFlags[sBattler_AI] & AI_FLAG_NEGATE_UNAWARE) + if (AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_NEGATE_UNAWARE + || AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_NEGATE_UNAWARE) return TRUE; // AI doesn't understand weather supression (handicap) - return aiData->weatherHasEffect; // weather damping abilities are announced + return AI_DATA->weatherHasEffect; // weather damping abilities are announced } -u32 AI_GetWeather(struct AiLogicData *aiData) +u32 AI_GetWeather(void) { if (gBattleWeather == B_WEATHER_NONE) return B_WEATHER_NONE; - if (!AI_WeatherHasEffect(aiData)) + if (!AI_WeatherHasEffect()) return B_WEATHER_NONE; return gBattleWeather; } -bool32 IsAromaVeilProtectedMove(u32 move) +bool32 IsAromaVeilProtectedEffect(u32 moveEffect) { - switch (move) + switch (moveEffect) { - case MOVE_DISABLE: - case MOVE_ATTRACT: - case MOVE_ENCORE: - case MOVE_TORMENT: - case MOVE_TAUNT: - case MOVE_HEAL_BLOCK: + case EFFECT_DISABLE: + case EFFECT_ATTRACT: + case EFFECT_ENCORE: + case EFFECT_TORMENT: + case EFFECT_TAUNT: + case EFFECT_HEAL_BLOCK: return TRUE; default: return FALSE; @@ -1476,8 +1462,10 @@ bool32 IsConfusionMoveEffect(u32 moveEffect) } } -bool32 IsHazardMoveEffect(u32 moveEffect) +bool32 IsHazardMove(u32 move) { + // Hazard setting moves like Stealth Rock, Spikes, etc. + u32 i, moveEffect = gMovesInfo[move].effect; switch (moveEffect) { case EFFECT_SPIKES: @@ -1485,18 +1473,58 @@ bool32 IsHazardMoveEffect(u32 moveEffect) case EFFECT_STICKY_WEB: case EFFECT_STEALTH_ROCK: return TRUE; - default: - return FALSE; } + + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + for (i = 0; i < additionalEffectCount; i++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + switch (additionalEffect->moveEffect) + { + case MOVE_EFFECT_STEELSURGE: + return TRUE; + } + } + return FALSE; } -bool32 IsMoveRedirectionPrevented(u32 move, u32 atkAbility) +bool32 IsHazardClearingMove(u32 move) { - if (AI_THINKING_STRUCT->aiFlags[sBattler_AI] & AI_FLAG_NEGATE_UNAWARE) + // Hazard clearing effects like Rapid Spin, Tidy Up, etc. + u32 i, moveEffect = gMovesInfo[move].effect; + switch (moveEffect) + { + case EFFECT_RAPID_SPIN: + case EFFECT_TIDY_UP: + return TRUE; + case EFFECT_DEFOG: + if (B_DEFOG_EFFECT_CLEARING >= GEN_6) + return TRUE; + break; + } + + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + for (i = 0; i < additionalEffectCount; i++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + switch (additionalEffect->moveEffect) + { + case MOVE_EFFECT_DEFOG: + return TRUE; + } + } + + return FALSE; +} + +bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility) +{ + if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; - if (move == MOVE_SKY_DROP - || move == MOVE_SNIPE_SHOT + u32 effect = GetMoveEffect(move); + if (effect == EFFECT_SKY_DROP + || effect == EFFECT_SNIPE_SHOT || atkAbility == ABILITY_PROPELLER_TAIL || atkAbility == ABILITY_STALWART) return TRUE; @@ -1507,13 +1535,13 @@ bool32 IsSemiInvulnerable(u32 battlerDef, u32 move) { if (gStatuses3[battlerDef] & STATUS3_PHANTOM_FORCE) return TRUE; - else if (gBattleStruct->commandingDondozo & (1u << battlerDef)) + else if (gBattleStruct->battlerState[battlerDef].commandingDondozo) return TRUE; - else if (!gMovesInfo[move].damagesAirborne && gStatuses3[battlerDef] & STATUS3_ON_AIR) + else if (!MoveDamagesAirborne(move) && gStatuses3[battlerDef] & STATUS3_ON_AIR) return TRUE; - else if (!gMovesInfo[move].damagesUnderwater && gStatuses3[battlerDef] & STATUS3_UNDERWATER) + else if (!MoveDamagesUnderWater(move) && gStatuses3[battlerDef] & STATUS3_UNDERWATER) return TRUE; - else if (!gMovesInfo[move].damagesUnderground && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) + else if (!MoveDamagesUnderground(move) && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) return TRUE; else return FALSE; @@ -1534,22 +1562,23 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) if (AI_DATA->abilities[battlerDef] == ABILITY_NO_GUARD || AI_DATA->abilities[battlerAtk] == ABILITY_NO_GUARD) return TRUE; - if (B_TOXIC_NEVER_MISS >= GEN_6 && gMovesInfo[move].effect == EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) + u32 effect = GetMoveEffect(move); + if (B_TOXIC_NEVER_MISS >= GEN_6 && effect == EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) return TRUE; // discouraged from hitting - weather = AI_GetWeather(AI_DATA); - if ((weather & B_WEATHER_SUN) && gMovesInfo[move].effect == EFFECT_THUNDER) + weather = AI_GetWeather(); + if ((weather & B_WEATHER_SUN) && effect == EFFECT_THUNDER) return FALSE; // increased accuracy but don't always hit - if ((weather & B_WEATHER_RAIN) && gMovesInfo[move].effect == EFFECT_THUNDER) + if ((weather & B_WEATHER_RAIN) && effect == EFFECT_THUNDER) return TRUE; - if ((weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && gMovesInfo[move].effect == EFFECT_BLIZZARD) + if ((weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && effect == EFFECT_BLIZZARD) return TRUE; - if (B_MINIMIZE_DMG_ACC >= GEN_6 && (gStatuses3[battlerDef] & STATUS3_MINIMIZED) && gMovesInfo[move].minimizeDoubleDamage) + if (B_MINIMIZE_DMG_ACC >= GEN_6 && (gStatuses3[battlerDef] & STATUS3_MINIMIZED) && MoveIncreasesPowerToMinimizedTargets(move)) return TRUE; - if (gMovesInfo[move].accuracy == 0) + if (GetMoveAccuracy(move) == 0) return TRUE; return FALSE; @@ -1563,10 +1592,10 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil gPotentialItemEffectBattler = battlerDef; if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < AI_DATA->holdEffectParams[battlerDef]) return FALSE; //probabilistically speaking, focus band should activate so dont OHKO - else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && AtMaxHp(battlerDef)) + else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && AI_BattlerAtMaxHp(battlerDef)) return FALSE; - if (!DoesBattlerIgnoreAbilityChecks(atkAbility, move) && defAbility == ABILITY_STURDY) + if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, atkAbility, move) && defAbility == ABILITY_STURDY) return FALSE; if ((((gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS) @@ -1589,7 +1618,7 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect) { - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (weather & B_WEATHER_SANDSTORM) return FALSE; @@ -1599,9 +1628,7 @@ bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect) || ability == ABILITY_OVERCOAT || ability == ABILITY_MAGIC_GUARD || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES - || IS_BATTLER_OF_TYPE(battler, TYPE_ROCK) - || IS_BATTLER_OF_TYPE(battler, TYPE_STEEL) - || IS_BATTLER_OF_TYPE(battler, TYPE_GROUND) + || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) || HasMoveEffect(battler, EFFECT_SHORE_UP) || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) { @@ -1612,7 +1639,7 @@ bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect) bool32 ShouldSetHail(u32 battler, u32 ability, u32 holdEffect) { - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) return FALSE; @@ -1635,7 +1662,7 @@ bool32 ShouldSetHail(u32 battler, u32 ability, u32 holdEffect) bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, u32 holdEffect) { - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (weather & B_WEATHER_RAIN) return FALSE; @@ -1656,7 +1683,7 @@ bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, u32 holdEffect) bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect) { - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (weather & B_WEATHER_SUN) return FALSE; @@ -1682,7 +1709,7 @@ bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect) bool32 ShouldSetSnow(u32 battler, u32 ability, u32 holdEffect) { - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (weather & (B_WEATHER_SNOW | B_WEATHER_HAIL)) return FALSE; @@ -1713,7 +1740,7 @@ void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, if (uses == 0) { - if (predictedMove != MOVE_NONE && predictedMove != 0xFFFF && !IS_MOVE_STATUS(predictedMove)) + if (predictedMove != MOVE_NONE && predictedMove != 0xFFFF && !IsBattleMoveStatus(predictedMove)) ADJUST_SCORE_PTR(DECENT_EFFECT); else if (Random() % 256 < 100) ADJUST_SCORE_PTR(WEAK_EFFECT); @@ -1740,11 +1767,11 @@ void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, } // stat stages -bool32 ShouldLowerStat(u32 battler, u32 battlerAbility, u32 stat) +bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 battlerAbility, u32 stat) { - if (gBattleMons[battler].statStages[stat] > MIN_STAT_STAGE && battlerAbility != ABILITY_CONTRARY) + if (gBattleMons[battlerDef].statStages[stat] > MIN_STAT_STAGE && battlerAbility != ABILITY_CONTRARY) { - if (AI_DATA->holdEffects[battler] == HOLD_EFFECT_CLEAR_AMULET + if (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET || battlerAbility == ABILITY_CLEAR_BODY || battlerAbility == ABILITY_WHITE_SMOKE || battlerAbility == ABILITY_FULL_METAL_BODY) @@ -1758,9 +1785,9 @@ bool32 ShouldLowerStat(u32 battler, u32 battlerAbility, u32 stat) return !(battlerAbility == ABILITY_BIG_PECKS); case STAT_SPEED: // If AI is faster and doesn't have any mons left, lowering speed doesn't give any - return !(AI_IsFaster(sBattler_AI, battler, AI_THINKING_STRUCT->moveConsidered) - && CountUsablePartyMons(sBattler_AI) == 0 - && !HasMoveEffect(sBattler_AI, EFFECT_ELECTRO_BALL)); + return !(AI_IsFaster(battlerAtk, battlerDef, AI_THINKING_STRUCT->moveConsidered) + && CountUsablePartyMons(battlerAtk) == 0 + && !HasMoveEffect(battlerAtk, EFFECT_ELECTRO_BALL)); case STAT_ACC: return !(battlerAbility == ABILITY_KEEN_EYE || (B_ILLUMINATE_EFFECT >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE)); } @@ -1977,7 +2004,7 @@ bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensiv for (i = 0; i < MAX_MON_MOVES; i++) { - if (onlyOffensive && IS_MOVE_STATUS(moves[i])) + if (onlyOffensive && IsBattleMoveStatus(moves[i])) continue; if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetBattleMoveCategory(moves[i]) != category) return FALSE; @@ -2006,7 +2033,7 @@ bool32 HasMoveWithType(u32 battler, u32 type) for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && gMovesInfo[moves[i]].type == type) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMoveType(moves[i]) == type) return TRUE; } @@ -2021,14 +2048,14 @@ bool32 HasMoveEffect(u32 battlerId, u32 effect) for (i = 0; i < MAX_MON_MOVES; i++) { if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && gMovesInfo[moves[i]].effect == effect) + && GetMoveEffect(moves[i]) == effect) return TRUE; } return FALSE; } -bool32 HasMoveEffectANDArg(u32 battlerId, u32 effect, u32 argument) +bool32 IsPowerBasedOnStatus(u32 battlerId, u32 effect, u32 argument) { s32 i; u16 *moves = GetMovesArray(battlerId); @@ -2036,8 +2063,8 @@ bool32 HasMoveEffectANDArg(u32 battlerId, u32 effect, u32 argument) for (i = 0; i < MAX_MON_MOVES; i++) { if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && gMovesInfo[moves[i]].effect == effect - && (gMovesInfo[moves[i]].argument & argument)) + && GetMoveEffect(moves[i]) == effect + && (GetMoveEffectArg_Status(moves[i]) & argument)) return TRUE; } @@ -2067,7 +2094,7 @@ bool32 HasMoveWithCriticalHitChance(u32 battlerId) for (i = 0; i < MAX_MON_MOVES; i++) { if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && gMovesInfo[moves[i]].criticalHitStage > 0) + && GetMoveCriticalHitStage(moves[i]) > 0) return TRUE; } @@ -2082,7 +2109,7 @@ bool32 HasMoveWithMoveEffectExcept(u32 battlerId, u32 moveEffect, u32 exception) for (i = 0; i < MAX_MON_MOVES; i++) { if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && gMovesInfo[moves[i]].effect != exception + && GetMoveEffect(moves[i]) != exception && MoveHasAdditionalEffect(moves[i], moveEffect)) return TRUE; } @@ -2128,9 +2155,11 @@ bool32 HasMoveThatLowersOwnStats(u32 battlerId) aiMove = moves[i]; if (aiMove != MOVE_NONE && aiMove != MOVE_UNAVAILABLE) { - for (j = 0; j < gMovesInfo[aiMove].numAdditionalEffects; j++) + u32 additionalEffectCount = GetMoveAdditionalEffectCount(aiMove); + for (j = 0; j < additionalEffectCount; j++) { - if (IsSelfStatLoweringEffect(gMovesInfo[aiMove].additionalEffects[j].moveEffect) && gMovesInfo[aiMove].additionalEffects[j].self) + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(aiMove, j); + if (IsSelfStatLoweringEffect(additionalEffect->moveEffect) && additionalEffect->self) return TRUE; } } @@ -2151,9 +2180,9 @@ bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool if (!((1u << i) & moveLimitations)) { - if (ignoreStatus && IS_MOVE_STATUS(moves[i])) + if (ignoreStatus && IsBattleMoveStatus(moves[i])) continue; - else if ((!IS_MOVE_STATUS(moves[i]) && gMovesInfo[moves[i]].accuracy == 0) + else if ((!IsBattleMoveStatus(moves[i]) && GetMoveAccuracy(moves[i]) == 0) || GetBattlerMoveTargetType(battlerAtk, moves[i]) & (MOVE_TARGET_USER | MOVE_TARGET_OPPONENTS_FIELD)) continue; @@ -2177,7 +2206,7 @@ bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef) break; if (!((1u << i) & moveLimitations)) { - if (gMovesInfo[moves[i]].effect == EFFECT_SLEEP + if (GetMoveEffect(moves[i]) == EFFECT_SLEEP && AI_DATA->moveAccuracy[battlerAtk][battlerDef][i] < 85) return TRUE; } @@ -2185,11 +2214,6 @@ bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef) return FALSE; } -bool32 IsHealingMove(u32 move) -{ - return gMovesInfo[move].healingMove; -} - bool32 HasHealingEffect(u32 battlerId) { s32 i; @@ -2206,7 +2230,7 @@ bool32 HasHealingEffect(u32 battlerId) bool32 IsTrappingMove(u32 move) { - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_MEAN_LOOK: case EFFECT_FAIRY_LOCK: @@ -2234,7 +2258,14 @@ bool32 HasTrappingMoveEffect(u32 battler) bool32 HasThawingMove(u32 battler) { - CHECK_MOVE_FLAG(thawsUser); + s32 i; + u16 *moves = GetMovesArray(battler); + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveThawsUser(moves[i])) + return TRUE; + } + return FALSE; } bool32 IsUngroundingEffect(u32 effect) @@ -2387,6 +2418,60 @@ bool32 IsSwitchOutEffect(u32 effect) } } +bool32 IsSubstituteEffect(u32 effect) +{ + // Substitute effects like Substitute, Shed Tail, etc. + switch (effect) + { + case EFFECT_SUBSTITUTE: + case EFFECT_SHED_TAIL: + return TRUE; + default: + return FALSE; + } +} + +bool32 IsChaseEffect(u32 effect) +{ + // Effects that hit switching out mons like Pursuit + switch (effect) + { + case EFFECT_PURSUIT: + return TRUE; + default: + return FALSE; + } +} + +static inline bool32 IsMoveSleepClauseTrigger(u32 move) +{ + u32 i, effect = GetMoveEffect(move); + + // Sleeping effects like Sleep Powder, Yawn, Dark Void, etc. + switch (effect) + { + case EFFECT_SLEEP: + case EFFECT_YAWN: + case EFFECT_DARK_VOID: + return TRUE; + } + + // Sleeping effects like G-Max Befuddle, G-Max Snooze, etc. + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + for (i = 0; i < additionalEffectCount; i++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + switch (additionalEffect->moveEffect) + { + // Skip MOVE_EFFECT_SLEEP as moves with a secondary chance of applying sleep are allowed by Smogon's rules (ie. Relic Song) + case MOVE_EFFECT_EFFECT_SPORE_SIDE: + case MOVE_EFFECT_YAWN_FOE: + return TRUE; + } + } + return FALSE; +} + bool32 HasDamagingMove(u32 battlerId) { u32 i; @@ -2394,7 +2479,7 @@ bool32 HasDamagingMove(u32 battlerId) for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !IS_MOVE_STATUS(moves[i])) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !IsBattleMoveStatus(moves[i])) return TRUE; } @@ -2409,7 +2494,7 @@ bool32 HasDamagingMoveOfType(u32 battlerId, u32 type) for (i = 0; i < MAX_MON_MOVES; i++) { if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && gMovesInfo[moves[i]].type == type && !IS_MOVE_STATUS(moves[i])) + && GetMoveType(moves[i]) == type && !IsBattleMoveStatus(moves[i])) return TRUE; } @@ -2418,7 +2503,14 @@ bool32 HasDamagingMoveOfType(u32 battlerId, u32 type) bool32 HasSubstituteIgnoringMove(u32 battler) { - CHECK_MOVE_FLAG(ignoresSubstitute); + s32 i; + u16 *moves = GetMovesArray(battler); + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveIgnoresSubstitute(moves[i])) + return TRUE; + } + return FALSE; } bool32 HasHighCritRatioMove(u32 battler) @@ -2428,7 +2520,7 @@ bool32 HasHighCritRatioMove(u32 battler) for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && gMovesInfo[moves[i]].criticalHitStage > 0) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMoveCriticalHitStage(moves[i]) > 0) return TRUE; } @@ -2437,22 +2529,36 @@ bool32 HasHighCritRatioMove(u32 battler) bool32 HasMagicCoatAffectedMove(u32 battler) { - CHECK_MOVE_FLAG(magicCoatAffected); + s32 i; + u16 *moves = GetMovesArray(battler); + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveCanBeBouncedBack(moves[i])) + return TRUE; + } + return FALSE; } bool32 HasSnatchAffectedMove(u32 battler) { - CHECK_MOVE_FLAG(snatchAffected); + s32 i; + u16 *moves = GetMovesArray(battler); + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveCanBeSnatched(moves[i])) + return TRUE; + } + return FALSE; } bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move) { - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_SOLAR_BEAM: case EFFECT_TWO_TURNS_ATTACK: return !(AI_DATA->holdEffects[battlerAtk] == HOLD_EFFECT_POWER_HERB - || (AI_GetWeather(AI_DATA) & gMovesInfo[move].argument)); + || (AI_GetWeather() & GetMoveTwoTurnAttackWeather(move))); default: return FALSE; } @@ -2540,9 +2646,7 @@ static u32 GetPoisonDamage(u32 battlerId) static bool32 BattlerAffectedBySandstorm(u32 battlerId, u32 ability) { - if (!IS_BATTLER_OF_TYPE(battlerId, TYPE_ROCK) - && !IS_BATTLER_OF_TYPE(battlerId, TYPE_GROUND) - && !IS_BATTLER_OF_TYPE(battlerId, TYPE_STEEL) + if (!IS_BATTLER_ANY_TYPE(battlerId, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) && ability != ABILITY_SAND_VEIL && ability != ABILITY_SAND_FORCE && ability != ABILITY_SAND_RUSH @@ -2566,7 +2670,7 @@ static u32 GetWeatherDamage(u32 battlerId) u32 ability = AI_DATA->abilities[battlerId]; u32 holdEffect = AI_DATA->holdEffects[battlerId]; u32 damage = 0; - u32 weather = AI_GetWeather(AI_DATA); + u32 weather = AI_GetWeather(); if (!weather) return 0; @@ -2656,23 +2760,13 @@ static bool32 AnyUsefulStatIsRaised(u32 battler) return FALSE; } -struct Pokemon *GetPartyBattlerPartyData(u32 battlerId, u32 switchBattler) -{ - struct Pokemon *mon; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) - mon = &gPlayerParty[switchBattler]; - else - mon = &gEnemyParty[switchBattler]; - return mon; -} - static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) { - struct Pokemon *mon = GetPartyBattlerPartyData(currBattler, switchBattler); + struct Pokemon *mon = &GetBattlerParty(currBattler)[switchBattler]; u32 ability = GetMonAbility(mon); // we know our own party data u32 holdEffect; u32 species = GetMonData(mon, MON_DATA_SPECIES); - u32 flags = gSideStatuses[GetBattlerSide(currBattler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES); + u32 flags = gSideStatuses[GetBattlerSide(currBattler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STEELSURGE | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES); s32 hazardDamage = 0; u32 type1 = gSpeciesInfo[species].types[0]; u32 type2 = gSpeciesInfo[species].types[1]; @@ -2691,7 +2785,9 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) return FALSE; if (flags & SIDE_STATUS_STEALTH_ROCK) - hazardDamage += GetStealthHazardDamageByTypesAndHP(gMovesInfo[MOVE_STEALTH_ROCK].type, type1, type2, maxHp); + hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_POINTED_STONES, type1, type2, maxHp); + if ((flags & SIDE_STATUS_STEELSURGE)) + hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_SHARP_STEEL, type1, type2, maxHp); if (flags & SIDE_STATUS_SPIKES && ((type1 != TYPE_FLYING && type2 != TYPE_FLYING && ability != ABILITY_LEVITATE && holdEffect != HOLD_EFFECT_AIR_BALLOON) @@ -2723,9 +2819,8 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov if (CountUsablePartyMons(battlerAtk) == 0) return CAN_TRY_PIVOT; // can't switch, but attack might still be useful - //TODO - predict opponent switching - /*if (IsPredictedToSwitch(battlerDef, battlerAtk) && !hasStatBoost) - return SHOULD_PIVOT; // Try pivoting so you can switch to a better matchup to counter your new opponent*/ + if (IsBattlerPredictedToSwitch(battlerDef)) + return SHOULD_PIVOT; // Try pivoting so you can switch to a better matchup to counter your new opponent if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker goes first { @@ -2737,8 +2832,8 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov if (CanTargetFaintAi(battlerDef, battlerAtk)) return SHOULD_PIVOT; // Won't get the two turns, pivot - if (!IS_MOVE_STATUS(move) && ((AI_DATA->shouldSwitch & (1u << battlerAtk)) - || (AtMaxHp(battlerDef) && (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH + if (!IsBattleMoveStatus(move) && ((AI_DATA->shouldSwitch & (1u << battlerAtk)) + || (AI_BattlerAtMaxHp(battlerDef) && (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH || (B_STURDY >= GEN_5 && defAbility == ABILITY_STURDY) || defAbility == ABILITY_MULTISCALE || defAbility == ABILITY_SHADOW_SHIELD)))) @@ -2746,7 +2841,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov } else if (!hasStatBoost) { - if (!IS_MOVE_STATUS(move) && (AtMaxHp(battlerDef) && (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH + if (!IsBattleMoveStatus(move) && (AI_BattlerAtMaxHp(battlerDef) && (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH || (B_STURDY >= GEN_5 && defAbility == ABILITY_STURDY) || defAbility == ABILITY_MULTISCALE || defAbility == ABILITY_SHADOW_SHIELD))) @@ -2793,7 +2888,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov { if (CanTargetFaintAi(battlerDef, battlerAtk)) { - if (gMovesInfo[move].effect == EFFECT_TELEPORT) + if (GetMoveEffect(move) == EFFECT_TELEPORT) return DONT_PIVOT; // If you're going to faint because you'll go second, use a different move else return CAN_TRY_PIVOT; // You're probably going to faint anyways so if for some reason you don't, better switch @@ -2823,9 +2918,9 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov else if (CanAIFaintTarget(battlerAtk, battlerDef, 2)) { // can knock out foe in 2 hits - if (IS_MOVE_STATUS(move) && ((AI_DATA->shouldSwitch & (1u << battlerAtk)) //Damaging move + if (IsBattleMoveStatus(move) && ((AI_DATA->shouldSwitch & (1u << battlerAtk)) //Damaging move //&& (switchScore >= SWITCHING_INCREASE_RESIST_ALL_MOVES + SWITCHING_INCREASE_KO_FOE //remove hazards - || (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH && AtMaxHp(battlerDef)))) + || (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH && AI_BattlerAtMaxHp(battlerDef)))) return DONT_PIVOT; // Pivot to break the sash else return CAN_TRY_PIVOT; @@ -2907,7 +3002,7 @@ bool32 IsBattlerIncapacitated(u32 battler, u32 ability) if ((gBattleMons[battler].status1 & STATUS1_FREEZE) && !HasThawingMove(battler)) return TRUE; // if battler has thawing move we assume they will definitely use it, and thus being frozen should be neglected - if (gBattleMons[battler].status1 & STATUS1_SLEEP) + if (gBattleMons[battler].status1 & STATUS1_SLEEP && !HasMoveEffect(battler, EFFECT_SLEEP_TALK)) return TRUE; if (gBattleMons[battler].status2 & STATUS2_RECHARGE || (ability == ABILITY_TRUANT && gDisableStructs[battler].truantCounter != 0)) @@ -2918,7 +3013,7 @@ bool32 IsBattlerIncapacitated(u32 battler, u32 ability) bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) { - if (!CanBeSlept(battlerDef, defAbility) + if (!CanBeSlept(battlerDef, defAbility, BLOCKED_BY_SLEEP_CLAUSE) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(BATTLE_PARTNER(battlerAtk), battlerDef, partnerMove)) // shouldn't try to sleep mon that partner is trying to make sleep return FALSE; @@ -2943,11 +3038,11 @@ bool32 ShouldPoisonSelf(u32 battler, u32 ability) bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) { if (!CanBePoisoned(battlerAtk, battlerDef, GetBattlerAbility(battlerDef)) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == AI_EFFECTIVENESS_x0 + || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(BATTLE_PARTNER(battlerAtk), battlerDef, partnerMove)) return FALSE; - else if (defAbility != ABILITY_CORROSION && (IS_BATTLER_OF_TYPE(battlerDef, TYPE_POISON) || IS_BATTLER_OF_TYPE(battlerDef, TYPE_STEEL))) + else if (defAbility != ABILITY_CORROSION && IS_BATTLER_ANY_TYPE(battlerDef, TYPE_POISON, TYPE_STEEL)) return FALSE; else if (IsValidDoubleBattle(battlerAtk) && AI_DATA->abilities[BATTLE_PARTNER(battlerDef)] == ABILITY_PASTEL_VEIL) return FALSE; @@ -2958,7 +3053,7 @@ bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u3 bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) { if (!CanBeParalyzed(battlerDef, defAbility) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == AI_EFFECTIVENESS_x0 + || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(BATTLE_PARTNER(battlerAtk), battlerDef, partnerMove)) @@ -2969,8 +3064,8 @@ bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability) { if ((gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) - || (ability == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(AI_DATA->abilities[battlerAtk], move)) - || (IsBattlerGrounded(battlerDef) && (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) + || (ability == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, AI_DATA->abilities[battlerAtk], move)) + || IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) return FALSE; @@ -2979,7 +3074,7 @@ bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability) bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { - if (gMovesInfo[move].target == MOVE_TARGET_FOES_AND_ALLY + if (GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY && AI_CanBeConfused(battlerAtk, battlerDef, move, defAbility) && !AI_CanBeConfused(battlerAtk, BATTLE_PARTNER(battlerDef), move, AI_DATA->abilities[BATTLE_PARTNER(battlerDef)])) return FALSE; @@ -2997,7 +3092,7 @@ bool32 AI_CanGetFrostbite(u32 battler, u32 ability) || ability == ABILITY_COMATOSE || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) return FALSE; return TRUE; @@ -3020,7 +3115,7 @@ bool32 ShouldBurnSelf(u32 battler, u32 ability) bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (!CanBeBurned(battlerDef, defAbility) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == AI_EFFECTIVENESS_x0 + || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(battlerAtkPartner, battlerDef, partnerMove)) { @@ -3032,7 +3127,7 @@ bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtk bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (!AI_CanGetFrostbite(battlerDef, defAbility) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == AI_EFFECTIVENESS_x0 + || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(battlerAtkPartner, battlerDef, partnerMove)) { @@ -3044,7 +3139,7 @@ bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 b bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility) { if ((gBattleMons[battlerDef].status2 & STATUS2_INFATUATION) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == AI_EFFECTIVENESS_x0 + || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) || defAbility == ABILITY_OBLIVIOUS || !AreBattlersOfOppositeGender(battlerAtk, battlerDef) || AI_IsAbilityOnSide(battlerDef, ABILITY_AROMA_VEIL)) @@ -3118,7 +3213,7 @@ static u32 FindMoveUsedXTurnsAgo(u32 battlerId, u32 x) bool32 IsWakeupTurn(u32 battler) { // Check if rest was used 2 turns ago - if ((gBattleMons[battler].status1 & STATUS1_SLEEP) == 1 && FindMoveUsedXTurnsAgo(battler, 2) == MOVE_REST) + if ((gBattleMons[battler].status1 & STATUS1_SLEEP) == 1 && GetMoveEffect(FindMoveUsedXTurnsAgo(battler, 2)) == EFFECT_REST) return TRUE; else // no way to know return FALSE; @@ -3134,9 +3229,11 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) if (IsDoubleBattle()) { battlerOnField1 = gBattlerPartyIndexes[battlerId]; - battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battlerId)))]; + battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; // Check partner's status - if ((B_HEAL_BELL_SOUNDPROOF == GEN_5 || AI_DATA->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF || !checkSoundproof) + if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || AI_DATA->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF + || !checkSoundproof) && GetMonData(&party[battlerOnField2], MON_DATA_STATUS) != STATUS1_NONE) return TRUE; } @@ -3147,7 +3244,8 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) } // Check attacker's status - if ((B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8 + if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 || AI_DATA->abilities[battlerId] != ABILITY_SOUNDPROOF || !checkSoundproof) && GetMonData(&party[battlerOnField1], MON_DATA_STATUS) != STATUS1_NONE) return TRUE; @@ -3157,7 +3255,9 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) { if (i == battlerOnField1 || i == battlerOnField2) continue; - if (B_HEAL_BELL_SOUNDPROOF < GEN_5 && checkSoundproof && GetMonAbility(&party[i]) == ABILITY_SOUNDPROOF) + if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) < GEN_5 + && checkSoundproof + && GetMonAbility(&party[i]) == ABILITY_SOUNDPROOF) continue; if (GetMonData(&party[i], MON_DATA_STATUS) != STATUS1_NONE) return TRUE; @@ -3206,8 +3306,7 @@ bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage) if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move)) { // using item or user goes first - u32 healPercent = (gMovesInfo[move].argument == 0) ? 50 : gMovesInfo[move].argument; - s32 healDmg = (healPercent * damage) / 100; + s32 healDmg = (GetMoveAbsorbPercentage(move) * damage) / 100; if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) healDmg = 0; @@ -3260,7 +3359,7 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, u32 moveEffect) { case EFFECT_AURORA_VEIL: // Use only in Hail and only if AI doesn't already have Reflect, Light Screen or Aurora Veil itself active. - if ((AI_GetWeather(AI_DATA) & (B_WEATHER_HAIL | B_WEATHER_SNOW)) + if ((AI_GetWeather() & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && !(gSideStatuses[atkSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL))) return TRUE; break; @@ -3308,7 +3407,7 @@ bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 if (!IsDoubleBattle()) return FALSE; - if (gMovesInfo[move].effect == gMovesInfo[partnerMove].effect + if (GetMoveEffect(move) == GetMoveEffect(partnerMove) && partnerMove != MOVE_NONE && gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef) { @@ -3323,7 +3422,7 @@ bool32 PartnerHasSameMoveEffectWithoutTarget(u32 battlerAtkPartner, u32 move, u3 if (!IsDoubleBattle()) return FALSE; - if (gMovesInfo[move].effect == gMovesInfo[partnerMove].effect + if (GetMoveEffect(move) == GetMoveEffect(partnerMove) && partnerMove != MOVE_NONE) return TRUE; return FALSE; @@ -3335,27 +3434,29 @@ bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef if (!IsDoubleBattle()) return FALSE; + u32 partnerEffect = GetMoveEffect(partnerMove); if (partnerMove != MOVE_NONE && gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef - && (gMovesInfo[partnerMove].effect == EFFECT_SLEEP - || gMovesInfo[partnerMove].effect == EFFECT_POISON - || gMovesInfo[partnerMove].effect == EFFECT_TOXIC - || gMovesInfo[partnerMove].effect == EFFECT_PARALYZE - || gMovesInfo[partnerMove].effect == EFFECT_WILL_O_WISP - || gMovesInfo[partnerMove].effect == EFFECT_YAWN)) + && (partnerEffect == EFFECT_SLEEP + || partnerEffect == EFFECT_POISON + || partnerEffect == EFFECT_TOXIC + || partnerEffect == EFFECT_PARALYZE + || partnerEffect == EFFECT_WILL_O_WISP + || partnerEffect == EFFECT_YAWN)) return TRUE; return FALSE; } bool32 IsMoveEffectWeather(u32 move) { + u32 effect = GetMoveEffect(move); if (move != MOVE_NONE - && (gMovesInfo[move].effect == EFFECT_SUNNY_DAY - || gMovesInfo[move].effect == EFFECT_RAIN_DANCE - || gMovesInfo[move].effect == EFFECT_SANDSTORM - || gMovesInfo[move].effect == EFFECT_HAIL - || gMovesInfo[move].effect == EFFECT_SNOWSCAPE - || gMovesInfo[move].effect == EFFECT_CHILLY_RECEPTION)) + && (effect == EFFECT_SUNNY_DAY + || effect == EFFECT_RAIN_DANCE + || effect == EFFECT_SANDSTORM + || effect == EFFECT_HAIL + || effect == EFFECT_SNOWSCAPE + || effect == EFFECT_CHILLY_RECEPTION)) return TRUE; return FALSE; } @@ -3366,11 +3467,24 @@ bool32 PartnerMoveEffectIsTerrain(u32 battlerAtkPartner, u32 partnerMove) if (!IsDoubleBattle()) return FALSE; + u32 partnerEffect = GetMoveEffect(partnerMove); if (partnerMove != MOVE_NONE - && (gMovesInfo[partnerMove].effect == EFFECT_GRASSY_TERRAIN - || gMovesInfo[partnerMove].effect == EFFECT_MISTY_TERRAIN - || gMovesInfo[partnerMove].effect == EFFECT_ELECTRIC_TERRAIN - || gMovesInfo[partnerMove].effect == EFFECT_PSYCHIC_TERRAIN)) + && (partnerEffect == EFFECT_GRASSY_TERRAIN + || partnerEffect == EFFECT_MISTY_TERRAIN + || partnerEffect == EFFECT_ELECTRIC_TERRAIN + || partnerEffect == EFFECT_PSYCHIC_TERRAIN)) + return TRUE; + + return FALSE; +} + +//PARTNER_MOVE_EFFECT_IS +bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, u32 effectCheck) +{ + if (!IsDoubleBattle()) + return FALSE; + + if (partnerMove != MOVE_NONE && GetMoveEffect(partnerMove) == effectCheck) return TRUE; return FALSE; @@ -3408,12 +3522,19 @@ bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, u32 move, u32 partnerMov return FALSE; } +bool32 PartnerMoveActivatesSleepClause(u32 partnerMove) +{ + if (!IsDoubleBattle() || !IsSleepClauseEnabled()) + return FALSE; + return IsMoveSleepClauseTrigger(partnerMove); +} + bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) { u32 i; s32 firstId, lastId; struct Pokemon* party; - bool32 hasStatus = AnyPartyMemberStatused(battlerAtk, gMovesInfo[move].soundMove); + bool32 hasStatus = AnyPartyMemberStatused(battlerAtk, IsSoundMove(move)); bool32 needHealing = FALSE; GetAIPartyIndexes(battlerAtk, &firstId, &lastId); @@ -3440,7 +3561,7 @@ bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) if (!IsDoubleBattle()) { - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_WISH: if (needHealing) @@ -3453,7 +3574,7 @@ bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) } else { - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_WISH: return ShouldRecover(battlerAtk, battlerDef, move, 50); // Switch recovery isn't good idea in doubles @@ -3485,7 +3606,7 @@ void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons) s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, bool32 isPartyMonAttacker, enum DamageRollType rollType) { struct SimulatedDamage dmg; - u8 effectiveness; + uq4_12_t effectiveness; struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); if (isPartyMonAttacker) @@ -3503,7 +3624,7 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl AI_THINKING_STRUCT->saved[battlerAtk].saved = FALSE; } - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, FALSE, AI_GetWeather(AI_DATA), rollType); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, FALSE, AI_GetWeather(), rollType); // restores original gBattleMon struct FreeRestoreBattleMons(savedBattleMons); @@ -3537,7 +3658,7 @@ s32 CountUsablePartyMons(u32 battlerId) if (IsDoubleBattle()) { battlerOnField1 = gBattlerPartyIndexes[battlerId]; - battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battlerId)))]; + battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; } else // In singles there's only one battlerId by side. { @@ -3596,7 +3717,7 @@ bool32 PartyHasMoveCategory(u32 battlerId, u32 category) if (pp > 0 && move != MOVE_NONE) { //TODO - handle photon geyser, light that burns the sky - if (gMovesInfo[move].category == category) + if (GetMoveCategory(move) == category) return TRUE; } } @@ -3637,6 +3758,20 @@ static const u16 sRecycleEncouragedItems[] = ITEM_CUSTAP_BERRY, ITEM_MENTAL_HERB, ITEM_FOCUS_SASH, + ITEM_SALAC_BERRY, + ITEM_LIECHI_BERRY, + ITEM_AGUAV_BERRY, + ITEM_FIGY_BERRY, + ITEM_IAPAPA_BERRY, + ITEM_MAGO_BERRY, + ITEM_WIKI_BERRY, + ITEM_MENTAL_HERB, + ITEM_POWER_HERB, + ITEM_BERRY_JUICE, + ITEM_WEAKNESS_POLICY, + ITEM_BLUNDER_POLICY, + ITEM_KEE_BERRY, + ITEM_MARANGA_BERRY, // TODO expand this }; @@ -3716,6 +3851,10 @@ static u32 IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, u32 statI if (AI_DATA->abilities[battlerDef] == ABILITY_OPPORTUNIST) return NO_INCREASE; + // If predicting switch, stat increases are great momentum + if (IsBattlerPredictedToSwitch(battlerDef)) + tempScore += WEAK_EFFECT; + switch (statId) { case STAT_CHANGE_ATK: @@ -3817,7 +3956,7 @@ void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT)) ADJUST_SCORE_PTR(WEAK_EFFECT); // stall tactic - if (HasMoveEffectANDArg(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PSN_ANY) + if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PSN_ANY) || HasMoveEffect(battlerAtk, EFFECT_VENOM_DRENCH) || AI_DATA->abilities[battlerAtk] == ABILITY_MERCILESS) ADJUST_SCORE_PTR(DECENT_EFFECT); @@ -3838,14 +3977,14 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) || (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects physical attacker && gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack + 10)) { - if (gMovesInfo[GetBestDmgMoveFromBattler(battlerDef, battlerAtk)].category == DAMAGE_CATEGORY_PHYSICAL) + if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk)) == DAMAGE_CATEGORY_PHYSICAL) ADJUST_SCORE_PTR(DECENT_EFFECT); else ADJUST_SCORE_PTR(WEAK_EFFECT); } - if (HasMoveEffectANDArg(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_BURN) - || HasMoveEffectANDArg(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_BURN)) + if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_BURN) + || IsPowerBasedOnStatus(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_BURN)) ADJUST_SCORE_PTR(WEAK_EFFECT); } } @@ -3862,7 +4001,7 @@ void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) u32 defSpeed = AI_DATA->speedStats[battlerDef]; if ((defSpeed >= atkSpeed && defSpeed / 2 < atkSpeed) // You'll go first after paralyzing foe - || HasMoveEffectANDArg(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PARALYSIS) + || IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PARALYSIS) || (HasMoveWithMoveEffectExcept(battlerAtk, MOVE_EFFECT_FLINCH, EFFECT_FIRST_TURN_ONLY)) // filter out Fake Out || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION || gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) @@ -3874,7 +4013,7 @@ void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + if (((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0) && GetMoveEffect(GetBestDmgMoveFromBattler(battlerAtk, battlerDef)) != EFFECT_FOCUS_PUNCH) || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_SLP || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; @@ -3887,8 +4026,8 @@ void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) && !(HasMoveEffect(battlerDef, EFFECT_SNORE) || HasMoveEffect(battlerDef, EFFECT_SLEEP_TALK))) ADJUST_SCORE_PTR(WEAK_EFFECT); - if (HasMoveEffectANDArg(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_SLEEP) - || HasMoveEffectANDArg(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_SLEEP)) + if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_SLEEP) + || IsPowerBasedOnStatus(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_SLEEP)) ADJUST_SCORE_PTR(WEAK_EFFECT); } @@ -3922,21 +4061,21 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score || (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects special attacker && gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack + 10)) { - if (gMovesInfo[GetBestDmgMoveFromBattler(battlerDef, battlerAtk)].category == DAMAGE_CATEGORY_SPECIAL) + if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk)) == DAMAGE_CATEGORY_SPECIAL) ADJUST_SCORE_PTR(DECENT_EFFECT); else ADJUST_SCORE_PTR(WEAK_EFFECT); } - if (HasMoveEffectANDArg(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_FROSTBITE) - || HasMoveEffectANDArg(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_FROSTBITE)) + if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_FROSTBITE) + || IsPowerBasedOnStatus(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_FROSTBITE)) ADJUST_SCORE_PTR(WEAK_EFFECT); } } bool32 AI_MoveMakesContact(u32 ability, u32 holdEffect, u32 move) { - if (gMovesInfo[move].makesContact + if (MoveMakesContact(move) && ability != ABILITY_LONG_REACH && holdEffect != HOLD_EFFECT_PROTECTIVE_PADS) return TRUE; @@ -3954,27 +4093,27 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) if (IsViableZMove(battlerAtk, chosenMove)) { - u8 effectiveness; + uq4_12_t effectiveness; u32 zMove = GetUsableZMove(battlerAtk, chosenMove); struct SimulatedDamage dmg; if (gBattleMons[battlerDef].ability == ABILITY_DISGUISE - && !gMovesInfo[zMove].ignoresTargetAbility + && !MoveIgnoresTargetAbility(zMove) && (gBattleMons[battlerDef].species == SPECIES_MIMIKYU_DISGUISED || gBattleMons[battlerDef].species == SPECIES_MIMIKYU_TOTEM_DISGUISED)) return FALSE; // Don't waste a Z-Move busting disguise if (gBattleMons[battlerDef].ability == ABILITY_ICE_FACE - && !gMovesInfo[zMove].ignoresTargetAbility - && gBattleMons[battlerDef].species == SPECIES_EISCUE_ICE && IS_MOVE_PHYSICAL(chosenMove)) + && !MoveIgnoresTargetAbility(zMove) + && gBattleMons[battlerDef].species == SPECIES_EISCUE_ICE && IsBattleMovePhysical(chosenMove)) return FALSE; // Don't waste a Z-Move busting Ice Face - if (IS_MOVE_STATUS(chosenMove) && !IS_MOVE_STATUS(zMove)) + if (IsBattleMoveStatus(chosenMove) && !IsBattleMoveStatus(zMove)) return FALSE; - else if (!IS_MOVE_STATUS(chosenMove) && IS_MOVE_STATUS(zMove)) + else if (!IsBattleMoveStatus(chosenMove) && IsBattleMoveStatus(zMove)) return FALSE; dmg = AI_CalcDamageSaveBattlers(chosenMove, battlerAtk, battlerDef, &effectiveness, FALSE, DMG_ROLL_DEFAULT); - if (!IS_MOVE_STATUS(chosenMove) && dmg.minimum >= gBattleMons[battlerDef].hp) + if (!IsBattleMoveStatus(chosenMove) && dmg.minimum >= gBattleMons[battlerDef].hp) return FALSE; // don't waste damaging z move if can otherwise faint target return TRUE; @@ -4011,6 +4150,7 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) case STAT_SPATK: return (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL)); case STAT_ACC: + return (HasLowAccuracyMove(battlerAtk, battlerDef)); case STAT_EVASION: case STAT_SPEED: return TRUE; @@ -4030,7 +4170,10 @@ bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE || CountUsablePartyMons(battlerDef) == 0 || HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) - || HasMoveEffect(battlerDef, EFFECT_DEFOG)) + || HasMoveEffect(battlerDef, EFFECT_TIDY_UP) + || HasMoveEffect(battlerDef, EFFECT_DEFOG) + || HasMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_DEFOG) + || HasMoveEffect(battlerDef, EFFECT_MAGIC_COAT)) return FALSE; return TRUE; @@ -4060,7 +4203,7 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st u32 partnerAbility; u32 partnerHoldEffect = aiData->holdEffects[battlerAtkPartner]; - if (DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) + if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) partnerAbility = ABILITY_NONE; else partnerAbility = aiData->abilities[battlerAtkPartner]; @@ -4077,7 +4220,7 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st || partnerAbility == ABILITY_WHITE_SMOKE || partnerHoldEffect == HOLD_EFFECT_CLEAR_AMULET); - switch (gMovesInfo[aiData->partnerMove].effect) + switch (GetMoveEffect(aiData->partnerMove)) { case EFFECT_DEFENSE_UP: case EFFECT_DEFENSE_UP_2: @@ -4093,31 +4236,32 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL)); } -void IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) +u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) { - if (gMovesInfo[move].effect == EFFECT_SUBSTITUTE) // Substitute specific + u32 effect = GetMoveEffect(move); + u32 scoreIncrease = 0; + if (effect == EFFECT_SUBSTITUTE) // Substitute specific { if (HasAnyKnownMove(battlerDef) && GetBestDmgFromBattler(battlerDef, battlerAtk) < gBattleMons[battlerAtk].maxHP / 4) - ADJUST_SCORE_PTR(GOOD_EFFECT); + scoreIncrease += GOOD_EFFECT; } - else if (gMovesInfo[move].effect == EFFECT_SHED_TAIL) // Shed Tail specific + else if (effect == EFFECT_SHED_TAIL) // Shed Tail specific { if ((ShouldPivot(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], move, AI_THINKING_STRUCT->movesetIndex)) && (HasAnyKnownMove(battlerDef) && (GetBestDmgFromBattler(battlerDef, battlerAtk) < gBattleMons[battlerAtk].maxHP / 2))) - ADJUST_SCORE_PTR(BEST_EFFECT); + scoreIncrease += BEST_EFFECT; } if (gStatuses3[battlerDef] & STATUS3_PERISH_SONG) - ADJUST_SCORE_PTR(GOOD_EFFECT); + scoreIncrease += GOOD_EFFECT; if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP) - ADJUST_SCORE_PTR(GOOD_EFFECT); + scoreIncrease += GOOD_EFFECT; else if (gBattleMons[battlerDef].status1 & (STATUS1_BURN | STATUS1_PSN_ANY | STATUS1_FROSTBITE)) - ADJUST_SCORE_PTR(DECENT_EFFECT); + scoreIncrease += DECENT_EFFECT; - // TODO: - // if (IsPredictedToSwitch(battlerDef, battlerAtk) - // ADJUST_SCORE_PTR(DECENT_EFFECT); + if (IsBattlerPredictedToSwitch(battlerDef)) + scoreIncrease += DECENT_EFFECT; if (HasMoveEffect(battlerDef, EFFECT_SLEEP) || HasMoveEffect(battlerDef, EFFECT_TOXIC) @@ -4126,10 +4270,22 @@ void IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 * || HasMoveEffect(battlerDef, EFFECT_WILL_O_WISP) || HasMoveEffect(battlerDef, EFFECT_CONFUSE) || HasMoveEffect(battlerDef, EFFECT_LEECH_SEED)) - ADJUST_SCORE_PTR(GOOD_EFFECT); + scoreIncrease += GOOD_EFFECT; if (AI_DATA->hpPercents[battlerAtk] > 70) - ADJUST_SCORE_PTR(WEAK_EFFECT); + scoreIncrease += WEAK_EFFECT; + return scoreIncrease; +} + +bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef) +{ + int i; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (AI_DATA->moveAccuracy[battlerAtk][battlerDef][i] <= LOW_ACCURACY_THRESHOLD) + return TRUE; + } + return FALSE; } bool32 IsBattlerItemEnabled(u32 battler) diff --git a/src/battle_anim.c b/src/battle_anim.c index b036f83cbf..eb0e2af560 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -12,6 +12,7 @@ #include "gpu_regs.h" #include "graphics.h" #include "main.h" +#include "malloc.h" #include "m4a.h" #include "palette.h" #include "pokemon.h" @@ -112,7 +113,7 @@ EWRAM_DATA static u16 sSoundAnimFramesToWait = 0; EWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0}; EWRAM_DATA u8 gAnimMoveTurn = 0; EWRAM_DATA static u8 sAnimBackgroundFadeState = 0; -EWRAM_DATA u16 gAnimMoveIndex = 0; // Set but unused. +EWRAM_DATA u16 gAnimMoveIndex = 0; EWRAM_DATA u8 gBattleAnimAttacker = 0; EWRAM_DATA u8 gBattleAnimTarget = 0; EWRAM_DATA u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT] = {0}; @@ -303,7 +304,7 @@ void DoMoveAnim(u16 move) // Make sure the anim target of moves hitting everyone is at the opposite side. if (GetBattlerMoveTargetType(gBattlerAttacker, move) & MOVE_TARGET_FOES_AND_ALLY && IsDoubleBattle()) { - while (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + while (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { if (++gBattleAnimTarget >= MAX_BATTLERS_COUNT) gBattleAnimTarget = 0; @@ -369,12 +370,7 @@ void LaunchBattleAnimation(u32 animType, u32 animId) InitPrioritiesForVisibleBattlers(); UpdateOamPriorityInAllHealthboxes(0, sAnimHideHpBoxes); for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (GetBattlerSide(i) != B_SIDE_PLAYER) - gAnimBattlerSpecies[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); - else - gAnimBattlerSpecies[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); - } + gAnimBattlerSpecies[i] = GetMonData(GetPartyBattlerData(i), MON_DATA_SPECIES); } else { @@ -567,7 +563,7 @@ static u8 GetBattleAnimMoveTargets(u8 battlerArgIndex, u8 *targets) case MOVE_TARGET_BOTH: // all opponents for (i = 0; i < gBattlersCount; i++) { - if (i != ignoredTgt && !IsAlly(i, ignoredTgt) && IS_ALIVE_AND_PRESENT(i)) + if (i != ignoredTgt && !IsBattlerAlly(i, ignoredTgt) && IS_ALIVE_AND_PRESENT(i)) targets[numTargets++] = i + MAX_BATTLERS_COUNT; } break; @@ -1570,17 +1566,15 @@ void LoadMoveBg(u16 bgId) { if (IsContest()) { + void *decompressionBuffer = Alloc(0x800); const u32 *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; - void *dmaSrc; - void *dmaDest; - LZDecompressWram(tilemap, gDecompressionBuffer); - RelocateBattleBgPal(GetBattleBgPaletteNum(), (void *)gDecompressionBuffer, 0x100, FALSE); - dmaSrc = gDecompressionBuffer; - dmaDest = (void *)BG_SCREEN_ADDR(26); - DmaCopy32(3, dmaSrc, dmaDest, 0x800); + LZDecompressWram(tilemap, decompressionBuffer); + RelocateBattleBgPal(GetBattleBgPaletteNum(), decompressionBuffer, 0x100, FALSE); + DmaCopy32(3, decompressionBuffer, (void *)BG_SCREEN_ADDR(26), 0x800); LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_SCREEN_ADDR(4)); LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, BG_PLTT_ID(GetBattleBgPaletteNum()), PLTT_SIZE_4BPP); + Free(decompressionBuffer); } else { @@ -2163,8 +2157,7 @@ static void Cmd_teamattack_moveback(void) sBattleAnimScriptPtr += 2; // Apply to double battles when attacking own side - if (!IsContest() && IsDoubleBattle() - && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (!IsContest() && IsDoubleBattle() && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { if (wantedBattler == ANIM_ATTACKER) { @@ -2201,7 +2194,7 @@ static void Cmd_teamattack_movefwd(void) // Apply to double battles when attacking own side if (!IsContest() && IsDoubleBattle() - && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { if (wantedBattler == ANIM_ATTACKER) { @@ -2230,7 +2223,7 @@ static void Cmd_jumpifmovetypeequal(void) { const u8 *type = sBattleAnimScriptPtr + 1; sBattleAnimScriptPtr += 2; - if (*type != GetMoveType(gCurrentMove)) + if (*type != GetBattleMoveType(gCurrentMove)) sBattleAnimScriptPtr += 4; else sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr); diff --git a/src/battle_anim_bug.c b/src/battle_anim_bug.c index e897290768..19e201a45e 100644 --- a/src/battle_anim_bug.c +++ b/src/battle_anim_bug.c @@ -389,7 +389,7 @@ void AnimTranslateStinger(struct Sprite *sprite) } } - if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (!IsContest() && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT) diff --git a/src/battle_anim_dark.c b/src/battle_anim_dark.c index fd9ffdf923..1cada8f825 100644 --- a/src/battle_anim_dark.c +++ b/src/battle_anim_dark.c @@ -932,16 +932,9 @@ void AnimTask_MetallicShine(u8 taskId) } if (IsContest()) - { species = gContestResources->moveAnim->species; - } else - { - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - } + species = GetMonData(GetPartyBattlerData(gBattleAnimAttacker), MON_DATA_SPECIES); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); diff --git a/src/battle_anim_dragon.c b/src/battle_anim_dragon.c index f3ee2a3818..55ecd5d0c1 100644 --- a/src/battle_anim_dragon.c +++ b/src/battle_anim_dragon.c @@ -14,8 +14,6 @@ static void AnimSpinningDracoMeteor(struct Sprite *sprite); static void AnimSpinningDracoMeteorFinish(struct Sprite *sprite); static void AnimDracoMeteorRock_Step(struct Sprite *sprite); -EWRAM_DATA static u16 sUnusedOverheatData[7] = {0}; - static const union AnimCmd sAnim_OutrageOverheatFire_0[] = { ANIMCMD_FRAME(0, 4), @@ -601,7 +599,6 @@ static void UpdateDragonDanceScanlineEffect(struct Task *task) void AnimOverheatFlame(struct Sprite *sprite) { - int i; int yAmplitude = (gBattleAnimArgs[2] * 3) / 5; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[4]; @@ -611,8 +608,6 @@ void AnimOverheatFlame(struct Sprite *sprite) sprite->y += sprite->data[2] * gBattleAnimArgs[0]; sprite->data[3] = gBattleAnimArgs[3]; sprite->callback = AnimOverheatFlame_Step; - for (i = 0; i < 7; i++) - sUnusedOverheatData[i] = sprite->data[i]; } static void AnimOverheatFlame_Step(struct Sprite *sprite) diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index a3104122d1..4162447094 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -30,6 +30,9 @@ static void AnimPetalDanceSmallFlower_Step(struct Sprite *); static void AnimRazorLeafParticle(struct Sprite *); static void AnimRazorLeafParticle_Step1(struct Sprite *); static void AnimRazorLeafParticle_Step2(struct Sprite *); +static void AnimTeraStarstormBeam(struct Sprite *sprite); +static void AnimTeraStarstormBeam_Step(struct Sprite *); +static void AnimTeraStarstormStars_Step(struct Sprite *); static void AnimLeechSeed(struct Sprite *); static void AnimLeechSeed_Step(struct Sprite *); static void AnimLeechSeedSprouts(struct Sprite *); @@ -3989,6 +3992,153 @@ static void AnimRazorLeafParticle_Step2(struct Sprite *sprite) DestroyAnimSprite(sprite); } +static const union AnimCmd sAnim_TeraStarstormBeamRing_0[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd sAnim_TeraStarstormBeamRing_1[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_END, +}; + +static const union AnimCmd *const sAnims_TeraStarstormBeamRing[] = +{ + sAnim_TeraStarstormBeamRing_0, + sAnim_TeraStarstormBeamRing_1, +}; + +static const union AffineAnimCmd sAffineAnim_TeraStarstormBeamRing[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_FRAME(0x60, 0x60, 0, 1), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sAffineAnims_TeraStarstormBeamRing[] = +{ + sAffineAnim_TeraStarstormBeamRing, +}; + +const struct SpriteTemplate gTeraStarstormBeamSpriteTemplate = +{ + .tileTag = ANIM_TAG_STARSTORM, + .paletteTag = ANIM_TAG_STARSTORM, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimTeraStarstormBeam, +}; + +// arg0: start offset x +// arg1: start offset y +// arg2: end offset x +// arg3: end offset y +// arg4: duration +static void AnimTeraStarstormBeam(struct Sprite *sprite) +{ + gBattleAnimArgs[0] += 4; + gBattleAnimArgs[1] -= 30; + InitSpritePosToAnimAttacker(sprite, TRUE); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[3] = 0; + sprite->data[4] = -70; + InitAnimLinearTranslation(sprite); + sprite->callback = AnimTeraStarstormBeam_Step; + sprite->affineAnimPaused = TRUE; + sprite->callback(sprite); + +} + +static void AnimTeraStarstormBeam_Step(struct Sprite *sprite) +{ + if (AnimTranslateLinear(sprite)) + DestroyAnimSprite(sprite); +} + +const union AffineAnimCmd gTeraStarAffineAnimCmds[] = { + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd *const gTeraStarAffineAnimTable[] = { + gTeraStarAffineAnimCmds, +}; + +// arg0: start offset x +// arg1: start offset y +// arg2: end offset x +// arg3: end offset y +// arg4: duration +// arg5: target partner +// arg6: ????? +const struct SpriteTemplate gTeraStarSpriteTemplate = +{ + .tileTag = ANIM_TAG_YELLOW_STAR, + .paletteTag = ANIM_TAG_YELLOW_STAR, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gTeraStarAffineAnimTable, + .callback = AnimTeraStarstormStars, +}; + + +void AnimTeraStarstormStars(struct Sprite *sprite) +{ + gBattleAnimArgs[0] += 4; + gBattleAnimArgs[1] -= 100; + InitSpritePosToAnimAttacker(sprite, TRUE); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->x; + sprite->data[3] = sprite->y; + if (gBattleAnimArgs[5] == 1) + { + u32 targetPartner; + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + { + if (gBattleAnimTarget == 0) + targetPartner = 2; + else + targetPartner = 0; + } + else + { + if (gBattleAnimTarget == 1) + targetPartner = 3; + else + targetPartner = 1; + } + sprite->data[2] = GetBattlerSpriteCoord(targetPartner, BATTLER_COORD_X_2) + gBattleAnimArgs[2] ; + sprite->data[4] = GetBattlerSpriteCoord(targetPartner, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + } + else + { + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2] ; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + } + InitAnimLinearTranslation(sprite); + sprite->callback = AnimTeraStarstormStars_Step; + sprite->affineAnimPaused = TRUE; + sprite->callback(sprite); +} + +static void AnimTeraStarstormStars_Step(struct Sprite *sprite) +{ + if (AnimTranslateLinear(sprite)) + DestroyAnimSprite(sprite); + if ((u16)gBattleAnimArgs[7] == 0xFFFF) + { + StartSpriteAnim(sprite, 1); + sprite->affineAnimPaused = FALSE; + } +} + // Animates a sprite that moves linearly from one location to another, with a // single-cycle sine wave added to the y position along the way. // Used by Razor Leaf and Magical Leaf. @@ -4020,7 +4170,7 @@ void AnimTranslateLinearSingleSineWave(struct Sprite *sprite) sprite->data[5] = gBattleAnimArgs[5]; InitAnimArcTranslation(sprite); - if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) sprite->data[0] = 1; else sprite->data[0] = 0; @@ -6693,16 +6843,23 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner) u32 oppSide = GetBattlerSide(BATTLE_OPPOSITE(battlerAtk)); // if used future sight on opposing side, properly track who used it - if (gSideStatuses[oppSide] & SIDE_STATUS_FUTUREATTACK) { - for (i = 0; i < gBattlersCount; i++) { - if (IsAlly(i,battlerAtk)) + if (gSideStatuses[oppSide] & SIDE_STATUS_FUTUREATTACK) + { + u32 battlerAtkSide = GetBattlerSide(battlerAtk); + for (i = 0; i < gBattlersCount; i++) + { + if (battlerAtkSide == GetBattlerSide(i)) continue; // only on opposing side - if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerAtk) { + + if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerAtk) + { // if target was attacked with future sight from us, now they'll be the partner slot gWishFutureKnock.futureSightBattlerIndex[i] = battlerPartner; gWishFutureKnock.futureSightPartyIndex[i] = gBattlerPartyIndexes[battlerPartner]; break; - } else if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerPartner) { + } + else if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerPartner) + { gWishFutureKnock.futureSightBattlerIndex[i] = battlerAtk; gWishFutureKnock.futureSightPartyIndex[i] = gBattlerPartyIndexes[battlerAtk]; break; @@ -6711,10 +6868,9 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner) } // swap wish party indices - if (gWishFutureKnock.wishCounter[battlerAtk] > 0 - || gWishFutureKnock.wishCounter[battlerPartner] > 0) { + if (gWishFutureKnock.wishCounter[battlerAtk] > gBattleTurnCounter + || gWishFutureKnock.wishCounter[battlerPartner] > gBattleTurnCounter) SWAP(gWishFutureKnock.wishPartyId[battlerAtk], gWishFutureKnock.wishPartyId[battlerPartner], temp); - } } static void AnimTask_AllySwitchDataSwap(u8 taskId) diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 1530fa37a5..6f34f479b9 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -3417,51 +3417,24 @@ void AnimTask_RolePlaySilhouette(u8 taskId) isShiny = gContestResources->moveAnim->targetIsShiny; species = gContestResources->moveAnim->targetSpecies; xOffset = 20; - priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); } else { + struct Pokemon *mon = GetPartyBattlerData(gBattleAnimTarget); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - { isBackPic = FALSE; - personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY); - isShiny = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_IS_SHINY); - if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE) - { - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - else - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - } - else - { - species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies; - } - - xOffset = 20; - priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); - } else - { isBackPic = TRUE; - personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY); - isShiny = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_IS_SHINY); - if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE) - { - if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - else - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES); - } - else - { - species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies; - } + personality = GetMonData(mon, MON_DATA_PERSONALITY); + isShiny = GetMonData(mon, MON_DATA_IS_SHINY); + if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE) + species = GetMonData(mon, MON_DATA_SPECIES); + else + species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies; - xOffset = -20; - priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); - } + xOffset = -20; } + priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); coord1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); coord2 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); @@ -5331,28 +5304,22 @@ void AnimTask_SnatchOpposingMonMove(u8 taskId) } else { + struct Pokemon *mon = GetPartyBattlerData(gBattleAnimAttacker); + personality = GetMonData(mon, MON_DATA_PERSONALITY); + isShiny = GetMonData(mon, MON_DATA_IS_SHINY); + if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE) + species = GetMonData(mon, MON_DATA_SPECIES); + else + species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies; + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { - personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY); - isShiny = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_IS_SHINY); - if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - else - species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies; - subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1; isBackPic = FALSE; x = DISPLAY_WIDTH + 32; } else { - personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY); - isShiny = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_IS_SHINY); - if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - else - species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies; - subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1; isBackPic = TRUE; x = -32; diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index fb9861a3f3..59cd017b9a 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -589,6 +589,17 @@ const struct SpriteTemplate gIonSpriteTemplate = .callback = AnimIon, }; +const struct SpriteTemplate gVoltSwitchSpriteTemplate = +{ + .tileTag = ANIM_TAG_SHADOW_BALL, + .paletteTag = ANIM_TAG_IONS, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimTask_VoltSwitch, +}; + // functions static void AnimLightning(struct Sprite *sprite) { @@ -1536,3 +1547,52 @@ static void AnimIon_Step(struct Sprite *sprite) if (sprite->animEnded) DestroySprite(sprite); } + +//Volt Switch// + +//Launches the projectiles for Volt Switch +//arg 0: initial x pixel offset +//arg 1: initial y pixel offset +//arg 2: target x pixel offset +//arg 3: target y pixel offset +//arg 4: duration +//arg 5: wave amplitude +static void VoltSwitch_Step(struct Sprite* sprite) +{ + sprite->invisible = FALSE; + + if (TranslateAnimHorizontalArc(sprite)) + { + //Merge coords into one + sprite->x += sprite->x2; + sprite->y += sprite->y2; + sprite->x2 = 0; + sprite->y2 = 0; + + //Come straight back to the attacker + sprite->data[0] = 0x14; //Duration + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); + + sprite->callback = StartAnimLinearTranslation; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); + } +} + +void AnimTask_VoltSwitch(struct Sprite* sprite) +{ + InitSpritePosToAnimAttacker(sprite, 0); + + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + else + sprite->y += 10; //Move slightly down + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; //Target X + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; //Target Y + sprite->data[5] = gBattleAnimArgs[5]; + InitAnimArcTranslation(sprite); + + sprite->callback = VoltSwitch_Step; +} diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index 401cc09eaf..b67304e05e 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -717,7 +717,7 @@ static void AnimSunlight(struct Sprite *sprite) // arg 6: ? (todo: something related to which mon the pixel offsets are based on) static void AnimEmberFlare(struct Sprite *sprite) { - if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget) + if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget) && (gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) || gBattleAnimAttacker == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 2df2b23089..13b1cf834f 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -143,28 +143,16 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species) u8 ret; species = SanitizeSpeciesId(species); - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER || IsContest()) + if (IsContest()) { if (species == SPECIES_UNOWN) { - if (IsContest()) - { - if (gContestResources->moveAnim->hasTargetAnim) - personality = gContestResources->moveAnim->targetPersonality; - else - personality = gContestResources->moveAnim->personality; - } + if (gContestResources->moveAnim->hasTargetAnim) + personality = gContestResources->moveAnim->targetPersonality; else - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); - else - personality = gTransformedPersonalities[battlerId]; - } + personality = gContestResources->moveAnim->personality; species = GetUnownSpeciesId(personality); } - ret = gSpeciesInfo[species].backPicYOffset; } else { @@ -172,14 +160,17 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species) { spriteInfo = gBattleSpritesDataPtr->battlerData; if (!spriteInfo[battlerId].transformSpecies) - personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); + personality = GetMonData(GetPartyBattlerData(battlerId), MON_DATA_PERSONALITY); else personality = gTransformedPersonalities[battlerId]; - species = GetUnownSpeciesId(personality); } - ret = gSpeciesInfo[species].frontPicYOffset; } + + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER || IsContest()) + ret = gSpeciesInfo[species].backPicYOffset; + else + ret = gSpeciesInfo[species].frontPicYOffset; return ret; } @@ -279,22 +270,13 @@ u8 GetBattlerYCoordWithElevation(u8 battlerId) y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y); if (!IsContest()) { - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - else - species = spriteInfo[battlerId].transformSpecies; - } + spriteInfo = gBattleSpritesDataPtr->battlerData; + + if (!spriteInfo[battlerId].transformSpecies) + species = GetMonData(GetPartyBattlerData(battlerId), MON_DATA_SPECIES); else - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - else - species = spriteInfo[battlerId].transformSpecies; - } + species = spriteInfo[battlerId].transformSpecies; + if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) y -= GetBattlerElevation(battlerId, species); } @@ -817,18 +799,6 @@ bool32 InitSpritePosToAnimBattler(u32 animBattlerId, struct Sprite *sprite, bool return TRUE; } -u8 GetBattlerAtPosition(u8 position) -{ - u8 i; - - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerPosition(i) == position) - break; - } - return i; -} - bool8 IsBattlerSpritePresent(u8 battlerId) { if (IsContest()) @@ -845,19 +815,8 @@ bool8 IsBattlerSpritePresent(u8 battlerId) if (GetBattlerPosition(battlerId) == 0xff) return FALSE; - if (!gBattleStruct->spriteIgnore0Hp) - { - if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) - { - if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) == 0) - return FALSE; - } - else - { - if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) == 0) - return FALSE; - } - } + if (!gBattleStruct->spriteIgnore0Hp && GetMonData(GetPartyBattlerData(battlerId), MON_DATA_HP) == 0) + return FALSE; return TRUE; } } @@ -1531,6 +1490,12 @@ void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } +// arg0: start x offset +// arg1: start y offset +// arg2: end x offset +// arg3: end y offset +// arg4: duration +// arg5: arc amplitude void AnimThrowProjectile(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); @@ -1874,26 +1839,16 @@ static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId) } else { - if (GetBattlerSide(i) == B_SIDE_PLAYER) - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); - else - species = spriteInfo[battlerId].transformSpecies; - - return gSpeciesInfo[species].backPicYOffset; - } + spriteInfo = gBattleSpritesDataPtr->battlerData; + if (!spriteInfo[battlerId].transformSpecies) + species = GetMonData(GetPartyBattlerData(i), MON_DATA_SPECIES); else - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); - else - species = spriteInfo[battlerId].transformSpecies; + species = spriteInfo[battlerId].transformSpecies; + if (GetBattlerSide(i) == B_SIDE_PLAYER) + return gSpeciesInfo[species].backPicYOffset; + else return gSpeciesInfo[species].frontPicYOffset; - } } } } diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index c5ec4bc9c6..3386570885 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -8896,7 +8896,7 @@ static void SpriteCB_AnimSpriteOnTargetSideCentre(struct Sprite *sprite) if (!sprite->data[0]) { - if (IsAlly(gBattleAnimAttacker, target)) + if (IsBattlerAlly(gBattleAnimAttacker, target)) { if (IsDoubleBattle()) InitSpritePosToAnimAttackersCentre(sprite, FALSE); @@ -9072,7 +9072,7 @@ static void SpriteCB_DragonEnergyShot(struct Sprite* sprite) u8 def1 = gBattleAnimTarget; u8 def2 = BATTLE_PARTNER(def1); - if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget)) + if (!IsDoubleBattle() || IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) y = GetBattlerSpriteCoord(def1, BATTLER_COORD_Y_PIC_OFFSET); else { @@ -9172,7 +9172,7 @@ static void SpriteCB_GlacialLance(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[6]; - if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget)) + if (!IsDoubleBattle() || IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { sprite->data[2] = GetBattlerSpriteCoord(def1, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; //Converge on target sprite->data[4] = GetBattlerSpriteCoord(def1, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; @@ -9267,21 +9267,15 @@ void AnimTask_DynamaxGrowth(u8 taskId) // from CFRU void AnimTask_GetWeatherToSet(u8 taskId) { - switch (gMovesInfo[gCurrentMove].argument) - { - case MAX_EFFECT_SUN: - gBattleAnimArgs[ARG_RET_ID] = 1; - break; - case MAX_EFFECT_RAIN: - gBattleAnimArgs[ARG_RET_ID] = 2; - break; - case MAX_EFFECT_SANDSTORM: - gBattleAnimArgs[ARG_RET_ID] = 3; - break; - case MAX_EFFECT_HAIL: - gBattleAnimArgs[ARG_RET_ID] = 4; - break; - } + if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SUN)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SUN; + else if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_RAIN)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_RAIN; + else if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SANDSTORM)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SANDSTORM; + else if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_HAIL)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_HAIL; + DestroyAnimVisualTask(taskId); } diff --git a/src/battle_anim_psychic.c b/src/battle_anim_psychic.c index a9c1f0cf67..b7e023c9ad 100644 --- a/src/battle_anim_psychic.c +++ b/src/battle_anim_psychic.c @@ -501,7 +501,7 @@ static void AnimPsychoCut(struct Sprite *sprite) } } - if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (!IsContest() && IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT) @@ -1379,3 +1379,14 @@ void AnimPsychoBoost(struct Sprite *sprite) break; } } + +const struct SpriteTemplate gTachyonCutterSpriteTemplate = +{ + .tileTag = ANIM_TAG_CUT, + .paletteTag = ANIM_TAG_BUBBLE, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = gCuttingSliceAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimCuttingSlice, +}; diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index ec7bc535df..0aaf5f1609 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -1026,3 +1026,25 @@ void AnimTask_SeismicTossBgAccelerateDownAtEnd(u8 taskId) DestroyAnimVisualTask(taskId); } } + +const struct SpriteTemplate gSaltCureCrystalSpriteTemplate = +{ + .tileTag = ANIM_TAG_SALT_PARTICLE, + .paletteTag = ANIM_TAG_SALT_PARTICLE, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gAnims_IceCrystalLarge, + .images = NULL, + .affineAnims = gAffineAnims_IceCrystalHit, + .callback = AnimIceEffectParticle, +}; + +const struct SpriteTemplate gSaltCureSwirlSpriteTemplate = +{ + .tileTag = ANIM_TAG_SALT_PARTICLE, + .paletteTag = ANIM_TAG_SALT_PARTICLE, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gAnims_WaterMudOrb, + .images = NULL, + .affineAnims = gAffineAnims_Whirlpool, + .callback = AnimParticleInVortex, +}; diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index f746f186aa..9090893fda 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -403,7 +403,7 @@ void AnimTask_CentredFrozenIceCube(u8 taskId) u8 battler1 = gBattleAnimTarget; u8 battler2 = BATTLE_PARTNER(battler1); - if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget)) + if (!IsDoubleBattle() || IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { x = GetBattlerSpriteCoord(battler1, BATTLER_COORD_X_2); y = GetBattlerSpriteCoord(battler1, BATTLER_COORD_Y_PIC_OFFSET); diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index a8c6e4077e..0ede51954a 100644 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -908,10 +908,7 @@ void AnimTask_SwitchOutBallEffect(u8 taskId) u32 selectedPalettes; spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - ballId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL); - else - ballId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL); + ballId = GetMonData(GetPartyBattlerData(gBattleAnimAttacker), MON_DATA_POKEBALL); switch (gTasks[taskId].data[0]) { diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index a8de8eddd9..47642b9fce 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -316,16 +316,9 @@ void AnimTask_DrawFallingWhiteLinesOnAttacker(u8 taskId) } if (IsContest()) - { species = gContestResources->moveAnim->species; - } else - { - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); - } + species = GetMonData(GetPartyBattlerData(gBattleAnimAttacker), MON_DATA_SPECIES); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); @@ -458,16 +451,9 @@ static void StatsChangeAnimation_Step1(u8 taskId) } if (IsContest()) - { sAnimStatsChangeData->species = gContestResources->moveAnim->species; - } else - { - if (GetBattlerSide(sAnimStatsChangeData->battler1) != B_SIDE_PLAYER) - sAnimStatsChangeData->species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES); - else - sAnimStatsChangeData->species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES); - } + sAnimStatsChangeData->species = GetMonData(GetPartyBattlerData(sAnimStatsChangeData->battler1), MON_DATA_SPECIES); gTasks[taskId].func = StatsChangeAnimation_Step2; } @@ -840,16 +826,9 @@ void StartMonScrollingBgMask(u8 taskId, int UNUSED unused, u16 scrollSpeed, u8 b SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); if (IsContest()) - { species = gContestResources->moveAnim->species; - } else - { - if (GetBattlerSide(battler) != B_SIDE_PLAYER) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); - else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); - } + species = GetMonData(GetPartyBattlerData(battler), MON_DATA_SPECIES); spriteId = CreateInvisibleSpriteCopy(battler, gBattlerSpriteIds[battler], species); if (includePartner) @@ -1057,7 +1036,7 @@ void AnimTask_SetAnimAttackerAndTargetForEffectTgt(u8 taskId) void AnimTask_IsTargetSameSide(u8 taskId) { - if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) gBattleAnimArgs[ARG_RET_ID] = TRUE; else gBattleAnimArgs[ARG_RET_ID] = FALSE; diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index 65f8178d13..57053ef043 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -940,7 +940,7 @@ static void AnimHydroCannonBeam(struct Sprite *sprite) { bool8 animType; u8 coordType; - if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + if (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { gBattleAnimArgs[0] *= -1; if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_LEFT) @@ -1349,25 +1349,11 @@ static u8 GetWaterSpoutPowerForAnim(void) u8 i; u16 hp; u16 maxhp; - u16 partyIndex; - struct Pokemon *slot; + struct Pokemon *slot = GetPartyBattlerData(gBattleAnimAttacker); - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - { - partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker]; - slot = &gPlayerParty[partyIndex]; - maxhp = GetMonData(slot, MON_DATA_MAX_HP); - hp = GetMonData(slot, MON_DATA_HP); - maxhp /= 4; - } - else - { - partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker]; - slot = &gEnemyParty[partyIndex]; - maxhp = GetMonData(slot, MON_DATA_MAX_HP); - hp = GetMonData(slot, MON_DATA_HP); - maxhp /= 4; - } + maxhp = GetMonData(slot, MON_DATA_MAX_HP); + hp = GetMonData(slot, MON_DATA_HP); + maxhp /= 4; for (i = 0; i < 3; i++) { if (hp < maxhp * (i + 1)) diff --git a/src/battle_arena.c b/src/battle_arena.c index 8868a4246e..d79602156f 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -362,18 +362,19 @@ void BattleArena_AddMindPoints(u8 battler) // - Fake Out subtracts 1 point // All status moves give 0 points, with the following exceptions: // - Protect, Detect, and Endure subtract 1 point + u32 effect = GetMoveEffect(gCurrentMove); - if (gMovesInfo[gCurrentMove].effect == EFFECT_FIRST_TURN_ONLY - || gMovesInfo[gCurrentMove].effect == EFFECT_PROTECT - || gMovesInfo[gCurrentMove].effect == EFFECT_ENDURE) + if (effect == EFFECT_FIRST_TURN_ONLY + || effect == EFFECT_PROTECT + || effect == EFFECT_ENDURE) { gBattleStruct->arenaMindPoints[battler]--; } - else if (!IS_MOVE_STATUS(gCurrentMove) - && gMovesInfo[gCurrentMove].effect != EFFECT_COUNTER - && gMovesInfo[gCurrentMove].effect != EFFECT_MIRROR_COAT - && gMovesInfo[gCurrentMove].effect != EFFECT_METAL_BURST - && gMovesInfo[gCurrentMove].effect != EFFECT_BIDE) + else if (!IsBattleMoveStatus(gCurrentMove) + && effect != EFFECT_COUNTER + && effect != EFFECT_MIRROR_COAT + && effect != EFFECT_METAL_BURST + && effect != EFFECT_BIDE) { gBattleStruct->arenaMindPoints[battler]++; } @@ -385,26 +386,25 @@ void BattleArena_AddSkillPoints(u8 battler) if (gHitMarker & HITMARKER_OBEYS) { - u8 *failedMoveBits = &gBattleStruct->alreadyStatusedMoveAttempt; - if (*failedMoveBits & (1u << battler)) + if (gBattleStruct->battlerState[battler].alreadyStatusedMoveAttempt) { - *failedMoveBits &= ~((1u << battler)); + gBattleStruct->battlerState[battler].alreadyStatusedMoveAttempt = FALSE; skillPoints[battler] -= 2; } - else if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + else if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { - if (!(gMoveResultFlags & MOVE_RESULT_MISSED) || gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_MISSED) || gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) skillPoints[battler] -= 2; } - else if ((gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) && (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)) + else if ((gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_SUPER_EFFECTIVE) && (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NOT_VERY_EFFECTIVE)) { skillPoints[battler] += 1; } - else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) + else if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_SUPER_EFFECTIVE) { skillPoints[battler] += 2; } - else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) + else if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NOT_VERY_EFFECTIVE) { skillPoints[battler] -= 1; } @@ -472,7 +472,7 @@ static void InitArenaChallenge(void) gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = 0; SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; } static void GetArenaData(void) @@ -562,7 +562,7 @@ static void GiveArenaPrize(void) static void BufferArenaOpponentName(void) { - GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); + GetFrontierTrainerName(gStringVar1, TRAINER_BATTLE_PARAM.opponentA); } void DrawArenaRefereeTextBox(void) diff --git a/src/battle_bg.c b/src/battle_bg.c index 328f990653..0625992d3d 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -703,24 +703,6 @@ const struct BattleBackground sBattleTerrainTable[] = }, }; -static void UNUSED CB2_UnusedBattleInit(void); - -static void UNUSED UnusedBattleInit(void) -{ - u8 spriteId; - - ResetSpriteData(); - spriteId = CreateSprite(&gUnusedBattleInitSprite, 0, 0, 0); - gSprites[spriteId].invisible = TRUE; - SetMainCallback2(CB2_UnusedBattleInit); -} - -static void UNUSED CB2_UnusedBattleInit(void) -{ - AnimateSprites(); - BuildOamBuffer(); -} - void BattleInitBgsAndWindows(void) { ResetBgsAndClearDma3BusyFlags(0); @@ -806,7 +788,7 @@ void DrawMainBattleBackground(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LZDecompressVram(gBattleTerrainTiles_Building, (void *)(BG_CHAR_ADDR(2))); @@ -1207,7 +1189,7 @@ void DrawBattleEntryBackground(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); @@ -1272,7 +1254,7 @@ bool8 LoadChosenBattleElement(u8 caseId) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LZDecompressVram(gBattleTerrainTiles_Building, (void *)(BG_CHAR_ADDR(2))); @@ -1334,7 +1316,7 @@ bool8 LoadChosenBattleElement(u8 caseId) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LZDecompressVram(gBattleTerrainTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); @@ -1396,7 +1378,7 @@ bool8 LoadChosenBattleElement(u8 caseId) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 7aeefa54b6..1e4bf628db 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -87,10 +87,6 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt [CONTROLLER_CHOSENMONRETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, - [CONTROLLER_CLEARUNKVAR] = BtlController_HandleClearUnkVar, - [CONTROLLER_SETUNKVAR] = BtlController_HandleSetUnkVar, - [CONTROLLER_CLEARUNKFLAG] = BtlController_HandleClearUnkFlag, - [CONTROLLER_TOGGLEUNKFLAG] = BtlController_HandleToggleUnkFlag, [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, [CONTROLLER_CANTSWITCH] = BtlController_Empty, [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, @@ -405,9 +401,9 @@ static void LinkOpponentHandleDrawTrainerPic(u32 battler) if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) { if (battler == B_POSITION_OPPONENT_LEFT) - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); else - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); } else { @@ -436,7 +432,7 @@ static void LinkOpponentHandleDrawTrainerPic(u32 battler) else { xPos = 176; - if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) { trainerPicId = GetUnionRoomTrainerPic(); } @@ -470,9 +466,9 @@ static void LinkOpponentHandleTrainerSlide(u32 battler) u32 trainerPicId; if (battler == B_POSITION_OPPONENT_LEFT) - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); else - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); BtlController_HandleTrainerSlide(battler, trainerPicId); LinkOpponentBufferExecCompleted(battler); // Possibly a bug, because execution should be completed after the slide in finishes. See Controller_WaitForTrainerPic. diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 283b492a91..795b885f95 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -86,10 +86,6 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl [CONTROLLER_CHOSENMONRETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, - [CONTROLLER_CLEARUNKVAR] = BtlController_HandleClearUnkVar, - [CONTROLLER_SETUNKVAR] = BtlController_HandleSetUnkVar, - [CONTROLLER_CLEARUNKFLAG] = BtlController_HandleClearUnkFlag, - [CONTROLLER_TOGGLEUNKFLAG] = BtlController_HandleToggleUnkFlag, [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, [CONTROLLER_CANTSWITCH] = BtlController_Empty, [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index e0507bfaf1..38fb304ac1 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -43,7 +43,6 @@ static void OpponentHandleLoadMonSprite(u32 battler); static void OpponentHandleSwitchInAnim(u32 battler); static void OpponentHandleDrawTrainerPic(u32 battler); -static void OpponentHandleTrainerSlide(u32 battler); static void OpponentHandleTrainerSlideBack(u32 battler); static void OpponentHandleMoveAnimation(u32 battler); static void OpponentHandlePrintString(u32 battler); @@ -101,10 +100,6 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_CHOSENMONRETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, - [CONTROLLER_CLEARUNKVAR] = BtlController_HandleClearUnkVar, - [CONTROLLER_SETUNKVAR] = BtlController_HandleSetUnkVar, - [CONTROLLER_CLEARUNKFLAG] = BtlController_HandleClearUnkFlag, - [CONTROLLER_TOGGLEUNKFLAG] = BtlController_HandleToggleUnkFlag, [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, [CONTROLLER_CANTSWITCH] = BtlController_Empty, [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, @@ -437,7 +432,7 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) { trainerPicId = GetSecretBaseTrainerPicIndex(); } - else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + else if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) { trainerPicId = GetFrontierBrainTrainerPicIndex(); } @@ -446,13 +441,13 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) { if (battlerId == 1) - trainerPicId = GetTrainerHillTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetTrainerHillTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); else - trainerPicId = GetTrainerHillTrainerFrontSpriteId(gTrainerBattleOpponent_B); + trainerPicId = GetTrainerHillTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); } else { - trainerPicId = GetTrainerHillTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetTrainerHillTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); } } else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) @@ -460,13 +455,13 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if (battlerId == 1) - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); else - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); } else { - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); } } else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) @@ -476,13 +471,13 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) { if (battlerId != 1) - trainerPicId = GetTrainerPicFromId(gTrainerBattleOpponent_B); + trainerPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentB); else - trainerPicId = GetTrainerPicFromId(gTrainerBattleOpponent_A); + trainerPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentA); } else { - trainerPicId = GetTrainerPicFromId(gTrainerBattleOpponent_A); + trainerPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentA); } return trainerPicId; @@ -508,7 +503,7 @@ static void OpponentHandleDrawTrainerPic(u32 battler) BtlController_HandleDrawTrainerPic(battler, trainerPicId, TRUE, xPos, 40, -1); } -static void OpponentHandleTrainerSlide(u32 battler) +void OpponentHandleTrainerSlide(u32 battler) { u32 trainerPicId = OpponentGetTrainerPicId(battler); BtlController_HandleTrainerSlide(battler, trainerPicId); @@ -609,7 +604,7 @@ static void OpponentHandleChooseMove(u32 battler) } while (!CanTargetBattler(battler, target, move)); // Don't bother to loop through table if the move can't attack ally - if (B_WILD_NATURAL_ENEMIES == TRUE && !(gMovesInfo[move].target & MOVE_TARGET_BOTH)) + if (B_WILD_NATURAL_ENEMIES == TRUE && !(GetBattlerMoveTargetType(battler, move) & MOVE_TARGET_BOTH)) { u16 i, speciesAttacker, speciesTarget, isPartnerEnemy = FALSE; static const u16 naturalEnemies[][2] = @@ -685,7 +680,7 @@ static void OpponentHandleChoosePokemon(u32 battler) // Switching out else if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) { - chosenMonId = GetMostSuitableMonToSwitchInto(battler, TRUE); + chosenMonId = GetMostSuitableMonToSwitchInto(battler, SWITCH_AFTER_KO); if (chosenMonId == PARTY_SIZE) { s32 battler1, battler2, firstId, lastId; diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 4bf2388fc6..5bac769eb6 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -138,10 +138,6 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_CHOSENMONRETURNVALUE] = PlayerHandleChosenMonReturnValue, [CONTROLLER_ONERETURNVALUE] = PlayerHandleOneReturnValue, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PlayerHandleOneReturnValue_Duplicate, - [CONTROLLER_CLEARUNKVAR] = BtlController_HandleClearUnkVar, - [CONTROLLER_SETUNKVAR] = BtlController_HandleSetUnkVar, - [CONTROLLER_CLEARUNKFLAG] = BtlController_HandleClearUnkFlag, - [CONTROLLER_TOGGLEUNKFLAG] = BtlController_HandleToggleUnkFlag, [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, [CONTROLLER_CANTSWITCH] = BtlController_Empty, [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, @@ -679,18 +675,18 @@ void HandleInputChooseMove(u32 battler) if (gBattleStruct->zmove.viewing) { gBattleStruct->zmove.viewing = FALSE; - if (gMovesInfo[moveInfo->moves[gMoveSelectionCursor[battler]]].category != DAMAGE_CATEGORY_STATUS) + if (GetMoveCategory(moveInfo->moves[gMoveSelectionCursor[battler]]) != DAMAGE_CATEGORY_STATUS) moveTarget = MOVE_TARGET_SELECTED; //damaging z moves always have selected target } // Status moves turn into Max Guard when Dynamaxed, targets user. if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX)) - moveTarget = gMovesInfo[GetMaxMove(battler, moveInfo->moves[gMoveSelectionCursor[battler]])].target; + moveTarget = GetMoveTarget(GetMaxMove(battler, moveInfo->moves[gMoveSelectionCursor[battler]])); if (moveTarget & MOVE_TARGET_USER) gMultiUsePlayerCursor = battler; else - gMultiUsePlayerCursor = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(battler))); + gMultiUsePlayerCursor = GetOpposingSideBattler(battler); if (gBattleResources->bufferA[battler][1]) // a double battle { @@ -842,7 +838,7 @@ void HandleInputChooseMove(u32 battler) TryChangeZTrigger(battler, gMoveSelectionCursor[battler]); } } - else if (JOY_NEW(SELECT_BUTTON) && !gBattleStruct->zmove.viewing && !gBattleStruct->descriptionSubmenu) + else if (B_MOVE_REARRANGEMENT_IN_BATTLE < GEN_4 && JOY_NEW(SELECT_BUTTON) && !gBattleStruct->zmove.viewing && !gBattleStruct->descriptionSubmenu) { if (gNumberOfMovesToChoose > 1 && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) { @@ -1707,41 +1703,41 @@ static void MoveSelectionDisplayPpNumber(u32 battler) static void MoveSelectionDisplayMoveType(u32 battler) { u8 *txtPtr, *end; - u8 type; - u32 speciesId; + u32 speciesId = gBattleMons[battler].species; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]); txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); - type = gMovesInfo[moveInfo->moves[gMoveSelectionCursor[battler]]].type; + u32 move = moveInfo->moves[gMoveSelectionCursor[battler]]; + u32 type = GetMoveType(move); + u32 effect = GetMoveEffect(move); - if (moveInfo->moves[gMoveSelectionCursor[battler]] == MOVE_TERA_BLAST) + if (effect == EFFECT_TERA_BLAST) { if (IsGimmickSelected(battler, GIMMICK_TERA) || GetActiveGimmick(battler) == GIMMICK_TERA) type = GetBattlerTeraType(battler); } - else if (moveInfo->moves[gMoveSelectionCursor[battler]] == MOVE_IVY_CUDGEL) + else if (effect == EFFECT_IVY_CUDGEL) { - speciesId = gBattleMons[battler].species; if (speciesId == SPECIES_OGERPON_WELLSPRING || speciesId == SPECIES_OGERPON_WELLSPRING_TERA || speciesId == SPECIES_OGERPON_HEARTHFLAME || speciesId == SPECIES_OGERPON_HEARTHFLAME_TERA || speciesId == SPECIES_OGERPON_CORNERSTONE || speciesId == SPECIES_OGERPON_CORNERSTONE_TERA) type = gBattleMons[battler].types[1]; } - else if (gMovesInfo[moveInfo->moves[gMoveSelectionCursor[battler]]].category == DAMAGE_CATEGORY_STATUS + else if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS && (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX))) { type = TYPE_NORMAL; // Max Guard is always a Normal-type move } - else if (moveInfo->moves[gMoveSelectionCursor[battler]] == MOVE_TERA_STARSTORM) + else if (effect == EFFECT_TERA_STARSTORM) { - if (gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR - || (IsGimmickSelected(battler, GIMMICK_TERA) && gBattleMons[battler].species == SPECIES_TERAPAGOS_TERASTAL)) + if (speciesId == SPECIES_TERAPAGOS_STELLAR + || (IsGimmickSelected(battler, GIMMICK_TERA) && speciesId == SPECIES_TERAPAGOS_TERASTAL)) type = TYPE_STELLAR; } else if (P_SHOW_DYNAMIC_TYPES) // Non-vanilla changes to battle UI showing dynamic types { struct Pokemon *mon = &gPlayerParty[gBattlerPartyIndexes[battler]]; - type = CheckDynamicMoveType(mon, moveInfo->moves[gMoveSelectionCursor[battler]], battler); + type = CheckDynamicMoveType(mon, move, battler); } end = StringCopy(txtPtr, gTypesInfo[type].name); @@ -1753,8 +1749,8 @@ static void MoveSelectionDisplayMoveDescription(u32 battler) { struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[battler][4]); u16 move = moveInfo->moves[gMoveSelectionCursor[battler]]; - u16 pwr = gMovesInfo[move].power; - u16 acc = gMovesInfo[move].accuracy; + u16 pwr = GetMovePower(move); + u16 acc = GetMoveAccuracy(move); u8 pwr_num[3], acc_num[3]; u8 cat_desc[7] = _("CAT: "); @@ -1782,10 +1778,7 @@ static void MoveSelectionDisplayMoveDescription(u32 battler) StringAppend(gDisplayedStringBattle, acc_desc); StringAppend(gDisplayedStringBattle, acc_num); StringAppend(gDisplayedStringBattle, gText_NewLine); - if (gMovesInfo[move].effect == EFFECT_PLACEHOLDER) - StringAppend(gDisplayedStringBattle, gNotDoneYetDescription); - else - StringAppend(gDisplayedStringBattle, gMovesInfo[move].description); + StringAppend(gDisplayedStringBattle, GetMoveDescription(move)); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MOVE_DESCRIPTION); if (gCategoryIconSpriteId == 0xFF) @@ -2044,9 +2037,10 @@ static void PlayerHandleChooseAction(u32 battler) if (B_SHOW_PARTNER_TARGET && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && IsBattlerAlive(B_POSITION_PLAYER_RIGHT)) { StringCopy(gStringVar1, COMPOUND_STRING("Partner will use:\n")); - u32 move = gBattleMons[B_POSITION_PLAYER_RIGHT].moves[*(gBattleStruct->chosenMovePositions + B_POSITION_PLAYER_RIGHT)]; - StringAppend(gStringVar1, gMovesInfo[move].name); - if (gMovesInfo[move].target == MOVE_TARGET_SELECTED) + u32 move = gBattleMons[B_POSITION_PLAYER_RIGHT].moves[gBattleStruct->chosenMovePositions[B_POSITION_PLAYER_RIGHT]]; + StringAppend(gStringVar1, GetMoveName(move)); + u32 moveTarget = GetBattlerMoveTargetType(B_POSITION_PLAYER_RIGHT, move); + if (moveTarget == MOVE_TARGET_SELECTED) { if (gBattleStruct->aiChosenTarget[B_POSITION_PLAYER_RIGHT] == B_POSITION_OPPONENT_LEFT) StringAppend(gStringVar1, COMPOUND_STRING(" -{UP_ARROW}")); @@ -2057,15 +2051,15 @@ static void PlayerHandleChooseAction(u32 battler) else if (gBattleStruct->aiChosenTarget[B_POSITION_PLAYER_RIGHT] == B_POSITION_PLAYER_RIGHT) StringAppend(gStringVar1, COMPOUND_STRING(" {DOWN_ARROW}-")); } - else if (gMovesInfo[move].target == MOVE_TARGET_BOTH) + else if (moveTarget == MOVE_TARGET_BOTH) { StringAppend(gStringVar1, COMPOUND_STRING(" {UP_ARROW}{UP_ARROW}")); } - else if (gMovesInfo[move].target == MOVE_TARGET_FOES_AND_ALLY) + else if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { StringAppend(gStringVar1, COMPOUND_STRING(" {V_D_ARROW}{UP_ARROW}")); } - else if (gMovesInfo[move].target == MOVE_TARGET_ALL_BATTLERS) + else if (moveTarget == MOVE_TARGET_ALL_BATTLERS) { StringAppend(gStringVar1, COMPOUND_STRING(" {V_D_ARROW}{V_D_ARROW}")); } @@ -2107,7 +2101,7 @@ void HandleChooseMoveAfterDma3(u32 battler) static void PlayerChooseMoveInBattlePalace(u32 battler) { - if (--*(gBattleStruct->arenaMindPoints + battler) == 0) + if (--gBattleStruct->arenaMindPoints[battler] == 0) { gBattlePalaceMoveSelectionRngValue = gRngValue; BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, ChooseMoveAndTargetInBattlePalace(battler)); @@ -2119,7 +2113,7 @@ void PlayerHandleChooseMove(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - *(gBattleStruct->arenaMindPoints + battler) = 8; + gBattleStruct->arenaMindPoints[battler] = 8; gBattlerControllerFuncs[battler] = PlayerChooseMoveInBattlePalace; } else @@ -2173,7 +2167,8 @@ static void PlayerHandleChoosePokemon(u32 battler) gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[battler][4 + i]; if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH - && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CHOOSE_FAINTED_MON) + && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CHOOSE_FAINTED_MON + && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_SEND_MON_TO_BOX) { BtlController_EmitChosenMonReturnValue(battler, BUFFER_B, gBattlerPartyIndexes[battler] + 1, gBattlePartyCurrentOrder); PlayerBufferExecCompleted(battler); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 8bc27751b4..39c1d25526 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -90,10 +90,6 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat [CONTROLLER_CHOSENMONRETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, - [CONTROLLER_CLEARUNKVAR] = BtlController_HandleClearUnkVar, - [CONTROLLER_SETUNKVAR] = BtlController_HandleSetUnkVar, - [CONTROLLER_CLEARUNKFLAG] = BtlController_HandleClearUnkFlag, - [CONTROLLER_TOGGLEUNKFLAG] = BtlController_HandleToggleUnkFlag, [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, [CONTROLLER_CANTSWITCH] = BtlController_Empty, [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, @@ -297,9 +293,11 @@ static void PlayerPartnerHandleDrawTrainerPic(u32 battler) s16 xPos, yPos; u32 trainerPicId; + enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); + if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) { - trainerPicId = gBattlePartners[gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic; + trainerPicId = gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic; xPos = 90; yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } @@ -353,10 +351,11 @@ static void PlayerPartnerHandleChooseMove(u32 battler) chosenMoveId = gBattleStruct->aiMoveOrAction[battler]; gBattlerTarget = gBattleStruct->aiChosenTarget[battler]; + u32 moveTarget = GetBattlerMoveTargetType(battler, moveInfo->moves[chosenMoveId]); - if (gMovesInfo[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_USER) + if (moveTarget & MOVE_TARGET_USER) gBattlerTarget = battler; - else if (gMovesInfo[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_BOTH) + else if (moveTarget & MOVE_TARGET_BOTH) { gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); if (gAbsentBattlerFlags & (1u << gBattlerTarget)) @@ -388,7 +387,7 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler) // Switching out else if (gBattleStruct->monToSwitchIntoId[battler] >= PARTY_SIZE || !IsValidForBattle(&gPlayerParty[gBattleStruct->monToSwitchIntoId[battler]])) { - chosenMonId = GetMostSuitableMonToSwitchInto(battler, TRUE); + chosenMonId = GetMostSuitableMonToSwitchInto(battler, SWITCH_AFTER_KO); if (chosenMonId == PARTY_SIZE || !IsValidForBattle(&gPlayerParty[chosenMonId])) // just switch to the next mon { @@ -406,7 +405,7 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler) } } } - *(gBattleStruct->monToSwitchIntoId + battler) = chosenMonId; + gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; } else // Mon to switch out has been already chosen. { @@ -426,9 +425,10 @@ static void PlayerPartnerHandleHealthBarUpdate(u32 battler) static void PlayerPartnerHandleIntroTrainerBallThrow(u32 battler) { const u32 *trainerPal; + enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) - trainerPal = gTrainerBacksprites[gBattlePartners[gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic].palette.data; + trainerPal = gTrainerBacksprites[gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic].palette.data; else if (IsAiVsAiBattle()) trainerPal = gTrainerSprites[GetTrainerPicFromId(gPartnerTrainerId)].palette.data; else diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index afd56a9faf..38d2e0ea02 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -64,7 +64,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_SWITCHINANIM] = RecordedOpponentHandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = RecordedOpponentHandleDrawTrainerPic, - [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, + [CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = RecordedOpponentHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = BtlController_Empty, @@ -93,10 +93,6 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_CHOSENMONRETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, - [CONTROLLER_CLEARUNKVAR] = BtlController_HandleClearUnkVar, - [CONTROLLER_SETUNKVAR] = BtlController_HandleSetUnkVar, - [CONTROLLER_CLEARUNKFLAG] = BtlController_HandleClearUnkFlag, - [CONTROLLER_TOGGLEUNKFLAG] = BtlController_HandleToggleUnkFlag, [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, [CONTROLLER_CANTSWITCH] = BtlController_Empty, [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, @@ -413,9 +409,9 @@ static void RecordedOpponentHandleDrawTrainerPic(u32 battler) if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) { if (battler == B_POSITION_OPPONENT_LEFT) - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentA); else - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); + trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); } else { @@ -425,7 +421,7 @@ static void RecordedOpponentHandleDrawTrainerPic(u32 battler) else { xPos = 176; - if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) { trainerPicId = GetUnionRoomTrainerPic(); } @@ -488,9 +484,9 @@ static void RecordedOpponentHandleChooseItem(u32 battler) static void RecordedOpponentHandleChoosePokemon(u32 battler) { - *(gBattleStruct->monToSwitchIntoId + battler) = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler); + gBattleStruct->monToSwitchIntoId[battler] = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler); gSelectedMonPartyId = gBattleStruct->monToSwitchIntoId[battler]; // Revival Blessing - BtlController_EmitChosenMonReturnValue(battler, BUFFER_B, *(gBattleStruct->monToSwitchIntoId + battler), NULL); + BtlController_EmitChosenMonReturnValue(battler, BUFFER_B, gBattleStruct->monToSwitchIntoId[battler], NULL); RecordedOpponentBufferExecCompleted(battler); } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 2bb64f3066..2ca57d7af8 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -90,10 +90,6 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_CHOSENMONRETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, - [CONTROLLER_CLEARUNKVAR] = BtlController_HandleClearUnkVar, - [CONTROLLER_SETUNKVAR] = BtlController_HandleSetUnkVar, - [CONTROLLER_CLEARUNKFLAG] = BtlController_HandleClearUnkFlag, - [CONTROLLER_TOGGLEUNKFLAG] = BtlController_HandleToggleUnkFlag, [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, [CONTROLLER_CANTSWITCH] = BtlController_Empty, [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, @@ -481,9 +477,9 @@ static void RecordedPlayerHandleChooseItem(u32 battler) static void RecordedPlayerHandleChoosePokemon(u32 battler) { - *(gBattleStruct->monToSwitchIntoId + battler) = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler); + gBattleStruct->monToSwitchIntoId[battler] = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler); gSelectedMonPartyId = gBattleStruct->monToSwitchIntoId[battler]; // Revival Blessing - BtlController_EmitChosenMonReturnValue(battler, BUFFER_B, *(gBattleStruct->monToSwitchIntoId + battler), NULL); + BtlController_EmitChosenMonReturnValue(battler, BUFFER_B, gBattleStruct->monToSwitchIntoId[battler], NULL); RecordedPlayerBufferExecCompleted(battler); } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index abb2aba946..2d85ddaaec 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -82,10 +82,6 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_CHOSENMONRETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, - [CONTROLLER_CLEARUNKVAR] = BtlController_Empty, - [CONTROLLER_SETUNKVAR] = BtlController_Empty, - [CONTROLLER_CLEARUNKFLAG] = BtlController_Empty, - [CONTROLLER_TOGGLEUNKFLAG] = BtlController_Empty, [CONTROLLER_HITANIMATION] = BtlController_Empty, [CONTROLLER_CANTSWITCH] = BtlController_Empty, [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 66d3932694..bba1ffd1da 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -94,10 +94,6 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_CHOSENMONRETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE] = BtlController_Empty, [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, - [CONTROLLER_CLEARUNKVAR] = BtlController_Empty, - [CONTROLLER_SETUNKVAR] = BtlController_Empty, - [CONTROLLER_CLEARUNKFLAG] = BtlController_Empty, - [CONTROLLER_TOGGLEUNKFLAG] = BtlController_Empty, [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, [CONTROLLER_CANTSWITCH] = BtlController_Empty, [CONTROLLER_PLAYSE] = WallyHandlePlaySE, diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 15e90691f2..952bdfe345 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -28,7 +28,6 @@ static EWRAM_DATA u8 sLinkSendTaskId = 0; static EWRAM_DATA u8 sLinkReceiveTaskId = 0; -EWRAM_DATA struct UnusedControllerStruct gUnusedControllerStruct = {}; // Debug? Unused code that writes to it, never read COMMON_DATA void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(u32 battler) = {0}; COMMON_DATA u8 gBattleControllerData[MAX_BATTLERS_COUNT] = {0}; // Used by the battle controllers to store misc sprite/task IDs for each battler @@ -1078,7 +1077,7 @@ void BtlController_EmitMoveAnimation(u32 battler, u32 bufferId, u16 move, u8 tur gBattleResources->transferBuffer[9] = (dmg & 0xFF000000) >> 24; gBattleResources->transferBuffer[10] = friendship; gBattleResources->transferBuffer[11] = multihit; - if (WEATHER_HAS_EFFECT) + if (HasWeatherEffect()) { gBattleResources->transferBuffer[12] = gBattleWeather; gBattleResources->transferBuffer[13] = (gBattleWeather & 0xFF00) >> 8; @@ -1113,7 +1112,7 @@ void BtlController_EmitPrintString(u32 battler, u32 bufferId, u16 stringID) stringInfo->bakScriptPartyIdx = gBattleStruct->scriptPartyIdx; stringInfo->hpScale = gBattleStruct->hpScale; stringInfo->itemEffectBattler = gPotentialItemEffectBattler; - stringInfo->moveType = gMovesInfo[gCurrentMove].type; + stringInfo->moveType = GetMoveType(gCurrentMove); for (i = 0; i < MAX_BATTLERS_COUNT; i++) stringInfo->abilities[i] = gBattleMons[i].ability; @@ -1371,40 +1370,6 @@ void BtlController_EmitOneReturnValue_Duplicate(u32 battler, u32 bufferId, u16 r PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4); } -static void UNUSED BtlController_EmitClearUnkVar(u32 battler, u32 bufferId) -{ - gBattleResources->transferBuffer[0] = CONTROLLER_CLEARUNKVAR; - gBattleResources->transferBuffer[1] = CONTROLLER_CLEARUNKVAR; - gBattleResources->transferBuffer[2] = CONTROLLER_CLEARUNKVAR; - gBattleResources->transferBuffer[3] = CONTROLLER_CLEARUNKVAR; - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4); -} - -static void UNUSED BtlController_EmitSetUnkVar(u32 battler, u32 bufferId, u8 b) -{ - gBattleResources->transferBuffer[0] = CONTROLLER_SETUNKVAR; - gBattleResources->transferBuffer[1] = b; - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 2); -} - -static void UNUSED BtlController_EmitClearUnkFlag(u32 battler, u32 bufferId) -{ - gBattleResources->transferBuffer[0] = CONTROLLER_CLEARUNKFLAG; - gBattleResources->transferBuffer[1] = CONTROLLER_CLEARUNKFLAG; - gBattleResources->transferBuffer[2] = CONTROLLER_CLEARUNKFLAG; - gBattleResources->transferBuffer[3] = CONTROLLER_CLEARUNKFLAG; - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4); -} - -static void UNUSED BtlController_EmitToggleUnkFlag(u32 battler, u32 bufferId) -{ - gBattleResources->transferBuffer[0] = CONTROLLER_TOGGLEUNKFLAG; - gBattleResources->transferBuffer[1] = CONTROLLER_TOGGLEUNKFLAG; - gBattleResources->transferBuffer[2] = CONTROLLER_TOGGLEUNKFLAG; - gBattleResources->transferBuffer[3] = CONTROLLER_TOGGLEUNKFLAG; - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4); -} - void BtlController_EmitHitAnimation(u32 battler, u32 bufferId) { gBattleResources->transferBuffer[0] = CONTROLLER_HITANIMATION; @@ -1616,7 +1581,7 @@ static u32 GetBattlerMonData(u32 battler, struct Pokemon *party, u32 monId, u8 * u32 side = GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = gBattleStruct->overwrittenAbilities[battler] = TestRunner_Battle_GetForcedAbility(side, partyIndex); + gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = TestRunner_Battle_GetForcedAbility(side, partyIndex); } #endif break; @@ -2765,30 +2730,6 @@ void BtlController_HandleStatusAnimation(u32 battler) } } -void BtlController_HandleClearUnkVar(u32 battler) -{ - gUnusedControllerStruct.unk = 0; - BattleControllerComplete(battler); -} - -void BtlController_HandleSetUnkVar(u32 battler) -{ - gUnusedControllerStruct.unk = gBattleResources->bufferA[battler][1]; - BattleControllerComplete(battler); -} - -void BtlController_HandleClearUnkFlag(u32 battler) -{ - gUnusedControllerStruct.flag = 0; - BattleControllerComplete(battler); -} - -void BtlController_HandleToggleUnkFlag(u32 battler) -{ - gUnusedControllerStruct.flag ^= 1; - BattleControllerComplete(battler); -} - void BtlController_HandleHitAnimation(u32 battler) { if (gSprites[gBattlerSpriteIds[battler]].invisible == TRUE) diff --git a/src/battle_debug.c b/src/battle_debug.c index c4fef859f4..44a92b5f93 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -818,7 +818,7 @@ static void PrintDigitChars(struct BattleDebugMenu *data); static void SetUpModifyArrows(struct BattleDebugMenu *data); static void UpdateBattlerValue(struct BattleDebugMenu *data); static void UpdateMonData(struct BattleDebugMenu *data); -static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue); +static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue); static bool32 TryMoveDigit(struct BattleDebugModifyArrows *modArrows, bool32 moveUp); static void SwitchToDebugView(u8 taskId); static void SwitchToDebugViewFromAiParty(u8 taskId); @@ -1852,7 +1852,7 @@ static void ValueToCharDigits(u8 *charDigits, u32 newValue, u8 maxDigits) charDigits[i] = valueDigits[i] + CHAR_0; } -static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue) +static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue) { struct SideTimer *sideTimer = &gSideTimers[GetBattlerSide(data->battlerId)]; @@ -1982,7 +1982,7 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_DAMAGE_NON_TYPES; else *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_DAMAGE_NON_TYPES; - sideTimer->damageNonTypesType = gMovesInfo[gCurrentMove].type; + sideTimer->damageNonTypesType = GetMoveType(gCurrentMove); } return &sideTimer->damageNonTypesTimer; case LIST_SIDE_RAINBOW: diff --git a/src/battle_dome.c b/src/battle_dome.c index 8b376c7e75..d374843573 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -1782,7 +1782,7 @@ static void InitDomeChallenge(void) gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] = 0; SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; } static void GetDomeData(void) @@ -2182,13 +2182,13 @@ static void BufferDomeRoundText(void) static void BufferDomeOpponentName(void) { StringCopy(gStringVar1, gRoundsStringTable[gSaveBlock2Ptr->frontier.curChallengeBattleNum]); - CopyDomeTrainerName(gStringVar2, gTrainerBattleOpponent_A); + CopyDomeTrainerName(gStringVar2, TRAINER_BATTLE_PARAM.opponentA); } static void InitDomeOpponentParty(void) { CalculatePlayerPartyCount(); - CreateDomeOpponentMons(TrainerIdToTournamentId(gTrainerBattleOpponent_A)); + CreateDomeOpponentMons(TrainerIdToTournamentId(TRAINER_BATTLE_PARAM.opponentA)); } static void CreateDomeOpponentMon(u8 monPartyId, u16 tournamentTrainerId, u8 tournamentMonId, u32 otId) @@ -2395,13 +2395,13 @@ static int GetTypeEffectivenessPoints(int move, int targetSpecies, int mode) int defType1, defType2, defAbility, moveType; int typePower = TYPE_x1; - if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || IS_MOVE_STATUS(move)) + if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || IsBattleMoveStatus(move)) return 0; defType1 = gSpeciesInfo[targetSpecies].types[0]; defType2 = gSpeciesInfo[targetSpecies].types[1]; defAbility = gSpeciesInfo[targetSpecies].abilities[0]; - moveType = gMovesInfo[move].type; + moveType = GetMoveType(move); if (defAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND) { @@ -2577,7 +2577,7 @@ static int TournamentIdOfOpponent(int roundId, int trainerId) static void SetDomeOpponentId(void) { - gTrainerBattleOpponent_A = TrainerIdOfPlayerOpponent(); + TRAINER_BATTLE_PARAM.opponentA = TrainerIdOfPlayerOpponent(); } // While not an issue in-game, this will overflow if called after the player's opponent for the current round has been eliminated @@ -2588,7 +2588,7 @@ static u16 TrainerIdOfPlayerOpponent(void) static void SetDomeOpponentGraphicsId(void) { - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); } static void SaveDomeChallenge(void) @@ -3890,7 +3890,7 @@ static bool32 IsDomeHealingMove(u32 move) if (IsHealingMove(move)) return TRUE; // Check extra effects not considered plain healing by AI - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_INGRAIN: case EFFECT_REFRESH: @@ -3949,9 +3949,9 @@ static bool32 IsDomeRiskyMoveEffect(u32 effect) static bool32 IsDomeLuckyMove(u32 move) { - if (gMovesInfo[move].accuracy <= 50) + if (GetMoveAccuracy(move) <= 50) return TRUE; - switch(gMovesInfo[move].effect) + switch(GetMoveEffect(move)) { case EFFECT_COUNTER: case EFFECT_OHKO: // Technically redundant because of the above accuracy check @@ -3982,10 +3982,10 @@ static bool32 IsDomePopularMove(u32 move) if (i == NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES) return FALSE; // Filter in TMs/HMs - if (gMovesInfo[move].power >= 90) + if (GetMovePower(move) >= 90) return TRUE; - switch(gMovesInfo[move].effect) + switch(GetMoveEffect(move)) { case EFFECT_PROTECT: case EFFECT_MAT_BLOCK: @@ -4000,7 +4000,7 @@ static bool32 IsDomePopularMove(u32 move) static bool32 IsDomeStatusMoveEffect(u32 move) { - switch(gMovesInfo[move].effect) + switch(GetMoveEffect(move)) { case EFFECT_SLEEP: case EFFECT_CONFUSE: @@ -4294,24 +4294,26 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) { for (k = 0; k < NUM_MOVE_POINT_TYPES; k++) { - u16 move; + u32 move; if (trainerId == TRAINER_FRONTIER_BRAIN) move = GetFrontierBrainMonMove(i, j); else if (trainerId == TRAINER_PLAYER) move = gSaveBlock2Ptr->frontier.domePlayerPartyData[i].moves[j]; else move = gFacilityTrainerMons[DOME_MONS[trainerTourneyId][i]].moves[j]; + u32 effect = GetMoveEffect(move); + u32 accuracy = GetMoveAccuracy(move); switch (k) { case MOVE_POINTS_COMBO: - allocatedArray[k] = IsDomeComboMoveEffect(gMovesInfo[move].effect) ? 1 : 0; + allocatedArray[k] = IsDomeComboMoveEffect(effect) ? 1 : 0; break; case MOVE_POINTS_STAT_RAISE: - allocatedArray[k] = IsStatRaisingEffect(gMovesInfo[move].effect) ? 1 : 0; + allocatedArray[k] = IsStatRaisingEffect(effect) ? 1 : 0; break; case MOVE_POINTS_STAT_LOWER: - allocatedArray[k] = IsStatLoweringEffect(gMovesInfo[move].effect) ? 1 : 0; + allocatedArray[k] = IsStatLoweringEffect(effect) ? 1 : 0; break; case MOVE_POINTS_RARE: allocatedArray[k] = IsDomeRareMove(move) ? 1 : 0; @@ -4320,22 +4322,22 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) allocatedArray[k] = IsDomeHealingMove(move) ? 1 : 0; break; case MOVE_POINTS_RISKY: - allocatedArray[k] = IsDomeRiskyMoveEffect(gMovesInfo[move].effect) ? 1 : 0; + allocatedArray[k] = IsDomeRiskyMoveEffect(effect) ? 1 : 0; break; case MOVE_POINTS_STATUS: allocatedArray[k] = IsDomeStatusMoveEffect(move); break; case MOVE_POINTS_DMG: - allocatedArray[k] = (!IS_MOVE_STATUS(move)) ? 1 : 0; + allocatedArray[k] = (!IsBattleMoveStatus(move)) ? 1 : 0; break; case MOVE_POINTS_DEF: - allocatedArray[k] = IsDomeDefensiveMoveEffect(gMovesInfo[move].effect) ? 1 : 0; + allocatedArray[k] = IsDomeDefensiveMoveEffect(effect) ? 1 : 0; break; case MOVE_POINTS_ACCURATE: - allocatedArray[k] = (gMovesInfo[move].accuracy == 0 || gMovesInfo[move].accuracy == 100) ? 1 : 0; + allocatedArray[k] = (accuracy == 0 || accuracy == 100) ? 1 : 0; break; case MOVE_POINTS_POWERFUL: - allocatedArray[k] = (gMovesInfo[move].power >= 100) ? 1 : 0; + allocatedArray[k] = (GetMovePower(move) >= 100) ? 1 : 0; break; case MOVE_POINTS_POPULAR: allocatedArray[k] = IsDomePopularMove(move) ? 1 : 0; @@ -4344,10 +4346,10 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) allocatedArray[k] = IsDomeLuckyMove(move) ? 1 : 0; break; case MOVE_POINTS_STRONG: - allocatedArray[k] = (gMovesInfo[move].power >= 90) ? 1 : 0; + allocatedArray[k] = (GetMovePower(move) >= 90) ? 1 : 0; break; case MOVE_POINTS_LOW_PP: - allocatedArray[k] = (gMovesInfo[move].pp <= 5) ? 1 : 0; + allocatedArray[k] = (GetMovePP(move) <= 5) ? 1 : 0; break; case MOVE_POINTS_EFFECT: allocatedArray[k] = MoveIsAffectedBySheerForce(move); @@ -5061,9 +5063,9 @@ static void ResolveDomeRoundWinners(void) if (gSpecialVar_0x8005 == DOME_PLAYER_WON_MATCH) { - DOME_TRAINERS[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].isEliminated = TRUE; - DOME_TRAINERS[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].eliminatedAt = gSaveBlock2Ptr->frontier.curChallengeBattleNum; - gSaveBlock2Ptr->frontier.domeWinningMoves[TrainerIdToTournamentId(gTrainerBattleOpponent_A)] = gBattleResults.lastUsedMovePlayer; + DOME_TRAINERS[TrainerIdToTournamentId(TRAINER_BATTLE_PARAM.opponentA)].isEliminated = TRUE; + DOME_TRAINERS[TrainerIdToTournamentId(TRAINER_BATTLE_PARAM.opponentA)].eliminatedAt = gSaveBlock2Ptr->frontier.curChallengeBattleNum; + gSaveBlock2Ptr->frontier.domeWinningMoves[TrainerIdToTournamentId(TRAINER_BATTLE_PARAM.opponentA)] = gBattleResults.lastUsedMovePlayer; // If the player's match was the final one, no NPC vs NPC matches to decide if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < DOME_FINAL) @@ -5107,12 +5109,12 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun else moveIds[i * MAX_MON_MOVES + j] = gFacilityTrainerMons[DOME_MONS[winnerTournamentId][i]].moves[j]; - movePower = gMovesInfo[moveIds[i * MAX_MON_MOVES + j]].power; - if (IS_MOVE_STATUS(moveIds[i * MAX_MON_MOVES + j])) + movePower = GetMovePower(moveIds[i * MAX_MON_MOVES + j]); + if (IsBattleMoveStatus(moveIds[i * MAX_MON_MOVES + j])) movePower = 40; else if (movePower == 1) movePower = 60; - else if (gMovesInfo[moveIds[i * MAX_MON_MOVES + j]].effect == EFFECT_EXPLOSION) + else if (GetMoveEffect(moveIds[i * MAX_MON_MOVES + j]) == EFFECT_EXPLOSION) movePower /= 2; for (k = 0; k < FRONTIER_PARTY_SIZE; k++) @@ -5691,7 +5693,7 @@ static void ReduceDomePlayerPartyToSelectedMons(void) static void GetPlayerSeededBeforeOpponent(void) { // A higher tournament ID is a worse seed - if (TrainerIdToTournamentId(gTrainerBattleOpponent_A) > TrainerIdToTournamentId(TRAINER_PLAYER)) + if (TrainerIdToTournamentId(TRAINER_BATTLE_PARAM.opponentA) > TrainerIdToTournamentId(TRAINER_PLAYER)) gSpecialVar_Result = 1; else gSpecialVar_Result = 2; diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 0f55b33dab..3e8d0e9db7 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -23,7 +23,7 @@ #include "constants/items.h" #include "constants/moves.h" -static u8 GetMaxPowerTier(u32 move); +static u32 GetMaxPowerTier(u32 move); struct GMaxMove { @@ -197,13 +197,10 @@ void ActivateDynamax(u32 battler) // Unsets the flags used for Dynamaxing and reverts max HP if needed. void UndoDynamax(u32 battler) { - u8 side = GetBattlerSide(battler); - u8 monId = gBattlerPartyIndexes[battler]; - // Revert HP if battler is still Dynamaxed. if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) { - struct Pokemon *mon = (side == B_SIDE_PLAYER) ? &gPlayerParty[monId] : &gEnemyParty[monId]; + struct Pokemon *mon = GetPartyBattlerData(battler); uq4_12_t mult = GetDynamaxLevelHPMultiplier(GetMonData(mon, MON_DATA_DYNAMAX_LEVEL), TRUE); gBattleMons[battler].hp = UQ_4_12_TO_INT((GetMonData(mon, MON_DATA_HP) * mult + 1) + UQ_4_12_ROUND); // round up SetMonData(mon, MON_DATA_HP, &gBattleMons[battler].hp); @@ -242,7 +239,7 @@ bool32 IsMoveBlockedByMaxGuard(u32 move) bool32 IsMoveBlockedByDynamax(u32 move) { // TODO: Certain moves are banned in raids. - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_HEAT_CRASH: case EFFECT_LOW_KICK: @@ -256,12 +253,12 @@ static u16 GetTypeBasedMaxMove(u32 battler, u32 type) // Gigantamax check u32 i; u32 species = gBattleMons[battler].species; - u32 targetSpecies = SPECIES_NONE; + u32 targetSpecies = species; if (!gSpeciesInfo[species].isGigantamax) targetSpecies = GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_GIGANTAMAX); - if (targetSpecies != SPECIES_NONE) + if (targetSpecies != species) species = targetSpecies; if (gSpeciesInfo[species].isGigantamax) @@ -284,7 +281,7 @@ u16 GetMaxMove(u32 battler, u32 baseMove) { u32 moveType; SetTypeBeforeUsingMove(baseMove, battler); - moveType = GetMoveType(baseMove); + moveType = GetBattleMoveType(baseMove); if (baseMove == MOVE_NONE) // for move display { @@ -294,7 +291,7 @@ u16 GetMaxMove(u32 battler, u32 baseMove) { return MOVE_STRUGGLE; } - else if (gMovesInfo[baseMove].category == DAMAGE_CATEGORY_STATUS) + else if (GetMoveCategory(baseMove) == DAMAGE_CATEGORY_STATUS) { return MOVE_MAX_GUARD; } @@ -318,11 +315,11 @@ enum }; // Gets the base power of a Max Move. -u8 GetMaxMovePower(u32 move) +u32 GetMaxMovePower(u32 move) { - u8 tier; + u32 tier; // G-Max Drum Solo, G-Max Hydrosnipe, and G-Max Fireball always have 160 base power. - if (gMovesInfo[GetMaxMove(gBattlerAttacker, move)].argument == MAX_EFFECT_FIXED_POWER) + if (MoveHasAdditionalEffect(move, MOVE_EFFECT_FIXED_POWER)) return 160; // Exceptions to all other rules below: @@ -335,8 +332,9 @@ u8 GetMaxMovePower(u32 move) } tier = GetMaxPowerTier(move); - if (gMovesInfo[move].type == TYPE_FIGHTING - || gMovesInfo[move].type == TYPE_POISON + u32 moveType = GetMoveType(move); + if (moveType == TYPE_FIGHTING + || moveType == TYPE_POISON || move == MOVE_MULTI_ATTACK) { switch (tier) @@ -369,11 +367,12 @@ u8 GetMaxMovePower(u32 move) } } -static u8 GetMaxPowerTier(u32 move) +static u32 GetMaxPowerTier(u32 move) { - if (gMovesInfo[move].strikeCount >= 2 && gMovesInfo[move].strikeCount <= 5) + u32 strikeCount = GetMoveStrikeCount(move); + if (strikeCount >= 2 && strikeCount <= 5) { - switch(gMovesInfo[move].power) + switch(GetMovePower(move)) { case 0 ... 25: return MAX_POWER_TIER_2; case 26 ... 30: return MAX_POWER_TIER_3; @@ -384,7 +383,7 @@ static u8 GetMaxPowerTier(u32 move) } } - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_BIDE: case EFFECT_SUPER_FANG: @@ -420,7 +419,7 @@ static u8 GetMaxPowerTier(u32 move) case EFFECT_LOW_KICK: return MAX_POWER_TIER_7; case EFFECT_MULTI_HIT: - switch(gMovesInfo[move].power) + switch(GetMovePower(move)) { case 0 ... 15: return MAX_POWER_TIER_1; case 16 ... 18: return MAX_POWER_TIER_2; @@ -430,7 +429,7 @@ static u8 GetMaxPowerTier(u32 move) } } - switch (gMovesInfo[move].power) + switch (GetMovePower(move)) { case 0 ... 40: return MAX_POWER_TIER_1; case 45 ... 50: return MAX_POWER_TIER_2; @@ -469,42 +468,6 @@ void ChooseDamageNonTypesString(u8 type) } } -// Returns the status effect that should be applied by a G-Max Move. -static u32 GetMaxMoveStatusEffect(u32 move) -{ - u8 maxEffect = gMovesInfo[move].argument; - switch (maxEffect) - { - // Status 1 - case MAX_EFFECT_PARALYZE_FOES: - return STATUS1_PARALYSIS; - case MAX_EFFECT_POISON_FOES: - return STATUS1_POISON; - case MAX_EFFECT_POISON_PARALYZE_FOES: - { - static const u8 sStunShockEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON}; - return RandomElement(RNG_G_MAX_STUN_SHOCK, sStunShockEffects); - } - case MAX_EFFECT_EFFECT_SPORE_FOES: - { - static const u8 sBefuddleEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON, STATUS1_SLEEP}; - return RandomElement(RNG_G_MAX_BEFUDDLE, sBefuddleEffects); - } - // Status 2 - case MAX_EFFECT_CONFUSE_FOES: - case MAX_EFFECT_CONFUSE_FOES_PAY_DAY: - return STATUS2_CONFUSION; - case MAX_EFFECT_INFATUATE_FOES: - return STATUS2_INFATUATION; - case MAX_EFFECT_MEAN_LOOK: - return STATUS2_ESCAPE_PREVENTION; - case MAX_EFFECT_TORMENT_FOES: - return STATUS2_TORMENT; - default: - return STATUS1_NONE; - } -} - // Updates Dynamax HP multipliers and healthboxes. void BS_UpdateDynamax(void) { @@ -519,499 +482,6 @@ void BS_UpdateDynamax(void) gBattlescriptCurrInstr = cmd->nextInstr; } -// Activates the secondary effect of a Max Move. -void BS_SetMaxMoveEffect(void) -{ - NATIVE_ARGS(); - u16 effect = 0; - u8 maxEffect = gMovesInfo[gCurrentMove].argument; - - // Don't continue if the move didn't land. - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - { - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - - switch (maxEffect) - { - case MAX_EFFECT_RAISE_TEAM_ATTACK: - case MAX_EFFECT_RAISE_TEAM_DEFENSE: - case MAX_EFFECT_RAISE_TEAM_SPEED: - case MAX_EFFECT_RAISE_TEAM_SP_ATK: - case MAX_EFFECT_RAISE_TEAM_SP_DEF: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(gMovesInfo[gCurrentMove].argument, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - effect++; - } - break; - case MAX_EFFECT_LOWER_ATTACK: - case MAX_EFFECT_LOWER_DEFENSE: - case MAX_EFFECT_LOWER_SPEED: - case MAX_EFFECT_LOWER_SP_ATK: - case MAX_EFFECT_LOWER_SP_DEF: - case MAX_EFFECT_LOWER_SPEED_2_FOES: - case MAX_EFFECT_LOWER_EVASIVENESS_FOES: - if (!NoAliveMonsForEitherParty()) - { - u8 statId = 0; - u8 stage = 1; - switch (maxEffect) - { - case MAX_EFFECT_LOWER_SPEED_2_FOES: - statId = STAT_SPEED; - stage = 2; - break; - case MAX_EFFECT_LOWER_EVASIVENESS_FOES: - statId = STAT_EVASION; - break; - default: - // Max Effects are ordered by stat ID. - statId = gMovesInfo[gCurrentMove].argument - MAX_EFFECT_LOWER_ATTACK + 1; - break; - } - SET_STATCHANGER(statId, stage, TRUE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; - effect++; - } - break; - case MAX_EFFECT_SUN: - case MAX_EFFECT_RAIN: - case MAX_EFFECT_SANDSTORM: - case MAX_EFFECT_HAIL: - { - u8 weather = 0, msg = 0; - switch (maxEffect) - { - case MAX_EFFECT_SUN: - weather = ENUM_WEATHER_SUN; - msg = B_MSG_STARTED_SUNLIGHT; - break; - case MAX_EFFECT_RAIN: - weather = ENUM_WEATHER_RAIN; - msg = B_MSG_STARTED_RAIN; - break; - case MAX_EFFECT_SANDSTORM: - weather = ENUM_WEATHER_SANDSTORM; - msg = B_MSG_STARTED_SANDSTORM; - break; - case MAX_EFFECT_HAIL: - weather = ENUM_WEATHER_HAIL; - msg = B_MSG_STARTED_HAIL; - break; - } - if (TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = msg; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSetWeather; - effect++; - } - break; - } - case MAX_EFFECT_MISTY_TERRAIN: - case MAX_EFFECT_GRASSY_TERRAIN: - case MAX_EFFECT_ELECTRIC_TERRAIN: - case MAX_EFFECT_PSYCHIC_TERRAIN: - { - u32 statusFlag = 0; - switch (gMovesInfo[gCurrentMove].argument) - { - case MAX_EFFECT_MISTY_TERRAIN: - statusFlag = STATUS_FIELD_MISTY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; - break; - case MAX_EFFECT_GRASSY_TERRAIN: - statusFlag = STATUS_FIELD_GRASSY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; - break; - case MAX_EFFECT_ELECTRIC_TERRAIN: - statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; - break; - case MAX_EFFECT_PSYCHIC_TERRAIN: - statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; - break; - } - if (!(gFieldStatuses & statusFlag) && statusFlag != 0) - { - gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; - gFieldStatuses |= statusFlag; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) - gFieldTimers.terrainTimer = 8; - else - gFieldTimers.terrainTimer = 5; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; - effect++; - } - break; - } - case MAX_EFFECT_VINE_LASH: - case MAX_EFFECT_CANNONADE: - case MAX_EFFECT_WILDFIRE: - case MAX_EFFECT_VOLCALITH: - { - u8 side = GetBattlerSide(gBattlerTarget); - if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) - { - gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; - gSideTimers[side].damageNonTypesTimer = 5; // damage is dealt for 4 turns, ends on 5th - gSideTimers[side].damageNonTypesType = gMovesInfo[gCurrentMove].type; - BattleScriptPush(gBattlescriptCurrInstr + 1); - ChooseDamageNonTypesString(gMovesInfo[gCurrentMove].type); - gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; - effect++; - } - break; - } - case MAX_EFFECT_STEALTH_ROCK: - if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEALTH_ROCK)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectStonesurge; - effect++; - } - break; - case MAX_EFFECT_STEELSURGE: - if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; - effect++; - } - break; - case MAX_EFFECT_DEFOG: - if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY - || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY - || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY - || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefogTryHazards; - effect++; - } - break; - case MAX_EFFECT_AURORA_VEIL: - if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) - { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 8; - else - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 5; - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilBattlerId = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectAuroraVeilSuccess; - effect++; - } - break; - case MAX_EFFECT_GRAVITY: - if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) - { - gFieldStatuses |= STATUS_FIELD_GRAVITY; - gFieldTimers.gravityTimer = 5; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; - effect++; - } - break; - case MAX_EFFECT_SANDBLAST_FOES: - case MAX_EFFECT_FIRE_SPIN_FOES: - { - // Affects both opponents, but doesn't print strings so we can handle it here. - u8 battler; - for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) - { - if (GetBattlerSide(battler) != GetBattlerSide(gBattlerTarget)) - continue; - if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) - { - gBattleMons[battler].status2 |= STATUS2_WRAPPED; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) - #if B_BINDING_TURNS >= GEN_5 - gDisableStructs[battler].wrapTurns = 7; - else - gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; - #else - gDisableStructs[battler].wrapTurns = 5; - else - gDisableStructs[battler].wrapTurns = (Random() % 4) + 2; - #endif - // The Wrap effect does not expire when the user switches, so here's some cheese. - gBattleStruct->wrappedBy[battler] = gBattlerTarget; - if (maxEffect == MAX_EFFECT_SANDBLAST_FOES) - gBattleStruct->wrappedMove[battler] = MOVE_SAND_TOMB; - else - gBattleStruct->wrappedMove[battler] = MOVE_FIRE_SPIN; - } - } - break; - } - case MAX_EFFECT_YAWN_FOE: - { - static const u8 sSnoozeEffects[] = {TRUE, FALSE}; - if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) - && CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget)) - && RandomElement(RNG_G_MAX_SNOOZE, sSnoozeEffects)) // 50% chance of success - { - gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; - effect++; - } - break; - } - case MAX_EFFECT_SPITE: - if (gLastMoves[gBattlerTarget] != MOVE_NONE - && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; - effect++; - } - break; - case MAX_EFFECT_PARALYZE_FOES: - case MAX_EFFECT_POISON_FOES: - case MAX_EFFECT_POISON_PARALYZE_FOES: - case MAX_EFFECT_EFFECT_SPORE_FOES: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectStatus1Foes; - effect++; - break; - case MAX_EFFECT_CONFUSE_FOES_PAY_DAY: - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u16 payday = gPaydayMoney; - gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); - if (payday > gPaydayMoney) - gPaydayMoney = 0xFFFF; - gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message - } - // fall through - case MAX_EFFECT_CONFUSE_FOES: - case MAX_EFFECT_INFATUATE_FOES: - case MAX_EFFECT_TORMENT_FOES: - case MAX_EFFECT_MEAN_LOOK: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectStatus2Foes; - effect++; - break; - case MAX_EFFECT_CRIT_PLUS: - gBattleStruct->bonusCritStages[gBattlerAttacker]++; - gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; - effect++; - break; - case MAX_EFFECT_HEAL_TEAM: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; - effect++; - break; - case MAX_EFFECT_AROMATHERAPY: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectCureStatusAllies; - effect++; - break; - case MAX_EFFECT_RECYCLE_BERRIES: - { - static const u8 sReplenishEffects[] = {TRUE, FALSE}; - if (RandomElement(RNG_G_MAX_REPLENISH, sReplenishEffects)) // 50% chance of success - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; - effect++; - } - break; - } - } - - if (!effect) - gBattlescriptCurrInstr = cmd->nextInstr; -} - -// Sets up sharp steel on the target's side. -void BS_SetSteelsurge(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u8 targetSide = GetBattlerSide(gBattlerTarget); - if (gSideStatuses[targetSide] & SIDE_STATUS_STEELSURGE) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gSideStatuses[targetSide] |= SIDE_STATUS_STEELSURGE; - gSideTimers[targetSide].steelsurgeAmount = 1; - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - -// Applies the status1 effect associated with a given G-Max Move. -// Could be expanded to function for any move. -void BS_TrySetStatus1(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u8 effect = 0; - u32 status1 = GetMaxMoveStatusEffect(gCurrentMove); - switch (status1) - { - case STATUS1_POISON: - if (CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget))) - { - gBattleMons[gBattlerTarget].status1 |= STATUS1_POISON; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - effect++; - } - break; - case STATUS1_PARALYSIS: - if (CanBeParalyzed(gBattlerTarget, GetBattlerAbility(gBattlerTarget))) - { - gBattleMons[gBattlerTarget].status1 |= STATUS1_PARALYSIS; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - effect++; - } - break; - case STATUS1_SLEEP: - if (CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget))) - { - if (B_SLEEP_TURNS >= GEN_5) - gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 3) + 2); - else - gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 4) + 3); - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - effect++; - } - break; - } - if (effect) - { - gEffectBattler = gBattlerTarget; - BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - -// Applies the status2 effect associated with a given G-Max Move. -void BS_TrySetStatus2(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u8 effect = 0; - u32 status2 = GetMaxMoveStatusEffect(gCurrentMove); - switch (status2) - { - case STATUS2_CONFUSION: - if (CanBeConfused(gBattlerTarget)) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattleCommunication[MULTIUSE_STATE] = 1; - effect++; - } - break; - case STATUS2_INFATUATION: - { - u8 atkGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerAttacker].species, gBattleMons[gBattlerAttacker].personality); - u8 defGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerTarget].species, gBattleMons[gBattlerTarget].personality); - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION) - && gBattleMons[gBattlerTarget].ability != ABILITY_OBLIVIOUS - && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL) - && atkGender != defGender - && atkGender != MON_GENDERLESS - && defGender != MON_GENDERLESS) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleCommunication[MULTIUSE_STATE] = 2; - effect++; - } - break; - } - case STATUS2_ESCAPE_PREVENTION: - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - effect++; - } - break; - case STATUS2_TORMENT: - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) - && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; - gDisableStructs[gBattlerTarget].tormentTimer = 3; // 3 turns excluding current turn - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - effect++; - } - break; - } - if (effect) - { - gEffectBattler = gBattlerTarget; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - -// Heals one-sixth of the target's HP, including for Dynamaxed targets. -void BS_HealOneSixth(void) -{ - NATIVE_ARGS(const u8* failInstr); - gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 6; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - - if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) - gBattlescriptCurrInstr = cmd->failInstr; // fail - else - gBattlescriptCurrInstr = cmd->nextInstr; // can heal -} - -// Recycles the target's item if it is specifically holding a berry. -void BS_TryRecycleBerry(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; - if (gBattleMons[gBattlerTarget].item == ITEM_NONE - && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item - && ItemId_GetPocket(*usedHeldItem) == POCKET_BERRIES) - { - gLastUsedItem = *usedHeldItem; - *usedHeldItem = ITEM_NONE; - gBattleMons[gBattlerTarget].item = gLastUsedItem; - - BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); - MarkBattlerForControllerExec(gBattlerTarget); - - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - // Goes to the jump instruction if the target is Dynamaxed. void BS_JumpIfDynamaxed(void) { diff --git a/src/battle_factory.c b/src/battle_factory.c index 8edd9a2ddf..4ae2310c17 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -218,7 +218,7 @@ static void InitFactoryChallenge(void) gFrontierTempParty[i] = 0xFFFF; SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; } static void GetBattleFactoryData(void) @@ -325,7 +325,7 @@ static void GenerateOpponentMons(void) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum); - gTrainerBattleOpponent_A = trainerId; + TRAINER_BATTLE_PARAM.opponentA = trainerId; if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < FRONTIER_STAGES_PER_CHALLENGE - 1) gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = trainerId; @@ -379,7 +379,7 @@ static void GenerateOpponentMons(void) static void SetOpponentGfxVar(void) { - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); } static void SetRentalsToOpponentParty(void) @@ -830,7 +830,7 @@ u32 GetAiScriptsInBattleFactory(void) int battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); int challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / FRONTIER_STAGES_PER_CHALLENGE; - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) return AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY; else if (challengeNum < 2) return 0; diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 262ccecc68..d70390e926 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -6,6 +6,7 @@ #include "constants/battle_anim.h" #include "battle_interface.h" #include "main.h" +#include "menu.h" #include "dma3.h" #include "malloc.h" #include "graphics.h" @@ -198,7 +199,7 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler) gBattleStruct->palaceFlags &= (1 << MAX_BATTLERS_COUNT) - 1; gBattleStruct->palaceFlags |= (selectedMoves << MAX_BATTLERS_COUNT); BattleAI_SetupAIData(selectedMoves, battler); - chosenMoveId = BattleAI_ChooseMoveOrAction(); + chosenMoveId = BattleAI_ChooseMoveOrAction(battler); } // If no moves matched the selected group, pick a new move from groups the Pokémon has @@ -329,7 +330,7 @@ static u8 GetBattlePalaceMoveGroup(u8 battler, u16 move) case MOVE_TARGET_RANDOM: case MOVE_TARGET_BOTH: case MOVE_TARGET_FOES_AND_ALLY: - if (IS_MOVE_STATUS(move)) + if (IsBattleMoveStatus(move)) return PALACE_MOVE_GROUP_SUPPORT; else return PALACE_MOVE_GROUP_ATTACK; @@ -655,9 +656,10 @@ void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battler) else lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, isShiny, personalityValue); - LZDecompressWram(lzPaletteData, gDecompressionBuffer); - LoadPalette(gDecompressionBuffer, paletteOffset, PLTT_SIZE_4BPP); - LoadPalette(gDecompressionBuffer, BG_PLTT_ID(8) + BG_PLTT_ID(battler), PLTT_SIZE_4BPP); + void *buffer = malloc_and_decompress(lzPaletteData, NULL); + LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP); + LoadPalette(buffer, BG_PLTT_ID(8) + BG_PLTT_ID(battler), PLTT_SIZE_4BPP); + Free(buffer); // transform's pink color if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies != SPECIES_NONE) @@ -975,8 +977,9 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo DmaCopy32(3, src, dst, MON_PIC_SIZE); paletteOffset = OBJ_PLTT_ID(battlerAtk); lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(targetSpecies, isShiny, personalityValue); - LZDecompressWram(lzPaletteData, gDecompressionBuffer); - LoadPalette(gDecompressionBuffer, paletteOffset, PLTT_SIZE_4BPP); + void *buffer = malloc_and_decompress(lzPaletteData, NULL); + LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP); + Free(buffer); if (!megaEvo) { @@ -1056,7 +1059,8 @@ void LoadBattleMonGfxAndAnimate(u8 battler, bool8 loadMonSprite, u8 spriteId) void TrySetBehindSubstituteSpriteBit(u8 battler, u16 move) { - if (gMovesInfo[move].effect == EFFECT_SUBSTITUTE || gMovesInfo[move].effect == EFFECT_SHED_TAIL) + u32 effect = GetMoveEffect(move); + if (effect == EFFECT_SUBSTITUTE || effect == EFFECT_SHED_TAIL) gBattleSpritesDataPtr->battlerData[battler].behindSubstitute = 1; } diff --git a/src/battle_gimmick.c b/src/battle_gimmick.c index b39da8b9fd..728ff361a9 100644 --- a/src/battle_gimmick.c +++ b/src/battle_gimmick.c @@ -80,7 +80,7 @@ bool32 ShouldTrainerBattlerUseGimmick(u32 battler, enum Gimmick gimmick) else { bool32 isSecondTrainer = (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT) && (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT; - u16 trainerId = isSecondTrainer ? gTrainerBattleOpponent_B : gTrainerBattleOpponent_A; + u16 trainerId = isSecondTrainer ? TRAINER_BATTLE_PARAM.opponentB : TRAINER_BATTLE_PARAM.opponentA; const struct TrainerMon *mon = &GetTrainerPartyFromId(trainerId)[isSecondTrainer ? gBattlerPartyIndexes[battler] - MULTI_PARTY_SIZE : gBattlerPartyIndexes[battler]]; if (gimmick == GIMMICK_TERA && mon->teraType != TYPE_NONE) diff --git a/src/battle_interface.c b/src/battle_interface.c index 0c2aac1898..a0075e8bac 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2697,6 +2697,17 @@ static void RestoreOverwrittenPixels(u8 *tiles) Free(buffer); } +static inline bool32 IsAnyAbilityPopUpActive(void) +{ + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleStruct->battlerState[battler].activeAbilityPopUps) + return TRUE; + } + + return FALSE; +} + void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) { const s16 (*coords)[2]; @@ -2715,12 +2726,13 @@ void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) return; } - if (!gBattleStruct->activeAbilityPopUps) + if (!IsAnyAbilityPopUpActive()) { LoadSpriteSheet(&sSpriteSheet_AbilityPopUp); LoadSpritePalette(&sSpritePalette_AbilityPopUp); } - gBattleStruct->activeAbilityPopUps |= 1u << battlerId; + + gBattleStruct->battlerState[battlerId].activeAbilityPopUps = TRUE; battlerPosition = GetBattlerPosition(battlerId); if (isDoubleBattle) @@ -2811,7 +2823,7 @@ static void SpriteCb_AbilityPopUp(struct Sprite *sprite) ||(sprite->tRightToLeft && (sprite->x -= 4) <= sprite->tOriginalX - ABILITY_POP_UP_POS_X_SLIDE) ) { - gBattleStruct->activeAbilityPopUps &= ~(1u << sprite->tBattlerId); + gBattleStruct->battlerState[sprite->tBattlerId].activeAbilityPopUps = FALSE; DestroySprite(sprite); } } @@ -2825,7 +2837,7 @@ static void SpriteCb_AbilityPopUp(struct Sprite *sprite) void DestroyAbilityPopUp(u8 battlerId) { - if (gBattleStruct->activeAbilityPopUps & (1u << battlerId)) + if (gBattleStruct->battlerState[battlerId].activeAbilityPopUps) { gSprites[gBattleStruct->abilityPopUpSpriteIds[battlerId][0]].tFrames = 0; gSprites[gBattleStruct->abilityPopUpSpriteIds[battlerId][1]].tFrames = 0; @@ -2837,7 +2849,7 @@ static void Task_FreeAbilityPopUpGfx(u8 taskId) { if (!gSprites[gTasks[taskId].tSpriteId1].inUse && !gSprites[gTasks[taskId].tSpriteId2].inUse - && !gBattleStruct->activeAbilityPopUps) + && !IsAnyAbilityPopUpActive()) { FreeSpriteTilesByTag(ABILITY_POP_UP_TAG); FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); diff --git a/src/battle_main.c b/src/battle_main.c index bc3c9bdd1e..b24b2dcb02 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -20,11 +20,11 @@ #include "data.h" #include "debug.h" #include "decompress.h" +#include "dexnav.h" #include "dma3.h" #include "event_data.h" #include "evolution_scene.h" #include "field_weather.h" -#include "generational_changes.h" #include "graphics.h" #include "gpu_regs.h" #include "international_string_util.h" @@ -53,6 +53,7 @@ #include "task.h" #include "test_runner.h" #include "text.h" +#include "trainer_pools.h" #include "trig.h" #include "tv.h" #include "util.h" @@ -69,6 +70,7 @@ #include "constants/party_menu.h" #include "constants/rgb.h" #include "constants/songs.h" +#include "constants/trainer_slide.h" #include "constants/trainers.h" #include "constants/weather.h" #include "cable_club.h" @@ -108,7 +110,7 @@ static void SetActionsAndBattlersTurnOrder(void); static void UpdateBattlerPartyOrdersOnSwitch(u32 battler); static bool8 AllAtActionConfirmed(void); static void TryChangeTurnOrder(void); -static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2); +static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom); static void CheckChangingTurnOrderEffects(void); static void FreeResetData_ReturnToOvOrDoEvolutions(void); static void ReturnFromBattleToOverworld(void); @@ -120,8 +122,6 @@ static void HandleEndTurn_BattleLost(void); static void HandleEndTurn_RanFromBattle(void); static void HandleEndTurn_MonFled(void); static void HandleEndTurn_FinishBattle(void); -static void SpriteCB_UnusedBattleInit(struct Sprite *sprite); -static void SpriteCB_UnusedBattleInit_Main(struct Sprite *sprite); static u32 Crc32B (const u8 *data, u32 size); static u32 GeneratePartyHash(const struct Trainer *trainer, u32 i); static s32 Factorial(s32); @@ -163,8 +163,6 @@ EWRAM_DATA u8 gChosenMovePos = 0; EWRAM_DATA u16 gCurrentMove = 0; EWRAM_DATA u16 gChosenMove = 0; EWRAM_DATA u16 gCalledMove = 0; -EWRAM_DATA s32 gBattleMoveDamage = 0; -EWRAM_DATA s32 gHpDealt = 0; EWRAM_DATA s32 gBideDmg[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastUsedItem = 0; EWRAM_DATA u16 gLastUsedAbility = 0; @@ -174,7 +172,6 @@ EWRAM_DATA u8 gBattlerFainted = 0; EWRAM_DATA u8 gEffectBattler = 0; EWRAM_DATA u8 gPotentialItemEffectBattler = 0; EWRAM_DATA u8 gAbsentBattlerFlags = 0; -EWRAM_DATA u8 gIsCriticalHit = FALSE; EWRAM_DATA u8 gMultiHitCounter = 0; EWRAM_DATA const u8 *gBattlescriptCurrInstr = NULL; EWRAM_DATA u8 gChosenActionByBattler[MAX_BATTLERS_COUNT] = {0}; @@ -190,7 +187,6 @@ EWRAM_DATA u16 gLockedMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastUsedMove = 0; EWRAM_DATA u8 gLastHitBy[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {0}; -EWRAM_DATA u16 gMoveResultFlags = 0; EWRAM_DATA u32 gHitMarker = 0; EWRAM_DATA u8 gBideTarget[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u32 gSideStatuses[NUM_BATTLE_SIDES] = {0}; @@ -228,6 +224,7 @@ EWRAM_DATA u16 gBattleMovePower = 0; EWRAM_DATA u16 gMoveToLearn = 0; EWRAM_DATA u32 gFieldStatuses = 0; EWRAM_DATA struct FieldTimer gFieldTimers = {0}; +EWRAM_DATA u16 gBattleTurnCounter = 0; EWRAM_DATA u8 gBattlerAbility = 0; EWRAM_DATA struct QueuedStatBoost gQueuedStatBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; @@ -258,17 +255,6 @@ static const struct ScanlineEffectParams sIntroScanlineParams32Bit = ®_BG3HOFS, SCANLINE_EFFECT_DMACNT_32BIT, 1 }; -const struct SpriteTemplate gUnusedBattleInitSprite = -{ - .tileTag = 0, - .paletteTag = 0, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_UnusedBattleInit, -}; - static const u8 sText_ShedinjaJpnName[] = _("ヌケニン"); // Nukenin const struct OamData gOamData_BattleSpriteOpponentSide = @@ -526,9 +512,10 @@ static void CB2_InitBattleInternal(void) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_TRAINER_HILL))) + | BATTLE_TYPE_TRAINER_HILL + | BATTLE_TYPE_RECORDED))) { - gBattleTypeFlags |= (IsTrainerDoubleBattle(gTrainerBattleOpponent_A) ? BATTLE_TYPE_DOUBLE : 0); + gBattleTypeFlags |= (IsTrainerDoubleBattle(TRAINER_BATTLE_PARAM.opponentA) ? BATTLE_TYPE_DOUBLE : 0); } InitBattleBgsVideo(); @@ -555,9 +542,9 @@ static void CB2_InitBattleInternal(void) { if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED))) { - CreateNPCTrainerParty(&gEnemyParty[0], gTrainerBattleOpponent_A, TRUE); + CreateNPCTrainerParty(&gEnemyParty[0], TRAINER_BATTLE_PARAM.opponentA, TRUE); if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && !BATTLE_TWO_VS_ONE_OPPONENT) - CreateNPCTrainerParty(&gEnemyParty[PARTY_SIZE / 2], gTrainerBattleOpponent_B, FALSE); + CreateNPCTrainerParty(&gEnemyParty[PARTY_SIZE / 2], TRAINER_BATTLE_PARAM.opponentB, FALSE); SetWildMonHeldItem(); CalculateEnemyPartyCount(); } @@ -864,7 +851,7 @@ static void CB2_HandleStartBattle(void) BufferPartyVsScreenHealth_AtStart(); SetPlayerBerryDataInBattleStruct(); - if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) { gLinkPlayers[0].id = 0; gLinkPlayers[1].id = 1; @@ -1069,11 +1056,11 @@ static void CB2_HandleStartMultiPartnerBattle(void) gLinkPlayers[1].id = 2; gLinkPlayers[2].id = 1; gLinkPlayers[3].id = 3; - GetFrontierTrainerName(gLinkPlayers[2].name, gTrainerBattleOpponent_A); - GetFrontierTrainerName(gLinkPlayers[3].name, gTrainerBattleOpponent_B); - GetBattleTowerTrainerLanguage(&language, gTrainerBattleOpponent_A); + GetFrontierTrainerName(gLinkPlayers[2].name, TRAINER_BATTLE_PARAM.opponentA); + GetFrontierTrainerName(gLinkPlayers[3].name, TRAINER_BATTLE_PARAM.opponentB); + GetBattleTowerTrainerLanguage(&language, TRAINER_BATTLE_PARAM.opponentA); gLinkPlayers[2].language = language; - GetBattleTowerTrainerLanguage(&language, gTrainerBattleOpponent_B); + GetBattleTowerTrainerLanguage(&language, TRAINER_BATTLE_PARAM.opponentB); gLinkPlayers[3].language = language; if (IsLinkTaskFinished()) @@ -1724,7 +1711,7 @@ static void CB2_HandleStartMultiBattle(void) SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_LINK_OPPONENT; gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE; } } @@ -1791,60 +1778,6 @@ void CB2_QuitRecordedBattle(void) } } -#define sState data[0] -#define sDelay data[4] - -static void SpriteCB_UnusedBattleInit(struct Sprite *sprite) -{ - sprite->sState = 0; - sprite->callback = SpriteCB_UnusedBattleInit_Main; -} - -static void SpriteCB_UnusedBattleInit_Main(struct Sprite *sprite) -{ - u16 *arr = (u16 *)gDecompressionBuffer; - - switch (sprite->sState) - { - case 0: - sprite->sState++; - sprite->data[1] = 0; - sprite->data[2] = 0x281; - sprite->data[3] = 0; - sprite->sDelay = 1; - // fall through - case 1: - sprite->sDelay--; - if (sprite->sDelay == 0) - { - s32 i; - s32 r2; - s32 r0; - - sprite->sDelay = 2; - r2 = sprite->data[1] + sprite->data[3] * 32; - r0 = sprite->data[2] - sprite->data[3] * 32; - for (i = 0; i < 29; i += 2) - { - arr[r2 + i] = 0x3D; - arr[r0 + i] = 0x3D; - } - sprite->data[3]++; - if (sprite->data[3] == 21) - { - sprite->sState++; - sprite->data[1] = 32; - } - } - break; - case 2: - sprite->data[1]--; - if (sprite->data[1] == 20) - SetMainCallback2(CB2_InitBattle); - break; - } -} - static u32 Crc32B (const u8 *data, u32 size) { s32 i, j; @@ -1914,8 +1847,9 @@ void CustomTrainerPartyAssignMoves(struct Pokemon *mon, const struct TrainerMon for (j = 0; j < MAX_MON_MOVES; ++j) { + u32 pp = GetMovePP(partyEntry->moves[j]); SetMonData(mon, MON_DATA_MOVE1 + j, &partyEntry->moves[j]); - SetMonData(mon, MON_DATA_PP1 + j, &gMovesInfo[partyEntry->moves[j]].pp); + SetMonData(mon, MON_DATA_PP1 + j, &pp); } } @@ -1943,8 +1877,12 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer monsCount = trainer->partySize; } + u32 monIndices[monsCount]; + DoTrainerPartyPool(trainer, monIndices, monsCount, battleTypeFlags); + for (i = 0; i < monsCount; i++) { + u32 monIndex = monIndices[i]; s32 ball = -1; u32 personalityHash = GeneratePartyHash(trainer, i); const struct TrainerMon *partyData = trainer->party; @@ -1960,39 +1898,39 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer personalityValue = 0x88; // Use personality more likely to result in a male Pokémon personalityValue += personalityHash << 8; - if (partyData[i].gender == TRAINER_MON_MALE) - personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_MALE, partyData[i].species); - else if (partyData[i].gender == TRAINER_MON_FEMALE) - personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_FEMALE, partyData[i].species); - else if (partyData[i].gender == TRAINER_MON_RANDOM_GENDER) - personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(Random() & 1 ? MON_MALE : MON_FEMALE, partyData[i].species); - ModifyPersonalityForNature(&personalityValue, partyData[i].nature); - if (partyData[i].isShiny) + if (partyData[monIndex].gender == TRAINER_MON_MALE) + personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_MALE, partyData[monIndex].species); + else if (partyData[monIndex].gender == TRAINER_MON_FEMALE) + personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_FEMALE, partyData[monIndex].species); + else if (partyData[monIndex].gender == TRAINER_MON_RANDOM_GENDER) + personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(Random() & 1 ? MON_MALE : MON_FEMALE, partyData[monIndex].species); + ModifyPersonalityForNature(&personalityValue, partyData[monIndex].nature); + if (partyData[monIndex].isShiny) { otIdType = OT_ID_PRESET; fixedOtId = HIHALF(personalityValue) ^ LOHALF(personalityValue); } - CreateMon(&party[i], partyData[i].species, partyData[i].lvl, 0, TRUE, personalityValue, otIdType, fixedOtId); - SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); + CreateMon(&party[i], partyData[monIndex].species, partyData[monIndex].lvl, 0, TRUE, personalityValue, otIdType, fixedOtId); + SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[monIndex].heldItem); - CustomTrainerPartyAssignMoves(&party[i], &partyData[i]); - SetMonData(&party[i], MON_DATA_IVS, &(partyData[i].iv)); - if (partyData[i].ev != NULL) + CustomTrainerPartyAssignMoves(&party[i], &partyData[monIndex]); + SetMonData(&party[i], MON_DATA_IVS, &(partyData[monIndex].iv)); + if (partyData[monIndex].ev != NULL) { - SetMonData(&party[i], MON_DATA_HP_EV, &(partyData[i].ev[0])); - SetMonData(&party[i], MON_DATA_ATK_EV, &(partyData[i].ev[1])); - SetMonData(&party[i], MON_DATA_DEF_EV, &(partyData[i].ev[2])); - SetMonData(&party[i], MON_DATA_SPATK_EV, &(partyData[i].ev[3])); - SetMonData(&party[i], MON_DATA_SPDEF_EV, &(partyData[i].ev[4])); - SetMonData(&party[i], MON_DATA_SPEED_EV, &(partyData[i].ev[5])); + SetMonData(&party[i], MON_DATA_HP_EV, &(partyData[monIndex].ev[0])); + SetMonData(&party[i], MON_DATA_ATK_EV, &(partyData[monIndex].ev[1])); + SetMonData(&party[i], MON_DATA_DEF_EV, &(partyData[monIndex].ev[2])); + SetMonData(&party[i], MON_DATA_SPATK_EV, &(partyData[monIndex].ev[3])); + SetMonData(&party[i], MON_DATA_SPDEF_EV, &(partyData[monIndex].ev[4])); + SetMonData(&party[i], MON_DATA_SPEED_EV, &(partyData[monIndex].ev[5])); } - if (partyData[i].ability != ABILITY_NONE) + if (partyData[monIndex].ability != ABILITY_NONE) { - const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[partyData[i].species]; + const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[partyData[monIndex].species]; u32 maxAbilities = ARRAY_COUNT(speciesInfo->abilities); for (ability = 0; ability < maxAbilities; ++ability) { - if (speciesInfo->abilities[ability] == partyData[i].ability) + if (speciesInfo->abilities[ability] == partyData[monIndex].ability) break; } if (ability >= maxAbilities) @@ -2000,7 +1938,7 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer } else if (B_TRAINER_MON_RANDOM_ABILITY) { - const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[partyData[i].species]; + const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[partyData[monIndex].species]; ability = personalityHash % 3; while (speciesInfo->abilities[ability] == ABILITY_NONE) { @@ -2008,34 +1946,34 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer } } SetMonData(&party[i], MON_DATA_ABILITY_NUM, &ability); - SetMonData(&party[i], MON_DATA_FRIENDSHIP, &(partyData[i].friendship)); - if (partyData[i].ball != ITEM_NONE) + SetMonData(&party[i], MON_DATA_FRIENDSHIP, &(partyData[monIndex].friendship)); + if (partyData[monIndex].ball != ITEM_NONE) { - ball = partyData[i].ball; + ball = partyData[monIndex].ball; SetMonData(&party[i], MON_DATA_POKEBALL, &ball); } - if (partyData[i].nickname != NULL) + if (partyData[monIndex].nickname != NULL) { - SetMonData(&party[i], MON_DATA_NICKNAME, partyData[i].nickname); + SetMonData(&party[i], MON_DATA_NICKNAME, partyData[monIndex].nickname); } - if (partyData[i].isShiny) + if (partyData[monIndex].isShiny) { u32 data = TRUE; SetMonData(&party[i], MON_DATA_IS_SHINY, &data); } - if (partyData[i].dynamaxLevel > 0) + if (partyData[monIndex].dynamaxLevel > 0) { - u32 data = partyData[i].dynamaxLevel; + u32 data = partyData[monIndex].dynamaxLevel; SetMonData(&party[i], MON_DATA_DYNAMAX_LEVEL, &data); } - if (partyData[i].gigantamaxFactor) + if (partyData[monIndex].gigantamaxFactor) { - u32 data = partyData[i].gigantamaxFactor; + u32 data = partyData[monIndex].gigantamaxFactor; SetMonData(&party[i], MON_DATA_GIGANTAMAX_FACTOR, &data); } - if (partyData[i].teraType > 0) + if (partyData[monIndex].teraType > 0) { - u32 data = partyData[i].teraType; + u32 data = partyData[monIndex].teraType; SetMonData(&party[i], MON_DATA_TERA_TYPE, &data); } CalculateMonStats(&party[i]); @@ -2062,6 +2000,8 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir void CreateTrainerPartyForPlayer(void) { + Script_RequestEffects(SCREFF_V1); + ZeroPlayerPartyMons(); gPartnerTrainerId = gSpecialVar_0x8004; CreateNPCTrainerPartyFromTrainer(gPlayerParty, GetTrainerStructFromId(gSpecialVar_0x8004), TRUE, BATTLE_TYPE_TRAINER); @@ -3049,7 +2989,6 @@ static void BattleStartClearSetData(void) gLastHitBy[i] = 0xFF; gLockedMoves[i] = MOVE_NONE; gLastPrintedMoves[i] = MOVE_NONE; - gBattleResources->flags->flags[i] = 0; gPalaceSelectionBattleScripts[i] = 0; gBattleStruct->lastTakenMove[i] = MOVE_NONE; gBattleStruct->choicedMove[i] = MOVE_NONE; @@ -3060,7 +2999,6 @@ static void BattleStartClearSetData(void) gBattleStruct->lastTakenMoveFrom[i][3] = MOVE_NONE; gBattleStruct->AI_monToSwitchIntoId[i] = PARTY_SIZE; gBattleStruct->skyDropTargets[i] = 0xFF; - gBattleStruct->overwrittenAbilities[i] = ABILITY_NONE; } gLastUsedMove = 0; @@ -3097,7 +3035,6 @@ static void BattleStartClearSetData(void) gBattleCommunication[i] = 0; gPauseCounterBattle = 0; - gBattleMoveDamage = 0; gIntroSlideFlags = 0; gLeveledUpInBattle = 0; gAbsentBattlerFlags = 0; @@ -3136,17 +3073,26 @@ static void BattleStartClearSetData(void) gBattleStruct->swapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky gBattleStruct->categoryOverride = FALSE; // used for Z-Moves and Max Moves + ClearPursuitValues(); gSelectedMonPartyId = PARTY_SIZE; // Revival Blessing gCategoryIconSpriteId = 0xFF; + + if(IsSleepClauseEnabled()) + { + // If monCausingSleepClause[side] equals PARTY_SIZE, Sleep Clause is not active for the given side. + gBattleStruct->monCausingSleepClause[B_SIDE_PLAYER] = PARTY_SIZE; + gBattleStruct->monCausingSleepClause[B_SIDE_OPPONENT] = PARTY_SIZE; + } } void SwitchInClearSetData(u32 battler) { s32 i; + u32 effect = GetMoveEffect(gCurrentMove); struct DisableStruct disableStructCopy = gDisableStructs[battler]; ClearIllusionMon(battler); - if (gMovesInfo[gCurrentMove].effect != EFFECT_BATON_PASS) + if (effect != EFFECT_BATON_PASS) { for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; @@ -3161,7 +3107,7 @@ void SwitchInClearSetData(u32 battler) } } } - if (gMovesInfo[gCurrentMove].effect == EFFECT_BATON_PASS) + if (effect == EFFECT_BATON_PASS) { gBattleMons[battler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY_ANY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); gStatuses3[battler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED @@ -3192,9 +3138,9 @@ void SwitchInClearSetData(u32 battler) { if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(battler)) gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(battler); - if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == battler) + if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && gBattleStruct->wrappedBy[i] == battler) gBattleMons[i].status2 &= ~STATUS2_WRAPPED; - if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && *(gBattleStruct->stickySyrupdBy + i) == battler) + if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && gBattleStruct->stickySyrupdBy[i] == battler) gStatuses4[i] &= ~STATUS4_SYRUP_BOMB; } @@ -3203,7 +3149,7 @@ void SwitchInClearSetData(u32 battler) memset(&gDisableStructs[battler], 0, sizeof(struct DisableStruct)); - if (gMovesInfo[gCurrentMove].effect == EFFECT_BATON_PASS) + if (effect == EFFECT_BATON_PASS) { gDisableStructs[battler].substituteHP = disableStructCopy.substituteHP; gDisableStructs[battler].battlerWithSureHit = disableStructCopy.battlerWithSureHit; @@ -3211,13 +3157,13 @@ void SwitchInClearSetData(u32 battler) gDisableStructs[battler].battlerPreventingEscape = disableStructCopy.battlerPreventingEscape; gDisableStructs[battler].embargoTimer = disableStructCopy.embargoTimer; } - else if (gMovesInfo[gCurrentMove].effect == EFFECT_SHED_TAIL) + else if (effect == EFFECT_SHED_TAIL) { gBattleMons[battler].status2 |= STATUS2_SUBSTITUTE; gDisableStructs[battler].substituteHP = disableStructCopy.substituteHP; } - gMoveResultFlags = 0; + gBattleStruct->moveResultFlags[battler] = 0; gDisableStructs[battler].isFirstTurn = 2; gDisableStructs[battler].truantSwitchInHack = disableStructCopy.truantSwitchInHack; gLastMoves[battler] = MOVE_NONE; @@ -3234,11 +3180,12 @@ void SwitchInClearSetData(u32 battler) gBattleStruct->lastTakenMoveFrom[battler][1] = 0; gBattleStruct->lastTakenMoveFrom[battler][2] = 0; gBattleStruct->lastTakenMoveFrom[battler][3] = 0; - gBattleStruct->lastMoveFailed &= ~(1u << battler); + gBattleStruct->battlerState[battler].lastMoveFailed = FALSE; gBattleStruct->palaceFlags &= ~(1u << battler); - gBattleStruct->boosterEnergyActivates &= ~(1u << battler); gBattleStruct->canPickupItem &= ~(1u << battler); + ClearPursuitValuesIfSet(battler); + for (i = 0; i < ARRAY_COUNT(gSideTimers); i++) { // Switched into sticky web user slot, so reset stored battler ID @@ -3255,7 +3202,6 @@ void SwitchInClearSetData(u32 battler) } gBattleStruct->choicedMove[battler] = MOVE_NONE; - gBattleResources->flags->flags[battler] = 0; gCurrentMove = MOVE_NONE; gBattleStruct->arenaTurnCounter = 0xFF; @@ -3265,7 +3211,7 @@ void SwitchInClearSetData(u32 battler) // Reset damage to prevent things like red card activating if the switched-in mon is holding it gSpecialStatuses[battler].physicalDmg = 0; gSpecialStatuses[battler].specialDmg = 0; - gBattleStruct->enduredDamage &= ~(1u << battler); + gSpecialStatuses[battler].enduredDamage = FALSE; // Reset Eject Button / Eject Pack switch detection AI_DATA->ejectButtonSwitch = FALSE; @@ -3274,8 +3220,6 @@ void SwitchInClearSetData(u32 battler) // Reset G-Max Chi Strike boosts. gBattleStruct->bonusCritStages[battler] = 0; - gBattleStruct->overwrittenAbilities[battler] = ABILITY_NONE; - // Clear selected party ID so Revival Blessing doesn't get confused. gSelectedMonPartyId = PARTY_SIZE; @@ -3286,7 +3230,7 @@ void SwitchInClearSetData(u32 battler) u32 side = GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[i].ability = gBattleStruct->overwrittenAbilities[i] = TestRunner_Battle_GetForcedAbility(side, partyIndex); + gBattleMons[i].ability = gDisableStructs[i].overwrittenAbility = TestRunner_Battle_GetForcedAbility(side, partyIndex); } #endif // TESTING @@ -3312,9 +3256,9 @@ const u8* FaintClearSetData(u32 battler) gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(battler)) gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(battler); - if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == battler) + if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && gBattleStruct->wrappedBy[i] == battler) gBattleMons[i].status2 &= ~STATUS2_WRAPPED; - if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && *(gBattleStruct->stickySyrupdBy + i) == battler) + if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && gBattleStruct->stickySyrupdBy[i] == battler) gStatuses4[i] &= ~STATUS4_SYRUP_BOMB; } @@ -3372,9 +3316,9 @@ const u8* FaintClearSetData(u32 battler) gBattleStruct->lastTakenMoveFrom[battler][1] = 0; gBattleStruct->lastTakenMoveFrom[battler][2] = 0; gBattleStruct->lastTakenMoveFrom[battler][3] = 0; - gBattleStruct->palaceFlags &= ~(1u << battler); - gBattleStruct->boosterEnergyActivates &= ~(1u << battler); + + ClearPursuitValuesIfSet(battler); if (gBattleStruct->commanderActive[battler] != SPECIES_NONE) { @@ -3401,8 +3345,6 @@ const u8* FaintClearSetData(u32 battler) gBattleStruct->lastTakenMoveFrom[i][battler] = 0; } - gBattleResources->flags->flags[battler] = 0; - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; gBattleMons[battler].types[2] = TYPE_MYSTERY; @@ -3410,8 +3352,6 @@ const u8* FaintClearSetData(u32 battler) Ai_UpdateFaintData(battler); TryBattleFormChange(battler, FORM_CHANGE_FAINT); - gBattleStruct->overwrittenAbilities[battler] = ABILITY_NONE; - // If the fainted mon was involved in a Sky Drop if (gBattleStruct->skyDropTargets[battler] != 0xFF) { @@ -3518,7 +3458,7 @@ static void DoBattleIntro(void) u32 side = GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = gBattleStruct->overwrittenAbilities[battler] = TestRunner_Battle_GetForcedAbility(side, partyIndex); + gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = TestRunner_Battle_GetForcedAbility(side, partyIndex); } #endif } @@ -3782,14 +3722,14 @@ static void DoBattleIntro(void) // Try to set a status to start the battle with gBattleStruct->startingStatus = 0; - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetTrainerStartingStatusFromId(gTrainerBattleOpponent_B)) + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentB)) { - gBattleStruct->startingStatus = GetTrainerStartingStatusFromId(gTrainerBattleOpponent_B); + gBattleStruct->startingStatus = GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentB); gBattleStruct->startingStatusTimer = 0; // infinite } - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && GetTrainerStartingStatusFromId(gTrainerBattleOpponent_A)) + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentA)) { - gBattleStruct->startingStatus = GetTrainerStartingStatusFromId(gTrainerBattleOpponent_A); + gBattleStruct->startingStatus = GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentA); gBattleStruct->startingStatusTimer = 0; // infinite } else if (B_VAR_STARTING_STATUS != 0) @@ -3834,12 +3774,13 @@ static void TryDoEventsBeforeFirstTurn(void) u32 side = GetBattlerSide(i); u32 partyIndex = gBattlerPartyIndexes[i]; if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[i].ability = gBattleStruct->overwrittenAbilities[i] = TestRunner_Battle_GetForcedAbility(side, partyIndex); + gBattleMons[i].ability = gDisableStructs[i].overwrittenAbility = TestRunner_Battle_GetForcedAbility(side, partyIndex); } } #endif // TESTING gBattleStruct->speedTieBreaks = RandomUniform(RNG_SPEED_TIE, 0, Factorial(MAX_BATTLERS_COUNT) - 1); + gBattleTurnCounter = 0; for (i = 0; i < gBattlersCount; i++) gBattlerByTurnOrder[i] = i; @@ -3934,13 +3875,13 @@ static void TryDoEventsBeforeFirstTurn(void) case FIRST_TURN_EVENTS_END: for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; + gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE; gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; + gBattleStruct->battlerState[i].absentBattlerFlags = (gAbsentBattlerFlags & (1u << i) ? TRUE : FALSE); } TurnValuesCleanUp(FALSE); SpecialStatusesClear(); - *(&gBattleStruct->absentBattlerFlags) = gAbsentBattlerFlags; BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); AssignUsableGimmicks(); gBattleMainFunc = HandleTurnActionSelectionState; @@ -3964,7 +3905,6 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleScripting.moveendState = 0; gBattleStruct->faintedActionsState = 0; gBattleStruct->turnCountersTracker = 0; - gMoveResultFlags = 0; memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); SetShellSideArmCategory(); @@ -4003,7 +3943,6 @@ static void HandleEndTurn_ContinueBattle(void) gBattleStruct->wishPerishSongState = 0; gBattleStruct->wishPerishSongBattlerId = 0; gBattleStruct->turnCountersTracker = 0; - gMoveResultFlags = 0; } } @@ -4020,9 +3959,10 @@ void BattleTurnPassed(void) return; if (DoBattlerEndTurnEffects()) return; + if (HandleWishPerishSongOnTurnEnd()) + return; } - if (HandleWishPerishSongOnTurnEnd()) - return; + if (HandleFaintedMonActions()) return; gBattleStruct->faintedActionsState = 0; @@ -4035,8 +3975,6 @@ void BattleTurnPassed(void) gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; gBattleScripting.moveendState = 0; - gBattleMoveDamage = 0; - gMoveResultFlags = 0; for (i = 0; i < 5; i++) gBattleCommunication[i] = 0; @@ -4058,22 +3996,23 @@ void BattleTurnPassed(void) { gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; + gBattleStruct->battlerState[i].absentBattlerFlags = (gAbsentBattlerFlags & (1u << i) ? TRUE : FALSE); gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE; gStatuses4[i] &= ~STATUS4_ELECTRIFIED; } - *(&gBattleStruct->absentBattlerFlags) = gAbsentBattlerFlags; + for (i = 0; i < NUM_BATTLE_SIDES; i++) + { + if (gSideTimers[i].retaliateTimer > 0) + gSideTimers[i].retaliateTimer--; + } + BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); AssignUsableGimmicks(); SetShellSideArmCategory(); SetAiLogicDataForTurn(AI_DATA); // get assumed abilities, hold effects, etc of all battlers gBattleMainFunc = HandleTurnActionSelectionState; - if (gSideTimers[B_SIDE_PLAYER].retaliateTimer > 0) - gSideTimers[B_SIDE_PLAYER].retaliateTimer--; - if (gSideTimers[B_SIDE_OPPONENT].retaliateTimer > 0) - gSideTimers[B_SIDE_OPPONENT].retaliateTimer--; - if (gBattleTypeFlags & BATTLE_TYPE_PALACE) BattleScriptExecute(BattleScript_PalacePrintFlavorText); else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaTurnCounter == 0) @@ -4082,13 +4021,15 @@ void BattleTurnPassed(void) BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_LAST_HALF_HP))) BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_FIRST_CRITICAL_HIT))) + else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT))) BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_FIRST_SUPER_EFFECTIVE_HIT))) + else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT))) BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_FIRST_STAB_MOVE))) + else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT))) BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_PLAYER_MON_UNAFFECTED))) + else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE))) + BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); + else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_ENEMY_MON_UNAFFECTED))) BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); } @@ -4174,7 +4115,7 @@ void SwitchPartyOrder(u32 battler) gBattlePartyCurrentOrder[i] = *(battler * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)); partyId1 = GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battler]); - partyId2 = GetPartyIdFromBattlePartyId(*(gBattleStruct->monToSwitchIntoId + battler)); + partyId2 = GetPartyIdFromBattlePartyId(gBattleStruct->monToSwitchIntoId[battler]); SwitchPartyMonSlots(partyId1, partyId2); if (IsDoubleBattle()) @@ -4207,6 +4148,32 @@ enum STATE_SELECTION_SCRIPT_MAY_RUN }; +void SetupAISwitchingData(u32 battler, enum SwitchType switchType) +{ + s32 opposingBattler = GetOppositeBattler(battler); + + // AI's predicting data + if ((AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_PREDICT_SWITCH)) + { + AI_DATA->aiSwitchPredictionInProgress = TRUE; + AI_DATA->battlerDoingPrediction = battler; + AI_DATA->mostSuitableMonId[opposingBattler] = GetMostSuitableMonToSwitchInto(opposingBattler, switchType); + if (ShouldSwitch(opposingBattler)) + AI_DATA->shouldSwitch |= (1u << opposingBattler); + AI_DATA->aiSwitchPredictionInProgress = FALSE; + gBattleStruct->prevTurnSpecies[opposingBattler] = gBattleMons[opposingBattler].species; + + // Determine whether AI will use predictions this turn + AI_DATA->predictingSwitch = RandomPercentage(RNG_AI_PREDICT_SWITCH, PREDICT_SWITCH_CHANCE); + } + + // AI's data + AI_DATA->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, switchType); + if (ShouldSwitch(battler)) + AI_DATA->shouldSwitch |= (1u << battler); + gBattleStruct->prevTurnSpecies[battler] = gBattleMons[battler].species; +} + static void HandleTurnActionSelectionState(void) { s32 i, battler; @@ -4220,7 +4187,7 @@ static void HandleTurnActionSelectionState(void) case STATE_TURN_START_RECORD: // Recorded battle related action on start of every turn. RecordedBattle_CopyBattlerMoves(battler); gBattleCommunication[battler] = STATE_BEFORE_ACTION_CHOSEN; - u32 isAiRisky = AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_RISKY; // Risky AI switches aggressively even mid battle + enum SwitchType switchType = (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE; // Risky AI switches aggressively even mid battle // Do AI score computations here so we can use them in AI_TrySwitchOrUseItem if ((gBattleTypeFlags & BATTLE_TYPE_HAS_AI || IsWildMonSmart()) @@ -4229,27 +4196,22 @@ static void HandleTurnActionSelectionState(void) AI_DATA->aiCalcInProgress = TRUE; // Setup battler data - sBattler_AI = battler; - BattleAI_SetupAIData(0xF, sBattler_AI); - - // Setup switching data - AI_DATA->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, isAiRisky); - if (ShouldSwitch(battler)) - AI_DATA->shouldSwitch |= (1u << battler); + BattleAI_SetupAIData(0xF, battler); + SetupAISwitchingData(battler, switchType); // Do scoring - gBattleStruct->aiMoveOrAction[battler] = BattleAI_ChooseMoveOrAction(); + gBattleStruct->aiMoveOrAction[battler] = BattleAI_ChooseMoveOrAction(battler); AI_DATA->aiCalcInProgress = FALSE; } // fallthrough case STATE_BEFORE_ACTION_CHOSEN: // Choose an action. - *(gBattleStruct->monToSwitchIntoId + battler) = PARTY_SIZE; + gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; if (gBattleTypeFlags & BATTLE_TYPE_MULTI || (position & BIT_FLANK) == B_FLANK_LEFT - || gBattleStruct->absentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(position))) + || gBattleStruct->battlerState[GetBattlerAtPosition(BATTLE_PARTNER(position))].absentBattlerFlags || gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] == STATE_WAIT_ACTION_CONFIRMED) { - if ((gBattleStruct->absentBattlerFlags & (1u << battler)) || (gBattleStruct->commandingDondozo & (1u << battler))) + if (gBattleStruct->battlerState[battler].absentBattlerFlags || gBattleStruct->battlerState[battler].commandingDondozo) { gChosenActionByBattler[battler] = B_ACTION_NOTHING_FAINTED; if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) @@ -4296,15 +4258,15 @@ static void HandleTurnActionSelectionState(void) if (AreAllMovesUnusable(battler)) { gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - *(gBattleStruct->selectionScriptFinished + battler) = FALSE; - *(gBattleStruct->stateIdAfterSelScript + battler) = STATE_WAIT_ACTION_CONFIRMED_STANDBY; - *(gBattleStruct->moveTarget + battler) = gBattleResources->bufferB[battler][3]; + gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->stateIdAfterSelScript[battler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; + gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; return; } else if (gDisableStructs[battler].encoredMove != 0) { gChosenMoveByBattler[battler] = gDisableStructs[battler].encoredMove; - *(gBattleStruct->chosenMovePositions + battler) = gDisableStructs[battler].encoredMovePos; + gBattleStruct->chosenMovePositions[battler] = gDisableStructs[battler].encoredMovePos; gBattleCommunication[battler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; return; } @@ -4338,8 +4300,8 @@ static void HandleTurnActionSelectionState(void) RecordedBattle_ClearBattlerAction(battler, 1); gSelectionBattleScripts[battler] = BattleScript_ActionSelectionItemsCantBeUsed; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - *(gBattleStruct->selectionScriptFinished + battler) = FALSE; - *(gBattleStruct->stateIdAfterSelScript + battler) = STATE_BEFORE_ACTION_CHOSEN; + gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } @@ -4354,8 +4316,8 @@ static void HandleTurnActionSelectionState(void) RecordedBattle_ClearBattlerAction(battler, 1); gSelectionBattleScripts[battler] = BattleScript_ActionSelectionItemsCantBeUsed; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - *(gBattleStruct->selectionScriptFinished + battler) = FALSE; - *(gBattleStruct->stateIdAfterSelScript + battler) = STATE_BEFORE_ACTION_CHOSEN; + gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } else @@ -4365,7 +4327,7 @@ static void HandleTurnActionSelectionState(void) } break; case B_ACTION_SWITCH: - *(gBattleStruct->battlerPartyIndexes + battler) = gBattlerPartyIndexes[battler]; + gBattleStruct->battlerPartyIndexes[battler] = gBattlerPartyIndexes[battler]; if (gBattleTypeFlags & BATTLE_TYPE_ARENA || !CanBattlerEscape(battler)) { @@ -4379,9 +4341,9 @@ static void HandleTurnActionSelectionState(void) else { if (battler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(battler, BUFFER_A, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, BUFFER_A, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[0], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); else if (battler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(battler, BUFFER_A, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, BUFFER_A, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[1], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); else BtlController_EmitChoosePokemon(battler, BUFFER_A, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); } @@ -4392,8 +4354,8 @@ static void HandleTurnActionSelectionState(void) { gSelectionBattleScripts[battler] = BattleScript_PrintFullBox; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - *(gBattleStruct->selectionScriptFinished + battler) = FALSE; - *(gBattleStruct->stateIdAfterSelScript + battler) = STATE_BEFORE_ACTION_CHOSEN; + gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } break; @@ -4403,38 +4365,38 @@ static void HandleTurnActionSelectionState(void) break; case B_ACTION_CANCEL_PARTNER: gBattleCommunication[battler] = STATE_WAIT_SET_BEFORE_ACTION; - gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] = STATE_BEFORE_ACTION_CHOSEN; + gBattleCommunication[GetPartnerBattler(battler)] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(battler, 1); - if (gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].status2 & STATUS2_MULTIPLETURNS - || gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].status2 & STATUS2_RECHARGE) + if (gBattleMons[GetPartnerBattler(battler)].status2 & STATUS2_MULTIPLETURNS + || gBattleMons[GetPartnerBattler(battler)].status2 & STATUS2_RECHARGE) { BtlController_EmitEndBounceEffect(battler, BUFFER_A); MarkBattlerForControllerExec(battler); return; } - else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_SWITCH) + else if (gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_SWITCH) { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 2); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 2); } - else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_RUN) + else if (gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_RUN) { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 1); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 1); } - else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_USE_MOVE - && (gProtectStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].noValidMoves - || gDisableStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].encoredMove)) + else if (gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_USE_MOVE + && (gProtectStructs[GetPartnerBattler(battler)].noValidMoves + || gDisableStructs[GetPartnerBattler(battler)].encoredMove)) { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 1); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 1); } else if (gBattleTypeFlags & BATTLE_TYPE_PALACE - && gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_USE_MOVE) + && gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_USE_MOVE) { gRngValue = gBattlePalaceMoveSelectionRngValue; - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 1); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 1); } else { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 3); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 3); } gBattleStruct->gimmick.toActivate &= ~((1u << BATTLE_PARTNER(GetBattlerPosition(battler)))); @@ -4453,8 +4415,8 @@ static void HandleTurnActionSelectionState(void) { gSelectionBattleScripts[battler] = BattleScript_AskIfWantsToForfeitMatch; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT_MAY_RUN; - *(gBattleStruct->selectionScriptFinished + battler) = FALSE; - *(gBattleStruct->stateIdAfterSelScript + battler) = STATE_BEFORE_ACTION_CHOSEN; + gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER @@ -4470,8 +4432,8 @@ static void HandleTurnActionSelectionState(void) { gSelectionBattleScripts[battler] = BattleScript_PrintCantEscapeFromBattle; gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - *(gBattleStruct->selectionScriptFinished + battler) = FALSE; - *(gBattleStruct->stateIdAfterSelScript + battler) = STATE_BEFORE_ACTION_CHOSEN; + gBattleStruct->selectionScriptFinished[battler] = FALSE; + gBattleStruct->stateIdAfterSelScript[battler] = STATE_BEFORE_ACTION_CHOSEN; return; } else @@ -4512,9 +4474,9 @@ static void HandleTurnActionSelectionState(void) { RecordedBattle_ClearBattlerAction(battler, 1); gBattleCommunication[battler] = STATE_SELECTION_SCRIPT; - *(gBattleStruct->selectionScriptFinished + battler) = FALSE; + gBattleStruct->selectionScriptFinished[battler] = FALSE; gBattleResources->bufferB[battler][1] = B_ACTION_USE_MOVE; - *(gBattleStruct->stateIdAfterSelScript + battler) = STATE_WAIT_ACTION_CHOSEN; + gBattleStruct->stateIdAfterSelScript[battler] = STATE_WAIT_ACTION_CHOSEN; return; } else @@ -4624,7 +4586,7 @@ static void HandleTurnActionSelectionState(void) if (((gBattleTypeFlags & BATTLE_TYPE_MULTI) || !IsDoubleBattle()) || (position & BIT_FLANK) != B_FLANK_LEFT - || (*(&gBattleStruct->absentBattlerFlags) & (1u << GetBattlerAtPosition(BATTLE_PARTNER(position))))) + || gBattleStruct->battlerState[GetBattlerAtPosition(BATTLE_PARTNER(position))].absentBattlerFlags) { BtlController_EmitLinkStandbyMsg(battler, BUFFER_A, LINK_STANDBY_MSG_STOP_BOUNCE, i); } @@ -4643,9 +4605,9 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_SELECTION_SCRIPT: - if (*(gBattleStruct->selectionScriptFinished + battler)) + if (gBattleStruct->selectionScriptFinished[battler]) { - gBattleCommunication[battler] = *(gBattleStruct->stateIdAfterSelScript + battler); + gBattleCommunication[battler] = gBattleStruct->stateIdAfterSelScript[battler]; } else { @@ -4665,7 +4627,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_SELECTION_SCRIPT_MAY_RUN: - if (*(gBattleStruct->selectionScriptFinished + battler)) + if (gBattleStruct->selectionScriptFinished[battler]) { if (gBattleResources->bufferB[battler][1] == B_ACTION_NOTHING_FAINTED) { @@ -4676,7 +4638,7 @@ static void HandleTurnActionSelectionState(void) else { RecordedBattle_ClearBattlerAction(battler, 1); - gBattleCommunication[battler] = *(gBattleStruct->stateIdAfterSelScript + battler); + gBattleCommunication[battler] = gBattleStruct->stateIdAfterSelScript[battler]; } } else @@ -4718,7 +4680,7 @@ static void HandleTurnActionSelectionState(void) for (i = 0; i < gBattlersCount; i++) { if (gChosenActionByBattler[i] == B_ACTION_SWITCH) - SwitchPartyOrderInGameMulti(i, *(gBattleStruct->monToSwitchIntoId + i)); + SwitchPartyOrderInGameMulti(i, gBattleStruct->monToSwitchIntoId[battler]); } } } @@ -4771,7 +4733,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) u32 speed = gBattleMons[battler].speed; // weather abilities - if (WEATHER_HAS_EFFECT) + if (HasWeatherEffect()) { if (ability == ABILITY_SWIFT_SWIM && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA && gBattleWeather & B_WEATHER_RAIN) speed *= 2; @@ -4790,9 +4752,9 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) speed *= 2; else if (ability == ABILITY_SLOW_START && gDisableStructs[battler].slowStartTimer != 0) speed /= 2; - else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && ((gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT) || gBattleStruct->boosterEnergyActivates & (1u << battler))) + else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && ((gBattleWeather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battler].boosterEnergyActivates)) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; - else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battler))) + else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battler].boosterEnergyActivates)) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; // stat stages @@ -4820,7 +4782,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) // various effects if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_TAILWIND) speed *= 2; - if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_UNBURDEN) + if (gDisableStructs[battler].unburdenActive) speed *= 2; // paralysis drop @@ -4848,37 +4810,37 @@ s8 GetChosenMovePriority(u32 battler) if (gProtectStructs[battler].noValidMoves) move = MOVE_STRUGGLE; else - move = gBattleMons[battler].moves[*(gBattleStruct->chosenMovePositions + battler)]; + move = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; - return GetMovePriority(battler, move); + return GetBattleMovePriority(battler, move); } -s8 GetMovePriority(u32 battler, u16 move) +s8 GetBattleMovePriority(u32 battler, u16 move) { s8 priority; u16 ability = GetBattlerAbility(battler); - if (GetActiveGimmick(battler) == GIMMICK_Z_MOVE && !IS_MOVE_STATUS(move)) + if (GetActiveGimmick(battler) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) move = GetUsableZMove(battler, move); - priority = gMovesInfo[move].priority; + priority = GetMovePriority(move); // Max Guard check - if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && gMovesInfo[move].category == DAMAGE_CATEGORY_STATUS) - return gMovesInfo[MOVE_MAX_GUARD].priority; + if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS) + return GetMovePriority(MOVE_MAX_GUARD); if (ability == ABILITY_GALE_WINGS - && (GetGenConfig(GEN_CONFIG_GALE_WINGS) < GEN_7 || BATTLER_MAX_HP(battler)) - && gMovesInfo[move].type == TYPE_FLYING) + && (GetGenConfig(GEN_CONFIG_GALE_WINGS) < GEN_7 || IsBattlerAtMaxHp(battler)) + && GetMoveType(move) == TYPE_FLYING) { priority++; } - else if (ability == ABILITY_PRANKSTER && IS_MOVE_STATUS(move)) + else if (ability == ABILITY_PRANKSTER && IsBattleMoveStatus(move)) { gProtectStructs[battler].pranksterElevated = 1; priority++; } - else if (gMovesInfo[move].effect == EFFECT_GRASSY_GLIDE && gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && IsBattlerGrounded(battler) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) + else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) { priority++; } @@ -4904,8 +4866,8 @@ s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMov // Lagging Tail - always last bool32 battler1HasQuickEffect = gProtectStructs[battler1].quickDraw || gProtectStructs[battler1].usedCustapBerry; bool32 battler2HasQuickEffect = gProtectStructs[battler2].quickDraw || gProtectStructs[battler2].usedCustapBerry; - bool32 battler1HasStallingAbility = ability1 == ABILITY_STALL || (ability1 == ABILITY_MYCELIUM_MIGHT && IS_MOVE_STATUS(gChosenMoveByBattler[battler1])); - bool32 battler2HasStallingAbility = ability2 == ABILITY_STALL || (ability2 == ABILITY_MYCELIUM_MIGHT && IS_MOVE_STATUS(gChosenMoveByBattler[battler2])); + bool32 battler1HasStallingAbility = ability1 == ABILITY_STALL || (ability1 == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gChosenMoveByBattler[battler1])); + bool32 battler2HasStallingAbility = ability2 == ABILITY_STALL || (ability2 == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gChosenMoveByBattler[battler2])); if (battler1HasQuickEffect && !battler2HasQuickEffect) strikesFirst = 1; @@ -5087,6 +5049,9 @@ static void SetActionsAndBattlersTurnOrder(void) } else { + u32 quickClawRandom[MAX_BATTLERS_COUNT] = {0}; + u32 quickDrawRandom[MAX_BATTLERS_COUNT] = {0}; + for (battler = 0; battler < gBattlersCount; battler++) { if (gChosenActionByBattler[battler] == B_ACTION_USE_ITEM @@ -5106,8 +5071,8 @@ static void SetActionsAndBattlersTurnOrder(void) { gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[battler]; gBattlerByTurnOrder[turnOrderId] = battler; - gBattleStruct->quickClawRandom[battler] = RandomPercentage(RNG_QUICK_CLAW, GetBattlerHoldEffectParam(battler)); - gBattleStruct->quickDrawRandom[battler] = RandomPercentage(RNG_QUICK_DRAW, 30); + quickClawRandom[battler] = RandomPercentage(RNG_QUICK_CLAW, GetBattlerHoldEffectParam(battler)); + quickDrawRandom[battler] = RandomPercentage(RNG_QUICK_DRAW, 30); turnOrderId++; } } @@ -5117,7 +5082,7 @@ static void SetActionsAndBattlersTurnOrder(void) { u8 battler1 = gBattlerByTurnOrder[i]; u8 battler2 = gBattlerByTurnOrder[j]; - TryChangingTurnOrderEffects(battler1, battler2); + TryChangingTurnOrderEffects(battler1, battler2, quickClawRandom, quickDrawRandom); if (gActionsByTurnOrder[i] != B_ACTION_USE_ITEM && gActionsByTurnOrder[j] != B_ACTION_USE_ITEM && gActionsByTurnOrder[i] != B_ACTION_SWITCH @@ -5173,9 +5138,10 @@ static void TurnValuesCleanUp(bool8 var0) gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; if (!(gStatuses3[i] & STATUS3_COMMANDER)) - gBattleStruct->commandingDondozo &= ~(1u << i); + gBattleStruct->battlerState[i].commandingDondozo = FALSE; gSpecialStatuses[i].parentalBondState = PARENTAL_BOND_OFF; + gBattleStruct->battlerState[i].usedEjectItem = FALSE; } gSideStatuses[B_SIDE_PLAYER] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD | SIDE_STATUS_MAT_BLOCK); @@ -5183,8 +5149,9 @@ static void TurnValuesCleanUp(bool8 var0) gSideTimers[B_SIDE_PLAYER].followmeTimer = 0; gSideTimers[B_SIDE_OPPONENT].followmeTimer = 0; - gBattleStruct->usedEjectItem = 0; gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceller + ClearPursuitValues(); + ClearDamageCalcResults(); } void SpecialStatusesClear(void) @@ -5199,11 +5166,26 @@ static void PopulateArrayWithBattlers(u8 *battlers) battlers[i] = i; } +static bool32 TryActivateGimmick(u32 battler) +{ + if ((gBattleStruct->gimmick.toActivate & (1u << battler)) && !(gProtectStructs[battler].noValidMoves)) + { + gBattlerAttacker = gBattleScripting.battler = battler; + gBattleStruct->gimmick.toActivate &= ~(1u << battler); + if (gGimmicksInfo[gBattleStruct->gimmick.usableGimmick[battler]].ActivateGimmick != NULL) + { + gGimmicksInfo[gBattleStruct->gimmick.usableGimmick[battler]].ActivateGimmick(battler); + return TRUE; + } + } + return FALSE; +} + static bool32 TryDoGimmicksBeforeMoves(void) { if (!(gHitMarker & HITMARKER_RUN) && gBattleStruct->gimmick.toActivate) { - u32 i, battler; + u32 i; u8 order[MAX_BATTLERS_COUNT]; PopulateArrayWithBattlers(order); @@ -5211,16 +5193,8 @@ static bool32 TryDoGimmicksBeforeMoves(void) for (i = 0; i < gBattlersCount; i++) { // Search through each battler and activate their gimmick if they have one prepared. - if ((gBattleStruct->gimmick.toActivate & (1u << order[i])) && !(gProtectStructs[order[i]].noValidMoves)) - { - battler = gBattlerAttacker = gBattleScripting.battler = order[i]; - gBattleStruct->gimmick.toActivate &= ~(1u << battler); - if (gGimmicksInfo[gBattleStruct->gimmick.usableGimmick[battler]].ActivateGimmick != NULL) - { - gGimmicksInfo[gBattleStruct->gimmick.usableGimmick[battler]].ActivateGimmick(battler); - return TRUE; - } - } + if (TryActivateGimmick(order[i])) + return TRUE; } } @@ -5240,14 +5214,14 @@ static bool32 TryDoMoveEffectsBeforeMoves(void) SortBattlersBySpeed(battlers, FALSE); for (i = 0; i < gBattlersCount; i++) { - if (!(gBattleStruct->focusPunchBattlers & (1u << battlers[i])) + if (!gBattleStruct->battlerState[battlers[i]].focusPunchBattlers && !(gBattleMons[battlers[i]].status1 & STATUS1_SLEEP) && !(gDisableStructs[battlers[i]].truantCounter) && !(gProtectStructs[battlers[i]].noValidMoves)) { - gBattleStruct->focusPunchBattlers |= 1u << battlers[i]; + gBattleStruct->battlerState[battlers[i]].focusPunchBattlers = TRUE; gBattlerAttacker = battlers[i]; - switch (gMovesInfo[gChosenMoveByBattler[gBattlerAttacker]].effect) + switch (GetMoveEffect(gChosenMoveByBattler[gBattlerAttacker])) { case EFFECT_FOCUS_PUNCH: BattleScriptExecute(BattleScript_FocusPunchSetUp); @@ -5270,7 +5244,7 @@ static bool32 TryDoMoveEffectsBeforeMoves(void) static void TryChangeTurnOrder(void) { u32 i, j; - for (i = 0; i < gBattlersCount - 1; i++) + for (i = gCurrentTurnActionNumber; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { @@ -5287,7 +5261,7 @@ static void TryChangeTurnOrder(void) } } -static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2) +static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom) { u32 ability1 = GetBattlerAbility(battler1); u32 holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); @@ -5296,21 +5270,21 @@ static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2) // Battler 1 // Quick Draw - if (ability1 == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler1]) && gBattleStruct->quickDrawRandom[battler1]) + if (ability1 == ABILITY_QUICK_DRAW && !IsBattleMoveStatus(gChosenMoveByBattler[battler1]) && quickDrawRandom[battler1]) gProtectStructs[battler1].quickDraw = TRUE; // Quick Claw and Custap Berry if (!gProtectStructs[battler1].quickDraw - && ((holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && gBattleStruct->quickClawRandom[battler1]) + && ((holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && quickClawRandom[battler1]) || (holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item)))) gProtectStructs[battler1].usedCustapBerry = TRUE; // Battler 2 // Quick Draw - if (ability2 == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler2]) && gBattleStruct->quickDrawRandom[battler2]) + if (ability2 == ABILITY_QUICK_DRAW && !IsBattleMoveStatus(gChosenMoveByBattler[battler2]) && quickDrawRandom[battler2]) gProtectStructs[battler2].quickDraw = TRUE; // Quick Claw and Custap Berry if (!gProtectStructs[battler2].quickDraw - && ((holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && gBattleStruct->quickClawRandom[battler2]) + && ((holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && quickClawRandom[battler2]) || (holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item)))) gProtectStructs[battler2].usedCustapBerry = TRUE; } @@ -5366,9 +5340,9 @@ static void CheckChangingTurnOrderEffects(void) gCurrentActionFuncId = gActionsByTurnOrder[0]; gBattleStruct->dynamicMoveType = 0; gBattleStruct->effectsBeforeUsingMoveDone = FALSE; - gBattleStruct->focusPunchBattlers = 0; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { + gBattleStruct->battlerState[i].focusPunchBattlers = FALSE; gBattleStruct->ateBoost[i] = FALSE; gSpecialStatuses[i].gemBoost = FALSE; } @@ -5388,11 +5362,19 @@ static void RunTurnActionsFunctions(void) // Mega Evolve / Focus Punch-like moves after switching, items, running, but before using a move. if (gCurrentActionFuncId == B_ACTION_USE_MOVE && !gBattleStruct->effectsBeforeUsingMoveDone) { - if (TryDoGimmicksBeforeMoves()) - return; - else if (TryDoMoveEffectsBeforeMoves()) - return; - gBattleStruct->effectsBeforeUsingMoveDone = TRUE; + if (!IsPursuitTargetSet()) + { + if (TryDoGimmicksBeforeMoves()) + return; + else if (TryDoMoveEffectsBeforeMoves()) + return; + gBattleStruct->effectsBeforeUsingMoveDone = TRUE; + } + else + { + if (TryActivateGimmick(gBattlerByTurnOrder[gCurrentTurnActionNumber])) + return; + } } *(&gBattleStruct->savedTurnActionNumber) = gCurrentTurnActionNumber; @@ -5431,7 +5413,7 @@ static void HandleEndTurn_BattleWon(void) BattleStopLowHpSound(); gBattlescriptCurrInstr = BattleScript_FrontierTrainerBattleWon; - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) PlayBGM(MUS_VICTORY_GYM_LEADER); else PlayBGM(MUS_VICTORY_TRAINER); @@ -5441,7 +5423,7 @@ static void HandleEndTurn_BattleWon(void) BattleStopLowHpSound(); gBattlescriptCurrInstr = BattleScript_LocalTrainerBattleWon; - switch (GetTrainerClassFromId(gTrainerBattleOpponent_A)) + switch (GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA)) { case TRAINER_CLASS_ELITE_FOUR: case TRAINER_CLASS_CHAMPION: @@ -5654,6 +5636,12 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void) { gIsFishingEncounter = FALSE; gIsSurfingEncounter = FALSE; + if (gDexNavBattle && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT)) + IncrementDexNavChain(); + else + gSaveBlock3Ptr->dexNavChain = 0; + + gDexNavBattle = FALSE; ResetSpriteData(); if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK @@ -5791,7 +5779,7 @@ bool32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility) { u32 ateType; - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_TERA_BLAST: if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA) @@ -5843,8 +5831,8 @@ bool32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility) // NULL can be passed to ateBoost to avoid applying ate-ability boosts when opening the summary screen in-battle. u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) { - u32 moveType = gMovesInfo[move].type; - u32 moveEffect = gMovesInfo[move].effect; + u32 moveType = GetMoveType(move); + u32 moveEffect = GetMoveEffect(move); u32 species, heldItem, holdEffect, ability, type1, type2, type3; bool32 monInBattle = gMain.inBattle && gPartyMenu.menuType != PARTY_MENU_TYPE_IN_BATTLE; @@ -5877,7 +5865,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) case EFFECT_WEATHER_BALL: if (monInBattle) { - if (WEATHER_HAS_EFFECT) + if (HasWeatherEffect()) { if (gBattleWeather & B_WEATHER_RAIN && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) return TYPE_WATER; @@ -5901,6 +5889,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) break; case WEATHER_RAIN: case WEATHER_RAIN_THUNDERSTORM: + case WEATHER_DOWNPOUR: if (holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) return TYPE_WATER; break; @@ -5934,16 +5923,19 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) | ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5); } - // Subtract 6 instead of 1 below because 5 types are excluded (TYPE_NONE, TYPE_NORMAL, TYPE_MYSTERY, TYPE_FAIRY and TYPE_STELLAR) - // The final + 2 skips past TYPE_NONE and Normal. - moveType = ((NUMBER_OF_MON_TYPES - 6) * typeBits) / 63 + 2; - if (moveType >= TYPE_MYSTERY) - moveType++; - return ((moveType | F_DYNAMIC_TYPE_IGNORE_PHYSICALITY) & 0x3F); + u32 hpTypes[NUMBER_OF_MON_TYPES] = {0}; + u32 i, hpTypeCount = 0; + for (i = 0; i < NUMBER_OF_MON_TYPES; i++) + { + if (gTypesInfo[i].isHiddenPowerType) + hpTypes[hpTypeCount++] = i; + } + moveType = ((hpTypeCount - 1) * typeBits) / 63; + return ((hpTypes[moveType] | F_DYNAMIC_TYPE_IGNORE_PHYSICALITY) & 0x3F); } break; case EFFECT_CHANGE_TYPE_ON_ITEM: - if (holdEffect == gMovesInfo[move].argument) + if (holdEffect == GetMoveEffectArg_HoldEffect(move)) return ItemId_GetSecondaryId(heldItem); break; case EFFECT_REVELATION_DANCE: @@ -5952,11 +5944,11 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) u32 teraType; if (GetActiveGimmick(battler) == GIMMICK_TERA && ((teraType = GetMonData(mon, MON_DATA_TERA_TYPE)) != TYPE_STELLAR)) return teraType; - else if (type1 != TYPE_MYSTERY && !(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST && type1 == TYPE_FLYING)) + else if (type1 != TYPE_MYSTERY && !(gDisableStructs[battler].roostActive && type1 == TYPE_FLYING)) return type1; - else if (type2 != TYPE_MYSTERY && !(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST && type2 == TYPE_FLYING)) + else if (type2 != TYPE_MYSTERY && !(gDisableStructs[battler].roostActive && type2 == TYPE_FLYING)) return type2; - else if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST) + else if (gDisableStructs[battler].roostActive) return (B_ROOST_PURE_FLYING >= GEN_5 ? TYPE_NORMAL : TYPE_MYSTERY); else if (type3 != TYPE_MYSTERY) return type3; @@ -6034,7 +6026,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) break; } - if (gMovesInfo[move].soundMove && ability == ABILITY_LIQUID_VOICE) + if (IsSoundMove(move) && ability == ABILITY_LIQUID_VOICE) { return TYPE_WATER; } @@ -6080,13 +6072,13 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) if (moveType != TYPE_NONE) gBattleStruct->dynamicMoveType = moveType | F_DYNAMIC_TYPE_SET; - moveType = GetMoveType(move); + moveType = GetBattleMoveType(move); if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && moveType == TYPE_NORMAL) || gStatuses4[battler] & STATUS4_ELECTRIFIED) gBattleStruct->dynamicMoveType = TYPE_ELECTRIC | F_DYNAMIC_TYPE_SET; // Check if a gem should activate. - if (holdEffect == HOLD_EFFECT_GEMS && GetMoveType(move) == ItemId_GetSecondaryId(heldItem)) + if (holdEffect == HOLD_EFFECT_GEMS && GetBattleMoveType(move) == ItemId_GetSecondaryId(heldItem)) { gSpecialStatuses[battler].gemParam = GetBattlerHoldEffectParam(battler); gSpecialStatuses[battler].gemBoost = TRUE; @@ -6100,6 +6092,8 @@ void ScriptSetTotemBoost(struct ScriptContext *ctx) u32 stat; u32 i; + Script_RequestEffects(SCREFF_V1); + for (i = 0; i < (NUM_BATTLE_STATS - 1); i++) { stat = VarGet(ScriptReadHalfword(ctx)); diff --git a/src/battle_message.c b/src/battle_message.c index 9fe4670095..c463474d40 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -21,6 +21,7 @@ #include "test_runner.h" #include "text.h" #include "trainer_hill.h" +#include "trainer_slide.h" #include "window.h" #include "line_break.h" #include "constants/abilities.h" @@ -49,9 +50,6 @@ struct BattleWindowText u8 shadowColor; }; -static void ChooseMoveUsedParticle(u8 *textPtr); -static void ChooseTypeOfMoveUsedString(u8 *dst); - #if TESTING EWRAM_DATA u16 sBattlerAbilities[MAX_BATTLERS_COUNT] = {0}; #else @@ -140,9 +138,14 @@ static const u8 sText_Evasiveness[] = _("evasiveness"); const u8 *const gStatNamesTable[NUM_BATTLE_STATS] = { - sText_HP, sText_Attack, sText_Defense, - sText_Speed, sText_SpAttack, sText_SpDefense, - sText_Accuracy, sText_Evasiveness + [STAT_HP] = sText_HP, + [STAT_ATK] = sText_Attack, + [STAT_DEF] = sText_Defense, + [STAT_SPEED] = sText_Speed, + [STAT_SPATK] = sText_SpAttack, + [STAT_SPDEF] = sText_SpDefense, + [STAT_ACC] = sText_Accuracy, + [STAT_EVASION] = sText_Evasiveness, }; const u8 *const gPokeblockWasTooXStringTable[FLAVOR_COUNT] = { @@ -691,8 +694,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNCANTUSEMOVETHROATCHOP] = COMPOUND_STRING("The effects of Throat Chop prevent {B_ATK_NAME_WITH_PREFIX2} from using certain moves!\p"), [STRINGID_LASERFOCUS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} concentrated intensely!"), [STRINGID_GEMACTIVATES] = COMPOUND_STRING("The {B_LAST_ITEM} strengthened {B_ATK_NAME_WITH_PREFIX2}'s power!"), - [STRINGID_BERRYDMGREDUCES] = COMPOUND_STRING("The {B_LAST_ITEM} weakened the damage to {B_DEF_NAME_WITH_PREFIX2}!"), - [STRINGID_TARGETATEITEM] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} ate its {B_LAST_ITEM}!"), + [STRINGID_BERRYDMGREDUCES] = COMPOUND_STRING("The {B_LAST_ITEM} weakened the damage to {B_SCR_NAME_WITH_PREFIX2}!"), [STRINGID_AIRBALLOONFLOAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} floats in the air with its Air Balloon!"), [STRINGID_AIRBALLOONPOP] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s Air Balloon popped!"), [STRINGID_INCINERATEBURN] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_LAST_ITEM} was burnt up!"), @@ -885,6 +887,12 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_ELECTRICCURRENTISRUNNING] = COMPOUND_STRING("An electric current is running across the battlefield!"), [STRINGID_SEEMSWEIRD] = COMPOUND_STRING("The battlefield seems weird!"), [STRINGID_WAGGLINGAFINGER] = COMPOUND_STRING("Waggling a finger let it use {B_CURRENT_MOVE}!"), + [STRINGID_BLOCKEDBYSLEEPCLAUSE] = COMPOUND_STRING("Sleep Clause kept {B_DEF_NAME_WITH_PREFIX2} awake!"), + [STRINGID_SUPEREFFECTIVETWOFOES] = COMPOUND_STRING("It's super effective on {B_DEF_NAME_WITH_PREFIX2} and {B_DEF_PARTNER_NAME}!"), + [STRINGID_NOTVERYEFFECTIVETWOFOES] = COMPOUND_STRING("It's not very effective on {B_DEF_NAME_WITH_PREFIX2} and {B_DEF_PARTNER_NAME}!"), + [STRINGID_ITDOESNTAFFECTTWOFOES] = COMPOUND_STRING("It doesn't affect {B_DEF_NAME_WITH_PREFIX2} and {B_DEF_PARTNER_NAME}…"), + [STRINGID_SENDCAUGHTMONPARTYORBOX] = COMPOUND_STRING("Add {B_DEF_NAME} to your party?"), + [STRINGID_PKMNSENTTOPCAFTERCATCH] = gText_PkmnSentToPCAfterCatch, }; const u16 gTrainerUsedItemStringIds[] = @@ -915,15 +923,17 @@ const u16 gMentalHerbCureStringIds[] = const u16 gStartingStatusStringIds[B_MSG_STARTING_STATUS_COUNT] = { - [B_MSG_TERRAIN_SET_MISTY] = STRINGID_TERRAINBECOMESMISTY, - [B_MSG_TERRAIN_SET_ELECTRIC] = STRINGID_TERRAINBECOMESELECTRIC, - [B_MSG_TERRAIN_SET_PSYCHIC] = STRINGID_TERRAINBECOMESPSYCHIC, - [B_MSG_TERRAIN_SET_GRASSY] = STRINGID_TERRAINBECOMESGRASSY, - [B_MSG_SET_TRICK_ROOM] = STRINGID_DIMENSIONSWERETWISTED, - [B_MSG_SET_MAGIC_ROOM] = STRINGID_BIZARREARENACREATED, - [B_MSG_SET_WONDER_ROOM] = STRINGID_BIZARREAREACREATED, - [B_MSG_SET_TAILWIND_PLAYER] = STRINGID_TAILWINDBLEW, - [B_MSG_SET_TAILWIND_OPPONENT] = STRINGID_TAILWINDBLEW, + [B_MSG_TERRAIN_SET_MISTY] = STRINGID_TERRAINBECOMESMISTY, + [B_MSG_TERRAIN_SET_ELECTRIC] = STRINGID_TERRAINBECOMESELECTRIC, + [B_MSG_TERRAIN_SET_PSYCHIC] = STRINGID_TERRAINBECOMESPSYCHIC, + [B_MSG_TERRAIN_SET_GRASSY] = STRINGID_TERRAINBECOMESGRASSY, + [B_MSG_SET_TRICK_ROOM] = STRINGID_DIMENSIONSWERETWISTED, + [B_MSG_SET_MAGIC_ROOM] = STRINGID_BIZARREARENACREATED, + [B_MSG_SET_WONDER_ROOM] = STRINGID_BIZARREAREACREATED, + [B_MSG_SET_TAILWIND] = STRINGID_TAILWINDBLEW, + [B_MSG_SET_RAINBOW] = STRINGID_ARAINBOWAPPEAREDONSIDE, + [B_MSG_SET_SEA_OF_FIRE] = STRINGID_SEAOFFIREENVELOPEDSIDE, + [B_MSG_SET_SWAMP] = STRINGID_SWAMPENVELOPEDSIDE, }; const u16 gTerrainStringIds[B_MSG_TERRAIN_COUNT] = @@ -1013,20 +1023,25 @@ const u16 gMoveWeatherChangeStringIds[] = const u16 gWeatherEndsStringIds[B_MSG_WEATHER_END_COUNT] = { - [B_MSG_WEATHER_END_RAIN] = STRINGID_RAINSTOPPED, - [B_MSG_WEATHER_END_SANDSTORM] = STRINGID_SANDSTORMSUBSIDED, - [B_MSG_WEATHER_END_SUN] = STRINGID_SUNLIGHTFADED, - [B_MSG_WEATHER_END_HAIL] = STRINGID_HAILSTOPPED, + [B_MSG_WEATHER_END_RAIN] = STRINGID_RAINSTOPPED, + [B_MSG_WEATHER_END_SUN] = STRINGID_SUNLIGHTFADED, + [B_MSG_WEATHER_END_SANDSTORM] = STRINGID_SANDSTORMSUBSIDED, + [B_MSG_WEATHER_END_HAIL] = STRINGID_HAILSTOPPED, + [B_MSG_WEATHER_END_SNOW] = STRINGID_SNOWSTOPPED, + [B_MSG_WEATHER_END_FOG] = STRINGID_FOGLIFTED, [B_MSG_WEATHER_END_STRONG_WINDS] = STRINGID_STRONGWINDSDISSIPATED, - [B_MSG_WEATHER_END_SNOW] = STRINGID_SNOWSTOPPED, - [B_MSG_WEATHER_END_FOG] = STRINGID_FOGLIFTED, }; -const u16 gSandStormHailSnowContinuesStringIds[] = +const u16 gWeatherTurnStringIds[] = { - [B_MSG_SANDSTORM] = STRINGID_SANDSTORMRAGES, - [B_MSG_HAIL] = STRINGID_HAILCONTINUES, - [B_MSG_SNOW] = STRINGID_SNOWCONTINUES, + [B_MSG_WEATHER_TURN_RAIN] = STRINGID_RAINCONTINUES, + [B_MSG_WEATHER_TURN_DOWNPOUR] = STRINGID_DOWNPOURCONTINUES, + [B_MSG_WEATHER_TURN_SUN] = STRINGID_SUNLIGHTSTRONG, + [B_MSG_WEATHER_TURN_SANDSTORM] = STRINGID_SANDSTORMRAGES, + [B_MSG_WEATHER_TURN_HAIL] = STRINGID_HAILCONTINUES, + [B_MSG_WEATHER_TURN_SNOW] = STRINGID_SNOWCONTINUES, + [B_MSG_WEATHER_TURN_FOG] = STRINGID_FOGISDEEP, + [B_MSG_WEATHER_TURN_STRONG_WINDS] = STRINGID_MYSTERIOUSAIRCURRENTBLOWSON, }; const u16 gSandStormHailDmgStringIds[] = @@ -1035,20 +1050,6 @@ const u16 gSandStormHailDmgStringIds[] = [B_MSG_HAIL] = STRINGID_PKMNPELTEDBYHAIL }; -const u16 gSandStormHailSnowEndStringIds[] = -{ - [B_MSG_SANDSTORM] = STRINGID_SANDSTORMSUBSIDED, - [B_MSG_HAIL] = STRINGID_HAILSTOPPED, - [B_MSG_SNOW] = STRINGID_SNOWSTOPPED, -}; - -const u16 gRainContinuesStringIds[] = -{ - [B_MSG_RAIN_CONTINUES] = STRINGID_RAINCONTINUES, - [B_MSG_DOWNPOUR_CONTINUES] = STRINGID_DOWNPOURCONTINUES, - [B_MSG_RAIN_STOPPED] = STRINGID_RAINSTOPPED -}; - const u16 gProtectLikeUsedStringIds[] = { [B_MSG_PROTECTED_ITSELF] = STRINGID_PKMNPROTECTEDITSELF2, @@ -1362,10 +1363,11 @@ const u16 gFlashFireStringIds[] = const u16 gCaughtMonStringIds[] = { - [B_MSG_SENT_SOMEONES_PC] = STRINGID_PKMNTRANSFERREDSOMEONESPC, - [B_MSG_SENT_LANETTES_PC] = STRINGID_PKMNTRANSFERREDLANETTESPC, - [B_MSG_SOMEONES_BOX_FULL] = STRINGID_PKMNBOXSOMEONESPCFULL, - [B_MSG_LANETTES_BOX_FULL] = STRINGID_PKMNBOXLANETTESPCFULL, + [B_MSG_SENT_SOMEONES_PC] = STRINGID_PKMNTRANSFERREDSOMEONESPC, + [B_MSG_SENT_LANETTES_PC] = STRINGID_PKMNTRANSFERREDLANETTESPC, + [B_MSG_SOMEONES_BOX_FULL] = STRINGID_PKMNBOXSOMEONESPCFULL, + [B_MSG_LANETTES_BOX_FULL] = STRINGID_PKMNBOXLANETTESPCFULL, + [B_MSG_SWAPPED_INTO_PARTY] = STRINGID_PKMNSENTTOPCAFTERCATCH, }; const u16 gRoomsStringIds[] = @@ -2100,7 +2102,7 @@ void BufferStringBattle(u16 stringID, u32 battler) } else { - if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1WantsToBattle; else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) stringPtr = sText_LinkTrainerWantsToBattlePause; @@ -2172,7 +2174,7 @@ void BufferStringBattle(u16 stringID, u32 battler) { if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK))) stringPtr = sText_Trainer1SentOutPkmn; - else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + else if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1SentOutPkmn; else stringPtr = sText_LinkTrainerSentOutPkmn; @@ -2193,7 +2195,7 @@ void BufferStringBattle(u16 stringID, u32 battler) } else { - if (gTrainerBattleOpponent_A == TRAINER_LINK_OPPONENT || gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_LINK_OPPONENT || gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) stringPtr = sText_LinkTrainer2WithdrewPkmn; @@ -2233,7 +2235,7 @@ void BufferStringBattle(u16 stringID, u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) stringPtr = sText_LinkTrainerMultiSentOutPkmn; - else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + else if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1SentOutPkmn2; else stringPtr = sText_LinkTrainerSentOutPkmn2; @@ -2301,7 +2303,7 @@ void BufferStringBattle(u16 stringID, u32 battler) break; } } - else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + else if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) { switch (gBattleTextBuff1[0]) { @@ -2503,13 +2505,13 @@ static const u8 *BattleStringGetOpponentName(u8 *text, u8 multiplayerId, u8 batt switch (GetBattlerPosition(battler)) { case B_POSITION_OPPONENT_LEFT: - toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, battler); + toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentA, text, multiplayerId, battler); break; case B_POSITION_OPPONENT_RIGHT: if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI) && !BATTLE_TWO_VS_ONE_OPPONENT) - toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, text, multiplayerId, battler); + toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentB, text, multiplayerId, battler); else - toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, battler); + toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentA, text, multiplayerId, battler); break; } @@ -2714,6 +2716,10 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) GetBattlerNick(gBattlerTarget, text); toCpy = text; break; + case B_TXT_DEF_PARTNER_NAME: // partner target name + GetBattlerNick(BATTLE_PARTNER(gBattlerTarget), text); + toCpy = text; + break; case B_TXT_EFF_NAME_WITH_PREFIX: // effect battler name with prefix HANDLE_NICKNAME_STRING_CASE(gEffectBattler) break; @@ -2797,14 +2803,14 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) toCpy = gAbilitiesInfo[sBattlerAbilities[gEffectBattler]].name; break; case B_TXT_TRAINER1_CLASS: // trainer class name - toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; case B_TXT_TRAINER1_NAME: // trainer1 name - toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); + toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentA, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); break; case B_TXT_TRAINER1_NAME_WITH_CLASS: // trainer1 name with trainer class toCpy = textStart; - classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); while (classString[classLength] != EOS) { textStart[classLength] = classString[classLength]; @@ -2812,7 +2818,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) } textStart[classLength] = CHAR_SPACE; textStart += classLength + 1; - nameString = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); + nameString = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentA, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); if (nameString != textStart) { while (nameString[nameLength] != EOS) @@ -2844,12 +2850,12 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) case B_TXT_TRAINER1_LOSE_TEXT: // trainerA lose text if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_PLAYER_WON_TEXT, gTrainerBattleOpponent_A); + CopyFrontierTrainerText(FRONTIER_PLAYER_WON_TEXT, TRAINER_BATTLE_PARAM.opponentA); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) { - CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_WON, gTrainerBattleOpponent_A); + CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_WON, TRAINER_BATTLE_PARAM.opponentA); toCpy = gStringVar4; } else @@ -2860,12 +2866,12 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_PLAYER_LOST_TEXT, gTrainerBattleOpponent_A); + CopyFrontierTrainerText(FRONTIER_PLAYER_LOST_TEXT, TRAINER_BATTLE_PARAM.opponentA); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) { - CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_LOST, gTrainerBattleOpponent_A); + CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_LOST, TRAINER_BATTLE_PARAM.opponentA); toCpy = gStringVar4; } break; @@ -2934,14 +2940,14 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) toCpy = sText_FoePkmnPrefix4; break; case B_TXT_TRAINER2_CLASS: - toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); + toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentB); break; case B_TXT_TRAINER2_NAME: - toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); + toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentB, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); break; case B_TXT_TRAINER2_NAME_WITH_CLASS: toCpy = textStart; - classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); + classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentB); while (classString[classLength] != EOS) { textStart[classLength] = classString[classLength]; @@ -2949,7 +2955,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) } textStart[classLength] = CHAR_SPACE; textStart += classLength + 1; - nameString = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); + nameString = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentB, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); if (nameString != textStart) { while (nameString[nameLength] != EOS) @@ -2963,12 +2969,12 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) case B_TXT_TRAINER2_LOSE_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_PLAYER_WON_TEXT, gTrainerBattleOpponent_B); + CopyFrontierTrainerText(FRONTIER_PLAYER_WON_TEXT, TRAINER_BATTLE_PARAM.opponentB); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) { - CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_WON, gTrainerBattleOpponent_B); + CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_WON, TRAINER_BATTLE_PARAM.opponentB); toCpy = gStringVar4; } else @@ -2979,12 +2985,12 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) case B_TXT_TRAINER2_WIN_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_PLAYER_LOST_TEXT, gTrainerBattleOpponent_B); + CopyFrontierTrainerText(FRONTIER_PLAYER_LOST_TEXT, TRAINER_BATTLE_PARAM.opponentB); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) { - CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_LOST, gTrainerBattleOpponent_B); + CopyTrainerHillTrainerText(TRAINER_HILL_TEXT_PLAYER_LOST, TRAINER_BATTLE_PARAM.opponentB); toCpy = gStringVar4; } break; @@ -3026,13 +3032,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) toCpy = gTrainerClasses[GetFrontierOpponentClass(gPartnerTrainerId)].name; break; case B_POSITION_OPPONENT_LEFT: - toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; case B_POSITION_OPPONENT_RIGHT: if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && !BATTLE_TWO_VS_ONE_OPPONENT) - toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); + toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentB); else - toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; } break; @@ -3052,13 +3058,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) classString = gTrainerClasses[GetFrontierOpponentClass(gPartnerTrainerId)].name; break; case B_POSITION_OPPONENT_LEFT: - classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; case B_POSITION_OPPONENT_RIGHT: if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && !BATTLE_TWO_VS_ONE_OPPONENT) - classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); + classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentB); else - classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; } classLength = 0; @@ -3544,241 +3550,3 @@ u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp) return 0; } - -struct TrainerSlide -{ - u16 trainerId; - bool8 isFrontierTrainer; - const u8 *msgLastSwitchIn; - const u8 *msgLastLowHp; - const u8 *msgFirstDown; - const u8 *msgLastHalfHp; - const u8 *msgFirstCriticalHit; - const u8 *msgFirstSuperEffectiveHit; - const u8 *msgFirstSTABMove; - const u8 *msgPlayerMonUnaffected; - const u8 *msgMegaEvolution; - const u8 *msgZMove; - const u8 *msgBeforeFirstTurn; - const u8 *msgDynamax; -}; - -static const struct TrainerSlide sTrainerSlides[] = -{ - /* Put any trainer slide-in messages inside this array. - Example: - { - .trainerId = TRAINER_WALLY_VR_2, - .isFrontierTrainer = FALSE, - .msgLastSwitchIn = sText_AarghAlmostHadIt, - .msgLastLowHp = sText_BoxIsFull, - .msgFirstDown = sText_123Poof, - .msgLastHalfHp = sText_ShootSoClose, - .msgFirstCriticalHit = sText_CriticalHit, - .msgFirstSuperEffectiveHit = sText_SuperEffective, - .msgFirstSTABMove = sText_ABoosted, - .msgPlayerMonUnaffected = sText_ButNoEffect, - .msgMegaEvolution = sText_PowderExplodes, - .msgZMove = sText_Electromagnetism, - .msgBeforeFirstTurn = sText_GravityIntensified, - .msgDynamax = sText_TargetWokeUp, - }, - */ -}; - -static u32 GetEnemyMonCount(u32 firstId, u32 lastId, bool32 onlyAlive) -{ - u32 i, count = 0; - - for (i = firstId; i < lastId; i++) - { - u32 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG, NULL); - if (species != SPECIES_NONE - && species != SPECIES_EGG - && (!onlyAlive || GetMonData(&gEnemyParty[i], MON_DATA_HP, NULL))) - count++; - } - - return count; -} - -enum -{ - LESS_THAN, - EQUAL, - GREATER_THAN, - LESS_THAN_OR_EQUAL, - GREATER_THAN_OR_EQUAL, - NOT_EQUAL, -}; - -u32 BattlerHPPercentage(u32 battler, u32 operation, u32 threshold) -{ - switch (operation) - { - case LESS_THAN: - return gBattleMons[battler].hp < (gBattleMons[battler].maxHP / threshold); - case EQUAL: - return gBattleMons[battler].hp == (gBattleMons[battler].maxHP / threshold); - case GREATER_THAN: - return gBattleMons[battler].hp > (gBattleMons[battler].maxHP / threshold); - case LESS_THAN_OR_EQUAL: - return gBattleMons[battler].hp <= (gBattleMons[battler].maxHP / threshold); - case GREATER_THAN_OR_EQUAL: - return gBattleMons[battler].hp >= (gBattleMons[battler].maxHP / threshold); - case NOT_EQUAL: - default: - return gBattleMons[battler].hp != (gBattleMons[battler].maxHP / threshold); - } -} - -u32 ShouldDoTrainerSlide(u32 battler, u32 which) -{ - u32 i, firstId, lastId, trainerId, retValue = 1; - - if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) || GetBattlerSide(battler) != B_SIDE_OPPONENT) - return 0; - - // Two opponents support. - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - { - if (gBattlerPartyIndexes[battler] >= 3) - { - firstId = 3, lastId = PARTY_SIZE; - trainerId = gTrainerBattleOpponent_B; - retValue = 2; - } - else - { - firstId = 0, lastId = 3; - trainerId = gTrainerBattleOpponent_A; - } - } - else - { - firstId = 0, lastId = PARTY_SIZE; - trainerId = gTrainerBattleOpponent_A; - } - - for (i = 0; i < ARRAY_COUNT(sTrainerSlides); i++) - { - if (trainerId == sTrainerSlides[i].trainerId - && (((gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && sTrainerSlides[i].isFrontierTrainer) - || (!(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && !sTrainerSlides[i].isFrontierTrainer))) - { - gBattleScripting.battler = battler; - switch (which) - { - case TRAINER_SLIDE_LAST_SWITCHIN: - if (sTrainerSlides[i].msgLastSwitchIn != NULL && !CanBattlerSwitch(battler)) - { - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgLastSwitchIn; - return retValue; - } - break; - case TRAINER_SLIDE_LAST_LOW_HP: - if (sTrainerSlides[i].msgLastLowHp != NULL - && GetEnemyMonCount(firstId, lastId, TRUE) == 1 - && BattlerHPPercentage(battler, LESS_THAN_OR_EQUAL, 4) - && !gBattleStruct->trainerSlideLowHpMsgDone) - { - gBattleStruct->trainerSlideLowHpMsgDone = TRUE; - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgLastLowHp; - return retValue; - } - break; - case TRAINER_SLIDE_FIRST_DOWN: - if (sTrainerSlides[i].msgFirstDown != NULL && GetEnemyMonCount(firstId, lastId, TRUE) == GetEnemyMonCount(firstId, lastId, FALSE) - 1) - { - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgFirstDown; - return retValue; - } - break; - case TRAINER_SLIDE_LAST_HALF_HP: - if (sTrainerSlides[i].msgLastHalfHp != NULL - && GetEnemyMonCount(firstId, lastId, TRUE) == GetEnemyMonCount(firstId, lastId, FALSE) - 1 - && BattlerHPPercentage(battler, LESS_THAN_OR_EQUAL, 2) && BattlerHPPercentage(battler, GREATER_THAN, 4) - && !gBattleStruct->trainerSlideHalfHpMsgDone) - { - gBattleStruct->trainerSlideHalfHpMsgDone = TRUE; - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgLastHalfHp; - return TRUE; - } - break; - case TRAINER_SLIDE_FIRST_CRITICAL_HIT: - if (sTrainerSlides[i].msgFirstCriticalHit != NULL && gBattleStruct->trainerSlideFirstCriticalHitMsgState == 1) - { - gBattleStruct->trainerSlideFirstCriticalHitMsgState = 2; - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgFirstCriticalHit; - return TRUE; - } - break; - case TRAINER_SLIDE_FIRST_SUPER_EFFECTIVE_HIT: - if (sTrainerSlides[i].msgFirstSuperEffectiveHit != NULL - && gBattleStruct->trainerSlideFirstSuperEffectiveHitMsgState == 1 - && gBattleMons[battler].hp) - { - gBattleStruct->trainerSlideFirstSuperEffectiveHitMsgState = 2; - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgFirstSuperEffectiveHit; - return TRUE; - } - break; - case TRAINER_SLIDE_FIRST_STAB_MOVE: - if (sTrainerSlides[i].msgFirstSTABMove != NULL - && gBattleStruct->trainerSlideFirstSTABMoveMsgState == 1 - && GetEnemyMonCount(firstId, lastId, TRUE) == GetEnemyMonCount(firstId, lastId, FALSE)) - { - gBattleStruct->trainerSlideFirstSTABMoveMsgState = 2; - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgFirstSTABMove; - return TRUE; - } - break; - case TRAINER_SLIDE_PLAYER_MON_UNAFFECTED: - if (sTrainerSlides[i].msgPlayerMonUnaffected != NULL - && gBattleStruct->trainerSlidePlayerMonUnaffectedMsgState == 1 - && GetEnemyMonCount(firstId, lastId, TRUE) == GetEnemyMonCount(firstId, lastId, FALSE)) - { - gBattleStruct->trainerSlidePlayerMonUnaffectedMsgState = 2; - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgPlayerMonUnaffected; - return TRUE; - } - break; - case TRAINER_SLIDE_MEGA_EVOLUTION: - if (sTrainerSlides[i].msgMegaEvolution != NULL && !gBattleStruct->trainerSlideMegaEvolutionMsgDone) - { - gBattleStruct->trainerSlideMegaEvolutionMsgDone = TRUE; - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgMegaEvolution; - return TRUE; - } - break; - case TRAINER_SLIDE_Z_MOVE: - if (sTrainerSlides[i].msgZMove != NULL && !gBattleStruct->trainerSlideZMoveMsgDone) - { - gBattleStruct->trainerSlideZMoveMsgDone = TRUE; - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgZMove; - return TRUE; - } - break; - case TRAINER_SLIDE_BEFORE_FIRST_TURN: - if (sTrainerSlides[i].msgBeforeFirstTurn != NULL && !gBattleStruct->trainerSlideBeforeFirstTurnMsgDone) - { - gBattleStruct->trainerSlideBeforeFirstTurnMsgDone = TRUE; - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgBeforeFirstTurn; - return TRUE; - } - break; - case TRAINER_SLIDE_DYNAMAX: - if (sTrainerSlides[i].msgDynamax != NULL && !gBattleStruct->trainerSlideDynamaxMsgDone) - { - gBattleStruct->trainerSlideDynamaxMsgDone = TRUE; - gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgDynamax; - return TRUE; - } - break; - } - break; - } - } - - return 0; -} diff --git a/src/battle_palace.c b/src/battle_palace.c index fdcb8d3903..68f01f84f7 100644 --- a/src/battle_palace.c +++ b/src/battle_palace.c @@ -94,7 +94,7 @@ static void InitPalaceChallenge(void) gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0; SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; } static void GetPalaceData(void) @@ -153,14 +153,14 @@ static void GetPalaceCommentId(void) static void SetPalaceOpponent(void) { - gTrainerBattleOpponent_A = 5 *(Random() % 255) / 64u; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + TRAINER_BATTLE_PARAM.opponentA = 5 *(Random() % 255) / 64u; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); } static void BufferOpponentIntroSpeech(void) { - if (gTrainerBattleOpponent_A < FRONTIER_TRAINERS_COUNT) - FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore); + if (TRAINER_BATTLE_PARAM.opponentA < FRONTIER_TRAINERS_COUNT) + FrontierSpeechToString(gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].speechBefore); } static void IncrementPalaceStreak(void) diff --git a/src/battle_pike.c b/src/battle_pike.c index 3ce3cd443a..9c93a164a9 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -1403,11 +1403,11 @@ static void PrepareOneTrainer(bool8 difficult) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1); - gTrainerBattleOpponent_A = trainerId; + TRAINER_BATTLE_PARAM.opponentA = trainerId; gFacilityTrainers = gBattleFrontierTrainers; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < NUM_PIKE_ROOMS) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1] = gTrainerBattleOpponent_A; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1] = TRAINER_BATTLE_PARAM.opponentA; } static void PrepareTwoTrainers(void) @@ -1429,10 +1429,10 @@ static void PrepareTwoTrainers(void) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1); - gTrainerBattleOpponent_A = trainerId; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + TRAINER_BATTLE_PARAM.opponentA = trainerId; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); if (gSaveBlock2Ptr->frontier.curChallengeBattleNum <= NUM_PIKE_ROOMS) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1] = gTrainerBattleOpponent_A; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1] = TRAINER_BATTLE_PARAM.opponentA; do { @@ -1445,10 +1445,10 @@ static void PrepareTwoTrainers(void) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum); - gTrainerBattleOpponent_B = trainerId; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_B, 1); + TRAINER_BATTLE_PARAM.opponentB = trainerId; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentB, 1); if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < NUM_PIKE_ROOMS) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 2] = gTrainerBattleOpponent_B; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 2] = TRAINER_BATTLE_PARAM.opponentB; } static void ClearPikeTrainerIds(void) @@ -1463,13 +1463,13 @@ static void BufferTrainerIntro(void) { if (gSpecialVar_0x8005 == 0) { - if (gTrainerBattleOpponent_A < FRONTIER_TRAINERS_COUNT) - FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore); + if (TRAINER_BATTLE_PARAM.opponentA < FRONTIER_TRAINERS_COUNT) + FrontierSpeechToString(gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].speechBefore); } else if (gSpecialVar_0x8005 == 1) { - if (gTrainerBattleOpponent_B < FRONTIER_TRAINERS_COUNT) - FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_B].speechBefore); + if (TRAINER_BATTLE_PARAM.opponentB < FRONTIER_TRAINERS_COUNT) + FrontierSpeechToString(gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentB].speechBefore); } } @@ -1615,7 +1615,7 @@ static void InitPikeChallenge(void) if (!(gSaveBlock2Ptr->frontier.winStreakActiveFlags & sWinStreakFlags[lvlMode])) gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] = 0; - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; gBattleOutcome = 0; } diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index a184c9160f..33f2717597 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -864,7 +864,7 @@ static void InitPyramidChallenge(void) } InitBattlePyramidBagCursorPosition(); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; gBattleOutcome = 0; } @@ -983,8 +983,10 @@ static void SetPickupItem(void) { int i; int itemIndex; - int rand; + int randVal; + u32 randSeedIndex, randSeed; u8 id; + rng_value_t rand; u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; u32 floor = gSaveBlock2Ptr->frontier.curChallengeBattleNum; u32 round = (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] / FRONTIER_STAGES_PER_CHALLENGE) % TOTAL_PYRAMID_ROUNDS; @@ -994,15 +996,19 @@ static void SetPickupItem(void) id = GetPyramidFloorTemplateId(); itemIndex = (gSpecialVar_LastTalked - sPyramidFloorTemplates[id].numTrainers) - 1; - rand = gSaveBlock2Ptr->frontier.pyramidRandoms[itemIndex / 2]; - SeedRng2(rand); + randSeedIndex = (itemIndex & 1) * 2; + randSeed = (u32)gSaveBlock2Ptr->frontier.pyramidRandoms[randSeedIndex + 1] << 16; + randSeed |= gSaveBlock2Ptr->frontier.pyramidRandoms[randSeedIndex]; + rand = LocalRandomSeed(randSeed); - for (i = 0; i < itemIndex + 1; i++) - rand = Random2() % 100; + for (i = 0; i < itemIndex / 2; i++) + LocalRandom(&rand); + + randVal = LocalRandom(&rand) % 100; for (i = sPickupItemOffsets[floor]; i < ARRAY_COUNT(sPickupItemSlots); i++) { - if (rand < sPickupItemSlots[i][0]) + if (randVal < sPickupItemSlots[i][0]) break; } @@ -1324,11 +1330,11 @@ bool8 GetBattlePyramidTrainerFlag(u8 eventId) void MarkApproachingPyramidTrainersAsBattled(void) { - MarkPyramidTrainerAsBattled(gTrainerBattleOpponent_A); + MarkPyramidTrainerAsBattled(TRAINER_BATTLE_PARAM.opponentA); if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) { gSelectedObjectEvent = GetChosenApproachingTrainerObjectEventId(1); - MarkPyramidTrainerAsBattled(gTrainerBattleOpponent_B); + MarkPyramidTrainerAsBattled(TRAINER_BATTLE_PARAM.opponentB); } } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0e8a7c283a..be57f4ae18 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -46,6 +46,7 @@ #include "menu_specialized.h" #include "data.h" #include "generational_changes.h" +#include "move.h" #include "constants/abilities.h" #include "constants/battle_anim.h" #include "constants/battle_move_effects.h" @@ -59,6 +60,7 @@ #include "constants/party_menu.h" #include "constants/rgb.h" #include "constants/songs.h" +#include "constants/trainer_slide.h" #include "constants/trainers.h" #include "battle_util.h" #include "constants/pokemon.h" @@ -297,13 +299,18 @@ static const u16 sTrappingMoves[NUM_TRAPPING_MOVES] = MOVE_THUNDER_CAGE }; -static const u16 sBadgeFlags[8] = { - FLAG_BADGE01_GET, FLAG_BADGE02_GET, FLAG_BADGE03_GET, FLAG_BADGE04_GET, - FLAG_BADGE05_GET, FLAG_BADGE06_GET, FLAG_BADGE07_GET, FLAG_BADGE08_GET, -}; - static const u16 sWhiteOutBadgeMoney[9] = { 8, 16, 24, 36, 48, 64, 80, 100, 120 }; +enum GiveCaughtMonStates +{ + GIVECAUGHTMON_CHECK_PARTY_SIZE, + GIVECAUGHTMON_ASK_ADD_TO_PARTY, + GIVECAUGHTMON_HANDLE_INPUT, + GIVECAUGHTMON_DO_CHOOSE_MON, + GIVECAUGHTMON_HANDLE_CHOSEN_MON, + GIVECAUGHTMON_GIVE_AND_SHOW_MSG, +}; + #define STAT_CHANGE_WORKED 0 #define STAT_CHANGE_DIDNT_WORK 1 @@ -328,6 +335,7 @@ static void BestowItem(u32 battlerAtk, u32 battlerDef); static bool8 IsFinalStrikeEffect(u32 moveEffect); static void TryUpdateRoundTurnOrder(void); static bool32 ChangeOrderTargetAfterAttacker(void); +static bool32 SetTargetToNextPursuiter(u32 battlerDef); void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler); static void RemoveAllWeather(void); static void RemoveAllTerrains(void); @@ -397,7 +405,7 @@ static void Cmd_bichalfword(void); static void Cmd_bicword(void); static void Cmd_pause(void); static void Cmd_waitstate(void); -static void Cmd_healthbar_update(void); +static void Cmd_absorb(void); static void Cmd_return(void); static void Cmd_end(void); static void Cmd_end2(void); @@ -487,7 +495,7 @@ static void Cmd_givepaydaymoney(void); static void Cmd_setlightscreen(void); static void Cmd_tryKO(void); static void Cmd_damagetohalftargethp(void); -static void Cmd_unused_95(void); +static void Cmd_copybidedmg(void); static void Cmd_unused_96(void); static void Cmd_tryinfatuating(void); static void Cmd_updatestatusicon(void); @@ -508,7 +516,7 @@ static void Cmd_settypetorandomresistance(void); static void Cmd_setalwayshitflag(void); static void Cmd_copymovepermanently(void); static void Cmd_trychoosesleeptalkmove(void); -static void Cmd_setdestinybond(void); +static void Cmd_trysetdestinybond(void); static void Cmd_trysetdestinybondtohappen(void); static void Cmd_settailwind(void); static void Cmd_tryspiteppreduce(void); @@ -568,8 +576,8 @@ static void Cmd_switchoutabilities(void); static void Cmd_jumpifhasnohp(void); static void Cmd_jumpifnotcurrentmoveargtype(void); static void Cmd_pickup(void); -static void Cmd_unused3(void); -static void Cmd_unused4(void); +static void Cmd_unused_0xE6(void); +static void Cmd_unused_0xE7(void); static void Cmd_settypebasedhalvers(void); static void Cmd_jumpifsubstituteblocks(void); static void Cmd_tryrecycleitem(void); @@ -656,7 +664,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_bicword, //0x38 Cmd_pause, //0x39 Cmd_waitstate, //0x3A - Cmd_healthbar_update, //0x3B + Cmd_absorb, //0x3B Cmd_return, //0x3C Cmd_end, //0x3D Cmd_end2, //0x3E @@ -746,7 +754,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_setlightscreen, //0x92 Cmd_tryKO, //0x93 Cmd_damagetohalftargethp, //0x94 - Cmd_unused_95, //0x95 + Cmd_copybidedmg, //0x95 Cmd_unused_96, //0x96 Cmd_tryinfatuating, //0x97 Cmd_updatestatusicon, //0x98 @@ -767,7 +775,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_setalwayshitflag, //0xA7 Cmd_copymovepermanently, //0xA8 Cmd_trychoosesleeptalkmove, //0xA9 - Cmd_setdestinybond, //0xAA + Cmd_trysetdestinybond, //0xAA Cmd_trysetdestinybondtohappen, //0xAB Cmd_settailwind, //0xAC Cmd_tryspiteppreduce, //0xAD @@ -827,8 +835,8 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_jumpifhasnohp, //0xE3 Cmd_jumpifnotcurrentmoveargtype, //0xE4 Cmd_pickup, //0xE5 - Cmd_unused3, //0xE6 - Cmd_unused4, //0xE7 + Cmd_unused_0xE6, //0xE6 + Cmd_unused_0xE7, //0xE7 Cmd_settypebasedhalvers, //0xE8 Cmd_jumpifsubstituteblocks, //0xE9 Cmd_tryrecycleitem, //0xEA @@ -1102,7 +1110,7 @@ static const u8 sTerrainToType[BATTLE_TERRAIN_COUNT] = static bool32 NoTargetPresent(u8 battler, u32 move) { if (!IsBattlerAlive(gBattlerTarget)) - gBattlerTarget = GetMoveTarget(move, NO_TARGET_OVERRIDE); + gBattlerTarget = GetBattleMoveTarget(move, NO_TARGET_OVERRIDE); switch (GetBattlerMoveTargetType(battler, move)) { @@ -1140,22 +1148,9 @@ bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType) return FALSE; } -bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef) -{ - if (!gSpecialStatuses[battlerDef].distortedTypeMatchups - && GetBattlerAbility(battlerDef) == ABILITY_TERA_SHELL - && gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL - && !IS_MOVE_STATUS(move) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[battlerDef].hp == gBattleMons[battlerDef].maxHP) - return TRUE; - - return FALSE; -} - bool32 IsMoveNotAllowedInSkyBattles(u32 move) { - return ((gBattleStruct->isSkyBattle) && (gMovesInfo[gCurrentMove].skyBattleBanned)); + return (gBattleStruct->isSkyBattle && IsMoveSkyBattleBanned(gCurrentMove)); } static void Cmd_attackcanceler(void) @@ -1163,57 +1158,31 @@ static void Cmd_attackcanceler(void) CMD_ARGS(); s32 i; - u16 attackerAbility = GetBattlerAbility(gBattlerAttacker); - u32 moveType = GetMoveType(gCurrentMove); - if (gBattleStruct->usedEjectItem & (1u << gBattlerAttacker)) + if (gBattleStruct->battlerState[gBattlerAttacker].usedEjectItem) { - gBattleStruct->usedEjectItem = 0; + gBattleStruct->battlerState[gBattlerAttacker].usedEjectItem = FALSE; gCurrentActionFuncId = B_ACTION_TRY_FINISH; return; } - // Weight-based moves are blocked by Dynamax. - if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && IsMoveBlockedByDynamax(gCurrentMove)) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax; - return; - } - if (gBattleOutcome != 0) { gCurrentActionFuncId = B_ACTION_FINISHED; return; } - if (!IsBattlerAlive(gBattlerAttacker) && gMovesInfo[gCurrentMove].effect != EFFECT_EXPLOSION && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) + u32 effect = GetMoveEffect(gCurrentMove); + + if (!IsBattlerAlive(gBattlerAttacker) && effect != EFFECT_EXPLOSION && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveEnd; return; } - if (AtkCanceller_UnableToUseMove(moveType)) + if (AtkCanceller_MoveSuccessOrder()) return; - if (WEATHER_HAS_EFFECT && gMovesInfo[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) @@ -1226,22 +1195,6 @@ static void Cmd_attackcanceler(void) return; } - // Check Protean activation. - if (ProteanTryChangeType(gBattlerAttacker, attackerAbility, gCurrentMove, moveType)) - { - if (B_PROTEAN_LIBERO == GEN_9) - gDisableStructs[gBattlerAttacker].usedProteanLibero = TRUE; - PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - gBattlerAbility = gBattlerAttacker; - BattleScriptPushCursor(); - PrepareStringBattle(STRINGID_EMPTYSTRING3, gBattlerAttacker); - gBattleCommunication[MSG_DISPLAY] = 1; - gBattlescriptCurrInstr = BattleScript_ProteanActivates; - return; - } - - if (AtkCanceller_UnableToUseMove2()) - return; if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0)) return; if (gMovesInfo[gCurrentMove].effect == EFFECT_PARALYZE && AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, gCurrentMove)) @@ -1252,7 +1205,7 @@ static void Cmd_attackcanceler(void) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) { gBattlescriptCurrInstr = BattleScript_NoPPForMove; - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; return; } @@ -1260,25 +1213,28 @@ static void Cmd_attackcanceler(void) // Check if no available target present on the field or if Sky Battles ban the move if ((NoTargetPresent(gBattlerAttacker, gCurrentMove) - && (!gBattleMoveEffects[gMovesInfo[gCurrentMove].effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))) + && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))) || (IsMoveNotAllowedInSkyBattles(gCurrentMove))) { - if (gMovesInfo[gCurrentMove].effect == EFFECT_FLING) // Edge case for removing a mon's item when there is no target available after using Fling. + if (effect == EFFECT_FLING) // Edge case for removing a mon's item when there is no target available after using Fling. gBattlescriptCurrInstr = BattleScript_FlingFailConsumeItem; else gBattlescriptCurrInstr = BattleScript_FailedFromAtkString; - if (!gBattleMoveEffects[gMovesInfo[gCurrentMove].effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + if (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) CancelMultiTurnMoves(gBattlerAttacker); return; } + u32 isBounceable = MoveCanBeBouncedBack(gCurrentMove); if (gProtectStructs[gBattlerTarget].bounceMove - && gMovesInfo[gCurrentMove].magicCoatAffected + && isBounceable && !gBattleStruct->bouncedMoveIsUsed) { gBattleStruct->bouncedMoveIsUsed = TRUE; // Edge case for bouncing a powder move against a grass type pokemon. + + ClearDamageCalcResults(); SetAtkCancellerForCalledMove(); if (BlocksPrankster(gCurrentMove, gBattlerTarget, gBattlerAttacker, TRUE)) { @@ -1293,7 +1249,7 @@ static void Cmd_attackcanceler(void) } return; } - else if (gMovesInfo[gCurrentMove].magicCoatAffected && !gBattleStruct->bouncedMoveIsUsed) + else if (isBounceable && !gBattleStruct->bouncedMoveIsUsed) { u32 battler = gBattlerTarget; @@ -1303,7 +1259,7 @@ static void Cmd_attackcanceler(void) gBattleStruct->bouncedMoveIsUsed = TRUE; } else if (IsDoubleBattle() - && gMovesInfo[gCurrentMove].target == MOVE_TARGET_OPPONENTS_FIELD + && GetBattlerMoveTargetType(battler, gCurrentMove) == MOVE_TARGET_OPPONENTS_FIELD && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) == ABILITY_MAGIC_BOUNCE) { gBattlerTarget = battler = BATTLE_PARTNER(gBattlerTarget); @@ -1312,8 +1268,8 @@ static void Cmd_attackcanceler(void) if (gBattleStruct->bouncedMoveIsUsed) { - // Edge case for bouncing a powder move against a grass type pokemon. - SetAtkCancellerForCalledMove(); + ClearDamageCalcResults(); + SetAtkCancellerForCalledMove(); // Edge case for bouncing a powder move against a grass type pokemon. BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MagicBounce; gBattlerAbility = battler; @@ -1322,8 +1278,7 @@ static void Cmd_attackcanceler(void) } // Z-moves and Max Moves bypass protection, but deal reduced damage (factored in AccumulateOtherModifiers) - if ((IsZMove(gCurrentMove) || IsMaxMove(gCurrentMove)) - && IS_BATTLER_PROTECTED(gBattlerTarget)) + if ((IsZMove(gCurrentMove) || IsMaxMove(gCurrentMove)) && IS_BATTLER_PROTECTED(gBattlerTarget)) { BattleScriptPush(cmd->nextInstr); gBattlescriptCurrInstr = BattleScript_CouldntFullyProtect; @@ -1332,7 +1287,7 @@ static void Cmd_attackcanceler(void) for (i = 0; i < gBattlersCount; i++) { - if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && gMovesInfo[gCurrentMove].snatchAffected) + if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && MoveCanBeSnatched(gCurrentMove)) { gProtectStructs[gBattlerByTurnOrder[i]].stealMove = FALSE; gBattleStruct->snatchedMoveIsUsed = TRUE; @@ -1361,14 +1316,14 @@ static void Cmd_attackcanceler(void) } else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) && (gCurrentMove != MOVE_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) - && (!gBattleMoveEffects[gMovesInfo[gCurrentMove].effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) - && gMovesInfo[gCurrentMove].effect != EFFECT_SUCKER_PUNCH - && gMovesInfo[gCurrentMove].effect != EFFECT_UPPER_HAND) + && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + && effect != EFFECT_SUCKER_PUNCH + && effect != EFFECT_UPPER_HAND) { if (IsMoveMakingContact(gCurrentMove, gBattlerAttacker)) gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; CancelMultiTurnMoves(gBattlerAttacker); - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; @@ -1394,7 +1349,7 @@ static void Cmd_attackcanceler(void) static bool32 JumpIfMoveFailed(u8 adder, u16 move) { - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; @@ -1417,7 +1372,7 @@ static void Cmd_unused5(void) if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove)) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; JumpIfMoveFailed(sizeof(*cmd), MOVE_NONE); gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; } @@ -1427,103 +1382,97 @@ static void Cmd_unused5(void) } } -static bool8 JumpIfMoveAffectedByProtect(u16 move) +static bool32 JumpIfMoveAffectedByProtect(u32 move, u32 battler, u32 shouldJump) { - bool8 affected = FALSE; - if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, move)) + bool32 affected = IsBattlerProtected(gBattlerAttacker, battler, move); + if (affected) { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; - affected = TRUE; + gBattleStruct->moveResultFlags[battler] |= MOVE_RESULT_MISSED; + if (shouldJump) + JumpIfMoveFailed(7, move); } return affected; } -static bool32 AccuracyCalcHelper(u16 move) +static bool32 AccuracyCalcHelper(u32 move, u32 battler) { - if ((gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) - || (B_TOXIC_NEVER_MISS >= GEN_6 && gMovesInfo[move].effect == EFFECT_TOXIC && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON)) - || gStatuses4[gBattlerTarget] & STATUS4_GLAIVE_RUSH) + u32 effect = FALSE; + u32 ability = ABILITY_NONE; + u32 moveEffect = GetMoveEffect(move); + + if ((gStatuses3[battler] & STATUS3_ALWAYS_HITS && gDisableStructs[battler].battlerWithSureHit == gBattlerAttacker) + || (B_TOXIC_NEVER_MISS >= GEN_6 && moveEffect == EFFECT_TOXIC && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON)) + || gStatuses4[battler] & STATUS4_GLAIVE_RUSH) { - JumpIfMoveFailed(7, move); - return TRUE; + effect = TRUE; } // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD - && !(gStatuses3[gBattlerTarget] & STATUS3_COMMANDER) - && (gMovesInfo[move].effect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) + && !(gStatuses3[battler] & STATUS3_COMMANDER) + && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battler] == 0xFF)) { - if (!JumpIfMoveFailed(7, move)) - RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD); - return TRUE; + effect = TRUE; + ability = ABILITY_NO_GUARD; } // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. - else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD - && (gMovesInfo[move].effect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)) + else if (GetBattlerAbility(battler) == ABILITY_NO_GUARD + && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battler] == 0xFF)) { - if (!JumpIfMoveFailed(7, move)) - RecordAbilityBattle(gBattlerTarget, ABILITY_NO_GUARD); - return TRUE; + effect = TRUE; + ability = ABILITY_NO_GUARD; } // If the target is under the effects of Telekinesis, and the move isn't a OH-KO move, move hits. - else if (gStatuses3[gBattlerTarget] & STATUS3_TELEKINESIS - && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE) - && gMovesInfo[move].effect != EFFECT_OHKO) + else if (gStatuses3[battler] & STATUS3_TELEKINESIS + && !(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + && moveEffect != EFFECT_OHKO) { - JumpIfMoveFailed(7, move); - return TRUE; + effect = TRUE; + } + else if (gBattleStruct->battlerState[battler].pursuitTarget) + { + effect = TRUE; + } + else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE)) + { + effect = TRUE; + } + else if ((gStatuses3[battler] & STATUS3_COMMANDER) + || (gStatuses3[battler] & STATUS3_PHANTOM_FORCE) + || ((gStatuses3[battler] & STATUS3_ON_AIR) && !(MoveDamagesAirborne(move) || MoveDamagesAirborneDoubleDamage(move))) + || ((gStatuses3[battler] & STATUS3_UNDERGROUND) && !MoveDamagesUnderground(move)) + || ((gStatuses3[battler] & STATUS3_UNDERWATER) && !MoveDamagesUnderWater(move))) + { + gBattleStruct->moveResultFlags[battler] |= MOVE_RESULT_MISSED; + effect = TRUE; } - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) + if (HasWeatherEffect()) { - JumpIfMoveFailed(7, move); - return TRUE; - } + if ((moveEffect == EFFECT_THUNDER || moveEffect == EFFECT_RAIN_ALWAYS_HIT) + && IsBattlerWeatherAffected(battler, B_WEATHER_RAIN)) + effect = TRUE; + else if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && moveEffect == EFFECT_BLIZZARD) + effect = TRUE; - if ((gStatuses3[gBattlerTarget] & STATUS3_COMMANDER) - || (gStatuses3[gBattlerTarget] & STATUS3_PHANTOM_FORCE) - || ((gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) && !(gMovesInfo[move].damagesAirborne || gMovesInfo[move].damagesAirborneDoubleDamage)) - || ((gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND) && !gMovesInfo[move].damagesUnderground) - || ((gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER) && !gMovesInfo[move].damagesUnderwater)) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - - if (WEATHER_HAS_EFFECT) - { - if ((gMovesInfo[move].effect == EFFECT_THUNDER || gMovesInfo[move].effect == EFFECT_RAIN_ALWAYS_HIT) - && IsBattlerWeatherAffected(gBattlerTarget, B_WEATHER_RAIN)) - { - // thunder/hurricane/genie moves ignore acc checks in rain unless target is holding utility umbrella - JumpIfMoveFailed(7, move); - return TRUE; - } - else if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && gMovesInfo[move].effect == EFFECT_BLIZZARD) - { - // Blizzard ignores acc checks in Hail in Gen4+ - JumpIfMoveFailed(7, move); - return TRUE; - } + if (effect) + return effect; } if (B_MINIMIZE_DMG_ACC >= GEN_6 - && (gStatuses3[gBattlerTarget] & STATUS3_MINIMIZED) - && gMovesInfo[move].minimizeDoubleDamage) + && (gStatuses3[battler] & STATUS3_MINIMIZED) + && MoveIncreasesPowerToMinimizedTargets(move)) { - JumpIfMoveFailed(7, move); - return TRUE; + effect = TRUE; + } + else if (GetMoveAccuracy(move) == 0) + { + effect = TRUE; } - if (gMovesInfo[move].accuracy == 0) - { - JumpIfMoveFailed(7, move); - return TRUE; - } + if (ability != ABILITY_NONE) + RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD); - return FALSE; + return effect; } u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect) @@ -1541,7 +1490,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u if (atkAbility == ABILITY_UNAWARE || atkAbility == ABILITY_KEEN_EYE || atkAbility == ABILITY_MINDS_EYE || (B_ILLUMINATE_EFFECT >= GEN_9 && atkAbility == ABILITY_ILLUMINATE)) evasionStage = DEFAULT_STAT_STAGE; - if (gMovesInfo[move].ignoresTargetDefenseEvasionStages) + if (MoveIgnoresDefenseEvasionStages(move)) evasionStage = DEFAULT_STAT_STAGE; if (defAbility == ABILITY_UNAWARE) accStage = DEFAULT_STAT_STAGE; @@ -1556,12 +1505,12 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u if (buff > MAX_STAT_STAGE) buff = MAX_STAT_STAGE; - moveAcc = gMovesInfo[move].accuracy; + moveAcc = GetMoveAccuracy(move); // Check Thunder and Hurricane on sunny weather. - if (IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && gMovesInfo[move].effect == EFFECT_THUNDER) + if (IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && GetMoveEffect(move) == EFFECT_THUNDER) moveAcc = 50; // Check Wonder Skin. - if (defAbility == ABILITY_WONDER_SKIN && IS_MOVE_STATUS(move) && moveAcc > 50) + if (defAbility == ABILITY_WONDER_SKIN && IsBattleMoveStatus(move) && moveAcc > 50) moveAcc = 50; calc = gAccuracyStageRatios[buff].dividend * moveAcc; @@ -1577,7 +1526,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u calc = (calc * 110) / 100; // 1.1 victory star boost break; case ABILITY_HUSTLE: - if (IS_MOVE_PHYSICAL(move)) + if (IsBattleMovePhysical(move)) calc = (calc * 80) / 100; // 1.2 hustle loss break; } @@ -1586,11 +1535,11 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u switch (defAbility) { case ABILITY_SAND_VEIL: - if (WEATHER_HAS_EFFECT && gBattleWeather & B_WEATHER_SANDSTORM) + if (HasWeatherEffect() && 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))) + if (HasWeatherEffect() && (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) calc = (calc * 80) / 100; // 1.2 snow cloak loss break; case ABILITY_TANGLED_FEET: @@ -1628,7 +1577,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u break; } - if (gBattleStruct->usedMicleBerry & 1u << battlerAtk) + if (gBattleStruct->battlerState[battlerAtk].usedMicleBerry) { if (atkAbility == ABILITY_RIPEN) calc = (calc * 140) / 100; // ripen gives 40% acc boost @@ -1642,7 +1591,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u if (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerDef) == AFFECTION_FIVE_HEARTS) calc = (calc * 90) / 100; - if (WEATHER_HAS_EFFECT && gBattleWeather & B_WEATHER_FOG) + if (HasWeatherEffect() && gBattleWeather & B_WEATHER_FOG) calc = (calc * 60) / 100; // modified by 3/5 return calc; @@ -1650,21 +1599,24 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move) { - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - u32 abilityDef = GetBattlerAbility(gBattlerTarget); - u32 holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + u32 abilityAtk; + u32 holdEffectAtk; if (move == ACC_CURR_MOVE) move = gCurrentMove; + u32 effect = GetMoveEffect(move); + + abilityAtk = GetBattlerAbility(gBattlerAttacker); + holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + if (move == NO_ACC_CALC_CHECK_LOCK_ON) { if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) gBattlescriptCurrInstr = nextInstr; else if (gStatuses3[gBattlerTarget] & (STATUS3_SEMI_INVULNERABLE)) gBattlescriptCurrInstr = failInstr; - else if (!JumpIfMoveAffectedByProtect(gCurrentMove)) + else if (!JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE)) gBattlescriptCurrInstr = nextInstr; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) { @@ -1677,56 +1629,68 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT || (gSpecialStatuses[gBattlerAttacker].multiHitOn && (abilityAtk == ABILITY_SKILL_LINK || holdEffectAtk == HOLD_EFFECT_LOADED_DICE - || !(gMovesInfo[move].effect == EFFECT_TRIPLE_KICK || gMovesInfo[move].effect == EFFECT_POPULATION_BOMB)))) + || !(effect == EFFECT_TRIPLE_KICK || effect == EFFECT_POPULATION_BOMB)))) { // No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel/Population Bomb gBattlescriptCurrInstr = nextInstr; } else { - u32 accuracy; - u32 type = GetMoveType(move); + u32 moveType = GetBattleMoveType(move); + u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); + bool32 calcSpreadMove = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(move); - if (JumpIfMoveAffectedByProtect(move)) - return; - if (AccuracyCalcHelper(move)) - return; - - accuracy = GetTotalAccuracy( - gBattlerAttacker, - gBattlerTarget, - move, - abilityAtk, - abilityDef, - holdEffectAtk, - GetBattlerHoldEffect(gBattlerTarget, TRUE) - ); - - if (!RandomPercentage(RNG_ACCURACY, accuracy)) + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + if (gBattleStruct->calculatedSpreadMoveAccuracy) + break; - if (gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_DARTS - && !recalcDragonDarts // So we don't jump back and forth between targets - && CanTargetPartner(gBattlerAttacker, gBattlerTarget) - && !TargetFullyImmuneToCurrMove(gBattlerAttacker, BATTLE_PARTNER(gBattlerTarget))) + if ((!calcSpreadMove && battlerDef != gBattlerTarget) + || IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) + || (gBattleStruct->noResultString[battlerDef] && gBattleStruct->noResultString[battlerDef] != DO_ACCURACY_CHECK)) + continue; + + if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE) || AccuracyCalcHelper(move, battlerDef)) + continue; + + u32 accuracy = GetTotalAccuracy(gBattlerAttacker, + battlerDef, + move, + abilityAtk, + GetBattlerAbility(battlerDef), + holdEffectAtk, + GetBattlerHoldEffect(battlerDef, TRUE)); + + if (!RandomPercentage(RNG_ACCURACY, accuracy)) { - // Smart target to partner if miss - gBattlerTarget = BATTLE_PARTNER(gBattlerTarget); - gMoveResultFlags &= ~MOVE_RESULT_MISSED; - AccuracyCheck(TRUE, nextInstr, failInstr, move); - return; + gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_MISSED; + gBattleStruct->missStringId[battlerDef] = gBattleCommunication[MISS_TYPE] = B_MSG_MISSED; + + if (holdEffectAtk == HOLD_EFFECT_BLUNDER_POLICY) + gBattleStruct->blunderPolicy = TRUE; // Only activates from missing through acc/evasion checks + + if (effect == EFFECT_DRAGON_DARTS + && !recalcDragonDarts // So we don't jump back and forth between targets + && CanTargetPartner(gBattlerAttacker, battlerDef) + && !TargetFullyImmuneToCurrMove(gBattlerAttacker, BATTLE_PARTNER(battlerDef))) + { + // Smart target to partner if miss + gBattlerTarget = BATTLE_PARTNER(battlerDef); + AccuracyCheck(TRUE, nextInstr, failInstr, move); + return; + } + + if (GetMovePower(move) != 0) + CalcTypeEffectivenessMultiplier(move, moveType, gBattlerAttacker, battlerDef, GetBattlerAbility(battlerDef), TRUE); } - - if (IsDoubleBattle() && - (moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) - gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_ATK; - else - gBattleCommunication[MISS_TYPE] = B_MSG_MISSED; - - if (gMovesInfo[move].power) - CalcTypeEffectivenessMultiplier(move, type, gBattlerAttacker, gBattlerTarget, abilityDef, TRUE); } + + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_MISSED) + gBattleStruct->moveResultFlags[gBattlerTarget] = MOVE_RESULT_MISSED; + + if (calcSpreadMove) + gBattleStruct->calculatedSpreadMoveAccuracy = TRUE; + JumpIfMoveFailed(7, move); } } @@ -1773,7 +1737,7 @@ static void Cmd_ppreduce(void) if (moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY || moveTarget == MOVE_TARGET_ALL_BATTLERS - || gMovesInfo[gCurrentMove].forcePressure) + || MoveForcesPressure(gCurrentMove)) { for (i = 0; i < gBattlersCount; i++) { @@ -1811,14 +1775,6 @@ static void Cmd_ppreduce(void) gHitMarker &= ~HITMARKER_NO_PPDEDUCT; gBattlescriptCurrInstr = cmd->nextInstr; - - if (ShouldTeraShellDistortTypeMatchups(gCurrentMove, gBattlerTarget)) - { - gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = TRUE; - gBattlerAbility = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TeraShellDistortingTypeMatchups; - } } // The chance is 1/N for each stage. @@ -1885,8 +1841,8 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA critChance = CRITICAL_HIT_BLOCKED; } else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS - || gMovesInfo[move].alwaysCriticalHit - || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) + || MoveAlwaysCrits(move) + || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) { critChance = CRITICAL_HIT_ALWAYS; } @@ -1894,7 +1850,7 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA { critChance = 2 * ((gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY) != 0) + 1 * ((gBattleMons[battlerAtk].status2 & STATUS2_DRAGON_CHEER) != 0) - + gMovesInfo[move].criticalHitStage + + GetMoveCriticalHitStage(move) + GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk) + 2 * (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerAtk) == AFFECTION_FIVE_HEARTS) + (abilityAtk == ABILITY_SUPER_LUCK) @@ -1928,7 +1884,7 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk) { s32 critChance = 0; - s32 moveCritStage = gMovesInfo[gCurrentMove].criticalHitStage; + s32 moveCritStage = GetMoveCriticalHitStage(gCurrentMove); s32 bonusCritStage = gBattleStruct->bonusCritStages[battlerAtk]; // G-Max Chi Strike u32 holdEffectCritStage = GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk); u16 baseSpeed = gSpeciesInfo[gBattleMons[battlerAtk].species].baseSpeed; @@ -1968,7 +1924,7 @@ s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec // Guaranteed crits else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS - || gMovesInfo[move].alwaysCriticalHit == TRUE + || MoveAlwaysCrits(move) || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) { critChance = CRITICAL_HIT_ALWAYS; @@ -1991,61 +1947,112 @@ static void Cmd_critcalc(void) { CMD_ARGS(); - u16 partySlot; - s32 critChance; + u32 partySlot = gBattlerPartyIndexes[gBattlerAttacker]; + u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - u32 abilityDef = GetBattlerAbility(gBattlerTarget); u32 holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) - critChance = CalcCritChanceStageGen1(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); - else - critChance = CalcCritChanceStage(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); - gPotentialItemEffectBattler = gBattlerAttacker; - if (gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) - gIsCriticalHit = FALSE; - else if (critChance == -1) - gIsCriticalHit = FALSE; - else if (critChance == -2) - gIsCriticalHit = TRUE; - else + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { + if (gBattleStruct->calculatedDamageDone) + break; + + if (!calcSpreadMoveDamage && battlerDef != gBattlerTarget) + continue; + + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) + || gBattleStruct->noResultString[battlerDef] + || gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) + continue; + + u32 abilityDef = GetBattlerAbility(battlerDef); + if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) - gIsCriticalHit = RandomChance(RNG_CRITICAL_HIT, critChance, 256); - else if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_2) - gIsCriticalHit = RandomChance(RNG_CRITICAL_HIT, GetCriticalHitOdds(critChance), 256); + gBattleStruct->critChance[battlerDef] = CalcCritChanceStageGen1(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); else - gIsCriticalHit = RandomChance(RNG_CRITICAL_HIT, 1, GetCriticalHitOdds(critChance)); + gBattleStruct->critChance[battlerDef] = CalcCritChanceStage(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); + + if (gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) + gSpecialStatuses[battlerDef].criticalHit = FALSE; + else if (gBattleStruct->critChance[battlerDef] == -1) + gSpecialStatuses[battlerDef].criticalHit = FALSE; + else if (gBattleStruct->critChance[battlerDef] == -2) + gSpecialStatuses[battlerDef].criticalHit = TRUE; + else + { + if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) + gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, gBattleStruct->critChance[battlerDef], 256); + else if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_2) + gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, GetCriticalHitOdds(gBattleStruct->critChance[battlerDef]), 256); + else + gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, 1, GetCriticalHitOdds(gBattleStruct->critChance[battlerDef])); + } + + // Counter for EVO_CRITICAL_HITS. + if (gSpecialStatuses[battlerDef].criticalHit && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER + && !(gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gBattlerAttacker) == B_POSITION_PLAYER_LEFT)) + gPartyCriticalHits[partySlot]++; } - // Counter for EVO_CRITICAL_HITS. - partySlot = gBattlerPartyIndexes[gBattlerAttacker]; - if (gIsCriticalHit && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER - && !(gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gBattlerAttacker) == B_POSITION_PLAYER_LEFT)) - gPartyCriticalHits[partySlot]++; - gBattlescriptCurrInstr = cmd->nextInstr; } +static inline void CalculateAndSetMoveDamage(struct DamageCalculationData *damageCalcData, u32 battlerDef) +{ + if (GetMoveEffect(gCurrentMove) == EFFECT_SHELL_SIDE_ARM) + gBattleStruct->swapDamageCategory = (gBattleStruct->shellSideArmCategory[gBattlerAttacker][battlerDef] != GetMoveCategory(gCurrentMove)); + + damageCalcData->battlerDef = battlerDef; + damageCalcData->isCrit = gSpecialStatuses[battlerDef].criticalHit; + gBattleStruct->moveDamage[battlerDef] = CalculateMoveDamage(damageCalcData, 0); + + // Slighly hacky but we need to check move result flags for distortion match-up as well but it can only be done after damage calcs + if (gSpecialStatuses[battlerDef].distortedTypeMatchups && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) + { + gSpecialStatuses[battlerDef].distortedTypeMatchups = FALSE; + gSpecialStatuses[battlerDef].teraShellAbilityDone = FALSE; + } +} + static void Cmd_damagecalc(void) { CMD_ARGS(); - if (gMovesInfo[gCurrentMove].effect == EFFECT_SHELL_SIDE_ARM) - gBattleStruct->swapDamageCategory = (gBattleStruct->shellSideArmCategory[gBattlerAttacker][gBattlerTarget] != gMovesInfo[gCurrentMove].category); + if (gBattleStruct->calculatedDamageDone) + { + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } + + u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); struct DamageCalculationData damageCalcData; damageCalcData.battlerAtk = gBattlerAttacker; - damageCalcData.battlerDef = gBattlerTarget; damageCalcData.move = gCurrentMove; - damageCalcData.moveType = GetMoveType(gCurrentMove); - damageCalcData.isCrit = gIsCriticalHit; + damageCalcData.moveType = GetBattleMoveType(gCurrentMove); damageCalcData.randomFactor = TRUE; damageCalcData.updateFlags = TRUE; - gBattleMoveDamage = CalculateMoveDamage(&damageCalcData, 0); + if (IsSpreadMove(moveTarget)) + { + u32 battlerDef; + for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) + || gBattleStruct->noResultString[battlerDef] + || gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) + continue; + + CalculateAndSetMoveDamage(&damageCalcData, battlerDef); + } + } + else + { + CalculateAndSetMoveDamage(&damageCalcData, gBattlerTarget); + } + gBattlescriptCurrInstr = cmd->nextInstr; } @@ -2053,8 +2060,11 @@ static void Cmd_typecalc(void) { CMD_ARGS(); - u32 moveType = GetMoveType(gCurrentMove); - CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget), TRUE); + if (!IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove))) // Handled in CANCELLER_MULTI_TARGET_MOVES for Spread Moves + { + u32 moveType = GetBattleMoveType(gCurrentMove); + CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget), TRUE); + } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -2064,135 +2074,123 @@ static void Cmd_adjustdamage(void) CMD_ARGS(); u8 holdEffect, param; - u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); + u32 battlerDef; u32 rand = Random() % 100; - u32 moveType = GetMoveType(gCurrentMove); + u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); + u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + u32 moveEffect = GetMoveEffect(gCurrentMove); + bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); - if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) - goto END; - if (DoesDisguiseBlockMove(gBattlerTarget, gCurrentMove)) + for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - gBattleStruct->enduredDamage |= 1u << gBattlerTarget; - goto END; - } - if (GetBattlerAbility(gBattlerTarget) == ABILITY_ICE_FACE && IS_MOVE_PHYSICAL(gCurrentMove) && gBattleMons[gBattlerTarget].species == SPECIES_EISCUE) - { - // Damage deals typeless 0 HP. - gMoveResultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE); - gBattleMoveDamage = 0; - RecordAbilityBattle(gBattlerTarget, ABILITY_ICE_FACE); - gBattleResources->flags->flags[gBattlerTarget] |= RESOURCE_FLAG_ICE_FACE; - // Form change will be done after attack animation in Cmd_resultmessage. - goto END; - } - if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) - goto END; + if (gBattleStruct->calculatedDamageDone) + break; - holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); - param = GetBattlerHoldEffectParam(gBattlerTarget); + if (!calcSpreadMoveDamage && battlerDef != gBattlerTarget) + continue; - gPotentialItemEffectBattler = gBattlerTarget; + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) + || gBattleStruct->noResultString[battlerDef]) + continue; - if (holdEffect == HOLD_EFFECT_FOCUS_BAND && rand < param) - { - RecordItemEffectBattle(gBattlerTarget, holdEffect); - gSpecialStatuses[gBattlerTarget].focusBanded = TRUE; - } - else if (B_STURDY >= GEN_5 && GetBattlerAbility(gBattlerTarget) == ABILITY_STURDY && BATTLER_MAX_HP(gBattlerTarget)) - { - RecordAbilityBattle(gBattlerTarget, ABILITY_STURDY); - gSpecialStatuses[gBattlerTarget].sturdied = TRUE; - } - else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && BATTLER_MAX_HP(gBattlerTarget)) - { - RecordItemEffectBattle(gBattlerTarget, holdEffect); - gSpecialStatuses[gBattlerTarget].focusSashed = TRUE; - } - else if (B_AFFECTION_MECHANICS == TRUE && GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER && affectionScore >= AFFECTION_THREE_HEARTS) - { - if ((affectionScore == AFFECTION_FIVE_HEARTS && rand < 20) - || (affectionScore == AFFECTION_FOUR_HEARTS && rand < 15) - || (affectionScore == AFFECTION_THREE_HEARTS && rand < 10)) - gSpecialStatuses[gBattlerTarget].affectionEndured = TRUE; + if (DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove)) + continue; + + if (DoesDisguiseBlockMove(battlerDef, gCurrentMove)) + { + gSpecialStatuses[battlerDef].enduredDamage = TRUE; + continue; + } + if (GetBattlerAbility(battlerDef) == ABILITY_ICE_FACE && IsBattleMovePhysical(gCurrentMove) && gBattleMons[battlerDef].species == SPECIES_EISCUE) + { + // Damage deals typeless 0 HP. + gBattleStruct->moveResultFlags[battlerDef] &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE); + gBattleStruct->moveDamage[battlerDef] = 0; + RecordAbilityBattle(gBattlerTarget, ABILITY_ICE_FACE); + gDisableStructs[battlerDef].iceFaceActivationPrevention = TRUE; + // Form change will be done after attack animation in Cmd_resultmessage. + continue; + } + if (gBattleMons[gBattlerTarget].hp > gBattleStruct->moveDamage[battlerDef]) + continue; + + holdEffect = GetBattlerHoldEffect(battlerDef, TRUE); + param = GetBattlerHoldEffectParam(battlerDef); + + gPotentialItemEffectBattler = battlerDef; + + if (holdEffect == HOLD_EFFECT_FOCUS_BAND && rand < param) + { + RecordItemEffectBattle(battlerDef, holdEffect); + gSpecialStatuses[battlerDef].focusBanded = TRUE; + } + else if (B_STURDY >= GEN_5 && GetBattlerAbility(battlerDef) == ABILITY_STURDY && IsBattlerAtMaxHp(battlerDef)) + { + RecordAbilityBattle(battlerDef, ABILITY_STURDY); + gSpecialStatuses[battlerDef].sturdied = TRUE; + } + else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && IsBattlerAtMaxHp(battlerDef)) + { + RecordItemEffectBattle(battlerDef, holdEffect); + gSpecialStatuses[battlerDef].focusSashed = TRUE; + } + else if (B_AFFECTION_MECHANICS == TRUE && GetBattlerSide(battlerDef) == B_SIDE_PLAYER && affectionScore >= AFFECTION_THREE_HEARTS) + { + if ((affectionScore == AFFECTION_FIVE_HEARTS && rand < 20) + || (affectionScore == AFFECTION_FOUR_HEARTS && rand < 15) + || (affectionScore == AFFECTION_THREE_HEARTS && rand < 10)) + gSpecialStatuses[battlerDef].affectionEndured = TRUE; + } + + if (moveEffect != EFFECT_FALSE_SWIPE + && !gProtectStructs[battlerDef].endured + && !gSpecialStatuses[battlerDef].focusBanded + && !gSpecialStatuses[battlerDef].focusSashed + && (B_AFFECTION_MECHANICS == FALSE || !gSpecialStatuses[battlerDef].affectionEndured) + && !gSpecialStatuses[battlerDef].sturdied) + continue; + + // Handle reducing the dmg to 1 hp. + gBattleStruct->moveDamage[battlerDef] = gBattleMons[battlerDef].hp - 1; + gSpecialStatuses[battlerDef].enduredDamage = TRUE; + + if (gProtectStructs[battlerDef].endured) + { + gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_ENDURED; + } + else if (gSpecialStatuses[battlerDef].focusBanded || gSpecialStatuses[battlerDef].focusSashed) + { + gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_HUNG_ON; + gLastUsedItem = gBattleMons[battlerDef].item; + gSpecialStatuses[battlerDef].focusBanded = FALSE; + gSpecialStatuses[battlerDef].focusSashed = FALSE; + } + else if (gSpecialStatuses[battlerDef].sturdied) + { + gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_STURDIED; + gLastUsedAbility = ABILITY_STURDY; + } + else if (B_AFFECTION_MECHANICS == TRUE && gSpecialStatuses[battlerDef].affectionEndured) + { + gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_ENDURED_AFFECTION; + } } - if (gMovesInfo[gCurrentMove].effect != EFFECT_FALSE_SWIPE - && !gProtectStructs[gBattlerTarget].endured - && !gSpecialStatuses[gBattlerTarget].focusBanded - && !gSpecialStatuses[gBattlerTarget].focusSashed - && (B_AFFECTION_MECHANICS == FALSE || !gSpecialStatuses[gBattlerTarget].affectionEndured) - && !gSpecialStatuses[gBattlerTarget].sturdied) - goto END; - - // Handle reducing the dmg to 1 hp. - gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; - gBattleStruct->enduredDamage |= 1u << gBattlerTarget; - - if (gProtectStructs[gBattlerTarget].endured) - { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; - } - else if (gSpecialStatuses[gBattlerTarget].focusBanded || gSpecialStatuses[gBattlerTarget].focusSashed) - { - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; - gLastUsedItem = gBattleMons[gBattlerTarget].item; - gSpecialStatuses[gBattlerTarget].focusBanded = FALSE; - gSpecialStatuses[gBattlerTarget].focusSashed = FALSE; - - } - else if (gSpecialStatuses[gBattlerTarget].sturdied) - { - gMoveResultFlags |= MOVE_RESULT_STURDIED; - gLastUsedAbility = ABILITY_STURDY; - } - else if (B_AFFECTION_MECHANICS == TRUE && gSpecialStatuses[gBattlerTarget].affectionEndured) - { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED_AFFECTION; - } - -END: + if (calcSpreadMoveDamage) + gBattleStruct->calculatedDamageDone = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMoveDamage >= 1) - gSpecialStatuses[gBattlerAttacker].damagedMons |= (1 << (gBattlerTarget)); - - // Check gems and damage reducing berries. - if (gSpecialStatuses[gBattlerTarget].berryReduced - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBattlerTarget].item) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryReduceDmg; - gLastUsedItem = gBattleMons[gBattlerTarget].item; - } if (gSpecialStatuses[gBattlerAttacker].gemBoost - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleMons[gBattlerAttacker].item - && gMovesInfo[gCurrentMove].effect != EFFECT_PLEDGE + && moveEffect != EFFECT_PLEDGE && gCurrentMove != MOVE_STRUGGLE) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_GemActivates; gLastUsedItem = gBattleMons[gBattlerAttacker].item; } - - // B_WEATHER_STRONG_WINDS prints a string when it's about to reduce the power - // of a move that is Super Effective against a Flying-type Pokémon. - if (gBattleWeather & B_WEATHER_STRONG_WINDS) - { - if ((GetBattlerType(gBattlerTarget, 0, FALSE) == TYPE_FLYING - && GetTypeModifier(moveType, GetBattlerType(gBattlerTarget, 0, FALSE)) >= UQ_4_12(2.0)) - || (GetBattlerType(gBattlerTarget, 1, FALSE) == TYPE_FLYING - && GetTypeModifier(moveType, GetBattlerType(gBattlerTarget, 1, FALSE)) >= UQ_4_12(2.0)) - || (GetBattlerType(gBattlerTarget, 2, FALSE) == TYPE_FLYING - && GetTypeModifier(moveType, GetBattlerType(gBattlerTarget, 2, FALSE)) >= UQ_4_12(2.0))) - { - gBattlerAbility = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackWeakenedByStrongWinds; - } - } } static void Cmd_multihitresultmessage(void) @@ -2202,21 +2200,22 @@ static void Cmd_multihitresultmessage(void) if (gBattleControllerExecFlags) return; - if (!(gMoveResultFlags & MOVE_RESULT_FAILED) && !(gMoveResultFlags & MOVE_RESULT_FOE_ENDURED)) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FOE_ENDURED)) { - if (gMoveResultFlags & MOVE_RESULT_STURDIED) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_STURDIED) { - gMoveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); + gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); gSpecialStatuses[gBattlerTarget].sturdied = FALSE; // Delete this line to make Sturdy last for the duration of the whole move turn. BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SturdiedMsg; return; } - else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON) + else if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FOE_HUNG_ON) { gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; - gMoveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); + gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); gSpecialStatuses[gBattlerTarget].focusBanded = FALSE; // Delete this line to make Focus Band last for the duration of the whole move turn. gSpecialStatuses[gBattlerTarget].focusSashed = FALSE; // Delete this line to make Focus Sash last for the duration of the whole move turn. BattleScriptPushCursor(); @@ -2225,33 +2224,172 @@ static void Cmd_multihitresultmessage(void) } } gBattlescriptCurrInstr = cmd->nextInstr; +} - // Print berry reducing message after result message. - if (gSpecialStatuses[gBattlerTarget].berryReduced - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) +static inline bool32 DoesBattlerNegateDamage(u32 battler) +{ + u32 species = gBattleMons[battler].species; + u32 ability = GetBattlerAbility(battler); + + if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + return FALSE; + if (ability == ABILITY_DISGUISE && species == SPECIES_MIMIKYU) + return TRUE; + if (ability == ABILITY_ICE_FACE && species == SPECIES_EISCUE && GetBattleMoveCategory(gCurrentMove) == DAMAGE_CATEGORY_PHYSICAL) + return TRUE; + + return FALSE; +} + +static u32 UpdateEffectivenessResultFlagsForDoubleSpreadMoves(u32 resultFlags) +{ + // Only play the "best" sound + for (u32 sound = 0; sound < 3; sound++) { - gBattleStruct->ateBerry[gBattlerTarget & BIT_SIDE] |= 1u << gBattlerPartyIndexes[gBattlerTarget]; - gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString; + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if ((gBattleStruct->moveResultFlags[battlerDef] & (MOVE_RESULT_MISSED | MOVE_RESULT_NO_EFFECT) + || gBattleStruct->noResultString[battlerDef])) + continue; + + switch (sound) + { + case 0: + if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_SUPER_EFFECTIVE + && !DoesBattlerNegateDamage(battlerDef)) + return gBattleStruct->moveResultFlags[battlerDef]; + break; + case 1: + if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NOT_VERY_EFFECTIVE + && !DoesBattlerNegateDamage(battlerDef)) + return gBattleStruct->moveResultFlags[battlerDef]; + break; + case 2: + if (DoesBattlerNegateDamage(battlerDef)) + return 0; //Normal effectiveness + return gBattleStruct->moveResultFlags[battlerDef]; + } + } } + + return resultFlags; +} + +static inline bool32 TryStrongWindsWeakenAttack(u32 battlerDef, u32 moveType) +{ + if (gBattleWeather & B_WEATHER_STRONG_WINDS && HasWeatherEffect()) + { + if (GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS + && IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING) + && gTypeEffectivenessTable[moveType][TYPE_FLYING] >= UQ_4_12(2.0) + && !gBattleStruct->printedStrongWindsWeakenedAttack) + { + gBattleStruct->printedStrongWindsWeakenedAttack = TRUE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AttackWeakenedByStrongWinds; + return TRUE; + } + } + + return FALSE; +} + +static inline bool32 TryTeraShellDistortTypeMatchups(u32 battlerDef) +{ + if (gSpecialStatuses[battlerDef].teraShellAbilityDone) + { + gSpecialStatuses[battlerDef].teraShellAbilityDone = FALSE; + gBattleScripting.battler = battlerDef; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TeraShellDistortingTypeMatchups; + return TRUE; + } + return FALSE; +} + +// According to Gen5 Weakness berry activation happens after the attackanimation. +// It doesn't have any impact on gameplay and is only a visual thing which can be adjusted later. +static inline bool32 TryActivateWeakenessBerry(u32 battlerDef) +{ + if (gSpecialStatuses[battlerDef].berryReduced && gBattleMons[battlerDef].item != ITEM_NONE) + { + gSpecialStatuses[battlerDef].berryReduced = FALSE; + gBattleScripting.battler = battlerDef; + gLastUsedItem = gBattleMons[battlerDef].item; + gBattleStruct->ateBerry[battlerDef & BIT_SIDE] |= 1u << gBattlerPartyIndexes[battlerDef]; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryReduceDmg; + return TRUE; + } + + return FALSE; +} + +static bool32 ProcessPreAttackAnimationFuncs(void) +{ + u32 moveType = GetBattleMoveType(gCurrentMove); + if (IsDoubleSpreadMove()) + { + u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + if (!gBattleStruct->printedStrongWindsWeakenedAttack) + { + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) + || (battlerDef == BATTLE_PARTNER(gBattlerAttacker) && !(moveTarget & MOVE_TARGET_FOES_AND_ALLY)) + || (gBattleStruct->noResultString[battlerDef] && gBattleStruct->noResultString[battlerDef] != DO_ACCURACY_CHECK)) + continue; + + if (TryStrongWindsWeakenAttack(battlerDef, moveType)) + return TRUE; + } + } + + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) + || (battlerDef == BATTLE_PARTNER(gBattlerAttacker) && !(moveTarget & MOVE_TARGET_FOES_AND_ALLY)) + || (gBattleStruct->noResultString[battlerDef] && gBattleStruct->noResultString[battlerDef] != DO_ACCURACY_CHECK)) + continue; + + if (TryTeraShellDistortTypeMatchups(battlerDef)) + return TRUE; + if (TryActivateWeakenessBerry(battlerDef)) + return TRUE; + } + } + else + { + if (TryStrongWindsWeakenAttack(gBattlerTarget, moveType)) + return TRUE; + if (TryTeraShellDistortTypeMatchups(gBattlerTarget)) + return TRUE; + if (TryActivateWeakenessBerry(gBattlerTarget)) + return TRUE; + } + + return FALSE; } static void Cmd_attackanimation(void) { CMD_ARGS(); - u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - - if (gBattleControllerExecFlags) + if (gBattleControllerExecFlags || ProcessPreAttackAnimationFuncs()) return; + u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + u32 moveResultFlags = gBattleStruct->moveResultFlags[gBattlerTarget]; + + if (IsDoubleSpreadMove()) + moveResultFlags = UpdateEffectivenessResultFlagsForDoubleSpreadMoves(gBattleStruct->moveResultFlags[gBattlerTarget]); + if ((gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) && gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE && gCurrentMove != MOVE_ALLY_SWITCH // In a wild double battle gotta use the teleport animation if two wild pokemon are alive. - && !(gMovesInfo[gCurrentMove].effect == EFFECT_TELEPORT && WILD_DOUBLE_BATTLE && GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT && IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)))) + && !(GetMoveEffect(gCurrentMove) == EFFECT_TELEPORT && WILD_DOUBLE_BATTLE && GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT && IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)))) { BattleScriptPush(cmd->nextInstr); gBattlescriptCurrInstr = BattleScript_Pausex20; @@ -2279,17 +2417,16 @@ static void Cmd_attackanimation(void) if (gMovesInfo[gCurrentMove].effect == EFFECT_EXPANDING_FORCE && moveTarget & MOVE_TARGET_BOTH && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, BATTLE_OPPOSITE(gBattlerAttacker) > 1)) gBattleScripting.animTurn = 1; - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (!(moveResultFlags & MOVE_RESULT_NO_EFFECT)) { - u8 multihit; - + u32 multihit; if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) { multihit = gMultiHitCounter; } else if (gMultiHitCounter != 0 && gMultiHitCounter != 1) { - if (gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage) + if (gBattleMons[gBattlerTarget].hp <= gBattleStruct->moveDamage[gBattlerTarget]) multihit = 1; else multihit = gMultiHitCounter; @@ -2299,7 +2436,15 @@ static void Cmd_attackanimation(void) multihit = gMultiHitCounter; } - BtlController_EmitMoveAnimation(gBattlerAttacker, BUFFER_A, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker], multihit); + BtlController_EmitMoveAnimation(gBattlerAttacker, + BUFFER_A, + gCurrentMove, + gBattleScripting.animTurn, + gBattleMovePower, + gBattleStruct->moveDamage[gBattlerTarget], + gBattleMons[gBattlerAttacker].friendship, + &gDisableStructs[gBattlerAttacker], + multihit); gBattleScripting.animTurn++; gBattleScripting.animTargetsHit++; MarkBattlerForControllerExec(gBattlerAttacker); @@ -2321,32 +2466,71 @@ static void Cmd_waitanimation(void) gBattlescriptCurrInstr = cmd->nextInstr; } +static void DoublesHPBarReduction(void) +{ + if (gBattleStruct->doneDoublesSpreadHit + || gHitMarker & (HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE)) + return; + + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT + || gBattleStruct->moveDamage[battlerDef] == 0 + || gBattleStruct->noResultString[battlerDef] + || DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove) + || DoesDisguiseBlockMove(battlerDef, gCurrentMove)) + continue; + + s32 currDmg = gBattleStruct->moveDamage[battlerDef]; + s32 healthValue = min(currDmg, 10000); // Max damage (10000) not present in R/S, ensures that huge damage values don't change sign + BtlController_EmitHealthBarUpdate(battlerDef, BUFFER_A, healthValue); + MarkBattlerForControllerExec(battlerDef); + + if (GetBattlerSide(battlerDef) == B_SIDE_PLAYER && currDmg > 0) + gBattleResults.playerMonWasDamaged = TRUE; + } + + gBattleStruct->doneDoublesSpreadHit = TRUE; +} + static void Cmd_healthbarupdate(void) { CMD_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); if (gBattleControllerExecFlags) return; - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) { - u32 battler = GetBattlerForBattleScript(cmd->battler); - if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, battler); + if (IsDoubleSpreadMove()) + DoublesHPBarReduction(); } else if (!DoesDisguiseBlockMove(battler, gCurrentMove)) { - s16 healthValue = min(gBattleMoveDamage, 10000); // Max damage (10000) not present in R/S, ensures that huge damage values don't change sign + if (IsDoubleSpreadMove()) + { + DoublesHPBarReduction(); + } + else + { + s16 healthValue = min(gBattleStruct->moveDamage[battler], 10000); // Max damage (10000) not present in R/S, ensures that huge damage values don't change sign - BtlController_EmitHealthBarUpdate(battler, BUFFER_A, healthValue); - MarkBattlerForControllerExec(battler); + BtlController_EmitHealthBarUpdate(battler, BUFFER_A, healthValue); + MarkBattlerForControllerExec(battler); - if (GetBattlerSide(battler) == B_SIDE_PLAYER && gBattleMoveDamage > 0) - gBattleResults.playerMonWasDamaged = TRUE; + if (GetBattlerSide(battler) == B_SIDE_PLAYER && gBattleStruct->moveDamage[battler] > 0) + gBattleResults.playerMonWasDamaged = TRUE; + } } } + else if (IsDoubleSpreadMove()) + { + DoublesHPBarReduction(); + } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -2356,28 +2540,22 @@ static void Cmd_datahpupdate(void) { CMD_ARGS(u8 battler); - u32 battler; - if (gBattleControllerExecFlags) return; - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_DAMAGE)) { - battler = GetBattlerForBattleScript(cmd->battler); if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { - if (gDisableStructs[battler].substituteHP >= gBattleMoveDamage) + if (gDisableStructs[battler].substituteHP >= gBattleStruct->moveDamage[battler]) { - if (gSpecialStatuses[battler].shellBellDmg == 0) - gSpecialStatuses[battler].shellBellDmg = gBattleMoveDamage; - gDisableStructs[battler].substituteHP -= gBattleMoveDamage; - gHpDealt = gBattleMoveDamage; + gDisableStructs[battler].substituteHP -= gBattleStruct->moveDamage[battler]; } else { - if (gSpecialStatuses[battler].shellBellDmg == 0) - gSpecialStatuses[battler].shellBellDmg = gDisableStructs[battler].substituteHP; - gHpDealt = gDisableStructs[battler].substituteHP; + gBattleStruct->moveDamage[battler] = gDisableStructs[battler].substituteHP; gDisableStructs[battler].substituteHP = 0; } // check substitute fading @@ -2401,7 +2579,7 @@ static void Cmd_datahpupdate(void) else gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED; if (B_DISGUISE_HP_LOSS >= GEN_8) - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; BattleScriptPush(cmd->nextInstr); gBattlescriptCurrInstr = BattleScript_TargetFormChange; return; @@ -2409,10 +2587,10 @@ static void Cmd_datahpupdate(void) else { gHitMarker &= ~HITMARKER_IGNORE_SUBSTITUTE; - if (gBattleMoveDamage < 0) + if (gBattleStruct->moveDamage[battler] < 0) { // Negative damage is HP gain - gBattleMons[battler].hp += -gBattleMoveDamage; + gBattleMons[battler].hp += -gBattleStruct->moveDamage[battler]; if (gBattleMons[battler].hp > gBattleMons[battler].maxHP) gBattleMons[battler].hp = gBattleMons[battler].maxHP; } @@ -2424,7 +2602,7 @@ static void Cmd_datahpupdate(void) } else { - gBideDmg[battler] += gBattleMoveDamage; + gBideDmg[battler] += gBattleStruct->moveDamage[battler]; if (cmd->battler == BS_TARGET) gBideTarget[battler] = gBattlerAttacker; else @@ -2432,33 +2610,25 @@ static void Cmd_datahpupdate(void) } // Deal damage to the battler - if (gBattleMons[battler].hp > gBattleMoveDamage) + if (gBattleMons[battler].hp > gBattleStruct->moveDamage[battler]) { - gBattleMons[battler].hp -= gBattleMoveDamage; - gHpDealt = gBattleMoveDamage; + gBattleMons[battler].hp -= gBattleStruct->moveDamage[battler]; } else { - gHpDealt = gBattleMons[battler].hp; + gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; gBattleMons[battler].hp = 0; } - // Record damage for Shell Bell - if (gSpecialStatuses[gBattlerTarget].shellBellDmg == IGNORE_SHELL_BELL) - gSpecialStatuses[battler].shellBellDmg = 0; - else if (gSpecialStatuses[battler].shellBellDmg == 0 && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) - gSpecialStatuses[battler].shellBellDmg = gHpDealt; - - // Record damage for foreseen moves - gWishFutureKnock.futureSightDmg = gHpDealt; + u32 effect = GetMoveEffect(gCurrentMove); // Note: While physicalDmg/specialDmg below are only distinguished between for Counter/Mirror Coat, they are // used in combination as general damage trackers for other purposes. specialDmg is additionally used // to help determine if a fire move should defrost the target. - if (IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gMovesInfo[gCurrentMove].effect != EFFECT_PAIN_SPLIT) + if (IsBattleMovePhysical(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && effect != EFFECT_PAIN_SPLIT) { - gProtectStructs[battler].physicalDmg = gHpDealt; - gSpecialStatuses[battler].physicalDmg = gHpDealt; + gProtectStructs[battler].physicalDmg = gBattleStruct->moveDamage[battler]; + gSpecialStatuses[battler].physicalDmg = gBattleStruct->moveDamage[battler]; if (cmd->battler == BS_TARGET) { gProtectStructs[battler].physicalBattlerId = gBattlerAttacker; @@ -2470,11 +2640,11 @@ static void Cmd_datahpupdate(void) gSpecialStatuses[battler].physicalBattlerId = gBattlerTarget; } } - else if (!IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gMovesInfo[gCurrentMove].effect != EFFECT_PAIN_SPLIT) + else if (!IsBattleMovePhysical(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && effect != EFFECT_PAIN_SPLIT) { // Record special damage/attacker for Mirror Coat - gProtectStructs[battler].specialDmg = gHpDealt; - gSpecialStatuses[battler].specialDmg = gHpDealt; + gProtectStructs[battler].specialDmg = gBattleStruct->moveDamage[battler]; + gSpecialStatuses[battler].specialDmg = gBattleStruct->moveDamage[battler]; if (cmd->battler == BS_TARGET) { gProtectStructs[battler].specialBattlerId = gBattlerAttacker; @@ -2488,19 +2658,12 @@ static void Cmd_datahpupdate(void) } } gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE; - // Send updated HP BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[battler].hp), &gBattleMons[battler].hp); MarkBattlerForControllerExec(battler); } } - else - { - // MOVE_RESULT_NO_EFFECT was set - battler = GetBattlerForBattleScript(cmd->battler); - if (gSpecialStatuses[battler].shellBellDmg == 0) - gSpecialStatuses[battler].shellBellDmg = IGNORE_SHELL_BELL; - } + gBattlescriptCurrInstr = cmd->nextInstr; } @@ -2510,13 +2673,12 @@ static void Cmd_critmessage(void) if (gBattleControllerExecFlags == 0) { - if (gIsCriticalHit == TRUE && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (gSpecialStatuses[gBattlerTarget].criticalHit && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker); - // Signal for the trainer slide-in system. - if (GetBattlerSide(gBattlerTarget) != B_SIDE_PLAYER && gBattleStruct->trainerSlideFirstCriticalHitMsgState != 2) - gBattleStruct->trainerSlideFirstCriticalHitMsgState = 1; + TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(gBattlerTarget); + TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(gBattlerTarget); gBattleCommunication[MSG_DISPLAY] = 1; } @@ -2531,9 +2693,25 @@ static void Cmd_effectivenesssound(void) if (gBattleControllerExecFlags) return; - if (!(gMoveResultFlags & MOVE_RESULT_MISSED)) + u32 moveResultFlags = gBattleStruct->moveResultFlags[gBattlerTarget]; + + if (IsDoubleSpreadMove()) { - switch (gMoveResultFlags & ~MOVE_RESULT_MISSED) + if (gBattleStruct->doneDoublesSpreadHit + || !gBattleStruct->calculatedDamageDone //The attack animation didn't play yet - only play sound after animation + || GetBattleMoveCategory(gCurrentMove) == DAMAGE_CATEGORY_STATUS) //To handle Dark Void missing basically + { + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } + moveResultFlags = UpdateEffectivenessResultFlagsForDoubleSpreadMoves(gBattleStruct->moveResultFlags[gBattlerTarget]); + } + else if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && DoesBattlerNegateDamage(gBattlerTarget)) + moveResultFlags = 0; + + if (!(moveResultFlags & MOVE_RESULT_MISSED)) + { + switch (moveResultFlags & ~MOVE_RESULT_MISSED) { case MOVE_RESULT_SUPER_EFFECTIVE: BtlController_EmitPlaySE(gBattlerTarget, BUFFER_A, SE_SUPER_EFFECTIVE); @@ -2552,17 +2730,17 @@ static void Cmd_effectivenesssound(void) case MOVE_RESULT_FOE_HUNG_ON: case MOVE_RESULT_STURDIED: default: - if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) + if (moveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) { BtlController_EmitPlaySE(gBattlerTarget, BUFFER_A, SE_SUPER_EFFECTIVE); MarkBattlerForControllerExec(gBattlerTarget); } - else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) + else if (moveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) { BtlController_EmitPlaySE(gBattlerTarget, BUFFER_A, SE_NOT_EFFECTIVE); MarkBattlerForControllerExec(gBattlerTarget); } - else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) + else if (!(moveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) { BtlController_EmitPlaySE(gBattlerTarget, BUFFER_A, SE_EFFECTIVE); MarkBattlerForControllerExec(gBattlerTarget); @@ -2573,20 +2751,36 @@ static void Cmd_effectivenesssound(void) gBattlescriptCurrInstr = cmd->nextInstr; } +static inline bool32 ShouldPrintTwoFoesMessage(u32 moveResult) +{ + return gBattlerTarget == BATTLE_OPPOSITE(gBattlerAttacker) + && gBattleStruct->moveResultFlags[BATTLE_PARTNER(gBattlerTarget)] & moveResult + && !gBattleStruct->noResultString[BATTLE_PARTNER(gBattlerTarget)]; +} + +static inline bool32 ShouldRelyOnTwoFoesMessage(u32 moveResult) +{ + return gBattlerTarget == BATTLE_PARTNER(BATTLE_OPPOSITE(gBattlerAttacker)) + && gBattleStruct->moveResultFlags[BATTLE_OPPOSITE(gBattlerAttacker)] & moveResult + && !(gBattleStruct->moveResultFlags[BATTLE_OPPOSITE(gBattlerAttacker)] & MOVE_RESULT_MISSED && gBattleStruct->missStringId[BATTLE_OPPOSITE(gBattlerAttacker)] > B_MSG_AVOIDED_ATK) + && !gBattleStruct->noResultString[BATTLE_OPPOSITE(gBattlerAttacker)]; +} + static void Cmd_resultmessage(void) { CMD_ARGS(); u32 stringId = 0; + u16 *moveResultFlags = &gBattleStruct->moveResultFlags[gBattlerTarget]; if (gBattleControllerExecFlags) return; // TODO: Convert this to a proper FORM_CHANGE type. // Do Ice Face form change which was set up in Cmd_adjustdamage. - if (gBattleResources->flags->flags[gBattlerTarget] & RESOURCE_FLAG_ICE_FACE) + if (gDisableStructs[gBattlerTarget].iceFaceActivationPrevention) { - gBattleResources->flags->flags[gBattlerTarget] &= ~(RESOURCE_FLAG_ICE_FACE); + gDisableStructs[gBattlerTarget].iceFaceActivationPrevention = FALSE; gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE; gBattleScripting.battler = gBattlerTarget; // For STRINGID_PKMNTRANSFORMED BattleScriptPushCursor(); @@ -2594,47 +2788,59 @@ static void Cmd_resultmessage(void) return; } - if (gMoveResultFlags & MOVE_RESULT_MISSED && !(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) + if (*moveResultFlags & MOVE_RESULT_MISSED + && (!(*moveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleStruct->missStringId[gBattlerTarget] > B_MSG_AVOIDED_ATK)) { - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_BLUNDER_POLICY - && !IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove)) - gBattleStruct->blunderPolicy = TRUE; // Only activates from missing through acc/evasion checks - } - - if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK)) - { - if (gMultiHitCounter && gMultiHitCounter < gMovesInfo[gCurrentMove].strikeCount) + if (gMultiHitCounter && gMultiHitCounter < GetMoveStrikeCount(gCurrentMove)) { gMultiHitCounter = 0; - gMoveResultFlags &= ~MOVE_RESULT_MISSED; + *moveResultFlags &= ~MOVE_RESULT_MISSED; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; return; } - if (gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate - show the ability pop-up - CreateAbilityPopUp(gBattlerTarget, gBattleMons[gBattlerTarget].ability, (IsDoubleBattle()) != 0); - stringId = gMissStringIds[gBattleCommunication[MISS_TYPE]]; + if (gBattleStruct->missStringId[gBattlerTarget] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate - show the ability pop-up + CreateAbilityPopUp(gBattlerTarget, gBattleMons[gBattlerTarget].ability, IsDoubleBattle()); gBattleCommunication[MSG_DISPLAY] = 1; + stringId = gMissStringIds[gBattleStruct->missStringId[gBattlerTarget]]; } else { gBattleCommunication[MSG_DISPLAY] = 1; - switch (gMoveResultFlags & ~MOVE_RESULT_MISSED) + switch (*moveResultFlags & ~MOVE_RESULT_MISSED) { case MOVE_RESULT_SUPER_EFFECTIVE: - if (!gMultiHitCounter) // Don't print effectiveness on each hit in a multi hit attack + if (IsDoubleSpreadMove()) + { + if (ShouldPrintTwoFoesMessage(MOVE_RESULT_SUPER_EFFECTIVE)) + stringId = STRINGID_SUPEREFFECTIVETWOFOES; + else if (ShouldRelyOnTwoFoesMessage(MOVE_RESULT_SUPER_EFFECTIVE)) + stringId = 0; // Was handled or will be handled as a double string + else + stringId = STRINGID_SUPEREFFECTIVE; + } + else if (!gMultiHitCounter) // Don't print effectiveness on each hit in a multi hit attack { - // Signal for the trainer slide-in system. - if (GetBattlerSide(gBattlerTarget) != B_SIDE_PLAYER && gBattleStruct->trainerSlideFirstSuperEffectiveHitMsgState != 2) - gBattleStruct->trainerSlideFirstSuperEffectiveHitMsgState = 1; - stringId = STRINGID_SUPEREFFECTIVE; } + if (stringId == STRINGID_SUPEREFFECTIVE || stringId == STRINGID_SUPEREFFECTIVETWOFOES) + TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(gBattlerTarget); break; case MOVE_RESULT_NOT_VERY_EFFECTIVE: - if (!gMultiHitCounter) + if (IsDoubleSpreadMove()) + { + if (ShouldPrintTwoFoesMessage(MOVE_RESULT_NOT_VERY_EFFECTIVE)) + stringId = STRINGID_NOTVERYEFFECTIVETWOFOES; + else if (ShouldRelyOnTwoFoesMessage(MOVE_RESULT_NOT_VERY_EFFECTIVE)) + stringId = 0; // Was handled or will be handled as a double string + else + stringId = STRINGID_NOTVERYEFFECTIVE; // Needs a string + } + else if (!gMultiHitCounter) + { stringId = STRINGID_NOTVERYEFFECTIVE; + } break; case MOVE_RESULT_ONE_HIT_KO: stringId = STRINGID_ONEHITKO; @@ -2646,86 +2852,85 @@ static void Cmd_resultmessage(void) stringId = STRINGID_BUTITFAILED; break; case MOVE_RESULT_DOESNT_AFFECT_FOE: - stringId = STRINGID_ITDOESNTAFFECT; + if (IsDoubleSpreadMove()) + { + if (ShouldPrintTwoFoesMessage(MOVE_RESULT_DOESNT_AFFECT_FOE)) + { + stringId = STRINGID_ITDOESNTAFFECTTWOFOES; + } + else if (ShouldRelyOnTwoFoesMessage(MOVE_RESULT_DOESNT_AFFECT_FOE)) + { + stringId = 0; // Was handled or will be handled as a double string + } + else + stringId = STRINGID_ITDOESNTAFFECT; + } + else + { + stringId = STRINGID_ITDOESNTAFFECT; + } break; case MOVE_RESULT_FOE_HUNG_ON: gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); + *moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_HangedOnMsg; return; default: - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) + if (*moveResultFlags & MOVE_RESULT_ONE_HIT_KO) { - stringId = STRINGID_ITDOESNTAFFECT; - } - else if (gMoveResultFlags & MOVE_RESULT_ONE_HIT_KO) - { - gMoveResultFlags &= ~MOVE_RESULT_ONE_HIT_KO; - gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; + *moveResultFlags &= ~MOVE_RESULT_ONE_HIT_KO; + *moveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; + *moveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; return; } - else if (gMoveResultFlags & MOVE_RESULT_STURDIED) + else if (*moveResultFlags & MOVE_RESULT_STURDIED) { - gMoveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); + *moveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); gSpecialStatuses[gBattlerTarget].sturdied = FALSE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SturdiedMsg; return; } - else if (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED) + else if (*moveResultFlags & MOVE_RESULT_FOE_ENDURED) { - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); + *moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_EnduredMsg; return; } - else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON) + else if (*moveResultFlags & MOVE_RESULT_FOE_HUNG_ON) { gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; - gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); + *moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_HangedOnMsg; return; } - else if (gMoveResultFlags & MOVE_RESULT_FAILED) + else if (*moveResultFlags & MOVE_RESULT_FAILED) { stringId = STRINGID_BUTITFAILED; } - else if (B_AFFECTION_MECHANICS == TRUE && (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED_AFFECTION)) + else if (B_AFFECTION_MECHANICS == TRUE && (*moveResultFlags & MOVE_RESULT_FOE_ENDURED_AFFECTION)) { gSpecialStatuses[gBattlerTarget].affectionEndured = FALSE; - gMoveResultFlags &= ~MOVE_RESULT_FOE_ENDURED_AFFECTION; + *moveResultFlags &= ~MOVE_RESULT_FOE_ENDURED_AFFECTION; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_AffectionBasedEndurance; return; } - else - { - gBattleCommunication[MSG_DISPLAY] = 0; - } } } - if (stringId) PrepareStringBattle(stringId, gBattlerAttacker); + else + gBattleCommunication[MSG_DISPLAY] = 0; gBattlescriptCurrInstr = cmd->nextInstr; - - // Print berry reducing message after result message. - if (gSpecialStatuses[gBattlerTarget].berryReduced - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - gBattleStruct->ateBerry[gBattlerTarget & BIT_SIDE] |= 1u << gBattlerPartyIndexes[gBattlerTarget]; - gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString; - } } static void Cmd_printstring(void) @@ -2825,7 +3030,7 @@ static void CheckSetUnburden(u8 battler) { if (GetBattlerAbility(battler) == ABILITY_UNBURDEN) { - gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_UNBURDEN; + gDisableStructs[battler].unburdenActive = TRUE; RecordAbilityBattle(battler, ABILITY_UNBURDEN); } } @@ -2847,7 +3052,8 @@ void StealTargetItem(u8 battlerStealer, u8 battlerItem) { RecordItemEffectBattle(battlerStealer, ItemId_GetHoldEffect(gLastUsedItem)); gBattleMons[battlerStealer].item = gLastUsedItem; - gBattleResources->flags->flags[battlerStealer] &= ~RESOURCE_FLAG_UNBURDEN; + + gDisableStructs[battlerStealer].unburdenActive = FALSE; BtlController_EmitSetMonData(battlerStealer, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem); // set attacker item MarkBattlerForControllerExec(battlerStealer); } @@ -2863,6 +3069,50 @@ void StealTargetItem(u8 battlerStealer, u8 battlerItem) TrySaveExchangedItem(battlerItem, gLastUsedItem); } +static inline bool32 TrySetReflect(u32 battler) +{ + u32 side = GetBattlerSide(battler); + if (!(gSideStatuses[side] & SIDE_STATUS_REFLECT)) + { + gSideStatuses[side] |= SIDE_STATUS_REFLECT; + if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[side].reflectTimer = gBattleTurnCounter + 8; + else + gSideTimers[side].reflectTimer = gBattleTurnCounter + 5; + gSideTimers[side].reflectBattlerId = battler; + + if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, battler) == 2) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE; + + return TRUE; + } + return FALSE; +} + +static inline bool32 TrySetLightScreen(u32 battler) +{ + u32 side = GetBattlerSide(battler); + if (!(gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN)) + { + gSideStatuses[side] |= SIDE_STATUS_LIGHTSCREEN; + if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 8; + else + gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 5; + gSideTimers[side].lightscreenBattlerId = battler; + + if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, battler) == 2) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE; + + return TRUE; + } + return FALSE; +} + #define INCREMENT_RESET_RETURN \ { \ gBattlescriptCurrInstr++; \ @@ -2883,7 +3133,6 @@ void SetMoveEffect(bool32 primary, bool32 certain) bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); u32 flags = 0; u32 battlerAbility; - u32 side; bool8 activateAfterFaint = FALSE; // NULL move effect @@ -2935,15 +3184,9 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattleScripting.moveEffect &= ~MOVE_EFFECT_CERTAIN; if (!primary && affectsUser != MOVE_EFFECT_AFFECTS_USER - && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && (battlerAbility == ABILITY_SHIELD_DUST || GetBattlerHoldEffect(gEffectBattler, TRUE) == HOLD_EFFECT_COVERT_CLOAK)) - { - if (battlerAbility == ABILITY_SHIELD_DUST) - RecordAbilityBattle(gEffectBattler, battlerAbility); - else - RecordItemEffectBattle(gEffectBattler, HOLD_EFFECT_COVERT_CLOAK); + && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) + && IsMoveEffectBlockedByTarget(battlerAbility)) INCREMENT_RESET_RETURN - } if (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && !primary && gBattleScripting.moveEffect <= MOVE_EFFECT_CONFUSION) @@ -2951,7 +3194,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) if (!(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove) - && !(gMovesInfo[gCurrentMove].effect == EFFECT_ORDER_UP && gBattleStruct->commanderActive[gBattlerAttacker]) + && !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->commanderActive[gBattlerAttacker]) && !primary && gBattleScripting.moveEffect != MOVE_EFFECT_CHARGING) INCREMENT_RESET_RETURN @@ -2981,7 +3224,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) if (i != gBattlersCount) break; - if (!CanBeSlept(gEffectBattler, GetBattlerAbility(gEffectBattler))) + if (!CanBeSlept(gEffectBattler, GetBattlerAbility(gEffectBattler), BLOCKED_BY_SLEEP_CLAUSE) && !gBattleStruct->battlerState[gEffectBattler].sleepClauseEffectExempt) break; cancelMultiTurnMovesResult = CancelMultiTurnMoves(gEffectBattler); @@ -3058,7 +3301,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) if (B_STATUS_TYPE_IMMUNITY == GEN_1) { - u32 moveType = GetMoveType(gCurrentMove); + u32 moveType = GetBattleMoveType(gCurrentMove); if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } @@ -3071,7 +3314,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) case STATUS1_FREEZE: if (B_STATUS_TYPE_IMMUNITY == GEN_1) { - u32 moveType = GetMoveType(gCurrentMove); + u32 moveType = GetBattleMoveType(gCurrentMove); if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } @@ -3112,7 +3355,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) } if (B_STATUS_TYPE_IMMUNITY == GEN_1) { - u32 moveType = GetMoveType(gCurrentMove); + u32 moveType = GetBattleMoveType(gCurrentMove); if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } @@ -3176,13 +3419,13 @@ void SetMoveEffect(bool32 primary, bool32 certain) } else { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_DOESNT_AFFECT_FOE; } break; case STATUS1_FROSTBITE: if (B_STATUS_TYPE_IMMUNITY == GEN_1) { - u32 moveType = GetMoveType(gCurrentMove); + u32 moveType = GetBattleMoveType(gCurrentMove); if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } @@ -3202,6 +3445,8 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattleMons[gEffectBattler].status1 |= STATUS1_SLEEP_TURN(1 + RandomUniform(RNG_SLEEP_TURNS, 1, 3)); else gBattleMons[gEffectBattler].status1 |= STATUS1_SLEEP_TURN(1 + RandomUniform(RNG_SLEEP_TURNS, 2, 5)); + + TryActivateSleepClause(gEffectBattler, gBattlerPartyIndexes[gEffectBattler]); } else { @@ -3335,8 +3580,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) // For a move that hits multiple targets (i.e. Make it Rain) // we only want to print the message on the final hit - if (!((moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY) - && GetNextTarget(moveTarget, TRUE) != MAX_BATTLERS_COUNT)) + if (!(NumAffectedSpreadMoveTargets() > 1 && GetNextTarget(moveTarget, TRUE) != MAX_BATTLERS_COUNT)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectPayDay; @@ -3581,11 +3825,11 @@ void SetMoveEffect(bool32 primary, bool32 certain) } break; case MOVE_EFFECT_RECOIL_HP_25: // Struggle - gBattleMoveDamage = (gBattleMons[gEffectBattler].maxHP) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gEffectBattler] = (gBattleMons[gEffectBattler].maxHP) / 4; + if (gBattleStruct->moveDamage[gEffectBattler] == 0) + gBattleStruct->moveDamage[gEffectBattler] = 1; if (GetBattlerAbility(gEffectBattler) == ABILITY_PARENTAL_BOND) - gBattleMoveDamage *= 2; + gBattleStruct->moveDamage[gEffectBattler] *= 2; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; @@ -3619,13 +3863,14 @@ void SetMoveEffect(bool32 primary, bool32 certain) break; case MOVE_EFFECT_FLAME_BURST: if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) - && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_SEMI_INVULNERABLE) - && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) + && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_SEMI_INVULNERABLE) + && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) { - gBattleScripting.savedBattler = BATTLE_PARTNER(gBattlerTarget); - gBattleMoveDamage = gBattleMons[BATTLE_PARTNER(gBattlerTarget)].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + i = BATTLE_PARTNER(gBattlerTarget); + gBattleScripting.savedBattler = i; + gBattleStruct->moveDamage[i] = gBattleMons[i].maxHP / 16; + if (gBattleStruct->moveDamage[i] == 0) + gBattleStruct->moveDamage[i] = 1; gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; } break; @@ -3714,9 +3959,11 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattleMons[gBattlerAttacker].status2 |= STATUS2_ESCAPE_PREVENTION; break; case MOVE_EFFECT_REMOVE_ARG_TYPE: + { + u32 type = GetMoveArgType(gCurrentMove); // This seems unnecessary but is done to make it work properly with Parental Bond BattleScriptPush(gBattlescriptCurrInstr + 1); - switch (gMovesInfo[gCurrentMove].argument) + switch (type) { case TYPE_FIRE: // Burn Up gBattlescriptCurrInstr = BattleScript_RemoveFireType; @@ -3728,8 +3975,9 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattlescriptCurrInstr = BattleScript_RemoveGenericType; break; } - RemoveBattlerType(gEffectBattler, gMovesInfo[gCurrentMove].argument); + RemoveBattlerType(gEffectBattler, type); break; + } case MOVE_EFFECT_ROUND: TryUpdateRoundTurnOrder(); // If another Pokémon uses Round before the user this turn, the user will use Round directly after it gBattlescriptCurrInstr++; @@ -3929,9 +4177,6 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattlescriptCurrInstr = BattleScript_MoveEffectIonDeluge; } break; - // TODO: The moves aromatherapy and heal bell need a refactor first - // case MOVE_EFFECT_AROMATHERAPY: - // break; case MOVE_EFFECT_HAZE: for (i = 0; i < gBattlersCount; i++) TryResetBattlerStatChanges(i); @@ -3948,41 +4193,15 @@ void SetMoveEffect(bool32 primary, bool32 certain) } break; case MOVE_EFFECT_REFLECT: - side = GetBattlerSide(gBattlerAttacker); - if (!(gSideStatuses[side] & SIDE_STATUS_REFLECT)) + if (TrySetReflect(gBattlerAttacker)) { - gSideStatuses[side] |= SIDE_STATUS_REFLECT; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[side].reflectTimer = 8; - else - gSideTimers[side].reflectTimer = 5; - gSideTimers[side].reflectBattlerId = gBattlerAttacker; - - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE; - BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectReflect; } break; case MOVE_EFFECT_LIGHT_SCREEN: - side = GetBattlerSide(gBattlerAttacker); - if (!(gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN)) + if (TrySetLightScreen(gBattlerAttacker)) { - gSideStatuses[side] |= SIDE_STATUS_LIGHTSCREEN; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[side].lightscreenTimer = 8; - else - gSideTimers[side].lightscreenTimer = 5; - gSideTimers[side].lightscreenBattlerId = gBattlerAttacker; - - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE; - BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectLightScreen; } @@ -4032,6 +4251,322 @@ void SetMoveEffect(bool32 primary, bool32 certain) } } break; + case MOVE_EFFECT_RAISE_TEAM_ATTACK: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_ATK, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_DEFENSE: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_DEF, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SPEED: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPEED, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SP_ATK: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SP_DEF: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPDEF, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_LOWER_ATTACK_SIDE: + case MOVE_EFFECT_LOWER_DEFENSE_SIDE: + case MOVE_EFFECT_LOWER_SPEED_SIDE: + case MOVE_EFFECT_LOWER_SP_ATK_SIDE: + case MOVE_EFFECT_LOWER_SP_DEF_SIDE: + case MOVE_EFFECT_LOWER_SPEED_2_SIDE: + case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: + if (!NoAliveMonsForEitherParty()) + { + u32 statId = 0; + u32 stage = 1; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_LOWER_SPEED_2_SIDE: + statId = STAT_SPEED; + stage = 2; + break; + case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: + statId = STAT_EVASION; + break; + default: + // Max Effects are ordered by stat ID. + statId = gBattleScripting.moveEffect - MOVE_EFFECT_LOWER_ATTACK_SIDE + 1; + break; + } + SET_STATCHANGER(statId, stage, TRUE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; + } + break; + case MOVE_EFFECT_SUN: + case MOVE_EFFECT_RAIN: + case MOVE_EFFECT_SANDSTORM: + case MOVE_EFFECT_HAIL: + { + u8 weather = 0, msg = 0; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_SUN: + weather = BATTLE_WEATHER_SUN; + msg = B_MSG_STARTED_SUNLIGHT; + break; + case MOVE_EFFECT_RAIN: + weather = BATTLE_WEATHER_RAIN; + msg = B_MSG_STARTED_RAIN; + break; + case MOVE_EFFECT_SANDSTORM: + weather = BATTLE_WEATHER_SANDSTORM; + msg = B_MSG_STARTED_SANDSTORM; + break; + case MOVE_EFFECT_HAIL: + weather = BATTLE_WEATHER_HAIL; + msg = B_MSG_STARTED_HAIL; + break; + } + if (TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = msg; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSetWeather; + } + break; + } + case MOVE_EFFECT_MISTY_TERRAIN: + case MOVE_EFFECT_GRASSY_TERRAIN: + case MOVE_EFFECT_ELECTRIC_TERRAIN: + case MOVE_EFFECT_PSYCHIC_TERRAIN: + { + u32 statusFlag = 0; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_MISTY_TERRAIN: + statusFlag = STATUS_FIELD_MISTY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; + break; + case MOVE_EFFECT_GRASSY_TERRAIN: + statusFlag = STATUS_FIELD_GRASSY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; + break; + case MOVE_EFFECT_ELECTRIC_TERRAIN: + statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; + break; + case MOVE_EFFECT_PSYCHIC_TERRAIN: + statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; + break; + } + if (!(gFieldStatuses & statusFlag) && statusFlag != 0) + { + gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; + gFieldStatuses |= statusFlag; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + gFieldTimers.terrainTimer = gBattleTurnCounter + 8; + else + gFieldTimers.terrainTimer = gBattleTurnCounter + 5; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; + } + break; + } + case MOVE_EFFECT_VINE_LASH: + case MOVE_EFFECT_CANNONADE: + case MOVE_EFFECT_WILDFIRE: + case MOVE_EFFECT_VOLCALITH: + { + u8 side = GetBattlerSide(gBattlerTarget); + if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) + { + u32 moveType = GetMoveType(gCurrentMove); + gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; + gSideTimers[side].damageNonTypesTimer = gBattleTurnCounter + 5; // damage is dealt for 4 turns, ends on 5th + gSideTimers[side].damageNonTypesType = moveType; + BattleScriptPush(gBattlescriptCurrInstr + 1); + ChooseDamageNonTypesString(moveType); + gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; + } + break; + } + case MOVE_EFFECT_STEELSURGE: + if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; + } + break; + case MOVE_EFFECT_DEFOG: + if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY + || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY + || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefogTryHazards; + } + break; + case MOVE_EFFECT_AURORA_VEIL: + if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) + { + gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; + else + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilBattlerId = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectAuroraVeilSuccess; + } + break; + case MOVE_EFFECT_GRAVITY: + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) + { + gFieldStatuses |= STATUS_FIELD_GRAVITY; + gFieldTimers.gravityTimer = gBattleTurnCounter + 5; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; + } + break; + case MOVE_EFFECT_SANDBLAST_SIDE: + case MOVE_EFFECT_FIRE_SPIN_SIDE: + { + // Affects both opponents, but doesn't print strings so we can handle it here. + u8 battler; + for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) + { + if (GetBattlerSide(battler) != GetBattlerSide(gBattlerTarget)) + continue; + if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) + { + gBattleMons[battler].status2 |= STATUS2_WRAPPED; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; + else + gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; + // The Wrap effect does not expire when the user switches, so here's some cheese. + gBattleStruct->wrappedBy[battler] = gBattlerTarget; + if (gBattleScripting.moveEffect == MOVE_EFFECT_SANDBLAST_SIDE) + gBattleStruct->wrappedMove[battler] = MOVE_SAND_TOMB; + else + gBattleStruct->wrappedMove[battler] = MOVE_FIRE_SPIN; + } + } + break; + } + case MOVE_EFFECT_YAWN_FOE: + { + if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) + && CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) + && RandomPercentage(RNG_G_MAX_SNOOZE, 50)) + { + gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; + } + break; + } + case MOVE_EFFECT_SPITE: + if (gLastMoves[gBattlerTarget] != MOVE_NONE + && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; + } + break; + case MOVE_EFFECT_PARALYZE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectParalyzeSide; + break; + case MOVE_EFFECT_POISON_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectPoisonSide; + break; + case MOVE_EFFECT_POISON_PARALYZE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectPoisonParalyzeSide; + break; + case MOVE_EFFECT_EFFECT_SPORE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectEffectSporeSide; + break; + case MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE: + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + u32 payday = gPaydayMoney; + gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); + if (payday > gPaydayMoney) + gPaydayMoney = 0xFFFF; + gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message + } + // fall through + case MOVE_EFFECT_CONFUSE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectConfuseSide; + break; + case MOVE_EFFECT_INFATUATE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectInfatuateSide; + break; + case MOVE_EFFECT_TORMENT_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectTormentSide; + break; + case MOVE_EFFECT_PREVENT_ESCAPE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectMeanLookSide; + break; + case MOVE_EFFECT_CRIT_PLUS_SIDE: + gBattleStruct->bonusCritStages[gBattlerAttacker]++; + gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; + break; + case MOVE_EFFECT_HEAL_TEAM: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; + break; + case MOVE_EFFECT_AROMATHERAPY: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectHealBell_FromHeal; + break; + case MOVE_EFFECT_RECYCLE_BERRIES: + { + if (RandomPercentage(RNG_G_MAX_REPLENISH, 50)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; + } + break; + } } } } @@ -4042,10 +4577,9 @@ void SetMoveEffect(bool32 primary, bool32 certain) static bool32 CanApplyAdditionalEffect(const struct AdditionalEffect *additionalEffect) { // Self-targeting move effects only apply after the last mon has been hit - u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); if (additionalEffect->self - && (moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY) - && GetNextTarget(moveTarget, TRUE) != MAX_BATTLERS_COUNT) + && NumAffectedSpreadMoveTargets() > 1 + && GetNextTarget(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove), TRUE) != MAX_BATTLERS_COUNT) return FALSE; // Certain move effects only apply if the target raised stats this turn (e.g. Burning Jealousy) @@ -4063,12 +4597,13 @@ static void Cmd_setadditionaleffects(void) { CMD_ARGS(); - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { - if (gMovesInfo[gCurrentMove].numAdditionalEffects > gBattleStruct->additionalEffectsCounter) + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(gCurrentMove); + if (numAdditionalEffects > gBattleStruct->additionalEffectsCounter) { u32 percentChance; - const struct AdditionalEffect *additionalEffect = &gMovesInfo[gCurrentMove].additionalEffects[gBattleStruct->additionalEffectsCounter]; + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(gCurrentMove, gBattleStruct->additionalEffectsCounter); const u8 *currentPtr = gBattlescriptCurrInstr; // Various checks for if this move effect can be applied this turn @@ -4094,7 +4629,7 @@ static void Cmd_setadditionaleffects(void) // Call setadditionaleffects again in the case of a move with multiple effects gBattleStruct->additionalEffectsCounter++; - if (gMovesInfo[gCurrentMove].numAdditionalEffects > gBattleStruct->additionalEffectsCounter) + if (numAdditionalEffects > gBattleStruct->additionalEffectsCounter) gBattleScripting.moveEffect = MOVE_EFFECT_CONTINUE; else gBattleScripting.moveEffect = gBattleStruct->additionalEffectsCounter = 0; @@ -4214,7 +4749,7 @@ static void Cmd_tryfaintmon(void) { gHitMarker &= ~HITMARKER_DESTINYBOND; BattleScriptPush(gBattlescriptCurrInstr); - gBattleMoveDamage = gBattleMons[destinyBondBattler].hp; + gBattleStruct->moveDamage[destinyBondBattler] = gBattleMons[destinyBondBattler].hp; gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; } if ((gStatuses3[gBattlerTarget] & STATUS3_GRUDGE) @@ -4223,7 +4758,7 @@ static void Cmd_tryfaintmon(void) && IsBattlerAlive(gBattlerAttacker) && gCurrentMove != MOVE_STRUGGLE) { - u8 moveIndex = *(gBattleStruct->chosenMovePositions + gBattlerAttacker); + u8 moveIndex = gBattleStruct->chosenMovePositions[gBattlerAttacker]; gBattleMons[gBattlerAttacker].pp[moveIndex] = 0; BattleScriptPush(gBattlescriptCurrInstr); @@ -4233,6 +4768,8 @@ static void Cmd_tryfaintmon(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex]) } + + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } else { @@ -4580,13 +5117,13 @@ static void Cmd_getexp(void) || GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) { gBattleScripting.getexpState = 5; - gBattleMoveDamage = 0; // used for exp + gBattleStruct->battlerExpReward = 0; } else if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && *expMonId >= 3) || GetMonData(&gPlayerParty[*expMonId], MON_DATA_LEVEL) == MAX_LEVEL) { gBattleScripting.getexpState = 5; - gBattleMoveDamage = 0; // used for exp + gBattleStruct->battlerExpReward = 0; if (B_MAX_LEVEL_EV_GAINS >= GEN_5) MonGainEVs(&gPlayerParty[*expMonId], gBattleMons[gBattlerFainted].species); } @@ -4607,28 +5144,28 @@ static void Cmd_getexp(void) if (IsValidForBattle(&gPlayerParty[*expMonId])) { if (wasSentOut) - gBattleMoveDamage = GetSoftLevelCapExpValue(gPlayerParty[*expMonId].level, gBattleStruct->expValue); + gBattleStruct->battlerExpReward = GetSoftLevelCapExpValue(gPlayerParty[*expMonId].level, gBattleStruct->expValue); else - gBattleMoveDamage = 0; + gBattleStruct->battlerExpReward = 0; if ((holdEffect == HOLD_EFFECT_EXP_SHARE || IsGen6ExpShareEnabled()) - && (B_SPLIT_EXP < GEN_6 || gBattleMoveDamage == 0)) // only give exp share bonus in later gens if the mon wasn't sent out + && (B_SPLIT_EXP < GEN_6 || gBattleStruct->battlerExpReward == 0)) // only give exp share bonus in later gens if the mon wasn't sent out { - gBattleMoveDamage += GetSoftLevelCapExpValue(gPlayerParty[*expMonId].level, gBattleStruct->expShareExpValue);; + gBattleStruct->battlerExpReward += GetSoftLevelCapExpValue(gPlayerParty[*expMonId].level, gBattleStruct->expShareExpValue);; } - ApplyExperienceMultipliers(&gBattleMoveDamage, *expMonId, gBattlerFainted); + ApplyExperienceMultipliers(&gBattleStruct->battlerExpReward, *expMonId, gBattlerFainted); - if (B_EXP_CAP_TYPE == EXP_CAP_HARD && gBattleMoveDamage != 0) + if (B_EXP_CAP_TYPE == EXP_CAP_HARD && gBattleStruct->battlerExpReward != 0) { u32 growthRate = gSpeciesInfo[GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPECIES)].growthRate; u32 currentExp = GetMonData(&gPlayerParty[*expMonId], MON_DATA_EXP); u32 levelCap = GetCurrentLevelCap(); if (GetMonData(&gPlayerParty[*expMonId], MON_DATA_LEVEL) >= levelCap) - gBattleMoveDamage = 0; - else if (gExperienceTables[growthRate][levelCap] < currentExp + gBattleMoveDamage) - gBattleMoveDamage = gExperienceTables[growthRate][levelCap] - currentExp; + gBattleStruct->battlerExpReward = 0; + else if (gExperienceTables[growthRate][levelCap] < currentExp + gBattleStruct->battlerExpReward) + gBattleStruct->battlerExpReward = gExperienceTables[growthRate][levelCap] - currentExp; } if (IsTradedMon(&gPlayerParty[*expMonId])) @@ -4662,7 +5199,7 @@ static void Cmd_getexp(void) PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBattlerId, *expMonId); // buffer 'gained' or 'gained a boosted' PREPARE_STRING_BUFFER(gBattleTextBuff2, i); - PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 6, gBattleMoveDamage); + PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 6, gBattleStruct->battlerExpReward); if (wasSentOut || holdEffect == HOLD_EFFECT_EXP_SHARE) { @@ -4694,7 +5231,7 @@ static void Cmd_getexp(void) gBattleResources->beforeLvlUp->stats[STAT_SPATK] = GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPATK); gBattleResources->beforeLvlUp->stats[STAT_SPDEF] = GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPDEF); - BtlController_EmitExpUpdate(gBattleStruct->expGetterBattlerId, BUFFER_A, *expMonId, gBattleMoveDamage); + BtlController_EmitExpUpdate(gBattleStruct->expGetterBattlerId, BUFFER_A, *expMonId, gBattleStruct->battlerExpReward); MarkBattlerForControllerExec(gBattleStruct->expGetterBattlerId); } gBattleScripting.getexpState++; @@ -4716,7 +5253,7 @@ static void Cmd_getexp(void) BattleScriptPushCursor(); gLeveledUpInBattle |= 1 << *expMonId; gBattlescriptCurrInstr = BattleScript_LevelUp; - gBattleMoveDamage = T1_READ_32(&gBattleResources->bufferB[expBattler][2]); + gBattleStruct->battlerExpReward = T1_READ_32(&gBattleResources->bufferB[expBattler][2]); AdjustFriendship(&gPlayerParty[*expMonId], FRIENDSHIP_EVENT_GROW_LEVEL); // update battle mon structure after level up @@ -4736,13 +5273,13 @@ static void Cmd_getexp(void) } else { - gBattleMoveDamage = 0; + gBattleStruct->battlerExpReward = 0; gBattleScripting.getexpState = 5; } } break; case 5: // looper increment - if (gBattleMoveDamage) // there is exp to give, goto case 3 that gives exp + if (gBattleStruct->battlerExpReward) // there is exp to give, goto case 3 that gives exp { gBattleScripting.getexpState = 3; } @@ -4880,8 +5417,6 @@ static void Cmd_checkteamslost(void) static void MoveValuesCleanUp(void) { - gMoveResultFlags = 0; - gIsCriticalHit = FALSE; gBattleScripting.moveEffect = 0; gBattleCommunication[MISS_TYPE] = 0; if (!gMultiHitCounter) @@ -5236,18 +5771,20 @@ static void Cmd_waitstate(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_healthbar_update(void) +static void Cmd_absorb(void) { CMD_ARGS(u8 battler); - u32 battler; - if (cmd->battler == BS_TARGET) - battler = gBattlerTarget; - else - battler = gBattlerAttacker; + if (gBattleControllerExecFlags) + return; - BtlController_EmitHealthBarUpdate(battler, BUFFER_A, gBattleMoveDamage); + u32 battler = GetBattlerForBattleScript(cmd->battler); + BtlController_EmitHealthBarUpdate(battler, BUFFER_A, gBattleStruct->moveDamage[battler]); MarkBattlerForControllerExec(battler); + + if (GetBattlerSide(battler) == B_SIDE_PLAYER && gBattleStruct->moveDamage[battler] > 0) + gBattleResults.playerMonWasDamaged = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; } @@ -5263,7 +5800,6 @@ static void Cmd_end(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA) BattleArena_AddSkillPoints(gBattlerAttacker); - gMoveResultFlags = 0; gCurrentActionFuncId = B_ACTION_TRY_FINISH; } @@ -5297,7 +5833,7 @@ static void Cmd_setroost(void) { CMD_ARGS(); - gBattleResources->flags->flags[gBattlerAttacker] |= RESOURCE_FLAG_ROOST; + gDisableStructs[gBattlerAttacker].roostActive = TRUE; gBattleStruct->roostTypes[gBattlerAttacker][0] = gBattleMons[gBattlerAttacker].types[0]; gBattleStruct->roostTypes[gBattlerAttacker][1] = gBattleMons[gBattlerAttacker].types[1]; @@ -5609,7 +6145,7 @@ static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) if (battler != gBattlerAttacker && !(excludeCurrent && battler == gBattlerTarget) && IsBattlerAlive(battler) - && !(gBattleStruct->targetsDone[gBattlerAttacker] & (1u << battler)) + && !gBattleStruct->battlerState[gBattlerAttacker].targetsDone[battler] && (GetBattlerSide(battler) != GetBattlerSide(gBattlerAttacker) || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) break; } @@ -5636,27 +6172,29 @@ static void Cmd_moveend(void) endState = cmd->endState; holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - moveType = GetMoveType(gCurrentMove); + moveType = GetBattleMoveType(gCurrentMove); + + u32 moveEffect = GetMoveEffect(gCurrentMove); do { switch (gBattleScripting.moveendState) { case MOVEEND_SUM_DAMAGE: // Sum and store damage dealt for multi strike recoil - gBattleScripting.savedDmg += gHpDealt; + gBattleScripting.savedDmg += gBattleStruct->moveDamage[gBattlerTarget]; gBattleScripting.moveendState++; break; case MOVEEND_PROTECT_LIKE_EFFECT: if (gProtectStructs[gBattlerAttacker].touchedProtectLike) { if (gProtectStructs[gBattlerTarget].spikyShielded - && gMovesInfo[gCurrentMove].effect != EFFECT_COUNTER + && moveEffect != EFFECT_COUNTER && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SpikyShieldEffect; @@ -5685,7 +6223,8 @@ static void Cmd_moveend(void) gBattlescriptCurrInstr = BattleScript_BanefulBunkerEffect; effect = 1; } - else if (gProtectStructs[gBattlerTarget].obstructed && gMovesInfo[gCurrentMove].effect != EFFECT_SUCKER_PUNCH && gMovesInfo[gCurrentMove].effect != EFFECT_UPPER_HAND) + else if (gProtectStructs[gBattlerTarget].obstructed + && moveEffect != EFFECT_SUCKER_PUNCH && moveEffect != EFFECT_UPPER_HAND) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; i = gBattlerAttacker; @@ -5719,7 +6258,7 @@ static void Cmd_moveend(void) // Not strictly a protect effect, but works the same way else if (gProtectStructs[gBattlerTarget].beakBlastCharge && CanBeBurned(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleMons[gBattlerAttacker].status1 = STATUS1_BURN; @@ -5733,24 +6272,25 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_ABSORB: - if (gMovesInfo[gCurrentMove].effect == EFFECT_ABSORB + if (moveEffect == EFFECT_ABSORB && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && TARGET_TURN_DAMAGED) + && IsBattlerTurnDamaged(gBattlerTarget)) { - if (gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && gMovesInfo[gCurrentMove].healingMove) + if (gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealingMove(gCurrentMove)) { gBattleScripting.moveendState++; break; } - else if (IsBattlerAlive(gBattlerAttacker) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + else if (IsBattlerAlive(gBattlerAttacker) && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { - gBattleMoveDamage = max(1, (gHpDealt * gMovesInfo[gCurrentMove].argument / 100)); - gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); + gBattleStruct->moveDamage[gBattlerAttacker] = max(1, (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100)); + gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE; effect = TRUE; if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIQUID_OOZE) { - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[gBattlerAttacker] *= -1; + gHitMarker |= HITMARKER_PASSIVE_DAMAGE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_EffectAbsorbLiquidOoze; @@ -5770,9 +6310,9 @@ static void Cmd_moveend(void) && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED - && !IS_MOVE_STATUS(gCurrentMove) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget) + && !IsBattleMoveStatus(gCurrentMove) && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) { SET_STATCHANGER(STAT_ATK, 1, FALSE); @@ -5784,11 +6324,11 @@ static void Cmd_moveend(void) break; case MOVEEND_DEFROST: // defrosting check if (gBattleMons[gBattlerTarget].status1 & STATUS1_FREEZE - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget && (moveType == TYPE_FIRE || CanBurnHitThaw(gCurrentMove)) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); @@ -5800,8 +6340,8 @@ static void Cmd_moveend(void) if (gBattleMons[gBattlerTarget].status1 & STATUS1_FROSTBITE && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget - && gMovesInfo[originallyUsedMove].thawsUser - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + && MoveThawsUser(originallyUsedMove) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FROSTBITE; BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); @@ -5813,46 +6353,48 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_RECOIL: + { + u32 moveRecoil = GetMoveRecoil(gCurrentMove); if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) { gBattleScripting.moveendState++; break; } - else if (gMovesInfo[gCurrentMove].recoil > 0 - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + else if (moveRecoil > 0 + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && gBattleScripting.savedDmg != 0) // Some checks may be redundant alongside this one { - gBattleMoveDamage = max(1, gBattleScripting.savedDmg * max(1, gMovesInfo[gCurrentMove].recoil) / 100); + gBattleStruct->moveDamage[gBattlerAttacker] = max(1, gBattleScripting.savedDmg * max(1, moveRecoil) / 100); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; effect = TRUE; } - else if (gMovesInfo[gCurrentMove].effect == EFFECT_EXPLOSION && !IsAbilityOnField(ABILITY_DAMP)) + else if (moveEffect == EFFECT_EXPLOSION && !IsAbilityOnField(ABILITY_DAMP)) { - gBattleMoveDamage = 0; + gBattleStruct->moveDamage[gBattlerAttacker] = 0; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_FaintAttackerForExplosion; effect = TRUE; } - else if ((gMovesInfo[gCurrentMove].effect == EFFECT_MAX_HP_50_RECOIL - || gMovesInfo[gCurrentMove].effect == EFFECT_MIND_BLOWN) + else if ((moveEffect == EFFECT_MAX_HP_50_RECOIL || moveEffect == EFFECT_MIND_BLOWN) && IsBattlerAlive(gBattlerAttacker) - && !(gMoveResultFlags & MOVE_RESULT_FAILED) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP + gBattleStruct->moveDamage[gBattlerAttacker] = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MaxHp50Recoil; effect = TRUE; } gBattleScripting.moveendState++; break; + } case MOVEEND_RAPID_SPIN: - if (gMovesInfo[gCurrentMove].effect == EFFECT_RAPID_SPIN + if (GetMoveEffect(gCurrentMove) == EFFECT_RAPID_SPIN && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && TARGET_TURN_DAMAGED) + && IsBattlerTurnDamaged(gBattlerTarget)) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RapidSpinAway; @@ -5905,9 +6447,8 @@ static void Cmd_moveend(void) && gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE)) { - if ((gMovesInfo[gChosenMove].effect == EFFECT_BATON_PASS - || gMovesInfo[gChosenMove].effect == EFFECT_HEALING_WISH) - && !(gMoveResultFlags & MOVE_RESULT_FAILED)) + if ((moveEffect == EFFECT_BATON_PASS || moveEffect == EFFECT_HEALING_WISH) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED)) { gBattleScripting.moveendState++; break; @@ -5974,22 +6515,27 @@ static void Cmd_moveend(void) } break; case MOVE_EFFECT_REMOVE_STATUS: // Smelling salts, Wake-Up Slap, Sparkling Aria - if ((gBattleMons[gBattlerTarget].status1 & gMovesInfo[gCurrentMove].argument) + { + u32 argStatus = GetMoveEffectArg_Status(gCurrentMove); + if ((gBattleMons[gBattlerTarget].status1 & argStatus) && IsBattlerAlive(gBattlerTarget) - && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) + && (NumAffectedSpreadMoveTargets() > 1 || !IsMoveEffectBlockedByTarget(GetBattlerAbility(gBattlerTarget)))) { - gBattleMons[gBattlerTarget].status1 &= ~(gMovesInfo[gCurrentMove].argument); + gBattleMons[gBattlerTarget].status1 &= ~(argStatus); BtlController_EmitSetMonData(gBattlerTarget, 0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerTarget].status1); MarkBattlerForControllerExec(gBattlerTarget); effect = TRUE; BattleScriptPush(gBattlescriptCurrInstr); - switch (gMovesInfo[gCurrentMove].argument) + + switch (argStatus) { case STATUS1_PARALYSIS: gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; break; case STATUS1_SLEEP: + TryDeactivateSleepClause(GetBattlerSide(gBattlerTarget), gBattlerPartyIndexes[gBattlerTarget]); gBattlescriptCurrInstr = BattleScript_TargetWokeUp; break; case STATUS1_BURN: @@ -6010,6 +6556,7 @@ static void Cmd_moveend(void) } break; // MOVE_EFFECT_REMOVE_STATUS } + } gBattleStruct->moveEffect2 = 0; gBattleScripting.moveendState++; break; // MOVEEND_MOVE_EFFECTS2 @@ -6021,9 +6568,9 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_HIT_SWITCH_TARGET: - if (gMovesInfo[gCurrentMove].effect == EFFECT_HIT_SWITCH_TARGET + if (GetMoveEffect(gCurrentMove) == EFFECT_HIT_SWITCH_TARGET && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) @@ -6075,7 +6622,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_ATTACKER_VISIBLE: // make attacker sprite visible - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || !(gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE)) || WasUnableToUseMove(gBattlerAttacker)) { @@ -6102,9 +6649,9 @@ static void Cmd_moveend(void) break; case MOVEEND_NUM_HITS: if (gBattlerAttacker != gBattlerTarget - && gMovesInfo[gCurrentMove].category != DAMAGE_CATEGORY_STATUS - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED) + && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget)) { gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]++; } @@ -6146,15 +6693,15 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_UPDATE_LAST_MOVES: - if ((gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) + if ((gBattleStruct->moveResultFlags[gBattlerTarget] & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) || (gBattleMons[gBattlerAttacker].status2 & (STATUS2_FLINCHED)) || gProtectStructs[gBattlerAttacker].prlzImmobility) - gBattleStruct->lastMoveFailed |= 1u << gBattlerAttacker; + gBattleStruct->battlerState[gBattlerAttacker].lastMoveFailed = TRUE; else - gBattleStruct->lastMoveFailed &= ~(1u << gBattlerAttacker); + gBattleStruct->battlerState[gBattlerAttacker].lastMoveFailed = FALSE; // Set ShellTrap to activate after the attacker's turn if target was hit by a physical move. - if (gMovesInfo[gChosenMoveByBattler[gBattlerTarget]].effect == EFFECT_SHELL_TRAP + if (GetMoveEffect(gChosenMoveByBattler[gBattlerTarget]) == EFFECT_SHELL_TRAP && gBattlerTarget != gBattlerAttacker && GetBattlerSide(gBattlerTarget) != GetBattlerSide(gBattlerAttacker) && gProtectStructs[gBattlerTarget].physicalDmg @@ -6187,10 +6734,10 @@ static void Cmd_moveend(void) gBattleStruct->dynamax.lastUsedBaseMove = gBattleStruct->dynamax.baseMoves[gBattlerAttacker]; } } + u32 originalEffect = GetMoveEffect(originallyUsedMove); if (!(gAbsentBattlerFlags & (1u << gBattlerAttacker)) - && !(gBattleStruct->absentBattlerFlags & (1u << gBattlerAttacker)) - && gMovesInfo[originallyUsedMove].effect != EFFECT_BATON_PASS - && gMovesInfo[originallyUsedMove].effect != EFFECT_HEALING_WISH) + && !gBattleStruct->battlerState[gBattlerAttacker].absentBattlerFlags + && originalEffect != EFFECT_BATON_PASS && originalEffect != EFFECT_HEALING_WISH) { if (gHitMarker & HITMARKER_OBEYS) { @@ -6199,7 +6746,7 @@ static void Cmd_moveend(void) gLastMoves[gBattlerAttacker] = gChosenMove; RecordKnownMove(gBattlerAttacker, gChosenMove); gLastResultingMoves[gBattlerAttacker] = gCurrentMove; - gLastUsedMoveType[gBattlerAttacker] = GetMoveType(gCurrentMove); + gLastUsedMoveType[gBattlerAttacker] = GetBattleMoveType(gCurrentMove); } } else @@ -6212,7 +6759,7 @@ static void Cmd_moveend(void) if (!(gHitMarker & HITMARKER_FAINTED(gBattlerTarget))) gLastHitBy[gBattlerTarget] = gBattlerAttacker; - if (gHitMarker & HITMARKER_OBEYS && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (gHitMarker & HITMARKER_OBEYS && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { if (gChosenMove == MOVE_UNAVAILABLE) { @@ -6221,7 +6768,7 @@ static void Cmd_moveend(void) else { gLastLandedMoves[gBattlerTarget] = gCurrentMove; - gLastHitByType[gBattlerTarget] = GetMoveType(gCurrentMove); + gLastHitByType[gBattlerTarget] = GetBattleMoveType(gCurrentMove); } } else @@ -6233,12 +6780,12 @@ static void Cmd_moveend(void) break; case MOVEEND_MIRROR_MOVE: // mirror move if (!(gAbsentBattlerFlags & (1u << gBattlerAttacker)) - && !(gBattleStruct->absentBattlerFlags & (1u << gBattlerAttacker)) - && !gMovesInfo[originallyUsedMove].mirrorMoveBanned + && !gBattleStruct->battlerState[gBattlerAttacker].absentBattlerFlags + && !IsMoveMirrorMoveBanned(originallyUsedMove) && gHitMarker & HITMARKER_OBEYS && gBattlerAttacker != gBattlerTarget && !(gHitMarker & HITMARKER_FAINTED(gBattlerTarget)) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gBattleStruct->lastTakenMove[gBattlerTarget] = gChosenMove; gBattleStruct->lastTakenMoveFrom[gBattlerTarget][gBattlerAttacker] = gChosenMove; @@ -6250,10 +6797,10 @@ static void Cmd_moveend(void) u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); // Set a flag if move hits either target (for throat spray that can't check damage) if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) gProtectStructs[gBattlerAttacker].targetAffected = TRUE; - gBattleStruct->targetsDone[gBattlerAttacker] |= 1u << gBattlerTarget; + gBattleStruct->battlerState[gBattlerAttacker].targetsDone[gBattlerTarget] = TRUE; if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && IsDoubleBattle() && !gProtectStructs[gBattlerAttacker].chargingTurn @@ -6271,10 +6818,10 @@ static void Cmd_moveend(void) MoveValuesCleanUp(); gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; - if (gMovesInfo[gCurrentMove].effect == EFFECT_EXPLOSION) + if (moveEffect == EFFECT_EXPLOSION) BattleScriptPush(gBattleMoveEffects[EFFECT_HIT].battleScript); // Edge case for Explosion not changing targets else - BattleScriptPush(GET_MOVE_BATTLESCRIPT(gCurrentMove)); + BattleScriptPush(GetMoveBattleScript(gCurrentMove)); gBattlescriptCurrInstr = BattleScript_FlushMessageBox; return; } @@ -6284,9 +6831,9 @@ static void Cmd_moveend(void) u8 originalBounceTarget = gBattlerAttacker; gBattleStruct->bouncedMoveIsUsed = FALSE; gBattlerAttacker = gBattleStruct->attackerBeforeBounce; - gBattleStruct->targetsDone[gBattlerAttacker] |= 1u << originalBounceTarget; - gBattleStruct->targetsDone[originalBounceTarget] = 0; - + gBattleStruct->battlerState[gBattlerAttacker].targetsDone[originalBounceTarget] = TRUE; + for (i = 0; i < gBattlersCount; i++) + gBattleStruct->battlerState[originalBounceTarget].targetsDone[i] = FALSE; nextTarget = GetNextTarget(moveTarget, FALSE); if (nextTarget != MAX_BATTLERS_COUNT) { @@ -6296,7 +6843,7 @@ static void Cmd_moveend(void) gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; MoveValuesCleanUp(); - BattleScriptPush(GET_MOVE_BATTLESCRIPT(gCurrentMove)); + BattleScriptPush(GetMoveBattleScript(gCurrentMove)); gBattlescriptCurrInstr = BattleScript_FlushMessageBox; return; } @@ -6311,20 +6858,20 @@ static void Cmd_moveend(void) } case MOVEEND_MULTIHIT_MOVE: { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && gMultiHitCounter - && !(gMovesInfo[gCurrentMove].effect == EFFECT_PRESENT && gBattleStruct->presentBasePower == 0)) // Silly edge case + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && gMultiHitCounter + && !(moveEffect == EFFECT_PRESENT && gBattleStruct->presentBasePower == 0)) // Silly edge case { gMultiHitCounter--; - if (!IsBattlerAlive(gBattlerTarget) && gMovesInfo[gCurrentMove].effect != EFFECT_DRAGON_DARTS) + if (!IsBattlerAlive(gBattlerTarget) && moveEffect != EFFECT_DRAGON_DARTS) gMultiHitCounter = 0; gBattleScripting.multihitString[4]++; if (gMultiHitCounter == 0) { BattleScriptPushCursor(); - if (gMovesInfo[gCurrentMove].argument == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) + if (GetMoveEffectArg_MoveProperty(gCurrentMove) == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) gBattlescriptCurrInstr = BattleScript_ScaleShot; else gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; @@ -6332,8 +6879,8 @@ static void Cmd_moveend(void) } else { - if (gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_DARTS - && gBattleStruct->moveTarget[gBattlerAttacker] == gBattlerTarget // Haven't already changed targets + if (moveEffect == EFFECT_DRAGON_DARTS + && !(gBattleStruct->moveResultFlags[BATTLE_PARTNER(gBattlerTarget)] & MOVE_RESULT_MISSED) // didn't miss the other target && CanTargetPartner(gBattlerAttacker, gBattlerTarget) && !TargetFullyImmuneToCurrMove(gBattlerAttacker, BATTLE_PARTNER(gBattlerTarget))) gBattlerTarget = BATTLE_PARTNER(gBattlerTarget); // Target the partner in doubles for second hit. @@ -6354,7 +6901,7 @@ static void Cmd_moveend(void) gSpecialStatuses[gBattlerTarget].focusSashed = 0; // Delete this line to make Focus Sash last for the duration of the whole move turn. gSpecialStatuses[gBattlerAttacker].multiHitOn = TRUE; MoveValuesCleanUp(); - BattleScriptPush(GET_MOVE_BATTLESCRIPT(gCurrentMove)); + BattleScriptPush(GetMoveBattleScript(gCurrentMove)); gBattlescriptCurrInstr = BattleScript_FlushMessageBox; return; } @@ -6385,12 +6932,12 @@ static void Cmd_moveend(void) && gBattleMons[gBattlerAttacker].item == ITEM_NONE && gBattleMons[gBattlerTarget].item != ITEM_NONE && IsBattlerAlive(gBattlerAttacker) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) && !gSpecialStatuses[gBattlerAttacker].gemBoost // In base game, gems are consumed after magician would activate. && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget])) && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && (GetBattlerAbility(gBattlerTarget) != ABILITY_STICKY_HOLD || !IsBattlerAlive(gBattlerTarget))) { StealTargetItem(gBattlerAttacker, gBattlerTarget); @@ -6431,7 +6978,7 @@ static void Cmd_moveend(void) continue; // Since we check if battler was damaged, we don't need to check move result. // In fact, doing so actually prevents multi-target moves from activating eject button properly - if (!BATTLER_TURN_DAMAGED(battler)) + if (!IsBattlerTurnDamaged(battler)) continue; } else if (ejectPackBattlers & (1u << battler)) @@ -6447,28 +6994,28 @@ static void Cmd_moveend(void) if (IsBattlerAlive(battler) && CountUsablePartyMons(battler) > 0 // Has mon to switch into // Does not activate if attacker used Parting Shot and can switch out - && !(gMovesInfo[gCurrentMove].effect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(gBattlerAttacker)) + && !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(gBattlerAttacker)) ) { gBattleScripting.battler = battler; gLastUsedItem = gBattleMons[battler].item; - if (gMovesInfo[gCurrentMove].effect == EFFECT_HIT_ESCAPE) + if (moveEffect == EFFECT_HIT_ESCAPE) gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection if (ejectButtonBattlers & (1u << battler)) { effect = TRUE; - gBattleStruct->usedEjectItem |= 1u << battler; + gBattleStruct->battlerState[battler].usedEjectItem = TRUE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_EjectButtonActivates; AI_DATA->ejectButtonSwitch = TRUE; } else // Eject Pack { - if (!(gBattleResources->flags->flags[gBattlerTarget] & RESOURCE_FLAG_EMERGENCY_EXIT) - && !(gMovesInfo[gCurrentMove].effect == EFFECT_PARTING_SHOT && CanBattlerSwitch(gBattlerAttacker))) + if (!gDisableStructs[gBattlerTarget].startEmergencyExit + && !(GetMoveEffect(gCurrentMove) == EFFECT_PARTING_SHOT && CanBattlerSwitch(gBattlerAttacker))) { effect = TRUE; - gBattleStruct->usedEjectItem |= 1u << battler; + gBattleStruct->battlerState[battler].usedEjectItem = TRUE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_EjectPackActivates; AI_DATA->ejectPackSwitch = TRUE; @@ -6507,7 +7054,7 @@ static void Cmd_moveend(void) redCardBattlers |= (1u << i); } if (redCardBattlers - && (gMovesInfo[gCurrentMove].effect != EFFECT_HIT_SWITCH_TARGET || gBattleStruct->hitSwitchTargetFailed) + && (moveEffect != EFFECT_HIT_SWITCH_TARGET || gBattleStruct->hitSwitchTargetFailed) && IsBattlerAlive(gBattlerAttacker) && !TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) { @@ -6523,7 +7070,7 @@ static void Cmd_moveend(void) if (redCardBattlers & (1u << battler) && IsBattlerAlive(battler) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && BATTLER_TURN_DAMAGED(battler) + && IsBattlerTurnDamaged(battler) && CanBattlerSwitch(gBattlerAttacker)) { gLastUsedItem = gBattleMons[battler].item; @@ -6531,7 +7078,7 @@ static void Cmd_moveend(void) gBattleScripting.battler = battler; gEffectBattler = gBattlerAttacker; gBattleStruct->redCardActivates = TRUE; - if (gMovesInfo[gCurrentMove].effect == EFFECT_HIT_ESCAPE) + if (moveEffect == EFFECT_HIT_ESCAPE) gBattlescriptCurrInstr = BattleScript_MoveEnd; // Prevent user switch-in selection BattleScriptPushCursor(); if (gBattleStruct->commanderActive[gBattlerAttacker] != SPECIES_NONE @@ -6563,7 +7110,7 @@ static void Cmd_moveend(void) && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker])) // But not knocked off && !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) // Pickpocket doesn't activate for sheer force && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) // Pickpocket requires contact - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) // Obviously attack needs to have worked + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) // Obviously attack needs to have worked { u8 battlers[4] = {0, 1, 2, 3}; SortBattlersBySpeed(battlers, FALSE); // Pickpocket activates for fastest mon without item @@ -6573,7 +7120,7 @@ static void Cmd_moveend(void) // Attacker is mon who made contact, battler is mon with pickpocket if (battler != gBattlerAttacker // Cannot pickpocket yourself && GetBattlerAbility(battler) == ABILITY_PICKPOCKET // Target must have pickpocket ability - && BATTLER_TURN_DAMAGED(battler) // Target needs to have been damaged + && IsBattlerTurnDamaged(battler) // Target needs to have been damaged && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) // Subsitute unaffected && IsBattlerAlive(battler) // Battler must be alive to pickpocket && gBattleMons[battler].item == ITEM_NONE // Pickpocketer can't have an item already @@ -6595,7 +7142,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_DANCER: // Special case because it's so annoying - if (gMovesInfo[gCurrentMove].danceMove && !gBattleStruct->snatchedMoveIsUsed) + if (IsDanceMove(gCurrentMove) && !gBattleStruct->snatchedMoveIsUsed) { u32 battler, nextDancer = 0; bool32 hasDancerTriggered = FALSE; @@ -6610,7 +7157,7 @@ static void Cmd_moveend(void) } } - if (!(gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE) || (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE && !hasDancerTriggered) || (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove && gBattleStruct->bouncedMoveIsUsed))) { // Dance move succeeds @@ -6631,6 +7178,8 @@ static void Cmd_moveend(void) } if (nextDancer && AbilityBattleEffects(ABILITYEFFECT_MOVE_END_OTHER, nextDancer & 0x3, 0, 0, 0)) effect = TRUE; + + ClearDamageCalcResults(); } } gBattleScripting.moveendState++; @@ -6640,12 +7189,12 @@ static void Cmd_moveend(void) { if (gBattleStruct->redCardActivates) { - gBattleResources->flags->flags[i] &= ~RESOURCE_FLAG_EMERGENCY_EXIT; + gDisableStructs[i].startEmergencyExit = FALSE; continue; } - if (gBattleResources->flags->flags[i] & RESOURCE_FLAG_EMERGENCY_EXIT) + if (gDisableStructs[i].startEmergencyExit) { - gBattleResources->flags->flags[i] &= ~RESOURCE_FLAG_EMERGENCY_EXIT; + gDisableStructs[i].startEmergencyExit = FALSE; gSpecialStatuses[i].emergencyExited = TRUE; gBattlerTarget = gBattlerAbility = i; BattleScriptPushCursor(); @@ -6687,7 +7236,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_SAME_MOVE_TURNS: - if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] || gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0; else if (gCurrentMove == gLastResultingMoves[gBattlerAttacker] && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) gBattleStruct->sameMoveTurns[gBattlerAttacker]++; @@ -6701,13 +7250,13 @@ static void Cmd_moveend(void) break; case MOVEEND_CLEAR_BITS: // Clear/Set bits for things like using a move for all targets and all hits. if (gSpecialStatuses[gBattlerAttacker].instructedChosenTarget) - *(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3; + gBattleStruct->moveTarget[gBattlerAttacker] = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3; if (gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget) - *(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget & 0x3; + gBattleStruct->moveTarget[gBattlerAttacker] = gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget & 0x3; if (B_RAMPAGE_CANCELLING >= GEN_5 - && MoveHasAdditionalEffectSelf(gCurrentMove, MOVE_EFFECT_THRASH) // If we're rampaging - && (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) // And it is unusable + && MoveHasAdditionalEffectSelf(gCurrentMove, MOVE_EFFECT_THRASH) // If we're rampaging + && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT // And it is unusable && (gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE) != STATUS2_LOCK_CONFUSE_TURN(1)) // And won't end this turn CancelMultiTurnMoves(gBattlerAttacker); // Cancel it @@ -6727,13 +7276,11 @@ static void Cmd_moveend(void) DebugPrintfLevel(MGBA_LOG_WARN, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); // #endif } - gBattleStruct->targetsDone[gBattlerAttacker] = 0; gProtectStructs[gBattlerAttacker].targetAffected = FALSE; gProtectStructs[gBattlerAttacker].shellTrap = FALSE; gBattleStruct->ateBoost[gBattlerAttacker] = FALSE; gStatuses3[gBattlerAttacker] &= ~STATUS3_ME_FIRST; gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE; - gSpecialStatuses[gBattlerAttacker].damagedMons = 0; gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = 0; gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = FALSE; @@ -6744,22 +7291,24 @@ static void Cmd_moveend(void) gBattleStruct->categoryOverride = FALSE; gBattleStruct->bouncedMoveIsUsed = FALSE; gBattleStruct->snatchedMoveIsUsed = FALSE; - gBattleStruct->enduredDamage = 0; gBattleStruct->additionalEffectsCounter = 0; gBattleStruct->poisonPuppeteerConfusion = FALSE; gBattleStruct->fickleBeamBoosted = FALSE; gBattleStruct->redCardActivates = FALSE; - gBattleStruct->usedMicleBerry &= ~(1u << gBattlerAttacker); + gBattleStruct->battlerState[gBattlerAttacker].usedMicleBerry = FALSE; if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) gBattleStruct->pledgeMove = FALSE; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) SetActiveGimmick(gBattlerAttacker, GIMMICK_NONE); - if (B_CHARGE >= GEN_9 && moveType == TYPE_ELECTRIC && (TARGET_TURN_DAMAGED || gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (B_CHARGE >= GEN_9 && moveType == TYPE_ELECTRIC && (IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) gStatuses3[gBattlerAttacker] &= ~(STATUS3_CHARGED_UP); memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); + ClearDamageCalcResults(); for (i = 0; i < gBattlersCount; i++) { + gBattleStruct->battlerState[gBattlerAttacker].targetsDone[i] = FALSE; + if (gBattleStruct->commanderActive[i] != SPECIES_NONE && !IsBattlerAlive(i)) { u32 partner = BATTLE_PARTNER(i); @@ -6769,6 +7318,30 @@ static void Cmd_moveend(void) } } + gBattleScripting.moveendState++; + break; + case MOVEEND_PURSUIT_NEXT_ACTION: + if (gBattleStruct->battlerState[gBattlerTarget].pursuitTarget) + { + u32 storedTarget = gBattlerTarget; + if (SetTargetToNextPursuiter(gBattlerTarget)) + { + ChangeOrderTargetAfterAttacker(); + gBattleStruct->moveTarget[gBattlerTarget] = storedTarget; + gBattlerTarget = storedTarget; + } + else if (IsBattlerAlive(gBattlerTarget)) + { + gBattlerAttacker = gBattlerTarget; + if (gBattleStruct->pursuitStoredSwitch == PARTY_SIZE) + gBattlescriptCurrInstr = BattleScript_MoveSwitchOpenPartyScreen; + else + gBattlescriptCurrInstr = BattleScript_DoSwitchOut; + gBattleStruct->monToSwitchIntoId[gBattlerTarget] = gBattleStruct->pursuitStoredSwitch; + ClearPursuitValues(); + effect = TRUE; + } + } gBattleScripting.moveendState++; break; case MOVEEND_COUNT: @@ -6887,7 +7460,7 @@ static void Cmd_switchindataupdate(void) u32 side = GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = gBattleStruct->overwrittenAbilities[battler] = TestRunner_Battle_GetForcedAbility(side, partyIndex); + gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = TestRunner_Battle_GetForcedAbility(side, partyIndex); } #endif @@ -6898,7 +7471,7 @@ static void Cmd_switchindataupdate(void) gBattleMons[battler].item = ITEM_NONE; } - if (gMovesInfo[gCurrentMove].effect == EFFECT_BATON_PASS) + if (GetMoveEffect(gCurrentMove) == EFFECT_BATON_PASS) { for (i = 0; i < NUM_BATTLE_STATS; i++) { @@ -7289,11 +7862,11 @@ static void Cmd_openpartyscreen(void) } else { - *(gBattleStruct->battlerPartyIndexes + battler) = gBattlerPartyIndexes[battler]; - *(gBattleStruct->monToSwitchIntoId + battler) = PARTY_SIZE; + gBattleStruct->battlerPartyIndexes[battler] = gBattlerPartyIndexes[battler]; + gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->field_93 &= ~(1u << battler); - BtlController_EmitChoosePokemon(battler, BUFFER_A, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + BATTLE_PARTNER(battler)), ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, BUFFER_A, hitmarkerFaintBits, gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battler)], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; @@ -7346,7 +7919,7 @@ static void Cmd_switchhandleorder(void) { if (gBattleResources->bufferB[i][0] == CONTROLLER_CHOSENMONRETURNVALUE) { - *(gBattleStruct->monToSwitchIntoId + i) = gBattleResources->bufferB[i][1]; + gBattleStruct->monToSwitchIntoId[i] = gBattleResources->bufferB[i][1]; if (!(gBattleStruct->field_93 & (1u << i))) { RecordedBattle_SetBattlerAction(i, gBattleResources->bufferB[i][1]); @@ -7368,7 +7941,7 @@ static void Cmd_switchhandleorder(void) // fall through case 3: gBattleCommunication[0] = gBattleResources->bufferB[battler][1]; - *(gBattleStruct->monToSwitchIntoId + battler) = gBattleResources->bufferB[battler][1]; + gBattleStruct->monToSwitchIntoId[battler] = gBattleResources->bufferB[battler][1]; if (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI) { @@ -7382,7 +7955,7 @@ static void Cmd_switchhandleorder(void) } else if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - SwitchPartyOrderInGameMulti(battler, *(gBattleStruct->monToSwitchIntoId + battler)); + SwitchPartyOrderInGameMulti(battler, gBattleStruct->monToSwitchIntoId[battler]); } else { @@ -7419,7 +7992,7 @@ bool32 DoSwitchInAbilities(u32 battler) { return (TryPrimalReversion(battler) || AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0) - || (gBattleWeather & B_WEATHER_ANY && WEATHER_HAS_EFFECT && AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, 0, 0, 0)) + || (gBattleWeather & B_WEATHER_ANY && HasWeatherEffect() && AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, 0, 0, 0)) || (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY && AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, 0, 0, 0))); } @@ -7448,20 +8021,20 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) } // Healing Wish activates before hazards. // Starting from Gen8 - it heals only pokemon which can be healed. In gens 5,6,7 the effect activates anyways. - else if (((gBattleStruct->storedHealingWish & (1u << battler)) || (gBattleStruct->storedLunarDance & (1u << battler))) + else if ((gBattleStruct->battlerState[battler].storedHealingWish || gBattleStruct->battlerState[battler].storedLunarDance) && (gBattleMons[battler].hp != gBattleMons[battler].maxHP || gBattleMons[battler].status1 != 0 || B_HEALING_WISH_SWITCH < GEN_8)) { - if (gBattleStruct->storedHealingWish & (1u << battler)) + if (gBattleStruct->battlerState[battler].storedHealingWish) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_HealingWishActivates; - gBattleStruct->storedHealingWish &= ~(1u << battler); + gBattleStruct->battlerState[battler].storedHealingWish = FALSE; } else // Lunar Dance { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_LunarDanceActivates; - gBattleStruct->storedLunarDance &= ~(1u << battler); + gBattleStruct->battlerState[battler].storedLunarDance = FALSE; } } else if (!(gDisableStructs[battler].spikesDone) @@ -7471,9 +8044,9 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) && IsBattlerGrounded(battler)) { u8 spikesDmg = (5 - gSideTimers[GetBattlerSide(battler)].spikesAmount) * 2; - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (spikesDmg); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (spikesDmg); + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; gDisableStructs[battler].spikesDone = TRUE; SetDmgHazardsBattlescript(battler, B_MSG_PKMNHURTBYSPIKES); @@ -7484,9 +8057,9 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) { gDisableStructs[battler].stealthRockDone = TRUE; - gBattleMoveDamage = GetStealthHazardDamage(gMovesInfo[MOVE_STEALTH_ROCK].type, battler); + gBattleStruct->moveDamage[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_POINTED_STONES, battler); - if (gBattleMoveDamage != 0) + if (gBattleStruct->moveDamage[battler] != 0) SetDmgHazardsBattlescript(battler, B_MSG_STEALTHROCKDMG); } else if (!(gDisableStructs[battler].toxicSpikesDone) @@ -7543,15 +8116,15 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) { gDisableStructs[battler].steelSurgeDone = TRUE; - gBattleMoveDamage = GetStealthHazardDamage(gMovesInfo[MOVE_G_MAX_STEELSURGE].type, battler); + gBattleStruct->moveDamage[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_SHARP_STEEL, battler); - if (gBattleMoveDamage != 0) + if (gBattleStruct->moveDamage[battler] != 0) SetDmgHazardsBattlescript(battler, B_MSG_SHARPSTEELDMG); } else if (gBattleMons[battler].hp != gBattleMons[battler].maxHP && gBattleStruct->zmove.healReplacement) { gBattleStruct->zmove.healReplacement = FALSE; - gBattleMoveDamage = -1 * (gBattleMons[battler].maxHP); + gBattleStruct->moveDamage[battler] = -1 * (gBattleMons[battler].maxHP); gBattleScripting.battler = battler; BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_HP_TRAP; @@ -7610,7 +8183,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gBattleStruct->hpOnSwitchout[GetBattlerSide(i)] = gBattleMons[i].hp; } - gBattleStruct->forcedSwitch &= ~(1u << battler); + gBattleStruct->battlerState[battler].forcedSwitch = FALSE; return FALSE; } @@ -7626,7 +8199,7 @@ static void Cmd_switchineffects(void) { // Multiple mons fainted and are being switched-in. Their abilities/hazards will play according to speed ties. case BS_FAINTED_MULTIPLE_1: // Saves the battlers. - gBattleStruct->multipleSwitchInBattlers |= 1 << battler; + gBattleStruct->battlerState[battler].multipleSwitchInBattlers = TRUE; UpdateSentMonFlags(battler); // Increment fainted battler. @@ -7655,14 +8228,16 @@ static void Cmd_switchineffects(void) for (; gBattleStruct->multipleSwitchInCursor < gBattlersCount; gBattleStruct->multipleSwitchInCursor++) { gBattlerFainted = gBattleStruct->multipleSwitchInSortedBattlers[gBattleStruct->multipleSwitchInCursor]; - if (gBattleStruct->multipleSwitchInBattlers & (1 << (gBattlerFainted))) + if (gBattleStruct->battlerState[gBattlerFainted].multipleSwitchInBattlers) { if (DoSwitchInEffectsForBattler(gBattlerFainted)) return; } } // All battlers done, end - gBattleStruct->multipleSwitchInBattlers = 0; + for (i = 0; i < gBattlersCount; i++) + gBattleStruct->battlerState[i].multipleSwitchInBattlers = FALSE; + gBattleStruct->multipleSwitchInState = 0; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -7952,21 +8527,41 @@ static void Cmd_hitanimation(void) { CMD_ARGS(u8 battler); - u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!IsDoubleSpreadMove()) { - gBattlescriptCurrInstr = cmd->nextInstr; + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) + { + if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) + || !(DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)) + || gDisableStructs[battler].substituteHP == 0) + { + BtlController_EmitHitAnimation(battler, BUFFER_A); + MarkBattlerForControllerExec(battler); + } + } } - else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)) || gDisableStructs[battler].substituteHP == 0) + else if (!gBattleStruct->doneDoublesSpreadHit) { - BtlController_EmitHitAnimation(battler, BUFFER_A); - MarkBattlerForControllerExec(battler); - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; + u32 battlerDef; + for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT + || gBattleStruct->noResultString[battlerDef]) + continue; + + if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) + || !(DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove)) + || gDisableStructs[battlerDef].substituteHP == 0) + { + BtlController_EmitHitAnimation(battlerDef, BUFFER_A); + MarkBattlerForControllerExec(battlerDef); + } + } } + + gBattlescriptCurrInstr = cmd->nextInstr; } static u32 GetTrainerMoneyToGive(u16 trainerId) @@ -8007,9 +8602,9 @@ static void Cmd_getmoneyreward(void) if (gBattleOutcome == B_OUTCOME_WON) { - money = GetTrainerMoneyToGive(gTrainerBattleOpponent_A); + money = GetTrainerMoneyToGive(TRAINER_BATTLE_PARAM.opponentA); if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - money += GetTrainerMoneyToGive(gTrainerBattleOpponent_B); + money += GetTrainerMoneyToGive(TRAINER_BATTLE_PARAM.opponentB); AddMoney(&gSaveBlock1Ptr->money, money); } else @@ -8024,9 +8619,9 @@ static void Cmd_getmoneyreward(void) sPartyLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); } } - for (count = 0, i = 0; i < ARRAY_COUNT(sBadgeFlags); i++) + for (count = 0, i = 0; i < ARRAY_COUNT(gBadgeFlags); i++) { - if (FlagGet(sBadgeFlags[i]) == TRUE) + if (FlagGet(gBadgeFlags[i]) == TRUE) ++count; } money = sWhiteOutBadgeMoney[count] * sPartyLevel; @@ -8161,7 +8756,7 @@ static void Cmd_jumptocalledmove(void) ResetValuesForCalledMove(); - gBattlescriptCurrInstr = GET_MOVE_BATTLESCRIPT(gCurrentMove); + gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove); } static void Cmd_statusanimation(void) @@ -8288,7 +8883,7 @@ static void Cmd_setgravity(void) else { gFieldStatuses |= STATUS_FIELD_GRAVITY; - gFieldTimers.gravityTimer = 5; + gFieldTimers.gravityTimer = gBattleTurnCounter + 5; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -8299,12 +8894,12 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId) && GetBattlerAbility(battler) == ABILITY_CHEEK_POUCH && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) && gBattleStruct->ateBerry[GetBattlerSide(battler)] & (1u << gBattlerPartyIndexes[battler]) - && !BATTLER_MAX_HP(battler)) + && !IsBattlerAtMaxHp(battler)) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 3; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 3; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; gBattlerAbility = battler; BattleScriptPush(gBattlescriptCurrInstr + 2); gBattlescriptCurrInstr = BattleScript_CheekPouchActivates; @@ -8326,7 +8921,7 @@ static void BestowItem(u32 battlerAtk, u32 battlerDef) gBattleMons[battlerDef].item = gLastUsedItem; BtlController_EmitSetMonData(battlerDef, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battlerDef].item), &gBattleMons[battlerDef].item); MarkBattlerForControllerExec(battlerDef); - gBattleResources->flags->flags[battlerDef] &= ~RESOURCE_FLAG_UNBURDEN; + gDisableStructs[battlerDef].unburdenActive = FALSE; } // Called by Cmd_removeitem. itemId represents the item that was removed, not being given. @@ -8372,7 +8967,7 @@ static void Cmd_removeitem(void) // Popped Air Balloon cannot be restored by any means. // Corroded items cannot be restored either. if (GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_AIR_BALLOON - && gMovesInfo[gCurrentMove].effect != EFFECT_CORROSIVE_GAS) + && GetMoveEffect(gCurrentMove) != EFFECT_CORROSIVE_GAS) gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = itemId; // Remember if switched out gBattleMons[battler].item = ITEM_NONE; @@ -8773,7 +9368,7 @@ static void Cmd_hpthresholds2(void) { u32 battler = GetBattlerForBattleScript(cmd->battler); u32 opposingBattler = BATTLE_OPPOSITE(battler); - u8 hpSwitchout = *(gBattleStruct->hpOnSwitchout + GetBattlerSide(opposingBattler)); + u8 hpSwitchout = gBattleStruct->hpOnSwitchout[GetBattlerSide(opposingBattler)]; s32 result = (hpSwitchout - gBattleMons[opposingBattler].hp) * 100 / hpSwitchout; if (gBattleMons[opposingBattler].hp >= hpSwitchout) @@ -8800,8 +9395,8 @@ static void Cmd_useitemonopponent(void) static bool32 HasAttackerFaintedTarget(void) { - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && !IS_MOVE_STATUS(gCurrentMove) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && !IsBattleMoveStatus(gCurrentMove) && (gLastHitBy[gBattlerTarget] == 0xFF || gLastHitBy[gBattlerTarget] == gBattlerAttacker) && gBattleStruct->moveTarget[gBattlerAttacker] == gBattlerTarget && gBattlerTarget != gBattlerAttacker @@ -8815,7 +9410,7 @@ static bool32 HasAttackerFaintedTarget(void) bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget) { return GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION - || (!IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL) && !IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON)); + || !IS_BATTLER_ANY_TYPE(battlerTarget, TYPE_POISON, TYPE_STEEL); } bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget) @@ -8865,7 +9460,6 @@ static void RemoveAllWeather(void) static void RemoveAllTerrains(void) { - gFieldTimers.terrainTimer = 0; switch (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) { case STATUS_FIELD_MISTY_TERRAIN: @@ -9004,25 +9598,25 @@ u32 IsFlowerVeilProtected(u32 battler) return 0; } -u32 IsLeafGuardProtected(u32 battler) +u32 IsLeafGuardProtected(u32 battler, u32 ability) { if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) - return GetBattlerAbility(battler) == ABILITY_LEAF_GUARD; + return ability == ABILITY_LEAF_GUARD; else return 0; } -bool32 IsShieldsDownProtected(u32 battler) +bool32 IsShieldsDownProtected(u32 battler, u32 ability) { - return (GetBattlerAbility(battler) == ABILITY_SHIELDS_DOWN + return (ability == ABILITY_SHIELDS_DOWN && GetFormIdFromFormSpeciesId(gBattleMons[battler].species) < GetFormIdFromFormSpeciesId(SPECIES_MINIOR_CORE_RED)); // Minior is not in core form } -u32 IsAbilityStatusProtected(u32 battler) +u32 IsAbilityStatusProtected(u32 battler, u32 ability) { - return IsFlowerVeilProtected(battler) - || IsLeafGuardProtected(battler) - || IsShieldsDownProtected(battler); + return IsLeafGuardProtected(battler, ability) + || IsShieldsDownProtected(battler, ability) + || IsFlowerVeilProtected(battler); } u32 GetHighestStatId(u32 battler) @@ -9064,11 +9658,11 @@ static bool32 IsElectricAbilityAffected(u32 battler, u32 ability) u32 moveType; if (gBattleStruct->dynamicMoveType == 0) - moveType = gMovesInfo[gCurrentMove].type; + moveType = GetMoveType(gCurrentMove); else if (!(gBattleStruct->dynamicMoveType & F_DYNAMIC_TYPE_IGNORE_PHYSICALITY)) moveType = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; else - moveType = gMovesInfo[gCurrentMove].type; + moveType = GetMoveType(gCurrentMove); if (moveType == TYPE_ELECTRIC && (ability != ABILITY_LIGHTNING_ROD || B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) @@ -9108,8 +9702,10 @@ static bool32 IsTeatimeAffected(u32 battler) sideTimerOpp->structField = BATTLE_OPPOSITE(temp); \ } \ -static void CourtChangeSwapSideStatuses(void) +void BS_CourtChangeSwapSideStatuses(void) { + NATIVE_ARGS(); + struct SideTimer *sideTimerPlayer = &gSideTimers[B_SIDE_PLAYER]; struct SideTimer *sideTimerOpp = &gSideTimers[B_SIDE_OPPONENT]; u32 temp; @@ -9150,6 +9746,8 @@ static void CourtChangeSwapSideStatuses(void) // Swap what type set the Gigantamax damage over time effect SWAP(sideTimerPlayer->damageNonTypesType, sideTimerOpp->damageNonTypesType, temp); + + gBattlescriptCurrInstr = cmd->nextInstr; } static void HandleScriptMegaPrimalBurst(u32 caseId, u32 battler, u32 type) @@ -9292,7 +9890,7 @@ static void Cmd_various(void) case VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED: { VARIOUS_ARGS(const u8 *jumpInstr); - if (IsShieldsDownProtected(battler)) + if (IsShieldsDownProtected(battler, GetBattlerAbility(battler))) { gBattlerAbility = battler; gBattlescriptCurrInstr = cmd->jumpInstr; @@ -9353,7 +9951,7 @@ static void Cmd_various(void) else { gFieldStatuses |= STATUS_FIELD_FAIRY_LOCK; - gFieldTimers.fairyLockTimer = 2; + gFieldTimers.fairyLockTimer = gBattleTurnCounter + 2; gBattlescriptCurrInstr = cmd->nextInstr; } return; @@ -9362,16 +9960,16 @@ static void Cmd_various(void) { VARIOUS_ARGS(u8 stat); i = cmd->stat; - gBattleMoveDamage = *(u16 *)(&gBattleMons[battler].attack) + (i - 1); - gBattleMoveDamage *= gStatStageRatios[gBattleMons[battler].statStages[i]][0]; - gBattleMoveDamage /= gStatStageRatios[gBattleMons[battler].statStages[i]][1]; + gBattleStruct->moveDamage[gBattlerAttacker] = *(u16 *)(&gBattleMons[battler].attack) + (i - 1); + gBattleStruct->moveDamage[gBattlerAttacker] *= gStatStageRatios[gBattleMons[battler].statStages[i]][0]; + gBattleStruct->moveDamage[gBattlerAttacker] /= gStatStageRatios[gBattleMons[battler].statStages[i]][1]; gBattlescriptCurrInstr = cmd->nextInstr; return; } case VARIOUS_JUMP_IF_FULL_HP: { VARIOUS_ARGS(const u8 *jumpInstr); - if (BATTLER_MAX_HP(battler)) + if (IsBattlerAtMaxHp(battler)) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -9428,7 +10026,7 @@ static void Cmd_various(void) case VARIOUS_TRACE_ABILITY: { VARIOUS_ARGS(); - gBattleMons[battler].ability = gBattleStruct->overwrittenAbilities[battler] = gBattleStruct->tracedAbility[battler]; + gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = gBattleStruct->tracedAbility[battler]; break; } case VARIOUS_TRY_ILLUSION_OFF: @@ -9473,7 +10071,7 @@ static void Cmd_various(void) { VARIOUS_ARGS(const u8 *failInstr); if ((gStatuses3[battler] & (STATUS3_SEMI_INVULNERABLE | STATUS3_HEAL_BLOCK)) - || BATTLER_MAX_HP(battler) + || IsBattlerAtMaxHp(battler) || !gBattleMons[battler].hp || !(IsBattlerGrounded(battler))) { @@ -9481,10 +10079,10 @@ static void Cmd_various(void) } else { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -9553,7 +10151,7 @@ static void Cmd_various(void) case VARIOUS_GET_MOVE_TARGET: { VARIOUS_ARGS(); - gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); break; } case VARIOUS_GET_BATTLER_FAINTED: @@ -9747,7 +10345,7 @@ static void Cmd_various(void) case VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT: { VARIOUS_ARGS(); - gBattleStruct->alreadyStatusedMoveAttempt |= 1u << battler; + gBattleStruct->battlerState[battler].alreadyStatusedMoveAttempt = TRUE; break; } case VARIOUS_PALACE_TRY_ESCAPE_STATUS: @@ -9938,7 +10536,7 @@ static void Cmd_various(void) case VARIOUS_TRY_ACTIVATE_FELL_STINGER: { VARIOUS_ARGS(); - if (gMovesInfo[gCurrentMove].effect == EFFECT_FELL_STINGER + if (GetMoveEffect(gCurrentMove) == EFFECT_FELL_STINGER && HasAttackerFaintedTarget() && !NoAliveMonsForEitherParty() && CompareStat(gBattlerAttacker, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -9966,7 +10564,7 @@ static void Cmd_various(void) { gSideStatuses[GetBattlerSide(battler)] |= SIDE_STATUS_LUCKY_CHANT; gSideTimers[GetBattlerSide(battler)].luckyChantBattlerId = battler; - gSideTimers[GetBattlerSide(battler)].luckyChantTimer = 5; + gSideTimers[GetBattlerSide(battler)].luckyChantTimer = gBattleTurnCounter + 5; gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -9982,7 +10580,7 @@ static void Cmd_various(void) gBattlescriptCurrInstr = cmd->failInstr; else if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) gBattlescriptCurrInstr = cmd->failInstr; - else if (IS_MOVE_STATUS(gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]])) + else if (IsBattleMoveStatus(gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]])) gBattlescriptCurrInstr = cmd->failInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -10008,7 +10606,7 @@ static void Cmd_various(void) gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerTarget].ability; - gBattleMons[gBattlerTarget].ability = gBattleStruct->overwrittenAbilities[gBattlerTarget] = ABILITY_SIMPLE; + gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = ABILITY_SIMPLE; gBattlescriptCurrInstr = cmd->nextInstr; } return; @@ -10036,7 +10634,7 @@ static void Cmd_various(void) } else { - gBattleMons[gBattlerTarget].ability = gBattleStruct->overwrittenAbilities[gBattlerTarget] = gBattleMons[gBattlerAttacker].ability; + gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -10064,12 +10662,12 @@ static void Cmd_various(void) { VARIOUS_ARGS(const u8 *failInstr); u16 move = gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]; - if (IS_MOVE_STATUS(move) || gMovesInfo[move].meFirstBanned + if (IsBattleMoveStatus(move) || IsMoveMeFirstBanned(move) || GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) gBattlescriptCurrInstr = cmd->failInstr; else { - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IS_MOVE_STATUS(move)) + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) { gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; gCalledMove = GetTypeBasedZMove(move); @@ -10079,7 +10677,7 @@ static void Cmd_various(void) gCalledMove = move; } gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); + gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gStatuses3[gBattlerAttacker] |= STATUS3_ME_FIRST; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -10111,16 +10709,18 @@ static void Cmd_various(void) case VARIOUS_TRY_SOAK: { VARIOUS_ARGS(const u8 *failInstr); - if ((GetBattlerType(gBattlerTarget, 0, FALSE) == gMovesInfo[gCurrentMove].type - && GetBattlerType(gBattlerTarget, 1, FALSE) == gMovesInfo[gCurrentMove].type) - || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) + u32 types[3]; + GetBattlerTypes(gBattlerTarget, FALSE, types); + u32 moveType = GetMoveType(gCurrentMove); + if ((types[0] == moveType && types[1] == moveType) + || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) { gBattlescriptCurrInstr = cmd->failInstr; } else { - SET_BATTLER_TYPE(gBattlerTarget, gMovesInfo[gCurrentMove].type); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, gMovesInfo[gCurrentMove].type); + SET_BATTLER_TYPE(gBattlerTarget, moveType); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); gBattlescriptCurrInstr = cmd->nextInstr; } return; @@ -10165,7 +10765,7 @@ static void Cmd_various(void) case VARIOUS_SET_ARG_TO_BATTLE_DAMAGE: { VARIOUS_ARGS(); - gBattleMoveDamage = gMovesInfo[gCurrentMove].argument; + gBattleStruct->moveDamage[gBattlerTarget] = GetMoveFixedDamage(gCurrentMove); break; } case VARIOUS_TRY_AUTOTOMIZE: @@ -10187,8 +10787,8 @@ static void Cmd_various(void) VARIOUS_ARGS(const u8 *failInstr); u16 move = gLastPrintedMoves[gBattlerTarget]; if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || MoveHasAdditionalEffectSelf(move, MOVE_EFFECT_RECHARGE) - || gMovesInfo[move].instructBanned - || gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect + || IsMoveInstructBanned(move) + || gBattleMoveEffects[GetMoveEffect(move)].twoTurnEffect || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) || IsZMove(move) || IsMaxMove(move)) @@ -10197,7 +10797,7 @@ static void Cmd_various(void) } else { - gSpecialStatuses[gBattlerTarget].instructedChosenTarget = *(gBattleStruct->moveTarget + gBattlerTarget) | 0x4; + gSpecialStatuses[gBattlerTarget].instructedChosenTarget = gBattleStruct->moveTarget[gBattlerTarget] | 0x4; gCalledMove = move; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -10259,7 +10859,7 @@ static void Cmd_various(void) } case VARIOUS_PSYCHO_SHIFT: { - VARIOUS_ARGS(const u8 *failInstr); + VARIOUS_ARGS(const u8 *failInstr, const u8 *sleepClauseFailInstr); u32 targetAbility = GetBattlerAbility(gBattlerTarget); // Psycho shift works if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_POISON) && CanBePoisoned(gBattlerAttacker, gBattlerTarget, targetAbility)) @@ -10270,10 +10870,15 @@ static void Cmd_various(void) gBattleCommunication[MULTISTRING_CHOOSER] = 2; else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && CanBeParalyzed(gBattlerTarget, targetAbility)) gBattleCommunication[MULTISTRING_CHOOSER] = 3; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) && CanBeSlept(gBattlerTarget, targetAbility)) + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) && CanBeSlept(gBattlerTarget, targetAbility, BLOCKED_BY_SLEEP_CLAUSE)) gBattleCommunication[MULTISTRING_CHOOSER] = 4; else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE) && CanGetFrostbite(gBattlerTarget)) gBattleCommunication[MULTISTRING_CHOOSER] = 5; + else if (IsSleepClauseActiveForSide(GetBattlerSide(battler))) + { + gBattlescriptCurrInstr = cmd->sleepClauseFailInstr; + return; + } else { gBattlescriptCurrInstr = cmd->failInstr; @@ -10284,11 +10889,16 @@ static void Cmd_various(void) BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; + TryActivateSleepClause(battler, gBattlerPartyIndexes[battler]); return; } case VARIOUS_CURE_STATUS: { VARIOUS_ARGS(); + + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + gBattleMons[battler].status1 = 0; BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); @@ -10378,7 +10988,7 @@ static void Cmd_various(void) case VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF: { VARIOUS_ARGS(); - if ((i = ShouldDoTrainerSlide(battler, TRAINER_SLIDE_FIRST_DOWN))) + if ((i = ShouldDoTrainerSlide(battler, TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN))) { gBattleScripting.battler = battler; BattleScriptPush(cmd->nextInstr); @@ -10403,18 +11013,18 @@ static void Cmd_various(void) { VARIOUS_ARGS(); if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_AURORA_VEIL - || !(WEATHER_HAS_EFFECT && gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + || !(HasWeatherEffect() && gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = 0; } else { gSideStatuses[GetBattlerSide(battler)] |= SIDE_STATUS_AURORA_VEIL; if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = 8; + gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = gBattleTurnCounter + 8; else - gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = 5; + gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = gBattleTurnCounter + 5; gSideTimers[GetBattlerSide(battler)].auroraVeilBattlerId = battler; if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) @@ -10427,14 +11037,15 @@ static void Cmd_various(void) case VARIOUS_TRY_THIRD_TYPE: { VARIOUS_ARGS(const u8 *failInstr); - if (IS_BATTLER_OF_TYPE(battler, gMovesInfo[gCurrentMove].argument) || GetActiveGimmick(battler) == GIMMICK_TERA) + u32 type = GetMoveArgType(gCurrentMove); + if (IS_BATTLER_OF_TYPE(battler, type) || GetActiveGimmick(battler) == GIMMICK_TERA) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattleMons[battler].types[2] = gMovesInfo[gCurrentMove].argument; - PREPARE_TYPE_BUFFER(gBattleTextBuff1, gMovesInfo[gCurrentMove].argument); + gBattleMons[battler].types[2] = type; + PREPARE_TYPE_BUFFER(gBattleTextBuff1, type); gBattlescriptCurrInstr = cmd->nextInstr; } return; @@ -10567,10 +11178,10 @@ static void Cmd_various(void) case VARIOUS_TRY_HEAL_QUARTER_HP: { VARIOUS_ARGS(const u8 *failInstr); - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; if (gBattleMons[battler].hp == gBattleMons[battler].maxHP) gBattlescriptCurrInstr = cmd->failInstr; // fail @@ -10787,7 +11398,7 @@ static void Cmd_various(void) case VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL: { VARIOUS_ARGS(const u8 *jumpInstr); - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) == SPECIES_NONE) + if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) == gBattleMons[battler].species) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -10815,7 +11426,7 @@ static void Cmd_various(void) case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED: { VARIOUS_ARGS(const u8 *jumpInstr); - if (IsLeafGuardProtected(battler)) + if (IsLeafGuardProtected(battler, GetBattlerAbility(battler))) { gBattlerAbility = battler; gBattlescriptCurrInstr = cmd->jumpInstr; @@ -10854,7 +11465,7 @@ static void Cmd_various(void) } if (atLeastOneStatBoosted && gBattleMons[gBattlerAttacker].hp > hpFraction) { - gBattleMoveDamage = hpFraction; + gBattleStruct->moveDamage[gBattlerAttacker] = hpFraction; gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -10987,44 +11598,6 @@ static void Cmd_various(void) gBattleMons[battler].item = gLastUsedItem; break; } - case VARIOUS_SWAP_SIDE_STATUSES: - { - VARIOUS_ARGS(); - CourtChangeSwapSideStatuses(); - break; - } - case VARIOUS_SWAP_STATS: - { - VARIOUS_ARGS(u8 stat); - - u8 stat = cmd->stat; - u16 temp; - - switch (stat) - { - case STAT_HP: - SWAP(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerTarget].hp, temp); - break; - case STAT_ATK: - SWAP(gBattleMons[gBattlerAttacker].attack, gBattleMons[gBattlerTarget].attack, temp); - break; - case STAT_DEF: - SWAP(gBattleMons[gBattlerAttacker].defense, gBattleMons[gBattlerTarget].defense, temp); - break; - case STAT_SPEED: - SWAP(gBattleMons[gBattlerAttacker].speed, gBattleMons[gBattlerTarget].speed, temp); - break; - case STAT_SPATK: - SWAP(gBattleMons[gBattlerAttacker].spAttack, gBattleMons[gBattlerTarget].spAttack, temp); - break; - case STAT_SPDEF: - SWAP(gBattleMons[gBattlerAttacker].spDefense, gBattleMons[gBattlerTarget].spDefense, temp); - break; - } - PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } } // End of switch (cmd->id) gBattlescriptCurrInstr = cmd->nextInstr; @@ -11033,9 +11606,10 @@ static void Cmd_various(void) static void TryResetProtectUseCounter(u32 battler) { u32 lastMove = gLastResultingMoves[battler]; + u32 lastEffect = GetMoveEffect(lastMove); if (lastMove == MOVE_UNAVAILABLE - || (!gBattleMoveEffects[gMovesInfo[lastMove].effect].usesProtectCounter - && ((B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9 && gMovesInfo[lastMove].effect != EFFECT_ALLY_SWITCH) + || (!gBattleMoveEffects[lastEffect].usesProtectCounter + && ((B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9 && lastEffect != EFFECT_ALLY_SWITCH) || B_ALLY_SWITCH_FAIL_CHANCE < GEN_9))) gDisableStructs[battler].protectUses = 0; } @@ -11055,9 +11629,9 @@ static void Cmd_setprotectlike(void) || (gCurrentMove == MOVE_WIDE_GUARD && B_WIDE_GUARD != GEN_5) || (gCurrentMove == MOVE_QUICK_GUARD && B_QUICK_GUARD != GEN_5)) { - if (!gMovesInfo[gCurrentMove].argument) // Protects one mon only. + if (!GetMoveProtectSide(gCurrentMove)) // Protects one mon only. { - if (gMovesInfo[gCurrentMove].effect == EFFECT_ENDURE) + if (GetMoveEffect(gCurrentMove) == EFFECT_ENDURE) { gProtectStructs[gBattlerAttacker].endured = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BRACED_ITSELF; @@ -11143,7 +11717,7 @@ static void Cmd_setprotectlike(void) { gDisableStructs[gBattlerAttacker].protectUses = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECT_FAILED; - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; } gBattlescriptCurrInstr = cmd->nextInstr; @@ -11156,7 +11730,7 @@ static void Cmd_tryexplosion(void) if (gBattleControllerExecFlags) return; - gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp; + gBattleStruct->moveDamage[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; BtlController_EmitHealthBarUpdate(gBattlerAttacker, BUFFER_A, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gBattlerAttacker); gBattlescriptCurrInstr = cmd->nextInstr; @@ -11205,10 +11779,10 @@ static void Cmd_tryhealhalfhealth(void) if (cmd->battler == BS_ATTACKER) gBattlerTarget = gBattlerAttacker; - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerTarget) / 2; + if (gBattleStruct->moveDamage[gBattlerTarget] == 0) + gBattleStruct->moveDamage[gBattlerTarget] = 1; + gBattleStruct->moveDamage[gBattlerTarget] *= -1; if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) gBattlescriptCurrInstr = failInstr; @@ -11220,7 +11794,7 @@ static void SetMoveForMirrorMove(u32 move) { gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; // Edge case, we used Z Mirror Move, got the stat boost and now need to use the Z-move - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IS_MOVE_STATUS(move)) + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) { gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; gCurrentMove = GetTypeBasedZMove(move); @@ -11230,9 +11804,9 @@ static void SetMoveForMirrorMove(u32 move) gCurrentMove = move; } - gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); ResetValuesForCalledMove(); - gBattlescriptCurrInstr = GET_MOVE_BATTLESCRIPT(gCurrentMove); + gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove); } static void Cmd_trymirrormove(void) @@ -11275,31 +11849,31 @@ static void Cmd_setfieldweather(void) { CMD_ARGS(u8 weather); - u8 weather = cmd->weather; + u8 battleWeatherId = cmd->weather; - if (!TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) + if (!TryChangeBattleWeather(gBattlerAttacker, battleWeatherId, FALSE)) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; gBattlescriptCurrInstr = cmd->nextInstr; return; } - switch (weather) + switch (battleWeatherId) { - case ENUM_WEATHER_RAIN: + case BATTLE_WEATHER_RAIN: gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_RAIN; break; - case ENUM_WEATHER_SUN: + case BATTLE_WEATHER_SUN: gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SUNLIGHT; break; - case ENUM_WEATHER_SANDSTORM: + case BATTLE_WEATHER_SANDSTORM: gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SANDSTORM; break; - case ENUM_WEATHER_HAIL: + case BATTLE_WEATHER_HAIL: gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_HAIL; break; - case ENUM_WEATHER_SNOW: + case BATTLE_WEATHER_SNOW: gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SNOW; break; } @@ -11310,26 +11884,12 @@ static void Cmd_setfieldweather(void) static void Cmd_setreflect(void) { CMD_ARGS(); - - if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_REFLECT) + if (!TrySetReflect(gBattlerAttacker)) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } - else - { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_REFLECT; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectTimer = 8; - else - gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectTimer = 5; - gSideTimers[GetBattlerSide(gBattlerAttacker)].reflectBattlerId = gBattlerAttacker; - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE; - } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -11337,14 +11897,14 @@ static void Cmd_setseeded(void) { CMD_ARGS(); - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_MISS; } else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS)) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_FAIL; } else @@ -11357,6 +11917,7 @@ static void Cmd_setseeded(void) gBattlescriptCurrInstr = cmd->nextInstr; } +// TODO: Needs tests for everything static void Cmd_manipulatedamage(void) { CMD_ARGS(u8 mode); @@ -11364,44 +11925,44 @@ static void Cmd_manipulatedamage(void) switch (cmd->mode) { case DMG_CHANGE_SIGN: - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[gBattlerAttacker] *= -1; break; case DMG_RECOIL_FROM_MISS: if (B_RECOIL_IF_MISS_DMG >= GEN_5) { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; } else if (B_RECOIL_IF_MISS_DMG == GEN_4) { - if ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleMoveDamage) - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 2; + if ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleStruct->moveDamage[gBattlerTarget]) + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerTarget) / 2; } else { - gBattleMoveDamage /= 2; + gBattleStruct->moveDamage[gBattlerAttacker] = gBattleStruct->moveDamage[gBattlerTarget] /= 2; } - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; break; case DMG_DOUBLED: - gBattleMoveDamage *= 2; + gBattleStruct->moveDamage[gBattlerTarget] *= 2; break; case DMG_1_8_TARGET_HP: - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerTarget) / 8; + if (gBattleStruct->moveDamage[gBattlerTarget] == 0) + gBattleStruct->moveDamage[gBattlerTarget] = 1; break; case DMG_FULL_ATTACKER_HP: - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker); + gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerAttacker); break; case DMG_BIG_ROOT: - gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); + gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); break; case DMG_CURR_ATTACKER_HP: - gBattleMoveDamage = GetNonDynamaxHP(gBattlerAttacker); + gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerAttacker); break; case DMG_RECOIL_FROM_IMMUNE: - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 2; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerTarget) / 2; break; } @@ -11414,7 +11975,7 @@ static void Cmd_trysetrest(void) const u8 *failInstr = cmd->failInstr; gBattlerTarget = gBattlerAttacker; - gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP * (-1); + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP * (-1); if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) { @@ -11516,7 +12077,7 @@ static void Cmd_stockpile(void) case 0: if (gDisableStructs[gBattlerAttacker].stockpileCounter >= 3) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_STOCKPILE; } else @@ -11529,7 +12090,7 @@ static void Cmd_stockpile(void) } break; case 1: // Save def/sp def stats. - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { gDisableStructs[gBattlerAttacker].stockpileDef += gBattleMons[gBattlerAttacker].statStages[STAT_DEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeDef; gDisableStructs[gBattlerAttacker].stockpileSpDef += gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef; @@ -11586,19 +12147,19 @@ static void Cmd_stockpiletohpheal(void) { if (gDisableStructs[gBattlerAttacker].stockpileCounter > 0) { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; gBattleStruct->moveEffect2 = MOVE_EFFECT_STOCKPILE_WORE_OFF; } else // Snatched move { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; gBattleScripting.animTurn = 1; } - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; + gBattleStruct->moveDamage[gBattlerAttacker] *= -1; gBattlescriptCurrInstr = cmd->nextInstr; gBattlerTarget = gBattlerAttacker; @@ -11611,13 +12172,10 @@ static void Cmd_setdrainedhp(void) { CMD_ARGS(); - if (gMovesInfo[gCurrentMove].argument != 0) - gBattleMoveDamage = (gHpDealt * gMovesInfo[gCurrentMove].argument / 100); - else - gBattleMoveDamage = (gHpDealt / 2); + gBattleStruct->moveDamage[gBattlerAttacker] = (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -11759,7 +12317,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr return STAT_CHANGE_DIDNT_WORK; } else if (gCurrentMove != MOVE_CURSE - && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(gCurrentMove)) + && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE)) { gBattlescriptCurrInstr = BattleScript_ButItFailed; return STAT_CHANGE_DIDNT_WORK; @@ -11931,7 +12489,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr // Check Mirror Herb / Opportunist for (index = 0; index < gBattlersCount; index++) { - if (GetBattlerSide(index) == GetBattlerSide(battler)) + if (IsBattlerAlly(index, battler)) continue; // Only triggers on opposing side if (GetBattlerAbility(index) == ABILITY_OPPORTUNIST @@ -11960,7 +12518,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattleMons[battler].statStages[statId] = MAX_STAT_STAGE; if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && flags & STAT_CHANGE_ALLOW_PTR) - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && !(flags & STAT_CHANGE_ALLOW_PTR)) return STAT_CHANGE_DIDNT_WORK; @@ -12032,7 +12590,7 @@ static void Cmd_twoturnmoveschargestringandanimation(void) { CMD_ARGS(const u8 *animationThenStringPtr); - gBattleScripting.savedStringId = LOHALF(gMovesInfo[gCurrentMove].argument); + gBattleScripting.savedStringId = GetMoveTwoTurnAttackStringId(gCurrentMove); if (B_UPDATED_MOVE_DATA < GEN_5 || MoveHasChargeTurnAdditionalEffect(gCurrentMove)) gBattlescriptCurrInstr = cmd->animationThenStringPtr; else @@ -12208,10 +12766,10 @@ static void Cmd_forcerandomswitch(void) } else { - *(gBattleStruct->battlerPartyIndexes + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget]; + gBattleStruct->battlerPartyIndexes[gBattlerTarget] = gBattlerPartyIndexes[gBattlerTarget]; gBattlescriptCurrInstr = BattleScript_RoarSuccessSwitch; - gBattleStruct->forcedSwitch |= 1u << gBattlerTarget; - *(gBattleStruct->monToSwitchIntoId + gBattlerTarget) = validMons[RandomUniform(RNG_FORCE_RANDOM_SWITCH, 0, validMonsCount - 1)]; + gBattleStruct->battlerState[gBattlerTarget].forcedSwitch = TRUE; + gBattleStruct->monToSwitchIntoId[gBattlerTarget] = validMons[RandomUniform(RNG_FORCE_RANDOM_SWITCH, 0, validMonsCount - 1)]; if (!IsMultiBattle()) SwitchPartyOrder(gBattlerTarget); @@ -12260,7 +12818,7 @@ static void Cmd_tryconversiontypechange(void) { if (gBattleMons[gBattlerAttacker].moves[moveChecked] != MOVE_NONE) { - moveType = gMovesInfo[gBattleMons[gBattlerAttacker].moves[moveChecked]].type; + moveType = GetMoveType(gBattleMons[gBattlerAttacker].moves[moveChecked]); break; } } @@ -12288,7 +12846,7 @@ static void Cmd_tryconversiontypechange(void) for (moveChecked = 0; moveChecked < validMoves; moveChecked++) { - moveType = gMovesInfo[gBattleMons[gBattlerAttacker].moves[moveChecked]].type; + moveType = GetMoveType(gBattleMons[gBattlerAttacker].moves[moveChecked]); if (moveType == TYPE_MYSTERY) { @@ -12315,7 +12873,7 @@ static void Cmd_tryconversiontypechange(void) { while ((moveChecked = MOD(Random(), MAX_MON_MOVES)) >= validMoves); - moveType = gMovesInfo[gBattleMons[gBattlerAttacker].moves[moveChecked]].type; + moveType = GetMoveType(gBattleMons[gBattlerAttacker].moves[moveChecked]); if (moveType == TYPE_MYSTERY) { @@ -12359,25 +12917,11 @@ static void Cmd_setlightscreen(void) { CMD_ARGS(); - if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_LIGHTSCREEN) + if (!TrySetLightScreen(gBattlerAttacker)) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } - else - { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_LIGHTSCREEN; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenTimer = 8; - else - gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenTimer = 5; - gSideTimers[GetBattlerSide(gBattlerAttacker)].lightscreenBattlerId = gBattlerAttacker; - - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE; - } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12393,7 +12937,7 @@ static void Cmd_tryKO(void) // Dynamaxed Pokemon cannot be hit by OHKO moves. if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_UNAFFECTED; gBattlescriptCurrInstr = cmd->failInstr; return; @@ -12406,7 +12950,7 @@ static void Cmd_tryKO(void) gSpecialStatuses[gBattlerTarget].focusBanded = TRUE; RecordItemEffectBattle(gBattlerTarget, holdEffect); } - else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && BATTLER_MAX_HP(gBattlerTarget)) + else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && IsBattlerAtMaxHp(gBattlerTarget)) { gSpecialStatuses[gBattlerTarget].focusSashed = TRUE; RecordItemEffectBattle(gBattlerTarget, holdEffect); @@ -12414,7 +12958,7 @@ static void Cmd_tryKO(void) if (targetAbility == ABILITY_STURDY) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gLastUsedAbility = ABILITY_STURDY; gBattlescriptCurrInstr = BattleScript_SturdyPreventsOHKO; gBattlerAbility = gBattlerTarget; @@ -12431,7 +12975,7 @@ static void Cmd_tryKO(void) } else { - u16 odds = gMovesInfo[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); + u16 odds = GetMoveAccuracy(gCurrentMove) + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); if (B_SHEER_COLD_ACC >= GEN_7 && gCurrentMove == MOVE_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)) odds -= 10; if (RandomPercentage(RNG_ACCURACY, odds) && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) @@ -12442,30 +12986,30 @@ static void Cmd_tryKO(void) { if (gProtectStructs[gBattlerTarget].endured) { - gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp - 1; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FOE_ENDURED; } else if (gSpecialStatuses[gBattlerTarget].focusBanded || gSpecialStatuses[gBattlerTarget].focusSashed) { - gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp - 1; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FOE_HUNG_ON; gLastUsedItem = gBattleMons[gBattlerTarget].item; } else if (B_AFFECTION_MECHANICS == TRUE && gSpecialStatuses[gBattlerTarget].affectionEndured) { - gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED_AFFECTION; + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp - 1; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FOE_ENDURED_AFFECTION; } else { - gBattleMoveDamage = gBattleMons[gBattlerTarget].hp; - gMoveResultFlags |= MOVE_RESULT_ONE_HIT_KO; + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_ONE_HIT_KO; } gBattlescriptCurrInstr = cmd->nextInstr; } else { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_MISS; else @@ -12480,15 +13024,18 @@ static void Cmd_damagetohalftargethp(void) { CMD_ARGS(); - gBattleMoveDamage = GetNonDynamaxHP(gBattlerTarget) / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) / 2; + if (gBattleStruct->moveDamage[gBattlerTarget] == 0) + gBattleStruct->moveDamage[gBattlerTarget] = 1; gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_unused_95(void) +static void Cmd_copybidedmg(void) { + CMD_ARGS(); + gBattleStruct->moveDamage[gBattlerTarget] = gBideDmg[gBattlerAttacker] * 2; + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_unused_96(void) @@ -12574,12 +13121,12 @@ static void Cmd_setmist(void) if (gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer) { - gMoveResultFlags |= MOVE_RESULT_FAILED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MIST_FAILED; } else { - gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer = 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer = gBattleTurnCounter + 5; gSideTimers[GetBattlerSide(gBattlerAttacker)].mistBattlerId = gBattlerAttacker; gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_MIST; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MIST; @@ -12591,14 +13138,15 @@ static void Cmd_setfocusenergy(void) { CMD_ARGS(u8 battler); u8 battler = GetBattlerForBattleScript(cmd->battler); + u32 effect = GetMoveEffect(gCurrentMove); - if ((gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_CHEER && (!(IsDoubleBattle()) || (gAbsentBattlerFlags & (1u << battler)))) + if ((effect == EFFECT_DRAGON_CHEER && (!(IsDoubleBattle()) || (gAbsentBattlerFlags & (1u << battler)))) || gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) { - gMoveResultFlags |= MOVE_RESULT_FAILED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FOCUS_ENERGY_FAILED; } - else if (gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_CHEER && !IS_BATTLER_OF_TYPE(battler, TYPE_DRAGON)) + else if (effect == EFFECT_DRAGON_CHEER && !IS_BATTLER_OF_TYPE(battler, TYPE_DRAGON)) { gBattleMons[battler].status2 |= STATUS2_DRAGON_CHEER; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; @@ -12624,7 +13172,7 @@ static void Cmd_transformdataexecution(void) || gBattleStruct->illusion[gBattlerTarget].on || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE_NO_COMMANDER) { - gMoveResultFlags |= MOVE_RESULT_FAILED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORM_FAILED; } else @@ -12652,11 +13200,12 @@ static void Cmd_transformdataexecution(void) for (i = 0; i < offsetof(struct BattlePokemon, pp); i++) battleMonAttacker[i] = battleMonTarget[i]; - gBattleStruct->overwrittenAbilities[gBattlerAttacker] = GetBattlerAbility(gBattlerTarget); + gDisableStructs[gBattlerAttacker].overwrittenAbility = GetBattlerAbility(gBattlerTarget); for (i = 0; i < MAX_MON_MOVES; i++) { - if (gMovesInfo[gBattleMons[gBattlerAttacker].moves[i]].pp < 5) - gBattleMons[gBattlerAttacker].pp[i] = gMovesInfo[gBattleMons[gBattlerAttacker].moves[i]].pp; + u32 pp = GetMovePP(gBattleMons[gBattlerAttacker].moves[i]); + if (pp < 5) + gBattleMons[gBattlerAttacker].pp[i] = pp; else gBattleMons[gBattlerAttacker].pp[i] = 5; } @@ -12675,7 +13224,7 @@ static void Cmd_setsubstitute(void) { CMD_ARGS(); - u32 factor = gMovesInfo[gCurrentMove].effect == EFFECT_SHED_TAIL ? 2 : 4; + u32 factor = GetMoveEffect(gCurrentMove) == EFFECT_SHED_TAIL ? 2 : 4; u32 hp; if (factor == 2) @@ -12688,21 +13237,21 @@ static void Cmd_setsubstitute(void) if (gBattleMons[gBattlerAttacker].hp <= hp) { - gBattleMoveDamage = 0; + gBattleStruct->moveDamage[gBattlerAttacker] = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SUBSTITUTE_FAILED; } else { - gBattleMoveDamage = hp; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = hp; // one bit value will only work for Pokémon which max hp can go to 1020(which is more than possible in games) + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; gBattleMons[gBattlerAttacker].status2 |= STATUS2_SUBSTITUTE; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; if (factor == 2) - gDisableStructs[gBattlerAttacker].substituteHP = gBattleMoveDamage / 2; + gDisableStructs[gBattlerAttacker].substituteHP = gBattleStruct->moveDamage[gBattlerAttacker] / 2; else - gDisableStructs[gBattlerAttacker].substituteHP = gBattleMoveDamage; + gDisableStructs[gBattlerAttacker].substituteHP = gBattleStruct->moveDamage[gBattlerAttacker]; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SUBSTITUTE; gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE; } @@ -12714,7 +13263,7 @@ static void Cmd_mimicattackcopy(void) { CMD_ARGS(const u8 *failInstr); - if ((gMovesInfo[gLastMoves[gBattlerTarget]].mimicBanned) + if ((IsMoveMimicBanned(gLastMoves[gBattlerTarget])) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) || gLastMoves[gBattlerTarget] == MOVE_NONE || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE) @@ -12735,8 +13284,9 @@ static void Cmd_mimicattackcopy(void) { gChosenMove = 0xFFFF; gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastMoves[gBattlerTarget]; - if (gMovesInfo[gLastMoves[gBattlerTarget]].pp < 5) - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gMovesInfo[gLastMoves[gBattlerTarget]].pp; + u32 pp = GetMovePP(gLastMoves[gBattlerTarget]); + if (pp < 5) + gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = pp; else gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 5; @@ -12754,8 +13304,8 @@ static void Cmd_mimicattackcopy(void) static bool32 InvalidMetronomeMove(u32 move) { - return gMovesInfo[move].effect == EFFECT_PLACEHOLDER - || gMovesInfo[move].metronomeBanned; + return GetMoveEffect(move) == EFFECT_PLACEHOLDER + || IsMoveMetronomeBanned(move); } static void Cmd_metronome(void) @@ -12784,8 +13334,8 @@ static void Cmd_metronome(void) gCurrentMove = RandomUniformExcept(RNG_METRONOME, 1, moveCount - 1, InvalidMetronomeMove); PrepareStringBattle(STRINGID_WAGGLINGAFINGER, gBattlerAttacker); - gBattlescriptCurrInstr = GET_MOVE_BATTLESCRIPT(gCurrentMove); - gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove); + gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); ResetValuesForCalledMove(); } @@ -12793,7 +13343,7 @@ static void Cmd_dmgtolevel(void) { CMD_ARGS(); - gBattleMoveDamage = gBattleMons[gBattlerAttacker].level; + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerAttacker].level; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12802,7 +13352,7 @@ static void Cmd_psywavedamageeffect(void) CMD_ARGS(); s32 randDamage = B_PSYWAVE_DMG >= GEN_6 ? (Random() % 101) : ((Random() % 11) * 10); - gBattleMoveDamage = gBattleMons[gBattlerAttacker].level * (randDamage + 50) / 100; + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerAttacker].level * (randDamage + 50) / 100; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12817,7 +13367,7 @@ static void Cmd_counterdamagecalculator(void) && sideAttacker != sideTarget && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp) { - gBattleMoveDamage = gProtectStructs[gBattlerAttacker].physicalDmg * 2; + gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].physicalDmg * 2; if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) gBattlerTarget = gSideTimers[sideTarget].followmeTarget; @@ -12844,7 +13394,7 @@ static void Cmd_mirrorcoatdamagecalculator(void) && sideAttacker != sideTarget && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp) { - gBattleMoveDamage = gProtectStructs[gBattlerAttacker].specialDmg * 2; + gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].specialDmg * 2; if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) gBattlerTarget = gSideTimers[sideTarget].followmeTarget; @@ -12913,7 +13463,7 @@ static void Cmd_trysetencore(void) } } - if ((gMovesInfo[gLastMoves[gBattlerTarget]].encoreBanned) + if ((IsMoveEncoreBanned(gLastMoves[gBattlerTarget])) || gLastMoves[gBattlerTarget] == MOVE_NONE || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE) { @@ -12945,16 +13495,9 @@ static void Cmd_painsplitdmgcalc(void) if (!(DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove))) { s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + GetNonDynamaxHP(gBattlerTarget)) / 2; - s32 painSplitHp = gBattleMoveDamage = GetNonDynamaxHP(gBattlerTarget) - hpDiff; - u8 *storeLoc = (void *)(&gBattleScripting.painSplitHp); - storeLoc[0] = (painSplitHp); - storeLoc[1] = (painSplitHp & 0x0000FF00) >> 8; - storeLoc[2] = (painSplitHp & 0x00FF0000) >> 16; - storeLoc[3] = (painSplitHp & 0xFF000000) >> 24; - - gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp - hpDiff; - gSpecialStatuses[gBattlerTarget].shellBellDmg = IGNORE_SHELL_BELL; + gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) - hpDiff; + gBattleStruct->moveDamage[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp - hpDiff; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12978,7 +13521,7 @@ static void Cmd_settypetorandomresistance(void) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (gBattleMoveEffects[gMovesInfo[gLastLandedMoves[gBattlerAttacker]].effect].twoTurnEffect + else if (gBattleMoveEffects[GetMoveEffect(gLastLandedMoves[gBattlerAttacker])].twoTurnEffect && gBattleMons[gLastHitBy[gBattlerAttacker]].status2 & STATUS2_MULTIPLETURNS) { gBattlescriptCurrInstr = cmd->failInstr; @@ -13107,7 +13650,7 @@ static void Cmd_copymovepermanently(void) if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) && gLastPrintedMoves[gBattlerTarget] != MOVE_UNAVAILABLE - && !gMovesInfo[gLastPrintedMoves[gBattlerTarget]].sketchBanned) + && !IsMoveSketchBanned(gLastPrintedMoves[gBattlerTarget])) { s32 i; @@ -13128,7 +13671,7 @@ static void Cmd_copymovepermanently(void) struct MovePpInfo movePpData; gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastPrintedMoves[gBattlerTarget]; - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gMovesInfo[gLastPrintedMoves[gBattlerTarget]].pp; + gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = GetMovePP(gLastPrintedMoves[gBattlerTarget]); for (i = 0; i < MAX_MON_MOVES; i++) { @@ -13159,8 +13702,8 @@ static void Cmd_trychoosesleeptalkmove(void) for (i = 0; i < MAX_MON_MOVES; i++) { - if (gMovesInfo[gBattleMons[gBattlerAttacker].moves[i]].sleepTalkBanned - || gBattleMoveEffects[gMovesInfo[gBattleMons[gBattlerAttacker].moves[i]].effect].twoTurnEffect) + if (IsMoveSleepTalkBanned(gBattleMons[gBattlerAttacker].moves[i]) + || gBattleMoveEffects[GetMoveEffect(gBattleMons[gBattlerAttacker].moves[i])].twoTurnEffect) { unusableMovesBits |= (1 << (i)); } @@ -13180,7 +13723,7 @@ static void Cmd_trychoosesleeptalkmove(void) movePosition = MOD(Random(), MAX_MON_MOVES); } while ((1u << movePosition) & unusableMovesBits); - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IS_MOVE_STATUS(gBattleMons[gBattlerAttacker].moves[movePosition])) + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(gBattleMons[gBattlerAttacker].moves[movePosition])) { gBattleStruct->zmove.baseMoves[gBattlerAttacker] = gBattleMons[gBattlerAttacker].moves[movePosition]; gCalledMove = GetTypeBasedZMove(gBattleMons[gBattlerAttacker].moves[movePosition]); @@ -13191,17 +13734,23 @@ static void Cmd_trychoosesleeptalkmove(void) } gCurrMovePos = movePosition; gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); + gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = cmd->failInstr; } } -static void Cmd_setdestinybond(void) +static void Cmd_trysetdestinybond(void) { - CMD_ARGS(); - - gBattleMons[gBattlerAttacker].status2 |= STATUS2_DESTINY_BOND; - gBattlescriptCurrInstr = cmd->nextInstr; + CMD_ARGS(const u8 *failInstr); + if (DoesDestinyBondFail(gBattlerAttacker)) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gBattleMons[gBattlerAttacker].status2 |= STATUS2_DESTINY_BOND; + gBattlescriptCurrInstr = cmd->nextInstr; + } } static void TrySetDestinyBondToHappen(void) @@ -13234,7 +13783,7 @@ static void Cmd_settailwind(void) { gSideStatuses[side] |= SIDE_STATUS_TAILWIND; gSideTimers[side].tailwindBattlerId = gBattlerAttacker; - gSideTimers[side].tailwindTimer = B_TAILWIND_TURNS >= GEN_5 ? 4 : 3; + gSideTimers[side].tailwindTimer = gBattleTurnCounter + (B_TAILWIND_TURNS >= GEN_5 ? 4 : 3); gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -13274,7 +13823,7 @@ static void Cmd_tryspiteppreduce(void) { s32 ppToDeduct = B_PP_REDUCED_BY_SPITE >= GEN_4 ? 4 : (Random() & 3) + 2; // G-Max Depletion only deducts 2 PP. - if (IsMaxMove(gCurrentMove) && gMovesInfo[gCurrentMove].argument == MAX_EFFECT_SPITE) + if (IsMaxMove(gCurrentMove) && MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SPITE)) ppToDeduct = 2; if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) @@ -13317,99 +13866,88 @@ static void Cmd_healpartystatus(void) { CMD_ARGS(); + u32 i = 0; u32 zero = 0; + u32 toHeal = 0; u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - u8 toHeal = 0; + struct Pokemon *party = GetBattlerParty(gBattlerAttacker); + bool32 isSoundMove = IsSoundMove(gCurrentMove); - if (gCurrentMove == MOVE_HEAL_BELL) + if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 + || !(isSoundMove && GetBattlerAbility(gBattlerAttacker) == ABILITY_SOUNDPROOF)) { - struct Pokemon *party = GetBattlerParty(gBattlerAttacker); - s32 i; - - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL; - - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_SOUNDPROOF - || B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8) - { - gBattleMons[gBattlerAttacker].status1 = 0; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - } + if (isSoundMove) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL; else - { - RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_ATTACKER; - } - - gBattleScripting.battler = partner; - - if (IsBattlerAlive(partner)) - { - if (GetBattlerAbility(partner) != ABILITY_SOUNDPROOF || B_HEAL_BELL_SOUNDPROOF == GEN_5) - { - gBattleMons[partner].status1 = 0; - gBattleMons[partner].status2 &= ~STATUS2_NIGHTMARE; - } - else - { - RecordAbilityBattle(partner, gBattleMons[partner].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_PARTNER; - } - } - - // Because the above MULTISTRING_CHOOSER are ORd, if both are set then it will be B_MSG_BELL_BOTH_SOUNDPROOF - - for (i = 0; i < PARTY_SIZE; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); - u8 abilityNum = GetMonData(&party[i], MON_DATA_ABILITY_NUM); - - if (species != SPECIES_NONE && species != SPECIES_EGG) - { - u16 ability; - bool32 isAttacker = gBattlerPartyIndexes[gBattlerAttacker] == i; - bool32 isDoublesPartner = gBattlerPartyIndexes[partner] == i && IsBattlerAlive(partner); - - if (B_HEAL_BELL_SOUNDPROOF == GEN_5 || (isAttacker && B_HEAL_BELL_SOUNDPROOF >= GEN_8)) - ability = ABILITY_NONE; - else if (B_HEAL_BELL_SOUNDPROOF > GEN_5 && !isAttacker && !isDoublesPartner) - ability = ABILITY_NONE; - else if (isAttacker) - ability = GetBattlerAbility(gBattlerAttacker); - else if (isDoublesPartner) - ability = GetBattlerAbility(partner); - else - { - ability = GetAbilityBySpecies(species, abilityNum); - #if TESTING - if (gTestRunnerEnabled) - { - u32 side = GetBattlerSide(gBattlerAttacker); - if (TestRunner_Battle_GetForcedAbility(side, i)) - ability = TestRunner_Battle_GetForcedAbility(side, i); - } - #endif - } - - if (ability != ABILITY_SOUNDPROOF) - toHeal |= (1 << i); - } - } - } - else // Aromatherapy - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA; - toHeal = (1 << PARTY_SIZE) - 1; - + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA; gBattleMons[gBattlerAttacker].status1 = 0; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + } + else + { + RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL_SOUNDPROOF_ATTACKER; + } - if (IsDoubleBattle() - && !(gAbsentBattlerFlags & (1u <= GEN_8 && isAttacker)) + ability = ABILITY_NONE; + else if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) > GEN_5 && !isAttacker && !isDoublesPartner) + ability = ABILITY_NONE; + else if (isAttacker) + ability = GetBattlerAbility(gBattlerAttacker); + else if (isDoublesPartner) + ability = GetBattlerAbility(partner); + else + { + ability = GetAbilityBySpecies(species, abilityNum); + #if TESTING + if (gTestRunnerEnabled) + { + u32 side = GetBattlerSide(gBattlerAttacker); + if (TestRunner_Battle_GetForcedAbility(side, i)) + ability = TestRunner_Battle_GetForcedAbility(side, i); + } + #endif + } + + if (!(isSoundMove && ability == ABILITY_SOUNDPROOF)) + { + toHeal |= (1 << i); + TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), i); + } + } } if (toHeal) @@ -13432,9 +13970,9 @@ static void Cmd_cursetarget(void) else { gBattleMons[gBattlerTarget].status2 |= STATUS2_CURSED; - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -13499,7 +14037,7 @@ static void Cmd_handlerollout(void) { CMD_ARGS(); - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveMissedPause; @@ -13537,7 +14075,7 @@ static void Cmd_handlefurycutter(void) { CMD_ARGS(); - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { gDisableStructs[gBattlerAttacker].furyCutterCounter = 0; gBattlescriptCurrInstr = BattleScript_MoveMissedPause; @@ -13605,10 +14143,11 @@ static void Cmd_presentdamagecalculation(void) } else { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + // TODO: Check if this is correct + gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerTarget) / 4; + if (gBattleStruct->moveDamage[gBattlerTarget] == 0) + gBattleStruct->moveDamage[gBattlerTarget] = 1; + gBattleStruct->moveDamage[gBattlerTarget] *= -1; gBattleStruct->presentBasePower = 0; } } @@ -13623,7 +14162,7 @@ static void Cmd_presentdamagecalculation(void) } else { - gMoveResultFlags &= ~MOVE_RESULT_DOESNT_AFFECT_FOE; + gBattleStruct->moveResultFlags[gBattlerTarget] &= ~MOVE_RESULT_DOESNT_AFFECT_FOE; gBattlescriptCurrInstr = BattleScript_PresentHealTarget; } } @@ -13634,13 +14173,13 @@ static void Cmd_setsafeguard(void) if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_SAFEGUARD) { - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } else { gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_SAFEGUARD; - gSideTimers[GetBattlerSide(gBattlerAttacker)].safeguardTimer = 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].safeguardTimer = gBattleTurnCounter + 5; gSideTimers[GetBattlerSide(gBattlerAttacker)].safeguardBattlerId = gBattlerAttacker; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; } @@ -13703,45 +14242,43 @@ static void Cmd_magnitudedamagecalculation(void) gBattlescriptCurrInstr = cmd->nextInstr; } +static bool32 SetTargetToNextPursuiter(u32 battlerDef) +{ + u32 i; + for (i = gCurrentTurnActionNumber + 1; i < gBattlersCount; i++) + { + u32 battler = gBattlerByTurnOrder[i]; + if (gChosenActionByBattler[battler] == B_ACTION_USE_MOVE + && GetMoveEffect(gChosenMoveByBattler[battler]) == EFFECT_PURSUIT + && IsBattlerAlive(battlerDef) + && IsBattlerAlive(battler) + && GetBattlerSide(battler) != GetBattlerSide(battlerDef) + && (B_PURSUIT_TARGET >= GEN_4 || gBattleStruct->moveTarget[battler] == battlerDef) + && !IsGimmickSelected(battler, GIMMICK_Z_MOVE) + && !IsGimmickSelected(battler, GIMMICK_DYNAMAX) + && GetActiveGimmick(battler) != GIMMICK_DYNAMAX) + { + gBattlerTarget = battler; + return TRUE; + } + } + return FALSE; +} + static void Cmd_jumpifnopursuitswitchdmg(void) { CMD_ARGS(const u8 *jumpInstr); - if (gMultiHitCounter == 1) - { - if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) - gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - else - gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - } - else - { - if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) - gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - else - gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); - } + u32 savedTarget = gBattlerTarget; - if (gChosenActionByBattler[gBattlerTarget] == B_ACTION_USE_MOVE - && gBattlerAttacker == *(gBattleStruct->moveTarget + gBattlerTarget) - && !(gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) - && gBattleMons[gBattlerAttacker].hp - && !gDisableStructs[gBattlerTarget].truantCounter - && gMovesInfo[gChosenMoveByBattler[gBattlerTarget]].effect == EFFECT_PURSUIT) + if (SetTargetToNextPursuiter(gBattlerAttacker)) { - s32 i; - - for (i = 0; i < gBattlersCount; i++) - { - if (gBattlerByTurnOrder[i] == gBattlerTarget) - gActionsByTurnOrder[i] = B_ACTION_TRY_FINISH; - } - - gCurrentMove = gChosenMove = gChosenMoveByBattler[gBattlerTarget]; - gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerTarget); + ChangeOrderTargetAfterAttacker(); + gBattleStruct->battlerState[gBattlerAttacker].pursuitTarget = TRUE; + gBattleStruct->pursuitStoredSwitch = gBattleStruct->monToSwitchIntoId[gBattlerAttacker]; + gBattleStruct->moveTarget[gBattlerTarget] = gBattlerAttacker; + gBattlerTarget = savedTarget; gBattlescriptCurrInstr = cmd->nextInstr; - gBattleScripting.animTurn = 1; - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; } else { @@ -13765,9 +14302,9 @@ static void Cmd_halvehp(void) if (gBattleMons[gBattlerAttacker].hp > halfHp) { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -13802,7 +14339,7 @@ static void Cmd_rapidspinfree(void) { gBattleScripting.battler = gBattlerTarget; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; - gBattlerTarget = *(gBattleStruct->wrappedBy + gBattlerAttacker); + gBattlerTarget = gBattleStruct->wrappedBy[gBattlerAttacker]; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gBattlerAttacker]); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WrapFree; @@ -13872,24 +14409,24 @@ static void Cmd_recoverbasedonsunlight(void) { if (gCurrentMove == MOVE_SHORE_UP) { - if (WEATHER_HAS_EFFECT && gBattleWeather & B_WEATHER_SANDSTORM) - gBattleMoveDamage = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; + if (HasWeatherEffect() && gBattleWeather & B_WEATHER_SANDSTORM) + gBattleStruct->moveDamage[gBattlerAttacker] = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; else - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; } else { - if (!(gBattleWeather & B_WEATHER_ANY) || !WEATHER_HAS_EFFECT || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; else if (gBattleWeather & B_WEATHER_SUN) - gBattleMoveDamage = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; + gBattleStruct->moveDamage[gBattlerAttacker] = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; else // not sunny weather - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; } - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; + gBattleStruct->moveDamage[gBattlerAttacker] *= -1; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -13937,7 +14474,7 @@ static void Cmd_trysetfutureattack(void) { CMD_ARGS(const u8 *failInstr); - if (gWishFutureKnock.futureSightCounter[gBattlerTarget] != 0) + if (gWishFutureKnock.futureSightCounter[gBattlerTarget] > gBattleTurnCounter) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -13947,8 +14484,7 @@ static void Cmd_trysetfutureattack(void) gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove; gWishFutureKnock.futureSightBattlerIndex[gBattlerTarget] = gBattlerAttacker; gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] = gBattlerPartyIndexes[gBattlerAttacker]; - gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3; - gWishFutureKnock.futureSightDmg = 0; + gWishFutureKnock.futureSightCounter[gBattlerTarget] = gBattleTurnCounter + 3; if (gCurrentMove == MOVE_DOOM_DESIRE) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; @@ -13992,13 +14528,13 @@ static void Cmd_trydobeatup(void) gBattlescriptCurrInstr = cmd->nextInstr; - gBattleMoveDamage = gSpeciesInfo[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack; - gBattleMoveDamage *= gMovesInfo[gCurrentMove].power; - gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); - gBattleMoveDamage /= gSpeciesInfo[gBattleMons[gBattlerTarget].species].baseDefense; - gBattleMoveDamage = (gBattleMoveDamage / 50) + 2; + gBattleStruct->moveDamage[gBattlerTarget] = gSpeciesInfo[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack; + gBattleStruct->moveDamage[gBattlerTarget] *= GetMovePower(gCurrentMove); + gBattleStruct->moveDamage[gBattlerTarget] *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); + gBattleStruct->moveDamage[gBattlerTarget] /= gSpeciesInfo[gBattleMons[gBattlerTarget].species].baseDefense; + gBattleStruct->moveDamage[gBattlerTarget] = (gBattleStruct->moveDamage[gBattlerTarget] / 50) + 2; if (gProtectStructs[gBattlerAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; + gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * 15 / 10; gBattleCommunication[0]++; } @@ -14018,9 +14554,9 @@ static void Cmd_setsemiinvulnerablebit(void) { CMD_ARGS(bool8 clear); - if (gBattleMoveEffects[gMovesInfo[gCurrentMove].effect].semiInvulnerableEffect == TRUE) + if (gBattleMoveEffects[GetMoveEffect(gCurrentMove)].semiInvulnerableEffect == TRUE) { - u32 semiInvulnerableEffect = UNCOMPRESS_BITS(HIHALF(gMovesInfo[gCurrentMove].argument)); + u32 semiInvulnerableEffect = GetMoveTwoTurnAttackStatus(gCurrentMove); if (cmd->clear) gStatuses3[gBattlerAttacker] &= ~semiInvulnerableEffect; else @@ -14033,7 +14569,7 @@ static void Cmd_setsemiinvulnerablebit(void) static bool32 CheckIfCanFireTwoTurnMoveNow(u8 battler, bool8 checkChargeTurnEffects) { // Semi-invulnerable moves cannot skip their charge turn (except with Power Herb) - if (gBattleMoveEffects[gMovesInfo[gCurrentMove].effect].semiInvulnerableEffect == TRUE) + if (gBattleMoveEffects[GetMoveEffect(gCurrentMove)].semiInvulnerableEffect == TRUE) return FALSE; // If this move has charge turn effects, it must charge, activate them, then try to fire @@ -14044,7 +14580,7 @@ static bool32 CheckIfCanFireTwoTurnMoveNow(u8 battler, bool8 checkChargeTurnEffe // Certain two-turn moves may fire on the first turn in the right weather (Solar Beam, Electro Shot) // By default, all two-turn moves have the option of adding weather to their argument - if (IsBattlerWeatherAffected(battler, HIHALF(gMovesInfo[gCurrentMove].argument))) + if (IsBattlerWeatherAffected(battler, GetMoveTwoTurnAttackWeather(gCurrentMove))) return TRUE; return FALSE; @@ -14101,7 +14637,7 @@ static void Cmd_trymemento(void) else { // Success, drop user's HP bar to 0 - gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp; + gBattleStruct->moveDamage[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; BtlController_EmitHealthBarUpdate(gBattlerAttacker, BUFFER_A, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gBattlerAttacker); gBattlescriptCurrInstr = cmd->nextInstr; @@ -14115,7 +14651,7 @@ static void Cmd_setforcedtarget(void) gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 1; gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget = gBattlerTarget; - gSideTimers[GetBattlerSide(gBattlerTarget)].followmePowder = gMovesInfo[gCurrentMove].powderMove; + gSideTimers[GetBattlerSide(gBattlerTarget)].followmePowder = IsPowderMove(gCurrentMove); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -14139,8 +14675,8 @@ static void Cmd_callterrainattack(void) gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gCurrentMove = GetNaturePowerMove(gBattlerAttacker); - gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - BattleScriptPush(GET_MOVE_BATTLESCRIPT(gCurrentMove)); + gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + BattleScriptPush(GetMoveBattleScript(gCurrentMove)); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -14172,13 +14708,16 @@ static void Cmd_curestatuswithmove(void) CMD_ARGS(const u8 *failInstr); u32 shouldHeal; - if (gMovesInfo[gCurrentMove].effect == EFFECT_REFRESH) + if (GetMoveEffect(gCurrentMove) == EFFECT_REFRESH) shouldHeal = gBattleMons[gBattlerAttacker].status1 & STATUS1_REFRESH; else // Take Heart shouldHeal = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; if (shouldHeal) { + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) + TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); + gBattleMons[gBattlerAttacker].status1 = 0; gBattlescriptCurrInstr = cmd->nextInstr; BtlController_EmitSetMonData(gBattlerAttacker, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].status1), &gBattleMons[gBattlerAttacker].status1); @@ -14369,8 +14908,8 @@ static void Cmd_tryswapitems(void) } else if (oldItemAtk == ITEM_NONE && *newItemAtk != ITEM_NONE) { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gBattleResources->flags->flags[gBattlerAttacker] & RESOURCE_FLAG_UNBURDEN) - gBattleResources->flags->flags[gBattlerAttacker] &= ~RESOURCE_FLAG_UNBURDEN; + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gDisableStructs[gBattlerAttacker].unburdenActive) + gDisableStructs[gBattlerAttacker].unburdenActive = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_TAKEN; // nothing -> <- target's item } @@ -14394,7 +14933,7 @@ static void Cmd_trycopyability(void) if (gBattleMons[battler].ability == defAbility || defAbility == ABILITY_NONE || gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed - || (IsBattlerAlive(BATTLE_PARTNER(battler)) && gAbilitiesInfo[gBattleMons[BATTLE_PARTNER(battler)].ability].cantBeSuppressed && gMovesInfo[gCurrentMove].effect == EFFECT_DOODLE) + || (IsBattlerAlive(BATTLE_PARTNER(battler)) && gAbilitiesInfo[gBattleMons[BATTLE_PARTNER(battler)].ability].cantBeSuppressed && GetMoveEffect(gCurrentMove) == EFFECT_DOODLE) || gAbilitiesInfo[defAbility].cantBeCopied) { gBattlescriptCurrInstr = cmd->failInstr; @@ -14402,7 +14941,7 @@ static void Cmd_trycopyability(void) else { gBattleScripting.abilityPopupOverwrite = gBattleMons[battler].ability; - gBattleMons[battler].ability = gBattleStruct->overwrittenAbilities[battler] = defAbility; + gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = defAbility; gLastUsedAbility = defAbility; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -14415,9 +14954,9 @@ static void Cmd_trywish(void) switch (cmd->turnNumber) { case 0: // use wish - if (gWishFutureKnock.wishCounter[gBattlerAttacker] == 0) + if (gWishFutureKnock.wishCounter[gBattlerAttacker] <= gBattleTurnCounter) { - gWishFutureKnock.wishCounter[gBattlerAttacker] = 2; + gWishFutureKnock.wishCounter[gBattlerAttacker] = gBattleTurnCounter + 2; gWishFutureKnock.wishPartyId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker]; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -14429,18 +14968,11 @@ static void Cmd_trywish(void) case 1: // heal effect PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gWishFutureKnock.wishPartyId[gBattlerTarget]) if (B_WISH_HP_SOURCE >= GEN_5) - { - if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) - gBattleMoveDamage = max(1, GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[gBattlerTarget]], MON_DATA_MAX_HP) / 2); - else - gBattleMoveDamage = max(1, GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[gBattlerTarget]], MON_DATA_MAX_HP) / 2); - } + gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetMonData(&GetBattlerParty(gBattlerTarget)[gWishFutureKnock.wishPartyId[gBattlerTarget]], MON_DATA_MAX_HP) / 2); else - { - gBattleMoveDamage = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); - } + gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[gBattlerTarget] *= -1; if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) gBattlescriptCurrInstr = cmd->failInstr; else @@ -14523,23 +15055,22 @@ static void Cmd_setdamagetohealthdifference(void) } else { - gBattleMoveDamage = GetNonDynamaxHP(gBattlerTarget) - gBattleMons[gBattlerAttacker].hp; + gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) - gBattleMons[gBattlerAttacker].hp; gBattlescriptCurrInstr = cmd->nextInstr; } } -static void HandleRoomMove(u32 statusFlag, u8 *timer, u8 stringId) +static void HandleRoomMove(u32 statusFlag, u16 *timer, u8 stringId) { if (gFieldStatuses & statusFlag) { gFieldStatuses &= ~statusFlag; - *timer = 0; gBattleCommunication[MULTISTRING_CHOOSER] = stringId + 1; } else { gFieldStatuses |= statusFlag; - *timer = 5; + *timer = gBattleTurnCounter + 5; gBattleCommunication[MULTISTRING_CHOOSER] = stringId; } } @@ -14548,7 +15079,7 @@ static void Cmd_setroom(void) { CMD_ARGS(); - switch (gMovesInfo[gCurrentMove].effect) + switch (GetMoveEffect(gCurrentMove)) { case EFFECT_TRICK_ROOM: HandleRoomMove(STATUS_FIELD_TRICK_ROOM, &gFieldTimers.trickRoomTimer, 0); @@ -14584,7 +15115,7 @@ static void Cmd_tryswapabilities(void) } else { - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -14593,8 +15124,8 @@ static void Cmd_tryswapabilities(void) if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerAttacker].ability; gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - gBattleMons[gBattlerTarget].ability = gBattleStruct->overwrittenAbilities[gBattlerTarget] = gBattleMons[gBattlerAttacker].ability; - gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = gLastUsedAbility; + gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; + gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gLastUsedAbility; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -14713,7 +15244,7 @@ static void Cmd_assistattackselect(void) { u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); - if (gMovesInfo[move].assistBanned) + if (IsMoveAssistBanned(move)) continue; validMoves[chooseableMovesNo++] = move; @@ -14725,7 +15256,7 @@ static void Cmd_assistattackselect(void) { gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gCalledMove = validMoves[Random() % chooseableMovesNo]; - gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); + gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -14787,25 +15318,30 @@ static void Cmd_switchoutabilities(void) switch (GetBattlerAbility(battler)) { case ABILITY_NATURAL_CURE: + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + gBattleMons[battler].status1 = 0; BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_STATUS_BATTLE, - 1u << *(gBattleStruct->battlerPartyIndexes + battler), + 1u << gBattleStruct->battlerPartyIndexes[battler], sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); break; case ABILITY_REGENERATOR: - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 3; - gBattleMoveDamage += gBattleMons[battler].hp; - if (gBattleMoveDamage > gBattleMons[battler].maxHP) - gBattleMoveDamage = gBattleMons[battler].maxHP; + { + u32 regenerate = GetNonDynamaxMaxHP(battler) / 3; + regenerate += gBattleMons[battler].hp; + if (regenerate > gBattleMons[battler].maxHP) + regenerate = gBattleMons[battler].maxHP; BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_HP_BATTLE, - 1u << *(gBattleStruct->battlerPartyIndexes + battler), - sizeof(gBattleMoveDamage), - &gBattleMoveDamage); + 1u << gBattleStruct->battlerPartyIndexes[battler], + sizeof(regenerate), + ®enerate); MarkBattlerForControllerExec(battler); break; } + } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -14829,8 +15365,9 @@ static void Cmd_jumpifnotcurrentmoveargtype(void) u8 battler = GetBattlerForBattleScript(cmd->battler); const u8 *failInstr = cmd->failInstr; + u32 type = GetMoveArgType(gCurrentMove); - if (!IS_BATTLER_OF_TYPE(battler, gMovesInfo[gCurrentMove].argument)) + if (!IS_BATTLER_OF_TYPE(battler, type)) gBattlescriptCurrInstr = failInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -14909,11 +15446,11 @@ static void Cmd_pickup(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_unused3(void) +static void Cmd_unused_0xE6(void) { } -static void Cmd_unused4(void) +static void Cmd_unused_0xE7(void) { } @@ -14924,14 +15461,14 @@ static void Cmd_settypebasedhalvers(void) bool8 worked = FALSE; - if (gMovesInfo[gCurrentMove].effect == EFFECT_MUD_SPORT) + if (GetMoveEffect(gCurrentMove) == EFFECT_MUD_SPORT) { if (B_SPORT_TURNS >= GEN_6) { if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT)) { gFieldStatuses |= STATUS_FIELD_MUDSPORT; - gFieldTimers.mudSportTimer = 5; + gFieldTimers.mudSportTimer = gBattleTurnCounter + 5; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; worked = TRUE; } @@ -14953,7 +15490,7 @@ static void Cmd_settypebasedhalvers(void) if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT)) { gFieldStatuses |= STATUS_FIELD_WATERSPORT; - gFieldTimers.waterSportTimer = 5; + gFieldTimers.waterSportTimer = gBattleTurnCounter + 5; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; worked = TRUE; } @@ -14979,7 +15516,7 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) { if (!(gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE)) return FALSE; - else if (gMovesInfo[move].ignoresSubstitute) + else if (MoveIgnoresSubstitute(move)) return FALSE; else if (GetBattlerAbility(battlerAtk) == ABILITY_INFILTRATOR) return FALSE; @@ -14991,7 +15528,7 @@ bool32 DoesDisguiseBlockMove(u32 battler, u32 move) { if (!(gBattleMons[battler].species == SPECIES_MIMIKYU_DISGUISED || gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) || gBattleMons[battler].status2 & STATUS2_TRANSFORMED - || (!gProtectStructs[battler].confusionSelfDmg && (IS_MOVE_STATUS(move) || gHitMarker & HITMARKER_PASSIVE_DAMAGE)) + || (!gProtectStructs[battler].confusionSelfDmg && (IsBattleMoveStatus(move) || gHitMarker & HITMARKER_PASSIVE_DAMAGE)) || gHitMarker & HITMARKER_IGNORE_DISGUISE || GetBattlerAbility(battler) != ABILITY_DISGUISE) return FALSE; @@ -15090,7 +15627,7 @@ static void Cmd_pursuitdoubles(void) if (IsDoubleBattle() && !(gAbsentBattlerFlags & (1u << battler)) && gChosenActionByBattler[battler] == B_ACTION_USE_MOVE - && gMovesInfo[gChosenMoveByBattler[battler]].effect == EFFECT_PURSUIT) + && GetMoveEffect(gChosenMoveByBattler[battler]) == EFFECT_PURSUIT) { gActionsByTurnOrder[battler] = B_ACTION_TRY_FINISH; gCurrentMove = gChosenMoveByBattler[battler]; @@ -15134,21 +15671,13 @@ static void Cmd_removelightscreenreflect(void) side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (B_BRICK_BREAK >= GEN_5) - failed = (gMoveResultFlags & MOVE_RESULT_NO_EFFECT); + failed = gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT; else failed = FALSE; - if (!failed - && (gSideTimers[side].reflectTimer - || gSideTimers[side].lightscreenTimer - || gSideTimers[side].auroraVeilTimer)) + if (!failed && gSideStatuses[side] & SIDE_STATUS_SCREEN_ANY) { - gSideStatuses[side] &= ~SIDE_STATUS_REFLECT; - gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN; - gSideStatuses[side] &= ~SIDE_STATUS_AURORA_VEIL; - gSideTimers[side].reflectTimer = 0; - gSideTimers[side].lightscreenTimer = 0; - gSideTimers[side].auroraVeilTimer = 0; + gSideStatuses[side] &= ~SIDE_STATUS_SCREEN_ANY; gBattleScripting.animTurn = 1; gBattleScripting.animTargetsHit = 1; } @@ -15231,7 +15760,7 @@ static void Cmd_handleballthrow(void) ballMultiplier = 150; break; case BALL_NET: - if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_WATER) || IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_BUG)) + if (IS_BATTLER_ANY_TYPE(gBattlerTarget, TYPE_WATER, TYPE_BUG)) ballMultiplier = B_NET_BALL_MODIFIER >= GEN_7 ? 350 : 300; break; case BALL_DIVE: @@ -15403,13 +15932,18 @@ static void Cmd_handleballthrow(void) else gBattleCommunication[MULTISTRING_CHOOSER] = 1; - if (gLastUsedItem == BALL_HEAL) + if (ballId == BALL_HEAL) { MonRestorePP(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]); HealStatusConditions(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], STATUS1_ANY, gBattlerTarget); gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); } + else if (ballId == BALL_FRIEND) + { + u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); + SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_FRIENDSHIP, &friendship); + } } else // mon may be caught, calculate shakes { @@ -15464,6 +15998,11 @@ static void Cmd_handleballthrow(void) gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); } + else if (ballId == BALL_FRIEND) + { + u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); + SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_FRIENDSHIP, &friendship); + } } else // not caught { @@ -15483,41 +16022,145 @@ static void Cmd_handleballthrow(void) static void Cmd_givecaughtmon(void) { - CMD_ARGS(); + CMD_ARGS(const u8 *passInstr); + enum GiveCaughtMonStates state = gBattleCommunication[MULTIUSE_STATE]; - if (B_RESTORE_HELD_BATTLE_ITEMS >= GEN_9) + switch (state) { - u16 lostItem = gBattleStruct->itemLost[B_SIDE_OPPONENT][gBattlerPartyIndexes[GetCatchingBattler()]].originalItem; - if (lostItem != ITEM_NONE && ItemId_GetPocket(lostItem) != POCKET_BERRIES) - SetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_HELD_ITEM, &lostItem); // Restore non-berry items - } - - if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]]) != MON_GIVEN_TO_PARTY) - { - if (!ShouldShowBoxWasFullMessage()) + case GIVECAUGHTMON_CHECK_PARTY_SIZE: + if (CalculatePlayerPartyCount() == PARTY_SIZE && B_CATCH_SWAP_INTO_PARTY >= GEN_7) { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC; - StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); + PrepareStringBattle(STRINGID_SENDCAUGHTMONPARTYORBOX, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_ASK_ADD_TO_PARTY; } else { - StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); - StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NO_MESSSAGE_SKIP; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + break; + case GIVECAUGHTMON_ASK_ADD_TO_PARTY: + HandleBattleWindow(YESNOBOX_X_Y, 0); + BattlePutTextOnWindow(gText_BattleYesNoChoice, B_WIN_YESNO); + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_HANDLE_INPUT; + gBattleCommunication[CURSOR_POSITION] = 0; + BattleCreateYesNoCursorAt(0); + break; + case GIVECAUGHTMON_HANDLE_INPUT: + if (JOY_NEW(DPAD_UP) && gBattleCommunication[CURSOR_POSITION] != 0) + { + PlaySE(SE_SELECT); + BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); + gBattleCommunication[CURSOR_POSITION] = 0; + BattleCreateYesNoCursorAt(0); + } + if (JOY_NEW(DPAD_DOWN) && gBattleCommunication[CURSOR_POSITION] == 0) + { + PlaySE(SE_SELECT); + BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]); + gBattleCommunication[CURSOR_POSITION] = 1; + BattleCreateYesNoCursorAt(1); + } + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + if (gBattleCommunication[CURSOR_POSITION] == 0) + { + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_DO_CHOOSE_MON; + } + else + { + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + break; + case GIVECAUGHTMON_DO_CHOOSE_MON: + if (!gPaletteFade.active) + { + BtlController_EmitChoosePokemon(gBattlerAttacker, BUFFER_A, PARTY_ACTION_SEND_MON_TO_BOX, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_HANDLE_CHOSEN_MON; + } + break; + case GIVECAUGHTMON_HANDLE_CHOSEN_MON: + if (gSelectedMonPartyId != PARTY_SIZE) + { + if (gSelectedMonPartyId > PARTY_SIZE) + { + // Choosing Pokemon was cancelled + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + else + { + // Mon chosen, try to put it in the PC + if (CopyMonToPC(&gPlayerParty[gSelectedMonPartyId]) == MON_GIVEN_TO_PC) + { + GetMonNickname(&gPlayerParty[gSelectedMonPartyId], gStringVar2); + StringCopy(gStringVar1, GetBoxNamePtr(GetPCBoxToSendMon())); + ZeroMonData(&gPlayerParty[gSelectedMonPartyId]); + gBattleStruct->itemLost[B_SIDE_PLAYER][gSelectedMonPartyId].originalItem = ITEM_NONE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWAPPED_INTO_PARTY; + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + else + { + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_GIVE_AND_SHOW_MSG; + } + } + } + break; + case GIVECAUGHTMON_GIVE_AND_SHOW_MSG: + if (B_RESTORE_HELD_BATTLE_ITEMS >= GEN_9) + { + u16 lostItem = gBattleStruct->itemLost[B_SIDE_OPPONENT][gBattlerPartyIndexes[GetCatchingBattler()]].originalItem; + if (lostItem != ITEM_NONE && ItemId_GetPocket(lostItem) != POCKET_BERRIES) + SetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_HELD_ITEM, &lostItem); // Restore non-berry items } - // Change to B_MSG_SENT_LANETTES_PC or B_MSG_LANETTES_BOX_FULL - if (FlagGet(FLAG_SYS_PC_LANETTE)) - gBattleCommunication[MULTISTRING_CHOOSER]++; + if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]]) != MON_GIVEN_TO_PARTY + && gBattleCommunication[MULTISTRING_CHOOSER] != B_MSG_SWAPPED_INTO_PARTY) + { + if (!ShouldShowBoxWasFullMessage()) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC; + StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); + } + else + { + StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); + StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL; + } + + // Change to B_MSG_SENT_LANETTES_PC or B_MSG_LANETTES_BOX_FULL + if (FlagGet(FLAG_SYS_PC_LANETTE)) + gBattleCommunication[MULTISTRING_CHOOSER]++; + } + + gBattleResults.caughtMonSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_SPECIES, NULL); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick); + gBattleResults.caughtMonBall = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_POKEBALL, NULL); + + gSelectedMonPartyId = PARTY_SIZE; + gBattleCommunication[MULTIUSE_STATE] = 0; + + if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_NO_MESSSAGE_SKIP) + gBattlescriptCurrInstr = cmd->passInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; + break; } - - gBattleResults.caughtMonSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_SPECIES, NULL); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick); - gBattleResults.caughtMonBall = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_POKEBALL, NULL); - - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_trysetcaughtmondexflags(void) @@ -15586,8 +16229,9 @@ static void Cmd_displaydexinfo(void) } break; case 5: - if (!gPaletteFade.active) + if (!gPaletteFade.active) { gBattlescriptCurrInstr = cmd->nextInstr; + } break; } } @@ -15660,7 +16304,7 @@ void BattleDestroyYesNoCursorAt(u8 cursorPosition) static void Cmd_trygivecaughtmonnick(void) { - CMD_ARGS(const u8 *successInstr); + CMD_ARGS(); switch (gBattleCommunication[MULTIUSE_STATE]) { @@ -15710,12 +16354,13 @@ static void Cmd_trygivecaughtmonnick(void) { GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); FreeAllWindowBuffers(); + MainCallback callback = CalculatePlayerPartyCount() == PARTY_SIZE ? ReshowBlankBattleScreenAfterMenu : BattleMainCB2; DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]), GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_PERSONALITY, NULL), - BattleMainCB2); + callback); gBattleCommunication[MULTIUSE_STATE]++; } @@ -15724,14 +16369,12 @@ static void Cmd_trygivecaughtmonnick(void) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); - gBattlescriptCurrInstr = cmd->successInstr; + gBattleCommunication[MULTIUSE_STATE]++; } break; case 4: - if (CalculatePlayerPartyCount() == PARTY_SIZE) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->successInstr; + gBattleCommunication[MULTIUSE_STATE] = 0; + gBattlescriptCurrInstr = cmd->nextInstr; break; } } @@ -15740,7 +16383,7 @@ static void Cmd_subattackerhpbydmg(void) { CMD_ARGS(); - gBattleMons[gBattlerAttacker].hp -= gBattleMoveDamage; + gBattleMons[gBattlerAttacker].hp -= gBattleStruct->moveDamage[gBattlerTarget]; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -15887,7 +16530,7 @@ static void Cmd_tryworryseed(void) else { gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerTarget].ability; - gBattleMons[gBattlerTarget].ability = gBattleStruct->overwrittenAbilities[gBattlerTarget] = ABILITY_INSOMNIA; + gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = ABILITY_INSOMNIA; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -15980,7 +16623,7 @@ void BS_CalcMetalBurstDmg(void) && sideAttacker != (sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId)) && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp) { - gBattleMoveDamage = gProtectStructs[gBattlerAttacker].physicalDmg * 150 / 100; + gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].physicalDmg * 150 / 100; if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) gBattlerTarget = gSideTimers[sideTarget].followmeTarget; @@ -15993,7 +16636,7 @@ void BS_CalcMetalBurstDmg(void) && sideAttacker != (sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId)) && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp) { - gBattleMoveDamage = gProtectStructs[gBattlerAttacker].specialDmg * 150 / 100; + gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].specialDmg * 150 / 100; if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) gBattlerTarget = gSideTimers[sideTarget].followmeTarget; @@ -16090,10 +16733,10 @@ static bool32 CriticalCapture(u32 odds) bool32 IsMoveAffectedByParentalBond(u32 move, u32 battler) { if (move != MOVE_NONE && move != MOVE_UNAVAILABLE && move != MOVE_STRUGGLE - && !gMovesInfo[move].parentalBondBanned - && gMovesInfo[move].category != DAMAGE_CATEGORY_STATUS - && gMovesInfo[move].strikeCount < 2 - && gMovesInfo[move].effect != EFFECT_MULTI_HIT) + && !IsMoveParentalBondBanned(move) + && GetMoveCategory(move) != DAMAGE_CATEGORY_STATUS + && GetMoveStrikeCount(move) < 2 + && GetMoveEffect(move) != EFFECT_MULTI_HIT) { if (IsDoubleBattle()) { @@ -16148,9 +16791,11 @@ static bool8 CanBurnHitThaw(u16 move) if (B_BURN_HIT_THAW >= GEN_6) { - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - if (gMovesInfo[move].additionalEffects[i].moveEffect == MOVE_EFFECT_BURN) + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + if (additionalEffect->moveEffect == MOVE_EFFECT_BURN) return TRUE; } } @@ -16378,7 +17023,7 @@ void BS_ItemRestoreHP(void) // Heal is applied as move damage if battler is active. if (battler != MAX_BATTLERS_COUNT && hp != 0) { - gBattleMoveDamage = -healAmount; + gBattleStruct->moveDamage[gBattlerAttacker] = -healAmount; gBattlescriptCurrInstr = cmd->restoreBattlerInstr; } else @@ -16581,11 +17226,20 @@ void BS_JumpIfElectricAbilityAffected(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfArgument(void) +void BS_ApplySaltCure(void) +{ + NATIVE_ARGS(u8 battler); + + u8 battler = GetBattlerForBattleScript(cmd->battler); + gStatuses4[battler] |= STATUS4_SALT_CURE; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfMovePropertyArgument(void) { NATIVE_ARGS(u8 argument, const u8 *jumpInstr); - if (gMovesInfo[gCurrentMove].argument == cmd->argument) + if (GetMoveEffectArg_MoveProperty(gCurrentMove) == cmd->argument) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -16596,7 +17250,7 @@ void BS_SetRemoveTerrain(void) NATIVE_ARGS(const u8 *jumpInstr); u32 statusFlag = 0; - switch (gMovesInfo[gCurrentMove].effect) + switch (GetMoveEffect(gCurrentMove)) { case EFFECT_MISTY_TERRAIN: statusFlag = STATUS_FIELD_MISTY_TERRAIN; @@ -16615,7 +17269,7 @@ void BS_SetRemoveTerrain(void) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; break; case EFFECT_HIT_SET_REMOVE_TERRAIN: - switch (gMovesInfo[gCurrentMove].argument) + switch (GetMoveEffectArg_MoveProperty(gCurrentMove)) { case ARG_SET_PSYCHIC_TERRAIN: // Genesis Supernova statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; @@ -16649,9 +17303,9 @@ void BS_SetRemoveTerrain(void) { u32 atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - gFieldStatuses &= ~(STATUS_FIELD_TERRAIN_ANY | STATUS_FIELD_TERRAIN_PERMANENT); + gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; - gFieldTimers.terrainTimer = (atkHoldEffect == HOLD_EFFECT_TERRAIN_EXTENDER) ? 8 : 5; + gFieldTimers.terrainTimer = gBattleTurnCounter + (atkHoldEffect == HOLD_EFFECT_TERRAIN_EXTENDER) ? 8 : 5; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -16671,9 +17325,8 @@ void BS_TryReflectType(void) { NATIVE_ARGS(const u8 *failInstr); u16 targetBaseSpecies = GET_BASE_SPECIES_ID(gBattleMons[gBattlerTarget].species); - u8 targetType1 = GetBattlerType(gBattlerTarget, 0, FALSE); - u8 targetType2 = GetBattlerType(gBattlerTarget, 1, FALSE); - u8 targetType3 = GetBattlerType(gBattlerTarget, 2, FALSE); + u32 targetTypes[3]; + GetBattlerTypes(gBattlerTarget, FALSE, targetTypes); if (targetBaseSpecies == SPECIES_ARCEUS || targetBaseSpecies == SPECIES_SILVALLY) { @@ -16687,32 +17340,32 @@ void BS_TryReflectType(void) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (targetType1 == TYPE_MYSTERY && targetType2 == TYPE_MYSTERY && targetType3 != TYPE_MYSTERY) + else if (targetTypes[0] == TYPE_MYSTERY && targetTypes[1] == TYPE_MYSTERY && targetTypes[2] != TYPE_MYSTERY) { gBattleMons[gBattlerAttacker].types[0] = TYPE_NORMAL; gBattleMons[gBattlerAttacker].types[1] = TYPE_NORMAL; - gBattleMons[gBattlerAttacker].types[2] = targetType3; + gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; gBattlescriptCurrInstr = cmd->nextInstr; } - else if (targetType1 == TYPE_MYSTERY && targetType2 != TYPE_MYSTERY) + else if (targetTypes[0] == TYPE_MYSTERY && targetTypes[1] != TYPE_MYSTERY) { - gBattleMons[gBattlerAttacker].types[0] = targetType2; - gBattleMons[gBattlerAttacker].types[1] = targetType2; - gBattleMons[gBattlerAttacker].types[2] = targetType3; + gBattleMons[gBattlerAttacker].types[0] = targetTypes[1]; + gBattleMons[gBattlerAttacker].types[1] = targetTypes[1]; + gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; gBattlescriptCurrInstr = cmd->nextInstr; } - else if (targetType1 != TYPE_MYSTERY && targetType2 == TYPE_MYSTERY) + else if (targetTypes[0] != TYPE_MYSTERY && targetTypes[1] == TYPE_MYSTERY) { - gBattleMons[gBattlerAttacker].types[0] = targetType1; - gBattleMons[gBattlerAttacker].types[1] = targetType1; - gBattleMons[gBattlerAttacker].types[2] = targetType3; + gBattleMons[gBattlerAttacker].types[0] = targetTypes[0]; + gBattleMons[gBattlerAttacker].types[1] = targetTypes[0]; + gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; gBattlescriptCurrInstr = cmd->nextInstr; } else { - gBattleMons[gBattlerAttacker].types[0] = targetType1; - gBattleMons[gBattlerAttacker].types[1] = targetType2; - gBattleMons[gBattlerAttacker].types[2] = targetType3; + gBattleMons[gBattlerAttacker].types[0] = targetTypes[0]; + gBattleMons[gBattlerAttacker].types[1] = targetTypes[1]; + gBattleMons[gBattlerAttacker].types[2] = targetTypes[2]; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -16805,7 +17458,7 @@ void BS_SetPledge(void) && GetBattlerTurnOrderNum(gBattlerAttacker) < GetBattlerTurnOrderNum(partner) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gCurrentMove != partnerMove - && gMovesInfo[partnerMove].effect == EFFECT_PLEDGE) + && GetMoveEffect(partnerMove) == EFFECT_PLEDGE) { u32 currPledgeUser = 0; u32 newTurnOrder[] = {0xFF, 0xFF}; @@ -16862,13 +17515,13 @@ void BS_SetPledgeStatus(void) switch (cmd->sideStatus) { case SIDE_STATUS_RAINBOW: - gSideTimers[side].rainbowTimer = 4; + gSideTimers[side].rainbowTimer = gBattleTurnCounter + 4; break; case SIDE_STATUS_SEA_OF_FIRE: - gSideTimers[side].seaOfFireTimer = 4; + gSideTimers[side].seaOfFireTimer = gBattleTurnCounter + 4; break; case SIDE_STATUS_SWAMP: - gSideTimers[side].swampTimer = 4; + gSideTimers[side].swampTimer = gBattleTurnCounter + 4; } gBattlescriptCurrInstr = cmd->nextInstr; @@ -16925,21 +17578,21 @@ void BS_TryHealPulse(void) { NATIVE_ARGS(const u8 *failInstr); - if (BATTLER_MAX_HP(gBattlerTarget)) + if (IsBattlerAtMaxHp(gBattlerTarget)) { gBattlescriptCurrInstr = cmd->failInstr; } else { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MEGA_LAUNCHER && gMovesInfo[gCurrentMove].pulseMove) - gBattleMoveDamage = -(GetNonDynamaxMaxHP(gBattlerTarget) * 75 / 100); - else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && gMovesInfo[gCurrentMove].argument == MOVE_EFFECT_FLORAL_HEALING) - gBattleMoveDamage = -(GetNonDynamaxMaxHP(gBattlerTarget) * 2 / 3); + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MEGA_LAUNCHER && IsPulseMove(gCurrentMove)) + gBattleStruct->moveDamage[gBattlerTarget] = -(GetNonDynamaxMaxHP(gBattlerTarget) * 75 / 100); + else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && GetMoveEffectArg_MoveProperty(gCurrentMove) == MOVE_EFFECT_FLORAL_HEALING) + gBattleStruct->moveDamage[gBattlerTarget] = -(GetNonDynamaxMaxHP(gBattlerTarget) * 2 / 3); else - gBattleMoveDamage = -(GetNonDynamaxMaxHP(gBattlerTarget) / 2); + gBattleStruct->moveDamage[gBattlerTarget] = -(GetNonDynamaxMaxHP(gBattlerTarget) / 2); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = -1; + if (gBattleStruct->moveDamage[gBattlerTarget] == 0) + gBattleStruct->moveDamage[gBattlerTarget] = -1; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -16948,13 +17601,13 @@ void BS_TryCopycat(void) { NATIVE_ARGS(const u8 *failInstr); - if (gLastUsedMove == MOVE_NONE || gLastUsedMove == MOVE_UNAVAILABLE || gMovesInfo[gLastUsedMove].copycatBanned || IsZMove(gLastUsedMove)) + if (gLastUsedMove == MOVE_NONE || gLastUsedMove == MOVE_UNAVAILABLE || IsMoveCopycatBanned(gLastUsedMove) || IsZMove(gLastUsedMove)) { gBattlescriptCurrInstr = cmd->failInstr; } else { - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IS_MOVE_STATUS(gLastUsedMove)) + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(gLastUsedMove)) { gBattleStruct->zmove.baseMoves[gBattlerAttacker] = gLastUsedMove; gCalledMove = GetTypeBasedZMove(gLastUsedMove); @@ -16969,7 +17622,7 @@ void BS_TryCopycat(void) } gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); + gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -17000,7 +17653,7 @@ void BS_TryUpperHand(void) if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) || gChosenMoveByBattler[gBattlerTarget] == MOVE_NONE - || IS_MOVE_STATUS(gChosenMoveByBattler[gBattlerTarget]) + || IsBattleMoveStatus(gChosenMoveByBattler[gBattlerTarget]) || GetChosenMovePriority(gBattlerTarget) < 1 || GetChosenMovePriority(gBattlerTarget) > 3) // Fails if priority is less than 1 or greater than 3, if target already moved, or if using a status gBattlescriptCurrInstr = cmd->failInstr; else @@ -17051,12 +17704,25 @@ void BS_AllySwitchFailChance(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_SetPhotonGeyserCategory(void) +void BS_SetDynamicMoveCategory(void) { NATIVE_ARGS(); - if (!((gMovesInfo[gCurrentMove].effect == EFFECT_TERA_BLAST && GetActiveGimmick(gBattlerAttacker) != GIMMICK_TERA) - || (gMovesInfo[gCurrentMove].effect == EFFECT_TERA_STARSTORM && GetActiveGimmick(gBattlerAttacker) != GIMMICK_TERA && gBattleMons[gBattlerAttacker].species == SPECIES_TERAPAGOS_STELLAR))) - gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(gBattlerAttacker) != gMovesInfo[gCurrentMove].category); + + switch (GetMoveEffect(gCurrentMove)) + { + case EFFECT_TERA_BLAST: + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) + gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(gBattlerAttacker) != GetMoveCategory(gCurrentMove)); + break; + case EFFECT_TERA_STARSTORM: + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA && gBattleMons[gBattlerAttacker].species == SPECIES_TERAPAGOS_STELLAR) + gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(gBattlerAttacker) != GetMoveCategory(gCurrentMove)); + break; + default: + gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(gBattlerAttacker) != GetMoveCategory(gCurrentMove)); + break; + } + gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17126,10 +17792,10 @@ void BS_TryUpdateRecoilTracker(void) switch(gender) { case MON_MALE: - TryUpdateEvolutionTracker(EVO_RECOIL_DAMAGE_MALE, gBattleMoveDamage, MOVE_NONE); + TryUpdateEvolutionTracker(EVO_RECOIL_DAMAGE_MALE, gBattleStruct->moveDamage[gBattlerAttacker], MOVE_NONE); break; case MON_FEMALE: - TryUpdateEvolutionTracker(EVO_RECOIL_DAMAGE_FEMALE, gBattleMoveDamage, MOVE_NONE); + TryUpdateEvolutionTracker(EVO_RECOIL_DAMAGE_FEMALE, gBattleStruct->moveDamage[gBattlerAttacker], MOVE_NONE); break; } @@ -17180,17 +17846,17 @@ void BS_TryActivateGulpMissile(void) { NATIVE_ARGS(); - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT && GetBattlerAbility(gBattlerTarget) == ABILITY_GULP_MISSILE) { if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + if (gBattleStruct->moveDamage[gBattlerTarget] == 0) + gBattleStruct->moveDamage[gBattlerTarget] = 1; } switch(gBattleMons[gBattlerTarget].species) @@ -17292,13 +17958,32 @@ void BS_ApplyTerastallization(void) void BS_DamageToQuarterTargetHP(void) { NATIVE_ARGS(); - gBattleMoveDamage = (3 * GetNonDynamaxHP(gBattlerTarget)) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerTarget] = (3 * GetNonDynamaxHP(gBattlerTarget)) / 4; + if (gBattleStruct->moveDamage[gBattlerTarget] == 0) + gBattleStruct->moveDamage[gBattlerTarget] = 1; gBattlescriptCurrInstr = cmd->nextInstr; } +void BS_JumpIfSleepClause(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + + // Can freely sleep own partner + if (IsDoubleBattle() && IsSleepClauseEnabled() && IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) + { + gBattleStruct->battlerState[gBattlerTarget].sleepClauseEffectExempt = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } + gBattleStruct->battlerState[gBattlerTarget].sleepClauseEffectExempt = FALSE; + // Can't sleep if clause is active otherwise + if (IsSleepClauseActiveForSide(GetBattlerSide(gBattlerTarget))) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + void BS_FickleBeamDamageCalculation(void) { NATIVE_ARGS(); @@ -17344,7 +18029,7 @@ void BS_JumpIfBlockedBySoundproof(void) { NATIVE_ARGS(u8 battler, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gMovesInfo[gCurrentMove].soundMove && GetBattlerAbility(battler) == ABILITY_SOUNDPROOF) + if (IsSoundMove(gCurrentMove) && GetBattlerAbility(battler) == ABILITY_SOUNDPROOF) { gLastUsedAbility = ABILITY_SOUNDPROOF; gBattlescriptCurrInstr = cmd->jumpInstr; @@ -17401,7 +18086,7 @@ void BS_TryWindRiderPower(void) u32 battler = GetBattlerForBattleScript(cmd->battler); u16 ability = GetBattlerAbility(battler); - if (GetBattlerSide(battler) == GetBattlerSide(gBattlerAttacker) + if (IsBattlerAlly(battler, gBattlerAttacker) && (ability == ABILITY_WIND_RIDER || ability == ABILITY_WIND_POWER)) { gLastUsedAbility = ability; @@ -17439,9 +18124,9 @@ void BS_StoreHealingWish(void) u32 battler = GetBattlerForBattleScript(cmd->battler); if (gCurrentMove == MOVE_LUNAR_DANCE) - gBattleStruct->storedLunarDance |= 1u << battler; + gBattleStruct->battlerState[battler].storedLunarDance = TRUE; else - gBattleStruct->storedHealingWish |= 1u << battler; + gBattleStruct->battlerState[battler].storedHealingWish = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17586,7 +18271,7 @@ void BS_TrySpectralThiefSteal(void) { NATIVE_ARGS(const u8 *jumpInstr); - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { gBattlescriptCurrInstr = cmd->nextInstr; return; @@ -17658,3 +18343,297 @@ void BS_SpectralThiefPrintStats(void) } gBattlescriptCurrInstr = cmd->nextInstr; } + +void BS_SetMoveResultFlags(void) +{ + NATIVE_ARGS(u16 value); + gBattleStruct->moveResultFlags[gBattlerTarget] |= cmd->value; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ClearMoveResultFlags(void) +{ + NATIVE_ARGS(u16 value); + gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(cmd->value); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfMoveResultFlags(void) +{ + NATIVE_ARGS(u16 value, const u8 *jumpInstr); + + if (gBattleStruct->moveResultFlags[gBattlerTarget] & cmd->value) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfCriticalHit(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + + if (gSpecialStatuses[gBattlerTarget].criticalHit) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SwapStats(void) +{ + NATIVE_ARGS(u8 stat); + + u32 stat = cmd->stat; + u32 temp; + + switch (stat) + { + case STAT_HP: + SWAP(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerTarget].hp, temp); + break; + case STAT_ATK: + SWAP(gBattleMons[gBattlerAttacker].attack, gBattleMons[gBattlerTarget].attack, temp); + break; + case STAT_DEF: + SWAP(gBattleMons[gBattlerAttacker].defense, gBattleMons[gBattlerTarget].defense, temp); + break; + case STAT_SPEED: + SWAP(gBattleMons[gBattlerAttacker].speed, gBattleMons[gBattlerTarget].speed, temp); + break; + case STAT_SPATK: + SWAP(gBattleMons[gBattlerAttacker].spAttack, gBattleMons[gBattlerTarget].spAttack, temp); + break; + case STAT_SPDEF: + SWAP(gBattleMons[gBattlerAttacker].spDefense, gBattleMons[gBattlerTarget].spDefense, temp); + break; + } + PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void TrySetParalysis(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBeParalyzed(gBattlerTarget, GetBattlerAbility(gBattlerTarget))) + { + gBattleMons[gBattlerTarget].status1 |= STATUS1_PARALYSIS; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gEffectBattler = gBattlerTarget; + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = nextInstr; + } + else + { + gBattlescriptCurrInstr = failInstr; + } +} + +static void TrySetPoison(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget))) + { + gBattleMons[gBattlerTarget].status1 |= STATUS1_POISON; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gEffectBattler = gBattlerTarget; + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = nextInstr; + } + else + { + gBattlescriptCurrInstr = failInstr; + } +} + +static void TrySetSleep(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE)) + { + if (B_SLEEP_TURNS >= GEN_5) + gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 3) + 2); + else + gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 4) + 3); + + TryActivateSleepClause(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gEffectBattler = gBattlerTarget; + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = nextInstr; + } + else + { + gBattlescriptCurrInstr = failInstr; + } +} + +void BS_TrySetParalysis(void) +{ + NATIVE_ARGS(const u8 *failInstr); + TrySetParalysis(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetPoison(void) +{ + NATIVE_ARGS(const u8 *failInstr); + TrySetPoison(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetPoisonParalyzis(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + static const u32 sStunShockEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON}; + u32 status = RandomElement(RNG_G_MAX_STUN_SHOCK, sStunShockEffects); + + if (status == STATUS1_PARALYSIS) + TrySetParalysis(cmd->nextInstr, cmd->failInstr); + else + TrySetPoison(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetEffectSpore(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + static const u32 sBefuddleEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON, STATUS1_SLEEP}; + u32 status = RandomElement(RNG_G_MAX_BEFUDDLE, sBefuddleEffects); + + if (status == STATUS1_PARALYSIS) + TrySetParalysis(cmd->nextInstr, cmd->failInstr); + else if (status == STATUS1_POISON) + TrySetPoison(cmd->nextInstr, cmd->failInstr); + else + TrySetSleep(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetConfusion(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (CanBeConfused(gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTIUSE_STATE] = 1; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TrySetInfatuation(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION) + && gBattleMons[gBattlerTarget].ability != ABILITY_OBLIVIOUS + && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL) + && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTIUSE_STATE] = 2; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TrySetEscapePrevention(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TrySetTorment(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) + && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; + gDisableStructs[gBattlerTarget].tormentTimer = 3; // 3 turns excluding current turn + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +// Heals one-sixth of the target's HP, including for Dynamaxed targets. +void BS_HealOneSixth(void) +{ + NATIVE_ARGS(const u8* failInstr); + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP / 6; + if (gBattleStruct->moveDamage[gBattlerTarget] == 0) + gBattleStruct->moveDamage[gBattlerTarget] = 1; + gBattleStruct->moveDamage[gBattlerTarget] *= -1; + + if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) + gBattlescriptCurrInstr = cmd->failInstr; // fail + else + gBattlescriptCurrInstr = cmd->nextInstr; // can heal +} + +// Recycles the target's item if it is specifically holding a berry. +void BS_TryRecycleBerry(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; + if (gBattleMons[gBattlerTarget].item == ITEM_NONE + && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item + && ItemId_GetPocket(*usedHeldItem) == POCKET_BERRIES) + { + gLastUsedItem = *usedHeldItem; + *usedHeldItem = ITEM_NONE; + gBattleMons[gBattlerTarget].item = gLastUsedItem; + + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + MarkBattlerForControllerExec(gBattlerTarget); + + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +// Sets up sharp steel on the target's side. +void BS_SetSteelsurge(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideStatuses[targetSide] & SIDE_STATUS_STEELSURGE) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gSideStatuses[targetSide] |= SIDE_STATUS_STEELSURGE; + gSideTimers[targetSide].steelsurgeAmount = 1; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} diff --git a/src/battle_setup.c b/src/battle_setup.c index 37204c1d8d..96d23dc42a 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -49,6 +49,7 @@ #include "constants/trainers.h" #include "constants/trainer_hill.h" #include "constants/weather.h" +#include "wild_encounter.h" enum { TRANSITION_TYPE_NORMAL, @@ -57,22 +58,6 @@ enum { TRANSITION_TYPE_WATER, }; -enum { - TRAINER_PARAM_LOAD_VAL_8BIT, - TRAINER_PARAM_LOAD_VAL_16BIT, - TRAINER_PARAM_LOAD_VAL_32BIT, - TRAINER_PARAM_CLEAR_VAL_8BIT, - TRAINER_PARAM_CLEAR_VAL_16BIT, - TRAINER_PARAM_CLEAR_VAL_32BIT, - TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR, -}; - -struct TrainerBattleParameter -{ - void *varPtr; - u8 ptrType; -}; - // this file's functions static void DoBattlePikeWildBattle(void); static void DoSafariBattle(void); @@ -96,20 +81,9 @@ static void HandleRematchVarsOnBattleEnd(void); static const u8 *GetIntroSpeechOfApproachingTrainer(void); static const u8 *GetTrainerCantBattleSpeech(void); -EWRAM_DATA static u16 sTrainerBattleMode = 0; -EWRAM_DATA u16 gTrainerBattleOpponent_A = 0; -EWRAM_DATA u16 gTrainerBattleOpponent_B = 0; +EWRAM_DATA TrainerBattleParameter gTrainerBattleParameter = {0}; EWRAM_DATA u16 gPartnerTrainerId = 0; -EWRAM_DATA static u16 sTrainerObjectEventLocalId = 0; -EWRAM_DATA static u8 *sTrainerAIntroSpeech = NULL; -EWRAM_DATA static u8 *sTrainerBIntroSpeech = NULL; -EWRAM_DATA static u8 *sTrainerADefeatSpeech = NULL; -EWRAM_DATA static u8 *sTrainerBDefeatSpeech = NULL; -EWRAM_DATA static u8 *sTrainerVictorySpeech = NULL; -EWRAM_DATA static u8 *sTrainerCannotBattleSpeech = NULL; EWRAM_DATA static u8 *sTrainerBattleEndScript = NULL; -EWRAM_DATA static u8 *sTrainerABattleScriptRetAddr = NULL; -EWRAM_DATA static u8 *sTrainerBBattleScriptRetAddr = NULL; EWRAM_DATA static bool8 sShouldCheckTrainerBScript = FALSE; EWRAM_DATA static u8 sNoOfPossibleTrainerRetScripts = 0; @@ -163,114 +137,6 @@ static const u8 sBattleTransitionTable_BattleDome[] = B_TRANSITION_FRONTIER_SQUARES_SPIRAL }; -static const struct TrainerBattleParameter sOrdinaryBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sContinueScriptBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sDoubleBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sContinueScriptDoubleBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sTrainerBOrdinaryBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBBattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBBattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - -// two trainers, each with a defeat speech -static const struct TrainerBattleParameter sTrainerTwoTrainerBattleParams[] = -{ - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, - {&sTrainerObjectEventLocalId, TRAINER_PARAM_CLEAR_VAL_16BIT}, - {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerBIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, - {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBBattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT}, - {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, -}; - #define REMATCH(trainer1, trainer2, trainer3, trainer4, trainer5, map) \ { \ .trainerIds = {trainer1, trainer2, trainer3, trainer4, trainer5}, \ @@ -360,12 +226,6 @@ const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] = [REMATCH_WALLACE] = REMATCH(TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, EVER_GRANDE_CITY), }; -static const u16 sBadgeFlags[NUM_BADGES] = -{ - FLAG_BADGE01_GET, FLAG_BADGE02_GET, FLAG_BADGE03_GET, FLAG_BADGE04_GET, - FLAG_BADGE05_GET, FLAG_BADGE06_GET, FLAG_BADGE07_GET, FLAG_BADGE08_GET, -}; - #define tState data[0] #define tTransition data[1] @@ -750,7 +610,11 @@ u8 BattleSetup_GetTerrainId(void) u16 tileBehavior; s16 x, y; - PlayerGetDestCoords(&x, &y); + if (I_FISHING_ENVIRONMENT >= GEN_4 && gIsFishingEncounter) + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + else + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsTallGrass(tileBehavior)) @@ -896,8 +760,8 @@ u8 GetTrainerBattleTransition(void) u8 transitionType; u8 enemyLevel; u8 playerLevel; - u32 trainerId = SanitizeTrainerId(gTrainerBattleOpponent_A); - u32 trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (DoesTrainerHaveMugshot(trainerId)) return B_TRANSITION_MUGSHOT; @@ -1033,30 +897,14 @@ static void TryUpdateGymLeaderRematchFromTrainer(void) UpdateGymLeaderRematch(); } -// why not just use the macros? maybe its because they didnt want to uncast const every time? -static u32 TrainerBattleLoadArg32(const u8 *ptr) -{ - return T1_READ_32(ptr); -} - -static u16 TrainerBattleLoadArg16(const u8 *ptr) -{ - return T1_READ_16(ptr); -} - -static u8 TrainerBattleLoadArg8(const u8 *ptr) -{ - return T1_READ_8(ptr); -} - static u16 GetTrainerAFlag(void) { - return TRAINER_FLAGS_START + gTrainerBattleOpponent_A; + return TRAINER_FLAGS_START + TRAINER_BATTLE_PARAM.opponentA; } static u16 GetTrainerBFlag(void) { - return TRAINER_FLAGS_START + gTrainerBattleOpponent_B; + return TRAINER_FLAGS_START + TRAINER_BATTLE_PARAM.opponentB; } static bool32 IsPlayerDefeated(u32 battleOutcome) @@ -1079,188 +927,143 @@ static bool32 IsPlayerDefeated(u32 battleOutcome) void ResetTrainerOpponentIds(void) { - gTrainerBattleOpponent_A = 0; - gTrainerBattleOpponent_B = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; + TRAINER_BATTLE_PARAM.opponentB = 0; } static void InitTrainerBattleVariables(void) { - sTrainerBattleMode = 0; - if (gApproachingTrainerId == 0) - { - sTrainerAIntroSpeech = NULL; - sTrainerADefeatSpeech = NULL; - sTrainerABattleScriptRetAddr = NULL; - } - else - { - sTrainerBIntroSpeech = NULL; - sTrainerBDefeatSpeech = NULL; - sTrainerBBattleScriptRetAddr = NULL; - } - sTrainerObjectEventLocalId = 0; - sTrainerVictorySpeech = NULL; - sTrainerCannotBattleSpeech = NULL; + memset(gTrainerBattleParameter.data, 0, sizeof(TrainerBattleParameter)); sTrainerBattleEndScript = NULL; } -static inline void SetU8(void *ptr, u8 value) +void TrainerBattleLoadArgs(const u8 *data) { - *(u8 *)(ptr) = value; + InitTrainerBattleVariables(); + memcpy(gTrainerBattleParameter.data, data, sizeof(TrainerBattleParameter)); + sTrainerBattleEndScript = (u8*)data + sizeof(TrainerBattleParameter); } -static inline void SetU16(void *ptr, u16 value) +void TrainerBattleLoadArgsTrainerA(const u8 *data) { - *(u16 *)(ptr) = value; + TrainerBattleParameter *temp = (TrainerBattleParameter*)data; + + TRAINER_BATTLE_PARAM.playMusicA = temp->params.playMusicA; + TRAINER_BATTLE_PARAM.objEventLocalIdA = temp->params.objEventLocalIdA; + TRAINER_BATTLE_PARAM.opponentA = temp->params.opponentA; + TRAINER_BATTLE_PARAM.introTextA = temp->params.introTextA; + TRAINER_BATTLE_PARAM.defeatTextA = temp->params.defeatTextA; + TRAINER_BATTLE_PARAM.battleScriptRetAddrA = temp->params.battleScriptRetAddrA; } -static inline void SetU32(void *ptr, u32 value) +void TrainerBattleLoadArgsTrainerB(const u8 *data) { - *(u32 *)(ptr) = value; + TrainerBattleParameter *temp = (TrainerBattleParameter*)data; + + TRAINER_BATTLE_PARAM.playMusicB = temp->params.playMusicB; + TRAINER_BATTLE_PARAM.objEventLocalIdB = temp->params.objEventLocalIdB; + TRAINER_BATTLE_PARAM.opponentB = temp->params.opponentB; + TRAINER_BATTLE_PARAM.introTextB = temp->params.introTextB; + TRAINER_BATTLE_PARAM.defeatTextB = temp->params.defeatTextB; + TRAINER_BATTLE_PARAM.battleScriptRetAddrB = temp->params.battleScriptRetAddrB; } -static inline void SetPtr(const void *ptr, const void *value) +// loads trainer A parameter to trainer B. Used for second trainer in trainer_see.c +void TrainerBattleLoadArgsSecondTrainer(const u8 *data) { - *(const void **)(ptr) = value; + TrainerBattleParameter *temp = (TrainerBattleParameter*)data; + + TRAINER_BATTLE_PARAM.playMusicB = temp->params.playMusicA; + TRAINER_BATTLE_PARAM.objEventLocalIdB = temp->params.objEventLocalIdA; + TRAINER_BATTLE_PARAM.opponentB = temp->params.opponentA; + TRAINER_BATTLE_PARAM.introTextB = temp->params.introTextA; + TRAINER_BATTLE_PARAM.defeatTextB = temp->params.defeatTextA; + TRAINER_BATTLE_PARAM.battleScriptRetAddrB = temp->params.battleScriptRetAddrA; } -static void TrainerBattleLoadArgs(const struct TrainerBattleParameter *specs, const u8 *data) +void SetMapVarsToTrainerA(void) { - while (1) + if (TRAINER_BATTLE_PARAM.objEventLocalIdA != 0) { - switch (specs->ptrType) - { - case TRAINER_PARAM_LOAD_VAL_8BIT: - SetU8(specs->varPtr, TrainerBattleLoadArg8(data)); - data += 1; - break; - case TRAINER_PARAM_LOAD_VAL_16BIT: - SetU16(specs->varPtr, TrainerBattleLoadArg16(data)); - data += 2; - break; - case TRAINER_PARAM_LOAD_VAL_32BIT: - SetU32(specs->varPtr, TrainerBattleLoadArg32(data)); - data += 4; - break; - case TRAINER_PARAM_CLEAR_VAL_8BIT: - SetU8(specs->varPtr, 0); - break; - case TRAINER_PARAM_CLEAR_VAL_16BIT: - SetU16(specs->varPtr, 0); - break; - case TRAINER_PARAM_CLEAR_VAL_32BIT: - SetU32(specs->varPtr, 0); - break; - case TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR: - SetPtr(specs->varPtr, data); - return; - } - specs++; + gSpecialVar_LastTalked = TRAINER_BATTLE_PARAM.objEventLocalIdA; + gSelectedObjectEvent = GetObjectEventIdByLocalIdAndMap(TRAINER_BATTLE_PARAM.objEventLocalIdA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } } -void SetMapVarsToTrainer(void) +void SetMapVarsToTrainerB(void) { - if (sTrainerObjectEventLocalId != 0) + if (TRAINER_BATTLE_PARAM.objEventLocalIdB != 0) { - gSpecialVar_LastTalked = sTrainerObjectEventLocalId; - gSelectedObjectEvent = GetObjectEventIdByLocalIdAndMap(sTrainerObjectEventLocalId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + gSpecialVar_LastTalked = TRAINER_BATTLE_PARAM.objEventLocalIdB; + gSelectedObjectEvent = GetObjectEventIdByLocalIdAndMap(TRAINER_BATTLE_PARAM.objEventLocalIdB, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } } +// expects parameters have been loaded correctly with TrainerBattleLoadArgs const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) { - if (TrainerBattleLoadArg8(data) != TRAINER_BATTLE_SET_TRAINER_B) - InitTrainerBattleVariables(); - sTrainerBattleMode = TrainerBattleLoadArg8(data); - - switch (sTrainerBattleMode) + switch (TRAINER_BATTLE_PARAM.mode) { case TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT: - TrainerBattleLoadArgs(sOrdinaryNoIntroBattleParams, data); return EventScript_DoNoIntroTrainerBattle; case TRAINER_BATTLE_DOUBLE: - TrainerBattleLoadArgs(sDoubleBattleParams, data); - SetMapVarsToTrainer(); + SetMapVarsToTrainerA(); return EventScript_TryDoDoubleTrainerBattle; case TRAINER_BATTLE_CONTINUE_SCRIPT: if (gApproachingTrainerId == 0) { - TrainerBattleLoadArgs(sContinueScriptBattleParams, data); - SetMapVarsToTrainer(); - } - else - { - TrainerBattleLoadArgs(sTrainerBContinueScriptBattleParams, data); + SetMapVarsToTrainerA(); } return EventScript_TryDoNormalTrainerBattle; case TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC: - TrainerBattleLoadArgs(sContinueScriptBattleParams, data); - SetMapVarsToTrainer(); + SetMapVarsToTrainerA(); return EventScript_TryDoNormalTrainerBattle; case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE: case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC: - TrainerBattleLoadArgs(sContinueScriptDoubleBattleParams, data); - SetMapVarsToTrainer(); + SetMapVarsToTrainerA(); return EventScript_TryDoDoubleTrainerBattle; #if FREE_MATCH_CALL == FALSE case TRAINER_BATTLE_REMATCH_DOUBLE: - TrainerBattleLoadArgs(sDoubleBattleParams, data); - SetMapVarsToTrainer(); - gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); + SetMapVarsToTrainerA(); + TRAINER_BATTLE_PARAM.opponentA = GetRematchTrainerId(TRAINER_BATTLE_PARAM.opponentA); return EventScript_TryDoDoubleRematchBattle; case TRAINER_BATTLE_REMATCH: - TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - SetMapVarsToTrainer(); - gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); + SetMapVarsToTrainerA(); + TRAINER_BATTLE_PARAM.opponentA = GetRematchTrainerId(TRAINER_BATTLE_PARAM.opponentA); return EventScript_TryDoRematchBattle; #endif //FREE_MATCH_CALL case TRAINER_BATTLE_PYRAMID: if (gApproachingTrainerId == 0) { - TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - SetMapVarsToTrainer(); - gTrainerBattleOpponent_A = LocalIdToPyramidTrainerId(gSpecialVar_LastTalked); + SetMapVarsToTrainerA(); + TRAINER_BATTLE_PARAM.opponentA = LocalIdToPyramidTrainerId(gSpecialVar_LastTalked); } else { - TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); - gTrainerBattleOpponent_B = LocalIdToPyramidTrainerId(gSpecialVar_LastTalked); + TRAINER_BATTLE_PARAM.opponentB = LocalIdToPyramidTrainerId(gSpecialVar_LastTalked); } return EventScript_TryDoNormalTrainerBattle; - case TRAINER_BATTLE_SET_TRAINER_A: - TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - return sTrainerBattleEndScript; - case TRAINER_BATTLE_SET_TRAINER_B: - TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); + case TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE: return sTrainerBattleEndScript; case TRAINER_BATTLE_HILL: if (gApproachingTrainerId == 0) { - TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - SetMapVarsToTrainer(); - gTrainerBattleOpponent_A = LocalIdToHillTrainerId(gSpecialVar_LastTalked); + SetMapVarsToTrainerA(); + TRAINER_BATTLE_PARAM.opponentA = LocalIdToHillTrainerId(gSpecialVar_LastTalked); } else { - TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); - gTrainerBattleOpponent_B = LocalIdToHillTrainerId(gSpecialVar_LastTalked); + TRAINER_BATTLE_PARAM.opponentB = LocalIdToHillTrainerId(gSpecialVar_LastTalked); } return EventScript_TryDoNormalTrainerBattle; case TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO: gNoOfApproachingTrainers = 2; // set TWO_OPPONENTS gBattleTypeFlags gApproachingTrainerId = 1; // prevent trainer approach - TrainerBattleLoadArgs(sTrainerTwoTrainerBattleParams, data); return EventScript_DoNoIntroTrainerBattle; default: if (gApproachingTrainerId == 0) { - TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - SetMapVarsToTrainer(); - } - else - { - TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); + SetMapVarsToTrainerA(); } return EventScript_TryDoNormalTrainerBattle; } @@ -1270,6 +1073,7 @@ void ConfigureAndSetUpOneTrainerBattle(u8 trainerObjEventId, const u8 *trainerSc { gSelectedObjectEvent = trainerObjEventId; gSpecialVar_LastTalked = gObjectEvents[trainerObjEventId].localId; + TrainerBattleLoadArgs(trainerScript + 1); BattleSetup_ConfigureTrainerBattle(trainerScript + 1); ScriptContext_SetupScript(EventScript_StartTrainerApproach); LockPlayerFieldControls(); @@ -1279,6 +1083,12 @@ void ConfigureTwoTrainersBattle(u8 trainerObjEventId, const u8 *trainerScript) { gSelectedObjectEvent = trainerObjEventId; gSpecialVar_LastTalked = gObjectEvents[trainerObjEventId].localId; + + if (gApproachingTrainerId == 0) + TrainerBattleLoadArgs(trainerScript + 1); + else + TrainerBattleLoadArgsSecondTrainer(trainerScript + 1); + BattleSetup_ConfigureTrainerBattle(trainerScript + 1); } @@ -1288,11 +1098,13 @@ void SetUpTwoTrainersBattle(void) LockPlayerFieldControls(); } +#define OPCODE_OFFSET 1 bool32 GetTrainerFlagFromScriptPointer(const u8 *data) { - u32 flag = TrainerBattleLoadArg16(data + 2); - return FlagGet(TRAINER_FLAGS_START + flag); + TrainerBattleParameter *temp = (TrainerBattleParameter*)(data + OPCODE_OFFSET); + return FlagGet(TRAINER_FLAGS_START + temp->params.opponentA); } +#undef OPCODE_OFFSET // Set trainer's movement type so they stop and remain facing that direction // Note: Only for trainers who are spoken to directly @@ -1305,7 +1117,7 @@ void SetTrainerFacingDirection(void) u8 GetTrainerBattleMode(void) { - return sTrainerBattleMode; + return TRAINER_BATTLE_PARAM.mode; } bool8 GetTrainerFlag(void) @@ -1320,7 +1132,7 @@ bool8 GetTrainerFlag(void) static void SetBattledTrainersFlags(void) { - if (gTrainerBattleOpponent_B != 0) + if (TRAINER_BATTLE_PARAM.opponentB != 0) FlagSet(GetTrainerBFlag()); FlagSet(GetTrainerAFlag()); } @@ -1440,7 +1252,7 @@ static void CB2_EndTrainerBattle(void) { HandleBattleVariantEndParty(); - if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_SECRET_BASE) { DowngradeBadPoison(); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); @@ -1466,7 +1278,7 @@ static void CB2_EndTrainerBattle(void) static void CB2_EndRematchBattle(void) { - if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_SECRET_BASE) { DowngradeBadPoison(); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); @@ -1532,18 +1344,18 @@ const u8 *BattleSetup_GetTrainerPostBattleScript(void) if (sShouldCheckTrainerBScript) { sShouldCheckTrainerBScript = FALSE; - if (sTrainerBBattleScriptRetAddr != NULL) + if (TRAINER_BATTLE_PARAM.battleScriptRetAddrB != NULL) { gWhichTrainerToFaceAfterBattle = 1; - return sTrainerBBattleScriptRetAddr; + return TRAINER_BATTLE_PARAM.battleScriptRetAddrB; } } else { - if (sTrainerABattleScriptRetAddr != NULL) + if (TRAINER_BATTLE_PARAM.battleScriptRetAddrA != NULL) { gWhichTrainerToFaceAfterBattle = 0; - return sTrainerABattleScriptRetAddr; + return TRAINER_BATTLE_PARAM.battleScriptRetAddrA; } } @@ -1561,12 +1373,12 @@ void PlayTrainerEncounterMusic(void) u16 music; if (gApproachingTrainerId == 0) - trainerId = gTrainerBattleOpponent_A; + trainerId = TRAINER_BATTLE_PARAM.opponentA; else - trainerId = gTrainerBattleOpponent_B; + trainerId = TRAINER_BATTLE_PARAM.opponentB; - if (sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC - && sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC) + if (TRAINER_BATTLE_PARAM.mode != TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC + && TRAINER_BATTLE_PARAM.mode != TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC) { switch (GetTrainerEncounterMusicId(trainerId)) { @@ -1627,19 +1439,19 @@ static const u8 *ReturnEmptyStringIfNull(const u8 *string) static const u8 *GetIntroSpeechOfApproachingTrainer(void) { if (gApproachingTrainerId == 0) - return ReturnEmptyStringIfNull(sTrainerAIntroSpeech); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.introTextA); else - return ReturnEmptyStringIfNull(sTrainerBIntroSpeech); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.introTextB); } const u8 *GetTrainerALoseText(void) { const u8 *string; - if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_SECRET_BASE) string = GetSecretBaseTrainerLoseText(); else - string = sTrainerADefeatSpeech; + string = TRAINER_BATTLE_PARAM.defeatTextA; StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(string)); return gStringVar4; @@ -1647,18 +1459,18 @@ const u8 *GetTrainerALoseText(void) const u8 *GetTrainerBLoseText(void) { - StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(sTrainerBDefeatSpeech)); + StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.defeatTextB)); return gStringVar4; } const u8 *GetTrainerWonSpeech(void) { - return ReturnEmptyStringIfNull(sTrainerVictorySpeech); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.victoryText); } static const u8 *GetTrainerCantBattleSpeech(void) { - return ReturnEmptyStringIfNull(sTrainerCannotBattleSpeech); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.cannotBattleText); } s32 FirstBattleTrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId) @@ -1897,7 +1709,7 @@ static void RegisterTrainerInMatchCall(void) { if (FlagGet(FLAG_HAS_MATCH_CALL)) { - u32 matchCallFlagId = GetTrainerMatchCallFlag(gTrainerBattleOpponent_A); + u32 matchCallFlagId = GetTrainerMatchCallFlag(TRAINER_BATTLE_PARAM.opponentA); if (matchCallFlagId != 0xFFFF) FlagSet(matchCallFlagId); } @@ -1920,9 +1732,9 @@ static bool32 HasAtLeastFiveBadges(void) { s32 i, count; - for (count = 0, i = 0; i < ARRAY_COUNT(sBadgeFlags); i++) + for (count = 0, i = 0; i < ARRAY_COUNT(gBadgeFlags); i++) { - if (FlagGet(sBadgeFlags[i]) == TRUE) + if (FlagGet(gBadgeFlags[i]) == TRUE) { if (++count >= 5) return TRUE; @@ -1994,15 +1806,15 @@ u16 GetLastBeatenRematchTrainerId(u16 trainerId) bool8 ShouldTryRematchBattle(void) { - if (IsFirstTrainerIdReadyForRematch(gRematchTable, gTrainerBattleOpponent_A)) + if (IsFirstTrainerIdReadyForRematch(gRematchTable, TRAINER_BATTLE_PARAM.opponentA)) return TRUE; - return WasSecondRematchWon(gRematchTable, gTrainerBattleOpponent_A); + return WasSecondRematchWon(gRematchTable, TRAINER_BATTLE_PARAM.opponentA); } bool8 IsTrainerReadyForRematch(void) { - return IsTrainerReadyForRematch_(gRematchTable, gTrainerBattleOpponent_A); + return IsTrainerReadyForRematch_(gRematchTable, TRAINER_BATTLE_PARAM.opponentA); } static void HandleRematchVarsOnBattleEnd(void) @@ -2010,7 +1822,7 @@ static void HandleRematchVarsOnBattleEnd(void) if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) && (I_VS_SEEKER_CHARGING != 0)) ClearRematchMovementByTrainerId(); - ClearTrainerWantRematchState(gRematchTable, gTrainerBattleOpponent_A); + ClearTrainerWantRematchState(gRematchTable, TRAINER_BATTLE_PARAM.opponentA); SetBattledTrainersFlags(); } diff --git a/src/battle_tent.c b/src/battle_tent.c index 49df90ffd6..a5547da46b 100644 --- a/src/battle_tent.c +++ b/src/battle_tent.c @@ -127,14 +127,14 @@ static void SetVerdanturfTentPrize(void) static void SetVerdanturfTentTrainerGfx(void) { - gTrainerBattleOpponent_A = (u32)((Random() % 255) * 5) / 64; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + TRAINER_BATTLE_PARAM.opponentA = (u32)((Random() % 255) * 5) / 64; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); } static void BufferVerdanturfTentTrainerIntro(void) { - if (gTrainerBattleOpponent_A < FRONTIER_TRAINERS_COUNT) - FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore); + if (TRAINER_BATTLE_PARAM.opponentA < FRONTIER_TRAINERS_COUNT) + FrontierSpeechToString(gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].speechBefore); } static void SaveVerdanturfTentChallenge(void) @@ -218,7 +218,7 @@ static void GiveFallarborTentPrize(void) static void BufferFallarborTentTrainerName(void) { - GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); + GetFrontierTrainerName(gStringVar1, TRAINER_BATTLE_PARAM.opponentA); } void CallSlateportTentFunction(void) @@ -375,8 +375,8 @@ static void GenerateOpponentMons(void) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum); - gTrainerBattleOpponent_A = trainerId; - monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet; + TRAINER_BATTLE_PARAM.opponentA = trainerId; + monSet = gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].monSet; while (monSet[numMons] != 0xFFFF) numMons++; if (numMons > 8) @@ -385,9 +385,9 @@ static void GenerateOpponentMons(void) } if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < TENT_STAGES_PER_CHALLENGE - 1) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = TRAINER_BATTLE_PARAM.opponentA; - monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet; + monSet = gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].monSet; i = 0; while (i != FRONTIER_PARTY_SIZE) { diff --git a/src/battle_tower.c b/src/battle_tower.c index 3f614cf294..140d411843 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -699,7 +699,7 @@ static const u8 *const *const sPartnerApprenticeTextTables[NUM_APPRENTICES] = #include "data/battle_frontier/battle_tent.h" #include "data/partner_parties.h" -const struct Trainer gBattlePartners[] = +const struct Trainer gBattlePartners[DIFFICULTY_COUNT][PARTNER_COUNT] = { #include "data/battle_partners.h" }; @@ -823,7 +823,7 @@ static void InitTowerChallenge(void) ValidateBattleTowerRecordChecksums(); SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE); - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; } static void GetTowerData(void) @@ -874,7 +874,7 @@ static void SetTowerData(void) static void SetTowerBattleWon(void) { #if FREE_BATTLE_TOWER_E_READER == FALSE - if (gTrainerBattleOpponent_A == TRAINER_EREADER) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_EREADER) ClearEReaderTrainer(&gSaveBlock2Ptr->frontier.ereaderTrainer); #endif //FREE_BATTLE_TOWER_E_READER @@ -946,7 +946,7 @@ static bool8 ChooseSpecialBattleTowerTrainer(void) if (idsCount != 0) { - gTrainerBattleOpponent_A = trainerIds[Random() % idsCount]; + TRAINER_BATTLE_PARAM.opponentA = trainerIds[Random() % idsCount]; return TRUE; } else @@ -973,15 +973,15 @@ static void SetNextFacilityOpponent(void) if (battleMode == FRONTIER_MODE_MULTIS || battleMode == FRONTIER_MODE_LINK_MULTIS) { id = gSaveBlock2Ptr->frontier.curChallengeBattleNum; - gTrainerBattleOpponent_A = gSaveBlock2Ptr->frontier.trainerIds[id * 2]; - gTrainerBattleOpponent_B = gSaveBlock2Ptr->frontier.trainerIds[id * 2 + 1]; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_B, 1); + TRAINER_BATTLE_PARAM.opponentA = gSaveBlock2Ptr->frontier.trainerIds[id * 2]; + TRAINER_BATTLE_PARAM.opponentB = gSaveBlock2Ptr->frontier.trainerIds[id * 2 + 1]; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentB, 1); } else if (ChooseSpecialBattleTowerTrainer()) { - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = TRAINER_BATTLE_PARAM.opponentA; } else { @@ -1000,10 +1000,10 @@ static void SetNextFacilityOpponent(void) break; } - gTrainerBattleOpponent_A = id; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + TRAINER_BATTLE_PARAM.opponentA = id; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); if (gSaveBlock2Ptr->frontier.curChallengeBattleNum + 1 < FRONTIER_STAGES_PER_CHALLENGE) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = TRAINER_BATTLE_PARAM.opponentA; } } } @@ -1355,6 +1355,7 @@ u8 GetFrontierTrainerFrontSpriteId(u16 trainerId) u8 GetFrontierOpponentClass(u16 trainerId) { u8 trainerClass = 0; + enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(trainerId); SetFacilityPtrsGetLevel(); #if FREE_BATTLE_TOWER_E_READER == FALSE @@ -1371,7 +1372,7 @@ u8 GetFrontierOpponentClass(u16 trainerId) } else if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) { - trainerClass = gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerClass; + trainerClass = gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerClass; } else if (trainerId < FRONTIER_TRAINERS_COUNT) { @@ -1441,6 +1442,7 @@ static u8 GetFrontierTrainerFacilityClass(u16 trainerId) void GetFrontierTrainerName(u8 *dst, u16 trainerId) { s32 i = 0; + enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(trainerId); SetFacilityPtrsGetLevel(); if (trainerId == TRAINER_EREADER) @@ -1457,8 +1459,8 @@ void GetFrontierTrainerName(u8 *dst, u16 trainerId) } else if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) { - for (i = 0; gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName[i] != EOS; i++) - dst[i] = gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName[i]; + for (i = 0; gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName[i] != EOS; i++) + dst[i] = gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName[i]; } else if (trainerId < FRONTIER_TRAINERS_COUNT) { @@ -1547,20 +1549,20 @@ static bool8 IsFrontierTrainerFemale(u16 trainerId) void FillFrontierTrainerParty(u8 monsCount) { ZeroEnemyPartyMons(); - FillTrainerParty(gTrainerBattleOpponent_A, 0, monsCount); + FillTrainerParty(TRAINER_BATTLE_PARAM.opponentA, 0, monsCount); } void FillFrontierTrainersParties(u8 monsCount) { ZeroEnemyPartyMons(); - FillTrainerParty(gTrainerBattleOpponent_A, 0, monsCount); - FillTrainerParty(gTrainerBattleOpponent_B, 3, monsCount); + FillTrainerParty(TRAINER_BATTLE_PARAM.opponentA, 0, monsCount); + FillTrainerParty(TRAINER_BATTLE_PARAM.opponentB, 3, monsCount); } static void FillTentTrainerParty(u8 monsCount) { ZeroEnemyPartyMons(); - FillTentTrainerParty_(gTrainerBattleOpponent_A, 0, monsCount); + FillTentTrainerParty_(TRAINER_BATTLE_PARAM.opponentA, 0, monsCount); } void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32 otID, u32 flags, struct Pokemon *dst) @@ -1590,7 +1592,7 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32 move = MOVE_FRUSTRATION; SetMonMoveSlot(dst, move, j); - if (gMovesInfo[move].effect == EFFECT_FRUSTRATION) + if (GetMoveEffect(move) == EFFECT_FRUSTRATION) friendship = 0; // Frustration is more powerful the lower the pokemon's friendship is. } @@ -1665,7 +1667,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) { // Normal battle frontier trainer. fixedIV = GetFrontierTrainerFixedIvs(trainerId); - monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet; + monSet = gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].monSet; } else if (trainerId == TRAINER_EREADER) { @@ -1758,39 +1760,6 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) } } -// Probably an early draft before the 'CreateApprenticeMon' was written. -static void UNUSED Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId) -{ - s32 i, j; - u8 friendship = MAX_FRIENDSHIP; - u8 level = 0; - u8 fixedIV = 0; - struct Apprentice *apprentice = &gSaveBlock2Ptr->apprentices[0]; - - if (apprentice->numQuestions < 5) - fixedIV = 6; - else - fixedIV = 9; - - if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50) - level = FRONTIER_MAX_LEVEL_OPEN; - else - level = FRONTIER_MAX_LEVEL_50; - - for (i = 0; i != FRONTIER_PARTY_SIZE; i++) - { - CreateMonWithEVSpread(&gEnemyParty[firstMonId + i], apprentice->party[i].species, level, fixedIV, 8); - friendship = MAX_FRIENDSHIP; - for (j = 0; j < MAX_MON_MOVES; j++) - { - if (gMovesInfo[apprentice->party[i].moves[j]].effect == EFFECT_FRUSTRATION) - friendship = 0; - } - SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship); - SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &apprentice->party[i].item); - } -} - u16 GetRandomFrontierMonFromSet(u16 trainerId) { u8 level = SetFacilityPtrsGetLevel(); @@ -1820,9 +1789,9 @@ static void FillFactoryTrainerParty(void) { ZeroEnemyPartyMons(); if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT) - FillFactoryFrontierTrainerParty(gTrainerBattleOpponent_A, 0); + FillFactoryFrontierTrainerParty(TRAINER_BATTLE_PARAM.opponentA, 0); else - FillFactoryTentTrainerParty(gTrainerBattleOpponent_A, 0); + FillFactoryTentTrainerParty(TRAINER_BATTLE_PARAM.opponentA, 0); } static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) @@ -1917,9 +1886,9 @@ static void GetOpponentIntroSpeech(void) SetFacilityPtrsGetLevel(); if (gSpecialVar_0x8005) - trainerId = gTrainerBattleOpponent_B; + trainerId = TRAINER_BATTLE_PARAM.opponentB; else - trainerId = gTrainerBattleOpponent_A; + trainerId = TRAINER_BATTLE_PARAM.opponentA; #if FREE_BATTLE_TOWER_E_READER == FALSE if (trainerId == TRAINER_EREADER) @@ -2042,7 +2011,7 @@ void DoSpecialTrainerBattle(void) for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock2Ptr->frontier.ereaderTrainer.party); i++) CreateBattleTowerMon(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i]); gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_EREADER_TRAINER; - gTrainerBattleOpponent_A = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; CreateTask(Task_StartBattleAfterTransition, 1); PlayMapChosenOrBattleBGM(0); BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_E_READER)); @@ -2052,7 +2021,7 @@ void DoSpecialTrainerBattle(void) gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOME; if (VarGet(VAR_FRONTIER_BATTLE_MODE) == FRONTIER_MODE_DOUBLES) gBattleTypeFlags |= BATTLE_TYPE_DOUBLE; - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) FillFrontierTrainerParty(DOME_BATTLE_PARTY_SIZE); CreateTask(Task_StartBattleAfterTransition, 1); CreateTask_PlayMapChosenOrBattleBGM(0); @@ -2117,7 +2086,7 @@ void DoSpecialTrainerBattle(void) } else if (gSpecialVar_0x8005 & MULTI_BATTLE_2_VS_1) // Player + AI against one trainer { - gTrainerBattleOpponent_B = 0xFFFF; + TRAINER_BATTLE_PARAM.opponentB = 0xFFFF; gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; } else // MULTI_BATTLE_2_VS_2 @@ -2638,10 +2607,10 @@ static void LoadLinkMultiOpponentsData(void) { ResetBlockReceivedFlags(); memcpy(&gSaveBlock2Ptr->frontier.trainerIds, gBlockRecvBuffer, sizeof(gSaveBlock2Ptr->frontier.trainerIds)); - gTrainerBattleOpponent_A = gSaveBlock2Ptr->frontier.trainerIds[battleNum * 2]; - gTrainerBattleOpponent_B = gSaveBlock2Ptr->frontier.trainerIds[battleNum * 2 + 1]; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_B, 1); + TRAINER_BATTLE_PARAM.opponentA = gSaveBlock2Ptr->frontier.trainerIds[battleNum * 2]; + TRAINER_BATTLE_PARAM.opponentB = gSaveBlock2Ptr->frontier.trainerIds[battleNum * 2 + 1]; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentB, 1); if (gReceivedRemoteLinkPlayers && gWirelessCommType == 0) gSpecialVar_Result = 4; else @@ -2683,10 +2652,10 @@ static void SetTowerInterviewData(void) if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_SINGLES) return; - GetFrontierTrainerName(text, gTrainerBattleOpponent_A); + GetFrontierTrainerName(text, TRAINER_BATTLE_PARAM.opponentA); StripExtCtrlCodes(text); StringCopy(gSaveBlock2Ptr->frontier.towerInterview.opponentName, text); - GetBattleTowerTrainerLanguage(&gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage, gTrainerBattleOpponent_A); + GetBattleTowerTrainerLanguage(&gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage, TRAINER_BATTLE_PARAM.opponentA); gSaveBlock2Ptr->frontier.towerInterview.opponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[1]], MON_DATA_SPECIES, NULL); gSaveBlock2Ptr->frontier.towerInterview.playerSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[0]], MON_DATA_SPECIES, NULL); for (i = 0; i < VANILLA_POKEMON_NAME_LENGTH + 1; i++) @@ -2998,6 +2967,7 @@ static void FillPartnerParty(u16 trainerId) u32 otID; u8 trainerName[(PLAYER_NAME_LENGTH * 3) + 1]; s32 ball = -1; + enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(trainerId); SetFacilityPtrsGetLevel(); if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) @@ -3005,10 +2975,10 @@ static void FillPartnerParty(u16 trainerId) for (i = 0; i < 3; i++) ZeroMonData(&gPlayerParty[i + 3]); - for (i = 0; i < 3 && i < gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].partySize; i++) + for (i = 0; i < 3 && i < gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].partySize; i++) { - const struct TrainerMon *partyData = gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].party; - const u8 *partnerName = gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName; + const struct TrainerMon *partyData = gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].party; + const u8 *partnerName = gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName; for (k = 0; partnerName[k] != EOS && k < 3; k++) { @@ -3079,9 +3049,9 @@ static void FillPartnerParty(u16 trainerId) } CalculateMonStats(&gPlayerParty[i + 3]); - StringCopy(trainerName, gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName); + StringCopy(trainerName, gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName); SetMonData(&gPlayerParty[i + 3], MON_DATA_OT_NAME, trainerName); - j = gBattlePartners[SanitizeTrainerId(trainerId - TRAINER_PARTNER(PARTNER_NONE))].encounterMusic_gender >> 7; + j = gBattlePartners[difficulty][SanitizeTrainerId(trainerId - TRAINER_PARTNER(PARTNER_NONE))].encounterMusic_gender >> 7; SetMonData(&gPlayerParty[i + 3], MON_DATA_OT_GENDER, &j); } } @@ -3448,10 +3418,10 @@ static void SetNextBattleTentOpponent(void) } } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum); - gTrainerBattleOpponent_A = trainerId; - SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); + TRAINER_BATTLE_PARAM.opponentA = trainerId; + SetBattleFacilityTrainerGfxId(TRAINER_BATTLE_PARAM.opponentA, 0); if (gSaveBlock2Ptr->frontier.curChallengeBattleNum + 1 < TENT_STAGES_PER_CHALLENGE) - gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A; + gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = TRAINER_BATTLE_PARAM.opponentA; } static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) @@ -3465,7 +3435,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) u32 otID = 0; u16 monId; - monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet; + monSet = gFacilityTrainers[TRAINER_BATTLE_PARAM.opponentA].monSet; bfMonCount = 0; monId = monSet[bfMonCount]; diff --git a/src/battle_transition.c b/src/battle_transition.c index fbaa5cc0de..b131769ba4 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -2260,7 +2260,7 @@ static bool8 Mugshot_SetGfx(struct Task *task) s16 i, j; u16 *tilemap, *tileset; const u16 *mugshotsMap = sMugshotsTilemap; - u8 mugshotColor = GetTrainerMugshotColorFromId(gTrainerBattleOpponent_A); + u8 mugshotColor = GetTrainerMugshotColorFromId(TRAINER_BATTLE_PARAM.opponentA); GetBg0TilesDst(&tilemap, &tileset); CpuSet(sEliteFour_Tileset, tileset, 0xF0); @@ -2519,20 +2519,20 @@ static void Mugshots_CreateTrainerPics(struct Task *task) { struct Sprite *opponentSprite, *playerSprite; - u8 trainerPicId = GetTrainerPicFromId(gTrainerBattleOpponent_A); + u8 trainerPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentA); s16 opponentRotationScales = 0; gReservedSpritePaletteCount = 10; task->tOpponentSpriteId = CreateTrainerSprite(trainerPicId, gTrainerSprites[trainerPicId].mugshotCoords.x - 32, gTrainerSprites[trainerPicId].mugshotCoords.y + 42, - 0, gDecompressionBuffer); + 0, NULL); gReservedSpritePaletteCount = 12; task->tPlayerSpriteId = CreateTrainerSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender), DISPLAY_WIDTH + 32, 106, - 0, gDecompressionBuffer); + 0, NULL); opponentSprite = &gSprites[task->tOpponentSpriteId]; playerSprite = &gSprites[task->tPlayerSpriteId]; diff --git a/src/battle_tv.c b/src/battle_tv.c index a269634cf7..bdf3359b84 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -774,7 +774,7 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc tvPtr->side[atkSide].wishMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide].wishMoveSlot = moveSlot; } - if (gMovesInfo[move].effect == EFFECT_EXPLOSION) + if (GetMoveEffect(move) == EFFECT_EXPLOSION) { tvPtr->side[atkSide ^ BIT_SIDE].explosionMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide ^ BIT_SIDE].explosionMoveSlot = moveSlot; @@ -782,10 +782,11 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc tvPtr->side[atkSide ^ BIT_SIDE].explosion = TRUE; } - AddMovePoints(PTS_REFLECT, move, gMovesInfo[move].power, 0); - AddMovePoints(PTS_LIGHT_SCREEN, move, gMovesInfo[move].power, 0); - AddMovePoints(PTS_WATER_SPORT, move, 0, 0); - AddMovePoints(PTS_MUD_SPORT, move, 0, 0); + u32 movePower = GetMovePower(move); + AddMovePoints(PTS_REFLECT, move, movePower, 0); + AddMovePoints(PTS_LIGHT_SCREEN, move, movePower, 0); + AddMovePoints(PTS_WATER_SPORT, move, 0, 0); + AddMovePoints(PTS_MUD_SPORT, move, 0, 0); } void BattleTv_SetDataBasedOnAnimation(u8 animationId) @@ -928,12 +929,12 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) { case PTS_MOVE_EFFECT: // arg1 -> move slot, arg2 -> move { - u8 baseFromEffect = gBattleMoveEffects[gMovesInfo[arg2].effect].battleTvScore; + u8 baseFromEffect = gBattleMoveEffects[GetMoveEffect(arg2)].battleTvScore; // Various cases to add/remove points - if (gMovesInfo[arg2].recoil > 0) + if (GetMoveRecoil(arg2) > 0) baseFromEffect++; // Recoil moves - if (gMovesInfo[arg2].effect == EFFECT_RAPID_SPIN) + if (GetMoveEffect(arg2) == EFFECT_RAPID_SPIN) baseFromEffect++; if (MoveHasAdditionalEffect(arg2, MOVE_EFFECT_SP_ATK_MINUS_2) || MoveHasAdditionalEffect(arg2, MOVE_EFFECT_ATK_DEF_DOWN)) baseFromEffect += 2; // Overheat, Superpower, etc. @@ -1006,7 +1007,7 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) #define power arg2 case PTS_WATER_SPORT: // If used fire move during Water Sport - if (tvPtr->pos[defSide][0].waterSportMonId != -(tvPtr->pos[defSide][1].waterSportMonId) && gMovesInfo[move].type == TYPE_FIRE) + if (tvPtr->pos[defSide][0].waterSportMonId != -(tvPtr->pos[defSide][1].waterSportMonId) && GetMoveType(move) == TYPE_FIRE) { if (tvPtr->pos[defSide][0].waterSportMonId != 0) { @@ -1022,7 +1023,7 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) break; case PTS_MUD_SPORT: // If used Electric move during Mud Sport - if (tvPtr->pos[defSide][0].mudSportMonId != -(tvPtr->pos[defSide][1].mudSportMonId) && gMovesInfo[move].type == TYPE_ELECTRIC) + if (tvPtr->pos[defSide][0].mudSportMonId != -(tvPtr->pos[defSide][1].mudSportMonId) && GetMoveType(move) == TYPE_ELECTRIC) { if (tvPtr->pos[defSide][0].mudSportMonId != 0) { @@ -1038,7 +1039,7 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) break; case PTS_REFLECT: // If hit Reflect with damaging physical move - if (IS_MOVE_PHYSICAL(move) && power != 0 && tvPtr->side[defSide].reflectMonId != 0) + if (IsBattleMovePhysical(move) && power != 0 && tvPtr->side[defSide].reflectMonId != 0) { u32 id = (tvPtr->side[defSide].reflectMonId - 1) * 4; movePoints->points[defSide][id + tvPtr->side[defSide].reflectMoveSlot] += sPointsArray[caseId][0]; @@ -1046,7 +1047,7 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) break; case PTS_LIGHT_SCREEN: // If hit Light Screen with damaging special move - if (IS_MOVE_SPECIAL(move) && power != 0 && tvPtr->side[defSide].lightScreenMonId != 0) + if (IsBattleMoveSpecial(move) && power != 0 && tvPtr->side[defSide].lightScreenMonId != 0) { u32 id = (tvPtr->side[defSide].lightScreenMonId - 1) * 4; movePoints->points[defSide][id + tvPtr->side[defSide].lightScreenMoveSlot] += sPointsArray[caseId][0]; @@ -1227,7 +1228,7 @@ static void TrySetBattleSeminarShow(void) return; else if (gBattleTypeFlags & (BATTLE_TYPE_PALACE | BATTLE_TYPE_PIKE | BATTLE_TYPE_PYRAMID)) return; - else if (IS_MOVE_STATUS(gBattleMons[gBattlerAttacker].moves[gMoveSelectionCursor[gBattlerAttacker]])) + else if (IsBattleMoveStatus(gBattleMons[gBattlerAttacker].moves[gMoveSelectionCursor[gBattlerAttacker]])) return; i = 0; @@ -1242,7 +1243,7 @@ static void TrySetBattleSeminarShow(void) if (sVariableDmgMoves[i] != TABLE_END) return; - dmgByMove[gMoveSelectionCursor[gBattlerAttacker]] = gBattleMoveDamage; + dmgByMove[gMoveSelectionCursor[gBattlerAttacker]] = gBattleStruct->moveDamage[gBattlerTarget]; // TODO: Not sure currMoveSaved = gCurrentMove; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -1254,13 +1255,13 @@ static void TrySetBattleSeminarShow(void) damageCalcData.battlerAtk = gBattlerAttacker; damageCalcData.battlerDef = gBattlerTarget; damageCalcData.move = gCurrentMove; - damageCalcData.moveType = gMovesInfo[gCurrentMove].type; + damageCalcData.moveType = GetMoveType(gCurrentMove); damageCalcData.isCrit = FALSE; damageCalcData.randomFactor = FALSE; damageCalcData.updateFlags = FALSE; - gBattleMoveDamage = CalculateMoveDamage(&damageCalcData, powerOverride); - dmgByMove[i] = gBattleMoveDamage; - if (dmgByMove[i] == 0 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + gBattleStruct->moveDamage[gBattlerTarget] = CalculateMoveDamage(&damageCalcData, powerOverride); + dmgByMove[i] = gBattleStruct->moveDamage[gBattlerTarget]; + if (dmgByMove[i] == 0 && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) dmgByMove[i] = 1; } } @@ -1290,13 +1291,13 @@ static void TrySetBattleSeminarShow(void) } } - gBattleMoveDamage = dmgByMove[gMoveSelectionCursor[gBattlerAttacker]]; + gBattleStruct->moveDamage[gBattlerTarget] = dmgByMove[gMoveSelectionCursor[gBattlerAttacker]]; gCurrentMove = currMoveSaved; } static bool8 ShouldCalculateDamage(u16 moveId, s32 *dmg, u16 *powerOverride) { - if (IS_MOVE_STATUS(moveId)) + if (IsBattleMoveStatus(moveId)) { *dmg = 0; return FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index dd53e73d47..04f641ddac 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -25,6 +25,7 @@ #include "task.h" #include "test_runner.h" #include "trig.h" +#include "trainer_slide.h" #include "window.h" #include "battle_message.h" #include "battle_ai_main.h" @@ -57,6 +58,7 @@ match the ROM; this is also why sSoundMovesTable's declaration is in the middle functions instead of at the top of the file with the other declarations. */ +typedef void (*MoveSuccessOrderCancellers)(u32 *effect); static bool32 TryRemoveScreens(u32 battler); static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler); static u32 GetFlingPowerFromItemId(u32 itemId); @@ -64,6 +66,9 @@ static void SetRandomMultiHitCounter(); static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item); static bool32 CanBeInfinitelyConfused(u32 battler); +ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12(u32 percent); +ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12_Floored(u32 percent); + extern const u8 *const gBattlescriptsForRunningByItem[]; extern const u8 *const gBattlescriptsForUsingItem[]; extern const u8 *const gBattlescriptsForSafariActions[]; @@ -94,10 +99,113 @@ static const u8 sPkblToEscapeFactor[][3] = { static const u8 sGoNearCounterToCatchFactor[] = {4, 3, 2, 1}; static const u8 sGoNearCounterToEscapeFactor[] = {4, 4, 4, 4}; -static u8 CalcBeatUpPower(void) + +struct BattleWeatherInfo { - u8 basePower; - u16 species; + u16 flag; + u8 rock; + u8 endMessage; + u8 continuesMessage; + u8 animation; +}; + +static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = +{ + [BATTLE_WEATHER_RAIN] = + { + .flag = B_WEATHER_RAIN_NORMAL, + .rock = HOLD_EFFECT_DAMP_ROCK, + .endMessage = B_MSG_WEATHER_END_RAIN, + .continuesMessage = B_MSG_WEATHER_TURN_RAIN, + .animation = B_ANIM_RAIN_CONTINUES, + }, + + [BATTLE_WEATHER_RAIN_PRIMAL] = + { + .flag = B_WEATHER_RAIN_PRIMAL, + .rock = HOLD_EFFECT_DAMP_ROCK, + .endMessage = B_MSG_WEATHER_END_RAIN, + .continuesMessage = B_MSG_WEATHER_TURN_RAIN, + .animation = B_ANIM_RAIN_CONTINUES, + }, + + [BATTLE_WEATHER_RAIN_DOWNPOUR] = + { + .flag = B_WEATHER_RAIN_NORMAL, + .rock = HOLD_EFFECT_DAMP_ROCK, + .endMessage = B_MSG_WEATHER_END_RAIN, + .continuesMessage = B_MSG_WEATHER_TURN_DOWNPOUR, + .animation = B_ANIM_RAIN_CONTINUES, + }, + + [BATTLE_WEATHER_SUN] = + { + .flag = B_WEATHER_SUN_NORMAL, + .rock = HOLD_EFFECT_HEAT_ROCK, + .endMessage = B_MSG_WEATHER_END_SUN, + .continuesMessage = B_MSG_WEATHER_TURN_SUN, + .animation = B_ANIM_SUN_CONTINUES, + }, + + [BATTLE_WEATHER_SUN_PRIMAL] = + { + .flag = B_WEATHER_SUN_PRIMAL, + .rock = HOLD_EFFECT_HEAT_ROCK, + .endMessage = B_MSG_WEATHER_END_SUN, + .continuesMessage = B_MSG_WEATHER_TURN_SUN, + .animation = B_ANIM_SUN_CONTINUES, + }, + + [BATTLE_WEATHER_SANDSTORM] = + { + .flag = B_WEATHER_SANDSTORM, + .rock = HOLD_EFFECT_SMOOTH_ROCK, + .endMessage = B_MSG_WEATHER_END_SANDSTORM, + .continuesMessage = B_MSG_WEATHER_TURN_SANDSTORM, + .animation = B_ANIM_SANDSTORM_CONTINUES, + }, + + [BATTLE_WEATHER_HAIL] = + { + .flag = B_WEATHER_HAIL, + .rock = HOLD_EFFECT_ICY_ROCK, + .endMessage = B_MSG_WEATHER_END_HAIL, + .continuesMessage = B_MSG_WEATHER_TURN_HAIL, + .animation = B_ANIM_HAIL_CONTINUES, + }, + + [BATTLE_WEATHER_SNOW] = + { + .flag = B_WEATHER_SNOW, + .rock = HOLD_EFFECT_ICY_ROCK, + .endMessage = B_MSG_WEATHER_END_SNOW, + .continuesMessage = B_MSG_WEATHER_TURN_SNOW, + .animation = B_ANIM_SNOW_CONTINUES, + }, + + [BATTLE_WEATHER_FOG] = + { + .flag = B_WEATHER_FOG, + .rock = HOLD_EFFECT_NONE, + .endMessage = B_MSG_WEATHER_END_FOG, + .continuesMessage = B_MSG_WEATHER_TURN_FOG, + .animation = B_ANIM_FOG_CONTINUES, + }, + + [BATTLE_WEATHER_STRONG_WINDS] = + { + .flag = B_WEATHER_STRONG_WINDS, + .rock = HOLD_EFFECT_NONE, + .endMessage = B_MSG_WEATHER_END_STRONG_WINDS, + .continuesMessage = B_MSG_WEATHER_TURN_STRONG_WINDS, + .animation = B_ANIM_STRONG_WINDS, + }, +}; + +static u32 CalcBeatUpPower(void) +{ + u32 basePower; + u32 species; struct Pokemon *party = GetBattlerParty(gBattlerAttacker); // Party slot is incremented by the battle script for Beat Up after this damage calculation @@ -107,17 +215,32 @@ static u8 CalcBeatUpPower(void) return basePower; } +static bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef, u32 abilityDef) +{ + if (!gSpecialStatuses[battlerDef].distortedTypeMatchups + && gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL + && gBattleMons[battlerDef].hp == gBattleMons[battlerDef].maxHP + && !IsBattleMoveStatus(move) + && abilityDef == ABILITY_TERA_SHELL) + return TRUE; + + return FALSE; +} + bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) { u32 ability = GetBattlerAbility(battlerAtk); + u32 effect = GetMoveEffect(move); if (gSideTimers[defSide].followmeTimer == 0 || !IsBattlerAlive(gSideTimers[defSide].followmeTarget) - || gMovesInfo[move].effect == EFFECT_SNIPE_SHOT - || gMovesInfo[move].effect == EFFECT_SKY_DROP + || effect == EFFECT_SNIPE_SHOT || effect == EFFECT_SKY_DROP || ability == ABILITY_PROPELLER_TAIL || ability == ABILITY_STALWART) return FALSE; + if (effect == EFFECT_PURSUIT && IsPursuitTargetSet()) + return FALSE; + if (gSideTimers[defSide].followmePowder && !IsAffectedByPowder(battlerAtk, ability, GetBattlerHoldEffect(battlerAtk, TRUE))) return FALSE; @@ -128,7 +251,8 @@ bool32 HandleMoveTargetRedirection(void) { u32 redirectorOrderNum = MAX_BATTLERS_COUNT; u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - u32 moveType = GetMoveType(gCurrentMove); + u32 moveType = GetBattleMoveType(gCurrentMove); + u32 moveEffect = GetMoveEffect(gCurrentMove); u32 side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); u32 ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]); @@ -141,7 +265,7 @@ bool32 HandleMoveTargetRedirection(void) } else if (IsDoubleBattle() && gSideTimers[side].followmeTimer == 0 - && (!IS_MOVE_STATUS(gCurrentMove) || (moveTarget != MOVE_TARGET_USER && moveTarget != MOVE_TARGET_ALL_BATTLERS)) + && (!IsBattleMoveStatus(gCurrentMove) || (moveTarget != MOVE_TARGET_USER && moveTarget != MOVE_TARGET_ALL_BATTLERS)) && ((ability != ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) || (ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER))) { @@ -156,8 +280,8 @@ bool32 HandleMoveTargetRedirection(void) && ((ability == ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) || (ability == ABILITY_STORM_DRAIN && moveType == TYPE_WATER)) && GetBattlerTurnOrderNum(battler) < redirectorOrderNum - && gMovesInfo[gCurrentMove].effect != EFFECT_SNIPE_SHOT - && gMovesInfo[gCurrentMove].effect != EFFECT_PLEDGE + && moveEffect != EFFECT_SNIPE_SHOT + && moveEffect != EFFECT_PLEDGE && GetBattlerAbility(gBattlerAttacker) != ABILITY_PROPELLER_TAIL && GetBattlerAbility(gBattlerAttacker) != ABILITY_STALWART) { @@ -188,22 +312,21 @@ void HandleAction_UseMove(void) u32 i; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; - if (gBattleStruct->absentBattlerFlags & (1u << gBattlerAttacker) - || gBattleStruct->commandingDondozo & (1u << gBattlerAttacker) + if (gBattleStruct->battlerState[gBattlerAttacker].absentBattlerFlags + || gBattleStruct->battlerState[gBattlerAttacker].commandingDondozo || !IsBattlerAlive(gBattlerAttacker)) { gCurrentActionFuncId = B_ACTION_FINISHED; return; } - gIsCriticalHit = FALSE; gBattleStruct->atkCancellerTracker = 0; - gMoveResultFlags = 0; + ClearDamageCalcResults(); gMultiHitCounter = 0; gBattleScripting.savedDmg = 0; gBattleCommunication[MISS_TYPE] = 0; gBattleScripting.savedMoveEffect = 0; - gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker); + gCurrMovePos = gChosenMovePos = gBattleStruct->chosenMovePositions[gBattlerAttacker]; // choose move if (gProtectStructs[gBattlerAttacker].noValidMoves) @@ -211,7 +334,7 @@ void HandleAction_UseMove(void) gProtectStructs[gBattlerAttacker].noValidMoves = FALSE; gCurrentMove = gChosenMove = MOVE_STRUGGLE; gHitMarker |= HITMARKER_NO_PPDEDUCT; - *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE); + gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE); } else if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) { @@ -223,7 +346,7 @@ void HandleAction_UseMove(void) { gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove; gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos; - *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } // check if the encored move wasn't overwritten else if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE @@ -234,12 +357,12 @@ void HandleAction_UseMove(void) gDisableStructs[gBattlerAttacker].encoredMove = MOVE_NONE; gDisableStructs[gBattlerAttacker].encoredMovePos = 0; gDisableStructs[gBattlerAttacker].encoreTimer = 0; - *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } else if (gBattleMons[gBattlerAttacker].moves[gCurrMovePos] != gChosenMoveByBattler[gBattlerAttacker]) { gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; - *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); } else { @@ -258,15 +381,15 @@ void HandleAction_UseMove(void) SetTypeBeforeUsingMove(gChosenMove, gBattlerAttacker); // check Z-Move used - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IS_MOVE_STATUS(gCurrentMove) && !IsZMove(gCurrentMove)) + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(gCurrentMove) && !IsZMove(gCurrentMove)) { - gBattleStruct->categoryOverride = gMovesInfo[gCurrentMove].category; + gBattleStruct->categoryOverride = GetMoveCategory(gCurrentMove); gCurrentMove = gChosenMove = GetUsableZMove(gBattlerAttacker, gCurrentMove); } // check Max Move used else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) { - gBattleStruct->categoryOverride = gMovesInfo[gCurrentMove].category; + gBattleStruct->categoryOverride = GetMoveCategory(gCurrentMove); gCurrentMove = gChosenMove = GetMaxMove(gBattlerAttacker, gCurrentMove); } @@ -279,7 +402,7 @@ void HandleAction_UseMove(void) if (gAbsentBattlerFlags & (1u << gBattlerTarget) && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); + gBattlerTarget = GetPartnerBattler(gBattlerTarget); } } else if (moveTarget == MOVE_TARGET_ALLY) @@ -332,14 +455,14 @@ void HandleAction_UseMove(void) } } - if ((GetBattlerSide(gBattlerAttacker) == GetBattlerSide(gBattlerTarget)) + if ((IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) && (!IsBattlerAlive(gBattlerTarget) || gProtectStructs[BATTLE_PARTNER(gBattlerAttacker)].usedAllySwitch)) { gBattlescriptCurrInstr = BattleScript_FailedFromAtkCanceler; } else { - gBattlescriptCurrInstr = GET_MOVE_BATTLESCRIPT(gCurrentMove); + gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove); } if (gBattleTypeFlags & BATTLE_TYPE_ARENA) @@ -362,7 +485,7 @@ void HandleAction_Switch(void) gActionSelectionCursor[gBattlerAttacker] = 0; gMoveSelectionCursor[gBattlerAttacker] = 0; - PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, *(gBattleStruct->battlerPartyIndexes + gBattlerAttacker)) + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleStruct->battlerPartyIndexes[gBattlerAttacker]); gBattleScripting.battler = gBattlerAttacker; gBattlescriptCurrInstr = BattleScript_ActionSwitch; @@ -664,7 +787,7 @@ void HandleAction_ActionFinished(void) { u32 i, j, moveType; bool32 afterYouActive = gSpecialStatuses[gBattlerByTurnOrder[gCurrentTurnActionNumber + 1]].afterYou; - *(gBattleStruct->monToSwitchIntoId + gBattlerByTurnOrder[gCurrentTurnActionNumber]) = gSelectedMonPartyId = PARTY_SIZE; + gBattleStruct->monToSwitchIntoId[gBattlerByTurnOrder[gCurrentTurnActionNumber]] = gSelectedMonPartyId = PARTY_SIZE; gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; SpecialStatusesClear(); @@ -674,19 +797,17 @@ void HandleAction_ActionFinished(void) | HITMARKER_CHARGING | HITMARKER_NEVER_SET | HITMARKER_IGNORE_DISGUISE); // check if Stellar type boost should be used up - moveType = GetMoveType(gCurrentMove); + moveType = GetBattleMoveType(gCurrentMove); if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA && GetBattlerTeraType(gBattlerAttacker) == TYPE_STELLAR - && gMovesInfo[gCurrentMove].category != DAMAGE_CATEGORY_STATUS + && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS && IsTypeStellarBoosted(gBattlerAttacker, moveType)) { ExpendTypeStellarBoost(gBattlerAttacker, moveType); } - + ClearDamageCalcResults(); gCurrentMove = 0; - gBattleMoveDamage = 0; - gMoveResultFlags = 0; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; gBattleStruct->dynamicMoveType = 0; @@ -696,7 +817,7 @@ void HandleAction_ActionFinished(void) gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; - if (B_RECALC_TURN_AFTER_ACTIONS >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove) + if (B_RECALC_TURN_AFTER_ACTIONS >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove && !IsPursuitTargetSet()) { // i starts at `gCurrentTurnActionNumber` because we don't want to recalculate turn order for mon that have already // taken action. It's been previously increased, which we want in order to not recalculate the turn of the mon that just finished its action @@ -750,113 +871,18 @@ static const u8 sHoldEffectToType[][2] = {HOLD_EFFECT_FAIRY_POWER, TYPE_FAIRY}, }; -// percent in UQ_4_12 format -static const uq4_12_t sPercentToModifier[] = -{ - UQ_4_12(0.00), // 0 - UQ_4_12(0.01), // 1 - UQ_4_12(0.02), // 2 - UQ_4_12(0.03), // 3 - UQ_4_12(0.04), // 4 - UQ_4_12(0.05), // 5 - UQ_4_12(0.06), // 6 - UQ_4_12(0.07), // 7 - UQ_4_12(0.08), // 8 - UQ_4_12(0.09), // 9 - UQ_4_12(0.10), // 10 - UQ_4_12(0.11), // 11 - UQ_4_12(0.12), // 12 - UQ_4_12(0.13), // 13 - UQ_4_12(0.14), // 14 - UQ_4_12(0.15), // 15 - UQ_4_12(0.16), // 16 - UQ_4_12(0.17), // 17 - UQ_4_12(0.18), // 18 - UQ_4_12(0.19), // 19 - UQ_4_12(0.20), // 20 - UQ_4_12(0.21), // 21 - UQ_4_12(0.22), // 22 - UQ_4_12(0.23), // 23 - UQ_4_12(0.24), // 24 - UQ_4_12(0.25), // 25 - UQ_4_12(0.26), // 26 - UQ_4_12(0.27), // 27 - UQ_4_12(0.28), // 28 - UQ_4_12(0.29), // 29 - UQ_4_12(0.30), // 30 - UQ_4_12(0.31), // 31 - UQ_4_12(0.32), // 32 - UQ_4_12(0.33), // 33 - UQ_4_12(0.34), // 34 - UQ_4_12(0.35), // 35 - UQ_4_12(0.36), // 36 - UQ_4_12(0.37), // 37 - UQ_4_12(0.38), // 38 - UQ_4_12(0.39), // 39 - UQ_4_12(0.40), // 40 - UQ_4_12(0.41), // 41 - UQ_4_12(0.42), // 42 - UQ_4_12(0.43), // 43 - UQ_4_12(0.44), // 44 - UQ_4_12(0.45), // 45 - UQ_4_12(0.46), // 46 - UQ_4_12(0.47), // 47 - UQ_4_12(0.48), // 48 - UQ_4_12(0.49), // 49 - UQ_4_12(0.50), // 50 - UQ_4_12(0.51), // 51 - UQ_4_12(0.52), // 52 - UQ_4_12(0.53), // 53 - UQ_4_12(0.54), // 54 - UQ_4_12(0.55), // 55 - UQ_4_12(0.56), // 56 - UQ_4_12(0.57), // 57 - UQ_4_12(0.58), // 58 - UQ_4_12(0.59), // 59 - UQ_4_12(0.60), // 60 - UQ_4_12(0.61), // 61 - UQ_4_12(0.62), // 62 - UQ_4_12(0.63), // 63 - UQ_4_12(0.64), // 64 - UQ_4_12(0.65), // 65 - UQ_4_12(0.66), // 66 - UQ_4_12(0.67), // 67 - UQ_4_12(0.68), // 68 - UQ_4_12(0.69), // 69 - UQ_4_12(0.70), // 70 - UQ_4_12(0.71), // 71 - UQ_4_12(0.72), // 72 - UQ_4_12(0.73), // 73 - UQ_4_12(0.74), // 74 - UQ_4_12(0.75), // 75 - UQ_4_12(0.76), // 76 - UQ_4_12(0.77), // 77 - UQ_4_12(0.78), // 78 - UQ_4_12(0.79), // 79 - UQ_4_12(0.80), // 80 - UQ_4_12(0.81), // 81 - UQ_4_12(0.82), // 82 - UQ_4_12(0.83), // 83 - UQ_4_12(0.84), // 84 - UQ_4_12(0.85), // 85 - UQ_4_12(0.86), // 86 - UQ_4_12(0.87), // 87 - UQ_4_12(0.88), // 88 - UQ_4_12(0.89), // 89 - UQ_4_12(0.90), // 90 - UQ_4_12(0.91), // 91 - UQ_4_12(0.92), // 92 - UQ_4_12(0.93), // 93 - UQ_4_12(0.94), // 94 - UQ_4_12(0.95), // 95 - UQ_4_12(0.96), // 96 - UQ_4_12(0.97), // 97 - UQ_4_12(0.98), // 98 - UQ_4_12(0.99), // 99 - UQ_4_12(1.00), // 100 -}; - // code + +ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12(u32 percent) +{ + return (4096 * percent + 50) / 100; +} + +ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12_Floored(u32 percent) +{ + return (4096 * percent) / 100; +} + u8 GetBattlerForBattleScript(u8 caseId) { u8 ret = 0; @@ -1105,11 +1131,8 @@ void PrepareStringBattle(u16 stringId, u32 battler) SET_STATCHANGER(STAT_SPEED, 1, FALSE); } - // Signal for the trainer slide-in system. - if ((stringId == STRINGID_ITDOESNTAFFECT || stringId == STRINGID_PKMNWASNTAFFECTED || stringId == STRINGID_PKMNUNAFFECTED) - && GetBattlerSide(gBattlerTarget) == B_SIDE_OPPONENT - && gBattleStruct->trainerSlidePlayerMonUnaffectedMsgState != 2) - gBattleStruct->trainerSlidePlayerMonUnaffectedMsgState = 1; + if ((stringId == STRINGID_ITDOESNTAFFECT || stringId == STRINGID_PKMNWASNTAFFECTED || stringId == STRINGID_PKMNUNAFFECTED)) + TryInitializeTrainerSlideEnemyMonUnaffected(gBattlerTarget); BtlController_EmitPrintString(battler, BUFFER_A, stringId); MarkBattlerForControllerExec(battler); @@ -1184,7 +1207,7 @@ static bool32 IsGravityPreventingMove(u32 move) if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) return FALSE; - return gMovesInfo[move].gravityBanned; + return IsMoveGravityBanned(move); } bool32 IsHealBlockPreventingMove(u32 battler, u32 move) @@ -1192,12 +1215,12 @@ bool32 IsHealBlockPreventingMove(u32 battler, u32 move) if (!(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) return FALSE; - return gMovesInfo[move].healingMove; + return IsHealingMove(move); } bool32 IsBelchPreventingMove(u32 battler, u32 move) { - if (gMovesInfo[move].effect != EFFECT_BELCH) + if (GetMoveEffect(move) != EFFECT_BELCH) return FALSE; return !(gBattleStruct->ateBerry[battler & BIT_SIDE] & (1u << gBattlerPartyIndexes[battler])); @@ -1213,6 +1236,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u32 move = gBattleMons[battler].moves[moveId]; u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; + u32 moveEffect = GetMoveEffect(move); if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].disabledMove == move && move != MOVE_NONE) { @@ -1245,7 +1269,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].tauntTimer != 0 && IS_MOVE_STATUS(move)) + if (GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].tauntTimer != 0 && IsBattleMoveStatus(move)) { if ((GetActiveGimmick(battler) == GIMMICK_DYNAMAX)) gCurrentMove = MOVE_MAX_GUARD; @@ -1263,7 +1287,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer != 0 && gMovesInfo[move].soundMove) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer != 0 && IsSoundMove(move)) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1338,7 +1362,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && gMovesInfo[move].effect == EFFECT_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[battler].item) != POCKET_BERRIES) + if (DYNAMAX_BYPASS_CHECK && moveEffect == EFFECT_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[battler].item) != POCKET_BERRIES) { gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1353,7 +1377,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (gMovesInfo[move].cantUseTwice && move == gLastResultingMoves[battler]) + if (MoveCantBeUsedTwice(move) && move == gLastResultingMoves[battler]) { gCurrentMove = move; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gCurrentMove); @@ -1385,7 +1409,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) limitations++; } } - else if (holdEffect == HOLD_EFFECT_ASSAULT_VEST && IS_MOVE_STATUS(move) && gMovesInfo[move].effect != EFFECT_ME_FIRST) + else if (holdEffect == HOLD_EFFECT_ASSAULT_VEST && IsBattleMoveStatus(move) && moveEffect != EFFECT_ME_FIRST) { if ((GetActiveGimmick(battler) == GIMMICK_DYNAMAX)) gCurrentMove = MOVE_MAX_GUARD; @@ -1433,7 +1457,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (gMovesInfo[move].effect == EFFECT_PLACEHOLDER) + if (moveEffect == EFFECT_PLACEHOLDER) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { @@ -1462,7 +1486,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) for (i = 0; i < MAX_MON_MOVES; i++) { move = gBattleMons[battler].moves[i]; - moveEffect = gMovesInfo[move].effect; + moveEffect = GetMoveEffect(move); // No move if (check & MOVE_LIMITATION_ZEROMOVE && move == MOVE_NONE) unusableMoves |= 1u << i; @@ -1479,7 +1503,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_TORMENTED && move == gLastMoves[battler] && gBattleMons[battler].status2 & STATUS2_TORMENT) unusableMoves |= 1u << i; // Taunt - else if (check & MOVE_LIMITATION_TAUNT && gDisableStructs[battler].tauntTimer && IS_MOVE_STATUS(move)) + else if (check & MOVE_LIMITATION_TAUNT && gDisableStructs[battler].tauntTimer && IsBattleMoveStatus(move)) unusableMoves |= 1u << i; // Imprison else if (check & MOVE_LIMITATION_IMPRISON && GetImprisonedMovesCount(battler, move)) @@ -1491,7 +1515,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_CHOICE_ITEM && HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) unusableMoves |= 1u << i; // Assault Vest - else if (check & MOVE_LIMITATION_ASSAULT_VEST && holdEffect == HOLD_EFFECT_ASSAULT_VEST && IS_MOVE_STATUS(move) && gMovesInfo[move].effect != EFFECT_ME_FIRST) + else if (check & MOVE_LIMITATION_ASSAULT_VEST && holdEffect == HOLD_EFFECT_ASSAULT_VEST && IsBattleMoveStatus(move) && moveEffect != EFFECT_ME_FIRST) unusableMoves |= 1u << i; // Gravity else if (check & MOVE_LIMITATION_GRAVITY && IsGravityPreventingMove(move)) @@ -1503,7 +1527,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_BELCH && IsBelchPreventingMove(battler, move)) unusableMoves |= 1u << i; // Throat Chop - else if (check & MOVE_LIMITATION_THROAT_CHOP && gDisableStructs[battler].throatChopTimer && gMovesInfo[move].soundMove) + else if (check & MOVE_LIMITATION_THROAT_CHOP && gDisableStructs[battler].throatChopTimer && IsSoundMove(move)) unusableMoves |= 1u << i; // Stuff Cheeks else if (check & MOVE_LIMITATION_STUFF_CHEEKS && moveEffect == EFFECT_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[battler].item) != POCKET_BERRIES) @@ -1512,7 +1536,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_CHOICE_ITEM && GetBattlerAbility(battler) == ABILITY_GORILLA_TACTICS && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) unusableMoves |= 1u << i; // Can't Use Twice flag - else if (check & MOVE_LIMITATION_CANT_USE_TWICE && gMovesInfo[move].cantUseTwice && move == gLastResultingMoves[battler]) + else if (check & MOVE_LIMITATION_CANT_USE_TWICE && MoveCantBeUsedTwice(move) && move == gLastResultingMoves[battler]) unusableMoves |= 1u << i; } return unusableMoves; @@ -1602,12 +1626,7 @@ enum ENDTURN_SAFEGUARD, ENDTURN_TAILWIND, ENDTURN_WISH, - ENDTURN_RAIN, - ENDTURN_SANDSTORM, - ENDTURN_SUN, - ENDTURN_HAIL, - ENDTURN_SNOW, - ENDTURN_FOG, + ENDTURN_WEATHER, ENDTURN_DAMAGE_NON_TYPES, ENDTURN_GRAVITY, ENDTURN_WATER_SPORT, @@ -1634,7 +1653,7 @@ static bool32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId) { if (terrainFlag & STATUS_FIELD_GRASSY_TERRAIN) BattleScriptExecute(BattleScript_GrassyTerrainHeals); - if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.terrainTimer == 0) + if (gFieldTimers.terrainTimer == gBattleTurnCounter) { gFieldStatuses &= ~terrainFlag; TryToRevertMimicryAndFlags(); @@ -1649,6 +1668,44 @@ static bool32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId) return FALSE; } +static bool32 TryEndTurnWeather(void) +{ + u32 i = 0; + u32 effect = 0; + u32 currBattleWeather = 0xFF; + + for (i = 0; i < ARRAY_COUNT(sBattleWeatherInfo); i++) + { + if (gBattleWeather & sBattleWeatherInfo[i].flag) + { + currBattleWeather = i; + break; + } + } + + if (currBattleWeather == 0xFF) + return effect; + + if (gWishFutureKnock.weatherDuration > 0 && --gWishFutureKnock.weatherDuration == 0) + { + gBattleWeather = B_WEATHER_NONE; + for (i = 0; i < gBattlersCount; i++) + gDisableStructs[i].weatherAbilityDone = FALSE; + gBattleCommunication[MULTISTRING_CHOOSER] = sBattleWeatherInfo[currBattleWeather].endMessage; + BattleScriptExecute(BattleScript_WeatherFaded); + effect++; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = sBattleWeatherInfo[currBattleWeather].continuesMessage; + gBattleScripting.animArg1 = sBattleWeatherInfo[currBattleWeather].animation; + BattleScriptExecute(BattleScript_WeatherContinues); + effect++; + } + + return effect; +} + u8 DoFieldEndTurnEffects(void) { u8 effect = 0; @@ -1678,7 +1735,7 @@ u8 DoFieldEndTurnEffects(void) SwapTurnOrder(i, j); } } - + gBattleTurnCounter++; gBattleStruct->turnCountersTracker++; gBattleStruct->turnSideTracker = 0; // fall through @@ -1689,7 +1746,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].reflectBattlerId; if (gSideStatuses[side] & SIDE_STATUS_REFLECT) { - if (--gSideTimers[side].reflectTimer == 0) + if (gSideTimers[side].reflectTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_REFLECT; BattleScriptExecute(BattleScript_SideStatusWoreOff); @@ -1714,7 +1771,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].lightscreenBattlerId; if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN) { - if (--gSideTimers[side].lightscreenTimer == 0) + if (gSideTimers[side].lightscreenTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN; BattleScriptExecute(BattleScript_SideStatusWoreOff); @@ -1740,7 +1797,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].auroraVeilBattlerId; if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL) { - if (--gSideTimers[side].auroraVeilTimer == 0) + if (gSideTimers[side].auroraVeilTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_AURORA_VEIL; BattleScriptExecute(BattleScript_SideStatusWoreOff); @@ -1764,7 +1821,7 @@ u8 DoFieldEndTurnEffects(void) { side = gBattleStruct->turnSideTracker; gBattlerAttacker = gSideTimers[side].mistBattlerId; - if (gSideTimers[side].mistTimer != 0 && --gSideTimers[side].mistTimer == 0) + if (gSideTimers[side].mistTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_MIST; BattleScriptExecute(BattleScript_SideStatusWoreOff); @@ -1789,7 +1846,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].safeguardBattlerId; if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD) { - if (--gSideTimers[side].safeguardTimer == 0) + if (gSideTimers[side].safeguardTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD; BattleScriptExecute(BattleScript_SafeguardEnds); @@ -1813,7 +1870,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].luckyChantBattlerId; if (gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT) { - if (--gSideTimers[side].luckyChantTimer == 0) + if (gSideTimers[side].luckyChantTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_LUCKY_CHANT; BattleScriptExecute(BattleScript_LuckyChantEnds); @@ -1837,7 +1894,7 @@ u8 DoFieldEndTurnEffects(void) gBattlerAttacker = gSideTimers[side].tailwindBattlerId; if (gSideStatuses[side] & SIDE_STATUS_TAILWIND) { - if (gSideTimers[side].tailwindTimer > 0 && --gSideTimers[side].tailwindTimer == 0) + if (gSideTimers[side].tailwindTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_TAILWIND; BattleScriptExecute(BattleScript_TailwindEnds); @@ -1858,9 +1915,7 @@ u8 DoFieldEndTurnEffects(void) while (gBattleStruct->turnSideTracker < gBattlersCount) { u32 battler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker]; - if (gWishFutureKnock.wishCounter[battler] != 0 - && --gWishFutureKnock.wishCounter[battler] == 0 - && IsBattlerAlive(battler)) + if (gWishFutureKnock.wishCounter[battler] == gBattleTurnCounter && IsBattlerAlive(battler)) { gBattlerTarget = battler; BattleScriptExecute(BattleScript_WishComesTrue); @@ -1876,146 +1931,15 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnSideTracker = 0; } break; - case ENDTURN_RAIN: - if (gBattleWeather & B_WEATHER_RAIN) - { - if (!(gBattleWeather & B_WEATHER_RAIN_PERMANENT) - && !(gBattleWeather & B_WEATHER_RAIN_PRIMAL)) - { - if (--gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~B_WEATHER_RAIN_TEMPORARY; - gBattleWeather &= ~B_WEATHER_RAIN_DOWNPOUR; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_STOPPED; - } - else if (gBattleWeather & B_WEATHER_RAIN_DOWNPOUR) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOWNPOUR_CONTINUES; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_CONTINUES; - } - } - else if (gBattleWeather & B_WEATHER_RAIN_DOWNPOUR) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOWNPOUR_CONTINUES; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_CONTINUES; - } - - BattleScriptExecute(BattleScript_RainContinuesOrEnds); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_SANDSTORM: - if (gBattleWeather & B_WEATHER_SANDSTORM) - { - if (!(gBattleWeather & B_WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~B_WEATHER_SANDSTORM_TEMPORARY; - gBattlescriptCurrInstr = BattleScript_SandStormHailSnowEnds; - } - else - { - gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; - } - - gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM; - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_SUN: - if (gBattleWeather & B_WEATHER_SUN) - { - if (!(gBattleWeather & B_WEATHER_SUN_PERMANENT) - && !(gBattleWeather & B_WEATHER_SUN_PRIMAL) - && --gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~B_WEATHER_SUN_TEMPORARY; - for (i = 0; i < gBattlersCount; i++) - gDisableStructs[i].weatherAbilityDone = FALSE; - gBattlescriptCurrInstr = BattleScript_SunlightFaded; - } - else - { - gBattlescriptCurrInstr = BattleScript_SunlightContinues; - } - - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_HAIL: - if (gBattleWeather & B_WEATHER_HAIL) - { - if (!(gBattleWeather & B_WEATHER_HAIL_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~B_WEATHER_HAIL_TEMPORARY; - gBattlescriptCurrInstr = BattleScript_SandStormHailSnowEnds; - } - else - { - gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; - } - - gBattleScripting.animArg1 = B_ANIM_HAIL_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL; - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_SNOW: - if (gBattleWeather & B_WEATHER_SNOW) - { - if (!(gBattleWeather & B_WEATHER_SNOW_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~B_WEATHER_SNOW_TEMPORARY; - gBattlescriptCurrInstr = BattleScript_SandStormHailSnowEnds; - } - else - { - gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues; - } - - gBattleScripting.animArg1 = B_ANIM_SNOW_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SNOW; - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } - gBattleStruct->turnCountersTracker++; - break; - case ENDTURN_FOG: - if (gBattleWeather & B_WEATHER_FOG) - { - if (!(gBattleWeather & B_WEATHER_FOG_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) - { - gBattleWeather &= ~B_WEATHER_FOG_TEMPORARY; - gBattlescriptCurrInstr = BattleScript_FogEnded; - } - else - { - gBattlescriptCurrInstr = BattleScript_FogContinues; - } - - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; - } + case ENDTURN_WEATHER: + effect = TryEndTurnWeather(); gBattleStruct->turnCountersTracker++; break; case ENDTURN_DAMAGE_NON_TYPES: while (gBattleStruct->turnSideTracker < 2) { side = gBattleStruct->turnSideTracker; - if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES && --gSideTimers[side].damageNonTypesTimer == 0) + if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES && gSideTimers[side].damageNonTypesTimer == gBattleTurnCounter) { // There is no in-game message when this side status ends. gSideStatuses[side] &= ~SIDE_STATUS_DAMAGE_NON_TYPES; @@ -2032,7 +1956,7 @@ u8 DoFieldEndTurnEffects(void) } break; case ENDTURN_TRICK_ROOM: - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 0 && --gFieldTimers.trickRoomTimer == 0) + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_TRICK_ROOM; BattleScriptExecute(BattleScript_TrickRoomEnds); @@ -2041,7 +1965,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_WONDER_ROOM: - if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && gFieldTimers.wonderRoomTimer > 0 && --gFieldTimers.wonderRoomTimer == 0) + if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && gFieldTimers.wonderRoomTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_WONDER_ROOM; BattleScriptExecute(BattleScript_WonderRoomEnds); @@ -2050,7 +1974,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_MAGIC_ROOM: - if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && gFieldTimers.magicRoomTimer > 0 && --gFieldTimers.magicRoomTimer == 0) + if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && gFieldTimers.magicRoomTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_MAGIC_ROOM; BattleScriptExecute(BattleScript_MagicRoomEnds); @@ -2075,7 +1999,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_WATER_SPORT: - if (gFieldStatuses & STATUS_FIELD_WATERSPORT && --gFieldTimers.waterSportTimer == 0) + if (gFieldStatuses & STATUS_FIELD_WATERSPORT && gFieldTimers.waterSportTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_WATERSPORT; BattleScriptExecute(BattleScript_WaterSportEnds); @@ -2084,7 +2008,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_MUD_SPORT: - if (gFieldStatuses & STATUS_FIELD_MUDSPORT && --gFieldTimers.mudSportTimer == 0) + if (gFieldStatuses & STATUS_FIELD_MUDSPORT && gFieldTimers.mudSportTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_MUDSPORT; BattleScriptExecute(BattleScript_MudSportEnds); @@ -2093,7 +2017,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_GRAVITY: - if (gFieldStatuses & STATUS_FIELD_GRAVITY && --gFieldTimers.gravityTimer == 0) + if (gFieldStatuses & STATUS_FIELD_GRAVITY && gFieldTimers.gravityTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_GRAVITY; BattleScriptExecute(BattleScript_GravityEnds); @@ -2106,7 +2030,7 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_FAIRY_LOCK: - if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && --gFieldTimers.fairyLockTimer == 0) + if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && gFieldTimers.fairyLockTimer == gBattleTurnCounter) { gFieldStatuses &= ~STATUS_FIELD_FAIRY_LOCK; } @@ -2139,7 +2063,7 @@ u8 DoFieldEndTurnEffects(void) break; } - if (gSideTimers[side].rainbowTimer > 0 && --gSideTimers[side].rainbowTimer == 0) + if (gSideTimers[side].rainbowTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_RAINBOW; BattleScriptExecute(BattleScript_TheRainbowDisappeared); @@ -2169,7 +2093,7 @@ u8 DoFieldEndTurnEffects(void) break; } - if (gSideTimers[side].seaOfFireTimer > 0 && --gSideTimers[side].seaOfFireTimer == 0) + if (gSideTimers[side].seaOfFireTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_SEA_OF_FIRE; BattleScriptExecute(BattleScript_TheSeaOfFireDisappeared); @@ -2199,7 +2123,7 @@ u8 DoFieldEndTurnEffects(void) break; } - if (gSideTimers[side].swampTimer > 0 && --gSideTimers[side].swampTimer == 0) + if (gSideTimers[side].swampTimer == gBattleTurnCounter) { gSideStatuses[side] &= ~SIDE_STATUS_SWAMP; BattleScriptExecute(BattleScript_TheSwampDisappeared); @@ -2311,7 +2235,7 @@ u8 DoBattlerEndTurnEffects(void) { case ENDTURN_WEATHER_DAMAGE: ability = GetBattlerAbility(battler); - if (!IsBattlerAlive(battler) || !WEATHER_HAS_EFFECT || ability == ABILITY_MAGIC_GUARD) + if (!IsBattlerAlive(battler) || !HasWeatherEffect() || ability == ABILITY_MAGIC_GUARD) { gBattleStruct->turnEffectsTracker++; break; @@ -2321,27 +2245,26 @@ u8 DoBattlerEndTurnEffects(void) && ability != ABILITY_SAND_FORCE && ability != ABILITY_SAND_RUSH && ability != ABILITY_OVERCOAT - && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ROCK) - && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GROUND) - && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_STEEL) + && !IS_BATTLER_ANY_TYPE(gBattlerAttacker, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) { gBattleScripting.battler = battler; - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM; BattleScriptExecute(BattleScript_DamagingWeather); effect++; } else if (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW) && ability == ABILITY_ICE_BODY && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && !BATTLER_MAX_HP(battler) + && !IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { gBattleScripting.battler = battler; - gBattleMoveDamage = -1 * max(1, GetNonDynamaxMaxHP(battler) / 16); + gBattleStruct->moveDamage[battler] = -1 * max(1, GetNonDynamaxMaxHP(battler) / 16); BattleScriptExecute(BattleScript_IceBodyHeal); effect++; } @@ -2354,9 +2277,10 @@ u8 DoBattlerEndTurnEffects(void) && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) { gBattleScripting.battler = battler; - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL; BattleScriptExecute(BattleScript_DamagingWeather); effect++; } @@ -2364,11 +2288,11 @@ u8 DoBattlerEndTurnEffects(void) break; case ENDTURN_INGRAIN: // ingrain if ((gStatuses3[battler] & STATUS3_ROOTED) - && !BATTLER_MAX_HP(battler) + && !IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) && IsBattlerAlive(battler)) { - gBattleMoveDamage = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); + gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); BattleScriptExecute(BattleScript_IngrainTurnHeal); effect++; } @@ -2376,11 +2300,11 @@ u8 DoBattlerEndTurnEffects(void) break; case ENDTURN_AQUA_RING: // aqua ring if ((gStatuses3[battler] & STATUS3_AQUA_RING) - && !BATTLER_MAX_HP(battler) + && !IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) && IsBattlerAlive(battler)) { - gBattleMoveDamage = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); + gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); BattleScriptExecute(BattleScript_AquaRingHeal); effect++; } @@ -2425,10 +2349,12 @@ u8 DoBattlerEndTurnEffects(void) gBattlerAttacker = battler; gBattleScripting.animArg1 = gBattlerTarget; gBattleScripting.animArg2 = gBattlerAttacker; - gBattleMoveDamage = max(1, GetNonDynamaxMaxHP(battler) / 8); + gBattleStruct->moveDamage[gBattlerAttacker] = max(1, GetNonDynamaxMaxHP(battler) / 8); + gBattleStruct->moveDamage[gBattlerTarget] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE; if (GetBattlerAbility(battler) == ABILITY_LIQUID_OOZE) { + gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * -1; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_OOZE; BattleScriptExecute(BattleScript_LeechSeedTurnDrainLiquidOoze); } @@ -2452,21 +2378,21 @@ u8 DoBattlerEndTurnEffects(void) { if (ability == ABILITY_POISON_HEAL) { - if (!BATTLER_MAX_HP(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + if (!IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; BattleScriptExecute(BattleScript_PoisonHealActivates); effect++; } } else { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; BattleScriptExecute(BattleScript_PoisonTurnDmg); effect++; } @@ -2480,24 +2406,24 @@ u8 DoBattlerEndTurnEffects(void) { if (ability == ABILITY_POISON_HEAL) { - if (!BATTLER_MAX_HP(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + if (!IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; BattleScriptExecute(BattleScript_PoisonHealActivates); effect++; } } else { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; if ((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns gBattleMons[battler].status1 += STATUS1_TOXIC_TURN(1); - gBattleMoveDamage *= (gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >> 8; + gBattleStruct->moveDamage[battler] *= (gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >> 8; BattleScriptExecute(BattleScript_PoisonTurnDmg); effect++; } @@ -2509,15 +2435,15 @@ u8 DoBattlerEndTurnEffects(void) && IsBattlerAlive(battler) && !IsBattlerProtectedByMagicGuard(battler, ability)) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); if (ability == ABILITY_HEATPROOF) { - if (gBattleMoveDamage > (gBattleMoveDamage / 2) + 1) // Record ability if the burn takes less damage than it normally would. + if (gBattleStruct->moveDamage[battler] > (gBattleStruct->moveDamage[battler] / 2) + 1) // Record ability if the burn takes less damage than it normally would. RecordAbilityBattle(battler, ABILITY_HEATPROOF); - gBattleMoveDamage /= 2; + gBattleStruct->moveDamage[battler] /= 2; } - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; BattleScriptExecute(BattleScript_BurnTurnDmg); effect++; } @@ -2528,9 +2454,9 @@ u8 DoBattlerEndTurnEffects(void) && IsBattlerAlive(battler) && !IsBattlerProtectedByMagicGuard(battler, ability)) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; BattleScriptExecute(BattleScript_FrostbiteTurnDmg); effect++; } @@ -2545,9 +2471,9 @@ u8 DoBattlerEndTurnEffects(void) // persist even after the affected Pokémon has been awakened by Shed Skin. if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; BattleScriptExecute(BattleScript_NightmareTurnDmg); effect++; } @@ -2563,9 +2489,9 @@ u8 DoBattlerEndTurnEffects(void) && IsBattlerAlive(battler) && !IsBattlerProtectedByMagicGuard(battler, ability)) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; BattleScriptExecute(BattleScript_CurseTurnDmg); effect++; } @@ -2587,12 +2513,12 @@ u8 DoBattlerEndTurnEffects(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler], TRUE) == HOLD_EFFECT_BINDING_BAND) - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); else - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; } else // broke free { @@ -2758,7 +2684,7 @@ u8 DoBattlerEndTurnEffects(void) if (!(gStatuses3[battler] & STATUS3_YAWN) && !(gBattleMons[battler].status1 & STATUS1_ANY) && battlerAbility != ABILITY_VITAL_SPIRIT && battlerAbility != ABILITY_INSOMNIA && !UproarWakeUpCheck(battler) - && !IsLeafGuardProtected(battler)) + && !IsLeafGuardProtected(battler, battlerAbility)) { CancelMultiTurnMoves(battler); gEffectBattler = gBattlerTarget = battler; @@ -2772,6 +2698,10 @@ u8 DoBattlerEndTurnEffects(void) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_MISTY; BattleScriptExecute(BattleScript_TerrainPreventsEnd2); } + else if (IsSleepClauseActiveForSide(GetBattlerSide(battler))) + { + BattleScriptExecute(BattleScript_SleepClausePreventsEnd); + } else { if (B_SLEEP_TURNS >= GEN_5) @@ -2779,6 +2709,7 @@ u8 DoBattlerEndTurnEffects(void) else gBattleMons[battler].status1 |= ((Random() % 4) + 3); + TryActivateSleepClause(battler, gBattlerPartyIndexes[battler]); BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); BattleScriptExecute(BattleScript_YawnMakesAsleep); @@ -2847,8 +2778,8 @@ u8 DoBattlerEndTurnEffects(void) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_ROOST: // Return flying type. - if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST) - gBattleResources->flags->flags[battler] &= ~RESOURCE_FLAG_ROOST; + if (gDisableStructs[battler].roostActive) + gDisableStructs[battler].roostActive = FALSE; gBattleStruct->turnEffectsTracker++; break; case ENDTURN_POWDER: @@ -2884,12 +2815,12 @@ u8 DoBattlerEndTurnEffects(void) && !IsBattlerProtectedByMagicGuard(battler, ability)) { gBattlerTarget = battler; - if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_STEEL) || IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_WATER)) - gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4; + if (IS_BATTLER_ANY_TYPE(battler, TYPE_STEEL, TYPE_WATER)) + gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 4; else - gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SALT_CURE); BattleScriptExecute(BattleScript_SaltCureExtraDamage); effect++; @@ -2933,13 +2864,13 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_GMAX_MOVE_RESIDUAL_DAMAGE: { u32 side = GetBattlerSide(gBattlerAttacker); - if (gSideTimers[side].damageNonTypesTimer + if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES && !IS_BATTLER_OF_TYPE(gBattlerAttacker, gSideTimers[side].damageNonTypesType) && IsBattlerAlive(gBattlerAttacker) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { gBattleScripting.battler = battler; - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 6; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 6; ChooseDamageNonTypesString(gSideTimers[side].damageNonTypesType); BattleScriptExecute(BattleScript_DamageNonTypesContinues); effect++; @@ -2950,7 +2881,7 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_SEA_OF_FIRE_DAMAGE: if (IsBattlerAlive(battler) && gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; BtlController_EmitStatusAnimation(battler, BUFFER_A, FALSE, STATUS1_BURN); MarkBattlerForControllerExec(battler); BattleScriptExecute(BattleScript_HurtByTheSeaOfFire); @@ -2986,14 +2917,12 @@ bool32 HandleWishPerishSongOnTurnEnd(void) gBattleStruct->wishPerishSongBattlerId++; - if (gWishFutureKnock.futureSightCounter[battler] != 0 - && --gWishFutureKnock.futureSightCounter[battler] == 0 - && !(gAbsentBattlerFlags & (1u << battler))) + if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter && !(gAbsentBattlerFlags & (1u << battler))) { struct Pokemon *party; - if (gWishFutureKnock.futureSightCounter[battler] == 0 - && gWishFutureKnock.futureSightCounter[BATTLE_PARTNER(battler)] == 0) + if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter + && gWishFutureKnock.futureSightCounter[BATTLE_PARTNER(battler)] <= gBattleTurnCounter) { gSideStatuses[GetBattlerSide(battler)] &= ~SIDE_STATUS_FUTUREATTACK; } @@ -3010,7 +2939,6 @@ bool32 HandleWishPerishSongOnTurnEnd(void) gBattlerTarget = battler; gBattlerAttacker = gWishFutureKnock.futureSightBattlerIndex[battler]; - gSpecialStatuses[gBattlerTarget].shellBellDmg = IGNORE_SHELL_BELL; gCurrentMove = gWishFutureKnock.futureSightMove[battler]; party = GetSideParty(GetBattlerSide(gBattlerAttacker)); @@ -3041,7 +2969,7 @@ bool32 HandleWishPerishSongOnTurnEnd(void) if (gDisableStructs[battler].perishSongTimer == 0) { gStatuses3[battler] &= ~STATUS3_PERISH_SONG; - gBattleMoveDamage = gBattleMons[battler].hp; + gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; gBattlescriptCurrInstr = BattleScript_PerishSongTakesLife; } else @@ -3187,12 +3115,6 @@ void TryClearRageAndFuryCutter(void) } } -void SetAtkCancellerForCalledMove(void) -{ - gBattleStruct->atkCancellerTracker = CANCELLER_HEAL_BLOCKED; - gBattleStruct->isAtkCancelerForCalledMove = TRUE; -} - static inline bool32 TryFormChangeBeforeMove(void) { bool32 result = TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_BEFORE_MOVE); @@ -3206,596 +3128,745 @@ static inline bool32 TryFormChangeBeforeMove(void) return TRUE; } -u8 AtkCanceller_UnableToUseMove(u32 moveType) +static inline bool32 TryActivatePowderStatus(u32 move) { - u32 effect = 0; - u32 obedienceResult; - do + u32 partnerMove = gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].moves[gBattleStruct->chosenMovePositions[BATTLE_PARTNER(gBattlerAttacker)]]; + if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER)) + return FALSE; + if (GetBattleMoveType(move) == TYPE_FIRE && !gBattleStruct->pledgeMove) + return TRUE; + if (move == MOVE_FIRE_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE) + return TRUE; + if (move == MOVE_GRASS_PLEDGE && partnerMove == MOVE_FIRE_PLEDGE && gBattleStruct->pledgeMove) + return TRUE; + return FALSE; +} + +void SetAtkCancellerForCalledMove(void) +{ + gBattleStruct->atkCancellerTracker = CANCELLER_HEAL_BLOCKED; + gBattleStruct->isAtkCancelerForCalledMove = TRUE; +} + +static void CancellerFlags(u32 *effect) +{ + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND; + gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE; + gStatuses4[gBattlerAttacker] &= ~STATUS4_GLAIVE_RUSH; +} + +static void CancellerStanceChangeOne(u32 *effect) +{ + if (B_STANCE_CHANGE_FAIL < GEN_7 && TryFormChangeBeforeMove()) + *effect = 1; +} + +static void CancellerSkyDrop(u32 *effect) +{ + // If Pokemon is being held in Sky Drop + if (gStatuses3[gBattlerAttacker] & STATUS3_SKY_DROPPED) { - switch (gBattleStruct->atkCancellerTracker) + gBattlescriptCurrInstr = BattleScript_MoveEnd; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerRecharge(u32 *effect) +{ + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) + { + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RECHARGE; + gDisableStructs[gBattlerAttacker].rechargeTimer = 0; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerAsleep(u32 *effect) +{ + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) + { + if (UproarWakeUpCheck(gBattlerAttacker)) { - case CANCELLER_FLAGS: // flags clear - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND; - gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE; - gStatuses4[gBattlerAttacker] &= ~STATUS4_GLAIVE_RUSH; - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_SKY_DROP: - // If Pokemon is being held in Sky Drop - if (gStatuses3[gBattlerAttacker] & STATUS3_SKY_DROPPED) - { - gBattlescriptCurrInstr = BattleScript_MoveEnd; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_STANCE_CHANGE_1: - if (B_STANCE_CHANGE_FAIL < GEN_7 && TryFormChangeBeforeMove()) - effect = 1; - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_ASLEEP: // check being asleep + TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + BattleScriptPushCursor(); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; + gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; + *effect = 2; + } + else + { + u8 toSub; + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_EARLY_BIRD) + toSub = 2; + else + toSub = 1; + if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) < toSub) + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; + else + gBattleMons[gBattlerAttacker].status1 -= toSub; if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { - if (UproarWakeUpCheck(gBattlerAttacker)) + u32 moveEffect = GetMoveEffect(gChosenMove); + if (moveEffect != EFFECT_SNORE && moveEffect != EFFECT_SLEEP_TALK) { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; - effect = 2; - } - else - { - u8 toSub; - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_EARLY_BIRD) - toSub = 2; - else - toSub = 1; - if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) < toSub) - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; - else - gBattleMons[gBattlerAttacker].status1 -= toSub; - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) - { - u32 moveEffect = gMovesInfo[gChosenMove].effect; - if (moveEffect != EFFECT_SNORE && moveEffect != EFFECT_SLEEP_TALK) - { - gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 2; - } - } - else - { - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; - effect = 2; - } - } - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_FROZEN: // check being frozen - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE && !(gMovesInfo[gCurrentMove].thawsUser)) - { - if (!RandomPercentage(RNG_FROZEN, 20)) - { - gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen; - gHitMarker |= (HITMARKER_NO_ATTACKSTRING | HITMARKER_UNABLE_TO_USE_MOVE); - } - else // unfreeze - { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; - } - effect = 2; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_OBEDIENCE: - obedienceResult = GetAttackerObedienceForAction(); - if (obedienceResult != OBEYS - && !(gHitMarker & HITMARKER_NO_PPDEDUCT) // Don't check obedience after first hit of multi target move or multi hit moves - && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) - { - switch (obedienceResult) - { - case DISOBEYS_LOAFS: - // Randomly select, then print a disobedient string - // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE - gBattleCommunication[MULTISTRING_CHOOSER] = MOD(Random(), NUM_LOAF_STRINGS); - gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; - gMoveResultFlags |= MOVE_RESULT_MISSED; - break; - case DISOBEYS_HITS_SELF: - gBattlerTarget = gBattlerAttacker; - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = damageCalcData.battlerDef = gBattlerAttacker; - damageCalcData.move = MOVE_NONE; - damageCalcData.moveType = TYPE_MYSTERY; - damageCalcData.isCrit = FALSE; - damageCalcData.randomFactor = FALSE; - damageCalcData.updateFlags = TRUE; - gBattleMoveDamage = CalculateMoveDamage(&damageCalcData, 40); - gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; + gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gHitMarker |= HITMARKER_OBEYS; - break; - case DISOBEYS_FALL_ASLEEP: - gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; - gMoveResultFlags |= MOVE_RESULT_MISSED; - break; - case DISOBEYS_WHILE_ASLEEP: - gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep; - gMoveResultFlags |= MOVE_RESULT_MISSED; - break; - case DISOBEYS_RANDOM_MOVE: - gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; - SetAtkCancellerForCalledMove(); - gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; - gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gHitMarker |= HITMARKER_DISOBEDIENT_MOVE; - gHitMarker |= HITMARKER_OBEYS; - break; + *effect = 2; } - effect = 1; } else { - gHitMarker |= HITMARKER_OBEYS; + TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + BattleScriptPushCursor(); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; + gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; + *effect = 2; } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_TRUANT: // truant - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) - { - CancelMultiTurnMoves(gBattlerAttacker); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LOAFING; - gBattlerAbility = gBattlerAttacker; - gBattlescriptCurrInstr = BattleScript_TruantLoafingAround; - gMoveResultFlags |= MOVE_RESULT_MISSED; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_RECHARGE: // recharge - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) - { - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RECHARGE; - gDisableStructs[gBattlerAttacker].rechargeTimer = 0; - CancelMultiTurnMoves(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_FLINCH: // flinch - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) - { - gProtectStructs[gBattlerAttacker].flinchImmobility = TRUE; - CancelMultiTurnMoves(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_DISABLED: // disabled move - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != MOVE_NONE) - { - gProtectStructs[gBattlerAttacker].usedDisabledMove = TRUE; - gBattleScripting.battler = gBattlerAttacker; - CancelMultiTurnMoves(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_HEAL_BLOCKED: - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove)) - { - gProtectStructs[gBattlerAttacker].usedHealBlockedMove = TRUE; - gBattleScripting.battler = gBattlerAttacker; - CancelMultiTurnMoves(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_GRAVITY: - if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(gCurrentMove)) - { - gProtectStructs[gBattlerAttacker].usedGravityPreventedMove = TRUE; - gBattleScripting.battler = gBattlerAttacker; - CancelMultiTurnMoves(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_TAUNTED: // taunt - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].tauntTimer && IS_MOVE_STATUS(gCurrentMove)) - { - gProtectStructs[gBattlerAttacker].usedTauntedMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_IMPRISONED: // imprisoned - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) - { - gProtectStructs[gBattlerAttacker].usedImprisonedMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_CONFUSED: // confusion - if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) - { - if (!(gStatuses4[gBattlerAttacker] & STATUS4_INFINITE_CONFUSION)) - gBattleMons[gBattlerAttacker].status2 -= STATUS2_CONFUSION_TURN(1); - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) - { - // confusion dmg - if (RandomPercentage(RNG_CONFUSION, (GetGenConfig(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) - { - gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; - gBattlerTarget = gBattlerAttacker; - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = damageCalcData.battlerDef = gBattlerAttacker; - damageCalcData.move = MOVE_NONE; - damageCalcData.moveType = TYPE_MYSTERY; - damageCalcData.isCrit = FALSE; - damageCalcData.randomFactor = FALSE; - damageCalcData.updateFlags = TRUE; - gBattleMoveDamage = CalculateMoveDamage(&damageCalcData, 40); - gProtectStructs[gBattlerAttacker].confusionSelfDmg = TRUE; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = FALSE; - BattleScriptPushCursor(); - } - gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; - } - else // snapped out of confusion - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore; - } - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_PARALYSED: // paralysis - if (!gBattleStruct->isAtkCancelerForCalledMove - && gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS - && !(B_MAGIC_GUARD == GEN_4 && GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGIC_GUARD) - && !RandomPercentage(RNG_PARALYSIS, 75)) - { - gProtectStructs[gBattlerAttacker].prlzImmobility = TRUE; - // This is removed in FRLG and Emerald for some reason - //CancelMultiTurnMoves(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_IN_LOVE: // infatuation - if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) - { - gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); - if (!RandomPercentage(RNG_INFATUATION, 50)) - { - BattleScriptPushCursor(); - } - else - { - BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gProtectStructs[gBattlerAttacker].loveImmobility = TRUE; - CancelMultiTurnMoves(gBattlerAttacker); - } - gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_BIDE: // bide - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) - { - gBattleMons[gBattlerAttacker].status2 -= STATUS2_BIDE_TURN(1); - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) - { - gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; - } - else - { - // This is removed in FRLG and Emerald for some reason - //gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; - if (gBideDmg[gBattlerAttacker]) - { - gCurrentMove = MOVE_BIDE; - gBattleScripting.bideDmg = gBideDmg[gBattlerAttacker] * 2; - gBattlerTarget = gBideTarget[gBattlerAttacker]; - if (gAbsentBattlerFlags & (1u << gBattlerTarget)) - gBattlerTarget = GetMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); - gBattlescriptCurrInstr = BattleScript_BideAttack; - } - else - { - gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack; - } - } - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_THAW: // move thawing - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) - { - if (!(MoveHasAdditionalEffectSelfArg(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) - { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; - } - effect = 2; - } - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE && gMovesInfo[gCurrentMove].thawsUser) - { - if (!(MoveHasAdditionalEffectSelfArg(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) - { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FROSTBITE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfrostbite; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FROSTBITE_HEALED_BY_MOVE; - } - effect = 2; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_STANCE_CHANGE_2: - if (B_STANCE_CHANGE_FAIL >= GEN_7 && !gBattleStruct->isAtkCancelerForCalledMove && TryFormChangeBeforeMove()) - effect = 1; - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_POWDER_MOVE: - if ((gMovesInfo[gCurrentMove].powderMove) && (gBattlerAttacker != gBattlerTarget)) - { - if (B_POWDER_GRASS >= GEN_6 - && (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS) || GetBattlerAbility(gBattlerTarget) == ABILITY_OVERCOAT)) - { - gBattlerAbility = gBattlerTarget; - effect = 1; - } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_SAFETY_GOGGLES) - { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_SAFETY_GOGGLES); - gLastUsedItem = gBattleMons[gBattlerTarget].item; - effect = 1; - } + } + } +} - if (effect != 0) - gBattlescriptCurrInstr = BattleScript_PowderMoveNoEffect; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_POWDER_STATUS: - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER) - { - u32 partnerMove = gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].moves[gBattleStruct->chosenMovePositions[BATTLE_PARTNER(gBattlerAttacker)]]; - if ((moveType == TYPE_FIRE && !gBattleStruct->pledgeMove) - || (gCurrentMove == MOVE_FIRE_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE) - || (gCurrentMove == MOVE_GRASS_PLEDGE && partnerMove == MOVE_FIRE_PLEDGE && gBattleStruct->pledgeMove)) - { - gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD - && (B_POWDER_RAIN < GEN_7 || !IsBattlerWeatherAffected(gBattlerAttacker, B_WEATHER_RAIN_PRIMAL))) - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE - || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) - gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_THROAT_CHOP: - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].throatChopTimer && gMovesInfo[gCurrentMove].soundMove) - { - gProtectStructs[gBattlerAttacker].usedThroatChopPreventedMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsThroatChopPrevented; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_Z_MOVES: - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) - { - // For Z-Mirror Move, so it doesn't play the animation twice. - bool32 alreadyUsed = HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE); - - // attacker has a queued z move - RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_Z_CRYSTAL); - SetGimmickAsActivated(gBattlerAttacker, GIMMICK_Z_MOVE); - - gBattleScripting.battler = gBattlerAttacker; - if (gProtectStructs[gBattlerAttacker].powderSelfDmg) - { - if (!alreadyUsed) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivatePowder; - } - } - else if (gMovesInfo[gCurrentMove].category == DAMAGE_CATEGORY_STATUS) - { - if (!alreadyUsed) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivateStatus; - } - } - else - { - if (!alreadyUsed) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivateDamaging; - } - } - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_EXPLODING_DAMP: +static void CancellerFrozen(u32 *effect) +{ + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE && !MoveThawsUser(gCurrentMove)) + { + if (!RandomPercentage(RNG_FROZEN, 20)) { - u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); - if (dampBattler && (gMovesInfo[gCurrentMove].effect == EFFECT_EXPLOSION - || gMovesInfo[gCurrentMove].effect == EFFECT_MIND_BLOWN)) - { - gBattleScripting.battler = dampBattler - 1; - gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; + gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen; + gHitMarker |= (HITMARKER_NO_ATTACKSTRING | HITMARKER_UNABLE_TO_USE_MOVE); + } + else // unfreeze + { + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; + } + *effect = 2; + } +} + +static void CancellerObedience(u32 *effect) +{ + u32 obedienceResult = GetAttackerObedienceForAction(); + if (obedienceResult != OBEYS + && !(gHitMarker & HITMARKER_NO_PPDEDUCT) // Don't check obedience after first hit of multi target move or multi hit moves + && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + { + switch (obedienceResult) + { + case DISOBEYS_LOAFS: + // Randomly select, then print a disobedient string + // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE + gBattleCommunication[MULTISTRING_CHOOSER] = MOD(Random(), NUM_LOAF_STRINGS); + gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + break; + case DISOBEYS_HITS_SELF: + gBattlerTarget = gBattlerAttacker; + struct DamageCalculationData damageCalcData; + damageCalcData.battlerAtk = damageCalcData.battlerDef = gBattlerAttacker; + damageCalcData.move = MOVE_NONE; + damageCalcData.moveType = TYPE_MYSTERY; + damageCalcData.isCrit = FALSE; + damageCalcData.randomFactor = FALSE; + damageCalcData.updateFlags = TRUE; + gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&damageCalcData, 40); + gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gHitMarker |= HITMARKER_OBEYS; + break; + case DISOBEYS_FALL_ASLEEP: + if (IsSleepClauseEnabled()) + gBattleStruct->battlerState[gBattlerAttacker].sleepClauseEffectExempt = TRUE; + gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + break; + case DISOBEYS_WHILE_ASLEEP: + gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + break; + case DISOBEYS_RANDOM_MOVE: + gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; + SetAtkCancellerForCalledMove(); + gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; + gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); + gHitMarker |= HITMARKER_DISOBEDIENT_MOVE; + gHitMarker |= HITMARKER_OBEYS; break; } - case CANCELLER_MULTIHIT_MOVES: - if (gMovesInfo[gCurrentMove].effect == EFFECT_MULTI_HIT) + *effect = 1; + } + else + { + gHitMarker |= HITMARKER_OBEYS; + } +} + +static void CancellerTruant(u32 *effect) +{ + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) + { + CancelMultiTurnMoves(gBattlerAttacker); + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LOAFING; + gBattlerAbility = gBattlerAttacker; + gBattlescriptCurrInstr = BattleScript_TruantLoafingAround; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + *effect = 1; + } +} + +static void CancellerFlinch(u32 *effect) +{ + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) + { + gProtectStructs[gBattlerAttacker].flinchImmobility = TRUE; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerInLove(u32 *effect) +{ + if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) + { + gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); + if (!RandomPercentage(RNG_INFATUATION, 50)) + { + BattleScriptPushCursor(); + } + else + { + BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gProtectStructs[gBattlerAttacker].loveImmobility = TRUE; + CancelMultiTurnMoves(gBattlerAttacker); + } + gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; + *effect = 1; + } +} + +static void CancellerDisabled(u32 *effect) +{ + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != MOVE_NONE) + { + gProtectStructs[gBattlerAttacker].usedDisabledMove = TRUE; + gBattleScripting.battler = gBattlerAttacker; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerHealBlocked(u32 *effect) +{ + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove)) + { + gProtectStructs[gBattlerAttacker].usedHealBlockedMove = TRUE; + gBattleScripting.battler = gBattlerAttacker; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerGravity(u32 *effect) +{ + if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(gCurrentMove)) + { + gProtectStructs[gBattlerAttacker].usedGravityPreventedMove = TRUE; + gBattleScripting.battler = gBattlerAttacker; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerThroatChop(u32 *effect) +{ + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].throatChopTimer && IsSoundMove(gCurrentMove)) + { + gProtectStructs[gBattlerAttacker].usedThroatChopPreventedMove = TRUE; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsThroatChopPrevented; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerTaunted(u32 *effect) +{ + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].tauntTimer && IsBattleMoveStatus(gCurrentMove)) + { + gProtectStructs[gBattlerAttacker].usedTauntedMove = TRUE; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerImprisoned(u32 *effect) +{ + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) + { + gProtectStructs[gBattlerAttacker].usedImprisonedMove = TRUE; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerConfused(u32 *effect) +{ + if (gBattleStruct->isAtkCancelerForCalledMove) + return; + + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) + { + if (!(gStatuses4[gBattlerAttacker] & STATUS4_INFINITE_CONFUSION)) + gBattleMons[gBattlerAttacker].status2 -= STATUS2_CONFUSION_TURN(1); + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) + { + // confusion dmg + if (RandomPercentage(RNG_CONFUSION, (GetGenConfig(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) { - u32 ability = GetBattlerAbility(gBattlerAttacker); - - if (ability == ABILITY_SKILL_LINK) - { - gMultiHitCounter = 5; - } - else if (ability == ABILITY_BATTLE_BOND - && gCurrentMove == MOVE_WATER_SHURIKEN - && gBattleMons[gBattlerAttacker].species == SPECIES_GRENINJA_ASH) - { - gMultiHitCounter = 3; - } - else - { - SetRandomMultiHitCounter(); - } - - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) - } - else if (gMovesInfo[gCurrentMove].strikeCount > 1) - { - if (gMovesInfo[gCurrentMove].effect == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) - { - gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 10); - } - else - { - gMultiHitCounter = gMovesInfo[gCurrentMove].strikeCount; - - if (gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_DARTS - && CanTargetPartner(gBattlerAttacker, gBattlerTarget) - && TargetFullyImmuneToCurrMove(gBattlerAttacker, gBattlerTarget)) - gBattlerTarget = BATTLE_PARTNER(gBattlerTarget); - } - - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) - } - else if (B_BEAT_UP >= GEN_5 && gMovesInfo[gCurrentMove].effect == EFFECT_BEAT_UP) - { - struct Pokemon* party = GetBattlerParty(gBattlerAttacker); - int i; - - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&party[i], MON_DATA_HP) - && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE - && !GetMonData(&party[i], MON_DATA_IS_EGG) - && !GetMonData(&party[i], MON_DATA_STATUS)) - gMultiHitCounter++; - } - - gBattleStruct->beatUpSlot = 0; - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; + gBattlerTarget = gBattlerAttacker; + struct DamageCalculationData damageCalcData; + damageCalcData.battlerAtk = damageCalcData.battlerDef = gBattlerAttacker; + damageCalcData.move = MOVE_NONE; + damageCalcData.moveType = TYPE_MYSTERY; + damageCalcData.isCrit = FALSE; + damageCalcData.randomFactor = FALSE; + damageCalcData.updateFlags = TRUE; + gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&damageCalcData, 40); + gProtectStructs[gBattlerAttacker].confusionSelfDmg = TRUE; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } else { - gMultiHitCounter = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = FALSE; + BattleScriptPushCursor(); } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_END: - break; + gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; + } + else // snapped out of confusion + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore; + } + *effect = 1; + } +} + +static void CancellerParalysed(u32 *effect) +{ + if (!gBattleStruct->isAtkCancelerForCalledMove + && (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) + && !(B_MAGIC_GUARD == GEN_4 && GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGIC_GUARD) + && !RandomPercentage(RNG_PARALYSIS, 75)) + { + gProtectStructs[gBattlerAttacker].prlzImmobility = TRUE; + // This is removed in FRLG and Emerald for some reason + //CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerBide(u32 *effect) +{ + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) + { + gBattleMons[gBattlerAttacker].status2 -= STATUS2_BIDE_TURN(1); + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) + { + gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; + } + else + { + // This is removed in FRLG and Emerald for some reason + //gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; + if (gBideDmg[gBattlerAttacker]) + { + gCurrentMove = MOVE_BIDE; + gBattlerTarget = gBideTarget[gBattlerAttacker]; + if (gAbsentBattlerFlags & (1u << gBattlerTarget)) + gBattlerTarget = GetBattleMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); + gBattlescriptCurrInstr = BattleScript_BideAttack; + } + else + { + gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack; + } + } + *effect = 1; + } +} + +static void CancellerThaw(u32 *effect) +{ + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) + { + if (!(IsMoveEffectRemoveSpeciesType(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) + { + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; + } + *effect = 2; + } + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE && MoveThawsUser(gCurrentMove)) + { + if (!(IsMoveEffectRemoveSpeciesType(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) + { + gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FROSTBITE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveUsedUnfrostbite; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FROSTBITE_HEALED_BY_MOVE; + } + *effect = 2; + } +} + +static void CancellerStanceChangeTwo(u32 *effect) +{ + if (B_STANCE_CHANGE_FAIL >= GEN_7 && !gBattleStruct->isAtkCancelerForCalledMove && TryFormChangeBeforeMove()) + *effect = 1; +} + +static void CancellerWeatherPrimal(u32 *effect) +{ + if (HasWeatherEffect() && GetMovePower(gCurrentMove) > 0) + { + u32 moveType = GetBattleMoveType(gCurrentMove); + if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (B_POWDER_RAIN >= GEN_7 || !TryActivatePowderStatus(gCurrentMove))) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; + *effect = 1; + } + else if (moveType == TYPE_WATER && (gBattleWeather & B_WEATHER_SUN_PRIMAL)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_EVAPORATED_IN_SUN; + *effect = 1; + } + if (*effect == 1) + { + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove; + } + } +} + +static void CancellerDynamaxBlocked(u32 *effect) +{ + if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && IsMoveBlockedByDynamax(gCurrentMove)) + { + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax; + *effect = 1; + } +} + +static void CancellerPowderMove(u32 *effect) +{ + if (IsPowderMove(gCurrentMove) && (gBattlerAttacker != gBattlerTarget)) + { + if (B_POWDER_GRASS >= GEN_6 + && (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS) || GetBattlerAbility(gBattlerTarget) == ABILITY_OVERCOAT)) + { + gBattlerAbility = gBattlerTarget; + *effect = 1; + } + else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_SAFETY_GOGGLES) + { + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_SAFETY_GOGGLES); + gLastUsedItem = gBattleMons[gBattlerTarget].item; + *effect = 1; } - } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && gBattleStruct->atkCancellerTracker != CANCELLER_END2 && effect == 0); + if (*effect != 0) + gBattlescriptCurrInstr = BattleScript_PowderMoveNoEffect; + } +} + +static void CancellerPowderStatus(u32 *effect) +{ + if (TryActivatePowderStatus(gCurrentMove)) + { + gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE + || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) + gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerProtean(u32 *effect) +{ + u32 moveType = GetBattleMoveType(gCurrentMove); + if (ProteanTryChangeType(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), gCurrentMove, moveType)) + { + if (B_PROTEAN_LIBERO == GEN_9) + gDisableStructs[gBattlerAttacker].usedProteanLibero = TRUE; + PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); + gBattlerAbility = gBattlerAttacker; + BattleScriptPushCursor(); + PrepareStringBattle(STRINGID_EMPTYSTRING3, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; + gBattlescriptCurrInstr = BattleScript_ProteanActivates; + *effect = 1; + } +} + +static void CancellerPsychicTerrain(u32 *effect) +{ + if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN + && IsBattlerGrounded(gBattlerTarget) + && GetChosenMovePriority(gBattlerAttacker) > 0 + && GetMoveTarget(gCurrentMove) != MOVE_TARGET_ALL_BATTLERS + && GetMoveTarget(gCurrentMove) != MOVE_TARGET_OPPONENTS_FIELD + && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) + { + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerExplodingDamp(u32 *effect) +{ + u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); + if (dampBattler && (GetMoveEffect(gCurrentMove) == EFFECT_EXPLOSION + || GetMoveEffect(gCurrentMove) == EFFECT_MIND_BLOWN)) + { + gBattleScripting.battler = dampBattler - 1; + gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + *effect = 1; + } +} + +static void CancellerMultihitMoves(u32 *effect) +{ + if (GetMoveEffect(gCurrentMove) == EFFECT_MULTI_HIT) + { + u32 ability = GetBattlerAbility(gBattlerAttacker); + + if (ability == ABILITY_SKILL_LINK) + { + gMultiHitCounter = 5; + } + else if (ability == ABILITY_BATTLE_BOND + && gCurrentMove == MOVE_WATER_SHURIKEN + && gBattleMons[gBattlerAttacker].species == SPECIES_GRENINJA_ASH) + { + gMultiHitCounter = 3; + } + else + { + SetRandomMultiHitCounter(); + } + + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + } + else if (GetMoveStrikeCount(gCurrentMove) > 1) + { + if (GetMoveEffect(gCurrentMove) == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) + { + gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 10); + } + else + { + gMultiHitCounter = GetMoveStrikeCount(gCurrentMove); + + if (GetMoveEffect(gCurrentMove) == EFFECT_DRAGON_DARTS + && CanTargetPartner(gBattlerAttacker, gBattlerTarget) + && TargetFullyImmuneToCurrMove(gBattlerAttacker, gBattlerTarget)) + gBattlerTarget = BATTLE_PARTNER(gBattlerTarget); + } + + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) + } + else if (B_BEAT_UP >= GEN_5 && GetMoveEffect(gCurrentMove) == EFFECT_BEAT_UP) + { + struct Pokemon* party = GetBattlerParty(gBattlerAttacker); + int i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_HP) + && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE + && !GetMonData(&party[i], MON_DATA_IS_EGG) + && !GetMonData(&party[i], MON_DATA_STATUS)) + gMultiHitCounter++; + } + + gBattleStruct->beatUpSlot = 0; + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + } + else + { + gMultiHitCounter = 0; + } +} + +static void CancellerZMoves(u32 *effect) +{ + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) + { + // For Z-Mirror Move, so it doesn't play the animation twice. + bool32 alreadyUsed = HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE); + + // attacker has a queued z move + RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_Z_CRYSTAL); + SetGimmickAsActivated(gBattlerAttacker, GIMMICK_Z_MOVE); + + gBattleScripting.battler = gBattlerAttacker; + if (gProtectStructs[gBattlerAttacker].powderSelfDmg) + { + if (!alreadyUsed) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ZMoveActivatePowder; + } + } + else if (GetMoveCategory(gCurrentMove) == DAMAGE_CATEGORY_STATUS) + { + if (!alreadyUsed) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ZMoveActivateStatus; + } + } + else + { + if (!alreadyUsed) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ZMoveActivateDamaging; + } + } + *effect = 1; + } +} + +static void CancellerMultiTargetMoves(u32 *effect) +{ + u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + if (IsSpreadMove(moveTarget)) + { + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (gBattleStruct->bouncedMoveIsUsed && B_SIDE_OPPONENT == GetBattlerSide(battlerDef)) + continue; + + if (gBattlerAttacker == battlerDef + || !IsBattlerAlive(battlerDef) + || (moveTarget == MOVE_TARGET_BOTH && gBattlerAttacker == BATTLE_PARTNER(battlerDef)) + || IsBattlerProtected(gBattlerAttacker, battlerDef, gCurrentMove)) // Missing Invulnerable check + { + gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; + gBattleStruct->noResultString[battlerDef] = TRUE; + } + else if (AbilityBattleEffects(ABILITYEFFECT_WOULD_BLOCK, battlerDef, 0, 0, 0) + || (IsBattlerTerrainAffected(gBattlerAttacker, STATUS_FIELD_PSYCHIC_TERRAIN) && GetBattleMovePriority(gBattlerAttacker, gCurrentMove) > 0)) + { + gBattleStruct->moveResultFlags[battlerDef] = 0; + gBattleStruct->noResultString[battlerDef] = TRUE; + } + else if (AbilityBattleEffects(ABILITYEFFECT_WOULD_ABSORB, battlerDef, 0, 0, gCurrentMove)) + { + gBattleStruct->moveResultFlags[battlerDef] = 0; + gBattleStruct->noResultString[battlerDef] = DO_ACCURACY_CHECK; + } + else + { + CalcTypeEffectivenessMultiplier(gCurrentMove, GetBattleMoveType(gCurrentMove), gBattlerAttacker, battlerDef, GetBattlerAbility(battlerDef), TRUE); + } + } + if (moveTarget == MOVE_TARGET_BOTH) + gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER_SIDE, gBattlerAttacker); + else + gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, gBattlerAttacker); + } +} + +static const MoveSuccessOrderCancellers sMoveSuccessOrderCancellers[] = +{ + [CANCELLER_FLAGS] = CancellerFlags, + [CANCELLER_STANCE_CHANGE_1] = CancellerStanceChangeOne, + [CANCELLER_SKY_DROP] = CancellerSkyDrop, + [CANCELLER_RECHARGE] = CancellerRecharge, + [CANCELLER_ASLEEP] = CancellerAsleep, + [CANCELLER_FROZEN] = CancellerFrozen, + [CANCELLER_OBEDIENCE] = CancellerObedience, + [CANCELLER_TRUANT] = CancellerTruant, + [CANCELLER_FLINCH] = CancellerFlinch, + [CANCELLER_IN_LOVE] = CancellerInLove, + [CANCELLER_DISABLED] = CancellerDisabled, + [CANCELLER_HEAL_BLOCKED] = CancellerHealBlocked, + [CANCELLER_GRAVITY] = CancellerGravity, + [CANCELLER_THROAT_CHOP] = CancellerThroatChop, + [CANCELLER_TAUNTED] = CancellerTaunted, + [CANCELLER_IMPRISONED] = CancellerImprisoned, + [CANCELLER_CONFUSED] = CancellerConfused, + [CANCELLER_PARALYSED] = CancellerParalysed, + [CANCELLER_BIDE] = CancellerBide, + [CANCELLER_THAW] = CancellerThaw, + [CANCELLER_STANCE_CHANGE_2] = CancellerStanceChangeTwo, + [CANCELLER_WEATHER_PRIMAL] = CancellerWeatherPrimal, + [CANCELLER_DYNAMAX_BLOCKED] = CancellerDynamaxBlocked, + [CANCELLER_POWDER_MOVE] = CancellerPowderMove, + [CANCELLER_POWDER_STATUS] = CancellerPowderStatus, + [CANCELLER_PROTEAN] = CancellerProtean, + [CANCELLER_PSYCHIC_TERRAIN] = CancellerPsychicTerrain, + [CANCELLER_EXPLODING_DAMP] = CancellerExplodingDamp, + [CANCELLER_MULTIHIT_MOVES] = CancellerMultihitMoves, + [CANCELLER_Z_MOVES] = CancellerZMoves, + [CANCELLER_MULTI_TARGET_MOVES] = CancellerMultiTargetMoves, +}; + +u32 AtkCanceller_MoveSuccessOrder(void) +{ + u32 effect = 0; + + while (gBattleStruct->atkCancellerTracker < CANCELLER_END && effect == 0) + { + sMoveSuccessOrderCancellers[gBattleStruct->atkCancellerTracker](&effect); + gBattleStruct->atkCancellerTracker++; + } if (effect == 2) { BtlController_EmitSetMonData(gBattlerAttacker, BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); MarkBattlerForControllerExec(gBattlerAttacker); } - return effect; -} - -// After Protean Activation. -u8 AtkCanceller_UnableToUseMove2(void) -{ - u8 effect = 0; - - do - { - switch (gBattleStruct->atkCancellerTracker) - { - case CANCELLER_END: - gBattleStruct->atkCancellerTracker++; - case CANCELLER_PSYCHIC_TERRAIN: - if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN - && IsBattlerGrounded(gBattlerTarget) - && GetChosenMovePriority(gBattlerAttacker) > 0 - && gMovesInfo[gCurrentMove].target != MOVE_TARGET_ALL_BATTLERS - && gMovesInfo[gCurrentMove].target != MOVE_TARGET_OPPONENTS_FIELD - && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) - { - CancelMultiTurnMoves(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - effect = 1; - } - gBattleStruct->atkCancellerTracker++; - break; - case CANCELLER_END2: - break; - } - - } while (gBattleStruct->atkCancellerTracker != CANCELLER_END2 && effect == 0); return effect; } @@ -3840,7 +3911,7 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2 { if (IsValidForBattle(&party[i]) && i != partyIdBattlerOn1 && i != partyIdBattlerOn2 - && i != *(gBattleStruct->monToSwitchIntoId + flankId) && i != playerId[gBattleStruct->monToSwitchIntoId]) + && i != gBattleStruct->monToSwitchIntoId[flankId] && i != playerId[gBattleStruct->monToSwitchIntoId]) break; } return (i == PARTY_SIZE); @@ -3862,7 +3933,7 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2 { if (IsValidForBattle(&party[i]) && i != partyIdBattlerOn1 && i != partyIdBattlerOn2 - && i != *(gBattleStruct->monToSwitchIntoId + flankId) && i != playerId[gBattleStruct->monToSwitchIntoId]) + && i != gBattleStruct->monToSwitchIntoId[flankId] && i != playerId[gBattleStruct->monToSwitchIntoId]) break; } return (i == PARTY_SIZE); @@ -3951,65 +4022,61 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2 { if (IsValidForBattle(&party[i]) && i != partyIdBattlerOn1 && i != partyIdBattlerOn2 - && i != *(gBattleStruct->monToSwitchIntoId + flankId) && i != playerId[gBattleStruct->monToSwitchIntoId]) + && i != gBattleStruct->monToSwitchIntoId[flankId] && i != playerId[gBattleStruct->monToSwitchIntoId]) break; } return (i == PARTY_SIZE); } } -static const u16 sWeatherFlagsInfo[][3] = -{ - [ENUM_WEATHER_RAIN] = {B_WEATHER_RAIN_TEMPORARY, B_WEATHER_RAIN_PERMANENT, HOLD_EFFECT_DAMP_ROCK}, - [ENUM_WEATHER_RAIN_PRIMAL] = {B_WEATHER_RAIN_PRIMAL, B_WEATHER_RAIN_PRIMAL, HOLD_EFFECT_DAMP_ROCK}, - [ENUM_WEATHER_SUN] = {B_WEATHER_SUN_TEMPORARY, B_WEATHER_SUN_PERMANENT, HOLD_EFFECT_HEAT_ROCK}, - [ENUM_WEATHER_SUN_PRIMAL] = {B_WEATHER_SUN_PRIMAL, B_WEATHER_SUN_PRIMAL, HOLD_EFFECT_HEAT_ROCK}, - [ENUM_WEATHER_SANDSTORM] = {B_WEATHER_SANDSTORM_TEMPORARY, B_WEATHER_SANDSTORM_PERMANENT, HOLD_EFFECT_SMOOTH_ROCK}, - [ENUM_WEATHER_HAIL] = {B_WEATHER_HAIL_TEMPORARY, B_WEATHER_HAIL_PERMANENT, HOLD_EFFECT_ICY_ROCK}, - [ENUM_WEATHER_STRONG_WINDS] = {B_WEATHER_STRONG_WINDS, B_WEATHER_STRONG_WINDS, HOLD_EFFECT_NONE}, - [ENUM_WEATHER_SNOW] = {B_WEATHER_SNOW_TEMPORARY, B_WEATHER_SNOW_PERMANENT, HOLD_EFFECT_ICY_ROCK}, - [ENUM_WEATHER_FOG] = {B_WEATHER_FOG_TEMPORARY, B_WEATHER_FOG_PERMANENT, HOLD_EFFECT_NONE}, -}; - -bool32 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility) +bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility) { u16 battlerAbility = GetBattlerAbility(battler); - if (gBattleWeather & B_WEATHER_PRIMAL_ANY + + if (gBattleWeather & sBattleWeatherInfo[battleWeatherId].flag) + { + return FALSE; + } + else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && battlerAbility != ABILITY_DESOLATE_LAND && battlerAbility != ABILITY_PRIMORDIAL_SEA && battlerAbility != ABILITY_DELTA_STREAM) { return FALSE; } - else if (B_ABILITY_WEATHER < GEN_6 && viaAbility && !(gBattleWeather & sWeatherFlagsInfo[weatherEnumId][1])) + else if (B_ABILITY_WEATHER < GEN_6 && viaAbility) { - gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]); + gBattleWeather = sBattleWeatherInfo[battleWeatherId].flag; return TRUE; } - else if (!(gBattleWeather & (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]))) + else { - gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0]); - if (GetBattlerHoldEffect(battler, TRUE) == sWeatherFlagsInfo[weatherEnumId][2]) + u32 rock = sBattleWeatherInfo[battleWeatherId].rock; + gBattleWeather = sBattleWeatherInfo[battleWeatherId].flag; + if (gBattleWeather & B_WEATHER_PRIMAL_ANY) + gWishFutureKnock.weatherDuration = 0; + else if (rock != 0 && GetBattlerHoldEffect(battler, TRUE) == rock) gWishFutureKnock.weatherDuration = 8; else gWishFutureKnock.weatherDuration = 5; return TRUE; } + return FALSE; } -static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u8 *timer) +static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u16 *timer) { if ((!(gFieldStatuses & statusFlag) && (!gBattleStruct->isSkyBattle))) { - gFieldStatuses &= ~(STATUS_FIELD_TERRAIN_ANY | STATUS_FIELD_TERRAIN_PERMANENT); + gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; gDisableStructs[battler].terrainAbilityDone = FALSE; if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) - *timer = 8; + *timer = gBattleTurnCounter + 8; else - *timer = 5; + *timer = gBattleTurnCounter + 5; gBattleScripting.battler = battler; return TRUE; @@ -4039,7 +4106,7 @@ static void ForewarnChooseMove(u32 battler) continue; data[count].moveId = gBattleMons[i].moves[j]; data[count].battler = i; - switch (gMovesInfo[data[count].moveId].effect) + switch (GetMoveEffect(data[count].moveId)) { case EFFECT_OHKO: data[count].power = 150; @@ -4050,12 +4117,15 @@ static void ForewarnChooseMove(u32 battler) data[count].power = 120; break; default: - if (gMovesInfo[data[count].moveId].power == 1) + { + u32 movePower = GetMovePower(data[count].moveId); + if (movePower == 1) data[count].power = 80; else - data[count].power = gMovesInfo[data[count].moveId].power; + data[count].power = movePower; break; } + } count++; } } @@ -4109,7 +4179,7 @@ static inline u8 GetBattlerSideFaintCounter(u32 battler) // Supreme Overlord adds a x0.1 damage boost for each fainted ally. static inline uq4_12_t GetSupremeOverlordModifier(u32 battler) { - return UQ_4_12(1.0) + (UQ_4_12(0.1) * gBattleStruct->supremeOverlordCounter[battler]); + return UQ_4_12(1.0) + (PercentToUQ4_12(gBattleStruct->supremeOverlordCounter[battler] * 10)); } static inline bool32 HadMoreThanHalfHpNowDoesnt(u32 battler) @@ -4168,67 +4238,87 @@ static void ChooseStatBoostAnimation(u32 battler) #undef ANIM_STAT_ACC #undef ANIM_STAT_EVASION -u32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef) +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef, enum AbilityEffectOptions option) { - enum MoveBlocked effect = MOVE_BLOCKED_BY_NO_ABILITY; + const u8 *battleScriptBlocksMove = NULL; + u32 atkPriority = AI_DATA->aiCalcInProgress ? GetBattleMovePriority(battlerAtk, move) : GetChosenMovePriority(battlerAtk); + u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); + u32 battlerAbility = battlerDef; switch (abilityDef) { case ABILITY_SOUNDPROOF: - if (gMovesInfo[move].soundMove && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) - effect = MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF; + if (IsSoundMove(move) && !(moveTarget & MOVE_TARGET_USER)) + { + if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + battleScriptBlocksMove = BattleScript_SoundproofProtected; + } break; case ABILITY_BULLETPROOF: - if (gMovesInfo[move].ballisticMove) - effect = MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF; + if (IsBallisticMove(move)) + { + if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + battleScriptBlocksMove = BattleScript_SoundproofProtected; + } break; case ABILITY_DAZZLING: case ABILITY_QUEENLY_MAJESTY: case ABILITY_ARMOR_TAIL: - if (GetBattlerSide(battlerAtk) != GetBattlerSide(battlerDef)) + if (atkPriority > 0 && !IsBattlerAlly(battlerAtk, battlerDef)) { - u32 priority = AI_DATA->aiCalcInProgress ? GetMovePriority(battlerAtk, move) : GetChosenMovePriority(battlerAtk); - if (priority > 0) - effect = MOVE_BLOCKED_BY_DAZZLING; + if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + battleScriptBlocksMove = BattleScript_DazzlingProtected; } break; case ABILITY_GOOD_AS_GOLD: - if (IS_MOVE_STATUS(move)) + if (IsBattleMoveStatus(move)) { - u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); if (!(moveTarget & MOVE_TARGET_OPPONENTS_FIELD) && !(moveTarget & MOVE_TARGET_ALL_BATTLERS)) - effect = MOVE_BLOCKED_BY_GOOD_AS_GOLD; + battleScriptBlocksMove = BattleScript_GoodAsGoldActivates; } break; } - if (!effect) - effect = CanPartnerAbilityBlockMove(battlerAtk, battlerDef, move, GetBattlerAbility(BATTLE_PARTNER(battlerDef))); - return effect; -} - -u32 CanPartnerAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef) -{ - switch (abilityDef) + // Check def partner ability + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battlerDef))) { - case ABILITY_DAZZLING: - case ABILITY_QUEENLY_MAJESTY: - case ABILITY_ARMOR_TAIL: - if (GetBattlerSide(battlerAtk) != GetBattlerSide(battlerDef)) + switch (GetBattlerAbility(BATTLE_PARTNER(battlerDef))) { - s32 priority = AI_DATA->aiCalcInProgress ? GetMovePriority(battlerAtk, move) : GetChosenMovePriority(battlerAtk); - if (priority > 0) - return MOVE_BLOCKED_BY_PARTNER_DAZZLING; + case ABILITY_DAZZLING: + case ABILITY_QUEENLY_MAJESTY: + case ABILITY_ARMOR_TAIL: + if (atkPriority > 0 && !IsBattlerAlly(battlerAtk, BATTLE_PARTNER(battlerDef))) + { + if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + battlerAbility = BATTLE_PARTNER(battlerDef); + battleScriptBlocksMove = BattleScript_DazzlingProtected; + } + break; } - break; } - return MOVE_BLOCKED_BY_NO_ABILITY; + + if (battleScriptBlocksMove == NULL) + return FALSE; + + if (option == ABILITY_RUN_SCRIPT) + { + gBattleScripting.battler = gBattlerAbility = battlerAbility; + gBattlescriptCurrInstr = battleScriptBlocksMove; + } + return TRUE; } -u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType) +bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum AbilityEffectOptions option) { enum MoveAbsorbed effect = MOVE_ABSORBED_BY_NO_ABILITY; + const u8 *battleScript = NULL; + u32 statId = 0; + u32 statAmount = 1; switch (abilityDef) { @@ -4236,7 +4326,7 @@ u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 mov effect = MOVE_ABSORBED_BY_NO_ABILITY; break; case ABILITY_VOLT_ABSORB: - if (moveType == TYPE_ELECTRIC && gMovesInfo[move].target != MOVE_TARGET_ALL_BATTLERS) + if (moveType == TYPE_ELECTRIC && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS) effect = MOVE_ABSORBED_BY_DRAIN_HP_ABILITY; break; case ABILITY_WATER_ABSORB: @@ -4249,28 +4339,47 @@ u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 mov effect = MOVE_ABSORBED_BY_DRAIN_HP_ABILITY; break; case ABILITY_MOTOR_DRIVE: - if (moveType == TYPE_ELECTRIC && gMovesInfo[move].target != MOVE_TARGET_ALL_BATTLERS) // Potential bug in singles (might be solved with simu hp reudction) + if (moveType == TYPE_ELECTRIC && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS) // Potential bug in singles (might be solved with simu hp reudction) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statId = STAT_SPEED; + } break; case ABILITY_LIGHTNING_ROD: - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_ELECTRIC && gMovesInfo[move].target != MOVE_TARGET_ALL_BATTLERS) // Potential bug in singles (might be solved with simu hp reudction) + if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_ELECTRIC && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS) // Potential bug in singles (might be solved with simu hp reudction) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statId = STAT_SPATK; + } break; case ABILITY_STORM_DRAIN: if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_WATER) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statId = STAT_SPATK; + } break; case ABILITY_SAP_SIPPER: if (moveType == TYPE_GRASS) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statId = STAT_ATK; + } break; case ABILITY_WELL_BAKED_BODY: if (moveType == TYPE_FIRE) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statAmount = 2; + statId = STAT_DEF; + } break; case ABILITY_WIND_RIDER: - if (gMovesInfo[move].windMove && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) + if (IsWindMove(move) && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) + { effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; + statId = STAT_ATK; + } break; case ABILITY_FLASH_FIRE: if (moveType == TYPE_FIRE && (B_FLASH_FIRE_FROZEN >= GEN_5 || !(gBattleMons[battlerDef].status1 & STATUS1_FREEZE))) @@ -4278,9 +4387,124 @@ u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 mov break; } + if (effect == MOVE_ABSORBED_BY_NO_ABILITY || option == ABILITY_CHECK_TRIGGER) + return effect; + + switch (effect) + { + default: + return FALSE; + case MOVE_ABSORBED_BY_DRAIN_HP_ABILITY: + gBattleStruct->pledgeMove = FALSE; + if (IsBattlerAtMaxHp(battlerDef) || (B_HEAL_BLOCKING >= GEN_5 && gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK)) + { + if ((gProtectStructs[battlerAtk].notFirstStrike)) + battleScript = BattleScript_MonMadeMoveUseless; + else + battleScript = BattleScript_MonMadeMoveUseless_PPLoss; + } + else + { + if (gProtectStructs[battlerAtk].notFirstStrike) + battleScript = BattleScript_MoveHPDrain; + else + battleScript = BattleScript_MoveHPDrain_PPLoss; + + gBattleStruct->moveDamage[battlerDef] = GetNonDynamaxMaxHP(battlerDef) / 4; + if (gBattleStruct->moveDamage[battlerDef] == 0) + gBattleStruct->moveDamage[battlerDef] = 1; + gBattleStruct->moveDamage[battlerDef] *= -1; + } + break; + case MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY: + gBattleStruct->pledgeMove = FALSE; + if (!CompareStat(battlerDef, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + if ((gProtectStructs[battlerAtk].notFirstStrike)) + battleScript = BattleScript_MonMadeMoveUseless; + else + battleScript = BattleScript_MonMadeMoveUseless_PPLoss; + } + else + { + if (gProtectStructs[battlerAtk].notFirstStrike) + battleScript = BattleScript_MoveStatDrain; + else + battleScript = BattleScript_MoveStatDrain_PPLoss; + + SET_STATCHANGER(statId, statAmount, FALSE); + if (B_ABSORBING_ABILITY_STRING < GEN_5) + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); + } + break; + case MOVE_ABSORBED_BY_BOOST_FLASH_FIRE: + gBattleStruct->pledgeMove = FALSE; + if (!gDisableStructs[battlerDef].flashFireBoosted) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; + if (gProtectStructs[battlerAtk].notFirstStrike) + battleScript = BattleScript_FlashFireBoost; + else + battleScript = BattleScript_FlashFireBoost_PPLoss; + gDisableStructs[battlerDef].flashFireBoosted = TRUE; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; + if (gProtectStructs[battlerAtk].notFirstStrike) + battleScript = BattleScript_FlashFireBoost; + else + battleScript = BattleScript_FlashFireBoost_PPLoss; + } + break; + } + + if (battleScript != NULL) + { + gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. + gBattlescriptCurrInstr = battleScript; + } + return effect; } +static inline u32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 *timer) +{ + if (!(gFieldStatuses & flag)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = message; + gFieldStatuses |= flag; + gBattleScripting.animArg1 = anim; + if (gBattleStruct->startingStatusTimer) + *timer = gBattleTurnCounter + gBattleStruct->startingStatusTimer; + else + *timer = 0; // Infinite + + return 1; + } + + return 0; +} + +static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 anim, u16 *timer) +{ + if (!(gSideStatuses[side] & flag)) + { + gBattlerAttacker = gBattlerTarget = side; + gBattleCommunication[MULTISTRING_CHOOSER] = message; + gSideStatuses[side] |= flag; + gBattleScripting.animArg1 = anim; + if (gBattleStruct->startingStatusTimer) + *timer = gBattleTurnCounter + gBattleStruct->startingStatusTimer; + else + *timer = 0; // Infinite + + return 1; + } + + return 0; +} + u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg) { u32 effect = 0; @@ -4306,131 +4530,116 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 else move = gCurrentMove; - moveType = GetMoveType(move); + moveType = GetBattleMoveType(move); switch (caseID) { case ABILITYEFFECT_SWITCH_IN_STATUSES: // starting field/side/etc statuses with a variable { - u8 timerVal = gBattleStruct->startingStatusTimer; - gBattleScripting.battler = battler; switch (gBattleStruct->startingStatus) { case STARTING_STATUS_ELECTRIC_TERRAIN: - if (!(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; - gFieldStatuses |= STATUS_FIELD_ELECTRIC_TERRAIN; - if (timerVal == 0) - gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT; - else - gFieldTimers.terrainTimer = timerVal; - effect = 2; - } + effect = SetStartingFieldStatus(STATUS_FIELD_ELECTRIC_TERRAIN, + B_MSG_TERRAIN_SET_ELECTRIC, + 0, + &gFieldTimers.terrainTimer); + effect = (effect == 1) ? 2 : 0; break; case STARTING_STATUS_MISTY_TERRAIN: - if (!(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; - gFieldStatuses |= STATUS_FIELD_MISTY_TERRAIN; - if (timerVal == 0) - gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT; - else - gFieldTimers.terrainTimer = timerVal; - effect = 2; - } + effect = SetStartingFieldStatus(STATUS_FIELD_MISTY_TERRAIN, + B_MSG_TERRAIN_SET_MISTY, + 0, + &gFieldTimers.terrainTimer); + effect = (effect == 1) ? 2 : 0; break; case STARTING_STATUS_GRASSY_TERRAIN: - if (!(gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; - gFieldStatuses |= STATUS_FIELD_GRASSY_TERRAIN; - if (timerVal == 0) - gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT; - else - gFieldTimers.terrainTimer = timerVal; - effect = 2; - } + effect = SetStartingFieldStatus(STATUS_FIELD_GRASSY_TERRAIN, + B_MSG_TERRAIN_SET_GRASSY, + 0, + &gFieldTimers.terrainTimer); + effect = (effect == 1) ? 2 : 0; break; case STARTING_STATUS_PSYCHIC_TERRAIN: - if (!(gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; - gFieldStatuses |= STATUS_FIELD_PSYCHIC_TERRAIN; - if (timerVal == 0) - gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT; - else - gFieldTimers.terrainTimer = timerVal; - effect = 2; - } + effect = SetStartingFieldStatus(STATUS_FIELD_PSYCHIC_TERRAIN, + B_MSG_TERRAIN_SET_PSYCHIC, + 0, + &gFieldTimers.terrainTimer); + effect = (effect == 1) ? 2 : 0; break; case STARTING_STATUS_TRICK_ROOM: - if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_TRICK_ROOM; - gFieldStatuses |= STATUS_FIELD_TRICK_ROOM; - gBattleScripting.animArg1 = B_ANIM_TRICK_ROOM; - if (timerVal == 0) - gFieldTimers.trickRoomTimer = 0; // infinite - else - gFieldTimers.trickRoomTimer = 5; - effect = 1; - } + effect = SetStartingFieldStatus(STATUS_FIELD_TRICK_ROOM, + B_MSG_SET_TRICK_ROOM, + B_ANIM_TRICK_ROOM, + &gFieldTimers.trickRoomTimer); break; case STARTING_STATUS_MAGIC_ROOM: - if (!(gFieldStatuses & STATUS_FIELD_MAGIC_ROOM)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MAGIC_ROOM; - gFieldStatuses |= STATUS_FIELD_MAGIC_ROOM; - gBattleScripting.animArg1 = B_ANIM_MAGIC_ROOM; - if (timerVal == 0) - gFieldTimers.magicRoomTimer = 0; // infinite - else - gFieldTimers.magicRoomTimer = 5; - effect = 1; - } + effect = SetStartingFieldStatus(STATUS_FIELD_MAGIC_ROOM, + B_MSG_SET_MAGIC_ROOM, + B_ANIM_MAGIC_ROOM, + &gFieldTimers.magicRoomTimer); break; case STARTING_STATUS_WONDER_ROOM: - if (!(gFieldStatuses & STATUS_FIELD_WONDER_ROOM)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_WONDER_ROOM; - gFieldStatuses |= STATUS_FIELD_WONDER_ROOM; - gBattleScripting.animArg1 = B_ANIM_WONDER_ROOM; - if (timerVal == 0) - gFieldTimers.wonderRoomTimer = 0; // infinite - else - gFieldTimers.wonderRoomTimer = 5; - effect = 1; - } + effect = SetStartingFieldStatus(STATUS_FIELD_WONDER_ROOM, + B_MSG_SET_WONDER_ROOM, + B_ANIM_WONDER_ROOM, + &gFieldTimers.wonderRoomTimer); break; case STARTING_STATUS_TAILWIND_PLAYER: - if (!(gSideStatuses[B_SIDE_PLAYER] & SIDE_STATUS_TAILWIND)) - { - gBattlerAttacker = B_POSITION_PLAYER_LEFT; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_TAILWIND_PLAYER; - gSideStatuses[B_SIDE_PLAYER] |= SIDE_STATUS_TAILWIND; - gBattleScripting.animArg1 = B_ANIM_TAILWIND; - if (timerVal == 0) - gSideTimers[B_SIDE_PLAYER].tailwindTimer = 0; // infinite - else - gSideTimers[B_SIDE_PLAYER].tailwindTimer = 5; - effect = 1; - } + effect = SetStartingSideStatus(SIDE_STATUS_TAILWIND, + B_SIDE_PLAYER, + B_MSG_SET_TAILWIND, + B_ANIM_TAILWIND, + &gSideTimers[B_SIDE_PLAYER].tailwindTimer); break; case STARTING_STATUS_TAILWIND_OPPONENT: - if (!(gSideStatuses[B_SIDE_OPPONENT] & SIDE_STATUS_TAILWIND)) - { - gBattlerAttacker = B_POSITION_OPPONENT_LEFT; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_TAILWIND_OPPONENT; - gSideStatuses[B_SIDE_OPPONENT] |= SIDE_STATUS_TAILWIND; - gBattleScripting.animArg1 = B_ANIM_TAILWIND; - if (timerVal == 0) - gSideTimers[B_SIDE_OPPONENT].tailwindTimer = 0; // infinite - else - gSideTimers[B_SIDE_OPPONENT].tailwindTimer = 5; - effect = 1; - } + effect = SetStartingSideStatus(SIDE_STATUS_TAILWIND, + B_SIDE_OPPONENT, + B_MSG_SET_TAILWIND, + B_ANIM_TAILWIND, + &gSideTimers[B_SIDE_OPPONENT].tailwindTimer); + break; + case STARTING_STATUS_RAINBOW_PLAYER: + effect = SetStartingSideStatus(SIDE_STATUS_RAINBOW, + B_SIDE_PLAYER, + B_MSG_SET_RAINBOW, + B_ANIM_RAINBOW, + &gSideTimers[B_SIDE_PLAYER].rainbowTimer); + break; + case STARTING_STATUS_RAINBOW_OPPONENT: + effect = SetStartingSideStatus(SIDE_STATUS_RAINBOW, + B_SIDE_OPPONENT, + B_MSG_SET_RAINBOW, + B_ANIM_RAINBOW, + &gSideTimers[B_SIDE_OPPONENT].rainbowTimer); + break; + case STARTING_STATUS_SEA_OF_FIRE_PLAYER: + effect = SetStartingSideStatus(SIDE_STATUS_SEA_OF_FIRE, + B_SIDE_PLAYER, + B_MSG_SET_SEA_OF_FIRE, + B_ANIM_SEA_OF_FIRE, + &gSideTimers[B_SIDE_PLAYER].seaOfFireTimer); + break; + case STARTING_STATUS_SEA_OF_FIRE_OPPONENT: + effect = SetStartingSideStatus(SIDE_STATUS_SEA_OF_FIRE, + B_SIDE_OPPONENT, + B_MSG_SET_SEA_OF_FIRE, + B_ANIM_SEA_OF_FIRE, + &gSideTimers[B_SIDE_OPPONENT].seaOfFireTimer); + break; + case STARTING_STATUS_SWAMP_PLAYER: + effect = SetStartingSideStatus(SIDE_STATUS_SWAMP, + B_SIDE_PLAYER, + B_MSG_SET_SWAMP, + B_ANIM_SWAMP, + &gSideTimers[B_SIDE_PLAYER].swampTimer); + break; + case STARTING_STATUS_SWAMP_OPPONENT: + effect = SetStartingSideStatus(SIDE_STATUS_SWAMP, + B_SIDE_OPPONENT, + B_MSG_SET_SWAMP, + B_ANIM_SWAMP, + &gSideTimers[B_SIDE_OPPONENT].swampTimer); break; } @@ -4446,7 +4655,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM) { // overworld weather started rain, so just do electric terrain anim - gFieldStatuses = (STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT); + gFieldStatuses = STATUS_FIELD_ELECTRIC_TERRAIN; + gFieldTimers.terrainTimer = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); effect++; @@ -4455,7 +4665,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && (GetCurrentWeather() == WEATHER_FOG_HORIZONTAL || GetCurrentWeather() == WEATHER_FOG_DIAGONAL) && !(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) { - gFieldStatuses = (STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT); + gFieldStatuses = STATUS_FIELD_MISTY_TERRAIN; + gFieldTimers.terrainTimer = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); effect++; @@ -4472,7 +4683,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case WEATHER_DOWNPOUR: if (!(gBattleWeather & B_WEATHER_RAIN)) { - gBattleWeather = (B_WEATHER_RAIN_TEMPORARY | B_WEATHER_RAIN_PERMANENT); + gBattleWeather = B_WEATHER_RAIN_NORMAL; gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; effect++; } @@ -4488,7 +4699,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case WEATHER_DROUGHT: if (!(gBattleWeather & B_WEATHER_SUN)) { - gBattleWeather = (B_WEATHER_SUN_PERMANENT | B_WEATHER_SUN_TEMPORARY); + gBattleWeather = B_WEATHER_SUN_NORMAL; gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES; effect++; } @@ -4626,7 +4837,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_UNNERVE: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerAtPosition(battler))); + gBattlerTarget = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_UNNERVE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); @@ -4637,7 +4848,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_AS_ONE_SHADOW_RIDER: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerAtPosition(battler))); + gBattlerTarget = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ASONE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_ActivateAsOne); @@ -4677,7 +4888,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 for (j = 0; j < MAX_MON_MOVES; j++) { move = gBattleMons[i].moves[j]; - moveType = GetMoveType(move); + moveType = GetBattleMoveType(move); if (CalcTypeEffectivenessMultiplier(move, moveType, i, battler, ABILITY_ANTICIPATION, FALSE) >= UQ_4_12(2.0)) { effect++; @@ -4806,12 +5017,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_DRIZZLE: - if (TryChangeBattleWeather(battler, ENUM_WEATHER_RAIN, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_RAIN, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); effect++; } - else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && WEATHER_HAS_EFFECT && !gSpecialStatuses[battler].switchInAbilityDone) + else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect() && !gSpecialStatuses[battler].switchInAbilityDone) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); @@ -4819,12 +5030,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_SAND_STREAM: - if (TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); effect++; } - else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && WEATHER_HAS_EFFECT && !gSpecialStatuses[battler].switchInAbilityDone) + else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect() && !gSpecialStatuses[battler].switchInAbilityDone) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); @@ -4832,12 +5043,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_DROUGHT: - if (TryChangeBattleWeather(battler, ENUM_WEATHER_SUN, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); effect++; } - else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && WEATHER_HAS_EFFECT && !gSpecialStatuses[battler].switchInAbilityDone) + else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect() && !gSpecialStatuses[battler].switchInAbilityDone) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); @@ -4845,17 +5056,17 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_SNOW_WARNING: - if (B_SNOW_WARNING >= GEN_9 && TryChangeBattleWeather(battler, ENUM_WEATHER_SNOW, TRUE)) + if (B_SNOW_WARNING >= GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_SNOW, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivatesSnow); effect++; } - else if (B_SNOW_WARNING < GEN_9 && TryChangeBattleWeather(battler, ENUM_WEATHER_HAIL, TRUE)) + else if (B_SNOW_WARNING < GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_HAIL, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivatesHail); effect++; } - else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && WEATHER_HAS_EFFECT && !gSpecialStatuses[battler].switchInAbilityDone) + else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect() && !gSpecialStatuses[battler].switchInAbilityDone) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); @@ -4984,21 +5195,21 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_DESOLATE_LAND: - if (TryChangeBattleWeather(battler, ENUM_WEATHER_SUN_PRIMAL, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN_PRIMAL, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_DesolateLandActivates); effect++; } break; case ABILITY_PRIMORDIAL_SEA: - if (TryChangeBattleWeather(battler, ENUM_WEATHER_RAIN_PRIMAL, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_RAIN_PRIMAL, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_PrimordialSeaActivates); effect++; } break; case ABILITY_DELTA_STREAM: - if (TryChangeBattleWeather(battler, ENUM_WEATHER_STRONG_WINDS, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_STRONG_WINDS, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_DeltaStreamActivates); effect++; @@ -5041,7 +5252,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ORICHALCUM_PULSE: - if (TryChangeBattleWeather(battler, ENUM_WEATHER_SUN, TRUE)) + if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); effect++; @@ -5099,7 +5310,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattlerTarget = partner; gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattleMoveDamage = (GetNonDynamaxMaxHP(partner) / 4) * -1; + gBattleStruct->moveDamage[partner] = (GetNonDynamaxMaxHP(partner) / 4) * -1; BattleScriptPushCursorAndCallback(BattleScript_HospitalityActivates); effect++; } @@ -5167,7 +5378,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 SaveBattlerAttacker(gBattlerAttacker); gSpecialStatuses[battler].switchInAbilityDone = TRUE; gBattlerAttacker = partner; - gBattleStruct->commandingDondozo |= 1u << battler; + gBattleStruct->battlerState[battler].commandingDondozo = TRUE; gBattleStruct->commanderActive[partner] = gBattleMons[battler].species; gStatuses3[battler] |= STATUS3_COMMANDER; if (gBattleMons[battler].status2 & STATUS2_CONFUSION @@ -5215,14 +5426,14 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 // Dry Skin works similarly to Rain Dish in Rain case ABILITY_RAIN_DISH: if (IsBattlerWeatherAffected(battler, B_WEATHER_RAIN) - && !BATTLER_MAX_HP(battler) + && !IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8); + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; effect++; } break; @@ -5241,7 +5452,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON)) StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); if (gBattleMons[battler].status1 & STATUS1_SLEEP) + { StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + } + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); if (gBattleMons[battler].status1 & STATUS1_BURN) @@ -5318,9 +5533,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { SOLAR_POWER_HP_DROP: BattleScriptPushCursorAndCallback(BattleScript_SolarPowerActivates); - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; effect++; } break; @@ -5385,160 +5600,42 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITYEFFECT_WOULD_BLOCK: - effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility); + effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility, ABILITY_CHECK_TRIGGER); if (effect && gLastUsedAbility != 0xFFFF) RecordAbilityBattle(battler, gLastUsedAbility); - break; + return effect; case ABILITYEFFECT_MOVES_BLOCK: + effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility, ABILITY_RUN_SCRIPT); + + // prankster check + if (effect == 0 + && GetChosenMovePriority(gBattlerAttacker) > 0 + && BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) + && !(IsBattleMoveStatus(move) && (gLastUsedAbility == ABILITY_MAGIC_BOUNCE || gProtectStructs[gBattlerTarget].bounceMove))) { - effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility); - const u8 * battleScriptBlocksMove = NULL; - switch (effect) - { - case MOVE_BLOCKED_BY_SOUNDPROOF_OR_BULLETPROOF: - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - battleScriptBlocksMove = BattleScript_SoundproofProtected; - break; - case MOVE_BLOCKED_BY_DAZZLING: - case MOVE_BLOCKED_BY_PARTNER_DAZZLING: - if (effect == MOVE_BLOCKED_BY_PARTNER_DAZZLING) - gBattleScripting.battler = BATTLE_PARTNER(battler); - else - gBattleScripting.battler = battler; - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - battleScriptBlocksMove = BattleScript_DazzlingProtected; - break; - case MOVE_BLOCKED_BY_GOOD_AS_GOLD: - battleScriptBlocksMove = BattleScript_GoodAsGoldActivates; - break; - default: - if (GetChosenMovePriority(gBattlerAttacker) > 0 - && BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) - && !(IS_MOVE_STATUS(move) && (gLastUsedAbility == ABILITY_MAGIC_BOUNCE || gProtectStructs[gBattlerTarget].bounceMove))) - { - if (!IsDoubleBattle() - || !(GetBattlerMoveTargetType(gBattlerAttacker, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) - CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected - gBattleScripting.battler = gBattlerAbility = gBattlerTarget; - battleScriptBlocksMove = BattleScript_DarkTypePreventsPrankster; - effect = 1; - } - } - if (effect) - gBattlescriptCurrInstr = battleScriptBlocksMove; + if (!IsDoubleBattle() + || !(GetBattlerMoveTargetType(gBattlerAttacker, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) + CancelMultiTurnMoves(gBattlerAttacker); // Don't cancel moves that can hit two targets bc one target might not be protected + gBattleScripting.battler = gBattlerAbility = gBattlerTarget; + gBattlescriptCurrInstr = BattleScript_DarkTypePreventsPrankster; + effect = 1; } break; case ABILITYEFFECT_WOULD_ABSORB: - effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType); + effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType, ABILITY_CHECK_TRIGGER); gBattleStruct->pledgeMove = FALSE; if (effect && gLastUsedAbility != 0xFFFF) RecordAbilityBattle(battler, gLastUsedAbility); return effect; case ABILITYEFFECT_ABSORBING: - { - u32 statId = 0; - u32 statAmount = 1; - effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType); - if (effect) - { - switch(gLastUsedAbility) - { - case ABILITY_MOTOR_DRIVE: - statId = STAT_SPEED; - break; - case ABILITY_LIGHTNING_ROD: - case ABILITY_STORM_DRAIN: - statId = STAT_SPATK; - break; - case ABILITY_SAP_SIPPER: - case ABILITY_WIND_RIDER: - statId = STAT_ATK; - break; - case ABILITY_WELL_BAKED_BODY: - statAmount = 2; - statId = STAT_DEF; - break; - } - } - switch (effect) - { - case MOVE_ABSORBED_BY_DRAIN_HP_ABILITY: - gBattleStruct->pledgeMove = FALSE; - if (BATTLER_MAX_HP(battler) || (B_HEAL_BLOCKING >= GEN_5 && gStatuses3[battler] & STATUS3_HEAL_BLOCK)) - { - if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) - gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; - else - gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss; - } - else - { - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain; - else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; - - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - } - break; - case MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY: - gBattleStruct->pledgeMove = FALSE; - if (!CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) - gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; - else - gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss; - } - else - { - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_MoveStatDrain; - else - gBattlescriptCurrInstr = BattleScript_MoveStatDrain_PPLoss; - - SET_STATCHANGER(statId, statAmount, FALSE); - if (B_ABSORBING_ABILITY_STRING < GEN_5) - PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); - } - break; - case MOVE_ABSORBED_BY_BOOST_FLASH_FIRE: - gBattleStruct->pledgeMove = FALSE; - if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_FlashFireBoost; - else - gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_FLASH_FIRE; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_FlashFireBoost; - else - gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - } - break; - } - if (effect) - gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. - - } + effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType, ABILITY_RUN_SCRIPT); break; case ABILITYEFFECT_MOVE_END: // Think contact abilities. switch (gLastUsedAbility) { case ABILITY_JUSTIFIED: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && moveType == TYPE_DARK && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -5551,8 +5648,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_RATTLED: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && (moveType == TYPE_DARK || moveType == TYPE_BUG || moveType == TYPE_GHOST) && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -5565,8 +5662,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_WATER_COMPACTION: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && moveType == TYPE_WATER && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -5579,9 +5676,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_STAMINA: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && gBattlerAttacker != gBattlerTarget - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN)) { @@ -5593,8 +5690,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_BERSERK: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && HadMoreThanHalfHpNowDoesnt(battler) && (gMultiHitCounter == 0 || gMultiHitCounter == 1) @@ -5610,8 +5707,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_EMERGENCY_EXIT: case ABILITY_WIMP_OUT: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) // Had more than half of hp before, now has less && HadMoreThanHalfHpNowDoesnt(battler) @@ -5623,19 +5720,19 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 // Not currently held by Sky Drop && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) { - gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_EMERGENCY_EXIT; + gDisableStructs[battler].startEmergencyExit = TRUE; effect++; } break; case ABILITY_WEAK_ARMOR: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) - && IS_MOVE_PHYSICAL(gCurrentMove) + && IsBattleMovePhysical(gCurrentMove) && (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) // Don't activate if both Speed and Defense cannot be raised. || CompareStat(battler, STAT_DEF, MIN_STAT_STAGE, CMP_GREATER_THAN))) { - if (gMovesInfo[gCurrentMove].effect == EFFECT_HIT_ESCAPE && CanBattlerSwitch(gBattlerAttacker)) + if (GetMoveEffect(gCurrentMove) == EFFECT_HIT_ESCAPE && CanBattlerSwitch(gBattlerAttacker)) gProtectStructs[battler].disableEjectPack = TRUE; // Set flag for target BattleScriptPushCursor(); @@ -5644,8 +5741,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_CURSED_BODY: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget) && gDisableStructs[gBattlerAttacker].disabledMove == MOVE_NONE && IsBattlerAlive(gBattlerAttacker) && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL) @@ -5663,12 +5760,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_LINGERING_AROMA: case ABILITY_MUMMY: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker) - && gBattleStruct->overwrittenAbilities[gBattlerAttacker] != GetBattlerAbility(gBattlerTarget) + && gDisableStructs[gBattlerAttacker].overwrittenAbility != GetBattlerAbility(gBattlerTarget) && gBattleMons[gBattlerAttacker].ability != ABILITY_MUMMY && gBattleMons[gBattlerAttacker].ability != ABILITY_LINGERING_AROMA && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSuppressed) @@ -5680,7 +5777,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; - gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = gBattleMons[gBattlerTarget].ability; + gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MummyActivates; effect++; @@ -5688,9 +5785,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_WANDERING_SPIRIT: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker) && !(GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) @@ -5703,8 +5800,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; - gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = gBattleMons[gBattlerTarget].ability; - gBattleMons[gBattlerTarget].ability = gBattleStruct->overwrittenAbilities[gBattlerTarget] = gLastUsedAbility; + gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; + gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gLastUsedAbility; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WanderingSpiritActivates; effect++; @@ -5712,9 +5809,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ANGER_POINT: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gIsCriticalHit - && TARGET_TURN_DAMAGED + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) + && gSpecialStatuses[battler].criticalHit + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) { @@ -5725,10 +5822,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_COLOR_CHANGE: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) && move != MOVE_STRUGGLE - && !IS_MOVE_STATUS(move) - && TARGET_TURN_DAMAGED + && !IsBattleMoveStatus(move) + && IsBattlerTurnDamaged(gBattlerTarget) && !IS_BATTLER_OF_TYPE(battler, moveType) && moveType != TYPE_STELLAR && moveType != TYPE_MYSTERY @@ -5743,11 +5840,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_GOOEY: case ABILITY_TANGLING_HAIR: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && (CompareStat(gBattlerAttacker, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN) || GetBattlerAbility(gBattlerAttacker) == ABILITY_MIRROR_ARMOR) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker)) { @@ -5761,16 +5858,16 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_ROUGH_SKIN: case ABILITY_IRON_BARBS: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker)) { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16); + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; @@ -5778,13 +5875,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_AFTERMATH: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker)) { - u32 battler; if ((battler = IsAbilityOnField(ABILITY_DAMP))) { gBattleScripting.battler = battler - 1; @@ -5793,9 +5889,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } else { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_AftermathDmg; } @@ -5803,31 +5899,22 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_INNARDS_OUT: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) { - //special Future Sight handling - if (gMovesInfo[gCurrentMove].effect == EFFECT_FUTURE_SIGHT) + // Prevent Innards Out effect if Future Sight user is currently not on field + if (GetMoveEffect(gCurrentMove) == EFFECT_FUTURE_SIGHT) { - //no Innards Out effect if Future Sight user is currently not on field - if (gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] == gBattlerPartyIndexes[gBattlerAttacker] - || gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] == BATTLE_PARTNER(gBattlerPartyIndexes[gBattlerAttacker])) - { - gBattleMoveDamage = gWishFutureKnock.futureSightDmg; - gWishFutureKnock.futureSightDmg = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AftermathDmg; - effect++; - } - } - else - { - gBattleMoveDamage = gSpecialStatuses[gBattlerTarget].shellBellDmg; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AftermathDmg; - effect++; + if (gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] != gBattlerPartyIndexes[gBattlerAttacker] + && gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] != BATTLE_PARTNER(gBattlerPartyIndexes[gBattlerAttacker])) + break; } + + gBattleStruct->moveDamage[gBattlerAttacker] = gBattleStruct->moveDamage[gBattlerTarget]; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AftermathDmg; + effect++; } break; case ABILITY_EFFECT_SPORE: @@ -5858,14 +5945,16 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 goto STATIC; // Sleep if (i < sleep - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED - && CanBeSlept(gBattlerAttacker, ability) + && IsBattlerTurnDamaged(gBattlerTarget) + && CanBeSlept(gBattlerAttacker, ability, NOT_BLOCKED_BY_SLEEP_CLAUSE) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker)) { + if (IsSleepClauseEnabled()) + gBattleStruct->battlerState[gBattlerAttacker].sleepClauseEffectExempt = TRUE; gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_SLEEP; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptPushCursor(); @@ -5880,10 +5969,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3)) { POISON_POINT: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && CanBePoisoned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker)) @@ -5901,10 +5990,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3)) { STATIC: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && CanBeParalyzed(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker)) @@ -5919,12 +6008,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_FLAME_BODY: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && (IsMoveMakingContact(move, gBattlerAttacker)) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && CanBeBurned(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_FLAME_BODY, 30) : RandomChance(RNG_FLAME_BODY, 1, 3))) { @@ -5937,10 +6026,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_CUTE_CHARM: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_CUTE_CHARM, 30) : RandomChance(RNG_CUTE_CHARM, 1, 3)) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) @@ -5957,7 +6046,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ILLUSION: - if (gBattleStruct->illusion[gBattlerTarget].on && !gBattleStruct->illusion[gBattlerTarget].broken && TARGET_TURN_DAMAGED) + if (gBattleStruct->illusion[gBattlerTarget].on && !gBattleStruct->illusion[gBattlerTarget].broken && IsBattlerTurnDamaged(gBattlerTarget)) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_IllusionOff; @@ -5965,10 +6054,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_COTTON_DOWN: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED) + && IsBattlerTurnDamaged(gBattlerTarget)) { gEffectBattler = gBattlerTarget; BattleScriptPushCursor(); @@ -5977,8 +6066,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_STEAM_ENGINE: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) && (moveType == TYPE_FIRE || moveType == TYPE_WATER)) @@ -5991,18 +6080,18 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_SAND_SPIT: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED - && !(gBattleWeather & B_WEATHER_SANDSTORM && WEATHER_HAS_EFFECT)) + && IsBattlerTurnDamaged(gBattlerTarget) + && !(gBattleWeather & B_WEATHER_SANDSTORM && HasWeatherEffect())) { - if (gBattleWeather & B_WEATHER_PRIMAL_ANY && WEATHER_HAS_EFFECT) + if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect()) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BlockedByPrimalWeatherRet; effect++; } - else if (TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE)) + else if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, TRUE)) { gBattleScripting.battler = battler; BattleScriptPushCursor(); @@ -6012,9 +6101,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_PERISH_BODY: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && (IsMoveMakingContact(move, gBattlerAttacker)) @@ -6033,17 +6122,17 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_GULP_MISSILE: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT) { if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; } switch(gBattleMons[gBattlerTarget].species) @@ -6064,9 +6153,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_SEED_SOWER: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && TryChangeBattleTerrain(gBattlerTarget, STATUS_FIELD_GRASSY_TERRAIN, &gFieldTimers.terrainTimer)) { @@ -6076,8 +6165,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_THERMAL_EXCHANGE: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) && moveType == TYPE_FIRE) @@ -6090,9 +6179,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ANGER_SHELL: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && (gMultiHitCounter == 0 || gMultiHitCounter == 1) // Activates after all hits from a multi-hit move. && IsBattlerAlive(gBattlerTarget) && HadMoreThanHalfHpNowDoesnt(gBattlerTarget) @@ -6104,13 +6193,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_WIND_POWER: - if (!(gMovesInfo[gCurrentMove].windMove)) + if (!IsWindMove(gCurrentMove)) break; // fall through case ABILITY_ELECTROMORPHOSIS: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget)) { BattleScriptPushCursor(); @@ -6119,11 +6208,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_TOXIC_DEBRIS: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && (!gBattleStruct->isSkyBattle) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && IS_MOVE_PHYSICAL(gCurrentMove) - && TARGET_TURN_DAMAGED + && IsBattleMovePhysical(gCurrentMove) + && IsBattlerTurnDamaged(gBattlerTarget) && (gSideTimers[GetBattlerSide(gBattlerAttacker)].toxicSpikesAmount != 2)) { SWAP(gBattlerAttacker, gBattlerTarget, i); @@ -6138,13 +6227,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 switch (gLastUsedAbility) { case ABILITY_POISON_TOUCH: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget)) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker) - && TARGET_TURN_DAMAGED // Need to actually hit the target + && IsBattlerTurnDamaged(gBattlerTarget) // Need to actually hit the target && RandomPercentage(RNG_POISON_TOUCH, 30)) { gBattleScripting.moveEffect = MOVE_EFFECT_POISON; @@ -6156,11 +6245,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_TOXIC_CHAIN: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget)) - && TARGET_TURN_DAMAGED // Need to actually hit the target + && IsBattlerTurnDamaged(gBattlerTarget) // Need to actually hit the target && RandomWeighted(RNG_TOXIC_CHAIN, 7, 3)) { gBattleScripting.moveEffect = MOVE_EFFECT_TOXIC; @@ -6172,11 +6261,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_STENCH: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && RandomChance(RNG_STENCH, 1, 10) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && !MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_FLINCH)) { gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; @@ -6188,7 +6277,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_GULP_MISSILE: if ((gBattleMons[gBattlerAttacker].species == SPECIES_CRAMORANT) - && ((gCurrentMove == MOVE_SURF && TARGET_TURN_DAMAGED) || gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) + && ((gCurrentMove == MOVE_SURF && IsBattlerTurnDamaged(gBattlerTarget)) || gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) && TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_HP_PERCENT)) { BattleScriptPushCursor(); @@ -6216,13 +6305,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { case ABILITY_DANCER: if (IsBattlerAlive(battler) - && (gMovesInfo[gCurrentMove].danceMove) + && IsDanceMove(gCurrentMove) && !gSpecialStatuses[battler].dancerUsedMove && gBattlerAttacker != battler) { // Set bit and save Dancer mon's original target gSpecialStatuses[battler].dancerUsedMove = TRUE; - gSpecialStatuses[battler].dancerOriginalTarget = *(gBattleStruct->moveTarget + battler) | 0x4; + gSpecialStatuses[battler].dancerOriginalTarget = gBattleStruct->moveTarget[battler] | 0x4; gBattlerAttacker = gBattlerAbility = battler; gCalledMove = gCurrentMove; @@ -6233,7 +6322,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; // Make sure that the target isn't an ally - if it is, target the original user - if (GetBattlerSide(gBattlerTarget) == GetBattlerSide(gBattlerAttacker)) + if (IsBattlerAlly(gBattlerTarget, gBattlerAttacker)) gBattlerTarget = (gBattleScripting.savedBattler & 0xF0) >> 4; gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; BattleScriptExecute(BattleScript_DancerActivates); @@ -6297,6 +6386,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_VITAL_SPIRIT: if (gBattleMons[battler].status1 & STATUS1_SLEEP) { + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); effect = 1; @@ -6406,9 +6496,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 // Prints message only. separate from ABILITYEFFECT_ON_SWITCHIN bc activates before entry hazards for (i = 0; i < gBattlersCount; i++) { - if (gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !(gBattleResources->flags->flags[i] & RESOURCE_FLAG_NEUTRALIZING_GAS)) + if (gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !gDisableStructs[i].neutralizingGas) { - gBattleResources->flags->flags[i] |= RESOURCE_FLAG_NEUTRALIZING_GAS; + gDisableStructs[i].neutralizingGas = TRUE; gBattlerAbility = i; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); @@ -6456,7 +6546,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_FLOWER_GIFT: if ((IsBattlerWeatherAffected(battler, gBattleWeather) || gBattleWeather == B_WEATHER_NONE - || !WEATHER_HAS_EFFECT) // Air Lock active + || !HasWeatherEffect()) // Air Lock active && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_WEATHER)) { gBattleScripting.battler = battler; @@ -6465,22 +6555,32 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ICE_FACE: - if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) + { + u32 battlerWeatherAffected = IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW); + if (battlerWeatherAffected && gBattleMons[battler].species == SPECIES_EISCUE) + { + // If Hail/Snow activates when in Eiscue is in base, prevent reversion when Eiscue Noice gets broken + gDisableStructs[battler].weatherAbilityDone = TRUE; + } + if (!gDisableStructs[battler].weatherAbilityDone + && battlerWeatherAffected && gBattleMons[battler].species == SPECIES_EISCUE_NOICE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) { // TODO: Convert this to a proper FORM_CHANGE type. gBattleScripting.battler = battler; + gDisableStructs[battler].weatherAbilityDone = TRUE; gBattleMons[battler].species = SPECIES_EISCUE_ICE; BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); effect++; } break; + } case ABILITY_PROTOSYNTHESIS: if (!gDisableStructs[battler].weatherAbilityDone - && (gBattleWeather & B_WEATHER_SUN) && WEATHER_HAS_EFFECT + && (gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect() && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - && !(gBattleStruct->boosterEnergyActivates & (1u << battler))) + && !gDisableStructs[battler].boosterEnergyActivates) { gDisableStructs[battler].weatherAbilityDone = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -6509,7 +6609,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gDisableStructs[battler].terrainAbilityDone && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - && !(gBattleStruct->boosterEnergyActivates & (1u << battler))) + && !gDisableStructs[battler].boosterEnergyActivates) { gDisableStructs[battler].terrainAbilityDone = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -6533,7 +6633,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 bool32 TryPrimalReversion(u32 battler) { if (GetBattlerHoldEffect(battler, FALSE) == HOLD_EFFECT_PRIMAL_ORB - && GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) != SPECIES_NONE) + && GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) != gBattleMons[battler].species) { gBattleScripting.battler = battler; BattleScriptPushCursorAndCallback(BattleScript_PrimalReversion); @@ -6561,12 +6661,12 @@ bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability) return FALSE; return (ability == ABILITY_MOLD_BREAKER || ability == ABILITY_TERAVOLT || ability == ABILITY_TURBOBLAZE - || (ability == ABILITY_MYCELIUM_MIGHT && IS_MOVE_STATUS(gCurrentMove))); + || (ability == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gCurrentMove))); } static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, u32 ability) { - return ((IsMoldBreakerTypeAbility(battlerAtk, ability) || gMovesInfo[gCurrentMove].ignoresTargetAbility) + return ((IsMoldBreakerTypeAbility(battlerAtk, ability) || MoveIgnoresTargetAbility(gCurrentMove)) && battlerDef != battlerAtk && gAbilitiesInfo[gBattleMons[battlerDef].ability].breakable && gBattlerByTurnOrder[gCurrentTurnActionNumber] == battlerAtk @@ -6714,8 +6814,11 @@ bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag) return IsBattlerGrounded(battler); } -bool32 CanBeSlept(u32 battler, u32 ability) +bool32 CanBeSlept(u32 battler, u32 ability, enum SleepClauseBlock isBlockedBySleepClause) { + if(IsSleepClauseActiveForSide(GetBattlerSide(battler)) && isBlockedBySleepClause) + return FALSE; + if (ability == ABILITY_INSOMNIA || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_COMATOSE @@ -6723,7 +6826,7 @@ bool32 CanBeSlept(u32 battler, u32 ability) || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD || gBattleMons[battler].status1 & STATUS1_ANY || IsAbilityOnSide(battler, ABILITY_SWEET_VEIL) - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6738,7 +6841,7 @@ bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 defAbility) || defAbility == ABILITY_COMATOSE || defAbility == ABILITY_PURIFYING_SALT || IsAbilityOnSide(battlerDef, ABILITY_PASTEL_VEIL) - || IsAbilityStatusProtected(battlerDef) + || IsAbilityStatusProtected(battlerDef, defAbility) || IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6754,7 +6857,7 @@ bool32 CanBeBurned(u32 battler, u32 ability) || ability == ABILITY_COMATOSE || ability == ABILITY_THERMAL_EXCHANGE || ability == ABILITY_PURIFYING_SALT - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6768,7 +6871,7 @@ bool32 CanBeParalyzed(u32 battler, u32 ability) || ability == ABILITY_COMATOSE || ability == ABILITY_PURIFYING_SALT || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6784,7 +6887,7 @@ bool32 CanBeFrozen(u32 battler) || ability == ABILITY_COMATOSE || ability == ABILITY_PURIFYING_SALT || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6799,7 +6902,7 @@ bool32 CanGetFrostbite(u32 battler) || ability == ABILITY_COMATOSE || ability == ABILITY_PURIFYING_SALT || gBattleMons[battler].status1 & STATUS1_ANY - || IsAbilityStatusProtected(battler) + || IsAbilityStatusProtected(battler, ability) || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) return FALSE; return TRUE; @@ -6846,14 +6949,14 @@ static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, e { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / GetBattlerItemHoldEffectParam(battler, itemId); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / GetBattlerItemHoldEffectParam(battler, itemId); + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; if (GetBattlerAbility(battler) == ABILITY_RIPEN) { - gBattleMoveDamage *= 2; + gBattleStruct->moveDamage[battler] *= 2; gBattlerAbility = battler; } gBattleScripting.battler = battler; @@ -6961,7 +7064,7 @@ static enum ItemEffect TrySetMicleBerry(u32 battler, u32 itemId, enum ItemCaseId { if (HasEnoughHpToEatBerry(battler, 4, itemId)) { - gBattleStruct->usedMicleBerry |= 1u << battler; + gBattleStruct->battlerState[battler].usedMicleBerry = TRUE; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) { BattleScriptExecute(BattleScript_MicleBerryActivateEnd2); @@ -6980,14 +7083,14 @@ static enum ItemEffect TrySetEnigmaBerry(u32 battler) { if (IsBattlerAlive(battler) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && ((BATTLER_TURN_DAMAGED(battler) && gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || gBattleScripting.overrideBerryRequirements) + && ((IsBattlerTurnDamaged(battler) && gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_SUPER_EFFECTIVE) || gBattleScripting.overrideBerryRequirements) && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) { gBattleScripting.battler = battler; - gBattleMoveDamage = (gBattleMons[battler].maxHP * 25 / 100) * -1; + gBattleStruct->moveDamage[battler] = (gBattleMons[battler].maxHP * 25 / 100) * -1; if (GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleMoveDamage *= 2; + gBattleStruct->moveDamage[battler] *= 2; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; @@ -7004,7 +7107,7 @@ static enum ItemEffect DamagedStatBoostBerryEffect(u32 battler, u8 statId, u8 ca || (!DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && GetBattleMoveCategory(gCurrentMove) == category && battler != gBattlerAttacker - && BATTLER_TURN_DAMAGED(battler))) + && IsBattlerTurnDamaged(battler))) ) { BufferStatChange(battler, statId, STRINGID_STATROSE); @@ -7058,6 +7161,7 @@ static enum ItemEffect TryEjectPack(u32 battler, enum ItemCaseId caseID) { gProtectStructs[battler].statFell = FALSE; gBattleScripting.battler = battler; + AI_DATA->ejectPackSwitch = TRUE; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) { BattleScriptExecute(BattleScript_EjectPackActivate_End2); @@ -7126,13 +7230,13 @@ static u32 ItemHealHp(u32 battler, u32 itemId, enum ItemCaseId caseID, bool32 pe && HasEnoughHpToEatBerry(battler, 2, itemId)) { if (percentHeal) - gBattleMoveDamage = (GetNonDynamaxMaxHP(battler) * GetBattlerItemHoldEffectParam(battler, itemId) / 100) * -1; + gBattleStruct->moveDamage[battler] = (GetNonDynamaxMaxHP(battler) * GetBattlerItemHoldEffectParam(battler, itemId) / 100) * -1; else - gBattleMoveDamage = GetBattlerItemHoldEffectParam(battler, itemId) * -1; + gBattleStruct->moveDamage[battler] = GetBattlerItemHoldEffectParam(battler, itemId) * -1; // check ripen if (ItemId_GetPocket(itemId) == POCKET_BERRIES && GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleMoveDamage *= 2; + gBattleStruct->moveDamage[battler] *= 2; gBattlerAbility = battler; // in SWSH, berry juice shows ability pop up but has no effect. This is mimicked here if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) @@ -7144,9 +7248,8 @@ static u32 ItemHealHp(u32 battler, u32 itemId, enum ItemCaseId caseID, bool32 pe BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; } - if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_EMERGENCY_EXIT - && GetNonDynamaxHP(battler) >= GetNonDynamaxMaxHP(battler) / 2) - gBattleResources->flags->flags[battler] &= ~RESOURCE_FLAG_EMERGENCY_EXIT; + if (gDisableStructs[battler].startEmergencyExit && GetNonDynamaxHP(battler) >= GetNonDynamaxMaxHP(battler) / 2) + gDisableStructs[battler].startEmergencyExit = FALSE; return ITEM_HP_CHANGE; } @@ -7243,15 +7346,15 @@ static u32 TryConsumeMirrorHerb(u32 battler, enum ItemCaseId caseID) static inline u32 TryBoosterEnergy(u32 battler, enum ItemCaseId caseID) { - if (gBattleStruct->boosterEnergyActivates & (1u << battler) || gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (gDisableStructs[battler].boosterEnergyActivates || gBattleMons[battler].status2 & STATUS2_TRANSFORMED) return ITEM_NO_EFFECT; - if (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && WEATHER_HAS_EFFECT)) + if (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect())) || ((GetBattlerAbility(battler) == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))) { PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); gBattlerAbility = gBattleScripting.battler = battler; - gBattleStruct->boosterEnergyActivates |= 1u << battler; + gDisableStructs[battler].boosterEnergyActivates = TRUE; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) { BattleScriptExecute(BattleScript_BoosterEnergyEnd2); @@ -7416,6 +7519,7 @@ static u8 ItemEffectMoveEnd(u32 battler, u16 holdEffect) BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet; effect = ITEM_STATUS_CHANGE; + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } break; case HOLD_EFFECT_CURE_CONFUSION: @@ -7447,6 +7551,7 @@ static u8 ItemEffectMoveEnd(u32 battler, u16 holdEffect) { gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) @@ -7522,6 +7627,7 @@ static inline bool32 TryCureStatus(u32 battler, enum ItemCaseId caseId) gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); string++; + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) { @@ -7719,6 +7825,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; BattleScriptExecute(BattleScript_BerryCureSlpEnd2); effect = ITEM_STATUS_CHANGE; + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } break; case HOLD_EFFECT_CURE_STATUS: @@ -7832,9 +7939,9 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) } else if (GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD && !moveTurn) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; BattleScriptExecute(BattleScript_ItemHurtEnd2); effect = ITEM_HP_CHANGE; RecordItemEffectBattle(battler, battlerHoldEffect); @@ -7846,10 +7953,10 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) if (gBattleMons[battler].hp < gBattleMons[battler].maxHP && !moveTurn && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; BattleScriptExecute(BattleScript_ItemHealHP_End2); effect = ITEM_HP_CHANGE; RecordItemEffectBattle(battler, battlerHoldEffect); @@ -7954,6 +8061,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; BattleScriptExecute(BattleScript_BerryCureSlpEnd2); effect = ITEM_STATUS_CHANGE; + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } break; case HOLD_EFFECT_CURE_CONFUSION: @@ -8056,10 +8164,8 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) atkHoldEffectParam *= 2; if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER) atkHoldEffectParam *= 2; - if (gBattleMoveDamage != 0 // Need to have done damage - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && TARGET_TURN_DAMAGED - && !gMovesInfo[gCurrentMove].ignoresKingsRock + if (IsBattlerTurnDamaged(gBattlerTarget) + && !MoveIgnoresKingsRock(gCurrentMove) && gBattleMons[gBattlerTarget].hp && RandomPercentage(RNG_HOLD_EFFECT_FLINCH, atkHoldEffectParam) && ability != ABILITY_STENCH) @@ -8091,19 +8197,21 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) switch (atkHoldEffect) { case HOLD_EFFECT_SHELL_BELL: - if (gSpecialStatuses[gBattlerAttacker].damagedMons // Need to have done damage + if (gBattleScripting.savedDmg > 0 + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && gBattlerAttacker != gBattlerTarget - && gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP + && !IsBattlerAtMaxHp(gBattlerAttacker) && IsBattlerAlive(gBattlerAttacker) + && GetMoveEffect(gCurrentMove) != EFFECT_FUTURE_SIGHT + && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) { gLastUsedItem = atkItem; gPotentialItemEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerAttacker; - gBattleMoveDamage = (gSpecialStatuses[gBattlerTarget].shellBellDmg / atkHoldEffectParam) * -1; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = -1; - gSpecialStatuses[gBattlerTarget].shellBellDmg = 0; + gBattleStruct->moveDamage[gBattlerAttacker] = (gBattleScripting.savedDmg / atkHoldEffectParam) * -1; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = -1; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret; effect = ITEM_HP_CHANGE; @@ -8111,25 +8219,25 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_LIFE_ORB: if (IsBattlerAlive(gBattlerAttacker) + && (IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveDamage[gBattlerTarget]) // Needs the second check in case of Substitute && !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && !gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage - && gSpecialStatuses[gBattlerAttacker].damagedMons) + && !gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage) { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 10; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 10; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; effect = ITEM_HP_CHANGE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ItemHurtRet; - gLastUsedItem = gBattleMons[gBattlerAttacker].item; + gLastUsedItem = atkItem; } break; case HOLD_EFFECT_THROAT_SPRAY: // Does NOT need to be a damaging move if (gProtectStructs[gBattlerAttacker].targetAffected && IsBattlerAlive(gBattlerAttacker) - && gMovesInfo[gCurrentMove].soundMove + && IsSoundMove(gCurrentMove) && CompareStat(gBattlerAttacker, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN) && !NoAliveMonsForEitherParty()) // Don't activate if battle will end { @@ -8144,13 +8252,13 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) } break; case ITEMEFFECT_TARGET: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { - moveType = GetMoveType(gCurrentMove); + moveType = GetBattleMoveType(gCurrentMove); switch (battlerHoldEffect) { case HOLD_EFFECT_AIR_BALLOON: - if (TARGET_TURN_DAMAGED) + if (IsBattlerTurnDamaged(gBattlerTarget)) { effect = ITEM_EFFECT_OTHER; BattleScriptPushCursor(); @@ -8158,15 +8266,15 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) } break; case HOLD_EFFECT_ROCKY_HELMET: - if (TARGET_TURN_DAMAGED + if (IsBattlerTurnDamaged(gBattlerTarget) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) && IsBattlerAlive(gBattlerAttacker) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 6; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 6; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; effect = ITEM_HP_CHANGE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RockyHelmetActivates; @@ -8176,8 +8284,8 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_WEAKNESS_POLICY: if (IsBattlerAlive(battler) - && TARGET_TURN_DAMAGED - && gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) + && IsBattlerTurnDamaged(gBattlerTarget) + && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_SUPER_EFFECTIVE) { effect = ITEM_STATS_CHANGE; BattleScriptPushCursor(); @@ -8186,7 +8294,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_SNOWBALL: if (IsBattlerAlive(battler) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && moveType == TYPE_ICE) { effect = ITEM_STATS_CHANGE; @@ -8197,7 +8305,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_LUMINOUS_MOSS: if (IsBattlerAlive(battler) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && moveType == TYPE_WATER) { effect = ITEM_STATS_CHANGE; @@ -8208,7 +8316,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_CELL_BATTERY: if (IsBattlerAlive(battler) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && moveType == TYPE_ELECTRIC) { effect = ITEM_STATS_CHANGE; @@ -8219,7 +8327,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_ABSORB_BULB: if (IsBattlerAlive(battler) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && moveType == TYPE_WATER) { effect = ITEM_STATS_CHANGE; @@ -8233,16 +8341,16 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_JABOCA_BERRY: // consume and damage attacker if used physical move if (IsBattlerAlive(battler) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IS_MOVE_PHYSICAL(gCurrentMove) + && IsBattleMovePhysical(gCurrentMove) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; if (GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleMoveDamage *= 2; + gBattleStruct->moveDamage[gBattlerAttacker] *= 2; effect = ITEM_HP_CHANGE; BattleScriptPushCursor(); @@ -8253,16 +8361,16 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_ROWAP_BERRY: // consume and damage attacker if used special move if (IsBattlerAlive(battler) - && TARGET_TURN_DAMAGED + && IsBattlerTurnDamaged(gBattlerTarget) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IS_MOVE_SPECIAL(gCurrentMove) + && IsBattleMoveSpecial(gCurrentMove) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; if (GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleMoveDamage *= 2; + gBattleStruct->moveDamage[gBattlerAttacker] *= 2; effect = ITEM_HP_CHANGE; BattleScriptPushCursor(); @@ -8279,7 +8387,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_CURE_STATUS: // only Toxic Chain's interaction with Knock Off case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY && !UnnerveOn(battler, gLastUsedItem) && GetBattlerAbility(gBattlerAttacker) == ABILITY_TOXIC_CHAIN && gMovesInfo[gCurrentMove].effect == EFFECT_KNOCK_OFF) + if (gBattleMons[battler].status1 & STATUS1_PSN_ANY && !UnnerveOn(battler, gLastUsedItem) && GetBattlerAbility(gBattlerAttacker) == ABILITY_TOXIC_CHAIN && GetMoveEffect(gCurrentMove) == EFFECT_KNOCK_OFF) { gBattleScripting.battler = battler; gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); @@ -8290,14 +8398,14 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) } break; case HOLD_EFFECT_STICKY_BARB: - if (TARGET_TURN_DAMAGED - && (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS - && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IsBattlerAlive(gBattlerAttacker) - && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) - && gBattleMons[gBattlerAttacker].item == ITEM_NONE) + if (IsBattlerTurnDamaged(gBattlerTarget) + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS + && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) + && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) + && IsBattlerAlive(gBattlerAttacker) + && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) + && gBattleMons[gBattlerAttacker].item == ITEM_NONE) { // No sticky hold checks. gEffectBattler = battler; // gEffectBattler = target @@ -8336,9 +8444,9 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) case HOLD_EFFECT_STICKY_BARB: // Not an orb per se, but similar effect, and needs to NOT activate with pickpocket if (battlerAbility != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; BattleScriptExecute(BattleScript_ItemHurtEnd2); effect = ITEM_HP_CHANGE; RecordItemEffectBattle(battler, battlerHoldEffect); @@ -8416,11 +8524,11 @@ u32 SetRandomTarget(u32 battlerAtk) return target; } -u32 GetMoveTarget(u16 move, u8 setTarget) +u32 GetBattleMoveTarget(u16 move, u8 setTarget) { u8 targetBattler = 0; u32 moveTarget, side; - u32 moveType = GetMoveType(move); + u32 moveType = GetBattleMoveType(move); if (setTarget != NO_TARGET_OVERRIDE) moveTarget = setTarget - 1; @@ -8474,12 +8582,12 @@ u32 GetMoveTarget(u16 move, u8 setTarget) case MOVE_TARGET_DEPENDS: case MOVE_TARGET_BOTH: case MOVE_TARGET_FOES_AND_ALLY: - targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); + targetBattler = GetOpposingSideBattler(gBattlerAttacker); if (!IsBattlerAlive(targetBattler)) targetBattler ^= BIT_FLANK; break; case MOVE_TARGET_OPPONENTS_FIELD: - targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); + targetBattler = GetOpposingSideBattler(gBattlerAttacker); break; case MOVE_TARGET_RANDOM: side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); @@ -8488,7 +8596,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget) else if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM) targetBattler = SetRandomTarget(gBattlerAttacker); else - targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); + targetBattler = GetOpposingSideBattler(gBattlerAttacker); break; case MOVE_TARGET_USER: default: @@ -8502,7 +8610,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget) break; } - *(gBattleStruct->moveTarget + gBattlerAttacker) = targetBattler; + gBattleStruct->moveTarget[gBattlerAttacker] = targetBattler; return targetBattler; } @@ -8571,7 +8679,8 @@ u8 GetAttackerObedienceForAction() // is not obedient if (gCurrentMove == MOVE_RAGE) gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE; - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (gMovesInfo[gCurrentMove].effect == EFFECT_SNORE || gMovesInfo[gCurrentMove].effect == EFFECT_SLEEP_TALK)) + u32 moveEffect = GetMoveEffect(gCurrentMove); + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (moveEffect == EFFECT_SNORE || moveEffect == EFFECT_SLEEP_TALK)) return DISOBEYS_WHILE_ASLEEP; calc = (levelReferenced + obedienceLevel) * ((rnd >> 8) & 255) >> 8; @@ -8591,7 +8700,7 @@ u8 GetAttackerObedienceForAction() obedienceLevel = levelReferenced - obedienceLevel; calc = ((rnd >> 16) & 255); - if (calc < obedienceLevel && CanBeSlept(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) + if (calc < obedienceLevel && CanBeSlept(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), NOT_BLOCKED_BY_SLEEP_CLAUSE)) { // try putting asleep int i; @@ -8659,14 +8768,14 @@ bool32 IsMoveMakingContact(u32 move, u32 battlerAtk) { u32 atkHoldEffect = GetBattlerHoldEffect(battlerAtk, TRUE); - if (!gMovesInfo[move].makesContact) + if (!MoveMakesContact(move)) { - if (gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM && gBattleStruct->shellSideArmCategory[battlerAtk][gBattlerTarget] == DAMAGE_CATEGORY_PHYSICAL) + if (GetMoveEffect(move) == EFFECT_SHELL_SIDE_ARM && gBattleStruct->shellSideArmCategory[battlerAtk][gBattlerTarget] == DAMAGE_CATEGORY_PHYSICAL) return TRUE; else return FALSE; } - else if ((atkHoldEffect == HOLD_EFFECT_PUNCHING_GLOVE && gMovesInfo[move].punchingMove) + else if ((atkHoldEffect == HOLD_EFFECT_PUNCHING_GLOVE && IsPunchingMove(move)) || GetBattlerAbility(battlerAtk) == ABILITY_LONG_REACH) { return FALSE; @@ -8679,50 +8788,51 @@ bool32 IsMoveMakingContact(u32 move, u32 battlerAtk) bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) { - // Z-Moves and Max Moves bypass protection (except Max Guard). + bool32 isProtected = FALSE; + if ((IsZMove(move) || IsMaxMove(move)) - && (!gProtectStructs[battlerDef].maxGuarded - || gMovesInfo[move].argument == MAX_EFFECT_BYPASS_PROTECT)) - return FALSE; - - // Max Guard is silly about the moves it blocks, including Teatime. - if (gProtectStructs[battlerDef].maxGuarded && IsMoveBlockedByMaxGuard(move)) - return TRUE; - - if (!gProtectStructs[battlerDef].maxGuarded // Max Guard cannot be bypassed by Unseen Fist - && IsMoveMakingContact(move, battlerAtk) - && GetBattlerAbility(battlerAtk) == ABILITY_UNSEEN_FIST) - return FALSE; - else if ((gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_CRAFTY_SHIELD) - && IS_MOVE_STATUS(move) && gMovesInfo[move].effect != EFFECT_COACHING) - return TRUE; - else if (gMovesInfo[move].ignoresProtect) - return FALSE; + && (!gProtectStructs[battlerDef].maxGuarded || MoveIgnoresProtect(move))) + isProtected = FALSE; // Z-Moves and Max Moves bypass protection (except Max Guard). + else if (gProtectStructs[battlerDef].maxGuarded && IsMoveBlockedByMaxGuard(move)) + isProtected = TRUE; + else if (!gProtectStructs[battlerDef].maxGuarded // Max Guard cannot be bypassed by Unseen Fist + && IsMoveMakingContact(move, battlerAtk) + && GetBattlerAbility(battlerAtk) == ABILITY_UNSEEN_FIST) + isProtected = FALSE; + else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_CRAFTY_SHIELD && IsBattleMoveStatus(move) && GetMoveEffect(move) != EFFECT_COACHING) + isProtected = TRUE; + else if (MoveIgnoresProtect(move)) + isProtected = FALSE; else if (gProtectStructs[battlerDef].protected) - return TRUE; + isProtected = TRUE; else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_WIDE_GUARD && GetBattlerMoveTargetType(battlerAtk, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) - return TRUE; + isProtected = TRUE; else if (gProtectStructs[battlerDef].banefulBunkered) - return TRUE; + isProtected = TRUE; else if (gProtectStructs[battlerDef].burningBulwarked) - return TRUE; - else if ((gProtectStructs[battlerDef].obstructed || gProtectStructs[battlerDef].silkTrapped) && !IS_MOVE_STATUS(move)) - return TRUE; + isProtected = TRUE; + else if ((gProtectStructs[battlerDef].obstructed || gProtectStructs[battlerDef].silkTrapped) && !IsBattleMoveStatus(move)) + isProtected = TRUE; else if (gProtectStructs[battlerDef].spikyShielded) - return TRUE; - else if (gProtectStructs[battlerDef].kingsShielded && !IS_MOVE_STATUS(move)) - return TRUE; + isProtected = TRUE; + else if (gProtectStructs[battlerDef].kingsShielded && !IsBattleMoveStatus(move)) + isProtected = TRUE; else if (gProtectStructs[battlerDef].maxGuarded) - return TRUE; + isProtected = TRUE; else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_QUICK_GUARD && GetChosenMovePriority(battlerAtk) > 0) - return TRUE; + isProtected = TRUE; else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_MAT_BLOCK - && !IS_MOVE_STATUS(move)) - return TRUE; + && !IsBattleMoveStatus(move)) + isProtected = TRUE; else - return FALSE; + isProtected = FALSE; + + if (isProtected) + gBattleStruct->missStringId[battlerDef] = gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; + + return isProtected; } // Only called directly when calculating damage type effectiveness @@ -8756,18 +8866,6 @@ bool32 IsBattlerGrounded(u32 battler) return IsBattlerGroundedInverseCheck(battler, FALSE); } -bool32 IsBattlerAlive(u32 battler) -{ - if (gBattleMons[battler].hp == 0) - return FALSE; - else if (battler >= gBattlersCount) - return FALSE; - else if (gAbsentBattlerFlags & (1u << battler)) - return FALSE; - else - return TRUE; -} - u32 GetMoveSlot(u16 *moves, u32 move) { u32 i; @@ -8980,7 +9078,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData u32 move = damageCalcData->move; u32 i; - u32 basePower = gMovesInfo[move].power; + u32 basePower = GetMovePower(move); u32 weight, hpFraction, speed; if (GetActiveGimmick(battlerAtk) == GIMMICK_Z_MOVE) @@ -8989,7 +9087,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData if (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX) return GetMaxMovePower(move); - switch (gMovesInfo[move].effect) + switch (GetMoveEffect(move)) { case EFFECT_PLEDGE: if (gBattleStruct->pledgeMove) @@ -9029,7 +9127,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower = gBattleStruct->presentBasePower; break; case EFFECT_TRIPLE_KICK: - basePower *= 1 + gMovesInfo[move].strikeCount - gMultiHitCounter; + basePower *= 1 + GetMoveStrikeCount(move) - gMultiHitCounter; break; case EFFECT_SPIT_UP: basePower = 100 * gDisableStructs[battlerAtk].stockpileCounter; @@ -9046,7 +9144,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower *= 2; break; case EFFECT_PURSUIT: - if (gActionsByTurnOrder[GetBattlerTurnOrderNum(battlerDef)] == B_ACTION_SWITCH) + if (gBattleStruct->battlerState[battlerDef].pursuitTarget) basePower *= 2; break; case EFFECT_NATURAL_GIFT: @@ -9054,8 +9152,8 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData break; case EFFECT_DOUBLE_POWER_ON_ARG_STATUS: // Comatose targets treated as if asleep - if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (abilityDef == ABILITY_COMATOSE))) & gMovesInfo[move].argument - && !((gMovesInfo[move].additionalEffects->moveEffect == MOVE_EFFECT_REMOVE_STATUS) && DoesSubstituteBlockMove(battlerAtk, battlerDef, move))) + if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (abilityDef == ABILITY_COMATOSE))) & GetMoveEffectArg_Status(move) + && !((GetMoveAdditionalEffectById(move, 0)->moveEffect == MOVE_EFFECT_REMOVE_STATUS) && DoesSubstituteBlockMove(battlerAtk, battlerDef, move))) { basePower *= 2; } @@ -9143,7 +9241,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData case EFFECT_ROUND: for (i = 0; i < gBattlersCount; i++) { - if (i != battlerAtk && IsBattlerAlive(i) && gMovesInfo[gLastUsedMove].effect == EFFECT_ROUND) + if (i != battlerAtk && IsBattlerAlive(i) && GetMoveEffect(gLastUsedMove) == EFFECT_ROUND) { basePower *= 2; break; @@ -9151,7 +9249,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData } break; case EFFECT_FUSION_COMBO: - if (gMovesInfo[gLastUsedMove].effect == EFFECT_FUSION_COMBO && move != gLastUsedMove) + if (GetMoveEffect(gLastUsedMove) == EFFECT_FUSION_COMBO && move != gLastUsedMove) basePower *= 2; break; case EFFECT_LASH_OUT: @@ -9159,7 +9257,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower *= 2; break; case EFFECT_EXPLOSION: - if (move == MOVE_MISTY_EXPLOSION && gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN && IsBattlerGrounded(battlerAtk)) + if (move == MOVE_MISTY_EXPLOSION && IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_DYNAMAX_DOUBLE_DMG: @@ -9186,8 +9284,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_TERRAIN_PULSE: - if ((gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - && IsBattlerGrounded(battlerAtk)) + if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_TERRAIN_ANY)) basePower *= 2; break; case EFFECT_EXPANDING_FORCE: @@ -9203,7 +9300,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower = CalcBeatUpPower(); break; case EFFECT_PSYBLADE: - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_MAX_MOVE: @@ -9249,7 +9346,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * u32 battlerDef = damageCalcData->battlerDef; u32 move = damageCalcData->move; u32 moveType = damageCalcData->moveType; - u32 moveEffect = gMovesInfo[move].effect; + u32 moveEffect = GetMoveEffect(move); uq4_12_t holdEffectModifier; uq4_12_t modifier = UQ_4_12(1.0); @@ -9275,7 +9372,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); break; case EFFECT_STOMPING_TANTRUM: - if (gBattleStruct->lastMoveFailed & (1u << battlerAtk)) + if (gBattleStruct->battlerState[battlerAtk].lastMoveFailed) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case EFFECT_MAGNITUDE: @@ -9295,7 +9392,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * if (gProtectStructs[battlerAtk].helpingHand) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); if (gSpecialStatuses[battlerAtk].gemBoost) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.0) + sPercentToModifier[gSpecialStatuses[battlerAtk].gemParam]); + modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(gSpecialStatuses[battlerAtk].gemParam))); if (gStatuses3[battlerAtk] & STATUS3_CHARGED_UP && moveType == TYPE_ELECTRIC) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); if (gStatuses3[battlerAtk] & STATUS3_ME_FIRST) @@ -9324,19 +9421,19 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * 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)) + if (gBattleMons[battlerAtk].status1 & STATUS1_BURN && IsBattleMoveSpecial(move)) 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)) + if (gBattleMons[battlerAtk].status1 & STATUS1_PSN_ANY && IsBattleMovePhysical(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_RECKLESS: - if (IS_MOVE_RECOIL(move)) + if (IsBattleMoveRecoil(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_IRON_FIST: - if (gMovesInfo[move].punchingMove) + if (IsPunchingMove(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_SHEER_FORCE: @@ -9363,11 +9460,11 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_STRONG_JAW: - if (gMovesInfo[move].bitingMove) + if (IsBitingMove(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_MEGA_LAUNCHER: - if (gMovesInfo[move].pulseMove) + if (IsPulseMove(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_WATER_BUBBLE: @@ -9399,7 +9496,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_PUNK_ROCK: - if (gMovesInfo[move].soundMove) + if (IsSoundMove(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_STEELY_SPIRIT: @@ -9407,7 +9504,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_SHARPNESS: - if (gMovesInfo[move].slicingMove) + if (IsSlicingMove(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_SUPREME_OVERLORD: @@ -9431,7 +9528,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * switch (GetBattlerAbility(BATTLE_PARTNER(battlerAtk))) { case ABILITY_BATTERY: - if (IS_MOVE_SPECIAL(move)) + if (IsBattleMoveSpecial(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_POWER_SPOT: @@ -9463,8 +9560,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * case ABILITY_PROTOSYNTHESIS: { u8 defHighestStat = GetHighestStatId(battlerDef); - if (((weather & B_WEATHER_SUN && WEATHER_HAS_EFFECT) || gBattleStruct->boosterEnergyActivates & (1u << battlerDef)) - && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF)) + if (((weather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battlerDef].boosterEnergyActivates) + && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } @@ -9472,8 +9569,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * case ABILITY_QUARK_DRIVE: { u8 defHighestStat = GetHighestStatId(battlerDef); - if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battlerDef)) - && ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF)) + if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerDef].boosterEnergyActivates) + && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } @@ -9484,18 +9581,18 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * if (holdEffectParamAtk > 100) holdEffectParamAtk = 100; - holdEffectModifier = UQ_4_12(1.0) + sPercentToModifier[holdEffectParamAtk]; + holdEffectModifier = uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(holdEffectParamAtk)); // attacker's hold effect switch (holdEffectAtk) { case HOLD_EFFECT_MUSCLE_BAND: - if (IS_MOVE_PHYSICAL(move)) - modifier = uq4_12_multiply(modifier, holdEffectModifier); + if (IsBattleMovePhysical(move)) + modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12_Floored(holdEffectParamAtk))); break; case HOLD_EFFECT_WISE_GLASSES: - if (IS_MOVE_SPECIAL(move)) - modifier = uq4_12_multiply(modifier, holdEffectModifier); + if (IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12_Floored(holdEffectParamAtk))); break; case HOLD_EFFECT_LUSTROUS_ORB: if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PALKIA && (moveType == TYPE_WATER || moveType == TYPE_DRAGON)) @@ -9512,7 +9609,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * case HOLD_EFFECT_SOUL_DEW: if ((gBattleMons[battlerAtk].species == SPECIES_LATIAS || gBattleMons[battlerAtk].species == SPECIES_LATIOS) && ((B_SOUL_DEW_BOOST >= GEN_7 && (moveType == TYPE_PSYCHIC || moveType == TYPE_DRAGON)) - || (B_SOUL_DEW_BOOST < GEN_7 && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && IS_MOVE_SPECIAL(move)))) + || (B_SOUL_DEW_BOOST < GEN_7 && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && IsBattleMoveSpecial(move)))) modifier = uq4_12_multiply(modifier, holdEffectModifier); break; case HOLD_EFFECT_BUG_POWER: @@ -9548,7 +9645,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * modifier = uq4_12_multiply(modifier, holdEffectModifier); break; case HOLD_EFFECT_PUNCHING_GLOVE: - if (gMovesInfo[move].punchingMove) + if (IsPunchingMove(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.1)); break; case HOLD_EFFECT_OGERPON_MASK: @@ -9562,12 +9659,12 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * && (moveType == GetBattlerTeraType(battlerAtk) || (GetBattlerTeraType(battlerAtk) == TYPE_STELLAR && IsTypeStellarBoosted(battlerAtk, moveType))) && uq4_12_multiply_by_int_half_down(modifier, basePower) < 60 - && gMovesInfo[move].power > 1 - && gMovesInfo[move].strikeCount < 2 + && GetMovePower(move) > 1 + && GetMoveStrikeCount(move) < 2 && moveEffect != EFFECT_POWER_BASED_ON_USER_HP && moveEffect != EFFECT_POWER_BASED_ON_TARGET_HP && moveEffect != EFFECT_MULTI_HIT - && gMovesInfo[move].priority == 0) + && GetMovePriority(move) == 0) { return 60; } @@ -9585,12 +9682,13 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u u32 battlerDef = damageCalcData->battlerDef; u32 move = damageCalcData->move; u32 moveType = damageCalcData->moveType; + u32 moveEffect = GetMoveEffect(move); atkBaseSpeciesId = GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species); - if (gMovesInfo[move].effect == EFFECT_FOUL_PLAY) + if (moveEffect == EFFECT_FOUL_PLAY) { - if (IS_MOVE_PHYSICAL(move)) + if (IsBattleMovePhysical(move)) { atkStat = gBattleMons[battlerDef].attack; atkStage = gBattleMons[battlerDef].statStages[STAT_ATK]; @@ -9601,9 +9699,9 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u atkStage = gBattleMons[battlerDef].statStages[STAT_SPATK]; } } - else if (gMovesInfo[move].effect == EFFECT_BODY_PRESS) + else if (moveEffect == EFFECT_BODY_PRESS) { - if (IS_MOVE_PHYSICAL(move)) + if (IsBattleMovePhysical(move)) { atkStat = gBattleMons[battlerAtk].defense; // Edge case: Body Press used during Wonder Room. For some reason, it still uses Defense over Sp.Def, but uses Sp.Def stat changes @@ -9620,7 +9718,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u } else { - if (IS_MOVE_PHYSICAL(move)) + if (IsBattleMovePhysical(move)) { atkStat = gBattleMons[battlerAtk].attack; atkStage = gBattleMons[battlerAtk].statStages[STAT_ATK]; @@ -9650,7 +9748,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u { case ABILITY_HUGE_POWER: case ABILITY_PURE_POWER: - if (IS_MOVE_PHYSICAL(move)) + if (IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case ABILITY_SLOW_START: @@ -9658,7 +9756,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); break; case ABILITY_SOLAR_POWER: - if (IS_MOVE_SPECIAL(move) && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN)) + if (IsBattleMoveSpecial(move) && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case ABILITY_DEFEATIST: @@ -9666,7 +9764,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); break; case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE && gBattleResources->flags->flags[battlerAtk] & RESOURCE_FLAG_FLASH_FIRE) + if (moveType == TYPE_FIRE && gDisableStructs[battlerAtk].flashFireBoosted) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case ABILITY_SWARM: @@ -9686,7 +9784,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case ABILITY_PLUS: - if (IS_MOVE_SPECIAL(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + if (IsBattleMoveSpecial(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) { u32 partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); if (partnerAbility == ABILITY_MINUS @@ -9695,7 +9793,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u } break; case ABILITY_MINUS: - if (IS_MOVE_SPECIAL(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + if (IsBattleMoveSpecial(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) { u32 partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); if (partnerAbility == ABILITY_PLUS @@ -9704,11 +9802,11 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u } break; case ABILITY_FLOWER_GIFT: - if (gBattleMons[battlerAtk].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN) && IS_MOVE_PHYSICAL(move)) + if (gBattleMons[battlerAtk].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN) && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case ABILITY_HUSTLE: - if (IS_MOVE_PHYSICAL(move)) + if (IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case ABILITY_STAKEOUT: @@ -9716,7 +9814,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case ABILITY_GUTS: - if (gBattleMons[battlerAtk].status1 & STATUS1_ANY && IS_MOVE_PHYSICAL(move)) + if (gBattleMons[battlerAtk].status1 & STATUS1_ANY && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case ABILITY_TRANSISTOR: @@ -9733,7 +9831,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_GORILLA_TACTICS: - if (IS_MOVE_PHYSICAL(move)) + if (IsBattleMovePhysical(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_ROCKY_PAYLOAD: @@ -9744,9 +9842,9 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) { u32 atkHighestStat = GetHighestStatId(battlerAtk); - if (((weather & B_WEATHER_SUN) && WEATHER_HAS_EFFECT) || gBattleStruct->boosterEnergyActivates & (1u << battlerAtk)) + if (((weather & B_WEATHER_SUN) && HasWeatherEffect()) || gDisableStructs[battlerAtk].boosterEnergyActivates) { - if ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK)) + if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); } } @@ -9755,20 +9853,20 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) { u32 atkHighestStat = GetHighestStatId(battlerAtk); - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleStruct->boosterEnergyActivates & (1u << battlerAtk)) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerAtk].boosterEnergyActivates) { - if ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK)) + if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); } } break; case ABILITY_ORICHALCUM_PULSE: - if ((weather & B_WEATHER_SUN) && WEATHER_HAS_EFFECT && IS_MOVE_PHYSICAL(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.33)); + if ((weather & B_WEATHER_SUN) && HasWeatherEffect() && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333)); break; case ABILITY_HADRON_ENGINE: - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && IS_MOVE_SPECIAL(move)) - modifier = uq4_12_multiply(modifier, UQ_4_12(1.33)); + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333)); break; } @@ -9791,49 +9889,49 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u switch (GetBattlerAbility(BATTLE_PARTNER(battlerAtk))) { case ABILITY_FLOWER_GIFT: - if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerAtk), B_WEATHER_SUN) && IS_MOVE_PHYSICAL(move)) + if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerAtk), B_WEATHER_SUN) && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; } } // field abilities - if (IsAbilityOnField(ABILITY_VESSEL_OF_RUIN) && atkAbility != ABILITY_VESSEL_OF_RUIN && IS_MOVE_SPECIAL(move)) + if (IsAbilityOnField(ABILITY_VESSEL_OF_RUIN) && atkAbility != ABILITY_VESSEL_OF_RUIN && IsBattleMoveSpecial(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); - if (IsAbilityOnField(ABILITY_TABLETS_OF_RUIN) && atkAbility != ABILITY_TABLETS_OF_RUIN && IS_MOVE_PHYSICAL(move)) + if (IsAbilityOnField(ABILITY_TABLETS_OF_RUIN) && atkAbility != ABILITY_TABLETS_OF_RUIN && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); // attacker's hold effect switch (holdEffectAtk) { case HOLD_EFFECT_THICK_CLUB: - if ((atkBaseSpeciesId == SPECIES_CUBONE || atkBaseSpeciesId == SPECIES_MAROWAK) && IS_MOVE_PHYSICAL(move)) + if ((atkBaseSpeciesId == SPECIES_CUBONE || atkBaseSpeciesId == SPECIES_MAROWAK) && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_DEEP_SEA_TOOTH: - if (gBattleMons[battlerAtk].species == SPECIES_CLAMPERL && IS_MOVE_SPECIAL(move)) + if (gBattleMons[battlerAtk].species == SPECIES_CLAMPERL && IsBattleMoveSpecial(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_LIGHT_BALL: - if (atkBaseSpeciesId == SPECIES_PIKACHU && (B_LIGHT_BALL_ATTACK_BOOST >= GEN_4 || IS_MOVE_SPECIAL(move))) + if (atkBaseSpeciesId == SPECIES_PIKACHU && (B_LIGHT_BALL_ATTACK_BOOST >= GEN_4 || IsBattleMoveSpecial(move))) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_CHOICE_BAND: - if (IS_MOVE_PHYSICAL(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) + if (IsBattleMovePhysical(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case HOLD_EFFECT_CHOICE_SPECS: - if (IS_MOVE_SPECIAL(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) + if (IsBattleMoveSpecial(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) modifier = uq4_12_multiply_half_down(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)) + if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, battlerAtk) && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); - if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerAtk) && IS_MOVE_SPECIAL(move)) + if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerAtk) && IsBattleMoveSpecial(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); return uq4_12_multiply_by_int_half_down(modifier, atkStat); @@ -9865,6 +9963,7 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, u32 battlerDef = damageCalcData->battlerDef; u32 move = damageCalcData->move; u32 moveType = damageCalcData->moveType; + u32 moveEffect = GetMoveEffect(move); if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped { @@ -9877,7 +9976,7 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, spDef = gBattleMons[battlerDef].spDefense; } - if (gMovesInfo[move].effect == EFFECT_PSYSHOCK || IS_MOVE_PHYSICAL(move)) // uses defense stat instead of sp.def + if (moveEffect == EFFECT_PSYSHOCK || IsBattleMovePhysical(move)) // uses defense stat instead of sp.def { defStat = def; defStage = gBattleMons[battlerDef].statStages[STAT_DEF]; @@ -9891,7 +9990,7 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, } // Self-destruct / Explosion cut defense in half - if (B_EXPLOSION_DEFENSE < GEN_5 && gMovesInfo[gCurrentMove].effect == EFFECT_EXPLOSION) + if (B_EXPLOSION_DEFENSE < GEN_5 && moveEffect == EFFECT_EXPLOSION) defStat /= 2; // critical hits ignore positive stat changes @@ -9901,7 +10000,7 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, if (atkAbility == ABILITY_UNAWARE) defStage = DEFAULT_STAT_STAGE; // certain moves also ignore stat changes - if (gMovesInfo[move].ignoresTargetDefenseEvasionStages) + if (MoveIgnoresDefenseEvasionStages(move)) defStage = DEFAULT_STAT_STAGE; defStat *= gStatStageRatios[defStage][0]; @@ -10003,9 +10102,9 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, // 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)) + if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, battlerDef) && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); - if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerDef) && IS_MOVE_SPECIAL(move)) + if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerDef) && IsBattleMoveSpecial(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); return uq4_12_multiply_by_int_half_down(modifier, defStat); @@ -10054,7 +10153,7 @@ static uq4_12_t GetWeatherDamageModifier(struct DamageCalculationData *damageCal if (weather == B_WEATHER_NONE) return UQ_4_12(1.0); - if (gMovesInfo[move].effect == EFFECT_HYDRO_STEAM && (weather & B_WEATHER_SUN) && holdEffectAtk != HOLD_EFFECT_UTILITY_UMBRELLA) + if (GetMoveEffect(move) == EFFECT_HYDRO_STEAM && (weather & B_WEATHER_SUN) && holdEffectAtk != HOLD_EFFECT_UTILITY_UMBRELLA) return UQ_4_12(1.5); if (holdEffectDef == HOLD_EFFECT_UTILITY_UMBRELLA) return UQ_4_12(1.0); @@ -10078,15 +10177,16 @@ static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageCalculationData * { u32 battlerAtk = damageCalcData->battlerAtk; u32 move = damageCalcData->move; + u32 moveEffect = GetMoveEffect(move); if (gBattleMons[battlerAtk].status1 & STATUS1_BURN - && IS_MOVE_PHYSICAL(move) - && (B_BURN_FACADE_DMG < GEN_6 || gMovesInfo[move].effect != EFFECT_FACADE) + && IsBattleMovePhysical(move) + && (B_BURN_FACADE_DMG < GEN_6 || moveEffect != EFFECT_FACADE) && abilityAtk != ABILITY_GUTS) return UQ_4_12(0.5); if (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE - && IS_MOVE_SPECIAL(move) - && (B_BURN_FACADE_DMG < GEN_6 || gMovesInfo[move].effect != EFFECT_FACADE)) + && IsBattleMoveSpecial(move) + && (B_BURN_FACADE_DMG < GEN_6 || moveEffect != EFFECT_FACADE)) return UQ_4_12(0.5); return UQ_4_12(1.0); } @@ -10114,28 +10214,28 @@ static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(struct DamageCalcula static inline uq4_12_t GetMinimizeModifier(u32 move, u32 battlerDef) { - if (gMovesInfo[move].minimizeDoubleDamage && gStatuses3[battlerDef] & STATUS3_MINIMIZED) + if (MoveIncreasesPowerToMinimizedTargets(move) && gStatuses3[battlerDef] & STATUS3_MINIMIZED) return UQ_4_12(2.0); return UQ_4_12(1.0); } static inline uq4_12_t GetUndergroundModifier(u32 move, u32 battlerDef) { - if (gMovesInfo[move].damagesUnderground && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) + if (MoveDamagesUnderground(move) && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) return UQ_4_12(2.0); return UQ_4_12(1.0); } static inline uq4_12_t GetDiveModifier(u32 move, u32 battlerDef) { - if (gMovesInfo[move].damagesUnderwater && gStatuses3[battlerDef] & STATUS3_UNDERWATER) + if (MoveDamagesUnderWater(move) && gStatuses3[battlerDef] & STATUS3_UNDERWATER) return UQ_4_12(2.0); return UQ_4_12(1.0); } static inline uq4_12_t GetAirborneModifier(u32 move, u32 battlerDef) { - if (gMovesInfo[move].damagesAirborneDoubleDamage && gStatuses3[battlerDef] & STATUS3_ON_AIR) + if (MoveDamagesAirborneDoubleDamage(move) && gStatuses3[battlerDef] & STATUS3_ON_AIR) return UQ_4_12(2.0); return UQ_4_12(1.0); } @@ -10143,8 +10243,8 @@ static inline uq4_12_t GetAirborneModifier(u32 move, u32 battlerDef) static inline uq4_12_t GetScreensModifier(u32 move, u32 battlerAtk, u32 battlerDef, bool32 isCrit, u32 abilityAtk) { u32 sideStatus = gSideStatuses[GetBattlerSide(battlerDef)]; - bool32 lightScreen = (sideStatus & SIDE_STATUS_LIGHTSCREEN) && IS_MOVE_SPECIAL(move); - bool32 reflect = (sideStatus & SIDE_STATUS_REFLECT) && IS_MOVE_PHYSICAL(move); + bool32 lightScreen = (sideStatus & SIDE_STATUS_LIGHTSCREEN) && IsBattleMoveSpecial(move); + bool32 reflect = (sideStatus & SIDE_STATUS_REFLECT) && IsBattleMovePhysical(move); bool32 auroraVeil = sideStatus & SIDE_STATUS_AURORA_VEIL; if (isCrit || abilityAtk == ABILITY_INFILTRATOR || gProtectStructs[battlerAtk].confusionSelfDmg) @@ -10156,7 +10256,7 @@ static inline uq4_12_t GetScreensModifier(u32 move, u32 battlerAtk, u32 battlerD static inline uq4_12_t GetCollisionCourseElectroDriftModifier(u32 move, uq4_12_t typeEffectivenessModifier) { - if (gMovesInfo[move].effect == EFFECT_COLLISION_COURSE && typeEffectivenessModifier >= UQ_4_12(2.0)) + if (GetMoveEffect(move) == EFFECT_COLLISION_COURSE && typeEffectivenessModifier >= UQ_4_12(2.0)) return UQ_4_12(1.3333); return UQ_4_12(1.0); } @@ -10187,7 +10287,7 @@ static inline uq4_12_t GetDefenderAbilitiesModifier(u32 move, u32 moveType, u32 { case ABILITY_MULTISCALE: case ABILITY_SHADOW_SHIELD: - if (BATTLER_MAX_HP(battlerDef)) + if (IsBattlerAtMaxHp(battlerDef)) return UQ_4_12(0.5); break; case ABILITY_FILTER: @@ -10203,11 +10303,11 @@ static inline uq4_12_t GetDefenderAbilitiesModifier(u32 move, u32 moveType, u32 return UQ_4_12(0.5); break; case ABILITY_PUNK_ROCK: - if (gMovesInfo[move].soundMove) + if (IsSoundMove(move)) return UQ_4_12(0.5); break; case ABILITY_ICE_SCALES: - if (IS_MOVE_SPECIAL(move)) + if (IsBattleMoveSpecial(move)) return UQ_4_12(0.5); break; } @@ -10230,19 +10330,23 @@ static inline uq4_12_t GetDefenderPartnerAbilitiesModifier(u32 battlerPartnerDef static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, u32 holdEffectAtk) { - u32 percentBoost; + u32 metronomeTurns; + uq4_12_t metronomeBoostBase; switch (holdEffectAtk) { case HOLD_EFFECT_METRONOME: - percentBoost = min((gBattleStruct->sameMoveTurns[battlerAtk] * GetBattlerHoldEffectParam(battlerAtk)), 100); - return uq4_12_add(sPercentToModifier[percentBoost], UQ_4_12(1.0)); + metronomeBoostBase = PercentToUQ4_12(GetBattlerHoldEffectParam(battlerAtk)); + metronomeTurns = min(gBattleStruct->sameMoveTurns[battlerAtk], 5); + // according to bulbapedia this is the "correct" way to calculate the metronome boost + // due to the limited domain of damage numbers it will never really matter whether this is off by one + return uq4_12_add(UQ_4_12(1.0), metronomeBoostBase * metronomeTurns); break; case HOLD_EFFECT_EXPERT_BELT: if (typeEffectivenessModifier >= UQ_4_12(2.0)) return UQ_4_12(1.2); break; case HOLD_EFFECT_LIFE_ORB: - return UQ_4_12(1.3); + return UQ_4_12_FLOORED(1.3); break; } return UQ_4_12(1.0); @@ -10402,9 +10506,9 @@ static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageCalculationData struct Pokemon *partyMon = &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]]; u32 partyMonLevel = GetMonData(partyMon, MON_DATA_LEVEL, NULL); u32 partyMonSpecies = GetMonData(partyMon, MON_DATA_SPECIES, NULL); - gBattleMovePower = gMovesInfo[move].power; + gBattleMovePower = GetMovePower(move); - if (IS_MOVE_PHYSICAL(move)) + if (IsBattleMovePhysical(move)) userFinalAttack = GetMonData(partyMon, MON_DATA_ATK, NULL); else userFinalAttack = GetMonData(partyMon, MON_DATA_SPATK, NULL); @@ -10452,7 +10556,7 @@ static inline s32 DoFutureSightAttackDamageCalc(struct DamageCalculationData *da static u32 GetWeather(void) { - if (gBattleWeather == B_WEATHER_NONE || !WEATHER_HAS_EFFECT) + if (gBattleWeather == B_WEATHER_NONE || !HasWeatherEffect()) return B_WEATHER_NONE; else return gBattleWeather; @@ -10460,7 +10564,7 @@ static u32 GetWeather(void) static inline bool32 IsFutureSightAttackerInParty(struct DamageCalculationData *damageCalcData) { - if (gMovesInfo[damageCalcData->move].effect != EFFECT_FUTURE_SIGHT) + if (GetMoveEffect(damageCalcData->move) != EFFECT_FUTURE_SIGHT) return FALSE; struct Pokemon *party = GetSideParty(GetBattlerSide(damageCalcData->battlerAtk)); @@ -10491,7 +10595,7 @@ s32 CalculateMoveDamageVars(struct DamageCalculationData *damageCalcData, u32 fi holdEffectAtk, holdEffectDef, abilityAtk, abilityDef); } -static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 moveType, u32 battlerDef, u32 defType, u32 battlerAtk, bool32 recordAbilities) +static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 moveType, u32 battlerDef, u32 defAbility, u32 defType, u32 battlerAtk, bool32 recordAbilities) { uq4_12_t mod = GetTypeModifier(moveType, defType); u32 abilityAtk = GetBattlerAbility(battlerAtk); @@ -10517,7 +10621,7 @@ static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 move if (moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED && mod == UQ_4_12(0.0)) mod = UQ_4_12(1.0); - if (gMovesInfo[move].effect == EFFECT_SUPER_EFFECTIVE_ON_ARG && defType == gMovesInfo[move].argument) + if (GetMoveEffect(move) == EFFECT_SUPER_EFFECTIVE_ON_ARG && defType == GetMoveArgType(move)) mod = UQ_4_12(2.0); if (moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(battlerDef) && mod == UQ_4_12(0.0)) mod = UQ_4_12(1.0); @@ -10525,17 +10629,21 @@ static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 move mod = UQ_4_12(2.0); // B_WEATHER_STRONG_WINDS weakens Super Effective moves against Flying-type Pokémon - if (gBattleWeather & B_WEATHER_STRONG_WINDS && WEATHER_HAS_EFFECT) + if (gBattleWeather & B_WEATHER_STRONG_WINDS && HasWeatherEffect()) { if (defType == TYPE_FLYING && mod >= UQ_4_12(2.0)) mod = UQ_4_12(1.0); } - if (gSpecialStatuses[battlerDef].distortedTypeMatchups || (AI_DATA->aiCalcInProgress && ShouldTeraShellDistortTypeMatchups(move, battlerDef))) + if (gSpecialStatuses[battlerDef].distortedTypeMatchups || (mod > UQ_4_12(0.0) && ShouldTeraShellDistortTypeMatchups(move, battlerDef, defAbility))) { mod = UQ_4_12(0.5); if (recordAbilities) - RecordAbilityBattle(battlerDef, GetBattlerAbility(battlerDef)); + { + RecordAbilityBattle(battlerDef, defAbility); + gSpecialStatuses[battlerDef].distortedTypeMatchups = TRUE; + gSpecialStatuses[battlerDef].teraShellAbilityDone = TRUE; + } } *modifier = uq4_12_multiply(*modifier, mod); @@ -10545,68 +10653,70 @@ static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType, { // Check if the type effectiveness would've been different if the pokemon really had the types as the disguise. uq4_12_t presumedModifier = UQ_4_12(1.0); - MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, gSpeciesInfo[illusionSpecies].types[0], battlerAtk, FALSE); + MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, 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); + MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, gSpeciesInfo[illusionSpecies].types[1], battlerAtk, FALSE); if (presumedModifier != resultingModifier) RecordAbilityBattle(battlerDef, ABILITY_ILLUSION); } -static void UpdateMoveResultFlags(uq4_12_t modifier) +void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags) { if (modifier == UQ_4_12(0.0)) { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); + *resultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; + *resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); + gBattleStruct->blunderPolicy = FALSE; // Don't activate if missed } else if (modifier == UQ_4_12(1.0)) { - gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); + *resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); } else if (modifier > UQ_4_12(1.0)) { - gMoveResultFlags |= MOVE_RESULT_SUPER_EFFECTIVE; - gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); + *resultFlags |= MOVE_RESULT_SUPER_EFFECTIVE; + *resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); } else //if (modifier < UQ_4_12(1.0)) { - gMoveResultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - gMoveResultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); + *resultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; + *resultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); } } static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, bool32 recordAbilities, uq4_12_t modifier, u32 defAbility) { u32 illusionSpecies; + u32 types[3]; + GetBattlerTypes(battlerDef, FALSE, types); - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, GetBattlerType(battlerDef, 0, FALSE), battlerAtk, recordAbilities); - if (GetBattlerType(battlerDef, 1, FALSE) != GetBattlerType(battlerDef, 0, FALSE)) - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, GetBattlerType(battlerDef, 1, FALSE), battlerAtk, recordAbilities); - if (GetBattlerType(battlerDef, 2, FALSE) != TYPE_MYSTERY && GetBattlerType(battlerDef, 2, FALSE) != GetBattlerType(battlerDef, 1, FALSE) - && GetBattlerType(battlerDef, 2, FALSE) != GetBattlerType(battlerDef, 0, FALSE)) - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, GetBattlerType(battlerDef, 2, FALSE), battlerAtk, recordAbilities); + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[0], battlerAtk, recordAbilities); + if (types[1] != types[0]) + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[1], battlerAtk, recordAbilities); + if (types[2] != TYPE_MYSTERY && types[2] != types[1] && types[2] != types[0]) + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[2], battlerAtk, recordAbilities); if (moveType == TYPE_FIRE && gDisableStructs[battlerDef].tarShot) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); if (recordAbilities && (illusionSpecies = GetIllusionMonSpecies(battlerDef))) TryNoticeIllusionInTypeEffectiveness(move, moveType, battlerAtk, battlerDef, modifier, illusionSpecies); - if (gMovesInfo[move].category == DAMAGE_CATEGORY_STATUS && move != MOVE_THUNDER_WAVE) + if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS && move != MOVE_THUNDER_WAVE) { modifier = UQ_4_12(1.0); if (B_GLARE_GHOST < GEN_4 && move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) modifier = UQ_4_12(0.0); } - else if (moveType == TYPE_GROUND && !IsBattlerGroundedInverseCheck(battlerDef, TRUE) && !(gMovesInfo[move].ignoreTypeIfFlyingAndUngrounded)) + else if (moveType == TYPE_GROUND && !IsBattlerGroundedInverseCheck(battlerDef, TRUE) && !(MoveIgnoresTypeIfFlyingAndUngrounded(move))) { modifier = UQ_4_12(0.0); if (recordAbilities && defAbility == ABILITY_LEVITATE) { + gBattleStruct->moveResultFlags[battlerDef] |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastUsedAbility = ABILITY_LEVITATE; - gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastLandedMoves[battlerDef] = 0; - gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; + gBattleStruct->missStringId[battlerDef] = B_MSG_GROUND_MISS; RecordAbilityBattle(battlerDef, ABILITY_LEVITATE); } } @@ -10616,30 +10726,30 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(u32 move, u32 mov } // Thousand Arrows ignores type modifiers for flying mons - if (!IsBattlerGrounded(battlerDef) && (gMovesInfo[move].ignoreTypeIfFlyingAndUngrounded) - && (GetBattlerType(battlerDef, 0, FALSE) == TYPE_FLYING || GetBattlerType(battlerDef, 1, FALSE) == TYPE_FLYING || GetBattlerType(battlerDef, 2, FALSE) == TYPE_FLYING)) + if (!IsBattlerGrounded(battlerDef) + && MoveIgnoresTypeIfFlyingAndUngrounded(move) + && IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING)) { modifier = UQ_4_12(1.0); } if (((defAbility == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0)) || (defAbility == ABILITY_TELEPATHY && battlerDef == BATTLE_PARTNER(battlerAtk))) - && gMovesInfo[move].power) + && GetMovePower(move) != 0) { modifier = UQ_4_12(0.0); if (recordAbilities) { gLastUsedAbility = gBattleMons[battlerDef].ability; - gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_MISSED; gLastLandedMoves[battlerDef] = 0; - gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG; + gBattleStruct->missStringId[battlerDef] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(battlerDef, gBattleMons[battlerDef].ability); } } - // Signal for the trainer slide-in system. - if (GetBattlerSide(battlerDef) != B_SIDE_PLAYER && modifier && gBattleStruct->trainerSlideFirstSTABMoveMsgState != 2) - gBattleStruct->trainerSlideFirstSTABMoveMsgState = 1; + if (recordAbilities) + TryInitializeFirstSTABMoveTrainerSlide(battlerDef, battlerAtk, moveType); return modifier; } @@ -10651,33 +10761,32 @@ uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { modifier = CalcTypeEffectivenessMultiplierInternal(move, moveType, battlerAtk, battlerDef, recordAbilities, modifier, defAbility); - if (gMovesInfo[move].effect == EFFECT_TWO_TYPED_MOVE) - modifier = CalcTypeEffectivenessMultiplierInternal(move, gMovesInfo[move].argument, battlerAtk, battlerDef, recordAbilities, modifier, defAbility); + if (GetMoveEffect(move) == EFFECT_TWO_TYPED_MOVE) + modifier = CalcTypeEffectivenessMultiplierInternal(move, GetMoveArgType(move), battlerAtk, battlerDef, recordAbilities, modifier, defAbility); } if (recordAbilities) - UpdateMoveResultFlags(modifier); + UpdateMoveResultFlags(modifier, &gBattleStruct->moveResultFlags[battlerDef]); return modifier; } uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef) { uq4_12_t modifier = UQ_4_12(1.0); - u32 moveType = GetMoveType(move); + u32 moveType = GetBattleMoveType(move); if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { - MulByTypeEffectiveness(&modifier, move, moveType, 0, gSpeciesInfo[speciesDef].types[0], 0, FALSE); + MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, gSpeciesInfo[speciesDef].types[0], 0, FALSE); if (gSpeciesInfo[speciesDef].types[1] != gSpeciesInfo[speciesDef].types[0]) - MulByTypeEffectiveness(&modifier, move, moveType, 0, gSpeciesInfo[speciesDef].types[1], 0, FALSE); + MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, gSpeciesInfo[speciesDef].types[1], 0, FALSE); if (moveType == TYPE_GROUND && abilityDef == ABILITY_LEVITATE && !(gFieldStatuses & STATUS_FIELD_GRAVITY)) modifier = UQ_4_12(0.0); - if (abilityDef == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0) && gMovesInfo[move].power) + if (abilityDef == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0) && GetMovePower(move) != 0) modifier = UQ_4_12(0.0); } - UpdateMoveResultFlags(modifier); return modifier; } @@ -10706,9 +10815,9 @@ uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType) if (moveType != TYPE_MYSTERY) { - MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, type1, 0, FALSE); + MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, 0, type1, 0, FALSE); if (type2 != type1) - MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, type2, 0, FALSE); + MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, 0, type2, 0, FALSE); if ((modifier <= UQ_4_12(1.0) && abilityDef == ABILITY_WONDER_GUARD) || (moveType == TYPE_FIRE && abilityDef == ABILITY_FLASH_FIRE) @@ -10735,14 +10844,14 @@ uq4_12_t GetTypeModifier(u32 atkType, u32 defType) return gTypeEffectivenessTable[atkType][defType]; } -s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 maxHp) +s32 GetStealthHazardDamageByTypesAndHP(enum TypeSideHazard hazardType, u8 type1, u8 type2, u32 maxHp) { s32 dmg = 0; uq4_12_t modifier = UQ_4_12(1.0); - modifier = uq4_12_multiply(modifier, GetTypeModifier(hazardType, type1)); + modifier = uq4_12_multiply(modifier, GetTypeModifier((u8)hazardType, type1)); if (type2 != type1) - modifier = uq4_12_multiply(modifier, GetTypeModifier(hazardType, type2)); + modifier = uq4_12_multiply(modifier, GetTypeModifier((u8)hazardType, type2)); switch (modifier) { @@ -10779,7 +10888,7 @@ s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 ma return dmg; } -s32 GetStealthHazardDamage(u8 hazardType, u32 battler) +s32 GetStealthHazardDamage(enum TypeSideHazard hazardType, u32 battler) { u8 type1 = gBattleMons[battler].types[0]; u8 type2 = gBattleMons[battler].types[1]; @@ -10805,21 +10914,18 @@ bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId) u32 i; const struct FormChange *formChanges = GetSpeciesFormChanges(species); - if (formChanges != NULL) + for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) { - for (i = 0; formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) + switch (formChanges[i].method) { - switch (formChanges[i].method) - { - case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM: - case FORM_CHANGE_BATTLE_PRIMAL_REVERSION: - case FORM_CHANGE_BATTLE_ULTRA_BURST: - case FORM_CHANGE_ITEM_HOLD: - case FORM_CHANGE_BEGIN_BATTLE: - if (formChanges[i].param1 == heldItemId) - return TRUE; - break; - } + case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM: + case FORM_CHANGE_BATTLE_PRIMAL_REVERSION: + case FORM_CHANGE_BATTLE_ULTRA_BURST: + case FORM_CHANGE_ITEM_HOLD: + case FORM_CHANGE_BEGIN_BATTLE: + if (formChanges[i].param1 == heldItemId) + return TRUE; + break; } } return FALSE; @@ -10852,11 +10958,11 @@ bool32 CanMegaEvolve(u32 battler) return FALSE; // Check if there is an entry in the form change table for regular Mega Evolution and battler is holding Mega Stone. - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM) != SPECIES_NONE && holdEffect == HOLD_EFFECT_MEGA_STONE) + if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM) != gBattleMons[battler].species && holdEffect == HOLD_EFFECT_MEGA_STONE) return TRUE; // Check if there is an entry in the form change table for Wish Mega Evolution. - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != SPECIES_NONE) + if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != gBattleMons[battler].species) return TRUE; // No checks passed, the mon CAN'T mega evolve. @@ -10886,7 +10992,7 @@ bool32 CanUltraBurst(u32 battler) return FALSE; // Check if there is an entry in the form change table for Ultra Burst and battler is holding a Z-Crystal. - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_ULTRA_BURST) != SPECIES_NONE && holdEffect == HOLD_EFFECT_Z_CRYSTAL) + if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_ULTRA_BURST) != gBattleMons[battler].species && holdEffect == HOLD_EFFECT_Z_CRYSTAL) return TRUE; // No checks passed, the mon CAN'T ultra burst. @@ -10897,7 +11003,7 @@ void ActivateMegaEvolution(u32 battler) { gLastUsedItem = gBattleMons[battler].item; SetActiveGimmick(battler, GIMMICK_MEGA); - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != SPECIES_NONE) + if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != gBattleMons[battler].species) BattleScriptExecute(BattleScript_WishMegaEvolution); else BattleScriptExecute(BattleScript_MegaEvolution); @@ -10946,107 +11052,102 @@ bool32 IsBattlerInTeraForm(u32 battler) u16 GetBattleFormChangeTargetSpecies(u32 battler, u16 method) { u32 i; - u16 targetSpecies = SPECIES_NONE; - u16 species = gBattleMons[battler].species; + u32 species = gBattleMons[battler].species; + u32 targetSpecies = species; const struct FormChange *formChanges = GetSpeciesFormChanges(species); struct Pokemon *mon = &GetBattlerParty(battler)[gBattlerPartyIndexes[battler]]; - u16 heldItem; + u16 heldItem = gBattleMons[battler].item; - if (formChanges != NULL) + for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) { - heldItem = gBattleMons[battler].item; - - for (i = 0; formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) + if (method == formChanges[i].method && species != formChanges[i].targetSpecies) { - if (method == formChanges[i].method && species != formChanges[i].targetSpecies) + switch (method) { - switch (method) + case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM: + case FORM_CHANGE_BATTLE_PRIMAL_REVERSION: + case FORM_CHANGE_BATTLE_ULTRA_BURST: + if (heldItem == formChanges[i].param1) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE: + if (gBattleMons[battler].moves[0] == formChanges[i].param1 + || gBattleMons[battler].moves[1] == formChanges[i].param1 + || gBattleMons[battler].moves[2] == formChanges[i].param1 + || gBattleMons[battler].moves[3] == formChanges[i].param1) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_SWITCH: + if (formChanges[i].param1 == GetBattlerAbility(battler) || formChanges[i].param1 == ABILITY_NONE) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_HP_PERCENT: + if (formChanges[i].param1 == GetBattlerAbility(battler)) { - case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM: - case FORM_CHANGE_BATTLE_PRIMAL_REVERSION: - case FORM_CHANGE_BATTLE_ULTRA_BURST: - if (heldItem == formChanges[i].param1) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE: - if (gBattleMons[battler].moves[0] == formChanges[i].param1 - || gBattleMons[battler].moves[1] == formChanges[i].param1 - || gBattleMons[battler].moves[2] == formChanges[i].param1 - || gBattleMons[battler].moves[3] == formChanges[i].param1) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_SWITCH: - if (formChanges[i].param1 == GetBattlerAbility(battler) || formChanges[i].param1 == ABILITY_NONE) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_HP_PERCENT: - if (formChanges[i].param1 == GetBattlerAbility(battler)) + // We multiply by 100 to make sure that integer division doesn't mess with the health check. + u32 hpCheck = gBattleMons[battler].hp * 100 * 100 / gBattleMons[battler].maxHP; + switch(formChanges[i].param2) { - // We multiply by 100 to make sure that integer division doesn't mess with the health check. - u32 hpCheck = gBattleMons[battler].hp * 100 * 100 / gBattleMons[battler].maxHP; - switch(formChanges[i].param2) - { - case HP_HIGHER_THAN: - if (hpCheck > formChanges[i].param3 * 100) - targetSpecies = formChanges[i].targetSpecies; - break; - case HP_LOWER_EQ_THAN: - if (hpCheck <= formChanges[i].param3 * 100) - targetSpecies = formChanges[i].targetSpecies; - break; - } + case HP_HIGHER_THAN: + if (hpCheck > formChanges[i].param3 * 100) + targetSpecies = formChanges[i].targetSpecies; + break; + case HP_LOWER_EQ_THAN: + if (hpCheck <= formChanges[i].param3 * 100) + targetSpecies = formChanges[i].targetSpecies; + break; } - break; - case FORM_CHANGE_BATTLE_GIGANTAMAX: - if (GetMonData(mon, MON_DATA_GIGANTAMAX_FACTOR)) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_WEATHER: - // Check if there is a required ability and if the battler's ability does not match it - // or is suppressed. If so, revert to the no weather form. - if (formChanges[i].param2 - && GetBattlerAbility(battler) != formChanges[i].param2 - && formChanges[i].param1 == B_WEATHER_NONE) - { - targetSpecies = formChanges[i].targetSpecies; - } - // We need to revert the weather form if the field is under Air Lock, too. - else if (!WEATHER_HAS_EFFECT && formChanges[i].param1 == B_WEATHER_NONE) - { - targetSpecies = formChanges[i].targetSpecies; - } - // Otherwise, just check for a match between the weather and the form change table. - // Added a check for whether the weather is in effect to prevent end-of-turn soft locks with Cloud Nine / Air Lock - else if (((gBattleWeather & formChanges[i].param1) && WEATHER_HAS_EFFECT) - || (gBattleWeather == B_WEATHER_NONE && formChanges[i].param1 == B_WEATHER_NONE)) - { - targetSpecies = formChanges[i].targetSpecies; - } - break; - case FORM_CHANGE_BATTLE_TURN_END: - case FORM_CHANGE_HIT_BY_MOVE: - if (formChanges[i].param1 == GetBattlerAbility(battler)) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_STATUS: - if (gBattleMons[battler].status1 & formChanges[i].param1) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_TERASTALLIZATION: - if (GetBattlerTeraType(battler) == formChanges[i].param1) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_BEFORE_MOVE: - if (formChanges[i].param1 == gCurrentMove - && (formChanges[i].param2 == ABILITY_NONE || formChanges[i].param2 == GetBattlerAbility(battler))) - targetSpecies = formChanges[i].targetSpecies; - break; - case FORM_CHANGE_BATTLE_BEFORE_MOVE_CATEGORY: - if (formChanges[i].param1 == GetBattleMoveCategory(gCurrentMove) - && (formChanges[i].param2 == ABILITY_NONE || formChanges[i].param2 == GetBattlerAbility(battler))) - targetSpecies = formChanges[i].targetSpecies; - break; } + break; + case FORM_CHANGE_BATTLE_GIGANTAMAX: + if (GetMonData(mon, MON_DATA_GIGANTAMAX_FACTOR)) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_WEATHER: + // Check if there is a required ability and if the battler's ability does not match it + // or is suppressed. If so, revert to the no weather form. + if (formChanges[i].param2 + && GetBattlerAbility(battler) != formChanges[i].param2 + && formChanges[i].param1 == B_WEATHER_NONE) + { + targetSpecies = formChanges[i].targetSpecies; + } + // We need to revert the weather form if the field is under Air Lock, too. + else if (!HasWeatherEffect() && formChanges[i].param1 == B_WEATHER_NONE) + { + targetSpecies = formChanges[i].targetSpecies; + } + // Otherwise, just check for a match between the weather and the form change table. + // Added a check for whether the weather is in effect to prevent end-of-turn soft locks with Cloud Nine / Air Lock + else if (((gBattleWeather & formChanges[i].param1) && HasWeatherEffect()) + || (gBattleWeather == B_WEATHER_NONE && formChanges[i].param1 == B_WEATHER_NONE)) + { + targetSpecies = formChanges[i].targetSpecies; + } + break; + case FORM_CHANGE_BATTLE_TURN_END: + case FORM_CHANGE_HIT_BY_MOVE: + if (formChanges[i].param1 == GetBattlerAbility(battler)) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_STATUS: + if (gBattleMons[battler].status1 & formChanges[i].param1) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_TERASTALLIZATION: + if (GetBattlerTeraType(battler) == formChanges[i].param1) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_BEFORE_MOVE: + if (formChanges[i].param1 == gCurrentMove + && (formChanges[i].param2 == ABILITY_NONE || formChanges[i].param2 == GetBattlerAbility(battler))) + targetSpecies = formChanges[i].targetSpecies; + break; + case FORM_CHANGE_BATTLE_BEFORE_MOVE_CATEGORY: + if (formChanges[i].param1 == GetBattleMoveCategory(gCurrentMove) + && (formChanges[i].param2 == ABILITY_NONE || formChanges[i].param2 == GetBattlerAbility(battler))) + targetSpecies = formChanges[i].targetSpecies; + break; } } } @@ -11076,15 +11177,16 @@ bool32 TryBattleFormChange(u32 battler, u32 method) u32 monId = gBattlerPartyIndexes[battler]; u32 side = GetBattlerSide(battler); struct Pokemon *party = GetBattlerParty(battler); + u32 currentSpecies = GetMonData(&party[monId], MON_DATA_SPECIES); u32 targetSpecies; if (!CanBattlerFormChange(battler, method)) return FALSE; targetSpecies = GetBattleFormChangeTargetSpecies(battler, method); - if (targetSpecies == SPECIES_NONE) + if (targetSpecies == currentSpecies) targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0); - if (targetSpecies != SPECIES_NONE) + if (targetSpecies != currentSpecies) { // Saves the original species on the first form change. if (gBattleStruct->changedSpecies[side][monId] == SPECIES_NONE) @@ -11132,8 +11234,9 @@ bool32 TryBattleFormChange(u32 battler, u32 method) bool32 DoBattlersShareType(u32 battler1, u32 battler2) { s32 i; - u8 types1[3] = {GetBattlerType(battler1, 0, FALSE), GetBattlerType(battler1, 1, FALSE), GetBattlerType(battler1, 2, FALSE)}; - u8 types2[3] = {GetBattlerType(battler2, 0, FALSE), GetBattlerType(battler2, 1, FALSE), GetBattlerType(battler2, 2, FALSE)}; + u32 types1[3], types2[3]; + GetBattlerTypes(battler1, FALSE, types1); + GetBattlerTypes(battler2, FALSE, types2); if (types1[2] == TYPE_MYSTERY) types1[2] = types1[0]; @@ -11250,7 +11353,7 @@ bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler) return FALSE; else if (GetBattlerSide(battler) != B_SIDE_PLAYER) return FALSE; - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && TRAINER_BATTLE_PARAM.opponentA == TRAINER_SECRET_BASE) return FALSE; else if (FlagGet(badgeFlag)) return TRUE; @@ -11260,7 +11363,7 @@ bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler) static u32 SwapMoveDamageCategory(u32 move) { - if (gMovesInfo[move].category == DAMAGE_CATEGORY_PHYSICAL) + if (GetMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) return DAMAGE_CATEGORY_SPECIAL; return DAMAGE_CATEGORY_PHYSICAL; } @@ -11272,11 +11375,11 @@ u8 GetBattleMoveCategory(u32 moveId) if (gBattleStruct != NULL && (IsZMove(moveId) || IsMaxMove(moveId))) // TODO: Might be buggy depending on when this is called. return gBattleStruct->categoryOverride; if (B_PHYSICAL_SPECIAL_SPLIT >= GEN_4) - return gMovesInfo[moveId].category; + return GetMoveCategory(moveId); - if (IS_MOVE_STATUS(moveId)) + if (IsBattleMoveStatus(moveId)) return DAMAGE_CATEGORY_STATUS; - return gTypesInfo[GetMoveType(moveId)].damageCategory; + return gTypesInfo[GetBattleMoveType(moveId)].damageCategory; } static bool32 TryRemoveScreens(u32 battler) @@ -11286,22 +11389,16 @@ static bool32 TryRemoveScreens(u32 battler) u8 enemySide = GetBattlerSide(BATTLE_OPPOSITE(battler)); // try to remove from battler's side - if (gSideStatuses[battlerSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)) + if (gSideStatuses[battlerSide] & SIDE_STATUS_SCREEN_ANY) { - gSideStatuses[battlerSide] &= ~(SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL); - gSideTimers[battlerSide].reflectTimer = 0; - gSideTimers[battlerSide].lightscreenTimer = 0; - gSideTimers[battlerSide].auroraVeilTimer = 0; + gSideStatuses[battlerSide] &= ~SIDE_STATUS_SCREEN_ANY; removed = TRUE; } // try to remove from battler opponent's side - if (gSideStatuses[enemySide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)) + if (gSideStatuses[enemySide] & SIDE_STATUS_SCREEN_ANY) { - gSideStatuses[enemySide] &= ~(SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL); - gSideTimers[enemySide].reflectTimer = 0; - gSideTimers[enemySide].lightscreenTimer = 0; - gSideTimers[enemySide].auroraVeilTimer = 0; + gSideStatuses[enemySide] &= ~SIDE_STATUS_SCREEN_ANY; removed = TRUE; } @@ -11339,7 +11436,7 @@ static u32 GetFlingPowerFromItemId(u32 itemId) { if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08) { - u32 power = gMovesInfo[ItemIdToBattleMoveId(itemId)].power; + u32 power = GetMovePower(ItemIdToBattleMoveId(itemId)); if (power > 1) return power; return 10; // Status moves and moves with variable power always return 10 power. @@ -11605,7 +11702,7 @@ bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 ch return FALSE; if (!gProtectStructs[battlerPrankster].pranksterElevated) return FALSE; - if (GetBattlerSide(battlerPrankster) == GetBattlerSide(battlerDef)) + if (IsBattlerAlly(battlerPrankster, battlerDef)) return FALSE; if (checkTarget && (GetBattlerMoveTargetType(battlerPrankster, move) & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_DEPENDS))) return FALSE; @@ -11643,9 +11740,9 @@ bool32 PickupHasValidTarget(u32 battler) bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) { - if (gBattleWeather & weatherFlags && WEATHER_HAS_EFFECT) + if (gBattleWeather & weatherFlags && HasWeatherEffect()) { - // given weather is active -> check if its sun, rain against utility umbrella ( since only 1 weather can be active at once) + // given weather is active -> check if its sun, rain against utility umbrella (since only 1 weather can be active at once) if (gBattleWeather & (B_WEATHER_SUN | B_WEATHER_RAIN) && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) return FALSE; // utility umbrella blocks sun, rain effects @@ -11660,23 +11757,25 @@ u32 GetBattlerMoveTargetType(u32 battler, u32 move) { if (move == MOVE_CURSE && !IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return MOVE_TARGET_USER; - if (gMovesInfo[move].effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, STATUS_FIELD_PSYCHIC_TERRAIN)) + u32 effect = GetMoveEffect(move); + if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, STATUS_FIELD_PSYCHIC_TERRAIN)) return MOVE_TARGET_BOTH; - if (gMovesInfo[move].effect == EFFECT_TERA_STARSTORM && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) + if (effect == EFFECT_TERA_STARSTORM && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) return MOVE_TARGET_BOTH; - return gMovesInfo[move].target; + return GetMoveTarget(move); } bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move) { - if (gMovesInfo[move].effect == EFFECT_HIT_ENEMY_HEAL_ALLY - && GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef) - && gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) + if (GetMoveEffect(move) == EFFECT_HIT_ENEMY_HEAL_ALLY + && IsBattlerAlly(battlerAtk, battlerDef) + && gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) return FALSE; // Pokémon affected by Heal Block cannot target allies with Pollen Puff - if ((GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX || IsGimmickSelected(battlerAtk, GIMMICK_DYNAMAX)) - && GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef)) + if (IsBattlerAlly(battlerAtk, battlerDef) && (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX + || IsGimmickSelected(battlerAtk, GIMMICK_DYNAMAX))) return FALSE; + return TRUE; } @@ -11797,11 +11896,6 @@ bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct Addi return additionalEffect->chance == 0 || CalcSecondaryEffectChance(battler, battlerAbility, additionalEffect) >= 100; } -bool32 IsAlly(u32 battlerAtk, u32 battlerDef) -{ - return (GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef)); -} - bool32 IsGen6ExpShareEnabled(void) { if (I_EXP_SHARE_FLAG <= TEMP_FLAGS_END) @@ -11814,10 +11908,11 @@ bool32 IsGen6ExpShareEnabled(void) bool32 MoveHasAdditionalEffect(u32 move, u32 moveEffect) { u32 i; - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - if (gMovesInfo[move].additionalEffects[i].moveEffect == moveEffect - && gMovesInfo[move].additionalEffects[i].self == FALSE) + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + if (additionalEffect->moveEffect == moveEffect && additionalEffect->self == FALSE) return TRUE; } return FALSE; @@ -11826,10 +11921,11 @@ bool32 MoveHasAdditionalEffect(u32 move, u32 moveEffect) bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance) { u32 i; - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - if (gMovesInfo[move].additionalEffects[i].moveEffect == moveEffect - && gMovesInfo[move].additionalEffects[i].chance == chance) + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + if (additionalEffect->moveEffect == moveEffect && additionalEffect->chance == chance) return TRUE; } return FALSE; @@ -11838,26 +11934,28 @@ bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance) bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect) { u32 i; - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - if (gMovesInfo[move].additionalEffects[i].moveEffect == moveEffect - && gMovesInfo[move].additionalEffects[i].self == TRUE) + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + if (additionalEffect->moveEffect == moveEffect && additionalEffect->self == TRUE) return TRUE; } return FALSE; } -bool32 MoveHasAdditionalEffectSelfArg(u32 move, u32 moveEffect, u32 argument) +bool32 IsMoveEffectRemoveSpeciesType(u32 move, u32 moveEffect, u32 argument) { - return (gMovesInfo[move].argument == argument) && MoveHasAdditionalEffectSelf(move, moveEffect); + return (GetMoveArgType(move) == argument) && MoveHasAdditionalEffectSelf(move, moveEffect); } bool32 MoveHasChargeTurnAdditionalEffect(u32 move) { u32 i; - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - if (gMovesInfo[move].additionalEffects[i].onChargeTurnOnly) + if (GetMoveAdditionalEffectById(move, i)->onChargeTurnOnly) return TRUE; } return FALSE; @@ -11866,14 +11964,16 @@ bool32 MoveHasChargeTurnAdditionalEffect(u32 move) bool32 MoveIsAffectedBySheerForce(u32 move) { u32 i; - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); + for (i = 0; i < numAdditionalEffects; i++) { - if (gMovesInfo[move].additionalEffects[i].sheerForceBoost == SHEER_FORCE_NO_BOOST) + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + if (additionalEffect->sheerForceBoost == SHEER_FORCE_NO_BOOST) continue; - if (gMovesInfo[move].additionalEffects[i].chance > 0) + if (additionalEffect->chance > 0) return TRUE; - if (gMovesInfo[move].additionalEffects[i].sheerForceBoost == SHEER_FORCE_BOOST) + if (additionalEffect->sheerForceBoost == SHEER_FORCE_BOOST) return TRUE; } return FALSE; @@ -11930,31 +12030,40 @@ bool8 IsMonBannedFromSkyBattles(u16 species) } } -u8 GetBattlerType(u32 battler, u8 typeIndex, bool32 ignoreTera) +void GetBattlerTypes(u32 battler, bool32 ignoreTera, u32 types[static 3]) { - u32 teraType = GetBattlerTeraType(battler); - u16 types[3] = {0}; + // Terastallization. + bool32 isTera = GetActiveGimmick(battler) == GIMMICK_TERA; + if (!ignoreTera && isTera) + { + u32 teraType = GetBattlerTeraType(battler); + if (teraType != TYPE_STELLAR) + { + types[0] = types[1] = types[2] = teraType; + return; + } + } + types[0] = gBattleMons[battler].types[0]; types[1] = gBattleMons[battler].types[1]; types[2] = gBattleMons[battler].types[2]; - // Handle Terastallization - if (GetActiveGimmick(battler) == GIMMICK_TERA && teraType != TYPE_STELLAR && !ignoreTera) - return GetBattlerTeraType(battler); - - // Handle Roost's Flying-type suppression - if (typeIndex == 0 || typeIndex == 1) + // Roost. + if (!isTera && gDisableStructs[battler].roostActive) { - if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_ROOST - && GetActiveGimmick(battler) != GIMMICK_TERA) - { - if (types[0] == TYPE_FLYING && types[1] == TYPE_FLYING) - return B_ROOST_PURE_FLYING >= GEN_5 ? TYPE_NORMAL : TYPE_MYSTERY; - else - return types[typeIndex] == TYPE_FLYING ? TYPE_MYSTERY : types[typeIndex]; - } + if (types[0] == TYPE_FLYING && types[1] == TYPE_FLYING) + types[0] = types[1] = B_ROOST_PURE_FLYING >= GEN_5 ? TYPE_NORMAL : TYPE_MYSTERY; + else if (types[0] == TYPE_FLYING) + types[0] = TYPE_MYSTERY; + else if (types[1] == TYPE_FLYING) + types[1] = TYPE_MYSTERY; } +} +u32 GetBattlerType(u32 battler, u32 typeIndex, bool32 ignoreTera) +{ + u32 types[3]; + GetBattlerTypes(battler, ignoreTera, types); return types[typeIndex]; } @@ -11980,6 +12089,7 @@ void SetShellSideArmCategory(void) u8 statStage; u32 physical; u32 special; + u32 power = GetMovePower(MOVE_SHELL_SIDE_ARM); // Don't run this check for Safari Battles. Because player's stats are zeroed out, this performs division by zero which previously would crash on certain emulators in Safari Zone. if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) @@ -12007,14 +12117,14 @@ void SetShellSideArmCategory(void) targetDefStat *= gStatStageRatios[statStage][0]; targetDefStat /= gStatStageRatios[statStage][1]; - physical = ((((2 * gBattleMons[battlerAtk].level / 5 + 2) * gMovesInfo[MOVE_SHELL_SIDE_ARM].power * attackerAtkStat) / targetDefStat) / 50); + physical = ((((2 * gBattleMons[battlerAtk].level / 5 + 2) * power * attackerAtkStat) / targetDefStat) / 50); targetSpDefStat = gBattleMons[battlerDef].spDefense; statStage = gBattleMons[battlerDef].statStages[STAT_SPDEF]; targetSpDefStat *= gStatStageRatios[statStage][0]; targetSpDefStat /= gStatStageRatios[statStage][1]; - special = ((((2 * gBattleMons[battlerAtk].level / 5 + 2) * gMovesInfo[MOVE_SHELL_SIDE_ARM].power * attackerSpAtkStat) / targetSpDefStat) / 50); + special = ((((2 * gBattleMons[battlerAtk].level / 5 + 2) * power * attackerSpAtkStat) / targetSpDefStat) / 50); if ((physical > special) || (physical == special && RandomPercentage(RNG_SHELL_SIDE_ARM, 50))) gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] = DAMAGE_CATEGORY_PHYSICAL; @@ -12039,13 +12149,13 @@ static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerDef) bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef) { - return ((CalcTypeEffectivenessMultiplier(gCurrentMove, GetMoveType(gCurrentMove), battlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) + return ((CalcTypeEffectivenessMultiplier(gCurrentMove, GetBattleMoveType(gCurrentMove), battlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) || IsBattlerProtected(battlerAtk, battlerDef, gCurrentMove) || IsSemiInvulnerable(battlerDef, gCurrentMove) || DoesBattlerHaveAbilityImmunity(battlerDef)); } -u32 GetMoveType(u32 move) +u32 GetBattleMoveType(u32 move) { if (gMain.inBattle && gBattleStruct->dynamicMoveType) return gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; @@ -12054,5 +12164,134 @@ u32 GetMoveType(u32 move) || move == MOVE_FUTURE_SIGHT || move == MOVE_DOOM_DESIRE)) return TYPE_MYSTERY; - return gMovesInfo[move].type; + return GetMoveType(move); +} + +void TryActivateSleepClause(u32 battler, u32 indexInParty) +{ + if (gBattleStruct->battlerState[battler].sleepClauseEffectExempt) + { + gBattleStruct->battlerState[battler].sleepClauseEffectExempt = FALSE; + return; + } + + if (IsSleepClauseEnabled()) + gBattleStruct->monCausingSleepClause[GetBattlerSide(battler)] = indexInParty; +} + +void TryDeactivateSleepClause(u32 battlerSide, u32 indexInParty) +{ + // If the pokemon on the given side at the given index in the party is the one causing Sleep Clause to be active, + // set monCausingSleepClause[battlerSide] = PARTY_SIZE, which means Sleep Clause is not active for the given side + if (IsSleepClauseEnabled() && gBattleStruct->monCausingSleepClause[battlerSide] == indexInParty) + gBattleStruct->monCausingSleepClause[battlerSide] = PARTY_SIZE; +} + +bool32 IsSleepClauseActiveForSide(u32 battlerSide) +{ + // If monCausingSleepClause[battlerSide] == PARTY_SIZE, Sleep Clause is not active for the given side. + // If monCausingSleepClause[battlerSide] < PARTY_SIZE, it means it is storing the index of the mon that is causing Sleep Clause to be active, + // from which it follows that Sleep Clause is active. + return (IsSleepClauseEnabled() && (gBattleStruct->monCausingSleepClause[battlerSide] < PARTY_SIZE)); +} + +bool32 IsSleepClauseEnabled() +{ + if (B_SLEEP_CLAUSE) + return TRUE; + if (FlagGet(B_FLAG_SLEEP_CLAUSE)) + return TRUE; + return FALSE; +} + +void ClearDamageCalcResults(void) +{ + for (u32 battler = 0; battler < MAX_BATTLERS_COUNT; battler++) + { + gBattleStruct->moveDamage[battler] = 0; + gBattleStruct->critChance[battler] = 0; + gBattleStruct->moveResultFlags[battler] = 0; + gBattleStruct->noResultString[battler] = 0; + gBattleStruct->missStringId[battler] = 0; + gSpecialStatuses[battler].criticalHit = FALSE; + } + + gBattleStruct->doneDoublesSpreadHit = FALSE; + gBattleStruct->calculatedDamageDone = FALSE; + gBattleStruct->calculatedSpreadMoveAccuracy = FALSE; + gBattleStruct->printedStrongWindsWeakenedAttack = FALSE; + gBattleStruct->numSpreadTargets = 0; +} + +bool32 DoesDestinyBondFail(u32 battler) +{ + if (B_DESTINY_BOND_FAIL >= GEN_7 + && GetMoveEffect(gLastResultingMoves[battler]) == EFFECT_DESTINY_BOND + && !gBattleStruct->battlerState[battler].lastMoveFailed) + return TRUE; + return FALSE; +} + +// This check has always to be the last in a condtion statement because of the recording of AI data. +bool32 IsMoveEffectBlockedByTarget(u32 ability) +{ + if (ability == ABILITY_SHIELD_DUST) + { + RecordAbilityBattle(gBattlerTarget, ability); + return TRUE; + } + else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_COVERT_CLOAK) + { + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_COVERT_CLOAK); + return TRUE; + } + + return FALSE; +} + +u32 NumAffectedSpreadMoveTargets(void) +{ + u32 targetCount = 1; + + if (!IsDoubleSpreadMove()) + return targetCount; + + targetCount = 0; + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) + targetCount++; + } + + return targetCount; +} + +bool32 IsPursuitTargetSet(void) +{ + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleStruct->battlerState[battler].pursuitTarget) + return TRUE; + } + return FALSE; +} + +void ClearPursuitValues(void) +{ + for (u32 i = 0; i < gBattlersCount; i++) + gBattleStruct->battlerState[i].pursuitTarget = FALSE; + gBattleStruct->pursuitStoredSwitch = PARTY_SIZE; +} + +void ClearPursuitValuesIfSet(u32 battler) +{ + if (gBattleStruct->battlerState[battler].pursuitTarget) + ClearPursuitValues(); +} + +bool32 HasWeatherEffect(void) +{ + if (IsAbilityOnField(ABILITY_CLOUD_NINE) || IsAbilityOnField(ABILITY_AIR_LOCK)) + return FALSE; + return TRUE; } diff --git a/src/battle_util2.c b/src/battle_util2.c index e72246381f..6d7c82cbe5 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -25,7 +25,6 @@ void AllocateBattleResources(void) gBattleResources = AllocZeroed(sizeof(*gBattleResources)); gBattleResources->secretBase = AllocZeroed(sizeof(*gBattleResources->secretBase)); - gBattleResources->flags = AllocZeroed(sizeof(*gBattleResources->flags)); gBattleResources->battleScriptsStack = AllocZeroed(sizeof(*gBattleResources->battleScriptsStack)); gBattleResources->battleCallbackStack = AllocZeroed(sizeof(*gBattleResources->battleCallbackStack)); gBattleResources->beforeLvlUp = AllocZeroed(sizeof(*gBattleResources->beforeLvlUp)); @@ -58,7 +57,6 @@ void FreeBattleResources(void) FREE_AND_SET_NULL(gBattleStruct); FREE_AND_SET_NULL(gBattleResources->secretBase); - FREE_AND_SET_NULL(gBattleResources->flags); FREE_AND_SET_NULL(gBattleResources->battleScriptsStack); FREE_AND_SET_NULL(gBattleResources->battleCallbackStack); FREE_AND_SET_NULL(gBattleResources->beforeLvlUp); diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 5e6cfe8e0e..c878a2c12b 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -151,7 +151,7 @@ u32 GetUsableZMove(u32 battler, u32 move) if (zMove != MOVE_NONE) return zMove; // Signature z move exists - if (move != MOVE_NONE && zMove != MOVE_Z_STATUS && gMovesInfo[move].type == ItemId_GetSecondaryId(item)) + if (move != MOVE_NONE && zMove != MOVE_Z_STATUS && GetMoveType(move) == ItemId_GetSecondaryId(item)) return GetTypeBasedZMove(move); } @@ -195,7 +195,7 @@ bool32 IsViableZMove(u32 battler, u32 move) if (zMove != MOVE_NONE) return TRUE; - if (move != MOVE_NONE && gMovesInfo[move].type == ItemId_GetSecondaryId(item)) + if (move != MOVE_NONE && GetMoveType(move) == ItemId_GetSecondaryId(item)) return TRUE; } @@ -243,13 +243,13 @@ u32 GetSignatureZMove(u32 move, u32 species, u32 item) u32 GetTypeBasedZMove(u32 move) { - u32 moveType = gMovesInfo[move].type; + u32 moveType = GetMoveType(move); if (moveType >= NUMBER_OF_MON_TYPES) moveType = TYPE_MYSTERY; // Z-Weather Ball changes types, however Revelation Dance, -ate ability affected moves, and Hidden Power do not - if (gBattleStruct->dynamicMoveType && gMovesInfo[move].effect == EFFECT_WEATHER_BALL) + if (gBattleStruct->dynamicMoveType && GetMoveEffect(move) == EFFECT_WEATHER_BALL) moveType = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; // Get Z-Move from type @@ -276,9 +276,9 @@ bool32 MoveSelectionDisplayZMove(u16 zmove, u32 battler) BattlePutTextOnWindow(gDisplayedStringBattle, i + 3); } - if (IS_MOVE_STATUS(move)) + if (IsBattleMoveStatus(move)) { - u8 zEffect = gMovesInfo[move].zMove.effect; + u8 zEffect = GetMoveZEffect(move); gDisplayedStringBattle[0] = EOS; @@ -388,9 +388,9 @@ static void ZMoveSelectionDisplayPower(u16 move, u16 zMove) u16 power = GetZMovePower(move); if (zMove >= MOVE_CATASTROPIKA) - power = gMovesInfo[zMove].power; + power = GetMovePower(zMove); - if (gMovesInfo[move].category != DAMAGE_CATEGORY_STATUS) + if (GetMoveCategory(move) != DAMAGE_CATEGORY_STATUS) { txtPtr = StringCopy(gDisplayedStringBattle, sText_PowerColon); ConvertIntToDecimalStringN(txtPtr, power, STR_CONV_MODE_LEFT_ALIGN, 3); @@ -415,7 +415,7 @@ static void ZMoveSelectionDisplayPpNumber(u32 battler) static void ZMoveSelectionDisplayMoveType(u16 zMove, u32 battler) { u8 *txtPtr, *end; - u32 zMoveType = GetMoveType(zMove); + u32 zMoveType = GetBattleMoveType(zMove); txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); *(txtPtr)++ = EXT_CTRL_CODE_BEGIN; @@ -433,7 +433,7 @@ static void ZMoveSelectionDisplayMoveType(u16 zMove, u32 battler) void SetZEffect(void) { u32 i; - u32 effect = gMovesInfo[gBattleStruct->zmove.baseMoves[gBattlerAttacker]].zMove.effect; + u32 effect = GetMoveZEffect(gBattleStruct->zmove.baseMoves[gBattlerAttacker]); if (effect == Z_EFFECT_CURSE) { @@ -503,7 +503,7 @@ void SetZEffect(void) case Z_EFFECT_RECOVER_HP: if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) { - gBattleMoveDamage = (-1) * gBattleMons[gBattlerAttacker].maxHP; + gBattleStruct->moveDamage[gBattlerAttacker] = (-1) * gBattleMons[gBattlerAttacker].maxHP; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_RECOVER_HP; BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); gBattlescriptCurrInstr = BattleScript_RecoverHPZMove; @@ -542,35 +542,25 @@ void SetZEffect(void) u32 GetZMovePower(u32 move) { - if (gMovesInfo[move].category == DAMAGE_CATEGORY_STATUS) + if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS) return 0; - if (gMovesInfo[move].effect == EFFECT_OHKO) + if (GetMoveEffect(move) == EFFECT_OHKO) return 180; - if (gMovesInfo[move].zMove.powerOverride > 0) - return gMovesInfo[move].zMove.powerOverride; - else - { - if (gMovesInfo[move].power >= 140) - return 200; - else if (gMovesInfo[move].power >= 130) - return 195; - else if (gMovesInfo[move].power >= 120) - return 190; - else if (gMovesInfo[move].power >= 110) - return 185; - else if (gMovesInfo[move].power >= 100) - return 180; - else if (gMovesInfo[move].power >= 90) - return 175; - else if (gMovesInfo[move].power >= 80) - return 160; - else if (gMovesInfo[move].power >= 70) - return 140; - else if (gMovesInfo[move].power >= 60) - return 120; - else - return 100; - } + u32 power = GetMoveZPowerOverride(move); + if (power > 0) + return power; + + power = GetMovePower(move); + if (power >= 140) return 200; + else if (power >= 130) return 195; + else if (power >= 120) return 190; + else if (power >= 110) return 185; + else if (power >= 100) return 180; + else if (power >= 90) return 175; + else if (power >= 80) return 160; + else if (power >= 70) return 140; + else if (power >= 60) return 120; + else return 100; } diff --git a/src/berry_blender.c b/src/berry_blender.c index bf094b6fb9..0a6eaaa2bf 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -1126,68 +1126,84 @@ static void CB2_LoadBerryBlender(void) UpdatePaletteFade(); } -#define sTargetY data[0] -#define sX data[1] -#define sY data[2] -#define sBounceSpeed data[3] -#define sYUpSpeed data[4] -#define sBounces data[5] -#define sXSpeed data[6] -#define sYDownSpeed data[7] +// Because of changing how Berry sprites are generated, we have to leave data[6] and data[7] untouched as it has an allocated memory ptr for berry's gfx. +struct BerrySpriteData +{ + s16 sTargetY; // data0 + s16 sX; // data1 + s16 sY; // data2 + + s8 sBounceSpeed; // data3 + u8 berryId; // data3 + + s8 sYUpSpeed; // data4 + s8 sBounces; // data4 + + s8 sXSpeed; // data5 + s8 sYDownSpeed; // data5 +}; + +static inline struct BerrySpriteData *GetBerrySpriteDataAsStructPtr(struct Sprite *sprite) +{ + return (void *)(&sprite->data[0]); +} // For throwing berries into the machine static void SpriteCB_Berry(struct Sprite *sprite) { - sprite->sX += sprite->sXSpeed; - sprite->sY -= sprite->sYUpSpeed; - sprite->sY += sprite->sYDownSpeed; - sprite->sTargetY += sprite->sYDownSpeed; - sprite->sYUpSpeed--; + struct BerrySpriteData *spriteData = GetBerrySpriteDataAsStructPtr(sprite); - if (sprite->sTargetY < sprite->sY) + spriteData->sX += spriteData->sXSpeed; + spriteData->sY -= spriteData->sYUpSpeed; + spriteData->sY += spriteData->sYDownSpeed; + spriteData->sTargetY += spriteData->sYDownSpeed; + spriteData->sYUpSpeed--; + + if (spriteData->sTargetY < spriteData->sY) { - sprite->sBounceSpeed = sprite->sYUpSpeed = sprite->sBounceSpeed - 1; + spriteData->sBounceSpeed = spriteData->sYUpSpeed = spriteData->sBounceSpeed - 1; - if (++sprite->sBounces > 3) - DestroySprite(sprite); + if (++spriteData->sBounces > 3) + { + DestroyBerryIconSpritePtr(sprite, spriteData->berryId, TRUE); + return; + } else + { PlaySE(SE_BALL_TRAY_EXIT); + } } - sprite->x = sprite->sX; - sprite->y = sprite->sY; + sprite->x = spriteData->sX; + sprite->y = spriteData->sY; } -static void SetBerrySpriteData(struct Sprite *sprite, s16 x, s16 y, s16 bounceSpeed, s16 xSpeed, s16 ySpeed) +static void SetBerrySpriteData(struct Sprite *sprite, s32 x, s32 y, s32 bounceSpeed, s32 xSpeed, s32 ySpeed, u32 berryId) { - sprite->sTargetY = y; - sprite->sX = x; - sprite->sY = y; - sprite->sBounceSpeed = bounceSpeed; - sprite->sYUpSpeed = 10; - sprite->sBounces = 0; - sprite->sXSpeed = xSpeed; - sprite->sYDownSpeed = ySpeed; + struct BerrySpriteData *spriteData = GetBerrySpriteDataAsStructPtr(sprite); + + spriteData->sTargetY = y; + spriteData->sX = x; + spriteData->sY = y; + spriteData->sBounceSpeed = bounceSpeed; + spriteData->sYUpSpeed = 10; + spriteData->sBounces = 0; + spriteData->sXSpeed = xSpeed; + spriteData->sYDownSpeed = ySpeed; + spriteData->berryId = berryId; sprite->callback = SpriteCB_Berry; } -#undef sTargetY -#undef sX -#undef sY -#undef sBounceSpeed -#undef sYUpSpeed -#undef sBounces -#undef sXSpeed -#undef sYDownSpeed - -static void CreateBerrySprite(u16 itemId, u8 playerId) +static void CreateBerrySprite(u32 itemId, u32 playerId) { - u8 spriteId = CreateSpinningBerrySprite(ITEM_TO_BERRY(itemId) - 1, 0, 80, playerId & 1); + u32 berryId = ITEM_TO_BERRY(itemId) - 1; + u32 spriteId = CreateSpinningBerrySprite(berryId, 0, 80, playerId & 1); SetBerrySpriteData(&gSprites[spriteId], sBerrySpriteData[playerId][0], sBerrySpriteData[playerId][1], sBerrySpriteData[playerId][2], sBerrySpriteData[playerId][3], - sBerrySpriteData[playerId][4]); + sBerrySpriteData[playerId][4], + berryId); } static void ConvertItemToBlenderBerry(struct BlenderBerry* berry, u16 itemId) @@ -1676,13 +1692,14 @@ static void CB2_StartBlenderLocal(void) u32 playerId = sPlayerIdMap[sBerryBlender->numPlayers - 2][i]; if (sBerryBlender->playerToThrowBerry == playerId) { - CreateBerrySprite(sBerryBlender->chosenItemId[sBerryBlender->playerToThrowBerry], i); - break; + CreateBerrySprite(sBerryBlender->chosenItemId[sBerryBlender->playerToThrowBerry++], i); + // If we're throwing all at once, continue the loop. If not, break out of the loop(vanilla behavior). + if (!BERRY_BLENDER_THROW_ALL_BERRIES_AT_ONCE) + break; } } sBerryBlender->framesToWait = 0; sBerryBlender->mainState++; - sBerryBlender->playerToThrowBerry++; break; case 12: if (++sBerryBlender->framesToWait > 60) diff --git a/src/berry_crush.c b/src/berry_crush.c old mode 100755 new mode 100644 index 1f997708a7..8010639840 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -1941,12 +1941,10 @@ static void DrawPlayerNameWindows(struct BerryCrushGame *game) // Each player name window border uses a color that corresponds to a slot of the crusher lid static void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame *game) { - u8 i = 0; - u8 *windowGfx; + s32 i; + u8 *windowGfx = malloc_and_decompress(gBerryCrush_TextWindows_Tilemap, NULL); - LZ77UnCompWram(gBerryCrush_TextWindows_Tilemap, gDecompressionBuffer); - - for (windowGfx = gDecompressionBuffer; i < game->playerCount; i++) + for (i = 0; i < game->playerCount; i++) { CopyToBgTilemapBufferRect( 3, @@ -1958,6 +1956,8 @@ static void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame *game) ); } CopyBgTilemapBufferToVram(3); + + Free(windowGfx); } static void CreateGameSprites(struct BerryCrushGame *game) diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c index fcd322ce33..1f9d403ea5 100644 --- a/src/berry_tag_screen.c +++ b/src/berry_tag_screen.c @@ -43,6 +43,7 @@ struct BerryTagScreenStruct { u16 tilemapBuffers[3][0x400]; u16 berryId; + u16 currentSpriteBerryId; u8 berrySpriteId; u8 flavorCircleIds[FLAVOR_COUNT]; u16 gfxState; @@ -466,13 +467,13 @@ static void PrintBerryDescription2(void) static void CreateBerrySprite(void) { - sBerryTag->berrySpriteId = CreateBerryTagSprite(sBerryTag->berryId - 1, 56, 64); + sBerryTag->currentSpriteBerryId = sBerryTag->berryId - 1; + sBerryTag->berrySpriteId = CreateBerryTagSprite(sBerryTag->currentSpriteBerryId, 56, 64); } static void DestroyBerrySprite(void) { - DestroySprite(&gSprites[sBerryTag->berrySpriteId]); - FreeBerryTagSpritePalette(); + DestroyBerryIconSprite(sBerryTag->berrySpriteId, sBerryTag->currentSpriteBerryId, TRUE); } static void CreateFlavorCircleSprites(void) diff --git a/src/bg.c b/src/bg.c index 27a5fb0501..73b5be14e8 100644 --- a/src/bg.c +++ b/src/bg.c @@ -3,6 +3,8 @@ #include "bg.h" #include "dma3.h" #include "gpu_regs.h" +#include "malloc.h" +#include "menu.h" #define DISPCNT_ALL_BG_AND_MODE_BITS (DISPCNT_BG_ALL_ON | 0x7) @@ -865,7 +867,7 @@ void *GetBgTilemapBuffer(u32 bg) return sGpuBgConfigs2[bg].tilemap; } -void CopyToBgTilemapBuffer(u32 bg, const void *src, u16 mode, u16 destOffset) +void CopyToBgTilemapBuffer(u32 bg, const void *src, u32 mode, u32 destOffset) { if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { @@ -876,6 +878,14 @@ void CopyToBgTilemapBuffer(u32 bg, const void *src, u16 mode, u16 destOffset) } } +void DecompressAndCopyToBgTilemapBuffer(u32 bg, const u32 *src, u32 mode, u32 destOffset) +{ + void *buffer = malloc_and_decompress(src, NULL); + + CopyToBgTilemapBuffer(bg, buffer, mode, destOffset); + Free(buffer); +} + void CopyBgTilemapBufferToVram(u32 bg) { u16 sizeToLoad; diff --git a/src/bike.c b/src/bike.c index 5bbf647ce9..afc3099ab7 100644 --- a/src/bike.c +++ b/src/bike.c @@ -996,8 +996,6 @@ bool8 IsPlayerNotUsingAcroBikeOnBumpySlope(void) void GetOnOffBike(u8 transitionFlags) { - gUnusedBikeCameraAheadPanback = FALSE; - if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) { SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); diff --git a/src/cable_club.c b/src/cable_club.c index d6a2903fd4..1a115c31ef 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -867,7 +867,7 @@ static void Task_StartWiredCableClubBattle(u8 taskId) SetLinkBattleTypeFlags(gSpecialVar_0x8004); CleanupOverworldWindowsAndTilemaps(); - gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_LINK_OPPONENT; SetMainCallback2(CB2_InitBattle); gMain.savedCallback = CB2_ReturnFromCableClubBattle; DestroyTask(taskId); @@ -933,7 +933,7 @@ static void Task_StartWirelessCableClubBattle(u8 taskId) gLinkPlayers[0].linkType = LINKTYPE_BATTLE; SetLinkBattleTypeFlags(gSpecialVar_0x8004); CleanupOverworldWindowsAndTilemaps(); - gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_LINK_OPPONENT; SetMainCallback2(CB2_InitBattle); gMain.savedCallback = CB2_ReturnFromCableClubBattle; DestroyTask(taskId); diff --git a/src/clock.c b/src/clock.c index 54c9422bbe..d122fc782c 100644 --- a/src/clock.c +++ b/src/clock.c @@ -83,9 +83,10 @@ static void FormChangeTimeUpdate() for (i = 0; i < PARTY_SIZE; i++) { struct Pokemon *mon = &gPlayerParty[i]; - u16 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_TIME_OF_DAY, 0); + u32 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_TIME_OF_DAY, 0); + u32 currentSpecies = GetMonData(mon, MON_DATA_SPECIES); - if (targetSpecies != SPECIES_NONE) + if (targetSpecies != currentSpecies) { SetMonData(mon, MON_DATA_SPECIES, &targetSpecies); CalculateMonStats(mon); diff --git a/src/contest.c b/src/contest.c index 8b217356d2..be17d83941 100644 --- a/src/contest.c +++ b/src/contest.c @@ -1639,7 +1639,7 @@ static void Task_ShowMoveSelectScreen(u8 taskId) } else if (move != MOVE_NONE && eContestantStatus[gContestPlayerMonIndex].prevMove == move - && gMovesInfo[move].contestEffect != CONTEST_EFFECT_REPETITION_NOT_BORING) + && GetMoveContestEffect(move) != CONTEST_EFFECT_REPETITION_NOT_BORING) { // Gray the text because it's a repeated move moveNameBuffer = StringCopy(moveName, gText_ColorBlue); @@ -2310,7 +2310,7 @@ static void Task_DoAppeals(u8 taskId) } else { - StringCopy(gStringVar3, sContestConditions[gMovesInfo[eContestantStatus[contestant].currMove].contestCategory]); + StringCopy(gStringVar3, sContestConditions[GetMoveContestCategory(eContestantStatus[contestant].currMove)]); } if (r3 > 0 && eContestantStatus[contestant].repeatedMove) @@ -2956,7 +2956,6 @@ void SetContestants(u8 contestType, u8 rank) u8 opponentsCount = 0; u8 opponents[100]; bool8 allowPostgameContestants = FALSE; - const u8 *filter; TryPutPlayerLast(); @@ -2964,19 +2963,18 @@ void SetContestants(u8 contestType, u8 rank) allowPostgameContestants = TRUE; // Find all suitable opponents - filter = gPostgameContestOpponentFilter; for (i = 0; i < ARRAY_COUNT(gContestOpponents); i++) { if (rank == gContestOpponents[i].whichRank) { if (allowPostgameContestants == TRUE) { - if (filter[i] == CONTEST_FILTER_NO_POSTGAME) + if (gContestOpponents[i].filter == CONTEST_FILTER_NO_POSTGAME) continue; } else { - if (filter[i] == CONTEST_FILTER_ONLY_POSTGAME) + if (gContestOpponents[i].filter == CONTEST_FILTER_ONLY_POSTGAME) continue; } if (contestType == CONTEST_CATEGORY_COOL && gContestOpponents[i].aiPool_Cool) @@ -3025,12 +3023,12 @@ void SetLinkAIContestants(u8 contestType, u8 rank, bool32 isPostgame) if (isPostgame == TRUE) { - if (gPostgameContestOpponentFilter[i] == CONTEST_FILTER_NO_POSTGAME) + if (gContestOpponents[i].filter == CONTEST_FILTER_NO_POSTGAME) continue; } else { - if (gPostgameContestOpponentFilter[i] == CONTEST_FILTER_ONLY_POSTGAME) + if (gContestOpponents[i].filter == CONTEST_FILTER_ONLY_POSTGAME) continue; } if ((contestType == CONTEST_CATEGORY_COOL && gContestOpponents[i].aiPool_Cool) @@ -3267,7 +3265,7 @@ static u16 GetMoveEffectSymbolTileOffset(u16 move, u8 contestant) { u16 offset; - switch (gContestEffects[gMovesInfo[move].contestEffect].effectType) + switch (gContestEffects[GetMoveContestEffect(move)].effectType) { case CONTEST_EFFECT_TYPE_APPEAL: case CONTEST_EFFECT_TYPE_AVOID_STARTLE: @@ -3296,7 +3294,7 @@ static void PrintContestMoveDescription(u16 move) u8 numHearts; // The contest category icon is implemented as a 5x2 group of tiles. - category = gMovesInfo[move].contestCategory; + category = GetMoveContestCategory(move); if (category == CONTEST_CATEGORY_COOL) categoryTile = 0x4040; else if (category == CONTEST_CATEGORY_BEAUTY) @@ -3312,27 +3310,27 @@ static void PrintContestMoveDescription(u16 move) ContestBG_FillBoxWithIncrementingTile(0, categoryTile + 0x10, 0x0b, 0x20, 0x05, 0x01, 0x11, 0x01); // Appeal hearts - if (gContestEffects[gMovesInfo[move].contestEffect].appeal == 0xFF) + if (gContestEffects[GetMoveContestEffect(move)].appeal == 0xFF) numHearts = 0; else - numHearts = gContestEffects[gMovesInfo[move].contestEffect].appeal / 10; + numHearts = gContestEffects[GetMoveContestEffect(move)].appeal / 10; if (numHearts > MAX_CONTEST_MOVE_HEARTS) numHearts = MAX_CONTEST_MOVE_HEARTS; ContestBG_FillBoxWithTile(0, TILE_EMPTY_APPEAL_HEART, 0x15, 0x1f, MAX_CONTEST_MOVE_HEARTS, 0x01, 0x11); ContestBG_FillBoxWithTile(0, TILE_FILLED_APPEAL_HEART, 0x15, 0x1f, numHearts, 0x01, 0x11); // Jam hearts - if (gContestEffects[gMovesInfo[move].contestEffect].jam == 0xFF) + if (gContestEffects[GetMoveContestEffect(move)].jam == 0xFF) numHearts = 0; else - numHearts = gContestEffects[gMovesInfo[move].contestEffect].jam / 10; + numHearts = gContestEffects[GetMoveContestEffect(move)].jam / 10; if (numHearts > MAX_CONTEST_MOVE_HEARTS) numHearts = MAX_CONTEST_MOVE_HEARTS; ContestBG_FillBoxWithTile(0, TILE_EMPTY_JAM_HEART, 0x15, 0x20, MAX_CONTEST_MOVE_HEARTS, 0x01, 0x11); ContestBG_FillBoxWithTile(0, TILE_FILLED_JAM_HEART, 0x15, 0x20, numHearts, 0x01, 0x11); FillWindowPixelBuffer(WIN_MOVE_DESCRIPTION, PIXEL_FILL(0)); - Contest_PrintTextToBg0WindowStd(WIN_MOVE_DESCRIPTION, gContestEffectDescriptionPointers[gMovesInfo[move].contestEffect]); + Contest_PrintTextToBg0WindowStd(WIN_MOVE_DESCRIPTION, gContestEffectDescriptionPointers[GetMoveContestEffect(move)]); Contest_PrintTextToBg0WindowStd(WIN_SLASH, gText_Slash); } @@ -4533,9 +4531,9 @@ static void CalculateAppealMoveImpact(u8 contestant) return; move = eContestantStatus[contestant].currMove; - effect = gMovesInfo[move].contestEffect; + effect = GetMoveContestEffect(move); - eContestantStatus[contestant].moveCategory = gMovesInfo[eContestantStatus[contestant].currMove].contestCategory; + eContestantStatus[contestant].moveCategory = GetMoveContestCategory(eContestantStatus[contestant].currMove); if (eContestantStatus[contestant].currMove == eContestantStatus[contestant].prevMove && eContestantStatus[contestant].currMove != MOVE_NONE) { eContestantStatus[contestant].repeatedMove = TRUE; @@ -4586,7 +4584,7 @@ static void CalculateAppealMoveImpact(u8 contestant) } else { - if (gMovesInfo[eContestantStatus[contestant].currMove].contestComboStarterId != 0) + if (GetMoveContestComboStarter(eContestantStatus[contestant].currMove) != 0) { eContestantStatus[contestant].hasJudgesAttention = TRUE; eContestantStatus[contestant].usedComboMove = TRUE; @@ -4666,13 +4664,13 @@ static void PrintAppealMoveResultText(u8 contestant, u8 stringId) { StringCopy(gStringVar1, gContestMons[contestant].nickname); StringCopy(gStringVar2, GetMoveName(eContestantStatus[contestant].currMove)); - if (gMovesInfo[eContestantStatus[eContestAppealResults.contestant].currMove].contestCategory == CONTEST_CATEGORY_COOL) + if (GetMoveContestCategory(eContestantStatus[eContestAppealResults.contestant].currMove) == CONTEST_CATEGORY_COOL) StringCopy(gStringVar3, gText_Contest_Shyness); - else if (gMovesInfo[eContestantStatus[eContestAppealResults.contestant].currMove].contestCategory == CONTEST_CATEGORY_BEAUTY) + else if (GetMoveContestCategory(eContestantStatus[eContestAppealResults.contestant].currMove) == CONTEST_CATEGORY_BEAUTY) StringCopy(gStringVar3, gText_Contest_Anxiety); - else if (gMovesInfo[eContestantStatus[eContestAppealResults.contestant].currMove].contestCategory == CONTEST_CATEGORY_CUTE) + else if (GetMoveContestCategory(eContestantStatus[eContestAppealResults.contestant].currMove) == CONTEST_CATEGORY_CUTE) StringCopy(gStringVar3, gText_Contest_Laziness); - else if (gMovesInfo[eContestantStatus[eContestAppealResults.contestant].currMove].contestCategory == CONTEST_CATEGORY_SMART) + else if (GetMoveContestCategory(eContestantStatus[eContestAppealResults.contestant].currMove) == CONTEST_CATEGORY_SMART) StringCopy(gStringVar3, gText_Contest_Hesitancy); else StringCopy(gStringVar3, gText_Contest_Fear); @@ -4845,7 +4843,7 @@ static void UpdateApplauseMeter(void) s8 Contest_GetMoveExcitement(u16 move) { - return sContestExcitementTable[gSpecialVar_ContestCategory][gMovesInfo[move].contestCategory]; + return sContestExcitementTable[gSpecialVar_ContestCategory][GetMoveContestCategory(move)]; } static u8 StartApplauseOverflowAnimation(void) diff --git a/src/contest_ai.c b/src/contest_ai.c index f131c709ac..4386aeee64 100644 --- a/src/contest_ai.c +++ b/src/contest_ai.c @@ -758,7 +758,7 @@ static void ContestAICmd_get_move_effect(void) { u16 move = gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex]; - eContestAI.scriptResult = gMovesInfo[move].contestEffect; + eContestAI.scriptResult = GetMoveContestEffect(move); gAIScriptPtr += 1; } @@ -786,7 +786,7 @@ static void ContestAICmd_get_move_effect_type(void) { u16 move = gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex]; - eContestAI.scriptResult = gContestEffects[gMovesInfo[move].contestEffect].effectType; + eContestAI.scriptResult = gContestEffects[GetMoveContestEffect(move)].effectType; gAIScriptPtr += 1; } @@ -814,12 +814,12 @@ static void ContestAICmd_check_most_appealing_move(void) { int i; u16 move = gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex]; - u8 appeal = gContestEffects[gMovesInfo[move].contestEffect].appeal; + u8 appeal = gContestEffects[GetMoveContestEffect(move)].appeal; for (i = 0; i < MAX_MON_MOVES; i++) { u16 newMove = gContestMons[eContestAI.contestantId].moves[i]; - if (newMove != 0 && appeal < gContestEffects[gMovesInfo[newMove].contestEffect].appeal) + if (newMove != 0 && appeal < gContestEffects[GetMoveContestEffect(newMove)].appeal) break; } @@ -845,12 +845,12 @@ static void ContestAICmd_check_most_jamming_move(void) { int i; u16 move = gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex]; - u8 jam = gContestEffects[gMovesInfo[move].contestEffect].jam; + u8 jam = gContestEffects[GetMoveContestEffect(move)].jam; for (i = 0; i < MAX_MON_MOVES; i++) { u16 newMove = gContestMons[eContestAI.contestantId].moves[i]; - if (newMove != MOVE_NONE && jam < gContestEffects[gMovesInfo[newMove].contestEffect].jam) + if (newMove != MOVE_NONE && jam < gContestEffects[GetMoveContestEffect(newMove)].jam) break; } @@ -876,7 +876,7 @@ static void ContestAICmd_get_num_move_hearts(void) { u16 move = gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex]; - eContestAI.scriptResult = gContestEffects[gMovesInfo[move].contestEffect].appeal / 10; + eContestAI.scriptResult = gContestEffects[GetMoveContestEffect(move)].appeal / 10; gAIScriptPtr += 1; } @@ -924,7 +924,7 @@ static void ContestAICmd_get_num_move_jam_hearts(void) { u16 move = gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex]; - eContestAI.scriptResult = gContestEffects[gMovesInfo[move].contestEffect].jam / 10; + eContestAI.scriptResult = gContestEffects[GetMoveContestEffect(move)].jam / 10; gAIScriptPtr += 1; } @@ -1203,7 +1203,7 @@ static void ContestAICmd_get_used_combo_starter(void) u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]); if (IsContestantAllowedToCombo(contestant)) - result = gMovesInfo[eContestantStatus[contestant].prevMove].contestComboStarterId ? TRUE : FALSE; + result = GetMoveContestComboStarter(eContestantStatus[contestant].prevMove) ? TRUE : FALSE; eContestAI.scriptResult = result; gAIScriptPtr += 2; @@ -1409,7 +1409,7 @@ static void ContestAICmd_get_used_moves_effect(void) u8 round = gAIScriptPtr[2]; u16 move = eContest.moveHistory[round][contestant]; - eContestAI.scriptResult = gMovesInfo[move].contestEffect; + eContestAI.scriptResult = GetMoveContestEffect(move); gAIScriptPtr += 3; } @@ -1509,7 +1509,7 @@ static void ContestAICmd_get_used_moves_effect_type(void) u8 round = gAIScriptPtr[2]; u16 move = eContest.moveHistory[round][contestant]; - eContestAI.scriptResult = gContestEffects[gMovesInfo[move].contestEffect].effectType; + eContestAI.scriptResult = gContestEffects[GetMoveContestEffect(move)].effectType; gAIScriptPtr += 3; } @@ -1748,7 +1748,7 @@ static void ContestAICmd_check_user_has_move(void) for (i = 0; i < MAX_MON_MOVES; i++) { #ifdef BUGFIX - u16 move = gMovesInfo[gContestMons[eContestAI.contestantId].moves[i]].contestEffect; + u16 move = GetMoveContestEffect(gContestMons[eContestAI.contestantId].moves[i]); #else u16 move = gContestMons[eContestAI.contestantId].moves[i]; #endif diff --git a/src/contest_effect.c b/src/contest_effect.c index 0de31339f4..51416ba14a 100644 --- a/src/contest_effect.c +++ b/src/contest_effect.c @@ -1,4 +1,5 @@ #include "global.h" +#include "move.h" #include "random.h" #include "constants/moves.h" #include "contest.h" @@ -60,7 +61,7 @@ static s16 RoundUp(s16); bool8 AreMovesContestCombo(u16 lastMove, u16 nextMove) { int i; - u8 lastMoveComboStarterId = gMovesInfo[lastMove].contestComboStarterId; + u8 lastMoveComboStarterId = GetMoveContestComboStarter(lastMove); if (lastMoveComboStarterId == 0) { @@ -70,7 +71,7 @@ bool8 AreMovesContestCombo(u16 lastMove, u16 nextMove) { for (i = 0; i < MAX_COMBO_MOVES; i++) { - if (lastMoveComboStarterId == gMovesInfo[nextMove].contestComboMoves[i]) + if (lastMoveComboStarterId == GetMoveContestComboMoves(nextMove, i)) return TRUE; } return FALSE; @@ -132,7 +133,7 @@ static void ContestEffect_UserLessEasilyStartled(void) SetContestantEffectStringID(eContestAppealResults.contestant,CONTEST_STRING_STOPPED_CARING); } -// Slightly startles the POKMON in front. +// Slightly startles the POK�MON in front. static void ContestEffect_StartleFrontMon(void) { u8 idx = 0; @@ -180,7 +181,7 @@ static void ContestEffect_StartlePrevMons(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Startles the POKMON that appealed before the user. +// Startles the POK�MON that appealed before the user. static void ContestEffect_StartlePrevMon2(void) { u8 rval = Random() % 10; @@ -197,7 +198,7 @@ static void ContestEffect_StartlePrevMon2(void) ContestEffect_StartleFrontMon(); } -// Startles all POKMON that appealed before the user. +// Startles all POK�MON that appealed before the user. static void ContestEffect_StartlePrevMons2(void) { u8 numStartled = 0; @@ -273,7 +274,7 @@ static void ContestEffect_ShiftJudgeAttention(void) } } -// Startles the POKMON that has the JUDGE's attention. +// Startles the POK�MON that has the JUDGE's attention. static void ContestEffect_StartleMonWithJudgesAttention(void) { u8 numStartled = 0; @@ -311,50 +312,50 @@ static void ContestEffect_JamsOthersButMissOneTurn(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Startles POKMON that made a same-type appeal. +// Startles POK�MON that made a same-type appeal. static void ContestEffect_StartleMonsSameTypeAppeal(void) { u16 move = eContestantStatus[eContestAppealResults.contestant].currMove; - JamByMoveCategory(gMovesInfo[move].contestCategory); + JamByMoveCategory(GetMoveContestCategory(move)); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKMON that made COOL appeals. +// Badly startles POK�MON that made COOL appeals. static void ContestEffect_StartleMonsCoolAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_COOL); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKMON that made BEAUTY appeals. +// Badly startles POK�MON that made BEAUTY appeals. static void ContestEffect_StartleMonsBeautyAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_BEAUTY); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKMON that made CUTE appeals. +// Badly startles POK�MON that made CUTE appeals. static void ContestEffect_StartleMonsCuteAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_CUTE); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKMON that made SMART appeals. +// Badly startles POK�MON that made SMART appeals. static void ContestEffect_StartleMonsSmartAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_SMART); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKMON that made TOUGH appeals. +// Badly startles POK�MON that made TOUGH appeals. static void ContestEffect_StartleMonsToughAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_TOUGH); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Makes one POKMON after the user nervous. +// Makes one POK�MON after the user nervous. static void ContestEffect_MakeFollowingMonNervous(void) { bool32 hitAny = FALSE; @@ -386,7 +387,7 @@ static void ContestEffect_MakeFollowingMonNervous(void) SetContestantEffectStringID2(eContestAppealResults.contestant, CONTEST_STRING_MESSED_UP2); } -// Makes all POKMON after the user nervous. +// Makes all POK�MON after the user nervous. static void ContestEffect_MakeFollowingMonsNervous(void) { u8 numUnnerved = 0; @@ -428,7 +429,7 @@ static void ContestEffect_MakeFollowingMonsNervous(void) for (i = 0; i < CONTESTANT_COUNT; i++) { if (eContestantStatus[i].hasJudgesAttention && IsContestantAllowedToCombo(i)) - oddsMod[i] = gMovesInfo[eContestantStatus[i].prevMove].contestComboStarterId == 0 ? 0 : 10; + oddsMod[i] = GetMoveContestComboStarter(eContestantStatus[i].prevMove) == 0 ? 0 : 10; else oddsMod[i] = 0; oddsMod[i] -= (eContestantStatus[i].condition / 10) * 10; @@ -493,7 +494,7 @@ static void ContestEffect_WorsenConditionOfPrevMons(void) SetContestantEffectStringID2(eContestAppealResults.contestant, CONTEST_STRING_IGNORED); } -// Badly startles POKMON in good condition. +// Badly startles POK�MON in good condition. static void ContestEffect_BadlyStartlesMonsInGoodCondition(void) { u8 numHit = 0; @@ -524,7 +525,7 @@ static void ContestEffect_BetterIfFirst(void) if (gContestantTurnOrder[eContestAppealResults.contestant] == 0) { u16 move = eContestantStatus[eContestAppealResults.contestant].currMove; - eContestantStatus[eContestAppealResults.contestant].appeal += 2 * gContestEffects[gMovesInfo[move].contestEffect].appeal; + eContestantStatus[eContestAppealResults.contestant].appeal += 2 * gContestEffects[GetMoveContestEffect(move)].appeal; SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_HUSTLE_STANDOUT); } } @@ -535,7 +536,7 @@ static void ContestEffect_BetterIfLast(void) if (gContestantTurnOrder[eContestAppealResults.contestant] == 3) { u16 move = eContestantStatus[eContestAppealResults.contestant].currMove; - eContestantStatus[eContestAppealResults.contestant].appeal += 2 * gContestEffects[gMovesInfo[move].contestEffect].appeal; + eContestantStatus[eContestAppealResults.contestant].appeal += 2 * gContestEffects[GetMoveContestEffect(move)].appeal; SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_WORK_HARD_UNNOTICED); } } @@ -671,9 +672,9 @@ static void ContestEffect_BetterIfSameType(void) } move = eContestantStatus[eContestAppealResults.contestant].currMove; - if (gMovesInfo[move].contestCategory == gMovesInfo[eContestantStatus[j].currMove].contestCategory) + if (GetMoveContestCategory(move) == GetMoveContestCategory(eContestantStatus[j].currMove)) { - eContestantStatus[eContestAppealResults.contestant].appeal += gContestEffects[gMovesInfo[move].contestEffect].appeal * 2; + eContestantStatus[eContestAppealResults.contestant].appeal += gContestEffects[GetMoveContestEffect(move)].appeal * 2; SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_SAME_TYPE_GOOD); } } @@ -689,9 +690,9 @@ static void ContestEffect_BetterIfDiffType(void) for (i = 0; i < CONTESTANT_COUNT; i++) { if (eContestAppealResults.turnOrder[eContestAppealResults.contestant] - 1 == eContestAppealResults.turnOrder[i] && - gMovesInfo[move].contestCategory != gMovesInfo[eContestantStatus[i].currMove].contestCategory) + GetMoveContestCategory(move) != GetMoveContestCategory(eContestantStatus[i].currMove)) { - eContestantStatus[eContestAppealResults.contestant].appeal += gContestEffects[gMovesInfo[move].contestEffect].appeal * 2; + eContestantStatus[eContestAppealResults.contestant].appeal += gContestEffects[GetMoveContestEffect(move)].appeal * 2; SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_DIFF_TYPE_GOOD); break; } @@ -891,13 +892,13 @@ static void ContestEffect_ScrambleNextTurnOrder(void) // An appeal that excites the audience in any CONTEST. static void ContestEffect_ExciteAudienceInAnyContest(void) { - if (gMovesInfo[eContestantStatus[eContestAppealResults.contestant].currMove].contestCategory != gSpecialVar_ContestCategory) + if (GetMoveContestCategory(eContestantStatus[eContestAppealResults.contestant].currMove) != gSpecialVar_ContestCategory) { eContestantStatus[eContestAppealResults.contestant].overrideCategoryExcitementMod = TRUE; } } -// Badly startles all POKMON that made good appeals. +// Badly startles all POK�MON that made good appeals. static void ContestEffect_BadlyStartleMonsWithGoodAppeals(void) { int i; @@ -980,7 +981,7 @@ static void JamByMoveCategory(u8 category) { if (eContestAppealResults.turnOrder[eContestAppealResults.contestant] > eContestAppealResults.turnOrder[i]) { - if (category == gMovesInfo[eContestantStatus[i].currMove].contestCategory) + if (category == GetMoveContestCategory(eContestantStatus[i].currMove)) eContestAppealResults.jam = 40; else eContestAppealResults.jam = 10; diff --git a/src/contest_link.c b/src/contest_link.c index 9a960e00ac..3ddbd82b1a 100644 --- a/src/contest_link.c +++ b/src/contest_link.c @@ -21,8 +21,7 @@ static void Task_LinkContest_InitFlags(u8); bool32 LinkContest_SendBlock(void *src, u16 size) { - memcpy(gDecompressionBuffer, src, size); - if (SendBlock(BitmaskAllOtherLinkPlayers(), gDecompressionBuffer, size)) + if (SendBlock(BitmaskAllOtherLinkPlayers(), src, size)) return TRUE; else return FALSE; diff --git a/src/contest_painting.c b/src/contest_painting.c index 8b647be12f..1911e70689 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -212,7 +212,6 @@ static void ShowContestPainting(void) gMain.state++; break; case 2: - SeedRng(gMain.vblankCounter1); InitKeys(); InitContestPaintingWindow(); gMain.state++; @@ -595,4 +594,3 @@ static void CreateContestPaintingPicture(u8 contestWinnerId, bool8 isForArtist) InitPaintingMonOamData(contestWinnerId); LoadContestPaintingFrame(contestWinnerId, isForArtist); } - diff --git a/src/credits.c b/src/credits.c index 5d5a80cf78..c06a6fca9b 100644 --- a/src/credits.c +++ b/src/credits.c @@ -81,10 +81,8 @@ struct CreditsEntry const u8 *text; }; -static EWRAM_DATA s16 UNUSED sUnkVar = 0; // Never read, only set to 0 static EWRAM_DATA u16 sSavedTaskId = 0; EWRAM_DATA bool8 gHasHallOfFameRecords = 0; -static EWRAM_DATA bool8 sUsedSpeedUp = 0; // Never read static EWRAM_DATA struct CreditsData *sCreditsData = {0}; static const u16 sCredits_Pal[] = INCBIN_U16("graphics/credits/credits.gbapal"); @@ -272,16 +270,6 @@ static const union AnimCmd *const sAnims_Rival[] = sAnim_Rival_Still, }; -#define MONBG_OFFSET (MON_PIC_SIZE * 3) -static const struct SpriteSheet sSpriteSheet_MonBg[] = { - { gDecompressionBuffer, MONBG_OFFSET, TAG_MON_BG }, - {}, -}; -static const struct SpritePalette sSpritePalette_MonBg[] = { - { (const u16 *)&gDecompressionBuffer[MONBG_OFFSET], TAG_MON_BG }, - {}, -}; - static const struct OamData sOamData_MonBg = { .y = DISPLAY_HEIGHT, @@ -355,7 +343,6 @@ static void CB2_Credits(void) VBlankCB_Credits(); RunTasks(); AnimateSprites(); - sUsedSpeedUp = TRUE; } BuildOamBuffer(); UpdatePaletteFade(); @@ -448,7 +435,6 @@ void CB2_StartCreditsSequence(void) SetVBlankCallback(VBlankCB_Credits); m4aSongNumStart(MUS_CREDITS); SetMainCallback2(CB2_Credits); - sUsedSpeedUp = FALSE; sCreditsData = AllocZeroed(sizeof(struct CreditsData)); DeterminePokemonToShow(); @@ -480,7 +466,6 @@ static void Task_CreditsMain(u8 taskId) return; } - sUnkVar = 0; mode = gTasks[taskId].tNextMode; if (gTasks[taskId].tNextMode == MODE_BIKE_SCENE) @@ -534,6 +519,8 @@ static void Task_ReadyShowMons(u8 taskId) } } +#define MONBG_OFFSET (MON_PIC_SIZE * 3) + static void Task_LoadShowMons(u8 taskId) { switch (gMain.state) @@ -541,8 +528,11 @@ static void Task_LoadShowMons(u8 taskId) default: case 0: { - u16 i; + s32 i; u16 *temp; + u8 *buffer = Alloc(MONBG_OFFSET + PLTT_SIZEOF(16)); + struct SpriteSheet bgSheet = { buffer, MONBG_OFFSET, TAG_MON_BG }; + struct SpritePalette bgPalette = { (u16 *) &buffer[MONBG_OFFSET], TAG_MON_BG }; ResetSpriteData(); ResetAllPicSprites(); @@ -553,20 +543,22 @@ static void Task_LoadShowMons(u8 taskId) LoadPalette(gBirchBagGrass_Pal + 1, BG_PLTT_ID(0) + 1, PLTT_SIZEOF(2 * 16 - 1)); for (i = 0; i < MON_PIC_SIZE; i++) - gDecompressionBuffer[i] = 0x11; - for (i = 0; i < MON_PIC_SIZE; i++) - (gDecompressionBuffer + MON_PIC_SIZE)[i] = 0x22; - for (i = 0; i < MON_PIC_SIZE; i++) - (gDecompressionBuffer + MON_PIC_SIZE * 2)[i] = 0x33; + { + buffer[i] = 0x11; + (buffer + MON_PIC_SIZE)[i] = 0x22; + (buffer + MON_PIC_SIZE * 2)[i] = 0x33; + } - temp = (u16 *)(&gDecompressionBuffer[MONBG_OFFSET]); + temp = (u16 *)(&buffer[MONBG_OFFSET]); temp[0] = RGB_BLACK; temp[1] = RGB(31, 31, 20); // light yellow temp[2] = RGB(31, 20, 20); // light red temp[3] = RGB(20, 20, 31); // light blue - LoadSpriteSheet(sSpriteSheet_MonBg); - LoadSpritePalette(sSpritePalette_MonBg); + LoadSpriteSheet(&bgSheet); + LoadSpritePalette(&bgPalette); + + Free(buffer); gMain.state++; break; @@ -740,7 +732,6 @@ static void Task_UpdatePage(u8 taskId) gTasks[taskId].tState = 1; gTasks[taskId].tDelay = 72; gTasks[gTasks[taskId].tMainTaskId].tPrintedPage = FALSE; - sUnkVar = 0; } return; case 1: diff --git a/src/crt0.s b/src/crt0.s index af6ea0bc95..bd0eb9426c 100644 --- a/src/crt0.s +++ b/src/crt0.s @@ -14,15 +14,15 @@ Init:: mov r0, #PSR_SYS_MODE msr cpsr_cf, r0 ldr sp, sp_sys -@ Prepare for interrupt handling - ldr r1, =INTR_VECTOR - adr r0, IntrMain - str r0, [r1] @ Dispatch memory reset request to hardware mov r0, #255 @ RESET_ALL svc #1 << 16 @ Fill RAM areas with appropriate data bl InitializeWorkingMemory +@ Prepare for interrupt handling + ldr r1, =INTR_VECTOR + ldr r0, =IntrMain + str r0, [r1] @ Jump to AgbMain ldr r1, =AgbMain + 1 mov lr, pc @@ -37,6 +37,7 @@ sp_irq: .word IWRAM_END - 0x60 .pool .arm + .section .iwram.code .align 2, 0 IntrMain:: mov r3, #REG_BASE @@ -129,6 +130,7 @@ IntrMain_RetAddr: .pool + .text .align 2, 0 @ Don't pad with nop. @ Fills initialized IWRAM and EWRAM sections in RAM from LMA areas in ROM diff --git a/src/data.c b/src/data.c index ccb6b4c623..f5035262c5 100644 --- a/src/data.c +++ b/src/data.c @@ -3,6 +3,7 @@ #include "battle.h" #include "data.h" #include "graphics.h" +#include "trainer_pools.h" #include "battle_transition.h" #include "constants/abilities.h" #include "constants/items.h" @@ -220,14 +221,14 @@ const union AnimCmd *const gAnims_MonPic[MAX_MON_PIC_FRAMES] = sAnim_MonPic_1, }; -const union AnimCmd *const sAnims_Trainer[] ={ +const union AnimCmd *const gAnims_Trainer[] ={ sAnim_GeneralFrame0, sAnim_GeneralFrame0, }; #include "data/trainer_parties.h" -const struct Trainer gTrainers[] = +const struct Trainer gTrainers[DIFFICULTY_COUNT][TRAINERS_COUNT] = { #include "data/trainers.h" }; diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index a09c8d72c8..ad0d2d13d8 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1466,6 +1466,8 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Beam, 0x0800, ANIM_TAG_BEAM}, {gBattleAnimSpriteGfx_PurpleChain, 0x1000, ANIM_TAG_PURPLE_CHAIN}, {gBattleAnimSpriteGfx_PinkVioletOrb, 0x0080, ANIM_TAG_PINKVIO_ORB}, + {gBattleAnimSpriteGfx_TeraStarstormBeam, 0x200, ANIM_TAG_STARSTORM}, + {gBattleAnimSpriteGfx_SaltParticle, 0x400, ANIM_TAG_SALT_PARTICLE}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1933,6 +1935,8 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Beam, ANIM_TAG_BEAM}, {gBattleAnimSpritePal_PurpleChain, ANIM_TAG_PURPLE_CHAIN}, {gBattleAnimSpritePal_PinkVioletOrb, ANIM_TAG_PINKVIO_ORB}, + {gBattleAnimSpritePal_TeraStarstormBeam, ANIM_TAG_STARSTORM}, + {gBattleAnimSpritePal_SaltParticle, ANIM_TAG_SALT_PARTICLE}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/data/battle_frontier/apprentice.h b/src/data/battle_frontier/apprentice.h index 408c3902d5..ef0a77bf11 100644 --- a/src/data/battle_frontier/apprentice.h +++ b/src/data/battle_frontier/apprentice.h @@ -568,367 +568,6 @@ static const u8 *const sApprenticeChallengeTexts[NUM_APPRENTICES] = gText_ApprenticeChallenge15, }; -// Unclear what the criteria are for valid moves -// Notably, a large percentage of multi-strike moves are not valid -static const bool8 sValidApprenticeMoves[MOVES_COUNT] = -{ - [MOVE_NONE] = FALSE, - [MOVE_POUND] = FALSE, - [MOVE_KARATE_CHOP] = TRUE, - [MOVE_DOUBLE_SLAP] = TRUE, - [MOVE_COMET_PUNCH] = FALSE, - [MOVE_MEGA_PUNCH] = TRUE, - [MOVE_PAY_DAY] = FALSE, - [MOVE_FIRE_PUNCH] = TRUE, - [MOVE_ICE_PUNCH] = TRUE, - [MOVE_THUNDER_PUNCH] = TRUE, - [MOVE_SCRATCH] = FALSE, - [MOVE_VISE_GRIP] = FALSE, - [MOVE_GUILLOTINE] = TRUE, - [MOVE_RAZOR_WIND] = FALSE, - [MOVE_SWORDS_DANCE] = TRUE, - [MOVE_CUT] = FALSE, - [MOVE_GUST] = FALSE, - [MOVE_WING_ATTACK] = FALSE, - [MOVE_WHIRLWIND] = TRUE, - [MOVE_FLY] = TRUE, - [MOVE_BIND] = TRUE, - [MOVE_SLAM] = TRUE, - [MOVE_VINE_WHIP] = FALSE, - [MOVE_STOMP] = TRUE, - [MOVE_DOUBLE_KICK] = TRUE, - [MOVE_MEGA_KICK] = TRUE, - [MOVE_JUMP_KICK] = TRUE, - [MOVE_ROLLING_KICK] = TRUE, - [MOVE_SAND_ATTACK] = TRUE, - [MOVE_HEADBUTT] = TRUE, - [MOVE_HORN_ATTACK] = FALSE, - [MOVE_FURY_ATTACK] = FALSE, - [MOVE_HORN_DRILL] = TRUE, - [MOVE_TACKLE] = FALSE, - [MOVE_BODY_SLAM] = TRUE, - [MOVE_WRAP] = TRUE, - [MOVE_TAKE_DOWN] = TRUE, - [MOVE_THRASH] = TRUE, - [MOVE_DOUBLE_EDGE] = TRUE, - [MOVE_TAIL_WHIP] = FALSE, - [MOVE_POISON_STING] = FALSE, - [MOVE_TWINEEDLE] = TRUE, - [MOVE_PIN_MISSILE] = FALSE, - [MOVE_LEER] = FALSE, - [MOVE_BITE] = TRUE, - [MOVE_GROWL] = FALSE, - [MOVE_ROAR] = TRUE, - [MOVE_SING] = TRUE, - [MOVE_SUPERSONIC] = TRUE, - [MOVE_SONIC_BOOM] = TRUE, - [MOVE_DISABLE] = TRUE, - [MOVE_ACID] = FALSE, - [MOVE_EMBER] = FALSE, - [MOVE_FLAMETHROWER] = TRUE, - [MOVE_MIST] = TRUE, - [MOVE_WATER_GUN] = FALSE, - [MOVE_HYDRO_PUMP] = TRUE, - [MOVE_SURF] = TRUE, - [MOVE_ICE_BEAM] = TRUE, - [MOVE_BLIZZARD] = TRUE, - [MOVE_PSYBEAM] = TRUE, - [MOVE_BUBBLE_BEAM] = FALSE, - [MOVE_AURORA_BEAM] = FALSE, - [MOVE_HYPER_BEAM] = TRUE, - [MOVE_PECK] = FALSE, - [MOVE_DRILL_PECK] = TRUE, - [MOVE_SUBMISSION] = TRUE, - [MOVE_LOW_KICK] = TRUE, - [MOVE_COUNTER] = TRUE, - [MOVE_SEISMIC_TOSS] = TRUE, - [MOVE_STRENGTH] = TRUE, - [MOVE_ABSORB] = FALSE, - [MOVE_MEGA_DRAIN] = FALSE, - [MOVE_LEECH_SEED] = TRUE, - [MOVE_GROWTH] = TRUE, - [MOVE_RAZOR_LEAF] = TRUE, - [MOVE_SOLAR_BEAM] = TRUE, - [MOVE_POISON_POWDER] = TRUE, - [MOVE_STUN_SPORE] = TRUE, - [MOVE_SLEEP_POWDER] = TRUE, - [MOVE_PETAL_DANCE] = TRUE, - [MOVE_STRING_SHOT] = FALSE, - [MOVE_DRAGON_RAGE] = TRUE, - [MOVE_FIRE_SPIN] = TRUE, - [MOVE_THUNDER_SHOCK] = FALSE, - [MOVE_THUNDERBOLT] = TRUE, - [MOVE_THUNDER_WAVE] = TRUE, - [MOVE_THUNDER] = TRUE, - [MOVE_ROCK_THROW] = FALSE, - [MOVE_EARTHQUAKE] = TRUE, - [MOVE_FISSURE] = TRUE, - [MOVE_DIG] = TRUE, - [MOVE_TOXIC] = TRUE, - [MOVE_CONFUSION] = FALSE, - [MOVE_PSYCHIC] = TRUE, - [MOVE_HYPNOSIS] = TRUE, - [MOVE_MEDITATE] = TRUE, - [MOVE_AGILITY] = TRUE, - [MOVE_QUICK_ATTACK] = TRUE, - [MOVE_RAGE] = FALSE, - [MOVE_TELEPORT] = FALSE, - [MOVE_NIGHT_SHADE] = TRUE, - [MOVE_MIMIC] = TRUE, - [MOVE_SCREECH] = TRUE, - [MOVE_DOUBLE_TEAM] = TRUE, - [MOVE_RECOVER] = TRUE, - [MOVE_HARDEN] = TRUE, - [MOVE_MINIMIZE] = TRUE, - [MOVE_SMOKESCREEN] = TRUE, - [MOVE_CONFUSE_RAY] = TRUE, - [MOVE_WITHDRAW] = TRUE, - [MOVE_DEFENSE_CURL] = TRUE, - [MOVE_BARRIER] = TRUE, - [MOVE_LIGHT_SCREEN] = TRUE, - [MOVE_HAZE] = TRUE, - [MOVE_REFLECT] = TRUE, - [MOVE_FOCUS_ENERGY] = TRUE, - [MOVE_BIDE] = FALSE, - [MOVE_METRONOME] = TRUE, - [MOVE_MIRROR_MOVE] = TRUE, - [MOVE_SELF_DESTRUCT] = TRUE, - [MOVE_EGG_BOMB] = TRUE, - [MOVE_LICK] = TRUE, - [MOVE_SMOG] = FALSE, - [MOVE_SLUDGE] = FALSE, - [MOVE_BONE_CLUB] = FALSE, - [MOVE_FIRE_BLAST] = TRUE, - [MOVE_WATERFALL] = TRUE, - [MOVE_CLAMP] = TRUE, - [MOVE_SWIFT] = TRUE, - [MOVE_SKULL_BASH] = TRUE, - [MOVE_SPIKE_CANNON] = FALSE, - [MOVE_CONSTRICT] = FALSE, - [MOVE_AMNESIA] = TRUE, - [MOVE_KINESIS] = TRUE, - [MOVE_SOFT_BOILED] = TRUE, - [MOVE_HIGH_JUMP_KICK] = TRUE, - [MOVE_GLARE] = TRUE, - [MOVE_DREAM_EATER] = TRUE, - [MOVE_POISON_GAS] = FALSE, - [MOVE_BARRAGE] = FALSE, - [MOVE_LEECH_LIFE] = FALSE, - [MOVE_LOVELY_KISS] = TRUE, - [MOVE_SKY_ATTACK] = TRUE, - [MOVE_TRANSFORM] = TRUE, - [MOVE_BUBBLE] = FALSE, - [MOVE_DIZZY_PUNCH] = TRUE, - [MOVE_SPORE] = TRUE, - [MOVE_FLASH] = TRUE, - [MOVE_PSYWAVE] = TRUE, - [MOVE_SPLASH] = FALSE, - [MOVE_ACID_ARMOR] = TRUE, - [MOVE_CRABHAMMER] = TRUE, - [MOVE_EXPLOSION] = TRUE, - [MOVE_FURY_SWIPES] = FALSE, - [MOVE_BONEMERANG] = TRUE, - [MOVE_REST] = TRUE, - [MOVE_ROCK_SLIDE] = TRUE, - [MOVE_HYPER_FANG] = TRUE, - [MOVE_SHARPEN] = TRUE, - [MOVE_CONVERSION] = TRUE, - [MOVE_TRI_ATTACK] = TRUE, - [MOVE_SUPER_FANG] = TRUE, - [MOVE_SLASH] = TRUE, - [MOVE_SUBSTITUTE] = TRUE, - [MOVE_STRUGGLE] = TRUE, - [MOVE_SKETCH] = TRUE, - [MOVE_TRIPLE_KICK] = TRUE, - [MOVE_THIEF] = TRUE, - [MOVE_SPIDER_WEB] = TRUE, - [MOVE_MIND_READER] = TRUE, - [MOVE_NIGHTMARE] = TRUE, - [MOVE_FLAME_WHEEL] = FALSE, - [MOVE_SNORE] = TRUE, - [MOVE_CURSE] = TRUE, - [MOVE_FLAIL] = TRUE, - [MOVE_CONVERSION_2] = TRUE, - [MOVE_AEROBLAST] = TRUE, - [MOVE_COTTON_SPORE] = TRUE, - [MOVE_REVERSAL] = TRUE, - [MOVE_SPITE] = TRUE, - [MOVE_POWDER_SNOW] = FALSE, - [MOVE_PROTECT] = TRUE, - [MOVE_MACH_PUNCH] = TRUE, - [MOVE_SCARY_FACE] = TRUE, - [MOVE_FEINT_ATTACK] = TRUE, - [MOVE_SWEET_KISS] = TRUE, - [MOVE_BELLY_DRUM] = TRUE, - [MOVE_SLUDGE_BOMB] = TRUE, - [MOVE_MUD_SLAP] = TRUE, - [MOVE_OCTAZOOKA] = TRUE, - [MOVE_SPIKES] = TRUE, - [MOVE_ZAP_CANNON] = TRUE, - [MOVE_FORESIGHT] = TRUE, - [MOVE_DESTINY_BOND] = TRUE, - [MOVE_PERISH_SONG] = TRUE, - [MOVE_ICY_WIND] = TRUE, - [MOVE_DETECT] = TRUE, - [MOVE_BONE_RUSH] = FALSE, - [MOVE_LOCK_ON] = TRUE, - [MOVE_OUTRAGE] = TRUE, - [MOVE_SANDSTORM] = TRUE, - [MOVE_GIGA_DRAIN] = TRUE, - [MOVE_ENDURE] = TRUE, - [MOVE_CHARM] = TRUE, - [MOVE_ROLLOUT] = TRUE, - [MOVE_FALSE_SWIPE] = TRUE, - [MOVE_SWAGGER] = TRUE, - [MOVE_MILK_DRINK] = TRUE, - [MOVE_SPARK] = FALSE, - [MOVE_FURY_CUTTER] = TRUE, - [MOVE_STEEL_WING] = TRUE, - [MOVE_MEAN_LOOK] = TRUE, - [MOVE_ATTRACT] = TRUE, - [MOVE_SLEEP_TALK] = TRUE, - [MOVE_HEAL_BELL] = TRUE, - [MOVE_RETURN] = TRUE, - [MOVE_PRESENT] = TRUE, - [MOVE_FRUSTRATION] = TRUE, - [MOVE_SAFEGUARD] = TRUE, - [MOVE_PAIN_SPLIT] = TRUE, - [MOVE_SACRED_FIRE] = TRUE, - [MOVE_MAGNITUDE] = FALSE, - [MOVE_DYNAMIC_PUNCH] = TRUE, - [MOVE_MEGAHORN] = TRUE, - [MOVE_DRAGON_BREATH] = TRUE, - [MOVE_BATON_PASS] = TRUE, - [MOVE_ENCORE] = TRUE, - [MOVE_PURSUIT] = TRUE, - [MOVE_RAPID_SPIN] = TRUE, - [MOVE_SWEET_SCENT] = TRUE, - [MOVE_IRON_TAIL] = TRUE, - [MOVE_METAL_CLAW] = TRUE, - [MOVE_VITAL_THROW] = TRUE, - [MOVE_MORNING_SUN] = TRUE, - [MOVE_SYNTHESIS] = TRUE, - [MOVE_MOONLIGHT] = TRUE, - [MOVE_HIDDEN_POWER] = TRUE, - [MOVE_CROSS_CHOP] = TRUE, - [MOVE_TWISTER] = FALSE, - [MOVE_RAIN_DANCE] = TRUE, - [MOVE_SUNNY_DAY] = TRUE, - [MOVE_CRUNCH] = TRUE, - [MOVE_MIRROR_COAT] = TRUE, - [MOVE_PSYCH_UP] = TRUE, - [MOVE_EXTREME_SPEED] = TRUE, - [MOVE_ANCIENT_POWER] = TRUE, - [MOVE_SHADOW_BALL] = TRUE, - [MOVE_FUTURE_SIGHT] = TRUE, - [MOVE_ROCK_SMASH] = TRUE, - [MOVE_WHIRLPOOL] = TRUE, - [MOVE_BEAT_UP] = TRUE, - [MOVE_FAKE_OUT] = TRUE, - [MOVE_UPROAR] = TRUE, - [MOVE_STOCKPILE] = TRUE, - [MOVE_SPIT_UP] = TRUE, - [MOVE_SWALLOW] = TRUE, - [MOVE_HEAT_WAVE] = TRUE, - [MOVE_HAIL] = TRUE, - [MOVE_TORMENT] = TRUE, - [MOVE_FLATTER] = TRUE, - [MOVE_WILL_O_WISP] = TRUE, - [MOVE_MEMENTO] = TRUE, - [MOVE_FACADE] = TRUE, - [MOVE_FOCUS_PUNCH] = TRUE, - [MOVE_SMELLING_SALTS] = TRUE, - [MOVE_FOLLOW_ME] = TRUE, - [MOVE_NATURE_POWER] = TRUE, - [MOVE_CHARGE] = TRUE, - [MOVE_TAUNT] = TRUE, - [MOVE_HELPING_HAND] = TRUE, - [MOVE_TRICK] = TRUE, - [MOVE_ROLE_PLAY] = TRUE, - [MOVE_WISH] = TRUE, - [MOVE_ASSIST] = TRUE, - [MOVE_INGRAIN] = TRUE, - [MOVE_SUPERPOWER] = TRUE, - [MOVE_MAGIC_COAT] = TRUE, - [MOVE_RECYCLE] = TRUE, - [MOVE_REVENGE] = TRUE, - [MOVE_BRICK_BREAK] = TRUE, - [MOVE_YAWN] = TRUE, - [MOVE_KNOCK_OFF] = TRUE, - [MOVE_ENDEAVOR] = TRUE, - [MOVE_ERUPTION] = TRUE, - [MOVE_SKILL_SWAP] = TRUE, - [MOVE_IMPRISON] = TRUE, - [MOVE_REFRESH] = TRUE, - [MOVE_GRUDGE] = TRUE, - [MOVE_SNATCH] = TRUE, - [MOVE_SECRET_POWER] = TRUE, - [MOVE_DIVE] = TRUE, - [MOVE_ARM_THRUST] = FALSE, - [MOVE_CAMOUFLAGE] = TRUE, - [MOVE_TAIL_GLOW] = TRUE, - [MOVE_LUSTER_PURGE] = TRUE, - [MOVE_MIST_BALL] = TRUE, - [MOVE_FEATHER_DANCE] = TRUE, - [MOVE_TEETER_DANCE] = TRUE, - [MOVE_BLAZE_KICK] = TRUE, - [MOVE_MUD_SPORT] = TRUE, - [MOVE_ICE_BALL] = FALSE, - [MOVE_NEEDLE_ARM] = TRUE, - [MOVE_SLACK_OFF] = TRUE, - [MOVE_HYPER_VOICE] = TRUE, - [MOVE_POISON_FANG] = FALSE, - [MOVE_CRUSH_CLAW] = TRUE, - [MOVE_BLAST_BURN] = TRUE, - [MOVE_HYDRO_CANNON] = TRUE, - [MOVE_METEOR_MASH] = TRUE, - [MOVE_ASTONISH] = TRUE, - [MOVE_WEATHER_BALL] = TRUE, - [MOVE_AROMATHERAPY] = TRUE, - [MOVE_FAKE_TEARS] = TRUE, - [MOVE_AIR_CUTTER] = TRUE, - [MOVE_OVERHEAT] = TRUE, - [MOVE_ODOR_SLEUTH] = TRUE, - [MOVE_ROCK_TOMB] = TRUE, - [MOVE_SILVER_WIND] = TRUE, - [MOVE_METAL_SOUND] = TRUE, - [MOVE_GRASS_WHISTLE] = TRUE, - [MOVE_TICKLE] = TRUE, - [MOVE_COSMIC_POWER] = TRUE, - [MOVE_WATER_SPOUT] = TRUE, - [MOVE_SIGNAL_BEAM] = TRUE, - [MOVE_SHADOW_PUNCH] = TRUE, - [MOVE_EXTRASENSORY] = TRUE, - [MOVE_SKY_UPPERCUT] = TRUE, - [MOVE_SAND_TOMB] = TRUE, - [MOVE_SHEER_COLD] = TRUE, - [MOVE_MUDDY_WATER] = TRUE, - [MOVE_BULLET_SEED] = FALSE, - [MOVE_AERIAL_ACE] = TRUE, - [MOVE_ICICLE_SPEAR] = FALSE, - [MOVE_IRON_DEFENSE] = TRUE, - [MOVE_BLOCK] = TRUE, - [MOVE_HOWL] = TRUE, - [MOVE_DRAGON_CLAW] = TRUE, - [MOVE_FRENZY_PLANT] = TRUE, - [MOVE_BULK_UP] = TRUE, - [MOVE_BOUNCE] = TRUE, - [MOVE_MUD_SHOT] = FALSE, - [MOVE_POISON_TAIL] = TRUE, - [MOVE_COVET] = TRUE, - [MOVE_VOLT_TACKLE] = TRUE, - [MOVE_MAGICAL_LEAF] = TRUE, - [MOVE_WATER_SPORT] = TRUE, - [MOVE_CALM_MIND] = TRUE, - [MOVE_LEAF_BLADE] = TRUE, - [MOVE_DRAGON_DANCE] = TRUE, - [MOVE_ROCK_BLAST] = FALSE, - [MOVE_SHOCK_WAVE] = TRUE, - [MOVE_WATER_PULSE] = TRUE, - [MOVE_DOOM_DESIRE] = TRUE, - [MOVE_PSYCHO_BOOST] = TRUE, -}; - // The possible questions to ask after the initial 3 WHICH MON questions. Retrieved from here and shuffled // WHAT_ITEM has max 3 occurrences, one for each party member // WHICH_MOVE has max 5 occurrences, defined as NUM_WHICH_MOVE_QUESTIONS diff --git a/src/data/battle_frontier/battle_frontier_trainer_mons.h b/src/data/battle_frontier/battle_frontier_trainer_mons.h index f0a203d56d..af2da019c8 100644 --- a/src/data/battle_frontier/battle_frontier_trainer_mons.h +++ b/src/data/battle_frontier/battle_frontier_trainer_mons.h @@ -1,4 +1,4 @@ -// Also used by early Pkmn Breeder, Collector, and Beauty trainers +// Also used by early PKMN Breeder, Collector, and Beauty trainers #define FRONTIER_MONS_YOUNGSTER_LASS_1 \ FRONTIER_MON_SUNKERN, \ FRONTIER_MON_AZURILL, \ @@ -64,7 +64,7 @@ FRONTIER_MON_VULPIX, \ -1 -// Also used by early Pkmn Breeder, Collector, and Beauty trainers +// Also used by early PKMN Breeder, Collector, and Beauty trainers #define FRONTIER_MONS_SCHOOL_KID_1 \ FRONTIER_MON_PIKACHU, \ FRONTIER_MON_SANDSHREW, \ @@ -152,7 +152,7 @@ FRONTIER_MON_ARIADOS, \ -1 -// Also used by early Pkmn Breeder, Collector, and Beauty trainers +// Also used by early PKMN Breeder, Collector, and Beauty trainers #define FRONTIER_MONS_CAMPER_PICNICKER_1 \ FRONTIER_MON_GRIMER, \ FRONTIER_MON_KRABBY, \ @@ -2833,7 +2833,7 @@ FRONTIER_MON_TYRANITAR_10, \ -1 -// Also used by Pkmn Ranger M/F +// Also used by PKMN Ranger M/F // For both classes, M uses Latios and F uses Latias #define FRONTIER_MONS_COOLTRAINER_2D(lati) \ FRONTIER_MON_ARTICUNO_1, \ @@ -3118,7 +3118,7 @@ FRONTIER_MON_RAPIDASH_4, \ -1 -// Used by Pkmn Ranger M, Gentleman, Running Triathlete, and Cycling Triathlete +// Used by PKMN Ranger M, Gentleman, Running Triathlete, and Cycling Triathlete #define FRONTIER_MONS_GENERAL_A \ FRONTIER_MON_DUGTRIO_4, \ FRONTIER_MON_MEDICHAM_4, \ @@ -3219,7 +3219,7 @@ -1 // Identical to FRONTIER_MONS_GENERAL_A but _3 -// Used by Pkmn Ranger, Running Triathlete, and Cycling Triathlete +// Used by PKMN Ranger, Running Triathlete, and Cycling Triathlete #define FRONTIER_MONS_GENERAL_B \ FRONTIER_MON_DUGTRIO_3, \ FRONTIER_MON_MEDICHAM_3, \ @@ -3320,7 +3320,7 @@ -1 // Similar to FRONTIER_MONS_GENERAL_A/B but _2 -// Used by Pkmn Ranger, Running Triathlete, and Cycling Triathlete +// Used by PKMN Ranger, Running Triathlete, and Cycling Triathlete #define FRONTIER_MONS_GENERAL_C \ FRONTIER_MON_DUGTRIO_2, \ FRONTIER_MON_MEDICHAM_2, \ @@ -3421,7 +3421,7 @@ -1 // Similar to FRONTIER_MONS_GENERAL_C but _1 (would be identical if not for re-ordering) -// Used by Pkmn Ranger, Running Triathlete, Cycling Triathlete +// Used by PKMN Ranger, Running Triathlete, Cycling Triathlete #define FRONTIER_MONS_GENERAL_D \ FRONTIER_MON_DUGTRIO_1, \ FRONTIER_MON_MEDICHAM_1, \ @@ -4245,6 +4245,16 @@ FRONTIER_MON_##legend2##_4, \ FRONTIER_MON_##legend3##_4, \ FRONTIER_MON_##lati##_4, \ + FRONTIER_MON_##legend1##_5, \ + FRONTIER_MON_##legend2##_5, \ + FRONTIER_MON_##legend3##_5, \ + FRONTIER_MON_##lati##_5, \ + FRONTIER_MON_##legend1##_6, \ + FRONTIER_MON_##legend2##_6, \ + FRONTIER_MON_##legend3##_6, \ + FRONTIER_MON_##lati##_6, \ + FRONTIER_MON_##lati##_7, \ + FRONTIER_MON_##lati##_8, \ FRONTIER_MON_GARDEVOIR_5, \ FRONTIER_MON_GARDEVOIR_6, \ FRONTIER_MON_GARDEVOIR_7, \ @@ -4256,49 +4266,7 @@ FRONTIER_MON_METAGROSS_5, \ FRONTIER_MON_METAGROSS_6, \ FRONTIER_MON_METAGROSS_7, \ - FRONTIER_MON_METAGROSS_8, - -#define FRONTIER_MONS_PSYCHIC_2A(lati) \ - FRONTIER_MONS_PSYCHIC_2(lati, ARTICUNO, ZAPDOS, MOLTRES) \ - FRONTIER_MON_##lati##_5, \ - FRONTIER_MON_##lati##_6, \ - FRONTIER_MON_##lati##_7, \ - FRONTIER_MON_##lati##_8, \ - FRONTIER_MON_ARTICUNO_5, \ - FRONTIER_MON_ARTICUNO_6, \ - FRONTIER_MON_ZAPDOS_5, \ - FRONTIER_MON_ZAPDOS_6, \ - FRONTIER_MON_MOLTRES_5, \ - FRONTIER_MON_MOLTRES_6, \ - -1 - -#define FRONTIER_MONS_PSYCHIC_2B(lati) \ - FRONTIER_MONS_PSYCHIC_2(lati, RAIKOU, ENTEI, SUICUNE) \ - FRONTIER_MON_##lati##_5, \ - FRONTIER_MON_##lati##_6, \ - FRONTIER_MON_##lati##_7, \ - FRONTIER_MON_##lati##_8, \ - FRONTIER_MON_RAIKOU_5, \ - FRONTIER_MON_RAIKOU_6, \ - FRONTIER_MON_ENTEI_5, \ - FRONTIER_MON_ENTEI_6, \ - FRONTIER_MON_SUICUNE_5, \ - FRONTIER_MON_SUICUNE_6, \ - -1 - -// Because the regis/latis are swapped here they cant all be merged into the same macro and match -#define FRONTIER_MONS_PSYCHIC_2C(lati) \ - FRONTIER_MONS_PSYCHIC_2(lati, REGIROCK, REGICE, REGISTEEL) \ - FRONTIER_MON_REGIROCK_5, \ - FRONTIER_MON_REGIROCK_6, \ - FRONTIER_MON_REGICE_5, \ - FRONTIER_MON_REGICE_6, \ - FRONTIER_MON_REGISTEEL_5, \ - FRONTIER_MON_REGISTEEL_6, \ - FRONTIER_MON_##lati##_5, \ - FRONTIER_MON_##lati##_6, \ - FRONTIER_MON_##lati##_7, \ - FRONTIER_MON_##lati##_8, \ + FRONTIER_MON_METAGROSS_8, \ -1 #define FRONTIER_MONS_HEX_MANIAC_2A \ @@ -4453,7 +4421,7 @@ -1 // For whatever reason FRONTIER_MON_MAROWAK_2 is in a different order than _1 _3 and _4 -// This order change is the only difference btween FRONITER_MONS_POKEMANIAC_2A and FRONTIER_MONS_POKEMANIAC_2B other than the numbered suffixes +// This order change is the only difference between FRONITER_MONS_POKEMANIAC_2A and FRONTIER_MONS_POKEMANIAC_2B other than the numbered suffixes #define FRONTIER_MONS_POKEMANIAC_2A \ FRONTIER_MON_ZANGOOSE_2, \ FRONTIER_MON_GRANBULL_1, \ @@ -4726,7 +4694,7 @@ FRONTIER_MON_TYRANITAR_10, \ -1 -// Identical to FRONTIER_MONS_COOLTRAINER_2C but with both latias and latios +// Identical to FRONTIER_MONS_COOLTRAINER_2C but with both Latias and Latios #define FRONTIER_MONS_GENTLEMAN_3A \ FRONTIER_MON_GENGAR_1, \ FRONTIER_MON_URSARING_1, \ @@ -4830,7 +4798,7 @@ FRONTIER_MON_TYRANITAR_10, \ -1 -// Identical to FRONTIER_MONS_COOLTRAINER_2D but with both latias and latios +// Identical to FRONTIER_MONS_COOLTRAINER_2D but with both Latias and Latios #define FRONTIER_MONS_GENTLEMAN_3B \ FRONTIER_MON_ARTICUNO_1, \ FRONTIER_MON_ZAPDOS_1, \ @@ -5864,1506 +5832,3 @@ FRONTIER_MON_STARMIE_7, \ FRONTIER_MON_STARMIE_8, \ -1 - -const u16 gBattleFrontierTrainerMons_Brady[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Conner[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Bradley[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Cybil[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Rodette[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Peggy[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Keith[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Grayson[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Glenn[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Liliana[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Elise[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Zoey[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Manuel[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Russ[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Dustin[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Tina[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Gillian[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Zoe[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Chen[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Al[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Mitch[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Anne[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Alize[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Lauren[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Kipp[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_Jason[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_John[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_Ann[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_Eileen[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_Carlie[] = -{ - FRONTIER_MONS_TUBER_1 -}; - -const u16 gBattleFrontierTrainerMons_Gordon[] = -{ - FRONTIER_MONS_SWIMMER_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Ayden[] = -{ - FRONTIER_MONS_SWIMMER_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Marco[] = -{ - FRONTIER_MONS_SWIMMER_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Cierra[] = -{ - FRONTIER_MONS_SWIMMER_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Marcy[] = -{ - FRONTIER_MONS_SWIMMER_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Kathy[] = -{ - FRONTIER_MONS_SWIMMER_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Peyton[] = -{ - FRONTIER_MONS_POKEFAN_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Julian[] = -{ - FRONTIER_MONS_POKEFAN_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Quinn[] = -{ - FRONTIER_MONS_POKEFAN_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Haylee[] = -{ - FRONTIER_MONS_POKEFAN_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Amanda[] = -{ - FRONTIER_MONS_POKEFAN_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Stacy[] = -{ - FRONTIER_MONS_POKEFAN_F_1 -}; - -// The below 6 are the early Pkmn Breeder class trainers, which use groups from other general classes -const u16 gBattleFrontierTrainerMons_Rafael[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Oliver[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Payton[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Pamela[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Eliza[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Marisa[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Lewis[] = -{ - FRONTIER_MONS_BUG_CATCHER_1_EXTRA(METAPOD, KAKUNA) -}; - -const u16 gBattleFrontierTrainerMons_Yoshi[] = -{ - FRONTIER_MONS_BUG_CATCHER_1_EXTRA(SILCOON, CASCOON) -}; - -const u16 gBattleFrontierTrainerMons_Destin[] = -{ - FRONTIER_MONS_BUG_CATCHER_1 -}; - -const u16 gBattleFrontierTrainerMons_Keon[] = -{ - FRONTIER_MONS_NINJA_BOY_1 -}; - -const u16 gBattleFrontierTrainerMons_Stuart[] = -{ - FRONTIER_MONS_NINJA_BOY_1 -}; - -const u16 gBattleFrontierTrainerMons_Nestor[] = -{ - FRONTIER_MONS_NINJA_BOY_1 -}; - -const u16 gBattleFrontierTrainerMons_Derrick[] = -{ - FRONTIER_MONS_BUG_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Bryson[] = -{ - FRONTIER_MONS_BUG_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Clayton[] = -{ - FRONTIER_MONS_BUG_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Trenton[] = -{ - FRONTIER_MONS_FISHERMAN_1 -}; - -const u16 gBattleFrontierTrainerMons_Jenson[] = -{ - FRONTIER_MONS_FISHERMAN_1 -}; - -const u16 gBattleFrontierTrainerMons_Wesley[] = -{ - FRONTIER_MONS_FISHERMAN_1 -}; - -const u16 gBattleFrontierTrainerMons_Anton[] = -{ - FRONTIER_MONS_RUIN_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Lawson[] = -{ - FRONTIER_MONS_RUIN_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Sammy[] = -{ - FRONTIER_MONS_RUIN_MANIAC_1 -}; - -// The below 3 are the early Collector class trainers, which use groups from other general classes -const u16 gBattleFrontierTrainerMons_Arnie[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Adrian[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Tristan[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Juliana[] = -{ - FRONTIER_MONS_PARASOL_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Rylee[] = -{ - FRONTIER_MONS_PARASOL_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Chelsea[] = -{ - FRONTIER_MONS_PARASOL_LADY_1 -}; - -// The below 3 are the early Beauty class trainers, which use groups from other general classes -const u16 gBattleFrontierTrainerMons_Danela[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_1 -}; - -const u16 gBattleFrontierTrainerMons_Lizbeth[] = -{ - FRONTIER_MONS_SCHOOL_KID_1 -}; - -const u16 gBattleFrontierTrainerMons_Amelia[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Jillian[] = -{ - FRONTIER_MONS_AROMA_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Abbie[] = -{ - FRONTIER_MONS_AROMA_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Briana[] = -{ - FRONTIER_MONS_AROMA_LADY_1 -}; - -const u16 gBattleFrontierTrainerMons_Antonio[] = -{ - FRONTIER_MONS_GUITARIST_1 -}; - -const u16 gBattleFrontierTrainerMons_Jaden[] = -{ - FRONTIER_MONS_GUITARIST_1 -}; - -const u16 gBattleFrontierTrainerMons_Dakota[] = -{ - FRONTIER_MONS_GUITARIST_1 -}; - -const u16 gBattleFrontierTrainerMons_Brayden[] = -{ - FRONTIER_MONS_BIRD_KEEPER_1 -}; - -const u16 gBattleFrontierTrainerMons_Corson[] = -{ - FRONTIER_MONS_BIRD_KEEPER_1 -}; - -const u16 gBattleFrontierTrainerMons_Trevin[] = -{ - FRONTIER_MONS_BIRD_KEEPER_1 -}; - -const u16 gBattleFrontierTrainerMons_Patrick[] = -{ - FRONTIER_MONS_SAILOR_1 -}; - -const u16 gBattleFrontierTrainerMons_Kaden[] = -{ - FRONTIER_MONS_SAILOR_1 -}; - -const u16 gBattleFrontierTrainerMons_Maxwell[] = -{ - FRONTIER_MONS_SAILOR_1 -}; - -const u16 gBattleFrontierTrainerMons_Daryl[] = -{ - FRONTIER_MONS_HIKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Kenneth[] = -{ - FRONTIER_MONS_HIKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Rich[] = -{ - FRONTIER_MONS_HIKER_1 -}; - -const u16 gBattleFrontierTrainerMons_Caden[] = -{ - FRONTIER_MONS_KINDLER_1 -}; - -const u16 gBattleFrontierTrainerMons_Marlon[] = -{ - FRONTIER_MONS_KINDLER_1 -}; - -const u16 gBattleFrontierTrainerMons_Nash[] = -{ - FRONTIER_MONS_KINDLER_1 -}; - -const u16 gBattleFrontierTrainerMons_Robby[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Reece[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Kathryn[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Ellen[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Ramon[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Arthur[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Alondra[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Adriana[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Malik[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Jill[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_1 -}; - -const u16 gBattleFrontierTrainerMons_Erik[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Yazmin[] = -{ - FRONTIER_MONS_RUNNING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Jamal[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Leslie[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Dave[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Carlo[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Emilia[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Dalia[] = -{ - FRONTIER_MONS_CYCLING_TRIATHLETE_2 -}; - -const u16 gBattleFrontierTrainerMons_Hitomi[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Ricardo[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Shizuka[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Joana[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Kelly[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Rayna[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1 -}; - -const u16 gBattleFrontierTrainerMons_Evan[] = -{ - FRONTIER_MONS_EXPERT_1A -}; - -const u16 gBattleFrontierTrainerMons_Jordan[] = -{ - FRONTIER_MONS_EXPERT_1B -}; - -const u16 gBattleFrontierTrainerMons_Joel[] = -{ - FRONTIER_MONS_EXPERT_1C -}; - -const u16 gBattleFrontierTrainerMons_Kristen[] = -{ - FRONTIER_MONS_EXPERT_1A -}; - -const u16 gBattleFrontierTrainerMons_Selphy[] = -{ - FRONTIER_MONS_EXPERT_1B -}; - -const u16 gBattleFrontierTrainerMons_Chloe[] = -{ - FRONTIER_MONS_EXPERT_1C -}; - -const u16 gBattleFrontierTrainerMons_Norton[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Lukas[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Zach[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Kaitlyn[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Breanna[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Kendra[] = -{ - FRONTIER_MONS_PSYCHIC_1 -}; - -const u16 gBattleFrontierTrainerMons_Molly[] = -{ - FRONTIER_MONS_HEX_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Jazmin[] = -{ - FRONTIER_MONS_HEX_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Kelsey[] = -{ - FRONTIER_MONS_HEX_MANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Jalen[] = -{ - FRONTIER_MONS_POKEMANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Griffen[] = -{ - FRONTIER_MONS_POKEMANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Xander[] = -{ - FRONTIER_MONS_POKEMANIAC_1 -}; - -const u16 gBattleFrontierTrainerMons_Marvin[] = -{ - FRONTIER_MONS_GENTLEMAN_1A -}; - -const u16 gBattleFrontierTrainerMons_Brennan[] = -{ - FRONTIER_MONS_GENTLEMAN_1B -}; - -const u16 gBattleFrontierTrainerMons_Baley[] = -{ - FRONTIER_MONS_BUG_MANIAC_2 -}; - -const u16 gBattleFrontierTrainerMons_Zackary[] = -{ - FRONTIER_MONS_RUIN_MANIAC_2 -}; - -const u16 gBattleFrontierTrainerMons_Gabriel[] = -{ - FRONTIER_MONS_COLLECTOR_1 -}; - -const u16 gBattleFrontierTrainerMons_Emily[] = -{ - FRONTIER_MONS_PARASOL_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Jordyn[] = -{ - FRONTIER_MONS_BEAUTY_1 -}; - -const u16 gBattleFrontierTrainerMons_Sofia[] = -{ - FRONTIER_MONS_AROMA_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Braden[] = -{ - FRONTIER_MONS_COOLTRAINER_1A -}; - -const u16 gBattleFrontierTrainerMons_Kayden[] = -{ - FRONTIER_MONS_COOLTRAINER_1B -}; - -const u16 gBattleFrontierTrainerMons_Cooper[] = -{ - FRONTIER_MONS_COOLTRAINER_1C -}; - -const u16 gBattleFrontierTrainerMons_Julia[] = -{ - FRONTIER_MONS_COOLTRAINER_1A -}; - -const u16 gBattleFrontierTrainerMons_Amara[] = -{ - FRONTIER_MONS_COOLTRAINER_1B -}; - -const u16 gBattleFrontierTrainerMons_Lynn[] = -{ - FRONTIER_MONS_COOLTRAINER_1C -}; - -const u16 gBattleFrontierTrainerMons_Jovan[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Dominic[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Nikolas[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Valeria[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Delaney[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Meghan[] = -{ - FRONTIER_MONS_PKMN_RANGER_1 -}; - -const u16 gBattleFrontierTrainerMons_Roberto[] = -{ - FRONTIER_MONS_DRAGON_TAMER_1 -}; - -const u16 gBattleFrontierTrainerMons_Damian[] = -{ - FRONTIER_MONS_DRAGON_TAMER_1 -}; - -const u16 gBattleFrontierTrainerMons_Brody[] = -{ - FRONTIER_MONS_DRAGON_TAMER_1 -}; - -const u16 gBattleFrontierTrainerMons_Graham[] = -{ - FRONTIER_MONS_DRAGON_TAMER_1 -}; - -const u16 gBattleFrontierTrainerMons_Tylor[] = -{ - FRONTIER_MONS_POKEFAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Jaren[] = -{ - FRONTIER_MONS_POKEFAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Cordell[] = -{ - FRONTIER_MONS_PKMN_BREEDER_M_1 -}; - -const u16 gBattleFrontierTrainerMons_Jazlyn[] = -{ - FRONTIER_MONS_PKMN_BREEDER_F_1 -}; - -const u16 gBattleFrontierTrainerMons_Zachery[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_2 -}; - -const u16 gBattleFrontierTrainerMons_Johan[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_2_NO_DUGTRIO -}; - -const u16 gBattleFrontierTrainerMons_Shea[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_2 -}; - -const u16 gBattleFrontierTrainerMons_Kaila[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_2 -}; - -const u16 gBattleFrontierTrainerMons_Isiah[] = -{ - FRONTIER_MONS_SCHOOL_KID_2 -}; - -const u16 gBattleFrontierTrainerMons_Garrett[] = -{ - FRONTIER_MONS_SCHOOL_KID_2 -}; - -const u16 gBattleFrontierTrainerMons_Haylie[] = -{ - FRONTIER_MONS_SCHOOL_KID_2 -}; - -const u16 gBattleFrontierTrainerMons_Megan[] = -{ - FRONTIER_MONS_SCHOOL_KID_2 -}; - -const u16 gBattleFrontierTrainerMons_Issac[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Quinton[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Salma[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Ansley[] = -{ - FRONTIER_MONS_RICH_BOY_LADY_2 -}; - -const u16 gBattleFrontierTrainerMons_Holden[] = -{ - FRONTIER_MONS_BUG_CATCHER_2 -}; - -const u16 gBattleFrontierTrainerMons_Luca[] = -{ - FRONTIER_MONS_BUG_CATCHER_2 -}; - -const u16 gBattleFrontierTrainerMons_Jamison[] = -{ - FRONTIER_MONS_NINJA_BOY_2 -}; - -const u16 gBattleFrontierTrainerMons_Gunnar[] = -{ - FRONTIER_MONS_NINJA_BOY_2 -}; - -const u16 gBattleFrontierTrainerMons_Craig[] = -{ - FRONTIER_MONS_TUBER_2 -}; - -const u16 gBattleFrontierTrainerMons_Pierce[] = -{ - FRONTIER_MONS_TUBER_2 -}; - -const u16 gBattleFrontierTrainerMons_Regina[] = -{ - FRONTIER_MONS_TUBER_2 -}; - -const u16 gBattleFrontierTrainerMons_Alison[] = -{ - FRONTIER_MONS_TUBER_2 -}; - -const u16 gBattleFrontierTrainerMons_Hank[] = -{ - FRONTIER_MONS_BUG_MANIAC_3 -}; - -const u16 gBattleFrontierTrainerMons_Earl[] = -{ - FRONTIER_MONS_BUG_MANIAC_3 -}; - -const u16 gBattleFrontierTrainerMons_Ramiro[] = -{ - FRONTIER_MONS_FISHERMAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Hunter[] = -{ - FRONTIER_MONS_FISHERMAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Aiden[] = -{ - FRONTIER_MONS_RUIN_MANIAC_3 -}; - -const u16 gBattleFrontierTrainerMons_Xavier[] = -{ - FRONTIER_MONS_RUIN_MANIAC_3 -}; - -const u16 gBattleFrontierTrainerMons_Clinton[] = -{ - FRONTIER_MONS_COLLECTOR_2 -}; - -const u16 gBattleFrontierTrainerMons_Jesse[] = -{ - FRONTIER_MONS_COLLECTOR_2 -}; - -const u16 gBattleFrontierTrainerMons_Eduardo[] = -{ - FRONTIER_MONS_GUITARIST_2 -}; - -const u16 gBattleFrontierTrainerMons_Hal[] = -{ - FRONTIER_MONS_GUITARIST_2 -}; - -const u16 gBattleFrontierTrainerMons_Gage[] = -{ - FRONTIER_MONS_BIRD_KEEPER_2 -}; - -const u16 gBattleFrontierTrainerMons_Arnold[] = -{ - FRONTIER_MONS_BIRD_KEEPER_2 -}; - -const u16 gBattleFrontierTrainerMons_Jarrett[] = -{ - FRONTIER_MONS_SAILOR_2 -}; - -const u16 gBattleFrontierTrainerMons_Garett[] = -{ - FRONTIER_MONS_SAILOR_2 -}; - -const u16 gBattleFrontierTrainerMons_Emanuel[] = -{ - FRONTIER_MONS_HIKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Gustavo[] = -{ - FRONTIER_MONS_HIKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Kameron[] = -{ - FRONTIER_MONS_KINDLER_2 -}; - -const u16 gBattleFrontierTrainerMons_Alfredo[] = -{ - FRONTIER_MONS_KINDLER_2 -}; - -const u16 gBattleFrontierTrainerMons_Ruben[] = -{ - FRONTIER_MONS_GENTLEMAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Lamar[] = -{ - FRONTIER_MONS_GENTLEMAN_2 -}; - -const u16 gBattleFrontierTrainerMons_Jaxon[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_3 -}; - -const u16 gBattleFrontierTrainerMons_Logan[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_3 -}; - -const u16 gBattleFrontierTrainerMons_Emilee[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_3 -}; - -const u16 gBattleFrontierTrainerMons_Josie[] = -{ - FRONTIER_MONS_YOUNGSTER_LASS_3 -}; - -const u16 gBattleFrontierTrainerMons_Armando[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Skyler[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Ruth[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Melody[] = -{ - FRONTIER_MONS_CAMPER_PICNICKER_2 -}; - -const u16 gBattleFrontierTrainerMons_Pedro[] = -{ - FRONTIER_MONS_SWIMMER_M_2 -}; - -const u16 gBattleFrontierTrainerMons_Erick[] = -{ - FRONTIER_MONS_SWIMMER_M_2 -}; - -const u16 gBattleFrontierTrainerMons_Elaine[] = -{ - FRONTIER_MONS_SWIMMER_F_2 -}; - -const u16 gBattleFrontierTrainerMons_Joyce[] = -{ - FRONTIER_MONS_SWIMMER_F_2 -}; - -const u16 gBattleFrontierTrainerMons_Todd[] = -{ - FRONTIER_MONS_POKEFAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Gavin[] = -{ - FRONTIER_MONS_POKEFAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Malory[] = -{ - FRONTIER_MONS_POKEFAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Esther[] = -{ - FRONTIER_MONS_POKEFAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Oscar[] = -{ - FRONTIER_MONS_PKMN_BREEDER_2 -}; - -const u16 gBattleFrontierTrainerMons_Wilson[] = -{ - FRONTIER_MONS_PKMN_BREEDER_2 -}; - -const u16 gBattleFrontierTrainerMons_Clare[] = -{ - FRONTIER_MONS_PKMN_BREEDER_2 -}; - -const u16 gBattleFrontierTrainerMons_Tess[] = -{ - FRONTIER_MONS_PKMN_BREEDER_2 -}; - -const u16 gBattleFrontierTrainerMons_Leon[] = -{ - FRONTIER_MONS_COOLTRAINER_M_2A -}; - -const u16 gBattleFrontierTrainerMons_Alonzo[] = -{ - FRONTIER_MONS_COOLTRAINER_M_2B -}; - -const u16 gBattleFrontierTrainerMons_Vince[] = -{ - FRONTIER_MONS_COOLTRAINER_2C(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Bryon[] = -{ - FRONTIER_MONS_COOLTRAINER_2D(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Ava[] = -{ - FRONTIER_MONS_COOLTRAINER_F_2A -}; - -const u16 gBattleFrontierTrainerMons_Miriam[] = -{ - FRONTIER_MONS_COOLTRAINER_F_2B -}; - -const u16 gBattleFrontierTrainerMons_Carrie[] = -{ - FRONTIER_MONS_COOLTRAINER_2C(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Gillian2[] = -{ - FRONTIER_MONS_COOLTRAINER_2D(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Tyler[] = -{ - FRONTIER_MONS_GENERAL_A -}; - -const u16 gBattleFrontierTrainerMons_Chaz[] = -{ - FRONTIER_MONS_GENERAL_B -}; - -const u16 gBattleFrontierTrainerMons_Nelson[] = -{ - FRONTIER_MONS_COOLTRAINER_2D(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Shania[] = -{ - FRONTIER_MONS_GENERAL_C -}; - -const u16 gBattleFrontierTrainerMons_Stella[] = -{ - FRONTIER_MONS_GENERAL_D -}; - -const u16 gBattleFrontierTrainerMons_Dorine[] = -{ - FRONTIER_MONS_COOLTRAINER_2D(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Maddox[] = -{ - FRONTIER_MONS_DRAGON_TAMER_2 -}; - -const u16 gBattleFrontierTrainerMons_Davin[] = -{ - FRONTIER_MONS_DRAGON_TAMER_2 -}; - -const u16 gBattleFrontierTrainerMons_Trevon[] = -{ - FRONTIER_MONS_DRAGON_TAMER_2 -}; - -const u16 gBattleFrontierTrainerMons_Mateo[] = -{ - FRONTIER_MONS_BLACK_BELT_2A -}; - -const u16 gBattleFrontierTrainerMons_Bret[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2B -}; - -const u16 gBattleFrontierTrainerMons_Raul[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2C -}; - -const u16 gBattleFrontierTrainerMons_Kay[] = -{ - FRONTIER_MONS_BATTLE_GIRL_2A -}; - -const u16 gBattleFrontierTrainerMons_Elena[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2B -}; - -const u16 gBattleFrontierTrainerMons_Alana[] = -{ - FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2C -}; - -const u16 gBattleFrontierTrainerMons_Alexas[] = -{ - FRONTIER_MONS_EXPERT_2A(TYRANITAR) -}; - -const u16 gBattleFrontierTrainerMons_Weston[] = -{ - FRONTIER_MONS_EXPERT_2B(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Jasper[] = -{ - FRONTIER_MONS_EXPERT_2C(TYRANITAR) -}; - -const u16 gBattleFrontierTrainerMons_Nadia[] = -{ - FRONTIER_MONS_EXPERT_2A(DRAGONITE) -}; - -const u16 gBattleFrontierTrainerMons_Miranda[] = -{ - FRONTIER_MONS_EXPERT_2B(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Emma[] = -{ - FRONTIER_MONS_EXPERT_2C(DRAGONITE) -}; - -const u16 gBattleFrontierTrainerMons_Rolando[] = -{ - FRONTIER_MONS_PSYCHIC_2A(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Stanly[] = -{ - FRONTIER_MONS_PSYCHIC_2B(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Dario[] = -{ - FRONTIER_MONS_PSYCHIC_2C(LATIOS) -}; - -const u16 gBattleFrontierTrainerMons_Karlee[] = -{ - FRONTIER_MONS_PSYCHIC_2A(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Jaylin[] = -{ - FRONTIER_MONS_PSYCHIC_2B(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Ingrid[] = -{ - FRONTIER_MONS_PSYCHIC_2C(LATIAS) -}; - -const u16 gBattleFrontierTrainerMons_Delilah[] = -{ - FRONTIER_MONS_HEX_MANIAC_2A -}; - -const u16 gBattleFrontierTrainerMons_Carly[] = -{ - FRONTIER_MONS_HEX_MANIAC_2B -}; - -const u16 gBattleFrontierTrainerMons_Lexie[] = -{ - FRONTIER_MONS_HEX_MANIAC_2C -}; - -const u16 gBattleFrontierTrainerMons_Miller[] = -{ - FRONTIER_MONS_POKEMANIAC_2A -}; - -const u16 gBattleFrontierTrainerMons_Marv[] = -{ - FRONTIER_MONS_POKEMANIAC_2B -}; - -const u16 gBattleFrontierTrainerMons_Layton[] = -{ - FRONTIER_MONS_POKEMANIAC_2C -}; - -const u16 gBattleFrontierTrainerMons_Brooks[] = -{ - FRONTIER_MONS_GENERAL_A -}; - -const u16 gBattleFrontierTrainerMons_Gregory[] = -{ - FRONTIER_MONS_GENTLEMAN_3A -}; - -const u16 gBattleFrontierTrainerMons_Reese[] = -{ - FRONTIER_MONS_GENTLEMAN_3B -}; - -const u16 gBattleFrontierTrainerMons_Mason[] = -{ - FRONTIER_MONS_GENERAL_A -}; - -const u16 gBattleFrontierTrainerMons_Toby[] = -{ - FRONTIER_MONS_GENERAL_B -}; - -const u16 gBattleFrontierTrainerMons_Dorothy[] = -{ - FRONTIER_MONS_GENERAL_C -}; - -const u16 gBattleFrontierTrainerMons_Piper[] = -{ - FRONTIER_MONS_GENERAL_D -}; - -const u16 gBattleFrontierTrainerMons_Finn[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_M_3 -}; - -const u16 gBattleFrontierTrainerMons_Samir[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_M_3 -}; - -const u16 gBattleFrontierTrainerMons_Fiona[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_F_3 -}; - -const u16 gBattleFrontierTrainerMons_Gloria[] = -{ - FRONTIER_MONS_SWIMMING_TRIATHLETE_F_3 -}; - -const u16 gBattleFrontierTrainerMons_Nico[] = -{ - FRONTIER_MONS_GENERAL_A -}; - -const u16 gBattleFrontierTrainerMons_Jeremy[] = -{ - FRONTIER_MONS_GENERAL_B -}; - -const u16 gBattleFrontierTrainerMons_Caitlin[] = -{ - FRONTIER_MONS_GENERAL_C -}; - -const u16 gBattleFrontierTrainerMons_Reena[] = -{ - FRONTIER_MONS_GENERAL_D -}; - -const u16 gBattleFrontierTrainerMons_Avery[] = -{ - FRONTIER_MONS_BUG_MANIAC_4 -}; - -const u16 gBattleFrontierTrainerMons_Liam[] = -{ - FRONTIER_MONS_BUG_MANIAC_4 -}; - -const u16 gBattleFrontierTrainerMons_Theo[] = -{ - FRONTIER_MONS_FISHERMAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Bailey[] = -{ - FRONTIER_MONS_FISHERMAN_3 -}; - -const u16 gBattleFrontierTrainerMons_Hugo[] = -{ - FRONTIER_MONS_RUIN_MANIAC_4 -}; - -const u16 gBattleFrontierTrainerMons_Bryce[] = -{ - FRONTIER_MONS_RUIN_MANIAC_4 -}; - -const u16 gBattleFrontierTrainerMons_Gideon[] = -{ - FRONTIER_MONS_COLLECTOR_3 -}; - -const u16 gBattleFrontierTrainerMons_Triston[] = -{ - FRONTIER_MONS_COLLECTOR_3 -}; - -const u16 gBattleFrontierTrainerMons_Charles[] = -{ - FRONTIER_MONS_GUITARIST_3A -}; - -const u16 gBattleFrontierTrainerMons_Raymond[] = -{ - FRONTIER_MONS_GUITARIST_3B -}; - -const u16 gBattleFrontierTrainerMons_Dirk[] = -{ - FRONTIER_MONS_BIRD_KEEPER_3 -}; - -const u16 gBattleFrontierTrainerMons_Harold[] = -{ - FRONTIER_MONS_BIRD_KEEPER_3 -}; - -const u16 gBattleFrontierTrainerMons_Omar[] = -{ - FRONTIER_MONS_SAILOR_3 -}; - -const u16 gBattleFrontierTrainerMons_Peter[] = -{ - FRONTIER_MONS_SAILOR_3 -}; - -const u16 gBattleFrontierTrainerMons_Dev[] = -{ - FRONTIER_MONS_HIKER_3 -}; - -const u16 gBattleFrontierTrainerMons_Corey[] = -{ - FRONTIER_MONS_HIKER_3 -}; - -const u16 gBattleFrontierTrainerMons_Andre[] = -{ - FRONTIER_MONS_KINDLER_3 -}; - -const u16 gBattleFrontierTrainerMons_Ferris[] = -{ - FRONTIER_MONS_KINDLER_3 -}; - -const u16 gBattleFrontierTrainerMons_Alivia[] = -{ - FRONTIER_MONS_PARASOL_LADY_3 -}; - -const u16 gBattleFrontierTrainerMons_Paige[] = -{ - FRONTIER_MONS_PARASOL_LADY_3 -}; - -const u16 gBattleFrontierTrainerMons_Anya[] = -{ - FRONTIER_MONS_EEVEELUTIONS -}; - -const u16 gBattleFrontierTrainerMons_Dawn[] = -{ - FRONTIER_MONS_BEAUTY_2 -}; - -const u16 gBattleFrontierTrainerMons_Abby[] = -{ - FRONTIER_MONS_AROMA_LADY_3 -}; - -const u16 gBattleFrontierTrainerMons_Gretel[] = -{ - FRONTIER_MONS_AROMA_LADY_3 -}; diff --git a/src/data/battle_frontier/battle_frontier_trainers.h b/src/data/battle_frontier/battle_frontier_trainers.h index 1cae890c25..1014ffaae2 100644 --- a/src/data/battle_frontier/battle_frontier_trainers.h +++ b/src/data/battle_frontier/battle_frontier_trainers.h @@ -6,7 +6,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NEVER, EC_WORD_GOING, EC_WORD_TO, EC_WORD_LOSE, EC_WORD_EXCL}, .speechWin = {EC_WORD_I_AM, EC_WORD_STRONG, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WHAT, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Brady + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_CONNER] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -14,7 +14,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LOSING, EC_WORD_DOESN_T, EC_WORD_BUG, EC_WORD_ME, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_A, EC_WORD_WIN, EC_WORD_IS, EC_WORD_JUST, EC_WORD_AWESOME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_DARN, EC_WORD_ELLIPSIS, EC_WORD_LOSING, EC_WORD_DOES, EC_WORD_BUG, EC_WORD_ME}, - .monSet = gBattleFrontierTrainerMons_Conner + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_BRADLEY] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -22,7 +22,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_MY, EC_WORD_OPPONENT, EC_WORD_TODAY}, .speechWin = {EC_WORD_HAHAHA, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_SEE_YA, EC_WORD_LATER, EC_WORD_EXCL}, .speechLose = {EC_WORD_TOMORROW, EC_WORD_IS, EC_WORD_WHEN, EC_WORD_WE, EC_WORD_REALLY, EC_WORD_BATTLE}, - .monSet = gBattleFrontierTrainerMons_Bradley + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_CYBIL] = { .facilityClass = FACILITY_CLASS_LASS, @@ -30,7 +30,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU_RE, EC_WORD_REALLY, EC_WORD_NOT_VERY, EC_WORD_SCARY, EC_WORD_AT, EC_WORD_ALL}, .speechWin = {EC_WORD_IT_S, EC_WORD_SAD, EC_WORD_TO, EC_WORD_SEE, EC_WORD_YOU, EC_MOVE2(STRUGGLE)}, .speechLose = {EC_WORD_THIS, EC_WORD_CAN_T, EC_WORD_BE, EC_WORD_HAPPENING, EC_WORD_TO_ME, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Cybil + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_RODETTE] = { .facilityClass = FACILITY_CLASS_LASS, @@ -38,7 +38,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_OH, EC_WORD_THIS, EC_WORD_IS, EC_WORD_SO, EC_WORD_EXCITING, EC_WORD_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_INCREDIBLE, EC_WORD_HOW, EC_WORD_STRONG, EC_WORD_I_AM, EC_WORD_EXCL}, .speechLose = {EC_WORD_OH_DEAR, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_JUST, EC_WORD_NO, EC_WORD_GOOD}, - .monSet = gBattleFrontierTrainerMons_Rodette + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_PEGGY] = { .facilityClass = FACILITY_CLASS_LASS, @@ -46,7 +46,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_GET, EC_WORD_READY, EC_WORD_TO, EC_WORD_BE, EC_WORD_DESTROYED, EC_WORD_EXCL}, .speechWin = {EC_WORD_HAHAHA, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_LOLLING, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_SAD, EC_WORD_THANKS, EC_WORD_TO, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Peggy + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_KEITH] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, @@ -54,7 +54,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_JUST, EC_WORD_STUDY, EC_WORD_YOU, EC_WORD_KNOW}, .speechWin = {EC_WORD_YOU, EC_WORD_DON_T, EC_WORD_STUDY, EC_WORD_ENOUGH, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_MORE, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Keith + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_GRAYSON] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, @@ -62,7 +62,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_POKEMON, EC_WORD_BATTLE, EC_WORD_ISN_T, EC_WORD_CHILD_S_PLAY, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_DONE, EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WE, EC_WORD_WERE, EC_WORD_LIKE, EC_WORD_TOYS, EC_WORD_TO, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Grayson + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_GLENN] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, @@ -70,7 +70,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WOULD, EC_WORD_BE, EC_WORD_COOL, EC_WORD_IF_I_WIN, EC_EMPTY_WORD}, .speechWin = {EC_WORD_COOL, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM}, .speechLose = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_GOING, EC_WORD_TO, EC_WORD_BE, EC_WORD_COOL}, - .monSet = gBattleFrontierTrainerMons_Glenn + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_LILIANA] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, @@ -78,7 +78,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WON_T, EC_WORD_GIVE_UP, EC_WORD_UNTIL, EC_WORD_I, EC_WORD_WIN}, .speechWin = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NO, EC_WORD_SURRENDER, EC_WORD_IN, EC_WORD_ME}, .speechLose = {EC_WORD_THAT_S, EC_WORD_IT, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_GIVE_UP, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Liliana + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_ELISE] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, @@ -86,7 +86,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_STRATEGY, EC_WORD_IS, EC_WORD_FROM, EC_WORD_MY, EC_WORD_FATHER}, .speechWin = {EC_WORD_I, EC_WORD_WIN, EC_WORD_EXCL, EC_WORD_FATHER, EC_WORD_I_VE, EC_WORD_WON}, .speechLose = {EC_WORD_FORGIVE, EC_WORD_ME, EC_WORD_FATHER, EC_WORD_FOR, EC_WORD_I_VE, EC_WORD_LOST}, - .monSet = gBattleFrontierTrainerMons_Elise + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_ZOEY] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, @@ -94,7 +94,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_PLEASE, EC_WORD_BATTLE, EC_WORD_LIKE, EC_WORD_YOU, EC_WORD_MEAN, EC_WORD_IT}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_SO, EC_WORD_MUCH}, .speechLose = {EC_WORD_WERE, EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_BEING, EC_WORD_SERIOUS, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Zoey + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_MANUEL] = { .facilityClass = FACILITY_CLASS_RICH_BOY, @@ -102,7 +102,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ME, EC_WORD_LOSE, EC_WORD_QUES, EC_WORD_THAT_S, EC_WORD_PREPOSTEROUS, EC_WORD_EXCL}, .speechWin = {EC_WORD_NATURALLY, EC_WORD_I, EC_WORD_WIN, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_LOST, EC_WORD_MOTHER}, - .monSet = gBattleFrontierTrainerMons_Manuel + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_RUSS] = { .facilityClass = FACILITY_CLASS_RICH_BOY, @@ -110,7 +110,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THEY, EC_WORD_ALL, EC_WORD_WANT, EC_WORD_MY, EC_WORD_FABULOUS, EC_WORD_POKEMON}, .speechWin = {EC_WORD_I, EC_WORD_WILL, EC_WORD_HAVE, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_PARTY}, .speechLose = {EC_WORD_HOW, EC_WORD_COULD, EC_WORD_YOU, EC_WORD_DO, EC_WORD_THAT, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Russ + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_DUSTIN] = { .facilityClass = FACILITY_CLASS_RICH_BOY, @@ -118,7 +118,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_REALLY, EC_WORD_LIKE, EC_WORD_COOL, EC_WORD_POKEMON, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_MYSELF, EC_WORD_WHEN_I_WIN, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_MYSELF, EC_WORD_IF_I_LOSE, EC_WORD_TOO, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Dustin + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_TINA] = { .facilityClass = FACILITY_CLASS_LADY, @@ -126,7 +126,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IF_I_WIN, EC_WORD_YOU, EC_WORD_CAN, EC_WORD_HAVE, EC_WORD_A, EC_MOVE2(SWEET_KISS)}, .speechWin = {EC_WORD_HERE_IT_IS, EC_WORD_YOUR, EC_MOVE2(SWEET_KISS), EC_WORD_FROM, EC_WORD_MY, EC_POKEMON_NATIONAL(JYNX)}, .speechLose = {EC_WORD_YOU, EC_WORD_WANT, EC_WORD_A, EC_MOVE(SWIFT), EC_MOVE2(MEGA_KICK), EC_WORD_INSTEAD}, - .monSet = gBattleFrontierTrainerMons_Tina + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_GILLIAN1] = { .facilityClass = FACILITY_CLASS_LADY, @@ -134,7 +134,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THE, EC_WORD_GOURMET, EC_WORD_THING, EC_WORD_IS, EC_WORD_SO, EC_WORD_YESTERDAY}, .speechWin = {EC_WORD_POKEMON, EC_WORD_NEVER, EC_WORD_GO, EC_WORD_OUT, EC_WORD_OF, EC_WORD_FASHION}, .speechLose = {EC_WORD_LOSING, EC_WORD_DOESN_T, EC_WORD_DISAPPOINT, EC_WORD_ME, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Gillian + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_ZOE] = { .facilityClass = FACILITY_CLASS_LADY, @@ -142,7 +142,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_HAVEN_T, EC_WORD_A, EC_WORD_WORRY, EC_WORD_AT, EC_WORD_ALL}, .speechWin = {EC_WORD_LIFE, EC_WORD_IS, EC_WORD_ALWAYS, EC_WORD_GOOD, EC_WORD_TO_ME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WORRY, EC_WORD_ABOUT, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_SKILL}, - .monSet = gBattleFrontierTrainerMons_Zoe + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_1} }, [FRONTIER_TRAINER_CHEN] = { .facilityClass = FACILITY_CLASS_CAMPER, @@ -150,7 +150,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_TOTALLY, EC_WORD_READY, EC_WORD_TO, EC_WORD_ROCK, EC_WORD_TODAY}, .speechWin = {EC_WORD_I_AM, EC_WORD_READY, EC_WORD_TO, EC_WORD_GO, EC_WORD_ON, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_VE, EC_WORD_LOST, EC_WORD_MY, EC_MOVE(FOCUS_ENERGY), EC_WORD_AND, EC_WORD_TOUGHNESS}, - .monSet = gBattleFrontierTrainerMons_Chen + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_AL] = { .facilityClass = FACILITY_CLASS_CAMPER, @@ -158,7 +158,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOUR, EC_WORD_LOOK, EC_WORD_SAYS, EC_WORD_YOU_RE, EC_WORD_REALLY, EC_WORD_TOUGH}, .speechWin = {EC_WORD_IT_S, EC_WORD_ME, EC_WORD_WHO_IS, EC_WORD_REALLY, EC_WORD_TOUGH, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_RIGHT, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_REALLY, EC_WORD_TOUGH}, - .monSet = gBattleFrontierTrainerMons_Al + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_MITCH] = { .facilityClass = FACILITY_CLASS_CAMPER, @@ -166,7 +166,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MOTHER, EC_WORD_NATURE, EC_WORD_IS, EC_WORD_MY, EC_WORD_ALLY, EC_WORD_EXCL}, .speechWin = {EC_WORD_WAS, EC_WORD_THAT, EC_WORD_ENOUGH, EC_WORD_FOR, EC_WORD_YOU, EC_WORD_QUES}, .speechLose = {EC_WORD_MOTHER, EC_WORD_NATURE, EC_WORD_DIDN_T, EC_WORD_LET_ME_WIN, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Mitch + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_ANNE] = { .facilityClass = FACILITY_CLASS_PICNICKER, @@ -174,7 +174,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_LET_S, EC_WORD_BATTLE, EC_WORD_NOW}, .speechWin = {EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_IS, EC_WORD_OVERWHELMING, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_VE, EC_WORD_DESTROYED, EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Anne + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_ALIZE] = { .facilityClass = FACILITY_CLASS_PICNICKER, @@ -182,7 +182,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_CUTE, EC_WORD_AND, EC_WORD_AWFULLY, EC_WORD_STRONG, EC_WORD_THAT_S, EC_WORD_ME}, .speechWin = {EC_WORD_YUP, EC_WORD_I_AM, EC_WORD_CUTE, EC_WORD_AND, EC_WORD_AWFULLY, EC_WORD_STRONG}, .speechLose = {EC_WORD_I_AM, EC_WORD_WEAK, EC_WORD_ELLIPSIS, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_CUTE}, - .monSet = gBattleFrontierTrainerMons_Alize + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_LAUREN] = { .facilityClass = FACILITY_CLASS_PICNICKER, @@ -190,7 +190,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_OLD, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_ALSO, EC_WORD_GOOD}, .speechWin = {EC_WORD_I, EC_WORD_SAID, EC_WORD_I_WAS, EC_WORD_OLD, EC_WORD_BUT, EC_WORD_GOOD}, .speechLose = {EC_WORD_WHAT, EC_WORD_A, EC_WORD_WEIRD, EC_WORD_DREAM, EC_WORD_THAT_WAS, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Lauren + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_KIPP] = { .facilityClass = FACILITY_CLASS_TUBER_M, @@ -198,7 +198,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IF_I_WIN, EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_GO, EC_MOVE2(SURF)}, .speechWin = {EC_WORD_YEAH, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_OFF, EC_WORD_TO, EC_MOVE2(SURF)}, .speechLose = {EC_WORD_OH, EC_WORD_NO, EC_WORD_EXCL, EC_WORD_A, EC_MOVE(WHIRLPOOL), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Kipp + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_JASON] = { .facilityClass = FACILITY_CLASS_TUBER_M, @@ -206,7 +206,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_TEACH, EC_WORD_ME, EC_WORD_A, EC_WORD_GOOD, EC_WORD_STRATEGY, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_YOUR, EC_WORD_GOOD, EC_WORD_STRATEGY, EC_WORD_QUES_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WOW, EC_WORD_THAT, EC_WORD_IS, EC_WORD_AN, EC_WORD_AWESOME, EC_WORD_STRATEGY}, - .monSet = gBattleFrontierTrainerMons_Jason + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_JOHN] = { .facilityClass = FACILITY_CLASS_TUBER_M, @@ -214,7 +214,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_PRETTY, EC_WORD_NEW, EC_WORD_TRAINER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_NEW, EC_WORD_BUT, EC_WORD_I, EC_WORD_WON, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_NEW, EC_WORD_SO, EC_WORD_WHAT, EC_WORD_IF_I_LOSE, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_John + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_ANN] = { .facilityClass = FACILITY_CLASS_TUBER_F, @@ -222,7 +222,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IT_S, EC_WORD_SO, EC_WORD_EXCITING, EC_WORD_IT, EC_WORD_REALLY, EC_WORD_IS}, .speechWin = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_HAPPY, EC_WORD_I, EC_WORD_CAN, EC_WORD_CRY}, .speechLose = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SAD, EC_WORD_I, EC_WORD_WILL, EC_WORD_CRY}, - .monSet = gBattleFrontierTrainerMons_Ann + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_EILEEN] = { .facilityClass = FACILITY_CLASS_TUBER_F, @@ -230,7 +230,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_PRETEND, EC_WORD_I_AM, EC_WORD_AN, EC_WORD_ADULT, EC_WORD_OK_QUES}, .speechWin = {EC_WORD_SO, EC_WORD_THIS, EC_WORD_IS, EC_WORD_AN, EC_WORD_ADULT, EC_WORD_FEELING}, .speechLose = {EC_WORD_AN, EC_WORD_ADULT, EC_WORD_CAN_T, EC_WORD_BEAT, EC_WORD_YOU, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Eileen + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_CARLIE] = { .facilityClass = FACILITY_CLASS_TUBER_F, @@ -238,7 +238,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_SUMMER, EC_WORD_VACATION, EC_WORD_IS, EC_WORD_FOR, EC_WORD_POKEMON}, .speechWin = {EC_WORD_MY, EC_WORD_SUMMER, EC_WORD_VACATION, EC_WORD_WILL, EC_WORD_BE, EC_WORD_AWESOME}, .speechLose = {EC_WORD_I, EC_WORD_CAN_T_WIN, EC_WORD_LIKE, EC_WORD_THIS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Carlie + .monSet = (const u16[]){FRONTIER_MONS_TUBER_1} }, [FRONTIER_TRAINER_GORDON] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, @@ -246,7 +246,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_VICTORY, EC_WORD_WILL, EC_WORD_COME, EC_WORD_TO_ME, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_OH_YEAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_REALLY, EC_WORD_WON}, .speechLose = {EC_WORD_NOTHING, EC_WORD_IS, EC_WORD_WORKING, EC_WORD_OUT, EC_WORD_FOR, EC_WORD_ME}, - .monSet = gBattleFrontierTrainerMons_Gordon + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_M_1} }, [FRONTIER_TRAINER_AYDEN] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, @@ -254,7 +254,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_ON, EC_WORD_I, EC_WORD_NEED, EC_WORD_A, EC_WORD_HOT, EC_WORD_BATTLE}, .speechWin = {EC_WORD_I, EC_WORD_NEED, EC_WORD_WATER, EC_WORD_TO, EC_WORD_COOL, EC_WORD_DOWN}, .speechLose = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_ICE, EC_WORD_COLD}, - .monSet = gBattleFrontierTrainerMons_Ayden + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_M_1} }, [FRONTIER_TRAINER_MARCO] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, @@ -262,7 +262,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(SURF), EC_WORD_IN, EC_WORD_THE, EC_WORD_WINTER, EC_WORD_TOO}, .speechWin = {EC_WORD_I, EC_WORD_WILL, EC_WORD_GO, EC_MOVE2(SURF), EC_WORD_RIGHT, EC_WORD_NOW}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_MOVE2(BEAT_UP), EC_WORD_MY, EC_MOVE2(SURF), EC_WORD_BOARD}, - .monSet = gBattleFrontierTrainerMons_Marco + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_M_1} }, [FRONTIER_TRAINER_CIERRA] = { .facilityClass = FACILITY_CLASS_SWIMMER_F, @@ -270,7 +270,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_SYNCHRONIZE, EC_WORD_MY, EC_WORD_SWIFT_SWIM}, .speechWin = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_SYNCHRONIZE, EC_WORD_WITH, EC_WORD_ME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_TO, EC_WORD_SYNCHRONIZE, EC_WORD_BETTER, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Cierra + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_F_1} }, [FRONTIER_TRAINER_MARCY] = { .facilityClass = FACILITY_CLASS_SWIMMER_F, @@ -278,7 +278,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_KNOCKOUT, EC_WORD_YOU, EC_WORD_CAN_T_WIN, EC_WORD_EXCL}, .speechWin = {EC_WORD_AFTER, EC_WORD_ALL, EC_WORD_I_AM, EC_WORD_A, EC_WORD_KNOCKOUT, EC_WORD_EXCL}, .speechLose = {EC_WORD_THAT_S, EC_WORD_NOT, EC_WORD_THE, EC_WORD_KNOCKOUT, EC_WORD_I, EC_WORD_MEAN}, - .monSet = gBattleFrontierTrainerMons_Marcy + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_F_1} }, [FRONTIER_TRAINER_KATHY] = { .facilityClass = FACILITY_CLASS_SWIMMER_F, @@ -286,7 +286,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_VE, EC_WORD_WON, EC_WORD_EVERY, EC_WORD_MATCH, EC_WORD_TODAY, EC_WORD_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_SO, EC_WORD_GREAT, EC_WORD_TO, EC_WORD_WIN, EC_WORD_EXCL}, .speechLose = {EC_WORD_HUH_QUES, EC_WORD_I, EC_WORD_SHOULD, EC_WORD_NOT, EC_WORD_HAVE, EC_WORD_LOST}, - .monSet = gBattleFrontierTrainerMons_Kathy + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_F_1} }, [FRONTIER_TRAINER_PEYTON] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -294,7 +294,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NEVER, EC_WORD_DISAPPOINTED, EC_WORD_WITH, EC_WORD_MY, EC_WORD_POKEMON}, .speechWin = {EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_IF, EC_WORD_WE, EC_WORD_WIN, EC_WORD_TOGETHER}, .speechLose = {EC_WORD_I, EC_WORD_ADORE, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_MORE, EC_WORD_IF_I_LOSE}, - .monSet = gBattleFrontierTrainerMons_Peyton + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_M_1} }, [FRONTIER_TRAINER_JULIAN] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -302,7 +302,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_ADORE, EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_RIGHT, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOTALLY, EC_WORD_OUT, EC_WORD_OF, EC_WORD_THE, EC_WORD_QUESTION}, .speechLose = {EC_WORD_YOU, EC_WORD_DO, EC_WORD_ADORE, EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Julian + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_M_1} }, [FRONTIER_TRAINER_QUINN] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -310,7 +310,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_BUT, EC_WORD_A, EC_WORD_DREAM}, .speechWin = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_A, EC_WORD_BEAUTIFUL, EC_WORD_DREAM, EC_WORD_EXCL}, .speechLose = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_AN, EC_WORD_AWFUL, EC_MOVE(NIGHTMARE), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Quinn + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_M_1} }, [FRONTIER_TRAINER_HAYLEE] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -318,7 +318,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_KNOW, EC_WORD_HOW, EC_WORD_I_AM, EC_WORD_FEELING}, .speechWin = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_OVERWHELMING, EC_WORD_JOY, EC_WORD_OVER, EC_WORD_THIS}, .speechLose = {EC_WORD_DESTROYED, EC_WORD_IS, EC_WORD_THE, EC_WORD_WAY, EC_WORD_I_AM, EC_WORD_FEELING}, - .monSet = gBattleFrontierTrainerMons_Haylee + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_F_1} }, [FRONTIER_TRAINER_AMANDA] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -326,7 +326,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_COME, EC_WORD_FROM, EC_WORD_A, EC_WORD_TRAINER, EC_WORD_FAMILY}, .speechWin = {EC_WORD_I, EC_WORD_WILL, EC_WORD_TREASURE, EC_WORD_THIS, EC_WORD_WIN, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_GO_HOME, EC_WORD_RIGHT, EC_WORD_NOW}, - .monSet = gBattleFrontierTrainerMons_Amanda + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_F_1} }, [FRONTIER_TRAINER_STACY] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -334,15 +334,16 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ALL, EC_WORD_POKEMON, EC_WORD_HAVE, EC_WORD_THEIR, EC_WORD_OWN, EC_WORD_CUTE_CHARM}, .speechWin = {EC_WORD_YOU, EC_WORD_SEE, EC_WORD_WHAT, EC_WORD_I, EC_WORD_MEAN, EC_WORD_QUES}, .speechLose = {EC_WORD_SHOULD, EC_WORD_I, EC_WORD_NOT, EC_WORD_ADORE, EC_WORD_POKEMON, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Stacy + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_F_1} }, + // The below 6 are the early Pkmn Breeder class trainers, which use groups from other general classes [FRONTIER_TRAINER_RAFAEL] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, .trainerName = _("RAFAEL"), .speechBefore = {EC_WORD_COME_ON, EC_WORD_EXCL, EC_WORD_LET_S, EC_WORD_SEE, EC_WORD_SOME, EC_WORD_SPIRIT}, .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_WORD_THAT_S, EC_WORD_THE, EC_WORD_SPIRIT, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WELL, EC_WORD_SO, EC_WORD_MUCH, EC_WORD_FOR, EC_WORD_OUR, EC_WORD_SPIRIT}, - .monSet = gBattleFrontierTrainerMons_Rafael + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_OLIVER] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, @@ -350,7 +351,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_GENIUS, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL}, .speechWin = {EC_WORD_THAT_S, EC_WORD_HOW, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_WORKS, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_MORE, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_THAN, EC_WORD_I_AM}, - .monSet = gBattleFrontierTrainerMons_Oliver + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_PAYTON] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, @@ -358,7 +359,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_TRAIN, EC_WORD_FROM, EC_WORD_THE, EC_WORD_EGG, EC_WORD_UP}, .speechWin = {EC_WORD_WELL, EC_WORD_DONE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_A, EC_MOVE2(SOFT_BOILED), EC_WORD_LOSS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Payton + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_PAMELA] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -366,7 +367,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ALL, EC_WORD_POKEMON, EC_WORD_ADORE, EC_WORD_A, EC_WORD_KIND, EC_WORD_TRAINER}, .speechWin = {EC_WORD_IT_S, EC_WORD_TOO, EC_WORD_BAD, EC_WORD_YOU, EC_WORD_LOST, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_KIND, EC_WORD_AND, EC_WORD_YOU_RE, EC_WORD_ALSO, EC_WORD_STRONG}, - .monSet = gBattleFrontierTrainerMons_Pamela + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_ELIZA] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -374,7 +375,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_ADORE, EC_WORD_POKEMON, EC_WORD_LIKE, EC_WORD_MY, EC_WORD_CHILDREN}, .speechWin = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_HAPPY, EC_WORD_FOR, EC_WORD_MY, EC_WORD_POKEMON}, .speechLose = {EC_WORD_OH_DEAR, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SORRY, EC_WORD_ABOUT, EC_WORD_THIS}, - .monSet = gBattleFrontierTrainerMons_Eliza + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_MARISA] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -382,7 +383,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_PROMISE, EC_WORD_TO, EC_WORD_BATTLE, EC_WORD_SERIOUSLY, EC_EMPTY_WORD}, .speechWin = {EC_WORD_PROMISE, EC_WORD_ME, EC_WORD_YOU, EC_WORD_WILL, EC_WORD_DO, EC_WORD_BETTER}, .speechLose = {EC_WORD_PROMISE, EC_WORD_ME, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_PLEASE, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Marisa + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_LEWIS] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, @@ -390,7 +391,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A_LITTLE, EC_WORD_BUG, EC_WORD_IS, EC_WORD_SCARY, EC_WORD_QUES, EC_WORD_HAHAHA}, .speechWin = {EC_WORD_LOOK, EC_WORD_LOOK, EC_WORD_EXCL, EC_WORD_A, EC_WORD_SCARY, EC_WORD_BUG}, .speechLose = {EC_WORD_OH, EC_WORD_A, EC_WORD_BUG, EC_WORD_ISN_T, EC_WORD_SCARY, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Lewis + .monSet = (const u16[]){FRONTIER_MONS_BUG_CATCHER_1_EXTRA(METAPOD, KAKUNA)} }, [FRONTIER_TRAINER_YOSHI] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, @@ -398,7 +399,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_LOVEY_DOVEY}, .speechWin = {EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_THE, EC_WORD_BEST, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_IGNORANT, EC_WORD_ABOUT, EC_WORD_BUG, EC_WORD_POKEMON, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Yoshi + .monSet = (const u16[]){FRONTIER_MONS_BUG_CATCHER_1_EXTRA(SILCOON, CASCOON)} }, [FRONTIER_TRAINER_DESTIN] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, @@ -406,7 +407,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IT_S, EC_WORD_WAY, EC_WORD_TOO, EC_WORD_HOT, EC_WORD_HERE, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_ABOUT, EC_WORD_TO, EC_MOVE(OVERHEAT), EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_PLEASE, EC_WORD_I, EC_WORD_NEED, EC_WORD_SOME, EC_WORD_WATER, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Destin + .monSet = (const u16[]){FRONTIER_MONS_BUG_CATCHER_1} }, [FRONTIER_TRAINER_KEON] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, @@ -414,7 +415,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_FORGIVE, EC_WORD_ME, EC_WORD_BUT, EC_WORD_HERE_I_COME, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_FORGIVE, EC_WORD_ME, EC_WORD_FOR, EC_WORD_MY, EC_WORD_OVERWHELMING, EC_WORD_POWER}, .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Keon + .monSet = (const u16[]){FRONTIER_MONS_NINJA_BOY_1} }, [FRONTIER_TRAINER_STUART] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, @@ -422,7 +423,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_PROMISE, EC_WORD_YOU, EC_WORD_A, EC_WORD_HOT, EC_WORD_BATTLE}, .speechWin = {EC_WORD_THE, EC_WORD_MASTER, EC_WORD_OF, EC_WORD_COOL, EC_WORD_THAT_S, EC_WORD_ME}, .speechLose = {EC_WORD_I, EC_WORD_SEE, EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_SO, EC_WORD_COOL}, - .monSet = gBattleFrontierTrainerMons_Stuart + .monSet = (const u16[]){FRONTIER_MONS_NINJA_BOY_1} }, [FRONTIER_TRAINER_NESTOR] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, @@ -430,7 +431,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_A, EC_WORD_REALLY, EC_WORD_SMOOTH, EC_WORD_MOVE}, .speechWin = {EC_WORD_THERE, EC_WORD_WAS, EC_WORD_NOTHING, EC_WORD_SMOOTH, EC_WORD_ABOUT, EC_WORD_THAT}, .speechLose = {EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_ARE, EC_WORD_SMOOTH, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Nestor + .monSet = (const u16[]){FRONTIER_MONS_NINJA_BOY_1} }, [FRONTIER_TRAINER_DERRICK] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -438,7 +439,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_SEE, EC_WORD_YOU, EC_MOVE2(MEDITATE), EC_WORD_LIKE, EC_WORD_ME}, .speechWin = {EC_WORD_HOW, EC_WORD_I, EC_MOVE2(MEDITATE), EC_WORD_IS, EC_WORD_JUST, EC_WORD_BEAUTIFUL}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_MOVE2(MEDITATE), EC_WORD_FOR, EC_WORD_A, EC_MOVE2(CALM_MIND)}, - .monSet = gBattleFrontierTrainerMons_Derrick + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_1} }, [FRONTIER_TRAINER_BRYSON] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -446,7 +447,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_MOVE2(POISON_POWDER), EC_WORD_IS, EC_WORD_IN, EC_WORD_OUR, EC_MOVE2(COTTON_SPORE), EC_WORD_MOVE}, .speechWin = {EC_WORD_HOW_DO, EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_OUR, EC_MOVE2(POISON_POWDER), EC_WORD_QUES}, .speechLose = {EC_WORD_MY, EC_MOVE2(COTTON_SPORE), EC_WORD_WAS, EC_WORD_USELESS, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Bryson + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_1} }, [FRONTIER_TRAINER_CLAYTON] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -454,7 +455,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HUH_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_WHERE, EC_WORD_IS_IT_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHERE, EC_WORD_IS_IT_QUES, EC_WORD_I_VE, EC_WORD_LOST, EC_WORD_MY, EC_WORD_POKENAV}, .speechLose = {EC_WORD_WHERE, EC_WORD_IS_IT_QUES, EC_WORD_I_VE, EC_WORD_LOST, EC_WORD_MY, EC_WORD_SENSE}, - .monSet = gBattleFrontierTrainerMons_Clayton + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_1} }, [FRONTIER_TRAINER_TRENTON] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -462,7 +463,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_OVER, EC_WORD_FOR, EC_WORD_SOME, EC_WORD_TASTY, EC_WORD_WATER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MMM, EC_WORD_DO, EC_WORD_YOU, EC_WORD_WANT, EC_WORD_SOME, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_GOT, EC_WORD_THIS, EC_WORD_TASTY, EC_WORD_WATER, EC_WORD_SHOPPING}, - .monSet = gBattleFrontierTrainerMons_Trenton + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_1} }, [FRONTIER_TRAINER_JENSON] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -470,7 +471,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_DOWNCAST}, .speechWin = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_DON_T, EC_WORD_MAKE, EC_WORD_THE, EC_MOVE(CUT)}, .speechLose = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_TRAINER, EC_WORD_WHO_IS, EC_WORD_FEELING, EC_WORD_DOWNCAST}, - .monSet = gBattleFrontierTrainerMons_Jenson + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_1} }, [FRONTIER_TRAINER_WESLEY] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -478,7 +479,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_POKEMON_NATIONAL(MEW), EC_POKEMON_NATIONAL(MEW), EC_WORD_IS, EC_WORD_HOW, EC_WORD_I, EC_WORD_CRY}, .speechWin = {EC_WORD_YES, EC_WORD_I, EC_WORD_KNOW, EC_WORD_I_AM, EC_WORD_CUTE, EC_WORD_EXCL}, .speechLose = {EC_POKEMON_NATIONAL(MEW), EC_POKEMON_NATIONAL(MEW), EC_WORD_EXCL, EC_POKEMON_NATIONAL(MEW), EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Wesley + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_1} }, [FRONTIER_TRAINER_ANTON] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -486,7 +487,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_GET, EC_WORD_READY, EC_WORD_FOR, EC_WORD_ME, EC_WORD_TO, EC_MOVE(THRASH)}, .speechWin = {EC_WORD_WAHAHAHA, EC_WORD_EXCL, EC_WORD_SORRY, EC_WORD_ABOUT, EC_WORD_THAT, EC_WORD_EXCL}, .speechLose = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_TOUGH, EC_WORD_LOSS, EC_WORD_TO, EC_MOVE2(SWALLOW)}, - .monSet = gBattleFrontierTrainerMons_Anton + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_1} }, [FRONTIER_TRAINER_LAWSON] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -494,7 +495,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_YOUNG, EC_WORD_AT, EC_WORD_HEART, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_NOT, EC_WORD_COOL, EC_WORD_EXCL, EC_WORD_NOT, EC_WORD_AT, EC_WORD_ALL}, .speechLose = {EC_WORD_I_AM, EC_WORD_OLD, EC_WORD_AND, EC_WORD_FEELING, EC_WORD_SHAKY, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Lawson + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_1} }, [FRONTIER_TRAINER_SAMMY] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -502,15 +503,16 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_PARTY, EC_WORD_IS, EC_WORD_READY, EC_WORD_TO, EC_WORD_ROCK}, .speechWin = {EC_WORD_MY, EC_WORD_PARTY, EC_WORD_IS, EC_WORD_JUST, EC_WORD_INCREDIBLE, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_CRY, EC_WORD_FOR, EC_WORD_MY, EC_WORD_PARTY, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Sammy + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_1} }, + // The below 3 are the early Collector class trainers, which use groups from other general classes [FRONTIER_TRAINER_ARNIE] = { .facilityClass = FACILITY_CLASS_COLLECTOR, .trainerName = _("ARNIE"), .speechBefore = {EC_WORD_I_AM, EC_WORD_NO_1, EC_WORD_I, EC_WORD_HAVE, EC_WORD_NO, EC_WORD_RIVAL}, .speechWin = {EC_WORD_YOU, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_I, EC_WORD_CAN_T, EC_WORD_LOSE}, .speechLose = {EC_WORD_NO, EC_WORD_EXCL, EC_WORD_I, EC_WORD_WON_T, EC_WORD_ACCEPT, EC_WORD_THIS}, - .monSet = gBattleFrontierTrainerMons_Arnie + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_ADRIAN] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -518,7 +520,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YAHOO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_YAHOO, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_GOOD_BYE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_GOOD_BYE, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Adrian + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_TRISTAN] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -526,7 +528,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_CONFUSED, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS}, .speechWin = {EC_WORD_SEE, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS}, .speechLose = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_IN, EC_WORD_BATTLE}, - .monSet = gBattleFrontierTrainerMons_Tristan + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_JULIANA] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -534,7 +536,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_THINK, EC_WORD_I_AM, EC_WORD_SHOPPING, EC_WORD_TOO, EC_WORD_MUCH}, .speechWin = {EC_WORD_BUT, EC_WORD_I, EC_WORD_WANT, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_PLUSH_DOLL}, .speechLose = {EC_WORD_I, EC_WORD_SO, EC_WORD_WANT, EC_WORD_ANOTHER, EC_WORD_POKEMON, EC_WORD_PLUSH_DOLL}, - .monSet = gBattleFrontierTrainerMons_Juliana + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_1} }, [FRONTIER_TRAINER_RYLEE] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -542,7 +544,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_THAT, EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_GUTS}, .speechWin = {EC_WORD_BYE_BYE, EC_WORD_EXCL, EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_NO, EC_WORD_GUTS}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_GUTSY, EC_WORD_ELLIPSIS, EC_WORD_YOU_RE, EC_WORD_QUITE, EC_WORD_SUPER}, - .monSet = gBattleFrontierTrainerMons_Rylee + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_1} }, [FRONTIER_TRAINER_CHELSEA] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -550,15 +552,16 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_SERIOUSLY, EC_WORD_MEAN, EC_WORD_TO, EC_WORD_WIN, EC_WORD_EXCL}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_MY, EC_WORD_WILL, EC_WORD_TO, EC_WORD_WIN, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_FAR, EC_WORD_TOO_STRONG, EC_WORD_FOR, EC_WORD_ME, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Chelsea + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_1} }, + // The below 3 are the early Beauty class trainers, which use groups from other general classes [FRONTIER_TRAINER_DANELA] = { .facilityClass = FACILITY_CLASS_BEAUTY, .trainerName = _("DANELA"), .speechBefore = {EC_WORD_YOU, EC_WORD_MUST_BE, EC_WORD_MY, EC_WORD_OPPONENT, EC_WORD_NOW, EC_WORD_EXCL}, .speechWin = {EC_WORD_OH_DEAR, EC_WORD_TOO_WEAK, EC_WORD_EXCL, EC_WORD_DON_T, EC_WORD_GIVE_UP, EC_WORD_EXCL}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_GOOD, EC_WORD_AND, EC_WORD_THIS, EC_WORD_IS, EC_WORD_GOOD_BYE}, - .monSet = gBattleFrontierTrainerMons_Danela + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_1} }, [FRONTIER_TRAINER_LIZBETH] = { .facilityClass = FACILITY_CLASS_BEAUTY, @@ -566,7 +569,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IF_I_LOSE, EC_WORD_YOU, EC_WORD_CAN, EC_WORD_HAVE, EC_WORD_A, EC_MOVE2(PRESENT)}, .speechWin = {EC_WORD_HERE_IT_IS, EC_WORD_A_LITTLE, EC_WORD_PRAISE, EC_WORD_AS, EC_WORD_YOUR, EC_MOVE2(PRESENT)}, .speechLose = {EC_WORD_YOUR, EC_MOVE2(PRESENT), EC_WORD_QUES_EXCL, EC_WORD_HERE_IT_IS, EC_WORD_A, EC_MOVE(DOUBLE_SLAP)}, - .monSet = gBattleFrontierTrainerMons_Lizbeth + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_1} }, [FRONTIER_TRAINER_AMELIA] = { .facilityClass = FACILITY_CLASS_BEAUTY, @@ -574,7 +577,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_BELIEVE, EC_WORD_IN, EC_WORD_CUTE, EC_WORD_FASHION, EC_WORD_APPEAL}, .speechWin = {EC_WORD_YOUR, EC_WORD_FASHION, EC_WORD_SENSE, EC_WORD_IS, EC_WORD_A, EC_WORD_DISASTER}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_AWFUL, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_HOME}, - .monSet = gBattleFrontierTrainerMons_Amelia + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_1} }, [FRONTIER_TRAINER_JILLIAN] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -582,7 +585,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WHAT, EC_WORD_IS, EC_WORD_THAT, EC_WORD_I, EC_WORD_SMELL, EC_WORD_QUES}, .speechWin = {EC_WORD_IT_S, EC_WORD_THE, EC_MOVE(SWEET_SCENT), EC_WORD_OF, EC_WORD_TASTY, EC_WORD_WATER}, .speechLose = {EC_WORD_IT_S, EC_WORD_YOUR, EC_WORD_OFFENSIVE, EC_WORD_STENCH, EC_WORD_THAT_S, EC_WORD_WHAT}, - .monSet = gBattleFrontierTrainerMons_Jillian + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_1} }, [FRONTIER_TRAINER_ABBIE] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -590,7 +593,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_TRY, EC_WORD_MY, EC_WORD_SECRET, EC_MOVE(AROMATHERAPY), EC_WORD_OK_QUES}, .speechWin = {EC_WORD_MY, EC_MOVE(AROMATHERAPY), EC_WORD_IS, EC_WORD_TERRIBLE, EC_WORD_FOR, EC_WORD_YOU}, .speechLose = {EC_WORD_DIDN_T, EC_WORD_YOU, EC_WORD_SMELL, EC_WORD_A, EC_WORD_THING, EC_WORD_QUES_EXCL}, - .monSet = gBattleFrontierTrainerMons_Abbie + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_1} }, [FRONTIER_TRAINER_BRIANA] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -598,7 +601,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_BOY, EC_WORD_FRIEND, EC_WORD_WORKS, EC_WORD_TOO, EC_WORD_MUCH}, .speechWin = {EC_WORD_I, EC_WORD_ONLY, EC_WORD_MISS, EC_WORD_HIM, EC_WORD_MORE, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_LONESOME, EC_WORD_WITHOUT, EC_WORD_HIM, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Briana + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_1} }, [FRONTIER_TRAINER_ANTONIO] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -606,7 +609,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_HOW, EC_WORD_TO, EC_WORD_GO, EC_WORD_GO}, .speechWin = {EC_WORD_BUT, EC_WORD_I, EC_WORD_DON_T, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_DANCE}, .speechLose = {EC_WORD_GO, EC_WORD_GO, EC_WORD_ELLIPSIS, EC_WORD_JUST, EC_MOVE(FLAIL), EC_WORD_ABOUT}, - .monSet = gBattleFrontierTrainerMons_Antonio + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_1} }, [FRONTIER_TRAINER_JADEN] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -614,7 +617,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HELLO, EC_WORD_I, EC_WORD_THINK, EC_WORD_I, EC_WORD_ADORE, EC_WORD_YOU}, .speechWin = {EC_WORD_YOU, EC_WORD_MAKE, EC_WORD_ME, EC_MOVE(THRASH), EC_WORD_IN, EC_MOVE2(FRUSTRATION)}, .speechLose = {EC_WORD_THIS_IS_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_GOOD_BYE, EC_WORD_FOREVER, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Jaden + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_1} }, [FRONTIER_TRAINER_DAKOTA] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -622,7 +625,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_DANCE, EC_WORD_WITH, EC_WORD_POWER}, .speechWin = {EC_WORD_GOT, EC_WORD_IT, EC_WORD_QUES, EC_WORD_DANCE, EC_WORD_WITH, EC_WORD_POWER}, .speechLose = {EC_WORD_OKAY, EC_WORD_YOU, EC_WORD_UNDERSTAND, EC_WORD_ALL_RIGHT, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Dakota + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_1} }, [FRONTIER_TRAINER_BRAYDEN] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -630,7 +633,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COLOR_CHANGE, EC_WORD_VERSION, EC_WORD_TOYS, EC_WORD_ARE, EC_WORD_USELESS, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_ONLY, EC_WORD_COLLECT, EC_WORD_NORMAL, EC_WORD_VERSION, EC_WORD_TOYS}, .speechLose = {EC_WORD_I, EC_MOVE2(ATTRACT), EC_WORD_COLOR_CHANGE, EC_WORD_VERSION, EC_WORD_TOYS, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Brayden + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_1} }, [FRONTIER_TRAINER_CORSON] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -638,7 +641,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_GET, EC_WORD_TO, EC_MOVE2(BEAT_UP), EC_WORD_ON, EC_WORD_YOU}, .speechWin = {EC_WORD_TOO, EC_WORD_EASY, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_COOL}, .speechLose = {EC_WORD_WHY, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_MOVE2(CURSE), EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Corson + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_1} }, [FRONTIER_TRAINER_TREVIN] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -646,7 +649,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NONE, EC_WORD_BETTER, EC_WORD_THAN, EC_WORD_ME}, .speechWin = {EC_WORD_YES_SIR_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_THE, EC_WORD_BEST}, .speechLose = {EC_WORD_SERIOUS, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Trevin + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_1} }, [FRONTIER_TRAINER_PATRICK] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -654,7 +657,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_PERFECT, EC_WORD_EXCL, EC_WORD_GIVE_UP, EC_WORD_NOW, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_WORD_BE, EC_WORD_DISAPPOINTED, EC_WORD_I_AM, EC_WORD_PERFECT, EC_EMPTY_WORD}, .speechLose = {EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES, EC_WORD_I_AM, EC_WORD_PERFECT, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Patrick + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_1} }, [FRONTIER_TRAINER_KADEN] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -662,7 +665,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WHAT, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_UP, EC_WORD_TO, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_WERE, EC_WORD_A, EC_WORD_SURPRISE, EC_WORD_TO_ME, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_KNOW, EC_WORD_WHO, EC_WORD_I_AM, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Kaden + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_1} }, [FRONTIER_TRAINER_MAXWELL] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -670,7 +673,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_WHO_IS, EC_WORD_YOUR, EC_WORD_RIVAL, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MY, EC_WORD_RIVAL, EC_WORD_IS, EC_WORD_MY, EC_WORD_GIRL, EC_WORD_FRIEND}, .speechLose = {EC_WORD_I_AM, EC_WORD_MAKING, EC_WORD_YOU, EC_WORD_MY, EC_WORD_RIVAL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Maxwell + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_1} }, [FRONTIER_TRAINER_DARYL] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -678,7 +681,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_ONLY, EC_WORD_KNOW, EC_WORD_HOW, EC_WORD_TO, EC_MOVE(CHARGE)}, .speechWin = {EC_WORD_AM, EC_WORD_I, EC_WORD_OVERWHELMING, EC_WORD_OR, EC_WORD_WHAT, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_GOING, EC_WORD_TO, EC_WORD_A, EC_WORD_LEGEND, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Daryl + .monSet = (const u16[]){FRONTIER_MONS_HIKER_1} }, [FRONTIER_TRAINER_KENNETH] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -686,7 +689,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_BETTER, EC_WORD_NOT, EC_MOVE2(SLACK_OFF), EC_WORD_WITH, EC_WORD_ME}, .speechWin = {EC_WORD_DID, EC_WORD_MY, EC_MOVE2(TAUNT), EC_WORD_INTIMIDATE, EC_WORD_YOU, EC_WORD_QUES}, .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Kenneth + .monSet = (const u16[]){FRONTIER_MONS_HIKER_1} }, [FRONTIER_TRAINER_RICH] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -694,7 +697,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOUR, EC_MOVE(FACADE), EC_WORD_DOESN_T, EC_MOVE2(TRICK), EC_WORD_ME, EC_EMPTY_WORD}, .speechWin = {EC_WORD_SERIOUSLY, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_OK_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_REALLY, EC_WORD_TOUGH, EC_WORD_ON, EC_WORD_ME, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Rich + .monSet = (const u16[]){FRONTIER_MONS_HIKER_1} }, [FRONTIER_TRAINER_CADEN] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -702,7 +705,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_BE, EC_WORD_DEFEATED, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_FIRE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_FIRE, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_TIRED, EC_WORD_ELLIPSIS, EC_WORD_IT_S, EC_WORD_SO, EC_WORD_HOT}, - .monSet = gBattleFrontierTrainerMons_Caden + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_1} }, [FRONTIER_TRAINER_MARLON] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -710,7 +713,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_POKEDEX, EC_WORD_IS, EC_WORD_A_LITTLE, EC_WORD_RADIO, EC_WORD_QUES}, .speechWin = {EC_WORD_A_LITTLE, EC_WORD_RADIO, EC_WORD_HUH_QUES, EC_WORD_THAT_S, EC_WORD_TOTALLY, EC_WORD_COOL}, .speechLose = {EC_WORD_IT_S, EC_WORD_NOT, EC_WORD_QUES, EC_WORD_IS, EC_WORD_POKENAV, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Marlon + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_1} }, [FRONTIER_TRAINER_NASH] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -718,7 +721,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_BABY, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_LEFT, EC_WORD_YOU, EC_WORD_JUST, EC_WORD_AN, EC_MOVE2(EMBER)}, .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_WATER, EC_WORD_PLEASE}, - .monSet = gBattleFrontierTrainerMons_Nash + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_1} }, [FRONTIER_TRAINER_ROBBY] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, @@ -726,7 +729,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HAHAHA, EC_WORD_EXCL, EC_WORD_HAPPY, EC_WORD_TO, EC_WORD_MEET_YOU, EC_WORD_EXCL}, .speechWin = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_LEADER, EC_WORD_WITH, EC_WORD_REFRESHING, EC_WORD_SERENE_GRACE}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_MOVE(THRASH), EC_WORD_MY, EC_WORD_TOYS, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Robby + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_1} }, [FRONTIER_TRAINER_REECE] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, @@ -734,7 +737,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_MOVE2(QUICK_ATTACK), EC_WORD_CAN, EC_WORD_BEAT, EC_WORD_A, EC_MOVE2(TELEPORT)}, .speechWin = {EC_WORD_LIKE, EC_WORD_I, EC_WORD_SAID, EC_WORD_I_AM, EC_WORD_DARN, EC_WORD_FAST}, .speechLose = {EC_WORD_I_WAS, EC_WORD_KIDDING, EC_WORD_ABOUT, EC_WORD_THAT, EC_MOVE2(TELEPORT), EC_WORD_THING}, - .monSet = gBattleFrontierTrainerMons_Reece + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_1} }, [FRONTIER_TRAINER_KATHRYN] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, @@ -742,7 +745,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_TRAIN, EC_WORD_GOOD, EC_WORD_ENOUGH, EC_WORD_QUES}, .speechWin = {EC_WORD_DON_T, EC_MOVE2(TAUNT), EC_WORD_ME, EC_WORD_LIKE, EC_WORD_THAT, EC_WORD_OK_QUES}, .speechLose = {EC_WORD_WHY, EC_WORD_COULDN_T, EC_WORD_I, EC_WORD_WIN, EC_WORD_THIS, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Kathryn + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_1} }, [FRONTIER_TRAINER_ELLEN] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, @@ -750,7 +753,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_CRUSH, EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_AN, EC_WORD_EGG, EC_WORD_EXCL}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_A, EC_WORD_TASTY, EC_WORD_VICTORY, EC_WORD_FOR, EC_WORD_ME}, .speechLose = {EC_WORD_TOO, EC_WORD_TOUGH, EC_WORD_TO, EC_WORD_CRUSH, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Ellen + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_1} }, [FRONTIER_TRAINER_RAMON] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, @@ -758,7 +761,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_OKAY, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THIS, EC_WORD_IS, EC_WORD_PERFECTION}, .speechWin = {EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_THAT, EC_WORD_I, EC_WORD_WON, EC_WORD_EXCL}, .speechLose = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_SECRET, EC_WORD_WHY, EC_WORD_I_AM, EC_WORD_HAPPY}, - .monSet = gBattleFrontierTrainerMons_Ramon + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_1} }, [FRONTIER_TRAINER_ARTHUR] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, @@ -766,7 +769,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HERE_I_COME, EC_WORD_FEELING, EC_WORD_READY, EC_WORD_FOR, EC_WORD_IT, EC_WORD_ALL}, .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_THAT_WAS, EC_WORD_FABULOUS, EC_WORD_EXCL}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_NOT, EC_WORD_WHAT, EC_WORD_I, EC_WORD_NEED, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Arthur + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_1} }, [FRONTIER_TRAINER_ALONDRA] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, @@ -774,7 +777,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_EVERY, EC_WORD_DAY, EC_WORD_IS, EC_WORD_A, EC_WORD_GREAT, EC_WORD_DAY}, .speechWin = {EC_WORD_MY, EC_MOVE2(DIVE), EC_WORD_WILL, EC_WORD_BE, EC_WORD_A, EC_WORD_LEGEND}, .speechLose = {EC_WORD_MY, EC_MOVE2(DIVE), EC_WORD_LEFT, EC_WORD_ME, EC_WORD_COLD, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Alondra + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_1} }, [FRONTIER_TRAINER_ADRIANA] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, @@ -782,7 +785,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME, EC_WORD_SEE, EC_WORD_AN, EC_WORD_INCREDIBLE, EC_WORD_SWIFT_SWIM, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_MAKE, EC_WORD_IT, EC_WORD_LOOK, EC_WORD_SO, EC_WORD_EASY}, .speechLose = {EC_WORD_I_AM, EC_WORD_FEELING, EC_MOVE2(BEAT_UP), EC_WORD_AND, EC_WORD_TIRED, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Adriana + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_1} }, [FRONTIER_TRAINER_MALIK] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, @@ -790,7 +793,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_OH, EC_WORD_NOT, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_PLEASE, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_I, EC_WORD_FINALLY, EC_WORD_WON, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_TIRED}, .speechLose = {EC_WORD_I, EC_WORD_FINALLY, EC_WORD_LOST, EC_WORD_ELLIPSIS, EC_WORD_I_AM, EC_WORD_TIRED}, - .monSet = gBattleFrontierTrainerMons_Malik + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_1} }, [FRONTIER_TRAINER_JILL] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, @@ -798,7 +801,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_WINS, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_GIVES, EC_WORD_UP, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Jill + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_1} }, [FRONTIER_TRAINER_ERIK] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, @@ -806,7 +809,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_SPEED_BOOST, EC_WORD_HERO, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_FROM, EC_WORD_THE, EC_WORD_SPEED_BOOST, EC_WORD_HERO, EC_WORD_EXCL}, .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_NO, EC_WORD_EXCL_EXCL}, - .monSet = gBattleFrontierTrainerMons_Erik + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_2} }, [FRONTIER_TRAINER_YAZMIN] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, @@ -814,7 +817,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WOULD, EC_WORD_RATHER, EC_WORD_RUN, EC_WORD_THAN, EC_WORD_BIKE}, .speechWin = {EC_WORD_YES, EC_WORD_I, EC_WORD_WOULD, EC_WORD_MUCH, EC_WORD_RATHER, EC_WORD_RUN}, .speechLose = {EC_WORD_BYE_BYE, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_RUN_AWAY}, - .monSet = gBattleFrontierTrainerMons_Yazmin + .monSet = (const u16[]){FRONTIER_MONS_RUNNING_TRIATHLETE_2} }, [FRONTIER_TRAINER_JAMAL] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, @@ -822,7 +825,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_BE, EC_WORD_A, EC_WORD_FATHER}, .speechWin = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_FOR, EC_WORD_MY, EC_WORD_BABY}, .speechLose = {EC_WORD_MY, EC_WORD_BABY, EC_WORD_WILL, EC_WORD_BE, EC_WORD_TOTALLY, EC_WORD_AWESOME}, - .monSet = gBattleFrontierTrainerMons_Jamal + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_2} }, [FRONTIER_TRAINER_LESLIE] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, @@ -830,7 +833,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_BE, EC_WORD_A, EC_WORD_MOTHER}, .speechWin = {EC_WORD_A, EC_WORD_BABY, EC_WORD_WILL, EC_WORD_BE, EC_WORD_A_LITTLE, EC_WORD_CHALLENGE}, .speechLose = {EC_WORD_I_AM, EC_WORD_TOO, EC_WORD_HAPPY, EC_WORD_TO, EC_WORD_BE, EC_WORD_ANGRY}, - .monSet = gBattleFrontierTrainerMons_Leslie + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_2} }, [FRONTIER_TRAINER_DAVE] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, @@ -838,7 +841,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WHAT, EC_WORD_SHOULD, EC_WORD_I, EC_WORD_DO, EC_WORD_TODAY, EC_WORD_QUES}, .speechWin = {EC_WORD_I, EC_WORD_SHOULD, EC_WORD_ENJOY, EC_WORD_SOME, EC_WORD_SPORTS, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_GO, EC_WORD_PLAY, EC_WORD_A, EC_WORD_GAME}, - .monSet = gBattleFrontierTrainerMons_Dave + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_2} }, [FRONTIER_TRAINER_CARLO] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, @@ -846,7 +849,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_YEAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_DO, EC_WORD_THINGS, EC_WORD_AT, EC_MOVE(EXTREME_SPEED), EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_LOST, EC_WORD_AT, EC_MOVE(EXTREME_SPEED), EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Carlo + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_2} }, [FRONTIER_TRAINER_EMILIA] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, @@ -854,7 +857,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ME, EC_WORD_WORRY, EC_WORD_QUES, EC_WORD_I, EC_WORD_HAVE, EC_WORD_NONE}, .speechWin = {EC_WORD_AHAHA, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_THAT_WAS, EC_WORD_FANTASTIC, EC_WORD_EXCL}, .speechLose = {EC_WORD_AHAHA, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_THAT_WAS, EC_WORD_ENTERTAINING, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Emilia + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_2} }, [FRONTIER_TRAINER_DALIA] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, @@ -862,7 +865,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_BIKE, EC_WORD_IS, EC_WORD_VERY, EC_WORD_EXPENSIVE, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_WORD_COME, EC_WORD_NEAR, EC_WORD_MY, EC_WORD_BIKE, EC_WORD_EXCL}, .speechLose = {EC_WORD_MY, EC_WORD_BIKE, EC_WORD_IS, EC_WORD_MY, EC_WORD_BEST, EC_WORD_FRIEND}, - .monSet = gBattleFrontierTrainerMons_Dalia + .monSet = (const u16[]){FRONTIER_MONS_CYCLING_TRIATHLETE_2} }, [FRONTIER_TRAINER_HITOMI] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -870,7 +873,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YEAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_HAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHAT, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES_EXCL}, .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_EXCL_EXCL}, - .monSet = gBattleFrontierTrainerMons_Hitomi + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_RICARDO] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -878,7 +881,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_ON, EC_WORD_EXCL, EC_WORD_PLAY, EC_WORD_TIME, EC_WORD_IS, EC_WORD_OVER}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_OUT, EC_WORD_OF, EC_WORD_HERE, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_PLEASE, EC_WORD_DON_T, EC_WORD_HIT, EC_WORD_ME, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Ricardo + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_SHIZUKA] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -886,7 +889,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_THAT, EC_WORD_YOU_RE, EC_WORD_SERIOUS, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_WON_T, EC_WORD_FORGET, EC_WORD_ABOUT, EC_WORD_YOU, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_PERFECT, EC_WORD_IN, EC_WORD_EVERY, EC_WORD_WAY, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Shizuka + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_JOANA] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -894,7 +897,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU_RE, EC_WORD_GOING, EC_WORD_TO, EC_WORD_LOSE, EC_WORD_RIGHT, EC_WORD_AWAY}, .speechWin = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_WINNER, EC_WORD_HEAR, EC_WORD_ME, EC_MOVE2(ROAR)}, .speechLose = {EC_WORD_I, EC_WORD_REFUSE, EC_WORD_TO, EC_WORD_ACCEPT, EC_WORD_THAT, EC_MOVE(OUTRAGE)}, - .monSet = gBattleFrontierTrainerMons_Joana + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_KELLY] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -902,7 +905,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_NIGHT, EC_WORD_SCHOOL, EC_WORD_IS, EC_WORD_REALLY, EC_WORD_SCARY}, .speechWin = {EC_WORD_A, EC_WORD_LADY, EC_WORD_GHOST, EC_WORD_APPEARS, EC_WORD_THERE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THE, EC_WORD_HOME, EC_WORD_WORK, EC_WORD_IS, EC_WORD_AWFULLY, EC_WORD_SCARY}, - .monSet = gBattleFrontierTrainerMons_Kelly + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_RAYNA] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -910,7 +913,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NO_1, EC_WORD_WHEN, EC_WORD_IT_S, EC_WORD_ABOUT, EC_WORD_POWER}, .speechWin = {EC_WORD_UNDERSTAND, EC_WORD_MY, EC_WORD_POWER, EC_WORD_NOW, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Rayna + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_1} }, [FRONTIER_TRAINER_EVAN] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -918,7 +921,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_EVERY, EC_WORD_BATTLE, EC_WORD_HAS, EC_WORD_A, EC_WORD_SMELL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_OH, EC_WORD_EXCL, EC_WORD_THE, EC_MOVE(SWEET_SCENT), EC_WORD_OF, EC_WORD_VICTORY}, .speechLose = {EC_WORD_THE, EC_WORD_AWFUL, EC_WORD_STENCH, EC_WORD_OF, EC_WORD_A, EC_WORD_LOSS}, - .monSet = gBattleFrontierTrainerMons_Evan + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1A} }, [FRONTIER_TRAINER_JORDAN] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -926,7 +929,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_GOOD, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_COME_ON, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_BEAT, EC_WORD_ME, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WHAT, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Jordan + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1B} }, [FRONTIER_TRAINER_JOEL] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -934,7 +937,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_FUFUFU, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_HAHAHA, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Joel + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1C} }, [FRONTIER_TRAINER_KRISTEN] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -942,7 +945,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HAHAHA, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_A, EC_WORD_KID, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_JUST, EC_WORD_A_LITTLE, EC_WORD_KID, EC_WORD_AFTER, EC_WORD_ALL, EC_WORD_EXCL}, .speechLose = {EC_WORD_A, EC_WORD_TOUGH, EC_WORD_KID, EC_WORD_HUH_QUES, EC_WORD_HUMPH, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Kristen + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1A} }, [FRONTIER_TRAINER_SELPHY] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -950,7 +953,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HUH_QUES, EC_WORD_WHAT, EC_WORD_IS_IT_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_OH, EC_WORD_YES, EC_WORD_EXCL, EC_WORD_WHY, EC_WORD_NOT, EC_WORD_QUES}, .speechLose = {EC_WORD_OH, EC_WORD_NO, EC_WORD_EXCL, EC_WORD_WHY, EC_WORD_NOT, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Selphy + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1B} }, [FRONTIER_TRAINER_CHLOE] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -958,7 +961,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME, EC_WORD_WE, EC_WORD_WILL, EC_WORD_DO, EC_WORD_BATTLE, EC_WORD_NOW}, .speechWin = {EC_WORD_MORE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_EXCL}, .speechLose = {EC_WORD_OH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_STRONG, EC_WORD_YOU, EC_WORD_ARE}, - .monSet = gBattleFrontierTrainerMons_Chloe + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_1C} }, [FRONTIER_TRAINER_NORTON] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -966,7 +969,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_ONLY, EC_WORD_YOU, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_EXCUSE_ME, EC_WORD_BUT, EC_WORD_YOU_RE, EC_WORD_A, EC_WORD_PUSHOVER, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_SOME, EC_WORD_KIND, EC_WORD_OF, EC_WORD_AWESOME, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Norton + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_LUKAS] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -974,7 +977,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_JOKING, EC_WORD_IS, EC_WORD_PRETTY, EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_YOUR, EC_WORD_ROCK_HEAD, EC_WORD_EXISTS, EC_WORD_TO, EC_WORD_SHINE, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOUR, EC_WORD_ROCK_HEAD, EC_WORD_COME, EC_WORD_TO, EC_WORD_SHINE, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Lukas + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_ZACH] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -982,7 +985,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_AN, EC_WORD_EXCELLENT, EC_MOVE2(MIMIC), EC_WORD_OF, EC_WORD_POKEMON}, .speechWin = {EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_LIKE, EC_WORD_A_LITTLE, EC_POKEMON_NATIONAL(TOGEPI), EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_ANGRY, EC_WORD_LIKE, EC_WORD_A, EC_POKEMON_NATIONAL(MANKEY), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Zach + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_KAITLYN] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -990,7 +993,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CRUSH, EC_WORD_THINGS, EC_WORD_WITH, EC_WORD_PSYCHIC, EC_WORD_POWER}, .speechWin = {EC_WORD_MY, EC_WORD_VICTORY, EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_THE, EC_WORD_NEWS}, .speechLose = {EC_WORD_NO, EC_WORD_NO, EC_WORD_ELLIPSIS, EC_WORD_THIS, EC_WORD_WON_T, EC_WORD_DO}, - .monSet = gBattleFrontierTrainerMons_Kaitlyn + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_BREANNA] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -998,7 +1001,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_WILL, EC_WORD_CRUSH, EC_WORD_YOU, EC_WORD_EXCL}, .speechWin = {EC_WORD_HAVE, EC_WORD_SOME, EC_WORD_MORE, EC_WORD_OF, EC_WORD_THIS, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_GUTS, EC_WORD_AND, EC_WORD_SKILL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Breanna + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_KENDRA] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -1006,7 +1009,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IF, EC_WORD_YOU_RE, EC_WORD_SMART, EC_WORD_STOP, EC_WORD_RIGHT, EC_WORD_NOW}, .speechWin = {EC_WORD_I, EC_WORD_SAID, EC_WORD_THAT, EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_STOP}, .speechLose = {EC_WORD_WHY, EC_WORD_DIDN_T, EC_WORD_YOU, EC_WORD_STOP, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Kendra + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_1} }, [FRONTIER_TRAINER_MOLLY] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -1014,7 +1017,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WILL, EC_WORD_MY, EC_WORD_CUTE_CHARM, EC_MOVE2(ATTRACT), EC_WORD_YOU, EC_WORD_QUES}, .speechWin = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_MY, EC_WORD_TOYS, EC_WORD_NOW}, .speechLose = {EC_WORD_OH, EC_WORD_HOW, EC_WORD_COULD, EC_WORD_YOU, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Molly + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_1} }, [FRONTIER_TRAINER_JAZMIN] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -1022,7 +1025,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_FORECAST, EC_WORD_TERRIBLE, EC_WORD_THINGS, EC_WORD_FOR, EC_WORD_YOU}, .speechWin = {EC_WORD_THERE, EC_WORD_WASN_T, EC_WORD_MY, EC_WORD_FORECAST, EC_WORD_RIGHT, EC_WORD_QUES}, .speechLose = {EC_WORD_MY, EC_MOVE2(FORESIGHT), EC_WORD_DIDN_T, EC_WORD_SHOW, EC_WORD_ME, EC_WORD_THIS}, - .monSet = gBattleFrontierTrainerMons_Jazmin + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_1} }, [FRONTIER_TRAINER_KELSEY] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -1030,7 +1033,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_HAVEN_T, EC_WORD_SLEPT, EC_WORD_IN, EC_WORD_DAYS, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_MY, EC_WORD_SLEEP, EC_WORD_WILL, EC_WORD_BE, EC_WORD_EXCELLENT, EC_WORD_NOW}, .speechLose = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_DESTROYED, EC_WORD_MY, EC_WORD_SLEEP, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Kelsey + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_1} }, [FRONTIER_TRAINER_JALEN] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -1038,7 +1041,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_ALLOW, EC_WORD_POKEMON, EC_WORD_TO, EC_MOVE(THRASH)}, .speechWin = {EC_WORD_HAHAHA, EC_WORD_EXCL, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_ANGRY, EC_WORD_QUES}, .speechLose = {EC_WORD_WHY, EC_WORD_IS, EC_WORD_THIS, EC_WORD_SO, EC_WORD_HARD, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Jalen + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_1} }, [FRONTIER_TRAINER_GRIFFEN] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -1046,7 +1049,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(SWALLOW), EC_MOVE2(SLUDGE), EC_WORD_TO, EC_MOVE2(TRANSFORM), EC_WORD_MYSELF}, .speechWin = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_A, EC_MOVE(GROWTH), EC_WORD_OF, EC_MOVE2(ACID_ARMOR)}, .speechLose = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_A, EC_MOVE(GROWTH), EC_WORD_OF, EC_WORD_SUCTION_CUPS}, - .monSet = gBattleFrontierTrainerMons_Griffen + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_1} }, [FRONTIER_TRAINER_XANDER] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -1054,7 +1057,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_GOT, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ON, EC_WORD_RENTAL}, .speechWin = {EC_WORD_IT_S, EC_WORD_INCREDIBLE, EC_WORD_MY, EC_WORD_RENTAL, EC_WORD_POKEMON, EC_WORD_WON}, .speechLose = {EC_WORD_RENTAL, EC_WORD_POKEMON, EC_WORD_AREN_T, EC_WORD_UP, EC_WORD_TO, EC_MOVE2(SCRATCH)}, - .monSet = gBattleFrontierTrainerMons_Xander + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_1} }, [FRONTIER_TRAINER_MARVIN] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -1062,7 +1065,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU_RE, EC_WORD_UP, EC_WORD_TO, EC_WORD_THE, EC_WORD_CHALLENGE, EC_WORD_QUES}, .speechWin = {EC_WORD_I, EC_WORD_DIDN_T, EC_WORD_THINK, EC_WORD_YOU_RE, EC_WORD_GOOD, EC_WORD_ENOUGH}, .speechLose = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_PERFECT, EC_WORD_THANK_YOU, EC_WORD_SO, EC_WORD_MUCH}, - .monSet = gBattleFrontierTrainerMons_Marvin + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_1A} }, [FRONTIER_TRAINER_BRENNAN] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -1070,7 +1073,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(WISH), EC_WORD_TO, EC_WORD_SEE, EC_WORD_THE, EC_WORD_NEWS}, .speechWin = {EC_WORD_COMICS, EC_WORD_GET, EC_WORD_DAMP, EC_WORD_FROM, EC_WORD_DRIZZLE, EC_WORD_QUES}, .speechLose = {EC_WORD_THE, EC_WORD_TIGHT, EC_WORD_MONEY, EC_WORD_LIVING, EC_WORD_CHANNEL, EC_WORD_QUES_EXCL}, - .monSet = gBattleFrontierTrainerMons_Brennan + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_1B} }, [FRONTIER_TRAINER_BALEY] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -1078,7 +1081,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_MOVE(SCREECH), EC_WORD_IS, EC_WORD_LIKE, EC_WORD_MUSIC, EC_WORD_TO_ME, EC_WORD_EXCL}, .speechWin = {EC_WORD_MY, EC_MOVE(SCREECH), EC_WORD_STRATEGY, EC_WORD_IS, EC_WORD_THE, EC_WORD_BEST}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_SOUNDPROOF, EC_WORD_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Baley + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_2} }, [FRONTIER_TRAINER_ZACKARY] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -1086,7 +1089,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_CAN, EC_WORD_YOU, EC_MOVE(DIG), EC_WORD_IT, EC_WORD_YO, EC_WORD_QUES}, .speechWin = {EC_MOVE2(TAKE_DOWN), EC_WORD_TAKE, EC_WORD_A, EC_MOVE2(DIVE), EC_WORD_YO, EC_WORD_YO}, .speechLose = {EC_WORD_BREAK, EC_WORD_DOWN, EC_MOVE2(DIVE), EC_WORD_TIME, EC_WORD_FOR, EC_WORD_ME}, - .monSet = gBattleFrontierTrainerMons_Zackary + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_2} }, [FRONTIER_TRAINER_GABRIEL] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -1094,7 +1097,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_MOVE2(POUND), EC_WORD_THE, EC_WORD_THICK_FAT, EC_WORD_ON, EC_WORD_MY, EC_MOVE2(BELLY_DRUM)}, .speechWin = {EC_MOVE2(POUND), EC_WORD_MY, EC_MOVE2(BELLY_DRUM), EC_MOVE2(POUND), EC_WORD_MY, EC_MOVE2(BELLY_DRUM)}, .speechLose = {EC_WORD_MY, EC_MOVE2(BELLY_DRUM), EC_WORD_WAS, EC_WORD_TOO_WEAK, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Gabriel + .monSet = (const u16[]){FRONTIER_MONS_COLLECTOR_1} }, [FRONTIER_TRAINER_EMILY] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -1102,7 +1105,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HOW, EC_WORD_ABOUT, EC_WORD_A_TINY_BIT, EC_WORD_OF, EC_MOVE(HYPNOSIS), EC_WORD_QUES}, .speechWin = {EC_WORD_MY, EC_MOVE(HYPNOSIS), EC_WORD_STRATEGY, EC_WORD_WORKS, EC_WORD_TO, EC_WORD_PERFECTION}, .speechLose = {EC_WORD_MY, EC_MOVE(HYPNOSIS), EC_WORD_STRATEGY, EC_WORD_WENT, EC_WORD_BADLY, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Emily + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_2} }, [FRONTIER_TRAINER_JORDYN] = { .facilityClass = FACILITY_CLASS_BEAUTY, @@ -1110,7 +1113,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_DON_T, EC_WORD_KNOW, EC_WORD_MY, EC_WORD_SECRET, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_AS, EC_WORD_I, EC_WORD_APPEAR, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_BUT, EC_WORD_HOW, EC_WORD_DID, EC_WORD_YOU, EC_WORD_KNOW, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Jordyn + .monSet = (const u16[]){FRONTIER_MONS_BEAUTY_1} }, [FRONTIER_TRAINER_SOFIA] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -1118,7 +1121,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_POKEMON(LOUDRED), EC_WORD_PROBABLY, EC_WORD_HAS, EC_WORD_A, EC_MOVE(SWEET_SCENT), EC_EMPTY_WORD}, .speechWin = {EC_WORD_THAT_S, EC_WORD_THE, EC_WORD_FEELING, EC_WORD_THAT, EC_WORD_I, EC_WORD_GET}, .speechLose = {EC_WORD_I, EC_WORD_WORK, EC_WORD_AT, EC_WORD_THE, EC_WORD_DEPT_STORE, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Sofia + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_2} }, [FRONTIER_TRAINER_BRADEN] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1126,7 +1129,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_CHOOSE_YOU, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THIS_IS_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_PRETTY, EC_WORD_AWESOME, EC_WORD_ABOUT, EC_WORD_MYSELF}, .speechLose = {EC_WORD_ALL_RIGHT, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_SURRENDER, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Braden + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1A} }, [FRONTIER_TRAINER_KAYDEN] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1134,7 +1137,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THEY, EC_WORD_OVERDO, EC_WORD_THAT, EC_WORD_GOURMET, EC_WORD_THING, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_THAT, EC_WORD_GOURMET, EC_WORD_THING, EC_WORD_ISN_T, EC_WORD_FOR, EC_WORD_ME}, .speechLose = {EC_WORD_HEY, EC_WORD_THIS, EC_WORD_IS, EC_WORD_PRETTY, EC_WORD_TASTY, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Kayden + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1B} }, [FRONTIER_TRAINER_COOPER] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1142,7 +1145,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_SHOULD, EC_WORD_ABSOLUTELY, EC_WORD_BE, EC_WORD_A, EC_WORD_PUSHOVER}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_TOO, EC_WORD_EXCITING, EC_WORD_FOR, EC_WORD_ME, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_PLEASE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_SORRY, EC_WORD_I_AM, EC_WORD_SORRY}, - .monSet = gBattleFrontierTrainerMons_Cooper + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1C} }, [FRONTIER_TRAINER_JULIA] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1150,7 +1153,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SPIRIT, EC_WORD_ALONE, EC_WORD_WON_T, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_WIN}, .speechWin = {EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_ACCEPT, EC_WORD_THIS, EC_WORD_WITH, EC_WORD_SERENE_GRACE}, .speechLose = {EC_WORD_FOR_NOW, EC_WORD_GOOD_BYE, EC_WORD_BUT, EC_WORD_IT_S, EC_WORD_NOT, EC_WORD_OVER}, - .monSet = gBattleFrontierTrainerMons_Julia + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1A} }, [FRONTIER_TRAINER_AMARA] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1158,7 +1161,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WROOOAAR_EXCL, EC_WORD_EXCL_EXCL, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_READY, EC_WORD_EXCL_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_LOSE, EC_WORD_MYSELF, EC_WORD_IF, EC_WORD_IT_S, EC_WORD_EXCITING}, .speechLose = {EC_WORD_THAT_S, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_TO, EC_MOVE2(TACKLE), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Amara + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1B} }, [FRONTIER_TRAINER_LYNN] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1166,7 +1169,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOUR, EC_WORD_SECRET, EC_WORD_CAN_T, EC_WORD_BE, EC_WORD_HIDDEN, EC_WORD_FOREVER}, .speechWin = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_YOUR, EC_WORD_SECRET, EC_WORD_NOW, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU, EC_WORD_CAN_T, EC_MOVE(SAFEGUARD), EC_WORD_YOUR, EC_WORD_OWN, EC_WORD_SECRET}, - .monSet = gBattleFrontierTrainerMons_Lynn + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_1C} }, [FRONTIER_TRAINER_JOVAN] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1174,7 +1177,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOUR, EC_WORD_BATTLE, EC_WORD_SENSE, EC_WORD_IS, EC_WORD_SADLY, EC_WORD_LACKING}, .speechWin = {EC_WORD_MY, EC_WORD_BATTLE, EC_WORD_SENSE, EC_WORD_IS, EC_WORD_COOL, EC_WORD_ISN_T_IT_QUES}, .speechLose = {EC_WORD_I_WAS, EC_WORD_MINUS, EC_WORD_MY, EC_WORD_NORMAL, EC_WORD_POWER, EC_WORD_TODAY}, - .monSet = gBattleFrontierTrainerMons_Jovan + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_DOMINIC] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1182,7 +1185,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_THIS, EC_WORD_EXCELLENT, EC_WORD_CAMERA, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MY, EC_WORD_CAMERA, EC_WORD_WAS, EC_WORD_AWFULLY, EC_WORD_EXPENSIVE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_MY, EC_WORD_CAMERA, EC_WORD_DOESN_T, EC_WORD_MISS, EC_WORD_A, EC_WORD_THING}, - .monSet = gBattleFrontierTrainerMons_Dominic + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_NIKOLAS] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1190,7 +1193,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(MIMIC), EC_WORD_POKEMON, EC_WORD_AFTER, EC_WORD_EVERY, EC_WORD_BATTLE}, .speechWin = {EC_WORD_IF_I_WIN, EC_WORD_I, EC_WORD_PRETEND, EC_WORD_I_AM, EC_WORD_A, EC_POKEMON_NATIONAL(TAUROS)}, .speechLose = {EC_WORD_IF_I_LOSE, EC_WORD_I, EC_WORD_PRETEND, EC_WORD_I_AM, EC_WORD_A, EC_POKEMON_NATIONAL(MILTANK)}, - .monSet = gBattleFrontierTrainerMons_Nikolas + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_VALERIA] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1198,7 +1201,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(WISH), EC_WORD_YOU, EC_WORD_WOULD, EC_WORD_NOT, EC_MOVE2(GLARE)}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_MEAN, EC_WORD_EXCL, EC_WORD_I, EC_WORD_MEAN, EC_WORD_REALLY}, .speechLose = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_A, EC_WORD_REALLY, EC_MOVE(SCARY_FACE), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Valeria + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_DELANEY] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1206,7 +1209,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SCHOOL, EC_WORD_IS, EC_WORD_OVER, EC_WORD_TIME, EC_WORD_TO, EC_WORD_PLAY}, .speechWin = {EC_WORD_MY, EC_WORD_BOY, EC_WORD_FRIEND, EC_WORD_IS, EC_WORD_FROM, EC_WORD_SCHOOL}, .speechLose = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_WORK, EC_WORD_NEXT, EC_WORD_WEEK}, - .monSet = gBattleFrontierTrainerMons_Delaney + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_MEGHAN] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1214,7 +1217,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SCHOOL, EC_WORD_IS, EC_WORD_OUT, EC_WORD_TIME, EC_WORD_TO, EC_WORD_PLAY}, .speechWin = {EC_WORD_MY, EC_WORD_BOY, EC_WORD_FRIEND, EC_WORD_LIKES, EC_WORD_COMICS, EC_EMPTY_WORD}, .speechLose = {EC_WORD_IT_S, EC_WORD_BACK, EC_WORD_TO, EC_WORD_SCHOOL, EC_WORD_SOON, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Meghan + .monSet = (const u16[]){FRONTIER_MONS_PKMN_RANGER_1} }, [FRONTIER_TRAINER_ROBERTO] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1222,7 +1225,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_INVINCIBLE, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_YOU, EC_WORD_WEREN_T, EC_WORD_BAD, EC_WORD_I_WAS, EC_WORD_JUST, EC_WORD_BETTER}, .speechLose = {EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_SATISFIED, EC_WORD_YET, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Roberto + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_1} }, [FRONTIER_TRAINER_DAMIAN] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1230,7 +1233,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_PURE_POWER, EC_WORD_IS, EC_WORD_MACHINE, EC_WORD_LIKE, EC_WORD_EXCL}, .speechWin = {EC_WORD_MY, EC_MOVE2(MACH_PUNCH), EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_A, EC_MOVE(BRICK_BREAK)}, .speechLose = {EC_WORD_ARRGH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Damian + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_1} }, [FRONTIER_TRAINER_BRODY] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1238,7 +1241,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_FASHION, EC_WORD_SENSE, EC_WORD_SEEMS, EC_POKEMON(ODDISH), EC_WORD_QUES}, .speechWin = {EC_WORD_IT_S, EC_WORD_MY, EC_WORD_FAMILY, EC_WORD_STAY_AT_HOME, EC_WORD_LOOK, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_QUESTION, EC_WORD_YOUR, EC_WORD_FASHION, EC_WORD_SENSE, EC_WORD_SERIOUSLY}, - .monSet = gBattleFrontierTrainerMons_Brody + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_1} }, [FRONTIER_TRAINER_GRAHAM] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1246,7 +1249,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YEAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WAHAHAHA, EC_WORD_WAHAHAHA, EC_WORD_EXCL, EC_WORD_WAHAHAHA, EC_WORD_WAHAHAHA, EC_WORD_EXCL_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, EC_WORD_IT_S, EC_WORD_MY, EC_WORD_BAD}, - .monSet = gBattleFrontierTrainerMons_Graham + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_1} }, [FRONTIER_TRAINER_TYLOR] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -1254,7 +1257,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ARE, EC_WORD_YOU, EC_WORD_FEELING, EC_WORD_MY, EC_MOVE2(HEAT_WAVE), EC_WORD_QUES}, .speechWin = {EC_WORD_YES, EC_WORD_I_AM, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_BUT, EC_WORD_I_WAS, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_FOR, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Tylor + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_2} }, [FRONTIER_TRAINER_JAREN] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -1262,7 +1265,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_FIGHTING, EC_WORD_SPIRIT, EC_WORD_QUES, EC_WORD_ME, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_WANT, EC_WORD_MORE, EC_WORD_CUTE, EC_WORD_POKEMON, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_LOOK, EC_WORD_QUITE, EC_WORD_CUTE, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Jaren + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_2} }, [FRONTIER_TRAINER_CORDELL] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, @@ -1270,7 +1273,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_BATTLE, EC_WORD_IS, EC_WORD_DECIDED, EC_WORD_ON, EC_WORD_SPIRIT}, .speechWin = {EC_WORD_CAN_T, EC_WORD_YOU, EC_WORD_ACCEPT, EC_WORD_THAT, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_BE, EC_WORD_ON, EC_WORD_MY, EC_WORD_WAY}, - .monSet = gBattleFrontierTrainerMons_Cordell + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_M_1} }, [FRONTIER_TRAINER_JAZLYN] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -1278,7 +1281,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IS, EC_WORD_YOUR, EC_WORD_POKEDEX, EC_WORD_REALLY, EC_WORD_AWESOME, EC_WORD_QUES}, .speechWin = {EC_WORD_OH_YEAH, EC_WORD_WOW, EC_WORD_YOUR, EC_WORD_POKEDEX, EC_WORD_IS, EC_WORD_SUPER}, .speechLose = {EC_WORD_AN, EC_WORD_AVANT_GARDE, EC_WORD_POKEDEX, EC_WORD_WOULD, EC_WORD_BE, EC_WORD_AWESOME}, - .monSet = gBattleFrontierTrainerMons_Jazlyn + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_F_1} }, [FRONTIER_TRAINER_ZACHERY] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -1286,7 +1289,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_MY, EC_WORD_OWN, EC_WORD_PLACE, EC_WORD_YEEHAW_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_AN, EC_WORD_EXCITING, EC_WORD_TIME, EC_WORD_FOR, EC_WORD_ME}, .speechLose = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_FLATTEN, EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Zachery + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_2} }, [FRONTIER_TRAINER_JOHAN] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -1294,7 +1297,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WINTER, EC_WORD_WILL, EC_WORD_SOON, EC_WORD_BE, EC_WORD_HERE, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MY, EC_WORD_ALLOWANCE, EC_WORD_COULD, EC_WORD_USE, EC_WORD_A, EC_MOVE2(HELPING_HAND)}, .speechLose = {EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_USE, EC_WORD_MY, EC_WORD_ALLOWANCE, EC_WORD_UP}, - .monSet = gBattleFrontierTrainerMons_Johan + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_2_NO_DUGTRIO} }, [FRONTIER_TRAINER_SHEA] = { .facilityClass = FACILITY_CLASS_LASS, @@ -1302,7 +1305,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DO, EC_WORD_YOU, EC_WORD_BATTLE, EC_WORD_WITH, EC_WORD_BEAUTY, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_BATTLE, EC_WORD_IN, EC_WORD_AN, EC_WORD_UGLY, EC_WORD_WAY}, .speechLose = {EC_WORD_WHAT, EC_WORD_IS, EC_WORD_BEAUTY, EC_WORD_TO, EC_WORD_YOU, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Shea + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_2} }, [FRONTIER_TRAINER_KAILA] = { .facilityClass = FACILITY_CLASS_LASS, @@ -1310,7 +1313,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_THIRSTY, EC_WORD_RIGHT, EC_WORD_NOW, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_I, EC_WORD_COULD, EC_WORD_USE, EC_WORD_A, EC_WORD_COLD, EC_WORD_DRINK}, .speechLose = {EC_WORD_THAT, EC_WORD_LOSS, EC_WORD_IS, EC_WORD_HARD, EC_WORD_TO, EC_MOVE2(SWALLOW)}, - .monSet = gBattleFrontierTrainerMons_Kaila + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_2} }, [FRONTIER_TRAINER_ISIAH] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, @@ -1318,7 +1321,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_PRETEND, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_A_LOT, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_MOVE2(TRICK), EC_WORD_MOTHER, EC_WORD_FOR, EC_WORD_MY, EC_WORD_ALLOWANCE}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_WANT, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_MORE}, - .monSet = gBattleFrontierTrainerMons_Isiah + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_2} }, [FRONTIER_TRAINER_GARRETT] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, @@ -1326,7 +1329,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_ENJOY, EC_WORD_COMICS, EC_WORD_AND, EC_WORD_THIS, EC_WORD_GAME}, .speechWin = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_THIS, EC_WORD_MUSIC, EC_WORD_IDOL, EC_WORD_TOO}, .speechLose = {EC_WORD_BUT, EC_WORD_I, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_MORE}, - .monSet = gBattleFrontierTrainerMons_Garrett + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_2} }, [FRONTIER_TRAINER_HAYLIE] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, @@ -1334,7 +1337,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WORRY, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_TO, EC_WORD_SLEEP}, .speechWin = {EC_WORD_A, EC_WORD_WIN, EC_WORD_GIVES, EC_WORD_ME, EC_WORD_A, EC_MOVE2(CALM_MIND)}, .speechLose = {EC_WORD_MY, EC_WORD_INSOMNIA, EC_WORD_WILL, EC_WORD_GET, EC_WORD_BAD, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Haylie + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_2} }, [FRONTIER_TRAINER_MEGAN] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, @@ -1342,7 +1345,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_BELIEVE, EC_WORD_IN, EC_WORD_AN, EC_MOVE(AROMATHERAPY), EC_WORD_BATH}, .speechWin = {EC_WORD_I, EC_WORD_WANT, EC_WORD_A, EC_WORD_HEALTHY, EC_WORD_CLEAR_BODY, EC_EMPTY_WORD}, .speechLose = {EC_WORD_IF, EC_WORD_ONLY, EC_MOVE(AROMATHERAPY), EC_WORD_WERE, EC_WORD_LESS, EC_WORD_EXPENSIVE}, - .monSet = gBattleFrontierTrainerMons_Megan + .monSet = (const u16[]){FRONTIER_MONS_SCHOOL_KID_2} }, [FRONTIER_TRAINER_ISSAC] = { .facilityClass = FACILITY_CLASS_RICH_BOY, @@ -1350,7 +1353,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_HOBBY, EC_WORD_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_ANY, EC_WORD_KIND, EC_WORD_OF, EC_MOVE2(WATER_SPORT)}, .speechLose = {EC_WORD_I, EC_WORD_DISLIKE, EC_WORD_ANY, EC_WORD_KIND, EC_WORD_OF, EC_MOVE2(MUD_SPORT)}, - .monSet = gBattleFrontierTrainerMons_Issac + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_2} }, [FRONTIER_TRAINER_QUINTON] = { .facilityClass = FACILITY_CLASS_RICH_BOY, @@ -1358,7 +1361,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_SAD, EC_WORD_CAUSE, EC_WORD_I_AM, EC_WORD_TOO_WEAK, EC_EMPTY_WORD}, .speechWin = {EC_WORD_YOU, EC_WORD_AREN_T, EC_WORD_TOO_STRONG, EC_WORD_FOR, EC_WORD_ME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_HEY, EC_WORD_WHAT, EC_WORD_DID, EC_WORD_I, EC_WORD_DO, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Quinton + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_2} }, [FRONTIER_TRAINER_SALMA] = { .facilityClass = FACILITY_CLASS_LADY, @@ -1366,7 +1369,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU_VE, EC_WORD_GOT, EC_WORD_YOUR, EC_WORD_HUSTLE, EC_WORD_ON, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_WIN, EC_WORD_YOU, EC_WORD_HUSTLE, EC_WORD_ON, EC_WORD_OUT}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_GET, EC_WORD_HOW, EC_WORD_I, EC_WORD_LOST}, - .monSet = gBattleFrontierTrainerMons_Salma + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_2} }, [FRONTIER_TRAINER_ANSLEY] = { .facilityClass = FACILITY_CLASS_LADY, @@ -1374,7 +1377,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_BORED, EC_WORD_ELLIPSIS, EC_WORD_DANCE, EC_WORD_FOR, EC_WORD_ME}, .speechWin = {EC_WORD_YOU_VE, EC_WORD_BORED, EC_WORD_ME, EC_WORD_SOME, EC_WORD_MORE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_TAKE, EC_WORD_YOUR, EC_MOVE2(FRUSTRATION), EC_WORD_SOME, EC_WORD_OTHER, EC_WORD_PLACE}, - .monSet = gBattleFrontierTrainerMons_Ansley + .monSet = (const u16[]){FRONTIER_MONS_RICH_BOY_LADY_2} }, [FRONTIER_TRAINER_HOLDEN] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, @@ -1382,7 +1385,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_COMMEMORATE, EC_WORD_MY, EC_WORD_COOLNESS, EC_WORD_IN, EC_WORD_BATTLE}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_FOR, EC_WORD_ANY, EC_WORD_PRAISE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOUR, EC_WORD_BATTLE, EC_WORD_SENSE, EC_WORD_IS, EC_WORD_AMUSING, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Holden + .monSet = (const u16[]){FRONTIER_MONS_BUG_CATCHER_2} }, [FRONTIER_TRAINER_LUCA] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, @@ -1390,7 +1393,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WE, EC_WORD_WILL, EC_WORD_HAVE, EC_WORD_A, EC_WORD_COOL, EC_WORD_BATTLE}, .speechWin = {EC_WORD_I, EC_WORD_WON, EC_WORD_IN, EC_WORD_A, EC_WORD_COOL, EC_WORD_WAY}, .speechLose = {EC_WORD_HELLO, EC_WORD_QUES, EC_WORD_I_AM, EC_WORD_JUST, EC_WORD_A, EC_WORD_KID}, - .monSet = gBattleFrontierTrainerMons_Luca + .monSet = (const u16[]){FRONTIER_MONS_BUG_CATCHER_2} }, [FRONTIER_TRAINER_JAMISON] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, @@ -1398,7 +1401,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_MOVE2(SECRET_POWER), EC_WORD_IS, EC_WORD_OVERWHELMING, EC_WORD_TO, EC_WORD_POKEMON}, .speechWin = {EC_WORD_DID, EC_WORD_YOU, EC_WORD_SEE, EC_WORD_THAT, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_USE, EC_MOVE(SMOKESCREEN), EC_WORD_TO, EC_WORD_ESCAPE}, - .monSet = gBattleFrontierTrainerMons_Jamison + .monSet = (const u16[]){FRONTIER_MONS_NINJA_BOY_2} }, [FRONTIER_TRAINER_GUNNAR] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, @@ -1406,7 +1409,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE(CUT), EC_WORD_DOWN, EC_WORD_EVERY, EC_WORD_OPPONENT, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_MOVE(GRUDGE), EC_WORD_ME, EC_WORD_FOR, EC_WORD_YOUR, EC_WORD_LOSS}, .speechLose = {EC_WORD_PLEASE, EC_WORD_LOSE, EC_WORD_THAT, EC_MOVE(SCARY_FACE), EC_WORD_OF, EC_WORD_YOURS}, - .monSet = gBattleFrontierTrainerMons_Gunnar + .monSet = (const u16[]){FRONTIER_MONS_NINJA_BOY_2} }, [FRONTIER_TRAINER_CRAIG] = { .facilityClass = FACILITY_CLASS_TUBER_M, @@ -1414,7 +1417,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_FOR, EC_WORD_MY, EC_WORD_TRAIN}, .speechWin = {EC_WORD_MY, EC_WORD_TRAIN, EC_WORD_ISN_T, EC_WORD_HERE, EC_WORD_YET, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_HERE_IT_IS, EC_WORD_MY, EC_WORD_TRAIN, EC_WORD_SEE_YA, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Craig + .monSet = (const u16[]){FRONTIER_MONS_TUBER_2} }, [FRONTIER_TRAINER_PIERCE] = { .facilityClass = FACILITY_CLASS_TUBER_M, @@ -1422,7 +1425,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THERE, EC_WORD_WAS, EC_WORD_A, EC_MOVE2(HEAT_WAVE), EC_WORD_LAST, EC_WORD_WEEK}, .speechWin = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_TAKE, EC_WORD_A, EC_MOVE2(HEAT_WAVE), EC_EMPTY_WORD}, .speechLose = {EC_WORD_DIDN_T, EC_WORD_IT, EC_MOVE(HAIL), EC_WORD_TOO, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Pierce + .monSet = (const u16[]){FRONTIER_MONS_TUBER_2} }, [FRONTIER_TRAINER_REGINA] = { .facilityClass = FACILITY_CLASS_TUBER_F, @@ -1430,7 +1433,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_PLAY, EC_WORD_IN, EC_WORD_WATER}, .speechWin = {EC_WORD_I, EC_WORD_REFUSE, EC_WORD_TO, EC_WORD_COME, EC_WORD_OUT, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_MUCH, EC_WORD_GOOD, EC_WORD_IN, EC_WORD_WATER}, - .monSet = gBattleFrontierTrainerMons_Regina + .monSet = (const u16[]){FRONTIER_MONS_TUBER_2} }, [FRONTIER_TRAINER_ALISON] = { .facilityClass = FACILITY_CLASS_TUBER_F, @@ -1438,7 +1441,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_KINDERGARTEN, EC_WORD_MAGAZINE, EC_WORD_IS, EC_WORD_TOO, EC_WORD_MUCH}, .speechWin = {EC_WORD_HOW, EC_WORD_TO, EC_WORD_BUG, EC_WORD_YOUR, EC_WORD_TEACHER, EC_WORD_QUES}, .speechLose = {EC_WORD_ENJOY, EC_WORD_A, EC_WORD_TASTY, EC_WORD_SCHOOL, EC_WORD_DIET, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Alison + .monSet = (const u16[]){FRONTIER_MONS_TUBER_2} }, [FRONTIER_TRAINER_HANK] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -1446,7 +1449,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_A, EC_WORD_BUG, EC_WORD_EVENT, EC_WORD_SOON}, .speechWin = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_BUG, EC_WORD_FASHION, EC_WORD_SHOW, EC_WORD_EXCL}, .speechLose = {EC_WORD_DON_T, EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Hank + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_3} }, [FRONTIER_TRAINER_EARL] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -1454,7 +1457,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THE, EC_WORD_INVINCIBLE, EC_WORD_BUG, EC_WORD_TRAINER, EC_WORD_IS, EC_WORD_HERE}, .speechWin = {EC_WORD_THE, EC_WORD_INVINCIBLE, EC_WORD_BUG, EC_WORD_TRAINER, EC_WORD_AM, EC_WORD_I}, .speechLose = {EC_WORD_SEE, EC_WORD_HOW, EC_WORD_FAST, EC_WORD_I, EC_WORD_RUN_AWAY, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Earl + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_3} }, [FRONTIER_TRAINER_RAMIRO] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -1462,7 +1465,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WENT, EC_WORD_TO, EC_WORD_A, EC_WORD_FISHING, EC_WORD_SCHOOL}, .speechWin = {EC_WORD_SERIOUSLY, EC_WORD_I_AM, EC_WORD_IN, EC_WORD_THE, EC_WORD_FISHING, EC_WORD_HALL_OF_FAME}, .speechLose = {EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_GO, EC_WORD_BACK, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Ramiro + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_2} }, [FRONTIER_TRAINER_HUNTER] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -1470,7 +1473,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_A, EC_WORD_TOTALLY, EC_WORD_COOL, EC_MOVE(CROSS_CHOP)}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_TO, EC_WORD_DO, EC_WORD_A, EC_MOVE(CROSS_CHOP)}, .speechLose = {EC_WORD_WAS, EC_WORD_IT, EC_WORD_A, EC_WORD_MISTAKE, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Hunter + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_2} }, [FRONTIER_TRAINER_AIDEN] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -1478,7 +1481,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_WORK, EC_WORD_IS, EC_WORD_MAKING, EC_WORD_ME, EC_WORD_HEALTHY}, .speechWin = {EC_WORD_YOU, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_I_AM, EC_WORD_HEALTHY, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_MORE, EC_WORD_HEALTHY, EC_WORD_THAN, EC_WORD_I_AM, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Aiden + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_3} }, [FRONTIER_TRAINER_XAVIER] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -1486,7 +1489,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_LOOK, EC_WORD_LOOK, EC_WORD_EXCL_EXCL}, .speechWin = {EC_WORD_GOOD_BYE, EC_WORD_AND, EC_WORD_THANK_YOU, EC_WORD_THAT_WAS, EC_WORD_FUNNY, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WOWEE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_NO, EC_WORD_EXCL_EXCL}, - .monSet = gBattleFrontierTrainerMons_Xavier + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_3} }, [FRONTIER_TRAINER_CLINTON] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -1494,7 +1497,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_SEE, EC_WORD_MY, EC_MOVE(HYPNOSIS), EC_WORD_QUES}, .speechWin = {EC_WORD_YOUR, EC_MOVE2(FURY_SWIPES), EC_WORD_YOUR, EC_MOVE(STRENGTH), EC_WORD_YOUNG, EC_WORD_TRAINER}, .speechLose = {EC_WORD_TCH, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_TOO_WEAK, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Clinton + .monSet = (const u16[]){FRONTIER_MONS_COLLECTOR_2} }, [FRONTIER_TRAINER_JESSE] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -1502,7 +1505,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_BATTLE, EC_WORD_IS, EC_WORD_FOR, EC_WORD_MY, EC_WORD_MOTHER}, .speechWin = {EC_WORD_MOTHER, EC_WORD_WILL, EC_WORD_BE, EC_WORD_HAPPY, EC_WORD_FOR, EC_WORD_ME}, .speechLose = {EC_WORD_I, EC_WORD_WANT, EC_WORD_MY, EC_WORD_MOTHER, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Jesse + .monSet = (const u16[]){FRONTIER_MONS_COLLECTOR_2} }, [FRONTIER_TRAINER_EDUARDO] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -1510,7 +1513,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_OUR, EC_WORD_MUSIC, EC_WORD_WILL, EC_WORD_PLAY, EC_WORD_ALL, EC_WORD_NIGHT}, .speechWin = {EC_WORD_NIGHTTIME, EC_WORD_IS, EC_WORD_WHEN, EC_WORD_I, EC_WORD_PLAY, EC_WORD_BEST}, .speechLose = {EC_WORD_LET_S, EC_WORD_PARTY, EC_WORD_UNTIL, EC_WORD_THE, EC_MOVE(MORNING_SUN), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Eduardo + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_2} }, [FRONTIER_TRAINER_HAL] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -1518,7 +1521,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_TRENDY, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_HIP_AND, EC_WORD_HAPPENING, EC_WORD_OH_YEAH, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_ALWAYS, EC_WORD_TRENDY, EC_WORD_THANK_YOU, EC_WORD_VERY, EC_WORD_MUCH}, - .monSet = gBattleFrontierTrainerMons_Hal + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_2} }, [FRONTIER_TRAINER_GAGE] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -1526,7 +1529,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HERE_IT_IS, EC_WORD_A, EC_WORD_FLYING, EC_WORD_TYPE, EC_WORD_HIDDEN, EC_WORD_MOVE}, .speechWin = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_FLYING, EC_WORD_TYPE, EC_WORD_VICTORY, EC_WORD_EXCL}, .speechLose = {EC_WORD_IF_I_LOSE, EC_WORD_I, EC_WORD_JUST, EC_MOVE(FLY), EC_WORD_AWAY, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Gage + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_2} }, [FRONTIER_TRAINER_ARNOLD] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -1534,7 +1537,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_WEIRD, EC_WORD_FROM, EC_WORD_A, EC_WORD_DREAM}, .speechWin = {EC_WORD_YOUR, EC_MOVE(SCARY_FACE), EC_WORD_WAS, EC_WORD_IN, EC_WORD_MY, EC_WORD_DREAM}, .speechLose = {EC_WORD_MY, EC_WORD_INCREDIBLE, EC_WORD_DREAM, EC_WORD_WAS, EC_WORD_SO, EC_WORD_WEIRD}, - .monSet = gBattleFrontierTrainerMons_Arnold + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_2} }, [FRONTIER_TRAINER_JARRETT] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -1542,7 +1545,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_ON, EC_WORD_LET_S, EC_WORD_DANCE, EC_WORD_LIKE, EC_WORD_IT_S, EC_WORD_YESTERDAY}, .speechWin = {EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_HOW, EC_WORD_I, EC_WORD_DANCE, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_DON_T, EC_WORD_APPRECIATE, EC_WORD_HOW, EC_WORD_I, EC_WORD_DANCE}, - .monSet = gBattleFrontierTrainerMons_Jarrett + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_2} }, [FRONTIER_TRAINER_GARETT] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -1550,7 +1553,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_GIRL, EC_WORD_GIVES, EC_WORD_ME, EC_WORD_A_LITTLE, EC_MOVE2(SWEET_KISS)}, .speechWin = {EC_WORD_MY, EC_WORD_GIRL, EC_WORD_FRIEND, EC_WORD_IS, EC_WORD_MY, EC_WORD_TREASURE}, .speechLose = {EC_WORD_A, EC_WORD_TREASURE, EC_WORD_ISN_T, EC_WORD_ALWAYS, EC_WORD_ABOUT, EC_WORD_MONEY}, - .monSet = gBattleFrontierTrainerMons_Garett + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_2} }, [FRONTIER_TRAINER_EMANUEL] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -1558,7 +1561,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SMARTNESS, EC_WORD_ALONE, EC_WORD_WON_T, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_WIN}, .speechWin = {EC_WORD_I_AM, EC_WORD_NOT_VERY, EC_WORD_SMART, EC_WORD_BUT, EC_WORD_I, EC_WORD_WON}, .speechLose = {EC_WORD_HOW, EC_WORD_DID, EC_WORD_YOU, EC_MOVE2(FAKE_OUT), EC_WORD_ME, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Emanuel + .monSet = (const u16[]){FRONTIER_MONS_HIKER_2} }, [FRONTIER_TRAINER_GUSTAVO] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -1566,7 +1569,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_MOVE(CHARGE), EC_WORD_EXCL, EC_EMPTY_WORD, EC_MOVE(CHARGE), EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_SURRENDER, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_SURRENDER, EC_WORD_YET}, - .monSet = gBattleFrontierTrainerMons_Gustavo + .monSet = (const u16[]){FRONTIER_MONS_HIKER_2} }, [FRONTIER_TRAINER_KAMERON] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -1574,7 +1577,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_TAKE_THAT, EC_WORD_EXCL, EC_WORD_IT_S, EC_WORD_MY, EC_WORD_FIERY, EC_MOVE2(TRICK)}, .speechWin = {EC_WORD_DID, EC_WORD_MY, EC_WORD_FIERY, EC_MOVE2(TRICK), EC_MOVE(ASTONISH), EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_DIDN_T, EC_WORD_FALL, EC_WORD_FOR, EC_WORD_MY, EC_MOVE2(TRICK)}, - .monSet = gBattleFrontierTrainerMons_Kameron + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_2} }, [FRONTIER_TRAINER_ALFREDO] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -1582,7 +1585,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_FIERY, EC_WORD_GOURMET, EC_WORD_AM, EC_WORD_I, EC_WORD_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_TASTY, EC_WORD_GOURMET, EC_WORD_VICTORY, EC_WORD_EXCL}, .speechLose = {EC_WORD_WHAT, EC_WORD_A, EC_WORD_DISASTER, EC_WORD_THAT_WAS, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Alfredo + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_2} }, [FRONTIER_TRAINER_RUBEN] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -1590,7 +1593,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_TO, EC_WORD_GET, EC_WORD_GOING}, .speechWin = {EC_WORD_GET, EC_WORD_GOING, EC_WORD_EXCL, EC_WORD_THIS, EC_WORD_IS, EC_WORD_GOOD_BYE}, .speechLose = {EC_WORD_I_VE, EC_WORD_GOT, EC_WORD_TO, EC_WORD_GET, EC_WORD_GOING, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Ruben + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_2} }, [FRONTIER_TRAINER_LAMAR] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -1598,7 +1601,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_MOVE2(PRESENT), EC_WORD_FOR, EC_WORD_ME, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MMM, EC_WORD_THIS, EC_WORD_IS, EC_WORD_QUITE, EC_WORD_TASTY, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_OH, EC_WORD_IT_S, EC_WORD_A, EC_WORD_GAME, EC_WORD_IS_IT_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Lamar + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_2} }, [FRONTIER_TRAINER_JAXON] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -1606,7 +1609,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_SHELL_ARMOR, EC_WORD_IS, EC_WORD_WHAT, EC_WORD_I, EC_WORD_WANT}, .speechWin = {EC_WORD_MY, EC_WORD_FATHER, EC_WORD_AND, EC_WORD_MOTHER, EC_WORD_WON_T, EC_WORD_ACCEPT}, .speechLose = {EC_WORD_PLEASE, EC_WORD_I, EC_WORD_NEED, EC_WORD_A, EC_WORD_SHELL_ARMOR, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Jaxon + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_3} }, [FRONTIER_TRAINER_LOGAN] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, @@ -1614,7 +1617,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IF_I_LOSE, EC_WORD_I, EC_WORD_WILL, EC_WORD_STUDY, EC_WORD_FOR, EC_WORD_SCHOOL}, .speechWin = {EC_WORD_ME, EC_WORD_STUDY, EC_WORD_QUES, EC_WORD_NOT_VERY, EC_WORD_LIKELY_TO, EC_WORD_SEE}, .speechLose = {EC_WORD_NO, EC_WORD_THANKS, EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_SLEEP}, - .monSet = gBattleFrontierTrainerMons_Logan + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_3} }, [FRONTIER_TRAINER_EMILEE] = { .facilityClass = FACILITY_CLASS_LASS, @@ -1622,7 +1625,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IS, EC_WORD_THIS, EC_WORD_KIND, EC_WORD_OF, EC_WORD_BATTLE, EC_WORD_OK_QUES}, .speechWin = {EC_WORD_LET_S, EC_WORD_GO, EC_WORD_FOR, EC_WORD_AN, EC_MOVE(ICY_WIND), EC_MOVE2(SURF)}, .speechLose = {EC_WORD_HOW, EC_WORD_ABOUT, EC_WORD_A, EC_MOVE(ROCK_SLIDE), EC_WORD_SHOW, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Emilee + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_3} }, [FRONTIER_TRAINER_JOSIE] = { .facilityClass = FACILITY_CLASS_LASS, @@ -1630,7 +1633,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_POKEMON, EC_WORD_FASHION, EC_WORD_CONTEST, EC_WORD_IS, EC_WORD_PRETTY}, .speechWin = {EC_WORD_I, EC_WORD_REALLY, EC_WORD_LIKE, EC_WORD_MODE, EC_WORD_FASHION, EC_WORD_THINGS}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_TOTALLY, EC_WORD_LACKING, EC_WORD_IN, EC_WORD_FASHION, EC_WORD_SENSE}, - .monSet = gBattleFrontierTrainerMons_Josie + .monSet = (const u16[]){FRONTIER_MONS_YOUNGSTER_LASS_3} }, [FRONTIER_TRAINER_ARMANDO] = { .facilityClass = FACILITY_CLASS_CAMPER, @@ -1638,7 +1641,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_NEED, EC_WORD_MORE, EC_WORD_GRASS, EC_WORD_TYPE, EC_WORD_POKEMON}, .speechWin = {EC_WORD_TRADE, EC_WORD_ME, EC_WORD_A, EC_WORD_GRASS, EC_WORD_POKEMON, EC_WORD_PLEASE}, .speechLose = {EC_WORD_THERE, EC_WORD_AREN_T, EC_WORD_ENOUGH, EC_WORD_GRASS, EC_WORD_TYPE, EC_WORD_POKEMON}, - .monSet = gBattleFrontierTrainerMons_Armando + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_2} }, [FRONTIER_TRAINER_SKYLER] = { .facilityClass = FACILITY_CLASS_CAMPER, @@ -1646,7 +1649,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_MOVE2(INGRAIN), EC_WORD_IS, EC_WORD_MY, EC_WORD_CHOICE, EC_WORD_BATTLE, EC_WORD_MOVE}, .speechWin = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_MOVE, EC_WORD_ME, EC_WORD_NOW, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU, EC_MOVE(CUT), EC_WORD_ME, EC_WORD_DOWN, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Skyler + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_2} }, [FRONTIER_TRAINER_RUTH] = { .facilityClass = FACILITY_CLASS_PICNICKER, @@ -1654,7 +1657,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_ENJOY, EC_WORD_THIS, EC_WORD_BATTLE}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_MUCH, EC_WORD_TOO, EC_WORD_EASY, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_PLEASE, EC_WORD_STOP, EC_WORD_I, EC_WORD_DON_T, EC_WORD_ENJOY, EC_WORD_THIS}, - .monSet = gBattleFrontierTrainerMons_Ruth + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_2} }, [FRONTIER_TRAINER_MELODY] = { .facilityClass = FACILITY_CLASS_PICNICKER, @@ -1662,7 +1665,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(WISH), EC_WORD_SUNDAY, EC_WORD_IS, EC_WORD_A, EC_MOVE2(SUNNY_DAY)}, .speechWin = {EC_WORD_SUNDAY, EC_WORD_SEEMS, EC_WORD_FOREVER, EC_WORD_TO, EC_WORD_COME, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_THE, EC_WORD_FORECAST, EC_WORD_SAYS, EC_WORD_IT, EC_WORD_WILL, EC_MOVE(HAIL)}, - .monSet = gBattleFrontierTrainerMons_Melody + .monSet = (const u16[]){FRONTIER_MONS_CAMPER_PICNICKER_2} }, [FRONTIER_TRAINER_PEDRO] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, @@ -1670,7 +1673,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_SWIFT_SWIM, EC_WORD_WILL, EC_WORD_DO, EC_WORD_YOU, EC_WORD_GOOD}, .speechWin = {EC_WORD_THAT_S, EC_WORD_HOW, EC_WORD_I, EC_WORD_SINK, EC_WORD_AN, EC_WORD_OPPONENT}, .speechLose = {EC_WORD_UH_OH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_A, EC_MOVE(WHIRLPOOL), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Pedro + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_M_2} }, [FRONTIER_TRAINER_ERICK] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, @@ -1678,7 +1681,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_MOVE2(TACKLE), EC_WORD_YOU, EC_WORD_DOWN, EC_WORD_EXCL}, .speechWin = {EC_WORD_DON_T, EC_WORD_YOU, EC_WORD_RUN_AWAY, EC_WORD_YOU, EC_WORD_LOSER, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_DIDN_T, EC_WORD_THINK, EC_WORD_YOU, EC_WORD_WOULD, EC_MOVE(COUNTER)}, - .monSet = gBattleFrontierTrainerMons_Erick + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_M_2} }, [FRONTIER_TRAINER_ELAINE] = { .facilityClass = FACILITY_CLASS_SWIMMER_F, @@ -1686,7 +1689,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_HEROINE, EC_WORD_ADVENTURE, EC_WORD_ISN_T, EC_WORD_GOING, EC_WORD_WELL}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I, EC_WORD_NEED}, .speechLose = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_A, EC_WORD_HEROINE}, - .monSet = gBattleFrontierTrainerMons_Elaine + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_F_2} }, [FRONTIER_TRAINER_JOYCE] = { .facilityClass = FACILITY_CLASS_SWIMMER_F, @@ -1694,7 +1697,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_GO, EC_WORD_AHAHA, EC_WORD_EXCL}, .speechWin = {EC_WORD_LALALA, EC_WORD_NO, EC_WORD_LOSING, EC_WORD_FOR, EC_WORD_ME, EC_WORD_EXCL}, .speechLose = {EC_WORD_LALALA, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_HUH_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Joyce + .monSet = (const u16[]){FRONTIER_MONS_SWIMMER_F_2} }, [FRONTIER_TRAINER_TODD] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -1702,7 +1705,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU_RE, EC_WORD_A, EC_WORD_LIGHTNINGROD, EC_WORD_FOR, EC_WORD_MY, EC_WORD_POWER}, .speechWin = {EC_WORD_THAT_S, EC_WORD_ALL, EC_WORD_YOU, EC_WORD_COULD, EC_MOVE(ABSORB), EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_MOVE2(REFLECT), EC_WORD_MY, EC_WORD_POWER, EC_WORD_BACK, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Todd + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_3} }, [FRONTIER_TRAINER_GAVIN] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, @@ -1710,7 +1713,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_MOVE(BIDE), EC_WORD_MY, EC_WORD_TIME, EC_EMPTY_WORD}, .speechWin = {EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_MY, EC_WORD_MISTAKE, EC_WORD_WAS, EC_WORD_TOO, EC_WORD_EXPENSIVE, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Gavin + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_3} }, [FRONTIER_TRAINER_MALORY] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -1718,7 +1721,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_PROMISE, EC_WORD_TO, EC_WORD_SHOW, EC_WORD_ME, EC_WORD_CUTE, EC_WORD_POKEMON}, .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_SO, EC_WORD_MUCH}, .speechLose = {EC_WORD_TCH, EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_AREN_T, EC_WORD_VERY, EC_WORD_NICE}, - .monSet = gBattleFrontierTrainerMons_Malory + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_3} }, [FRONTIER_TRAINER_ESTHER] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, @@ -1726,7 +1729,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WANT, EC_WORD_A, EC_WORD_NICE, EC_MOVE2(PRESENT), EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_PLEASE, EC_WORD_GET, EC_WORD_ME, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_GAME}, .speechLose = {EC_WORD_MESSAGE, EC_WORD_CARDS, EC_WORD_MAKE, EC_WORD_A, EC_WORD_WEAK, EC_MOVE2(PRESENT)}, - .monSet = gBattleFrontierTrainerMons_Esther + .monSet = (const u16[]){FRONTIER_MONS_POKEFAN_3} }, [FRONTIER_TRAINER_OSCAR] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, @@ -1734,7 +1737,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_SEE, EC_WORD_YOUR, EC_WORD_POWER, EC_WORD_IN, EC_WORD_FULL}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_NOT, EC_WORD_YOUR, EC_WORD_FULL, EC_WORD_POWER, EC_WORD_EXCL}, .speechLose = {EC_WORD_NOT, EC_WORD_FUNNY, EC_WORD_ELLIPSIS, EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Oscar + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_2} }, [FRONTIER_TRAINER_WILSON] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, @@ -1742,7 +1745,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WORK, EC_WORD_IS, EC_WORD_MAKING, EC_WORD_ME, EC_WORD_AN, EC_WORD_EARLY_BIRD}, .speechWin = {EC_WORD_ALL, EC_WORD_WORK, EC_WORD_AND, EC_WORD_NO, EC_WORD_PLAY, EC_WORD_ELLIPSIS}, .speechLose = {EC_MOVE(ENDURE), EC_WORD_IS, EC_WORD_ALL, EC_WORD_I, EC_WORD_CAN, EC_WORD_DO}, - .monSet = gBattleFrontierTrainerMons_Wilson + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_2} }, [FRONTIER_TRAINER_CLARE] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -1750,7 +1753,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YAY, EC_WORD_EXCL, EC_WORD_A, EC_WORD_TOUGH, EC_WORD_TRAINER, EC_WORD_EXCL}, .speechWin = {EC_WORD_AWW, EC_WORD_EXCL, EC_WORD_A, EC_WORD_WIMPY, EC_WORD_TRAINER, EC_WORD_EXCL}, .speechLose = {EC_WORD_COOL, EC_WORD_EXCL, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_TRAINER, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Clare + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_2} }, [FRONTIER_TRAINER_TESS] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, @@ -1758,7 +1761,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WANT, EC_WORD_SOME, EC_POKEMON(GULPIN), EC_WORD_DESIGN, EC_WORD_SWEETS, EC_WORD_QUES}, .speechWin = {EC_WORD_THEY_RE, EC_WORD_A, EC_WORD_SECRET, EC_WORD_POKEMON, EC_WORD_GOURMET, EC_WORD_ITEM}, .speechLose = {EC_WORD_THEY_RE, EC_WORD_TASTY, EC_WORD_EXCL, EC_WORD_REFRESHING, EC_WORD_TOO, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Tess + .monSet = (const u16[]){FRONTIER_MONS_PKMN_BREEDER_2} }, [FRONTIER_TRAINER_LEON] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1766,7 +1769,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_BETTER, EC_WORD_THAN, EC_WORD_ANY, EC_WORD_OTHER, EC_WORD_TRAINER}, .speechWin = {EC_WORD_I, EC_WORD_DID, EC_WORD_IT, EC_MOVE2(JUMP_KICK), EC_WORD_FOR, EC_WORD_JOY}, .speechLose = {EC_WORD_BACK, EC_WORD_HOME, EC_WORD_I, EC_WORD_WILL, EC_WORD_GO, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Leon + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_M_2A} }, [FRONTIER_TRAINER_ALONZO] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1774,7 +1777,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_VE, EC_WORD_NOT, EC_WORD_LOST, EC_WORD_ONCE, EC_WORD_YET, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOUR, EC_WORD_SAD, EC_WORD_LOOK, EC_WORD_BECOMES, EC_WORD_YOU, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_BELIEVE, EC_WORD_THIS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Alonzo + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_M_2B} }, [FRONTIER_TRAINER_VINCE] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1782,7 +1785,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THE, EC_WORD_TOP, EC_WORD_TRAINER, EC_WORD_THAT_S, EC_WORD_ME, EC_WORD_EXCL}, .speechWin = {EC_WORD_THE, EC_WORD_TOP, EC_WORD_RANK, EC_WORD_BELONGS_TO, EC_WORD_ME, EC_WORD_EXCL}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_APPEAL, EC_WORD_THIS, EC_MOVE(OUTRAGE), EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Vince + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2C(LATIOS)} }, [FRONTIER_TRAINER_BRYON] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, @@ -1790,7 +1793,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_MOVE2(BARRAGE), EC_WORD_WILL, EC_MOVE2(SLAM), EC_WORD_YOU, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOU, EC_WORD_DIDN_T, EC_WORD_COUNT_ON, EC_WORD_ANY, EC_WORD_LESS, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_JUST, EC_WORD_DON_T, EC_WORD_GET, EC_WORD_IT, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Bryon + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2D(LATIOS)} }, [FRONTIER_TRAINER_AVA] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1798,7 +1801,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_TREASURE, EC_WORD_OF, EC_WORD_THIS, EC_WORD_WORLD}, .speechWin = {EC_WORD_MY, EC_WORD_WORLD, EC_WORD_IS, EC_WORD_FULL, EC_WORD_OF, EC_WORD_WONDER}, .speechLose = {EC_WORD_WHY, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_SO, EC_WORD_TERRIBLE, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Ava + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_F_2A} }, [FRONTIER_TRAINER_MIRIAM] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1806,7 +1809,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_OH, EC_WORD_A, EC_WORD_TRAINER, EC_WORD_WITH, EC_WORD_A, EC_MOVE(SCARY_FACE)}, .speechWin = {EC_WORD_AHAHA, EC_WORD_YOU, EC_WORD_ONLY, EC_WORD_LOOK, EC_WORD_SCARY, EC_WORD_EXCL}, .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL, EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_ARE, EC_WORD_SCARY}, - .monSet = gBattleFrontierTrainerMons_Miriam + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_F_2B} }, [FRONTIER_TRAINER_CARRIE] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1814,7 +1817,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_WORD_SHOW, EC_WORD_YOU, EC_WORD_GUTSY, EC_WORD_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_ALL, EC_WORD_ABOUT, EC_WORD_GUTS, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_OH, EC_WORD_NO, EC_WORD_ELLIPSIS, EC_MOVE(SELF_DESTRUCT), EC_WORD_MODE, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Carrie + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2C(LATIAS)} }, [FRONTIER_TRAINER_GILLIAN2] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_F, @@ -1822,7 +1825,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_SEEK, EC_WORD_A, EC_WORD_TRULY, EC_WORD_GREAT, EC_WORD_BATTLE}, .speechWin = {EC_WORD_I, EC_WORD_NEED, EC_WORD_A_LOT, EC_WORD_BETTER, EC_WORD_BATTLE, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_THAT_WAS, EC_WORD_A_LITTLE, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_TO, EC_WORD_TAKE}, - .monSet = gBattleFrontierTrainerMons_Gillian2 + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2D(LATIAS)} }, [FRONTIER_TRAINER_TYLER] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1830,7 +1833,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_LET_S, EC_WORD_GO, EC_WORD_EXCL_EXCL}, .speechWin = {EC_WORD_YO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_WON, EC_WORD_YO}, .speechLose = {EC_WORD_YO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_LOST, EC_WORD_YO}, - .monSet = gBattleFrontierTrainerMons_Tyler + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_A} }, [FRONTIER_TRAINER_CHAZ] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1838,7 +1841,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_HAVE, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_POWER}, .speechWin = {EC_WORD_THEY, EC_WORD_HAVE, EC_WORD_MORE, EC_WORD_POWER, EC_WORD_NOW, EC_WORD_EXCL}, .speechLose = {EC_WORD_YEAH, EC_MOVE2(TAKE_DOWN), EC_WORD_THEIR, EC_WORD_POWER, EC_WORD_A_TINY_BIT, EC_WORD_PLEASE}, - .monSet = gBattleFrontierTrainerMons_Chaz + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_B} }, [FRONTIER_TRAINER_NELSON] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, @@ -1846,7 +1849,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WELL_THEN, EC_WORD_WILL, EC_WORD_THIS, EC_WORD_POKEMON, EC_WORD_WORK, EC_WORD_QUES}, .speechWin = {EC_WORD_I, EC_WORD_SEE, EC_WORD_THAT, EC_WORD_IT, EC_WORD_WAS, EC_WORD_TOO_STRONG}, .speechLose = {EC_WORD_IT, EC_WORD_DIDN_T, EC_WORD_MATCH_UP, EC_WORD_WELL, EC_WORD_I, EC_WORD_THINK}, - .monSet = gBattleFrontierTrainerMons_Nelson + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2D(LATIOS)} }, [FRONTIER_TRAINER_SHANIA] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1854,7 +1857,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_ALL, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_ABSOLUTELY, EC_WORD_ADORE, EC_WORD_ME}, .speechWin = {EC_WORD_HAPPINESS, EC_WORD_IS, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_WITH, EC_WORD_CUTE_CHARM}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_SO, EC_WORD_MEAN, EC_WORD_TO, EC_WORD_CUTE, EC_WORD_POKEMON}, - .monSet = gBattleFrontierTrainerMons_Shania + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_C} }, [FRONTIER_TRAINER_STELLA] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1862,7 +1865,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_SEE, EC_WORD_YOUR, EC_WORD_POKEMON}, .speechWin = {EC_WORD_WELL, EC_WORD_AREN_T, EC_WORD_THEY, EC_WORD_BORING, EC_WORD_QUES, EC_WORD_AHAHA}, .speechLose = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_SOMETHING, EC_WORD_ELSE, EC_WORD_ALL_RIGHT}, - .monSet = gBattleFrontierTrainerMons_Stella + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_D} }, [FRONTIER_TRAINER_DORINE] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, @@ -1870,7 +1873,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_YOUNG, EC_WORD_AND, EC_WORD_STRONG, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_SEE, EC_WORD_QUES, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_GOOD, EC_WORD_QUES}, .speechLose = {EC_WORD_THIS, EC_WORD_ISN_T, EC_WORD_WORKING, EC_WORD_OUT, EC_WORD_AT, EC_WORD_ALL}, - .monSet = gBattleFrontierTrainerMons_Dorine + .monSet = (const u16[]){FRONTIER_MONS_COOLTRAINER_2D(LATIAS)} }, [FRONTIER_TRAINER_MADDOX] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1878,7 +1881,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_MY, EC_WORD_NO_1, EC_WORD_CHOICE}, .speechWin = {EC_WORD_IT_S, EC_WORD_NO, EC_WORD_SECRET, EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_WIN}, .speechLose = {EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_SHOULD, EC_WORD_NOT, EC_WORD_LOSE, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Maddox + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_2} }, [FRONTIER_TRAINER_DAVIN] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1886,7 +1889,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_HEAR, EC_WORD_YOU, EC_MOVE2(ROAR), EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WROOOAAR_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_VICTORY, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WROOOAAR_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_WHY, EC_WORD_QUES_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Davin + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_2} }, [FRONTIER_TRAINER_TREVON] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, @@ -1894,7 +1897,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_LIVING, EC_WORD_ONLY, EC_WORD_WITH, EC_WORD_DRAGON, EC_WORD_POKEMON}, .speechWin = {EC_WORD_THE, EC_WORD_WAY, EC_WORD_I_AM, EC_WORD_LIVING, EC_WORD_IS, EC_WORD_PERFECT}, .speechLose = {EC_WORD_YOU_VE, EC_WORD_DESTROYED, EC_WORD_THE, EC_WORD_WAY, EC_WORD_I_AM, EC_WORD_LIVING}, - .monSet = gBattleFrontierTrainerMons_Trevon + .monSet = (const u16[]){FRONTIER_MONS_DRAGON_TAMER_2} }, [FRONTIER_TRAINER_MATEO] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -1902,7 +1905,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_SHOULD, EC_WORD_BE, EC_WORD_OVER, EC_WORD_SOON, EC_WORD_ENOUGH}, .speechWin = {EC_WORD_WELL, EC_WORD_THAT, EC_WORD_DIDN_T, EC_WORD_TAKE, EC_WORD_VERY, EC_WORD_MUCH}, .speechLose = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_LOSE, EC_WORD_SO, EC_WORD_SOON, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Mateo + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_2A} }, [FRONTIER_TRAINER_BRET] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -1910,7 +1913,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_ROCK_SOLID, EC_WORD_POKEMON, EC_WORD_THE, EC_WORD_BEST}, .speechWin = {EC_WORD_TOUGHNESS, EC_WORD_IS, EC_WORD_THE, EC_WORD_WAY, EC_WORD_TO, EC_WORD_GO}, .speechLose = {EC_WORD_I, EC_WORD_ALSO, EC_WORD_HAVE, EC_WORD_A, EC_WORD_PLUSH_DOLL, EC_WORD_COLLECTION}, - .monSet = gBattleFrontierTrainerMons_Bret + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2B} }, [FRONTIER_TRAINER_RAUL] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, @@ -1918,7 +1921,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_REJECT, EC_WORD_EVERY, EC_WORD_WEAK, EC_WORD_TRAINER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_HUMPH, EC_WORD_EXCL, EC_WORD_ANOTHER, EC_WORD_WEAK, EC_WORD_TRAINER, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NOTHING, EC_WORD_WEAK, EC_WORD_ABOUT, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Raul + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2C} }, [FRONTIER_TRAINER_KAY] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -1926,7 +1929,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_AND, EC_WORD_YET, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_WON, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_TIRED, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_GOOD, EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_AT, EC_WORD_LAST, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Kay + .monSet = (const u16[]){FRONTIER_MONS_BATTLE_GIRL_2A} }, [FRONTIER_TRAINER_ELENA] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -1934,7 +1937,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_BATTLE, EC_WORD_GIRL, EC_WORD_THAT_S, EC_WORD_ME, EC_WORD_EXCL}, .speechWin = {EC_WORD_ISN_T, EC_WORD_A, EC_WORD_BATTLE, EC_WORD_GIRL, EC_WORD_AWESOME, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_DISLIKE, EC_WORD_A, EC_WORD_BATTLE, EC_WORD_GIRL, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Elena + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2B} }, [FRONTIER_TRAINER_ALANA] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, @@ -1942,7 +1945,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_EAT, EC_WORD_MY, EC_WORD_INVINCIBLE, EC_WORD_ATTACK, EC_WORD_YOU, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_MUCH, EC_WORD_TO, EC_WORD_LEARN, EC_EMPTY_WORD}, .speechLose = {EC_WORD_SO, EC_WORD_MUCH, EC_WORD_FOR, EC_WORD_MY, EC_WORD_INVINCIBLE, EC_WORD_ATTACK}, - .monSet = gBattleFrontierTrainerMons_Alana + .monSet = (const u16[]){FRONTIER_MONS_BLACK_BELT_BATTLE_GIRL_2C} }, [FRONTIER_TRAINER_ALEXAS] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -1950,7 +1953,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_GOOD, EC_WORD_TO, EC_WORD_MEET_YOU, EC_WORD_YOUNG, EC_WORD_TRAINER, EC_WORD_EXCL}, .speechWin = {EC_WORD_WAHAHAHA, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_GIVE, EC_WORD_IT, EC_WORD_UP}, .speechLose = {EC_WORD_YOU, EC_WORD_ARE, EC_WORD_A, EC_WORD_STRONG, EC_WORD_TRAINER, EC_WORD_KID}, - .monSet = gBattleFrontierTrainerMons_Alexas + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2A(TYRANITAR)} }, [FRONTIER_TRAINER_WESTON] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -1958,7 +1961,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_PLAY, EC_WORD_DOWN, EC_WORD_ALL_RIGHT, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_FAR, EC_WORD_TOO, EC_WORD_EASY, EC_WORD_TO, EC_WORD_ATTACK}, .speechLose = {EC_WORD_WELL, EC_WORD_WELL, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_SURRENDER, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Weston + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2B(LATIOS)} }, [FRONTIER_TRAINER_JASPER] = { .facilityClass = FACILITY_CLASS_EXPERT_M, @@ -1966,7 +1969,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_OLD, EC_WORD_I_AM, EC_WORD_SKILLED, EC_WORD_EXCL}, .speechWin = {EC_WORD_SKILLED, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_SHOCKED, EC_WORD_EXCL, EC_WORD_DOWN, EC_WORD_I, EC_WORD_GO}, - .monSet = gBattleFrontierTrainerMons_Jasper + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2C(TYRANITAR)} }, [FRONTIER_TRAINER_NADIA] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -1974,7 +1977,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_BEAT, EC_WORD_ME, EC_WORD_DOWN, EC_WORD_EXCL}, .speechWin = {EC_WORD_HAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_BEAT, EC_WORD_YOU}, .speechLose = {EC_WORD_I_AM, EC_MOVE2(BEAT_UP), EC_WORD_AND, EC_WORD_DOWNCAST, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Nadia + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2A(DRAGONITE)} }, [FRONTIER_TRAINER_MIRANDA] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -1982,7 +1985,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WELL, EC_WORD_WELL, EC_EMPTY_WORD, EC_WORD_LET_S, EC_WORD_START, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHAT, EC_WORD_QUES, EC_WORD_DONE, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES}, .speechLose = {EC_WORD_WELL, EC_WORD_I, EC_WORD_SEE, EC_WORD_THAT, EC_WORD_I_AM, EC_WORD_TOO_WEAK}, - .monSet = gBattleFrontierTrainerMons_Miranda + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2B(LATIAS)} }, [FRONTIER_TRAINER_EMMA] = { .facilityClass = FACILITY_CLASS_EXPERT_F, @@ -1990,7 +1993,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_VE, EC_WORD_BEEN, EC_WORD_HEARING, EC_WORD_ABOUT, EC_WORD_YOU, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_THINK, EC_WORD_I_VE, EC_WORD_MISHEARD, EC_WORD_THINGS, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WHAT, EC_WORD_I_VE, EC_WORD_BEEN, EC_WORD_HEARING, EC_WORD_IS, EC_WORD_RIGHT}, - .monSet = gBattleFrontierTrainerMons_Emma + .monSet = (const u16[]){FRONTIER_MONS_EXPERT_2C(DRAGONITE)} }, [FRONTIER_TRAINER_ROLANDO] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -1998,7 +2001,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_SUPER, EC_WORD_POKEMON, EC_WORD_HERO, EC_WORD_EXCL}, .speechWin = {EC_WORD_WAS, EC_WORD_THAT, EC_WORD_ENOUGH, EC_WORD_FOR, EC_WORD_YOU, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_NOT, EC_WORD_BEAT, EC_WORD_A, EC_WORD_HERO}, - .monSet = gBattleFrontierTrainerMons_Rolando + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIOS, ARTICUNO, ZAPDOS, MOLTRES)} }, [FRONTIER_TRAINER_STANLY] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -2006,7 +2009,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_SHOULD, EC_WORD_BE, EC_WORD_AN, EC_WORD_EASY, EC_WORD_MATCH}, .speechWin = {EC_WORD_IT, EC_WORD_REALLY, EC_WORD_WAS, EC_WORD_EASY, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_ARE, EC_WORD_YOU, EC_WORD_HAPPY, EC_WORD_NOW, EC_WORD_QUES, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Stanly + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIOS, RAIKOU, ENTEI, SUICUNE)} }, [FRONTIER_TRAINER_DARIO] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, @@ -2014,7 +2017,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_MOVE2(FORESIGHT), EC_WORD_SAYS, EC_WORD_I, EC_WORD_WILL, EC_WORD_WIN}, .speechWin = {EC_WORD_MY, EC_MOVE2(FORESIGHT), EC_WORD_HAS, EC_WORD_BEEN, EC_WORD_PERFECT, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_DIDN_T, EC_WORD_SEE, EC_WORD_THIS, EC_MOVE(REVERSAL), EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Dario + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIOS, REGIROCK, REGICE, REGISTEEL)} }, [FRONTIER_TRAINER_KARLEE] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -2022,7 +2025,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_SOMETHING, EC_WORD_GOOD, EC_WORD_WILL, EC_WORD_COME, EC_WORD_OF, EC_WORD_THIS}, .speechWin = {EC_WORD_YOU, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_FANTASTIC, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THAT, EC_WORD_SOMETHING, EC_WORD_GOOD, EC_WORD_WENT, EC_WORD_TO, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Karlee + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIAS, ARTICUNO, ZAPDOS, MOLTRES)} }, [FRONTIER_TRAINER_JAYLIN] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -2030,7 +2033,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_EVERY, EC_WORD_TRAINER, EC_WORD_HAS, EC_WORD_BEEN, EC_WORD_TOO_WEAK, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_IT_S, EC_WORD_MAKING, EC_WORD_ME, EC_MOVE(YAWN), EC_WORD_THAT, EC_WORD_BATTLE}, .speechLose = {EC_WORD_I, EC_WORD_SLEPT, EC_WORD_AND, EC_WORD_SO, EC_WORD_I, EC_WORD_LOST}, - .monSet = gBattleFrontierTrainerMons_Jaylin + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIAS, RAIKOU, ENTEI, SUICUNE)} }, [FRONTIER_TRAINER_INGRID] = { .facilityClass = FACILITY_CLASS_PSYCHIC_F, @@ -2038,7 +2041,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_A, EC_WORD_VERY, EC_WORD_MEAN, EC_WORD_TRAINER}, .speechWin = {EC_WORD_WASN_T, EC_WORD_THAT, EC_WORD_A, EC_WORD_GOOD, EC_WORD_MATCH, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_LOST, EC_WORD_CAUSE, EC_WORD_YOU_RE, EC_WORD_MEAN, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Ingrid + .monSet = (const u16[]){FRONTIER_MONS_PSYCHIC_2(LATIAS, REGIROCK, REGICE, REGISTEEL)} }, [FRONTIER_TRAINER_DELILAH] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -2046,7 +2049,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DON_T, EC_MOVE(GRUDGE), EC_WORD_ME, EC_WORD_IF_I_WIN, EC_WORD_OK_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_TO, EC_WORD_SEE, EC_WORD_YOU, EC_WORD_ANGRY}, .speechLose = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_A, EC_MOVE(GRUDGE), EC_WORD_WITH, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Delilah + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_2A} }, [FRONTIER_TRAINER_CARLY] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -2054,7 +2057,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_WORD_SCATTER, EC_WORD_SOME, EC_MOVE2(POISON_POWDER), EC_WORD_ABOUT}, .speechWin = {EC_WORD_IT_S, EC_WORD_SCARY, EC_WORD_HOW, EC_WORD_MY, EC_WORD_STRATEGY, EC_WORD_WORKS}, .speechLose = {EC_WORD_I, EC_WORD_DISLIKE, EC_WORD_YOU, EC_WORD_AND, EC_WORD_YOUR, EC_WORD_POKEMON}, - .monSet = gBattleFrontierTrainerMons_Carly + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_2B} }, [FRONTIER_TRAINER_LEXIE] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, @@ -2062,7 +2065,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_SEE, EC_WORD_SCARY, EC_WORD_POKEMON, EC_WORD_QUES}, .speechWin = {EC_WORD_WASN_T, EC_WORD_THAT, EC_WORD_SCARY, EC_WORD_EH_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_MORE, EC_WORD_SCARY, EC_WORD_THAN, EC_WORD_MY, EC_WORD_POKEMON}, - .monSet = gBattleFrontierTrainerMons_Lexie + .monSet = (const u16[]){FRONTIER_MONS_HEX_MANIAC_2C} }, [FRONTIER_TRAINER_MILLER] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -2070,7 +2073,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_HELLO, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_HELLO, EC_WORD_QUES_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_HELLO, EC_WORD_MOTHER, EC_WORD_EXCL, EC_WORD_I, EC_WORD_WON, EC_WORD_EXCL}, .speechLose = {EC_WORD_MY, EC_WORD_PHONE, EC_WORD_ISN_T, EC_WORD_WORKING, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Miller + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_2A} }, [FRONTIER_TRAINER_MARV] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -2078,7 +2081,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_YOU, EC_WORD_CAN, EC_WORD_LOSE, EC_WORD_YOUR, EC_MOVE(SWAGGER), EC_WORD_NOW}, .speechWin = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NO, EC_MOVE(SWAGGER), EC_WORD_LEFT, EC_WORD_EH_QUES}, .speechLose = {EC_WORD_GO, EC_WORD_ON, EC_MOVE(SWAGGER), EC_WORD_ALL, EC_WORD_YOU, EC_WORD_WANT}, - .monSet = gBattleFrontierTrainerMons_Marv + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_2B} }, [FRONTIER_TRAINER_LAYTON] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, @@ -2086,7 +2089,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_I_AM, EC_WORD_TOTALLY, EC_WORD_COOL, EC_WORD_EXCL}, .speechWin = {EC_WORD_YOU, EC_WORD_CAN, EC_WORD_LOOK, EC_WORD_UP, EC_WORD_TO, EC_WORD_ME}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_COOL, EC_WORD_EXCL, EC_WORD_NO, EC_WORD_REALLY, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Layton + .monSet = (const u16[]){FRONTIER_MONS_POKEMANIAC_2C} }, [FRONTIER_TRAINER_BROOKS] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -2094,7 +2097,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THIS, EC_WORD_IS, EC_WORD_A, EC_WORD_HIGH, EC_WORD_LEVEL, EC_WORD_BATTLE}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_HIGH, EC_WORD_LEVEL, EC_WORD_AND, EC_WORD_EXCITING, EC_WORD_TOO}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_TOO, EC_WORD_HIGH, EC_WORD_IN, EC_WORD_LEVEL, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Brooks + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_A} }, [FRONTIER_TRAINER_GREGORY] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -2102,7 +2105,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_THAT, EC_WORD_OLD, EC_WORD_YET, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHO, EC_WORD_SAYS, EC_WORD_I_AM, EC_WORD_TOO, EC_WORD_OLD, EC_WORD_QUES}, .speechLose = {EC_WORD_PLEASE, EC_WORD_I_AM, EC_WORD_REALLY, EC_WORD_NOT, EC_WORD_THAT, EC_WORD_OLD}, - .monSet = gBattleFrontierTrainerMons_Gregory + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_3A} }, [FRONTIER_TRAINER_REESE] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, @@ -2110,7 +2113,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_VE, EC_WORD_A, EC_WORD_COUPLE, EC_WORD_THINGS, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_WORD_DIET, EC_WORD_PLAY, EC_WORD_SPORTS, EC_WORD_INSTEAD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_INSTEAD, EC_WORD_OF, EC_WORD_TELEVISION, EC_WORD_GET, EC_WORD_A, EC_WORD_BOOK}, - .monSet = gBattleFrontierTrainerMons_Reese + .monSet = (const u16[]){FRONTIER_MONS_GENTLEMAN_3B} }, [FRONTIER_TRAINER_MASON] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, @@ -2118,7 +2121,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_PLEASE, EC_WORD_DON_T, EC_WORD_MAKE, EC_WORD_THIS, EC_WORD_SCARY, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_NOW}, .speechLose = {EC_WORD_I_AM, EC_WORD_DISAPPOINTED, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Mason + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_A} }, [FRONTIER_TRAINER_TOBY] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, @@ -2126,7 +2129,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LISTEN, EC_WORD_UP, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_WIN}, .speechWin = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_OR, EC_WORD_WHAT, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_CAN, EC_WORD_BEAT, EC_WORD_YOU, EC_WORD_AT, EC_WORD_SMARTNESS}, - .monSet = gBattleFrontierTrainerMons_Toby + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_B} }, [FRONTIER_TRAINER_DOROTHY] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, @@ -2134,7 +2137,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_THE, EC_WORD_SPORTS, EC_WORD_WORLD, EC_WORD_SHOULD, EC_WORD_ACCEPT, EC_WORD_POKEMON}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL, EC_WORD_THAT, EC_WORD_WIN, EC_WORD_WAS, EC_WORD_REFRESHING}, .speechLose = {EC_WORD_THANK_YOU, EC_WORD_EXCL, EC_WORD_THAT, EC_WORD_LOSS, EC_WORD_WAS, EC_WORD_REFRESHING}, - .monSet = gBattleFrontierTrainerMons_Dorothy + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_C} }, [FRONTIER_TRAINER_PIPER] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, @@ -2142,7 +2145,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_ON, EC_WORD_YOU, EC_WORD_NEED, EC_WORD_A, EC_WORD_SPEED_BOOST, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_NEED, EC_WORD_TO, EC_WORD_SHOW, EC_WORD_MORE, EC_WORD_GUTS}, .speechLose = {EC_WORD_OH, EC_WORD_YOU, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Piper + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_D} }, [FRONTIER_TRAINER_FINN] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, @@ -2150,7 +2153,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_NOT, EC_WORD_ANOTHER, EC_WORD_TRAINER, EC_WORD_BATTLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WON_T, EC_WORD_THIS, EC_WORD_EVER, EC_WORD_END, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_FINALLY, EC_WORD_GET, EC_WORD_TO, EC_MOVE2(REST), EC_WORD_A_LITTLE}, - .monSet = gBattleFrontierTrainerMons_Finn + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_M_3} }, [FRONTIER_TRAINER_SAMIR] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, @@ -2158,7 +2161,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_MOVE2(DIVE), EC_WORD_BELOW, EC_WORD_THE, EC_MOVE2(SURF), EC_WORD_EXCL}, .speechWin = {EC_WORD_YAHOO, EC_WORD_TAKE, EC_WORD_A, EC_MOVE2(DIVE), EC_WORD_YOU, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_SINK, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Samir + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_M_3} }, [FRONTIER_TRAINER_FIONA] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, @@ -2166,7 +2169,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DID, EC_WORD_YOU, EC_WORD_LIMBER, EC_WORD_UP, EC_WORD_BEFORE, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_NEED, EC_WORD_TO, EC_WORD_BE, EC_WORD_MORE, EC_WORD_READY}, .speechLose = {EC_WORD_BEING, EC_WORD_LIMBER, EC_WORD_DIDN_T, EC_WORD_WORK, EC_WORD_FOR, EC_WORD_ME}, - .monSet = gBattleFrontierTrainerMons_Fiona + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_F_3} }, [FRONTIER_TRAINER_GLORIA] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, @@ -2174,7 +2177,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_ATTACK, EC_WORD_WITH, EC_WORD_SUCTION_CUPS}, .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_FOR, EC_WORD_YOU}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_GET, EC_WORD_HOW, EC_WORD_SUCTION_CUPS, EC_WORD_WORK}, - .monSet = gBattleFrontierTrainerMons_Gloria + .monSet = (const u16[]){FRONTIER_MONS_SWIMMING_TRIATHLETE_F_3} }, [FRONTIER_TRAINER_NICO] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, @@ -2182,7 +2185,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LIKE, EC_WORD_A, EC_MOVE(SONIC_BOOM), EC_WORD_I_VE_ARRIVED, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_SORRY, EC_WORD_TO, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_SO, EC_WORD_DOWNCAST}, .speechLose = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_WITH, EC_WORD_A, EC_MOVE2(SUPERSONIC), EC_WORD_SPEED_BOOST}, - .monSet = gBattleFrontierTrainerMons_Nico + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_A} }, [FRONTIER_TRAINER_JEREMY] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, @@ -2190,7 +2193,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_A, EC_WORD_POKEMON, EC_WORD_MASTER, EC_WORD_THAT_S, EC_WORD_MY, EC_WORD_DREAM}, .speechWin = {EC_WORD_MY, EC_WORD_DREAM, EC_WORD_ISN_T, EC_WORD_FAR, EC_WORD_OFF, EC_WORD_EXCL}, .speechLose = {EC_WORD_WHAT, EC_WORD_I, EC_WORD_DREAM, EC_WORD_ISN_T, EC_WORD_HAPPENING, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Jeremy + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_B} }, [FRONTIER_TRAINER_CAITLIN] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, @@ -2198,7 +2201,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_DON_T, EC_WORD_YOU, EC_WORD_THINK, EC_WORD_I_AM, EC_WORD_CUTE, EC_WORD_QUES}, .speechWin = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_MORE, EC_WORD_TO_ME, EC_WORD_THAN, EC_WORD_CUTENESS}, .speechLose = {EC_WORD_MY, EC_WORD_CUTE_CHARM, EC_WORD_DOESN_T, EC_MOVE2(ATTRACT), EC_WORD_YOU, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Caitlin + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_C} }, [FRONTIER_TRAINER_REENA] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, @@ -2206,7 +2209,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_ALWAYS, EC_WORD_HAPPY, EC_WORD_HAPPY, EC_WORD_HAPPY, EC_WORD_EXCL}, .speechWin = {EC_WORD_OH, EC_WORD_YAY, EC_WORD_EXCL, EC_WORD_YAHOO, EC_WORD_FOR, EC_WORD_ME}, .speechLose = {EC_WORD_YAHOO, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_FOR, EC_WORD_YOU}, - .monSet = gBattleFrontierTrainerMons_Reena + .monSet = (const u16[]){FRONTIER_MONS_GENERAL_D} }, [FRONTIER_TRAINER_AVERY] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -2214,7 +2217,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_VE, EC_WORD_GOT, EC_WORD_A_LOT, EC_WORD_OF, EC_WORD_BUG, EC_WORD_POKEMON}, .speechWin = {EC_WORD_MY, EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_ALL, EC_WORD_UNBELIEVABLE}, .speechLose = {EC_WORD_MY, EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_ALL, EC_WORD_UPSIDE_DOWN}, - .monSet = gBattleFrontierTrainerMons_Avery + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_4} }, [FRONTIER_TRAINER_LIAM] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, @@ -2222,7 +2225,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WE, EC_WORD_REALLY, EC_WORD_DISLIKE, EC_WORD_FIRE, EC_WORD_AND, EC_WORD_FLYING}, .speechWin = {EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_AREN_T, EC_WORD_BAD, EC_WORD_HEY_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU, EC_WORD_KNOW, EC_WORD_WHAT, EC_WORD_WE, EC_WORD_DISLIKE, EC_WORD_HEY_QUES}, - .monSet = gBattleFrontierTrainerMons_Liam + .monSet = (const u16[]){FRONTIER_MONS_BUG_MANIAC_4} }, [FRONTIER_TRAINER_THEO] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -2230,7 +2233,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_FISHING, EC_WORD_IS, EC_WORD_MY, EC_WORD_CHOICE, EC_WORD_IN, EC_WORD_LIFE}, .speechWin = {EC_WORD_WATER, EC_WORD_POKEMON, EC_MOVE2(ATTRACT), EC_WORD_ME, EC_WORD_WITHOUT, EC_WORD_END}, .speechLose = {EC_WORD_DON_T, EC_WORD_COUNT_ON, EC_WORD_THAT, EC_WORD_HAPPENING, EC_WORD_ANOTHER, EC_WORD_TIME}, - .monSet = gBattleFrontierTrainerMons_Theo + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_3} }, [FRONTIER_TRAINER_BAILEY] = { .facilityClass = FACILITY_CLASS_FISHERMAN, @@ -2238,7 +2241,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_AN, EC_WORD_ADULT, EC_WORD_I, EC_WORD_BATTLE, EC_WORD_EASY}, .speechWin = {EC_WORD_I_AM, EC_WORD_AN, EC_WORD_ADULT, EC_WORD_I, EC_MOVE2(SWALLOW), EC_WORD_JOY}, .speechLose = {EC_WORD_I_AM, EC_WORD_AN, EC_WORD_ADULT, EC_WORD_I, EC_MOVE2(SWALLOW), EC_MOVE2(FRUSTRATION)}, - .monSet = gBattleFrontierTrainerMons_Bailey + .monSet = (const u16[]){FRONTIER_MONS_FISHERMAN_3} }, [FRONTIER_TRAINER_HUGO] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -2246,7 +2249,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_TRY, EC_WORD_THE, EC_WORD_BEST, EC_WORD_I, EC_WORD_CAN}, .speechWin = {EC_WORD_I, EC_WORD_CAN_WIN, EC_WORD_IF, EC_WORD_I, EC_WORD_TRY, EC_WORD_ENOUGH}, .speechLose = {EC_WORD_I, EC_WORD_DID, EC_WORD_TRY, EC_WORD_DIDN_T, EC_WORD_I, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Hugo + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_4} }, [FRONTIER_TRAINER_BRYCE] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, @@ -2254,7 +2257,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_WAS, EC_WORD_ON, EC_WORD_VACATION, EC_WORD_UNTIL, EC_WORD_ONLY, EC_WORD_YESTERDAY}, .speechWin = {EC_WORD_I, EC_WORD_HAVEN_T, EC_WORD_LOST, EC_WORD_MY, EC_WORD_SKILL, EC_WORD_YET}, .speechLose = {EC_WORD_THAT_S, EC_WORD_IT, EC_WORD_ELLIPSIS, EC_WORD_I, EC_WORD_NEED, EC_WORD_SLEEP}, - .monSet = gBattleFrontierTrainerMons_Bryce + .monSet = (const u16[]){FRONTIER_MONS_RUIN_MANIAC_4} }, [FRONTIER_TRAINER_GIDEON] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -2262,7 +2265,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WHAT_S_UP_QUES, EC_WORD_YOU, EC_WORD_THINK, EC_WORD_I_AM, EC_WORD_SCARY, EC_WORD_QUES}, .speechWin = {EC_WORD_I_AM, EC_WORD_COOL, EC_WORD_BUT, EC_WORD_NOT, EC_WORD_SCARY, EC_WORD_EXCL}, .speechLose = {EC_WORD_LOOK, EC_WORD_AT, EC_WORD_MY, EC_WORD_FABULOUS, EC_WORD_FASHION, EC_WORD_SENSE}, - .monSet = gBattleFrontierTrainerMons_Gideon + .monSet = (const u16[]){FRONTIER_MONS_COLLECTOR_3} }, [FRONTIER_TRAINER_TRISTON] = { .facilityClass = FACILITY_CLASS_COLLECTOR, @@ -2270,7 +2273,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_WOULD, EC_WORD_RATHER, EC_WORD_LOOK, EC_WORD_AT, EC_WORD_POKEMON}, .speechWin = {EC_WORD_HUH_QUES, EC_WORD_YOU, EC_WORD_MEAN, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES_EXCL}, .speechLose = {EC_WORD_SEE, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_LOSE}, - .monSet = gBattleFrontierTrainerMons_Triston + .monSet = (const u16[]){FRONTIER_MONS_COLLECTOR_3} }, [FRONTIER_TRAINER_CHARLES] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -2278,7 +2281,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_IT_S, EC_WORD_HOPELESS, EC_WORD_TO, EC_MOVE2(STRUGGLE), EC_WORD_WITH, EC_WORD_ME}, .speechWin = {EC_MOVE(SUBMISSION), EC_WORD_WAS, EC_WORD_YOUR, EC_WORD_ONLY, EC_WORD_CHOICE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_DOWN, EC_WORD_DOWN, EC_WORD_DOWN, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Charles + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_3A} }, [FRONTIER_TRAINER_RAYMOND] = { .facilityClass = FACILITY_CLASS_GUITARIST, @@ -2286,7 +2289,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_HEAR, EC_WORD_MY, EC_WORD_SONG, EC_WORD_QUES}, .speechWin = {EC_WORD_SATISFIED, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_SATISFIED, EC_WORD_IS, EC_WORD_WHAT, EC_WORD_I, EC_WORD_CAN_T, EC_WORD_BE}, - .monSet = gBattleFrontierTrainerMons_Raymond + .monSet = (const u16[]){FRONTIER_MONS_GUITARIST_3B} }, [FRONTIER_TRAINER_DIRK] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -2294,7 +2297,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_FLYING, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_ABOVE, EC_WORD_THE, EC_MOVE2(REST)}, .speechWin = {EC_WORD_YOU, EC_WORD_CAN_T_WIN, EC_WORD_EXCL, EC_WORD_FLYING, EC_WORD_POKEMON, EC_WORD_RULE}, .speechLose = {EC_WORD_AREN_T, EC_WORD_THERE, EC_WORD_MORE, EC_WORD_FLYING, EC_WORD_POKEMON, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Dirk + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_3} }, [FRONTIER_TRAINER_HAROLD] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, @@ -2302,7 +2305,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_APPEAL, EC_WORD_TO, EC_WORD_YOU, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_DO, EC_WORD_LIKE, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_QUES}, .speechLose = {EC_WORD_SO, EC_WORD_YOU, EC_WORD_DISLIKE, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Harold + .monSet = (const u16[]){FRONTIER_MONS_BIRD_KEEPER_3} }, [FRONTIER_TRAINER_OMAR] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -2310,7 +2313,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_ME_WIN, EC_WORD_IN, EC_MOVE(RETURN), EC_WORD_FOR, EC_WORD_A, EC_MOVE2(PRESENT)}, .speechWin = {EC_WORD_HERE, EC_WORD_YOU, EC_WORD_ARE, EC_WORD_SOME, EC_MOVE2(TOXIC), EC_WORD_SWEETS}, .speechLose = {EC_WORD_YOUR, EC_MOVE2(PRESENT), EC_WORD_QUES, EC_WORD_WHAT, EC_WORD_FOR, EC_WORD_QUES_EXCL}, - .monSet = gBattleFrontierTrainerMons_Omar + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_3} }, [FRONTIER_TRAINER_PETER] = { .facilityClass = FACILITY_CLASS_SAILOR, @@ -2318,7 +2321,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_BRAG, EC_WORD_ABOUT, EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_OK_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_LISTEN, EC_WORD_TO_ME, EC_WORD_BRAG}, .speechLose = {EC_WORD_I_AM, EC_WORD_DISAPPOINTED, EC_WORD_YOU, EC_WORD_WON_T, EC_WORD_LISTEN, EC_WORD_TO_ME}, - .monSet = gBattleFrontierTrainerMons_Peter + .monSet = (const u16[]){FRONTIER_MONS_SAILOR_3} }, [FRONTIER_TRAINER_DEV] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -2326,7 +2329,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_COME_ON, EC_WORD_LET_S, EC_WORD_GET, EC_WORD_A, EC_WORD_MOVE, EC_WORD_ON}, .speechWin = {EC_WORD_I, EC_WORD_GET, EC_WORD_TO, EC_WORD_NAP, EC_WORD_AFTER, EC_WORD_THAT}, .speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_TO, EC_WORD_NAP, EC_WORD_AFTER, EC_WORD_THAT}, - .monSet = gBattleFrontierTrainerMons_Dev + .monSet = (const u16[]){FRONTIER_MONS_HIKER_3} }, [FRONTIER_TRAINER_COREY] = { .facilityClass = FACILITY_CLASS_HIKER, @@ -2334,7 +2337,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_TEACH, EC_WORD_YOU, EC_WORD_HOW, EC_WORD_TOUGH, EC_WORD_I_AM}, .speechWin = {EC_WORD_LOOK, EC_WORD_AT, EC_WORD_ME, EC_WORD_MAKE, EC_WORD_A, EC_MOVE(BRICK_BREAK)}, .speechLose = {EC_WORD_MY, EC_MOVE2(FRUSTRATION), EC_WORD_IS, EC_WORD_CLOSE, EC_WORD_TO, EC_MOVE2(ERUPTION)}, - .monSet = gBattleFrontierTrainerMons_Corey + .monSet = (const u16[]){FRONTIER_MONS_HIKER_3} }, [FRONTIER_TRAINER_ANDRE] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -2342,7 +2345,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_NOW, EC_WORD_THIS, EC_WORD_IS, EC_WORD_A, EC_WORD_PERFECT, EC_WORD_FLAME_BODY}, .speechWin = {EC_WORD_LOOK, EC_WORD_AT, EC_WORD_MY, EC_WORD_FIERY, EC_WORD_DANCE, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU, EC_WORD_WANT, EC_WORD_AN, EC_MOVE2(EXPLOSION), EC_WORD_HERE, EC_WORD_QUES}, - .monSet = gBattleFrontierTrainerMons_Andre + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_3} }, [FRONTIER_TRAINER_FERRIS] = { .facilityClass = FACILITY_CLASS_KINDLER, @@ -2350,7 +2353,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_NO_1, EC_WORD_IN, EC_WORD_THE, EC_WORD_OLD, EC_WORD_CLASS}, .speechWin = {EC_WORD_NO_1, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_NO_1, EC_WORD_ANY, EC_WORD_MORE, EC_WORD_ELLIPSIS}, - .monSet = gBattleFrontierTrainerMons_Ferris + .monSet = (const u16[]){FRONTIER_MONS_KINDLER_3} }, [FRONTIER_TRAINER_ALIVIA] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -2358,7 +2361,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_GIDDY, EC_WORD_SO, EC_WORD_SHOULD, EC_WORD_YOU}, .speechWin = {EC_WORD_IT, EC_WORD_WAS, EC_WORD_ALL, EC_WORD_TOGETHER, EC_WORD_TOO, EC_WORD_EASY}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_GIDDY, EC_WORD_UP, EC_WORD_AND, EC_WORD_AWAY}, - .monSet = gBattleFrontierTrainerMons_Alivia + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_3} }, [FRONTIER_TRAINER_PAIGE] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, @@ -2366,7 +2369,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_LET_S, EC_WORD_ENJOY, EC_WORD_OUR, EC_WORD_BATTLE, EC_WORD_TOGETHER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_VERY, EC_WORD_MUCH}, .speechLose = {EC_WORD_THAT_S_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_DO, EC_WORD_GO, EC_WORD_ON}, - .monSet = gBattleFrontierTrainerMons_Paige + .monSet = (const u16[]){FRONTIER_MONS_PARASOL_LADY_3} }, [FRONTIER_TRAINER_ANYA] = { .facilityClass = FACILITY_CLASS_BEAUTY, @@ -2374,7 +2377,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_DISLIKE, EC_WORD_OH, EC_WORD_SO, EC_WORD_PRETTY, EC_WORD_FASHION}, .speechWin = {EC_WORD_FASHION, EC_WORD_SHOULD, EC_WORD_MATCH, EC_WORD_THE, EC_WORD_PERSON, EC_EMPTY_WORD}, .speechLose = {EC_WORD_PRETTY, EC_WORD_COULD, EC_WORD_BE, EC_WORD_GOOD, EC_EMPTY_WORD, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Anya + .monSet = (const u16[]){FRONTIER_MONS_EEVEELUTIONS} }, [FRONTIER_TRAINER_DAWN] = { .facilityClass = FACILITY_CLASS_BEAUTY, @@ -2382,7 +2385,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_GO, EC_WORD_ALL, EC_WORD_OUT, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_WORD_BE, EC_WORD_A, EC_WORD_BABY, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU, EC_WORD_WON, EC_WORD_EXCL, EC_WORD_MOVE, EC_WORD_ON, EC_WORD_EXCL}, - .monSet = gBattleFrontierTrainerMons_Dawn + .monSet = (const u16[]){FRONTIER_MONS_BEAUTY_2} }, [FRONTIER_TRAINER_ABBY] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -2390,7 +2393,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_A, EC_WORD_TRAINER, EC_WORD_THAT_S, EC_WORD_REFRESHING}, .speechWin = {EC_WORD_VICTORY, EC_WORD_HAS, EC_WORD_A, EC_MOVE(SWEET_SCENT), EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WHAT, EC_WORD_AN, EC_WORD_AWFUL, EC_WORD_STENCH, EC_WORD_EXCL, EC_EMPTY_WORD}, - .monSet = gBattleFrontierTrainerMons_Abby + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_3} }, [FRONTIER_TRAINER_GRETEL] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, @@ -2398,6 +2401,6 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .speechBefore = {EC_WORD_I, EC_WORD_CAUSE, EC_MOVE(OUTRAGE), EC_WORD_AS, EC_WORD_A, EC_WORD_TRAINER}, .speechWin = {EC_WORD_IT_S, EC_WORD_ONLY, EC_WORD_NATURAL, EC_WORD_SEE_YA, EC_WORD_BYE_BYE, EC_WORD_EXCL}, .speechLose = {EC_WORD_IT_S, EC_WORD_HARD, EC_WORD_TO, EC_WORD_BELIEVE, EC_WORD_BUT, EC_WORD_CONGRATS}, - .monSet = gBattleFrontierTrainerMons_Gretel + .monSet = (const u16[]){FRONTIER_MONS_AROMA_LADY_3} } }; diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 7d244b5ebf..e2970afcaf 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -425,6 +425,27 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .encourageEncore = TRUE, }, + [EFFECT_HOLD_HANDS] = + { + .battleScript = BattleScript_EffectHoldHands, + .battleTvScore = 1, + .encourageEncore = TRUE, + }, + + [EFFECT_CELEBRATE] = + { + .battleScript = BattleScript_EffectCelebrate, + .battleTvScore = 1, + .encourageEncore = TRUE, + }, + + [EFFECT_HAPPY_HOUR] = + { + .battleScript = BattleScript_EffectHappyHour, + .battleTvScore = 1, + .encourageEncore = TRUE, + }, + [EFFECT_DISABLE] = { .battleScript = BattleScript_EffectDisable, @@ -1874,12 +1895,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_SPARKLY_SWIRL] = - { - .battleScript = BattleScript_EffectSparklySwirl, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_HYPERSPACE_FURY] = { .battleScript = BattleScript_EffectHyperspaceFury, @@ -1894,7 +1909,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_PHOTON_GEYSER] = { - .battleScript = BattleScript_EffectPhotonGeyser, + .battleScript = BattleScript_EffectDynamicCategory, .battleTvScore = 0, // TODO: Assign points }, @@ -2186,13 +2201,13 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_TERA_BLAST] = { - .battleScript = BattleScript_EffectPhotonGeyser, + .battleScript = BattleScript_EffectDynamicCategory, .battleTvScore = 0, // TODO: Assign points }, [EFFECT_TERA_STARSTORM] = { - .battleScript = BattleScript_EffectPhotonGeyser, + .battleScript = BattleScript_EffectDynamicCategory, .battleTvScore = 0, // TODO: Assign points }, diff --git a/src/data/battle_partners.h b/src/data/battle_partners.h index 95866d24fa..ce451e0a4e 100644 --- a/src/data/battle_partners.h +++ b/src/data/battle_partners.h @@ -9,7 +9,7 @@ #line 1 "src/data/battle_partners.party" #line 1 - [PARTNER_NONE] = + [DIFFICULTY_NORMAL][PARTNER_NONE] = { #line 3 .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, @@ -24,7 +24,7 @@ }, }, #line 8 - [PARTNER_STEVEN] = + [DIFFICULTY_NORMAL][PARTNER_STEVEN] = { #line 9 .trainerName = _("STEVEN"), diff --git a/src/data/battle_pool_rules.h b/src/data/battle_pool_rules.h new file mode 100644 index 0000000000..b88db3c797 --- /dev/null +++ b/src/data/battle_pool_rules.h @@ -0,0 +1,68 @@ +#include "battle_main.h" + +const u16 poolItemClauseExclusions[] = +{ + ITEM_ORAN_BERRY, + ITEM_SITRUS_BERRY, +}; + +const struct PoolRules defaultPoolRules = +{ + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, +}; + +const struct PoolRules gPoolRulesetsList[] = { + [POOL_RULESET_BASIC] = { + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .tagMaxMembers[POOL_TAG_LEAD] = 1, + .tagMaxMembers[POOL_TAG_ACE] = 1, + }, + [POOL_RULESET_DOUBLES] = { + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .tagMaxMembers[POOL_TAG_LEAD] = 2, + .tagMaxMembers[POOL_TAG_ACE] = 2, + }, + [POOL_RULESET_WEATHER_SINGLES] = { + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .tagMaxMembers[POOL_TAG_LEAD] = 1, + .tagMaxMembers[POOL_TAG_ACE] = 1, + .tagMaxMembers[POOL_TAG_WEATHER_SETTER] = 1, + .tagRequired[POOL_TAG_WEATHER_SETTER] = TRUE, + .tagMaxMembers[POOL_TAG_WEATHER_ABUSER] = POOL_MEMBER_COUNT_UNLIMITED, + .tagRequired[POOL_TAG_WEATHER_ABUSER] = TRUE, + }, + [POOL_RULESET_WEATHER_DOUBLES] = { + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .tagMaxMembers[POOL_TAG_LEAD] = 2, + .tagMaxMembers[POOL_TAG_ACE] = 2, + .tagMaxMembers[POOL_TAG_WEATHER_SETTER] = 1, + .tagRequired[POOL_TAG_WEATHER_SETTER] = TRUE, + .tagMaxMembers[POOL_TAG_WEATHER_ABUSER] = POOL_MEMBER_COUNT_UNLIMITED, + .tagRequired[POOL_TAG_WEATHER_ABUSER] = TRUE, + }, + [POOL_RULESET_SUPPORT_DOUBLES] = { + .speciesClause = B_POOL_RULE_SPECIES_CLAUSE, + .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, + .itemClause = B_POOL_RULE_ITEM_CLAUSE, + .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .tagMaxMembers[POOL_TAG_LEAD] = 2, + .tagMaxMembers[POOL_TAG_ACE] = 2, + .tagMaxMembers[POOL_TAG_SUPPORT] = 1, + .tagRequired[POOL_TAG_SUPPORT] = TRUE, + }, +}; diff --git a/src/data/contest_opponents.h b/src/data/contest_opponents.h index d3f02d33ab..d5928b64db 100644 --- a/src/data/contest_opponents.h +++ b/src/data/contest_opponents.h @@ -220,6 +220,7 @@ const struct ContestWinner gDefaultContestWinners[] = const struct ContestPokemon gContestOpponents[] = { [CONTEST_OPPONENT_JIMMY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_POOCHYENA, .nickname = _("POOCHY"), .trainerName = _("JIMMY"), @@ -248,6 +249,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_EDITH] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ILLUMISE, .nickname = _("MUSILLE"), .trainerName = _("EDITH"), @@ -276,6 +278,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_EVAN] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_DUSTOX, .nickname = _("DUSTER"), .trainerName = _("EVAN"), @@ -304,6 +307,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KELSEY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SEEDOT, .nickname = _("DOTS"), .trainerName = _("KELSEY"), @@ -332,6 +336,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MADISON] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_TAILLOW, .nickname = _("TATAY"), .trainerName = _("MADISON"), @@ -360,6 +365,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RAYMOND] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_NINCADA, .nickname = _("NINDA"), .trainerName = _("RAYMOND"), @@ -388,6 +394,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_GRANT] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SHROOMISH, .nickname = _("SMISH"), .trainerName = _("GRANT"), @@ -416,6 +423,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_PAIGE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SPHEAL, .nickname = _("SLEAL"), .trainerName = _("PAIGE"), @@ -444,6 +452,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ALEC] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SLAKOTH, .nickname = _("SLOKTH"), .trainerName = _("ALEC"), @@ -472,6 +481,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SYDNEY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_WHISMUR, .nickname = _("WHIRIS"), .trainerName = _("SYDNEY"), @@ -500,6 +510,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MORRIS] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MAKUHITA, .nickname = _("MAHITA"), .trainerName = _("MORRIS"), @@ -528,6 +539,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MARIAH] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ARON, .nickname = _("RONAR"), .trainerName = _("MARIAH"), @@ -556,6 +568,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RUSSELL] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_CROBAT, .nickname = _("BATRO"), .trainerName = _("RUSSELL"), @@ -584,6 +597,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MELANIE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_GULPIN, .nickname = _("GULIN"), .trainerName = _("MELANIE"), @@ -612,6 +626,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CHANCE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MANECTRIC, .nickname = _("RIKELEC"), .trainerName = _("CHANCE"), @@ -640,6 +655,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AGATHA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_BULBASAUR, .nickname = _("BULBY"), .trainerName = _("AGATHA"), @@ -668,6 +684,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_BEAU] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_BUTTERFREE, .nickname = _("FUTTERBE"), .trainerName = _("BEAU"), @@ -696,6 +713,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KAY] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_PIDGEOTTO, .nickname = _("PIDEOT"), .trainerName = _("KAY"), @@ -724,6 +742,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CALE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_DIGLETT, .nickname = _("DIGLE"), .trainerName = _("CALE"), @@ -752,6 +771,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CAITLIN] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_POLIWAG, .nickname = _("WAGIL"), .trainerName = _("CAITLIN"), @@ -780,6 +800,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_COLBY] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_TOTODILE, .nickname = _("TOTDIL"), .trainerName = _("COLBY"), @@ -808,6 +829,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KYLIE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_LEDYBA, .nickname = _("BALEDY"), .trainerName = _("KYLIE"), @@ -836,6 +858,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LIAM] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_DELIBIRD, .nickname = _("BIRDLY"), .trainerName = _("LIAM"), @@ -864,6 +887,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MILO] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_LARVITAR, .nickname = _("TARVITAR"), .trainerName = _("MILO"), @@ -892,6 +916,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KARINA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ROSELIA, .nickname = _("RELIA"), .trainerName = _("KARINA"), @@ -920,6 +945,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_BOBBY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_DODRIO, .nickname = _("DUODO"), .trainerName = _("BOBBY"), @@ -948,6 +974,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CLAIRE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_TRAPINCH, .nickname = _("PINCHIN"), .trainerName = _("CLAIRE"), @@ -976,6 +1003,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_WILLIE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_CACNEA, .nickname = _("NACAC"), .trainerName = _("WILLIE"), @@ -1004,6 +1032,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CASSIDY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SANDSLASH, .nickname = _("SHRAND"), .trainerName = _("CASSIDY"), @@ -1032,6 +1061,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MORGAN] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_BALTOY, .nickname = _("TOYBAL"), .trainerName = _("MORGAN"), @@ -1060,6 +1090,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SUMMER] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MEDICHAM, .nickname = _("CHAMCHAM"), .trainerName = _("SUMMER"), @@ -1088,6 +1119,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MILES] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SPINDA, .nickname = _("SPININ"), .trainerName = _("MILES"), @@ -1116,6 +1148,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AUDREY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SWABLU, .nickname = _("SWABY"), .trainerName = _("AUDREY"), @@ -1144,6 +1177,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AVERY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SPOINK, .nickname = _("POINKER"), .trainerName = _("AVERY"), @@ -1172,6 +1206,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ARIANA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_KECLEON, .nickname = _("KECON"), .trainerName = _("ARIANA"), @@ -1200,6 +1235,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ASHTON] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_GOLDEEN, .nickname = _("GOLDEN"), .trainerName = _("ASHTON"), @@ -1228,6 +1264,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SANDRA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_BARBOACH, .nickname = _("BOBOACH"), .trainerName = _("SANDRA"), @@ -1256,6 +1293,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CARSON] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SKARMORY, .nickname = _("CORPY"), .trainerName = _("CARSON"), @@ -1284,6 +1322,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KATRINA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LOTAD, .nickname = _("TADO"), .trainerName = _("KATRINA"), @@ -1312,6 +1351,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LUKE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_SLOWBRO, .nickname = _("BROWLO"), .trainerName = _("LUKE"), @@ -1340,6 +1380,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RAUL] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_FARFETCHD, .nickname = _("FETCHIN"), .trainerName = _("RAUL"), @@ -1368,6 +1409,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JADA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_SEEL, .nickname = _("SEELEY"), .trainerName = _("JADA"), @@ -1396,6 +1438,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ZEEK] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_DROWZEE, .nickname = _("DROWZIN"), .trainerName = _("ZEEK"), @@ -1424,6 +1467,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DIEGO] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_HITMONCHAN, .nickname = _("HITEMON"), .trainerName = _("DIEGO"), @@ -1452,6 +1496,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ALIYAH] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_BLISSEY, .nickname = _("BLISS"), .trainerName = _("ALIYAH"), @@ -1480,6 +1525,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_NATALIA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_ELEKID, .nickname = _("KIDLEK"), .trainerName = _("NATALIA"), @@ -1508,6 +1554,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DEVIN] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_SNUBBULL, .nickname = _("SNUBBINS"), .trainerName = _("DEVIN"), @@ -1536,6 +1583,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_TYLOR] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_MISDREAVUS, .nickname = _("DREAVIS"), .trainerName = _("TYLOR"), @@ -1564,6 +1612,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RONNIE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LAIRON, .nickname = _("LAIRN"), .trainerName = _("RONNIE"), @@ -1592,6 +1641,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CLAUDIA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SHIFTRY, .nickname = _("SHIFTY"), .trainerName = _("CLAUDIA"), @@ -1620,6 +1670,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ELIAS] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_NINJASK, .nickname = _("NINAS"), .trainerName = _("ELIAS"), @@ -1648,6 +1699,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JADE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SWELLOW, .nickname = _("WELOW"), .trainerName = _("JADE"), @@ -1676,6 +1728,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_FRANCIS] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MIGHTYENA, .nickname = _("YENA"), .trainerName = _("FRANCIS"), @@ -1704,6 +1757,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ALISHA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_BEAUTIFLY, .nickname = _("TIFLY"), .trainerName = _("ALISHA"), @@ -1732,6 +1786,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SAUL] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SEAKING, .nickname = _("KINGSEA"), .trainerName = _("SAUL"), @@ -1760,6 +1815,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_FELICIA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_CASTFORM_NORMAL, .nickname = _("CASTER"), .trainerName = _("FELICIA"), @@ -1788,6 +1844,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_EMILIO] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MACHOKE, .nickname = _("CHOKEM"), .trainerName = _("EMILIO"), @@ -1816,6 +1873,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KARLA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LOMBRE, .nickname = _("LOMBE"), .trainerName = _("KARLA"), @@ -1844,6 +1902,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DARRYL] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SEVIPER, .nickname = _("VIPES"), .trainerName = _("DARRYL"), @@ -1872,6 +1931,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SELENA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_WAILMER, .nickname = _("MERAIL"), .trainerName = _("SELENA"), @@ -1900,6 +1960,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_NOEL] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_MAGIKARP, .nickname = _("KARPAG"), .trainerName = _("NOEL"), @@ -1928,6 +1989,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LACEY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LUNATONE, .nickname = _("LUNONE"), .trainerName = _("LACEY"), @@ -1956,6 +2018,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CORBIN] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ABSOL, .nickname = _("ABSO"), .trainerName = _("CORBIN"), @@ -1984,6 +2047,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_GRACIE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_EXEGGUTOR, .nickname = _("EGGSOR"), .trainerName = _("GRACIE"), @@ -2012,6 +2076,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_COLTIN] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_CUBONE, .nickname = _("CUBIN"), .trainerName = _("COLTIN"), @@ -2040,6 +2105,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ELLIE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_HITMONLEE, .nickname = _("HITMON"), .trainerName = _("ELLIE"), @@ -2068,6 +2134,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MARCUS] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_SQUIRTLE, .nickname = _("SURTLE"), .trainerName = _("MARCUS"), @@ -2096,6 +2163,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KIARA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_KANGASKHAN, .nickname = _("KHANKAN"), .trainerName = _("KIARA"), @@ -2124,6 +2192,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_BRYCE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_PINECO, .nickname = _("PINOC"), .trainerName = _("BRYCE"), @@ -2152,6 +2221,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JAMIE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_DUNSPARCE, .nickname = _("DILTOT"), .trainerName = _("JAMIE"), @@ -2180,6 +2250,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JORGE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_HOUNDOOM, .nickname = _("DOOMOND"), .trainerName = _("JORGE"), @@ -2208,6 +2279,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DEVON] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_MILTANK, .nickname = _("MILKAN"), .trainerName = _("DEVON"), @@ -2236,6 +2308,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JUSTINA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_GYARADOS, .nickname = _("RADOS"), .trainerName = _("JUSTINA"), @@ -2264,6 +2337,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RALPH] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LOUDRED, .nickname = _("LOUDERD"), .trainerName = _("RALPH"), @@ -2292,6 +2366,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ROSA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SKITTY, .nickname = _("SITTY"), .trainerName = _("ROSA"), @@ -2320,6 +2395,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KEATON] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SLAKING, .nickname = _("SLING"), .trainerName = _("KEATON"), @@ -2348,6 +2424,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MAYRA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ALTARIA, .nickname = _("TARIA"), .trainerName = _("MAYRA"), @@ -2376,6 +2453,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LAMAR] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_KIRLIA, .nickname = _("LIRKI"), .trainerName = _("LAMAR"), @@ -2404,6 +2482,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AUBREY] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_BELLOSSOM, .nickname = _("BLOSSOM"), .trainerName = _("AUBREY"), @@ -2432,6 +2511,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_NIGEL] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SABLEYE, .nickname = _("EYESAB"), .trainerName = _("NIGEL"), @@ -2460,6 +2540,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CAMILLE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_NATU, .nickname = _("UTAN"), .trainerName = _("CAMILLE"), @@ -2488,6 +2569,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DEON] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_SHARPEDO, .nickname = _("PEDOS"), .trainerName = _("DEON"), @@ -2516,6 +2598,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JANELLE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_LUVDISC, .nickname = _("LUVIS"), .trainerName = _("JANELLE"), @@ -2544,6 +2627,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_HEATH] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_HERACROSS, .nickname = _("HEROSS"), .trainerName = _("HEATH"), @@ -2572,6 +2656,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SASHA] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_ELECTRODE, .nickname = _("RODLECT"), .trainerName = _("SASHA"), @@ -2600,6 +2685,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_FRANKIE] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_PICHU, .nickname = _("CHUPY"), .trainerName = _("FRANKIE"), @@ -2628,6 +2714,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_HELEN] = { + .filter = CONTEST_FILTER_NONE, .species = SPECIES_WOBBUFFET, .nickname = _("WOBET"), .trainerName = _("HELEN"), @@ -2656,6 +2743,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CAMILE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_GENGAR, .nickname = _("GAREN"), .trainerName = _("CAMILE"), @@ -2684,6 +2772,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MARTIN] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_PORYGON, .nickname = _("GONPOR"), .trainerName = _("MARTIN"), @@ -2712,6 +2801,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SERGIO] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_DRAGONITE, .nickname = _("DRITE"), .trainerName = _("SERGIO"), @@ -2740,6 +2830,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KAILEY] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_MEOWTH, .nickname = _("MEOWY"), .trainerName = _("KAILEY"), @@ -2768,6 +2859,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_PERLA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_JYNX, .nickname = _("NYX"), .trainerName = _("PERLA"), @@ -2796,6 +2888,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CLARA] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_TOGEPI, .nickname = _("GEPITO"), .trainerName = _("CLARA"), @@ -2824,6 +2917,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JAKOB] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_ESPEON, .nickname = _("SPEON"), .trainerName = _("JAKOB"), @@ -2852,6 +2946,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_TREY] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_SLOWKING, .nickname = _("SLOWGO"), .trainerName = _("TREY"), @@ -2880,6 +2975,7 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LANE] = { + .filter = CONTEST_FILTER_ONLY_POSTGAME, .species = SPECIES_URSARING, .nickname = _("URSING"), .trainerName = _("LANE"), @@ -2908,104 +3004,3 @@ const struct ContestPokemon gContestOpponents[] = .otId = CONTEST_AI_TRAINER_ID, } }; - - -const u8 gPostgameContestOpponentFilter[] = -{ - [CONTEST_OPPONENT_JIMMY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_EDITH] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_EVAN] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_KELSEY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MADISON] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_RAYMOND] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_GRANT] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_PAIGE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ALEC] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SYDNEY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MORRIS] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MARIAH] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_RUSSELL] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MELANIE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CHANCE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_AGATHA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_BEAU] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_KAY] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_CALE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_CAITLIN] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_COLBY] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_KYLIE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_LIAM] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_MILO] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_KARINA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_BOBBY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CLAIRE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_WILLIE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CASSIDY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MORGAN] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SUMMER] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MILES] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_AUDREY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_AVERY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ARIANA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ASHTON] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SANDRA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CARSON] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_KATRINA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_LUKE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_RAUL] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_JADA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_ZEEK] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_DIEGO] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_ALIYAH] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_NATALIA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_DEVIN] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_TYLOR] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_RONNIE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CLAUDIA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ELIAS] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_JADE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_FRANCIS] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ALISHA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SAUL] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_FELICIA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_EMILIO] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_KARLA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_DARRYL] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SELENA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_NOEL] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_LACEY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CORBIN] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_GRACIE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_COLTIN] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_ELLIE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_MARCUS] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_KIARA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_BRYCE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_JAMIE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_JORGE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_DEVON] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_JUSTINA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_RALPH] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_ROSA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_KEATON] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_MAYRA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_LAMAR] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_AUBREY] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_NIGEL] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CAMILLE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_DEON] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_JANELLE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_HEATH] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_SASHA] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_FRANKIE] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_HELEN] = CONTEST_FILTER_NONE, - [CONTEST_OPPONENT_CAMILE] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_MARTIN] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_SERGIO] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_KAILEY] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_PERLA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_CLARA] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_JAKOB] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_TREY] = CONTEST_FILTER_ONLY_POSTGAME, - [CONTEST_OPPONENT_LANE] = CONTEST_FILTER_ONLY_POSTGAME -}; diff --git a/src/data/field_effects/field_effect_object_template_pointers.h b/src/data/field_effects/field_effect_object_template_pointers.h index 14113d3a43..ee00023a51 100755 --- a/src/data/field_effects/field_effect_object_template_pointers.h +++ b/src/data/field_effects/field_effect_object_template_pointers.h @@ -38,6 +38,7 @@ extern const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza; extern const struct SpriteTemplate gFieldEffectObjectTemplate_SlitherTracks; extern const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks; extern const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks; +extern const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust; const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall, @@ -80,4 +81,5 @@ const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_TRACKS_SLITHER] = &gFieldEffectObjectTemplate_SlitherTracks, [FLDEFFOBJ_TRACKS_SPOT] = &gFieldEffectObjectTemplate_SpotTracks, [FLDEFFOBJ_TRACKS_BUG] = &gFieldEffectObjectTemplate_BugTracks, + [FLDEFFOBJ_CAVE_DUST] = &gFieldEffectObjectTemplate_CaveDust, }; diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index 1a169007c5..ecea0350c5 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -1336,3 +1336,23 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = { }; static const struct SpritePalette sSpritePalette_Unused = {gObjectEventPal_Npc3, FLDEFF_PAL_TAG_UNKNOWN}; + +// cave dust +static const struct SpriteFrameImage sPicTable_CaveDust[] = +{ + overworld_frame(gFieldEffectObjectPic_CaveDust, 2, 2, 0), + overworld_frame(gFieldEffectObjectPic_CaveDust, 2, 2, 1), + overworld_frame(gFieldEffectObjectPic_CaveDust, 2, 2, 2), + overworld_frame(gFieldEffectObjectPic_CaveDust, 2, 2, 3), +}; +const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust = { + .tileTag = 0xFFFF, + .paletteTag = FLDEFF_PAL_TAG_CAVE_DUST, + .oam = &gObjectEventBaseOam_16x16, + .anims = sAnimTable_WaterSurfacing, + .images = sPicTable_CaveDust, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = WaitFieldEffectSpriteAnim, +}; + +const struct SpritePalette gSpritePalette_CaveDust = {gFieldEffectObjectPalette_CaveDust, FLDEFF_PAL_TAG_CAVE_DUST}; diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index 70e32a9c40..7095863741 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -114,13 +114,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/back.4bpp.lz"); const u32 gMonShinyPalette_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/shiny.gbapal.lz"); const u8 gMonIcon_VenusaurMega[] = INCBIN_U8("graphics/pokemon/venusaur/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_VenusaurMega[] = INCBIN_COMP("graphics/pokemon/venusaur/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_VenusaurMega[] = INCBIN_COMP("graphics/pokemon/venusaur/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS @@ -227,26 +227,26 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/back.4bpp.lz"); const u32 gMonShinyPalette_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/shiny.gbapal.lz"); const u8 gMonIcon_CharizardMegaX[] = INCBIN_U8("graphics/pokemon/charizard/mega_x/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_CharizardMegaX[] = INCBIN_COMP("graphics/pokemon/charizard/mega_x/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_CharizardMegaX[] = INCBIN_COMP("graphics/pokemon/charizard/mega_x/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS const u32 gMonFrontPic_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/front.4bpp.lz"); const u32 gMonPalette_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/normal.gbapal.lz"); const u32 gMonBackPic_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/back.4bpp.lz"); const u32 gMonShinyPalette_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/shiny.gbapal.lz"); const u8 gMonIcon_CharizardMegaY[] = INCBIN_U8("graphics/pokemon/charizard/mega_y/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_CharizardMegaY[] = INCBIN_COMP("graphics/pokemon/charizard/mega_y/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_CharizardMegaY[] = INCBIN_COMP("graphics/pokemon/charizard/mega_y/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS @@ -353,13 +353,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/back.4bpp.lz"); const u32 gMonShinyPalette_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/shiny.gbapal.lz"); const u8 gMonIcon_BlastoiseMega[] = INCBIN_U8("graphics/pokemon/blastoise/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_BlastoiseMega[] = INCBIN_COMP("graphics/pokemon/blastoise/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_BlastoiseMega[] = INCBIN_COMP("graphics/pokemon/blastoise/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS @@ -568,13 +568,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/back.4bpp.lz"); const u32 gMonShinyPalette_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/shiny.gbapal.lz"); const u8 gMonIcon_BeedrillMega[] = INCBIN_U8("graphics/pokemon/beedrill/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_BeedrillMega[] = INCBIN_COMP("graphics/pokemon/beedrill/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_BeedrillMega[] = INCBIN_COMP("graphics/pokemon/beedrill/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_WEEDLE @@ -666,13 +666,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/back.4bpp.lz"); const u32 gMonShinyPalette_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/shiny.gbapal.lz"); const u8 gMonIcon_PidgeotMega[] = INCBIN_U8("graphics/pokemon/pidgeot/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_PidgeotMega[] = INCBIN_COMP("graphics/pokemon/pidgeot/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_PidgeotMega[] = INCBIN_COMP("graphics/pokemon/pidgeot/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_PIDGEY @@ -2642,13 +2642,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/back.4bpp.lz"); const u32 gMonShinyPalette_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/shiny.gbapal.lz"); const u8 gMonIcon_AlakazamMega[] = INCBIN_U8("graphics/pokemon/alakazam/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_AlakazamMega[] = INCBIN_COMP("graphics/pokemon/alakazam/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_AlakazamMega[] = INCBIN_COMP("graphics/pokemon/alakazam/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_ABRA @@ -3191,13 +3191,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/back.4bpp.lz"); const u32 gMonShinyPalette_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/shiny.gbapal.lz"); const u8 gMonIcon_SlowbroMega[] = INCBIN_U8("graphics/pokemon/slowbro/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_SlowbroMega[] = INCBIN_COMP("graphics/pokemon/slowbro/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_SlowbroMega[] = INCBIN_COMP("graphics/pokemon/slowbro/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #if P_GALARIAN_FORMS @@ -3734,13 +3734,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/back.4bpp.lz"); const u32 gMonShinyPalette_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/shiny.gbapal.lz"); const u8 gMonIcon_GengarMega[] = INCBIN_U8("graphics/pokemon/gengar/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_GengarMega[] = INCBIN_COMP("graphics/pokemon/gengar/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_GengarMega[] = INCBIN_COMP("graphics/pokemon/gengar/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS @@ -3829,13 +3829,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/back.4bpp.lz"); const u32 gMonShinyPalette_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/shiny.gbapal.lz"); const u8 gMonIcon_SteelixMega[] = INCBIN_U8("graphics/pokemon/steelix/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_SteelixMega[] = INCBIN_COMP("graphics/pokemon/steelix/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_SteelixMega[] = INCBIN_COMP("graphics/pokemon/steelix/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_GEN_2_CROSS_EVOS #endif //P_FAMILY_ONIX @@ -4695,13 +4695,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/back.4bpp.lz"); const u32 gMonShinyPalette_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/shiny.gbapal.lz"); const u8 gMonIcon_KangaskhanMega[] = INCBIN_U8("graphics/pokemon/kangaskhan/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_KangaskhanMega[] = INCBIN_COMP("graphics/pokemon/kangaskhan/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_KangaskhanMega[] = INCBIN_COMP("graphics/pokemon/kangaskhan/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_KANGASKHAN @@ -5072,13 +5072,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/back.4bpp.lz"); const u32 gMonShinyPalette_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/shiny.gbapal.lz"); const u8 gMonIcon_ScizorMega[] = INCBIN_U8("graphics/pokemon/scizor/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_ScizorMega[] = INCBIN_COMP("graphics/pokemon/scizor/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_ScizorMega[] = INCBIN_COMP("graphics/pokemon/scizor/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_GEN_2_CROSS_EVOS @@ -5345,13 +5345,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/back.4bpp.lz"); const u32 gMonShinyPalette_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/shiny.gbapal.lz"); const u8 gMonIcon_PinsirMega[] = INCBIN_U8("graphics/pokemon/pinsir/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_PinsirMega[] = INCBIN_COMP("graphics/pokemon/pinsir/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_PinsirMega[] = INCBIN_COMP("graphics/pokemon/pinsir/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_PINSIR @@ -5495,13 +5495,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/back.4bpp.lz"); const u32 gMonShinyPalette_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/shiny.gbapal.lz"); const u8 gMonIcon_GyaradosMega[] = INCBIN_U8("graphics/pokemon/gyarados/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_GyaradosMega[] = INCBIN_COMP("graphics/pokemon/gyarados/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_GyaradosMega[] = INCBIN_COMP("graphics/pokemon/gyarados/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MAGIKARP @@ -6046,13 +6046,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/back.4bpp.lz"); const u32 gMonShinyPalette_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/shiny.gbapal.lz"); const u8 gMonIcon_AerodactylMega[] = INCBIN_U8("graphics/pokemon/aerodactyl/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_AerodactylMega[] = INCBIN_COMP("graphics/pokemon/aerodactyl/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_AerodactylMega[] = INCBIN_COMP("graphics/pokemon/aerodactyl/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_AERODACTYL @@ -6367,26 +6367,26 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/back.4bpp.lz"); const u32 gMonShinyPalette_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/shiny.gbapal.lz"); const u8 gMonIcon_MewtwoMegaX[] = INCBIN_U8("graphics/pokemon/mewtwo/mega_x/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_MewtwoMegaX[] = INCBIN_COMP("graphics/pokemon/mewtwo/mega_x/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_MewtwoMegaX[] = INCBIN_COMP("graphics/pokemon/mewtwo/mega_x/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS const u32 gMonFrontPic_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/front.4bpp.lz"); const u32 gMonPalette_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/normal.gbapal.lz"); const u32 gMonBackPic_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/back.4bpp.lz"); const u32 gMonShinyPalette_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/shiny.gbapal.lz"); const u8 gMonIcon_MewtwoMegaY[] = INCBIN_U8("graphics/pokemon/mewtwo/mega_y/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_MewtwoMegaY[] = INCBIN_COMP("graphics/pokemon/mewtwo/mega_y/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_MewtwoMegaY[] = INCBIN_COMP("graphics/pokemon/mewtwo/mega_y/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MEWTWO @@ -7212,13 +7212,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/back.4bpp.lz"); const u32 gMonShinyPalette_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/shiny.gbapal.lz"); const u8 gMonIcon_AmpharosMega[] = INCBIN_U8("graphics/pokemon/ampharos/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_AmpharosMega[] = INCBIN_COMP("graphics/pokemon/ampharos/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_AmpharosMega[] = INCBIN_COMP("graphics/pokemon/ampharos/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MAREEP @@ -8447,13 +8447,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/back.4bpp.lz"); const u32 gMonShinyPalette_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/shiny.gbapal.lz"); const u8 gMonIcon_HeracrossMega[] = INCBIN_U8("graphics/pokemon/heracross/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_HeracrossMega[] = INCBIN_COMP("graphics/pokemon/heracross/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_HeracrossMega[] = INCBIN_COMP("graphics/pokemon/heracross/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_HERACROSS @@ -9097,13 +9097,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/back.4bpp.lz"); const u32 gMonShinyPalette_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/shiny.gbapal.lz"); const u8 gMonIcon_HoundoomMega[] = INCBIN_U8("graphics/pokemon/houndoom/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_HoundoomMega[] = INCBIN_COMP("graphics/pokemon/houndoom/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_HoundoomMega[] = INCBIN_COMP("graphics/pokemon/houndoom/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_HOUNDOUR @@ -9451,13 +9451,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/back.4bpp.lz"); const u32 gMonShinyPalette_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/shiny.gbapal.lz"); const u8 gMonIcon_TyranitarMega[] = INCBIN_U8("graphics/pokemon/tyranitar/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_TyranitarMega[] = INCBIN_COMP("graphics/pokemon/tyranitar/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_TyranitarMega[] = INCBIN_COMP("graphics/pokemon/tyranitar/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_LARVITAR @@ -9636,13 +9636,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/back.4bpp.lz"); const u32 gMonShinyPalette_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/shiny.gbapal.lz"); const u8 gMonIcon_SceptileMega[] = INCBIN_U8("graphics/pokemon/sceptile/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_SceptileMega[] = INCBIN_COMP("graphics/pokemon/sceptile/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_SceptileMega[] = INCBIN_COMP("graphics/pokemon/sceptile/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_TREECKO @@ -9757,13 +9757,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/back.4bpp.lz"); const u32 gMonShinyPalette_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/shiny.gbapal.lz"); const u8 gMonIcon_BlazikenMega[] = INCBIN_U8("graphics/pokemon/blaziken/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_BlazikenMega[] = INCBIN_COMP("graphics/pokemon/blaziken/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_BlazikenMega[] = INCBIN_COMP("graphics/pokemon/blaziken/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_TORCHIC @@ -9855,13 +9855,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/back.4bpp.lz"); const u32 gMonShinyPalette_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/shiny.gbapal.lz"); const u8 gMonIcon_SwampertMega[] = INCBIN_U8("graphics/pokemon/swampert/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_SwampertMega[] = INCBIN_COMP("graphics/pokemon/swampert/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_SwampertMega[] = INCBIN_COMP("graphics/pokemon/swampert/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MUDKIP @@ -10568,13 +10568,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/back.4bpp.lz"); const u32 gMonShinyPalette_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/shiny.gbapal.lz"); const u8 gMonIcon_GardevoirMega[] = INCBIN_U8("graphics/pokemon/gardevoir/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_GardevoirMega[] = INCBIN_COMP("graphics/pokemon/gardevoir/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_GardevoirMega[] = INCBIN_COMP("graphics/pokemon/gardevoir/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #if P_GEN_4_CROSS_EVOS @@ -10600,13 +10600,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/back.4bpp.lz"); const u32 gMonShinyPalette_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/shiny.gbapal.lz"); const u8 gMonIcon_GalladeMega[] = INCBIN_U8("graphics/pokemon/gallade/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_GalladeMega[] = INCBIN_COMP("graphics/pokemon/gallade/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_GalladeMega[] = INCBIN_COMP("graphics/pokemon/gallade/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_RALTS @@ -11169,13 +11169,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/back.4bpp.lz"); const u32 gMonShinyPalette_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/shiny.gbapal.lz"); const u8 gMonIcon_SableyeMega[] = INCBIN_U8("graphics/pokemon/sableye/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_SableyeMega[] = INCBIN_COMP("graphics/pokemon/sableye/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_SableyeMega[] = INCBIN_COMP("graphics/pokemon/sableye/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_SABLEYE @@ -11217,13 +11217,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/back.4bpp.lz"); const u32 gMonShinyPalette_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/shiny.gbapal.lz"); const u8 gMonIcon_MawileMega[] = INCBIN_U8("graphics/pokemon/mawile/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_MawileMega[] = INCBIN_COMP("graphics/pokemon/mawile/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_MawileMega[] = INCBIN_COMP("graphics/pokemon/mawile/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MAWILE @@ -11315,13 +11315,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/back.4bpp.lz"); const u32 gMonShinyPalette_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/shiny.gbapal.lz"); const u8 gMonIcon_AggronMega[] = INCBIN_U8("graphics/pokemon/aggron/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_AggronMega[] = INCBIN_COMP("graphics/pokemon/aggron/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_AggronMega[] = INCBIN_COMP("graphics/pokemon/aggron/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_ARON @@ -11402,13 +11402,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/back.4bpp.lz"); const u32 gMonShinyPalette_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/shiny.gbapal.lz"); const u8 gMonIcon_MedichamMega[] = INCBIN_U8("graphics/pokemon/medicham/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_MedichamMega[] = INCBIN_COMP("graphics/pokemon/medicham/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_MedichamMega[] = INCBIN_COMP("graphics/pokemon/medicham/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MEDITITE @@ -11473,13 +11473,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/back.4bpp.lz"); const u32 gMonShinyPalette_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/shiny.gbapal.lz"); const u8 gMonIcon_ManectricMega[] = INCBIN_U8("graphics/pokemon/manectric/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_ManectricMega[] = INCBIN_COMP("graphics/pokemon/manectric/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_ManectricMega[] = INCBIN_COMP("graphics/pokemon/manectric/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_ELECTRIKE @@ -11811,13 +11811,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/back.4bpp.lz"); const u32 gMonShinyPalette_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/shiny.gbapal.lz"); const u8 gMonIcon_SharpedoMega[] = INCBIN_U8("graphics/pokemon/sharpedo/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_SharpedoMega[] = INCBIN_COMP("graphics/pokemon/sharpedo/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_SharpedoMega[] = INCBIN_COMP("graphics/pokemon/sharpedo/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_CARVANHA @@ -11954,13 +11954,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/back.4bpp.lz"); const u32 gMonShinyPalette_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/shiny.gbapal.lz"); const u8 gMonIcon_CameruptMega[] = INCBIN_U8("graphics/pokemon/camerupt/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_CameruptMega[] = INCBIN_COMP("graphics/pokemon/camerupt/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_CameruptMega[] = INCBIN_COMP("graphics/pokemon/camerupt/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_NUMEL @@ -12274,13 +12274,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/back.4bpp.lz"); const u32 gMonShinyPalette_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/shiny.gbapal.lz"); const u8 gMonIcon_AltariaMega[] = INCBIN_U8("graphics/pokemon/altaria/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_AltariaMega[] = INCBIN_COMP("graphics/pokemon/altaria/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_AltariaMega[] = INCBIN_COMP("graphics/pokemon/altaria/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_SWABLU @@ -12880,13 +12880,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/back.4bpp.lz"); const u32 gMonShinyPalette_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/shiny.gbapal.lz"); const u8 gMonIcon_BanetteMega[] = INCBIN_U8("graphics/pokemon/banette/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_BanetteMega[] = INCBIN_COMP("graphics/pokemon/banette/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_BanetteMega[] = INCBIN_COMP("graphics/pokemon/banette/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_SHUPPET @@ -13074,13 +13074,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/back.4bpp.lz"); const u32 gMonShinyPalette_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/shiny.gbapal.lz"); const u8 gMonIcon_AbsolMega[] = INCBIN_U8("graphics/pokemon/absol/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_AbsolMega[] = INCBIN_COMP("graphics/pokemon/absol/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_AbsolMega[] = INCBIN_COMP("graphics/pokemon/absol/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_ABSOL @@ -13145,13 +13145,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/back.4bpp.lz"); const u32 gMonShinyPalette_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/shiny.gbapal.lz"); const u8 gMonIcon_GlalieMega[] = INCBIN_U8("graphics/pokemon/glalie/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_GlalieMega[] = INCBIN_COMP("graphics/pokemon/glalie/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_GlalieMega[] = INCBIN_COMP("graphics/pokemon/glalie/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #if P_GEN_4_CROSS_EVOS @@ -13493,13 +13493,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/back.4bpp.lz"); const u32 gMonShinyPalette_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/shiny.gbapal.lz"); const u8 gMonIcon_SalamenceMega[] = INCBIN_U8("graphics/pokemon/salamence/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_SalamenceMega[] = INCBIN_COMP("graphics/pokemon/salamence/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_SalamenceMega[] = INCBIN_COMP("graphics/pokemon/salamence/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_BAGON @@ -13591,13 +13591,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/back.4bpp.lz"); const u32 gMonShinyPalette_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/shiny.gbapal.lz"); const u8 gMonIcon_MetagrossMega[] = INCBIN_U8("graphics/pokemon/metagross/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_MetagrossMega[] = INCBIN_COMP("graphics/pokemon/metagross/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_MetagrossMega[] = INCBIN_COMP("graphics/pokemon/metagross/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_BELDUM @@ -13722,13 +13722,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/back.4bpp.lz"); const u32 gMonShinyPalette_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/shiny.gbapal.lz"); const u8 gMonIcon_LatiasMega[] = INCBIN_U8("graphics/pokemon/latias/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_LatiasMega[] = INCBIN_COMP("graphics/pokemon/latias/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_LatiasMega[] = INCBIN_COMP("graphics/pokemon/latias/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_LATIAS @@ -13766,13 +13766,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/back.4bpp.lz"); const u32 gMonShinyPalette_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/shiny.gbapal.lz"); const u8 gMonIcon_LatiosMega[] = INCBIN_U8("graphics/pokemon/latios/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_LatiosMega[] = INCBIN_COMP("graphics/pokemon/latios/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_LatiosMega[] = INCBIN_COMP("graphics/pokemon/latios/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_LATIOS @@ -13810,13 +13810,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/back.4bpp.lz"); const u32 gMonShinyPalette_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/shiny.gbapal.lz"); const u8 gMonIcon_KyogrePrimal[] = INCBIN_U8("graphics/pokemon/kyogre/primal/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_KyogrePrimal[] = INCBIN_COMP("graphics/pokemon/kyogre/primal/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_KyogrePrimal[] = INCBIN_COMP("graphics/pokemon/kyogre/primal/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_PRIMAL_REVERSIONS #endif //P_FAMILY_KYOGRE @@ -13854,13 +13854,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/back.4bpp.lz"); const u32 gMonShinyPalette_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/shiny.gbapal.lz"); const u8 gMonIcon_GroudonPrimal[] = INCBIN_U8("graphics/pokemon/groudon/primal/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_GroudonPrimal[] = INCBIN_COMP("graphics/pokemon/groudon/primal/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_GroudonPrimal[] = INCBIN_COMP("graphics/pokemon/groudon/primal/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_PRIMAL_REVERSIONS #endif //P_FAMILY_GROUDON @@ -13898,13 +13898,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/back.4bpp.lz"); const u32 gMonShinyPalette_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/shiny.gbapal.lz"); const u8 gMonIcon_RayquazaMega[] = INCBIN_U8("graphics/pokemon/rayquaza/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_RayquazaMega[] = INCBIN_COMP("graphics/pokemon/rayquaza/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_RayquazaMega[] = INCBIN_COMP("graphics/pokemon/rayquaza/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_RAYQUAZA @@ -14831,13 +14831,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/back.4bpp.lz"); const u32 gMonShinyPalette_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/shiny.gbapal.lz"); const u8 gMonIcon_LopunnyMega[] = INCBIN_U8("graphics/pokemon/lopunny/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_LopunnyMega[] = INCBIN_COMP("graphics/pokemon/lopunny/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_LopunnyMega[] = INCBIN_COMP("graphics/pokemon/lopunny/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_BUNEARY @@ -15057,13 +15057,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/back.4bpp.lz"); const u32 gMonShinyPalette_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/shiny.gbapal.lz"); const u8 gMonIcon_GarchompMega[] = INCBIN_U8("graphics/pokemon/garchomp/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_GarchompMega[] = INCBIN_COMP("graphics/pokemon/garchomp/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_GarchompMega[] = INCBIN_COMP("graphics/pokemon/garchomp/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_GIBLE @@ -15106,13 +15106,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/back.4bpp.lz"); const u32 gMonShinyPalette_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/shiny.gbapal.lz"); const u8 gMonIcon_LucarioMega[] = INCBIN_U8("graphics/pokemon/lucario/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_LucarioMega[] = INCBIN_COMP("graphics/pokemon/lucario/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_LucarioMega[] = INCBIN_COMP("graphics/pokemon/lucario/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_RIOLU @@ -15381,13 +15381,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/back.4bpp.lz"); const u32 gMonShinyPalette_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/shiny.gbapal.lz"); const u8 gMonIcon_AbomasnowMega[] = INCBIN_U8("graphics/pokemon/abomasnow/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_AbomasnowMega[] = INCBIN_COMP("graphics/pokemon/abomasnow/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_AbomasnowMega[] = INCBIN_COMP("graphics/pokemon/abomasnow/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_SNOVER @@ -16561,12 +16561,12 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/shiny.gbapal.lz"); const u8 gMonIcon_AudinoMega[] = INCBIN_U8("graphics/pokemon/audino/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_AudinoMega[] = INCBIN_COMP("graphics/pokemon/audino/mega/overworld.4bpp"); + const u32 gObjectEventPic_AudinoMega[] = INCBIN_COMP("graphics/pokemon/audino/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_AUDINO @@ -19787,92 +19787,92 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonFootprint_Furfrou[] = INCBIN_U8("graphics/pokemon/furfrou/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_FurfrouHeartTrim[] = INCBIN_U32("graphics/pokemon/furfrou/heart_trim/anim_front.4bpp.lz"); - const u32 gMonPalette_FurfrouHeartTrim[] = INCBIN_U32("graphics/pokemon/furfrou/heart_trim/normal.gbapal.lz"); - const u32 gMonBackPic_FurfrouHeartTrim[] = INCBIN_U32("graphics/pokemon/furfrou/heart_trim/back.4bpp.lz"); - const u32 gMonShinyPalette_FurfrouHeartTrim[] = INCBIN_U32("graphics/pokemon/furfrou/heart_trim/shiny.gbapal.lz"); - const u8 gMonIcon_FurfrouHeartTrim[] = INCBIN_U8("graphics/pokemon/furfrou/heart_trim/icon.4bpp"); + const u32 gMonFrontPic_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/anim_front.4bpp.lz"); + const u32 gMonPalette_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/normal.gbapal.lz"); + const u32 gMonBackPic_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/back.4bpp.lz"); + const u32 gMonShinyPalette_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/shiny.gbapal.lz"); + const u8 gMonIcon_FurfrouHeart[] = INCBIN_U8("graphics/pokemon/furfrou/heart/icon.4bpp"); - const u32 gMonFrontPic_FurfrouStarTrim[] = INCBIN_U32("graphics/pokemon/furfrou/star_trim/anim_front.4bpp.lz"); - const u32 gMonPalette_FurfrouStarTrim[] = INCBIN_U32("graphics/pokemon/furfrou/star_trim/normal.gbapal.lz"); - const u32 gMonBackPic_FurfrouStarTrim[] = INCBIN_U32("graphics/pokemon/furfrou/star_trim/back.4bpp.lz"); - const u32 gMonShinyPalette_FurfrouStarTrim[] = INCBIN_U32("graphics/pokemon/furfrou/star_trim/shiny.gbapal.lz"); - const u8 gMonIcon_FurfrouStarTrim[] = INCBIN_U8("graphics/pokemon/furfrou/star_trim/icon.4bpp"); + const u32 gMonFrontPic_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/anim_front.4bpp.lz"); + const u32 gMonPalette_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/normal.gbapal.lz"); + const u32 gMonBackPic_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/back.4bpp.lz"); + const u32 gMonShinyPalette_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/shiny.gbapal.lz"); + const u8 gMonIcon_FurfrouStar[] = INCBIN_U8("graphics/pokemon/furfrou/star/icon.4bpp"); - const u32 gMonFrontPic_FurfrouDiamondTrim[] = INCBIN_U32("graphics/pokemon/furfrou/diamond_trim/anim_front.4bpp.lz"); - const u32 gMonPalette_FurfrouDiamondTrim[] = INCBIN_U32("graphics/pokemon/furfrou/diamond_trim/normal.gbapal.lz"); - const u32 gMonBackPic_FurfrouDiamondTrim[] = INCBIN_U32("graphics/pokemon/furfrou/diamond_trim/back.4bpp.lz"); - const u32 gMonShinyPalette_FurfrouDiamondTrim[] = INCBIN_U32("graphics/pokemon/furfrou/diamond_trim/shiny.gbapal.lz"); - const u8 gMonIcon_FurfrouDiamondTrim[] = INCBIN_U8("graphics/pokemon/furfrou/diamond_trim/icon.4bpp"); + const u32 gMonFrontPic_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/anim_front.4bpp.lz"); + const u32 gMonPalette_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/normal.gbapal.lz"); + const u32 gMonBackPic_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/back.4bpp.lz"); + const u32 gMonShinyPalette_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/shiny.gbapal.lz"); + const u8 gMonIcon_FurfrouDiamond[] = INCBIN_U8("graphics/pokemon/furfrou/diamond/icon.4bpp"); - const u32 gMonFrontPic_FurfrouDebutanteTrim[] = INCBIN_U32("graphics/pokemon/furfrou/debutante_trim/anim_front.4bpp.lz"); - const u32 gMonPalette_FurfrouDebutanteTrim[] = INCBIN_U32("graphics/pokemon/furfrou/debutante_trim/normal.gbapal.lz"); - const u32 gMonBackPic_FurfrouDebutanteTrim[] = INCBIN_U32("graphics/pokemon/furfrou/debutante_trim/back.4bpp.lz"); - const u32 gMonShinyPalette_FurfrouDebutanteTrim[] = INCBIN_U32("graphics/pokemon/furfrou/debutante_trim/shiny.gbapal.lz"); - const u8 gMonIcon_FurfrouDebutanteTrim[] = INCBIN_U8("graphics/pokemon/furfrou/debutante_trim/icon.4bpp"); + const u32 gMonFrontPic_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/anim_front.4bpp.lz"); + const u32 gMonPalette_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/normal.gbapal.lz"); + const u32 gMonBackPic_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/back.4bpp.lz"); + const u32 gMonShinyPalette_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/shiny.gbapal.lz"); + const u8 gMonIcon_FurfrouDebutante[] = INCBIN_U8("graphics/pokemon/furfrou/debutante/icon.4bpp"); - const u32 gMonFrontPic_FurfrouMatronTrim[] = INCBIN_U32("graphics/pokemon/furfrou/matron_trim/anim_front.4bpp.lz"); - const u32 gMonPalette_FurfrouMatronTrim[] = INCBIN_U32("graphics/pokemon/furfrou/matron_trim/normal.gbapal.lz"); - const u32 gMonBackPic_FurfrouMatronTrim[] = INCBIN_U32("graphics/pokemon/furfrou/matron_trim/back.4bpp.lz"); - const u32 gMonShinyPalette_FurfrouMatronTrim[] = INCBIN_U32("graphics/pokemon/furfrou/matron_trim/shiny.gbapal.lz"); - const u8 gMonIcon_FurfrouMatronTrim[] = INCBIN_U8("graphics/pokemon/furfrou/matron_trim/icon.4bpp"); + const u32 gMonFrontPic_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/anim_front.4bpp.lz"); + const u32 gMonPalette_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/normal.gbapal.lz"); + const u32 gMonBackPic_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/back.4bpp.lz"); + const u32 gMonShinyPalette_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/shiny.gbapal.lz"); + const u8 gMonIcon_FurfrouMatron[] = INCBIN_U8("graphics/pokemon/furfrou/matron/icon.4bpp"); - const u32 gMonFrontPic_FurfrouDandyTrim[] = INCBIN_U32("graphics/pokemon/furfrou/dandy_trim/anim_front.4bpp.lz"); - const u32 gMonPalette_FurfrouDandyTrim[] = INCBIN_U32("graphics/pokemon/furfrou/dandy_trim/normal.gbapal.lz"); - const u32 gMonBackPic_FurfrouDandyTrim[] = INCBIN_U32("graphics/pokemon/furfrou/dandy_trim/back.4bpp.lz"); - const u32 gMonShinyPalette_FurfrouDandyTrim[] = INCBIN_U32("graphics/pokemon/furfrou/dandy_trim/shiny.gbapal.lz"); - const u8 gMonIcon_FurfrouDandyTrim[] = INCBIN_U8("graphics/pokemon/furfrou/dandy_trim/icon.4bpp"); + const u32 gMonFrontPic_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/anim_front.4bpp.lz"); + const u32 gMonPalette_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/normal.gbapal.lz"); + const u32 gMonBackPic_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/back.4bpp.lz"); + const u32 gMonShinyPalette_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/shiny.gbapal.lz"); + const u8 gMonIcon_FurfrouDandy[] = INCBIN_U8("graphics/pokemon/furfrou/dandy/icon.4bpp"); - const u32 gMonFrontPic_FurfrouLaReineTrim[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine_trim/anim_front.4bpp.lz"); - const u32 gMonPalette_FurfrouLaReineTrim[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine_trim/normal.gbapal.lz"); - const u32 gMonBackPic_FurfrouLaReineTrim[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine_trim/back.4bpp.lz"); - const u32 gMonShinyPalette_FurfrouLaReineTrim[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine_trim/shiny.gbapal.lz"); - const u8 gMonIcon_FurfrouLaReineTrim[] = INCBIN_U8("graphics/pokemon/furfrou/la_reine_trim/icon.4bpp"); + const u32 gMonFrontPic_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/anim_front.4bpp.lz"); + const u32 gMonPalette_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/normal.gbapal.lz"); + const u32 gMonBackPic_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/back.4bpp.lz"); + const u32 gMonShinyPalette_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/shiny.gbapal.lz"); + const u8 gMonIcon_FurfrouLaReine[] = INCBIN_U8("graphics/pokemon/furfrou/la_reine/icon.4bpp"); - const u32 gMonFrontPic_FurfrouKabukiTrim[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki_trim/anim_front.4bpp.lz"); - const u32 gMonPalette_FurfrouKabukiTrim[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki_trim/normal.gbapal.lz"); - const u32 gMonBackPic_FurfrouKabukiTrim[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki_trim/back.4bpp.lz"); - const u32 gMonShinyPalette_FurfrouKabukiTrim[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki_trim/shiny.gbapal.lz"); - const u8 gMonIcon_FurfrouKabukiTrim[] = INCBIN_U8("graphics/pokemon/furfrou/kabuki_trim/icon.4bpp"); + const u32 gMonFrontPic_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/anim_front.4bpp.lz"); + const u32 gMonPalette_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/normal.gbapal.lz"); + const u32 gMonBackPic_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/back.4bpp.lz"); + const u32 gMonShinyPalette_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/shiny.gbapal.lz"); + const u8 gMonIcon_FurfrouKabuki[] = INCBIN_U8("graphics/pokemon/furfrou/kabuki/icon.4bpp"); - const u32 gMonFrontPic_FurfrouPharaohTrim[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh_trim/anim_front.4bpp.lz"); - const u32 gMonPalette_FurfrouPharaohTrim[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh_trim/normal.gbapal.lz"); - const u32 gMonBackPic_FurfrouPharaohTrim[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh_trim/back.4bpp.lz"); - const u32 gMonShinyPalette_FurfrouPharaohTrim[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh_trim/shiny.gbapal.lz"); - const u8 gMonIcon_FurfrouPharaohTrim[] = INCBIN_U8("graphics/pokemon/furfrou/pharaoh_trim/icon.4bpp"); + const u32 gMonFrontPic_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/anim_front.4bpp.lz"); + const u32 gMonPalette_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/normal.gbapal.lz"); + const u32 gMonBackPic_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/back.4bpp.lz"); + const u32 gMonShinyPalette_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/shiny.gbapal.lz"); + const u8 gMonIcon_FurfrouPharaoh[] = INCBIN_U8("graphics/pokemon/furfrou/pharaoh/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_FurfrouNatural[] = INCBIN_COMP("graphics/pokemon/furfrou/overworld.4bpp"); - const u32 gObjectEventPic_FurfrouHeartTrim[] = INCBIN_COMP("graphics/pokemon/furfrou/heart_trim/overworld.4bpp"); - const u32 gObjectEventPic_FurfrouStarTrim[] = INCBIN_COMP("graphics/pokemon/furfrou/star_trim/overworld.4bpp"); - const u32 gObjectEventPic_FurfrouDiamondTrim[] = INCBIN_COMP("graphics/pokemon/furfrou/diamond_trim/overworld.4bpp"); - const u32 gObjectEventPic_FurfrouDebutanteTrim[] = INCBIN_COMP("graphics/pokemon/furfrou/debutante_trim/overworld.4bpp"); - const u32 gObjectEventPic_FurfrouMatronTrim[] = INCBIN_COMP("graphics/pokemon/furfrou/matron_trim/overworld.4bpp"); - const u32 gObjectEventPic_FurfrouDandyTrim[] = INCBIN_COMP("graphics/pokemon/furfrou/dandy_trim/overworld.4bpp"); - const u32 gObjectEventPic_FurfrouLaReineTrim[] = INCBIN_COMP("graphics/pokemon/furfrou/la_reine_trim/overworld.4bpp"); - const u32 gObjectEventPic_FurfrouKabukiTrim[] = INCBIN_COMP("graphics/pokemon/furfrou/kabuki_trim/overworld.4bpp"); - const u32 gObjectEventPic_FurfrouPharaohTrim[] = INCBIN_COMP("graphics/pokemon/furfrou/pharaoh_trim/overworld.4bpp"); + const u32 gObjectEventPic_FurfrouHeart[] = INCBIN_COMP("graphics/pokemon/furfrou/heart/overworld.4bpp"); + const u32 gObjectEventPic_FurfrouStar[] = INCBIN_COMP("graphics/pokemon/furfrou/star/overworld.4bpp"); + const u32 gObjectEventPic_FurfrouDiamond[] = INCBIN_COMP("graphics/pokemon/furfrou/diamond/overworld.4bpp"); + const u32 gObjectEventPic_FurfrouDebutante[] = INCBIN_COMP("graphics/pokemon/furfrou/debutante/overworld.4bpp"); + const u32 gObjectEventPic_FurfrouMatron[] = INCBIN_COMP("graphics/pokemon/furfrou/matron/overworld.4bpp"); + const u32 gObjectEventPic_FurfrouDandy[] = INCBIN_COMP("graphics/pokemon/furfrou/dandy/overworld.4bpp"); + const u32 gObjectEventPic_FurfrouLaReine[] = INCBIN_COMP("graphics/pokemon/furfrou/la_reine/overworld.4bpp"); + const u32 gObjectEventPic_FurfrouKabuki[] = INCBIN_COMP("graphics/pokemon/furfrou/kabuki/overworld.4bpp"); + const u32 gObjectEventPic_FurfrouPharaoh[] = INCBIN_COMP("graphics/pokemon/furfrou/pharaoh/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE const u32 gOverworldPalette_FurfrouNatural[] = INCBIN_U32("graphics/pokemon/furfrou/overworld_normal.gbapal.lz"); - const u32 gOverworldPalette_FurfrouHeartTrim[] = INCBIN_U32("graphics/pokemon/furfrou/heart_trim/overworld_normal.gbapal.lz"); - const u32 gOverworldPalette_FurfrouStarTrim[] = INCBIN_U32("graphics/pokemon/furfrou/star_trim/overworld_normal.gbapal.lz"); - const u32 gOverworldPalette_FurfrouDiamondTrim[] = INCBIN_U32("graphics/pokemon/furfrou/diamond_trim/overworld_normal.gbapal.lz"); - const u32 gOverworldPalette_FurfrouDebutanteTrim[] = INCBIN_U32("graphics/pokemon/furfrou/debutante_trim/overworld_normal.gbapal.lz"); - const u32 gOverworldPalette_FurfrouMatronTrim[] = INCBIN_U32("graphics/pokemon/furfrou/matron_trim/overworld_normal.gbapal.lz"); - const u32 gOverworldPalette_FurfrouDandyTrim[] = INCBIN_U32("graphics/pokemon/furfrou/dandy_trim/overworld_normal.gbapal.lz"); - const u32 gOverworldPalette_FurfrouLaReineTrim[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine_trim/overworld_normal.gbapal.lz"); - const u32 gOverworldPalette_FurfrouKabukiTrim[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki_trim/overworld_normal.gbapal.lz"); - const u32 gOverworldPalette_FurfrouPharaohTrim[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh_trim/overworld_normal.gbapal.lz"); + const u32 gOverworldPalette_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/overworld_normal.gbapal.lz"); + const u32 gOverworldPalette_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/overworld_normal.gbapal.lz"); + const u32 gOverworldPalette_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/overworld_normal.gbapal.lz"); + const u32 gOverworldPalette_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/overworld_normal.gbapal.lz"); + const u32 gOverworldPalette_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/overworld_normal.gbapal.lz"); + const u32 gOverworldPalette_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/overworld_normal.gbapal.lz"); + const u32 gOverworldPalette_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/overworld_normal.gbapal.lz"); + const u32 gOverworldPalette_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/overworld_normal.gbapal.lz"); + const u32 gOverworldPalette_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/overworld_normal.gbapal.lz"); const u32 gShinyOverworldPalette_FurfrouNatural[] = INCBIN_U32("graphics/pokemon/furfrou/overworld_shiny.gbapal.lz"); - const u32 gShinyOverworldPalette_FurfrouHeartTrim[] = INCBIN_U32("graphics/pokemon/furfrou/heart_trim/overworld_shiny.gbapal.lz"); - const u32 gShinyOverworldPalette_FurfrouStarTrim[] = INCBIN_U32("graphics/pokemon/furfrou/star_trim/overworld_shiny.gbapal.lz"); - const u32 gShinyOverworldPalette_FurfrouDiamondTrim[] = INCBIN_U32("graphics/pokemon/furfrou/diamond_trim/overworld_shiny.gbapal.lz"); - const u32 gShinyOverworldPalette_FurfrouDebutanteTrim[] = INCBIN_U32("graphics/pokemon/furfrou/debutante_trim/overworld_shiny.gbapal.lz"); - const u32 gShinyOverworldPalette_FurfrouMatronTrim[] = INCBIN_U32("graphics/pokemon/furfrou/matron_trim/overworld_shiny.gbapal.lz"); - const u32 gShinyOverworldPalette_FurfrouDandyTrim[] = INCBIN_U32("graphics/pokemon/furfrou/dandy_trim/overworld_shiny.gbapal.lz"); - const u32 gShinyOverworldPalette_FurfrouLaReineTrim[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine_trim/overworld_shiny.gbapal.lz"); - const u32 gShinyOverworldPalette_FurfrouKabukiTrim[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki_trim/overworld_shiny.gbapal.lz"); - const u32 gShinyOverworldPalette_FurfrouPharaohTrim[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh_trim/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/overworld_shiny.gbapal.lz"); + const u32 gShinyOverworldPalette_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_FURFROU @@ -20743,13 +20743,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/back.4bpp.lz"); const u32 gMonShinyPalette_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/shiny.gbapal.lz"); const u8 gMonIcon_DiancieMega[] = INCBIN_U8("graphics/pokemon/diancie/mega/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_DiancieMega[] = INCBIN_COMP("graphics/pokemon/diancie/mega/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_DiancieMega[] = INCBIN_COMP("graphics/pokemon/diancie/mega/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_DIANCIE @@ -22379,10 +22379,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonShinyPalette_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/shiny.gbapal.lz"); const u8 gMonIcon_NecrozmaUltra[] = INCBIN_U8("graphics/pokemon/necrozma/ultra/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_NecrozmaUltra[] = INCBIN_COMP("graphics/pokemon/necrozma/ultra/overworld.4bpp"); + const u32 gObjectEventPic_NecrozmaUltra[] = INCBIN_COMP("graphics/pokemon/necrozma/ultra/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u32 gOverworldPalette_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/overworld_normal.gbapal.lz"); - // const u32 gShinyOverworldPalette_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/overworld_shiny.gbapal.lz"); + const u32 gOverworldPalette_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/overworld_shiny.gbapal.lz"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_ULTRA_BURST_FORMS diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 2bf3fd4be2..f9897650a5 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -17,11 +17,6 @@ #define BINDING_TURNS "2 to 5" #endif -/* First arg is the charge turn string id, second arg depends on effect -EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP: semi-invulnerable STATUS3 to apply to battler -EFFECT_TWO_TURNS_ATTACK/EFFECT_SOLAR_BEAM: weather in which to skip charge turn */ -#define TWO_TURN_ARG(stringid, ...) (stringid) __VA_OPT__(| ((__VA_ARGS__) << 16)) - // Shared Move Description entries const u8 gNotDoneYetDescription[] = _( @@ -175,6 +170,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_KarateChop, + .validApprenticeMove = TRUE, }, [MOVE_DOUBLE_SLAP] = @@ -197,6 +193,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_POUND}, .battleAnimScript = gBattleAnimMove_DoubleSlap, + .validApprenticeMove = TRUE, }, [MOVE_COMET_PUNCH] = @@ -243,6 +240,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_MegaPunch, + .validApprenticeMove = TRUE, }, [MOVE_PAY_DAY] = @@ -294,6 +292,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_FIRE_PUNCH, .contestComboMoves = {COMBO_STARTER_ICE_PUNCH, COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_THUNDER_PUNCH}, .battleAnimScript = gBattleAnimMove_FirePunch, + .validApprenticeMove = TRUE, }, [MOVE_ICE_PUNCH] = @@ -325,6 +324,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_ICE_PUNCH, .contestComboMoves = {COMBO_STARTER_FIRE_PUNCH, COMBO_STARTER_THUNDER_PUNCH}, .battleAnimScript = gBattleAnimMove_IcePunch, + .validApprenticeMove = TRUE, }, [MOVE_THUNDER_PUNCH] = @@ -352,6 +352,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_THUNDER_PUNCH, .contestComboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_FIRE_PUNCH, COMBO_STARTER_ICE_PUNCH}, .battleAnimScript = gBattleAnimMove_ThunderPunch, + .validApprenticeMove = TRUE, }, [MOVE_SCRATCH] = @@ -418,6 +419,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_VICE_GRIP}, .battleAnimScript = gBattleAnimMove_Guillotine, + .validApprenticeMove = TRUE, }, [MOVE_RAZOR_WIND] = @@ -438,7 +440,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .windMove = B_EXTRAPOLATED_MOVE_FLAGS, - .argument = TWO_TURN_ARG(STRINGID_PKMNWHIPPEDWHIRLWIND), + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNWHIPPEDWHIRLWIND }, .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, @@ -468,6 +470,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_SWORDS_DANCE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SwordsDance, + .validApprenticeMove = TRUE, }, [MOVE_CUT] = @@ -565,6 +568,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Whirlwind, + .validApprenticeMove = TRUE, }, [MOVE_FLY] = @@ -586,12 +590,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_PKMNFLEWHIGH, COMPRESS_BITS(STATUS3_ON_AIR)), + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNFLEWHIGH, .status = COMPRESS_BITS(STATUS3_ON_AIR) }, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Fly, + .validApprenticeMove = TRUE, }, [MOVE_BIND] = @@ -618,6 +623,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_VICE_GRIP}, .battleAnimScript = gBattleAnimMove_Bind, + .validApprenticeMove = TRUE, }, [MOVE_SLAM] = @@ -641,6 +647,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_POUND}, .battleAnimScript = gBattleAnimMove_Slam, + .validApprenticeMove = TRUE, }, [MOVE_VINE_WHIP] = @@ -697,6 +704,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LEER}, .battleAnimScript = gBattleAnimMove_Stomp, + .validApprenticeMove = TRUE, }, [MOVE_DOUBLE_KICK] = @@ -720,6 +728,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DoubleKick, + .validApprenticeMove = TRUE, }, [MOVE_MEGA_KICK] = @@ -742,6 +751,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_MegaKick, + .validApprenticeMove = TRUE, }, [MOVE_JUMP_KICK] = @@ -771,6 +781,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_JumpKick, + .validApprenticeMove = TRUE, }, [MOVE_ROLLING_KICK] = @@ -798,6 +809,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RollingKick, + .validApprenticeMove = TRUE, }, [MOVE_SAND_ATTACK] = @@ -821,6 +833,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_SAND_ATTACK, .contestComboMoves = {COMBO_STARTER_MUD_SLAP, COMBO_STARTER_SANDSTORM}, .battleAnimScript = gBattleAnimMove_SandAttack, + .validApprenticeMove = TRUE, }, [MOVE_HEADBUTT] = @@ -847,6 +860,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_Headbutt, + .validApprenticeMove = TRUE, }, [MOVE_HORN_ATTACK] = @@ -913,6 +927,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HORN_ATTACK}, .battleAnimScript = gBattleAnimMove_HornDrill, + .validApprenticeMove = TRUE, }, [MOVE_TACKLE] = @@ -969,6 +984,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BodySlam, + .validApprenticeMove = TRUE, }, [MOVE_WRAP] = @@ -994,6 +1010,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Wrap, + .validApprenticeMove = TRUE, }, [MOVE_TAKE_DOWN] = @@ -1017,6 +1034,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_HARDEN}, .battleAnimScript = gBattleAnimMove_TakeDown, + .validApprenticeMove = TRUE, }, [MOVE_THRASH] = @@ -1044,6 +1062,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAGE}, .battleAnimScript = gBattleAnimMove_Thrash, + .validApprenticeMove = TRUE, }, [MOVE_DOUBLE_EDGE] = @@ -1067,6 +1086,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_HARDEN}, .battleAnimScript = gBattleAnimMove_DoubleEdge, + .validApprenticeMove = TRUE, }, [MOVE_TAIL_WHIP] = @@ -1142,6 +1162,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Twineedle, + .validApprenticeMove = TRUE, }, [MOVE_PIN_MISSILE] = @@ -1213,6 +1234,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LEER, COMBO_STARTER_SCARY_FACE}, .battleAnimScript = gBattleAnimMove_Bite, + .validApprenticeMove = TRUE, }, [MOVE_GROWL] = @@ -1266,6 +1288,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Roar, + .validApprenticeMove = TRUE, }, [MOVE_SING] = @@ -1291,6 +1314,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_SING, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Sing, + .validApprenticeMove = TRUE, }, [MOVE_SUPERSONIC] = @@ -1316,6 +1340,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Supersonic, + .validApprenticeMove = TRUE, }, [MOVE_SONIC_BOOM] = @@ -1332,12 +1357,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = 20, + .argument = { .fixedDamage = 20 }, .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SonicBoom, + .validApprenticeMove = TRUE, }, [MOVE_DISABLE] = @@ -1368,6 +1394,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Disable, + .validApprenticeMove = TRUE, }, [MOVE_ACID] = @@ -1447,6 +1474,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Flamethrower, + .validApprenticeMove = TRUE, }, [MOVE_MIST] = @@ -1472,6 +1500,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Mist, + .validApprenticeMove = TRUE, }, [MOVE_WATER_GUN] = @@ -1514,6 +1543,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_HydroPump, + .validApprenticeMove = TRUE, }, [MOVE_SURF] = @@ -1537,6 +1567,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_SURF, .contestComboMoves = {COMBO_STARTER_DIVE, COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Surf, + .validApprenticeMove = TRUE, }, [MOVE_ICE_BEAM] = @@ -1568,6 +1599,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL}, .battleAnimScript = gBattleAnimMove_IceBeam, + .validApprenticeMove = TRUE, }, [MOVE_BLIZZARD] = @@ -1598,6 +1630,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_POWDER_SNOW}, .battleAnimScript = gBattleAnimMove_Blizzard, + .validApprenticeMove = TRUE, }, [MOVE_PSYBEAM] = @@ -1623,6 +1656,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_Psybeam, + .validApprenticeMove = TRUE, }, [MOVE_BUBBLE_BEAM] = @@ -1697,6 +1731,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HyperBeam, + .validApprenticeMove = TRUE, }, [MOVE_PECK] = @@ -1741,6 +1776,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_PECK}, .battleAnimScript = gBattleAnimMove_DrillPeck, + .validApprenticeMove = TRUE, }, [MOVE_SUBMISSION] = @@ -1764,6 +1800,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_Submission, + .validApprenticeMove = TRUE, }, [MOVE_LOW_KICK] = @@ -1786,6 +1823,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LowKick, + .validApprenticeMove = TRUE, }, [MOVE_COUNTER] = @@ -1813,6 +1851,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_TAUNT}, .battleAnimScript = gBattleAnimMove_Counter, + .validApprenticeMove = TRUE, }, [MOVE_SEISMIC_TOSS] = @@ -1836,6 +1875,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, .battleAnimScript = gBattleAnimMove_SeismicToss, + .validApprenticeMove = TRUE, }, [MOVE_STRENGTH] = @@ -1858,6 +1898,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Strength, + .validApprenticeMove = TRUE, }, [MOVE_ABSORB] = @@ -1874,7 +1915,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = 50, + .argument = { .absorbPercentage = 50 }, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, @@ -1896,7 +1937,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = 50, + .argument = { .absorbPercentage = 50 }, .zMove = { .powerOverride = 120 }, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, @@ -1928,6 +1969,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_LEECH_SEED, .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_WORRY_SEED}, .battleAnimScript = gBattleAnimMove_LeechSeed, + .validApprenticeMove = TRUE, }, [MOVE_GROWTH] = @@ -1958,6 +2000,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_GROWTH, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Growth, + .validApprenticeMove = TRUE, }, [MOVE_RAZOR_LEAF] = @@ -1981,6 +2024,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_RazorLeaf, + .validApprenticeMove = TRUE, }, [MOVE_SOLAR_BEAM] = @@ -1999,12 +2043,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_PKMNTOOKSUNLIGHT, B_WEATHER_SUN), + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKSUNLIGHT, .status = B_WEATHER_SUN }, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_SolarBeam, + .validApprenticeMove = TRUE, }, [MOVE_POISON_POWDER] = @@ -2029,6 +2074,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWEET_SCENT}, .battleAnimScript = gBattleAnimMove_PoisonPowder, + .validApprenticeMove = TRUE, }, [MOVE_STUN_SPORE] = @@ -2053,6 +2099,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWEET_SCENT}, .battleAnimScript = gBattleAnimMove_StunSpore, + .validApprenticeMove = TRUE, }, [MOVE_SLEEP_POWDER] = @@ -2077,6 +2124,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWEET_SCENT}, .battleAnimScript = gBattleAnimMove_SleepPowder, + .validApprenticeMove = TRUE, }, [MOVE_PETAL_DANCE] = @@ -2111,6 +2159,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_PetalDance, + .validApprenticeMove = TRUE, }, [MOVE_STRING_SHOT] = @@ -2151,12 +2200,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_4) || (B_UPDATED_MOVE_FLAGS < GEN_3), - .argument = 40, + .argument = { .fixedDamage = 40 }, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = COMBO_STARTER_DRAGON_RAGE, .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, .battleAnimScript = gBattleAnimMove_DragonRage, + .validApprenticeMove = TRUE, }, [MOVE_FIRE_SPIN] = @@ -2182,6 +2232,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_FireSpin, + .validApprenticeMove = TRUE, }, [MOVE_THUNDER_SHOCK] = @@ -2232,6 +2283,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_Thunderbolt, + .validApprenticeMove = TRUE, }, [MOVE_THUNDER_WAVE] = @@ -2255,6 +2307,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_ThunderWave, + .validApprenticeMove = TRUE, }, [MOVE_THUNDER] = @@ -2281,6 +2334,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_LOCK_ON, COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Thunder, + .validApprenticeMove = TRUE, }, [MOVE_ROCK_THROW] = @@ -2326,6 +2380,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_EARTHQUAKE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Earthquake, + .validApprenticeMove = TRUE, }, [MOVE_FISSURE] = @@ -2349,6 +2404,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_EARTHQUAKE}, .battleAnimScript = gBattleAnimMove_Fissure, + .validApprenticeMove = TRUE, }, [MOVE_DIG] = @@ -2370,12 +2426,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .instructBanned = TRUE, .assistBanned = TRUE, .skyBattleBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_PKMNDUGHOLE, COMPRESS_BITS(STATUS3_UNDERGROUND)), + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNDUGHOLE, .status = COMPRESS_BITS(STATUS3_UNDERGROUND) }, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Dig, + .validApprenticeMove = TRUE, }, [MOVE_TOXIC] = @@ -2399,6 +2456,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_TOXIC, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Toxic, + .validApprenticeMove = TRUE, }, [MOVE_CONFUSION] = @@ -2449,6 +2507,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_PSYCHIC, .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_CONFUSION, COMBO_STARTER_KINESIS}, .battleAnimScript = gBattleAnimMove_Psychic, + .validApprenticeMove = TRUE, }, [MOVE_HYPNOSIS] = @@ -2472,6 +2531,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_HYPNOSIS, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Hypnosis, + .validApprenticeMove = TRUE, }, [MOVE_MEDITATE] = @@ -2497,6 +2557,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_Meditate, + .validApprenticeMove = TRUE, }, [MOVE_AGILITY] = @@ -2522,6 +2583,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_DOUBLE_TEAM}, .battleAnimScript = gBattleAnimMove_Agility, + .validApprenticeMove = TRUE, }, [MOVE_QUICK_ATTACK] = @@ -2544,6 +2606,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_DOUBLE_TEAM}, .battleAnimScript = gBattleAnimMove_QuickAttack, + .validApprenticeMove = TRUE, }, [MOVE_RAGE] = @@ -2611,6 +2674,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_NightShade, + .validApprenticeMove = TRUE, }, [MOVE_MIMIC] = @@ -2641,6 +2705,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Mimic, + .validApprenticeMove = TRUE, }, [MOVE_SCREECH] = @@ -2666,6 +2731,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Screech, + .validApprenticeMove = TRUE, }, [MOVE_DOUBLE_TEAM] = @@ -2691,6 +2757,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_DOUBLE_TEAM, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DoubleTeam, + .validApprenticeMove = TRUE, }, [MOVE_RECOVER] = @@ -2723,6 +2790,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Recover, + .validApprenticeMove = TRUE, }, [MOVE_HARDEN] = @@ -2748,6 +2816,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_HARDEN, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Harden, + .validApprenticeMove = TRUE, }, [MOVE_MINIMIZE] = @@ -2773,6 +2842,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Minimize, + .validApprenticeMove = TRUE, }, [MOVE_SMOKESCREEN] = @@ -2796,6 +2866,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SMOG}, .battleAnimScript = gBattleAnimMove_Smokescreen, + .validApprenticeMove = TRUE, }, [MOVE_CONFUSE_RAY] = @@ -2819,6 +2890,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ConfuseRay, + .validApprenticeMove = TRUE, }, [MOVE_WITHDRAW] = @@ -2844,6 +2916,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Withdraw, + .validApprenticeMove = TRUE, }, [MOVE_DEFENSE_CURL] = @@ -2869,6 +2942,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_DEFENSE_CURL, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DefenseCurl, + .validApprenticeMove = TRUE, }, [MOVE_BARRIER] = @@ -2894,6 +2968,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Barrier, + .validApprenticeMove = TRUE, }, [MOVE_LIGHT_SCREEN] = @@ -2919,6 +2994,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_LightScreen, + .validApprenticeMove = TRUE, }, [MOVE_HAZE] = @@ -2944,6 +3020,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL}, .battleAnimScript = gBattleAnimMove_Haze, + .validApprenticeMove = TRUE, }, [MOVE_REFLECT] = @@ -2969,6 +3046,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_Reflect, + .validApprenticeMove = TRUE, }, [MOVE_FOCUS_ENERGY] = @@ -2986,7 +3064,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, - .argument = STATUS2_FOCUS_ENERGY, + .argument = { .status = STATUS2_FOCUS_ENERGY }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = TRUE, @@ -2995,6 +3073,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_FOCUS_ENERGY, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FocusEnergy, + .validApprenticeMove = TRUE, }, [MOVE_BIDE] = @@ -3050,6 +3129,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Metronome, + .validApprenticeMove = TRUE, }, [MOVE_MIRROR_MOVE] = @@ -3079,6 +3159,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MirrorMove, + .validApprenticeMove = TRUE, }, [MOVE_SELF_DESTRUCT] = @@ -3101,6 +3182,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SelfDestruct, + .validApprenticeMove = TRUE, }, [MOVE_EGG_BOMB] = @@ -3123,6 +3205,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SOFT_BOILED}, .battleAnimScript = gBattleAnimMove_EggBomb, + .validApprenticeMove = TRUE, }, [MOVE_LICK] = @@ -3149,6 +3232,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Lick, + .validApprenticeMove = TRUE, }, [MOVE_SMOG] = @@ -3249,6 +3333,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_FireBlast, + .validApprenticeMove = TRUE, }, [MOVE_WATERFALL] = @@ -3277,6 +3362,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Waterfall, + .validApprenticeMove = TRUE, }, [MOVE_CLAMP] = @@ -3303,6 +3389,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Clamp, + .validApprenticeMove = TRUE, }, [MOVE_SWIFT] = @@ -3324,6 +3411,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Swift, + .validApprenticeMove = TRUE, }, [MOVE_SKULL_BASH] = @@ -3343,7 +3431,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_PKMNLOWEREDHEAD), + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNLOWEREDHEAD }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_DEF_PLUS_1, .self = TRUE, @@ -3354,6 +3442,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SkullBash, + .validApprenticeMove = TRUE, }, [MOVE_SPIKE_CANNON] = @@ -3426,6 +3515,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Amnesia, + .validApprenticeMove = TRUE, }, [MOVE_KINESIS] = @@ -3449,6 +3539,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_KINESIS, .contestComboMoves = {COMBO_STARTER_CONFUSION, COMBO_STARTER_PSYCHIC}, .battleAnimScript = gBattleAnimMove_Kinesis, + .validApprenticeMove = TRUE, }, [MOVE_SOFT_BOILED] = @@ -3475,6 +3566,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_SOFT_BOILED, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SoftBoiled, + .validApprenticeMove = TRUE, }, [MOVE_HIGH_JUMP_KICK] = @@ -3504,6 +3596,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_HighJumpKick, + .validApprenticeMove = TRUE, }, [MOVE_GLARE] = @@ -3533,6 +3626,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LEER}, .battleAnimScript = gBattleAnimMove_Glare, + .validApprenticeMove = TRUE, }, [MOVE_DREAM_EATER] = @@ -3556,6 +3650,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_HYPNOSIS}, .battleAnimScript = gBattleAnimMove_DreamEater, + .validApprenticeMove = TRUE, }, [MOVE_POISON_GAS] = @@ -3623,7 +3718,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = 50, + .argument = { .absorbPercentage = 50 }, .makesContact = TRUE, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, @@ -3655,6 +3750,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LovelyKiss, + .validApprenticeMove = TRUE, }, [MOVE_SKY_ATTACK] = @@ -3674,7 +3770,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .argument = TWO_TURN_ARG(B_UPDATED_MOVE_DATA >= GEN_4 ? STRINGID_CLOAKEDINAHARSHLIGHT : STRINGID_PKMNISGLOWING), + .argument.twoTurnAttack = { .stringId = B_UPDATED_MOVE_DATA >= GEN_4 ? STRINGID_CLOAKEDINAHARSHLIGHT : STRINGID_PKMNISGLOWING }, #if B_UPDATED_MOVE_DATA >= GEN_3 .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FLINCH, @@ -3686,6 +3782,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SkyAttack, + .validApprenticeMove = TRUE, }, [MOVE_TRANSFORM] = @@ -3716,6 +3813,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Transform, + .validApprenticeMove = TRUE, }, [MOVE_BUBBLE] = @@ -3768,6 +3866,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DizzyPunch, + .validApprenticeMove = TRUE, }, [MOVE_SPORE] = @@ -3792,6 +3891,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Spore, + .validApprenticeMove = TRUE, }, [MOVE_FLASH] = @@ -3815,6 +3915,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Flash, + .validApprenticeMove = TRUE, }, [MOVE_PSYWAVE] = @@ -3836,6 +3937,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_Psywave, + .validApprenticeMove = TRUE, }, [MOVE_SPLASH] = @@ -3886,6 +3988,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_AcidArmor, + .validApprenticeMove = TRUE, }, [MOVE_CRABHAMMER] = @@ -3909,6 +4012,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_Crabhammer, + .validApprenticeMove = TRUE, }, [MOVE_EXPLOSION] = @@ -3931,6 +4035,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Explosion, + .validApprenticeMove = TRUE, }, [MOVE_FURY_SWIPES] = @@ -3975,6 +4080,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_BONEMERANG, .contestComboMoves = {COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONE_RUSH, COMBO_STARTER_SHADOW_BONE}, .battleAnimScript = gBattleAnimMove_Bonemerang, + .validApprenticeMove = TRUE, }, [MOVE_REST] = @@ -4001,6 +4107,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_REST, .contestComboMoves = {COMBO_STARTER_BELLY_DRUM, COMBO_STARTER_CHARM, COMBO_STARTER_YAWN}, .battleAnimScript = gBattleAnimMove_Rest, + .validApprenticeMove = TRUE, }, [MOVE_ROCK_SLIDE] = @@ -4026,6 +4133,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ROCK_THROW}, .battleAnimScript = gBattleAnimMove_RockSlide, + .validApprenticeMove = TRUE, }, [MOVE_HYPER_FANG] = @@ -4053,6 +4161,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HyperFang, + .validApprenticeMove = TRUE, }, [MOVE_SHARPEN] = @@ -4078,6 +4187,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Sharpen, + .validApprenticeMove = TRUE, }, [MOVE_CONVERSION] = @@ -4103,6 +4213,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Conversion, + .validApprenticeMove = TRUE, }, [MOVE_TRI_ATTACK] = @@ -4128,6 +4239,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LOCK_ON}, .battleAnimScript = gBattleAnimMove_TriAttack, + .validApprenticeMove = TRUE, }, [MOVE_SUPER_FANG] = @@ -4151,6 +4263,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SCARY_FACE}, .battleAnimScript = gBattleAnimMove_SuperFang, + .validApprenticeMove = TRUE, }, [MOVE_SLASH] = @@ -4175,6 +4288,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SCRATCH, COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_Slash, + .validApprenticeMove = TRUE, }, [MOVE_SUBSTITUTE] = @@ -4201,6 +4315,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Substitute, + .validApprenticeMove = TRUE, }, [MOVE_STRUGGLE] = @@ -4239,6 +4354,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .assistBanned = TRUE, .sketchBanned = TRUE, .battleAnimScript = gBattleAnimMove_Struggle, + .validApprenticeMove = TRUE, }, [MOVE_SKETCH] = @@ -4272,6 +4388,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Sketch, + .validApprenticeMove = TRUE, }, [MOVE_TRIPLE_KICK] = @@ -4295,6 +4412,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_TripleKick, + .validApprenticeMove = TRUE, }, [MOVE_THIEF] = @@ -4325,6 +4443,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Thief, + .validApprenticeMove = TRUE, }, [MOVE_SPIDER_WEB] = @@ -4349,6 +4468,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_STRING_SHOT}, .battleAnimScript = gBattleAnimMove_SpiderWeb, + .validApprenticeMove = TRUE, }, [MOVE_MIND_READER] = @@ -4371,6 +4491,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_MIND_READER, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MindReader, + .validApprenticeMove = TRUE, }, [MOVE_NIGHTMARE] = @@ -4394,6 +4515,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Nightmare, + .validApprenticeMove = TRUE, }, [MOVE_FLAME_WHEEL] = @@ -4449,6 +4571,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_REST}, .battleAnimScript = gBattleAnimMove_Snore, + .validApprenticeMove = TRUE, }, [MOVE_CURSE] = @@ -4474,6 +4597,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_CURSE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Curse, + .validApprenticeMove = TRUE, }, [MOVE_FLAIL] = @@ -4496,6 +4620,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ENDURE}, .battleAnimScript = gBattleAnimMove_Flail, + .validApprenticeMove = TRUE, }, [MOVE_CONVERSION_2] = @@ -4521,6 +4646,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Conversion2, + .validApprenticeMove = TRUE, }, [MOVE_AEROBLAST] = @@ -4544,6 +4670,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Aeroblast, + .validApprenticeMove = TRUE, }, [MOVE_COTTON_SPORE] = @@ -4568,6 +4695,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_CottonSpore, + .validApprenticeMove = TRUE, }, [MOVE_REVERSAL] = @@ -4590,6 +4718,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ENDURE}, .battleAnimScript = gBattleAnimMove_Reversal, + .validApprenticeMove = TRUE, }, [MOVE_SPITE] = @@ -4614,6 +4743,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CURSE}, .battleAnimScript = gBattleAnimMove_Spite, + .validApprenticeMove = TRUE, }, [MOVE_POWDER_SNOW] = @@ -4668,6 +4798,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HARDEN}, .battleAnimScript = gBattleAnimMove_Protect, + .validApprenticeMove = TRUE, }, [MOVE_MACH_PUNCH] = @@ -4691,6 +4822,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MachPunch, + .validApprenticeMove = TRUE, }, [MOVE_SCARY_FACE] = @@ -4714,6 +4846,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_SCARY_FACE, .contestComboMoves = {COMBO_STARTER_LEER, COMBO_STARTER_RAGE}, .battleAnimScript = gBattleAnimMove_ScaryFace, + .validApprenticeMove = TRUE, }, [MOVE_FEINT_ATTACK] = @@ -4736,6 +4869,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FAKE_OUT, COMBO_STARTER_LEER, COMBO_STARTER_POUND}, .battleAnimScript = gBattleAnimMove_FeintAttack, + .validApprenticeMove = TRUE, }, [MOVE_SWEET_KISS] = @@ -4759,6 +4893,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARM}, .battleAnimScript = gBattleAnimMove_SweetKiss, + .validApprenticeMove = TRUE, }, [MOVE_BELLY_DRUM] = @@ -4784,6 +4919,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_BELLY_DRUM, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BellyDrum, + .validApprenticeMove = TRUE, }, [MOVE_SLUDGE_BOMB] = @@ -4810,6 +4946,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_SLUDGE_BOMB, .contestComboMoves = {COMBO_STARTER_SLUDGE}, .battleAnimScript = gBattleAnimMove_SludgeBomb, + .validApprenticeMove = TRUE, }, [MOVE_MUD_SLAP] = @@ -4835,6 +4972,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_MUD_SLAP, .contestComboMoves = {COMBO_STARTER_MUD_SPORT, COMBO_STARTER_SAND_ATTACK, COMBO_STARTER_SANDSTORM}, .battleAnimScript = gBattleAnimMove_MudSlap, + .validApprenticeMove = TRUE, }, [MOVE_OCTAZOOKA] = @@ -4861,6 +4999,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LOCK_ON, COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Octazooka, + .validApprenticeMove = TRUE, }, [MOVE_SPIKES] = @@ -4888,6 +5027,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Spikes, + .validApprenticeMove = TRUE, }, [MOVE_ZAP_CANNON] = @@ -4914,6 +5054,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_LOCK_ON}, .battleAnimScript = gBattleAnimMove_ZapCannon, + .validApprenticeMove = TRUE, }, [MOVE_FORESIGHT] = @@ -4938,6 +5079,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Foresight, + .validApprenticeMove = TRUE, }, [MOVE_DESTINY_BOND] = @@ -4966,6 +5108,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENDURE, COMBO_STARTER_MEAN_LOOK}, .battleAnimScript = gBattleAnimMove_DestinyBond, + .validApprenticeMove = TRUE, }, [MOVE_PERISH_SONG] = @@ -4992,6 +5135,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_SING}, .battleAnimScript = gBattleAnimMove_PerishSong, + .validApprenticeMove = TRUE, }, [MOVE_ICY_WIND] = @@ -5018,6 +5162,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL}, .battleAnimScript = gBattleAnimMove_IcyWind, + .validApprenticeMove = TRUE, }, [MOVE_DETECT] = @@ -5045,6 +5190,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_TAUNT}, .battleAnimScript = gBattleAnimMove_Detect, + .validApprenticeMove = TRUE, }, [MOVE_BONE_RUSH] = @@ -5088,6 +5234,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_LOCK_ON, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LockOn, + .validApprenticeMove = TRUE, }, [MOVE_OUTRAGE] = @@ -5115,6 +5262,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Outrage, + .validApprenticeMove = TRUE, }, [MOVE_SANDSTORM] = @@ -5140,6 +5288,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_SANDSTORM, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Sandstorm, + .validApprenticeMove = TRUE, }, [MOVE_GIGA_DRAIN] = @@ -5156,7 +5305,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = 50, + .argument = { .absorbPercentage = 50 }, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, @@ -5164,6 +5313,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_GigaDrain, + .validApprenticeMove = TRUE, }, [MOVE_ENDURE] = @@ -5191,6 +5341,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_ENDURE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Endure, + .validApprenticeMove = TRUE, }, [MOVE_CHARM] = @@ -5214,6 +5365,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_CHARM, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Charm, + .validApprenticeMove = TRUE, }, [MOVE_ROLLOUT] = @@ -5238,6 +5390,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_DEFENSE_CURL, COMBO_STARTER_HARDEN}, .battleAnimScript = gBattleAnimMove_Rollout, + .validApprenticeMove = TRUE, }, [MOVE_FALSE_SWIPE] = @@ -5258,6 +5411,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_FalseSwipe, + .validApprenticeMove = TRUE, }, [MOVE_SWAGGER] = @@ -5281,6 +5435,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Swagger, + .validApprenticeMove = TRUE, }, [MOVE_MILK_DRINK] = @@ -5307,6 +5462,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MilkDrink, + .validApprenticeMove = TRUE, }, [MOVE_SPARK] = @@ -5362,6 +5518,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_FuryCutter, + .validApprenticeMove = TRUE, }, [MOVE_STEEL_WING] = @@ -5389,6 +5546,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SteelWing, + .validApprenticeMove = TRUE, }, [MOVE_MEAN_LOOK] = @@ -5413,6 +5571,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_MEAN_LOOK, .contestComboMoves = {COMBO_STARTER_CURSE}, .battleAnimScript = gBattleAnimMove_MeanLook, + .validApprenticeMove = TRUE, }, [MOVE_ATTRACT] = @@ -5437,6 +5596,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Attract, + .validApprenticeMove = TRUE, }, [MOVE_SLEEP_TALK] = @@ -5468,6 +5628,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_REST}, .battleAnimScript = gBattleAnimMove_SleepTalk, + .validApprenticeMove = TRUE, }, [MOVE_HEAL_BELL] = @@ -5495,6 +5656,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_HEAL_BELL, .contestComboMoves = {COMBO_STARTER_LUCKY_CHANT}, .battleAnimScript = gBattleAnimMove_HealBell, + .validApprenticeMove = TRUE, }, [MOVE_RETURN] = @@ -5517,6 +5679,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Return, + .validApprenticeMove = TRUE, }, [MOVE_PRESENT] = @@ -5539,6 +5702,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Present, + .validApprenticeMove = TRUE, }, [MOVE_FRUSTRATION] = @@ -5561,6 +5725,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Frustration, + .validApprenticeMove = TRUE, }, [MOVE_SAFEGUARD] = @@ -5586,6 +5751,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Safeguard, + .validApprenticeMove = TRUE, }, [MOVE_PAIN_SPLIT] = @@ -5608,6 +5774,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ENDURE}, .battleAnimScript = gBattleAnimMove_PainSplit, + .validApprenticeMove = TRUE, }, [MOVE_SACRED_FIRE] = @@ -5634,6 +5801,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_SacredFire, + .validApprenticeMove = TRUE, }, [MOVE_MAGNITUDE] = @@ -5684,6 +5852,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_DynamicPunch, + .validApprenticeMove = TRUE, }, [MOVE_MEGAHORN] = @@ -5706,6 +5875,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Megahorn, + .validApprenticeMove = TRUE, }, [MOVE_DRAGON_BREATH] = @@ -5732,6 +5902,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_DRAGON_BREATH, .contestComboMoves = {COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, .battleAnimScript = gBattleAnimMove_DragonBreath, + .validApprenticeMove = TRUE, }, [MOVE_BATON_PASS] = @@ -5756,6 +5927,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BatonPass, + .validApprenticeMove = TRUE, }, [MOVE_ENCORE] = @@ -5781,6 +5953,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Encore, + .validApprenticeMove = TRUE, }, [MOVE_PURSUIT] = @@ -5804,6 +5977,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Pursuit, + .validApprenticeMove = TRUE, }, [MOVE_RAPID_SPIN] = @@ -5835,6 +6009,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RapidSpin, + .validApprenticeMove = TRUE, }, [MOVE_SWEET_SCENT] = @@ -5858,6 +6033,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_SWEET_SCENT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SweetScent, + .validApprenticeMove = TRUE, }, [MOVE_IRON_TAIL] = @@ -5884,6 +6060,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_IronTail, + .validApprenticeMove = TRUE, }, [MOVE_METAL_CLAW] = @@ -5911,6 +6088,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_METAL_SOUND}, .battleAnimScript = gBattleAnimMove_MetalClaw, + .validApprenticeMove = TRUE, }, [MOVE_VITAL_THROW] = @@ -5933,6 +6111,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, .battleAnimScript = gBattleAnimMove_VitalThrow, + .validApprenticeMove = TRUE, }, [MOVE_MORNING_SUN] = @@ -5959,6 +6138,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_MorningSun, + .validApprenticeMove = TRUE, }, [MOVE_SYNTHESIS] = @@ -5985,6 +6165,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Synthesis, + .validApprenticeMove = TRUE, }, [MOVE_MOONLIGHT] = @@ -6011,6 +6192,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Moonlight, + .validApprenticeMove = TRUE, }, [MOVE_HIDDEN_POWER] = @@ -6032,6 +6214,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HiddenPower, + .validApprenticeMove = TRUE, }, [MOVE_CROSS_CHOP] = @@ -6055,6 +6238,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_CrossChop, + .validApprenticeMove = TRUE, }, [MOVE_TWISTER] = @@ -6106,6 +6290,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_RAIN_DANCE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RainDance, + .validApprenticeMove = TRUE, }, [MOVE_SUNNY_DAY] = @@ -6130,6 +6315,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_SUNNY_DAY, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SunnyDay, + .validApprenticeMove = TRUE, }, [MOVE_CRUNCH] = @@ -6165,6 +6351,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SCARY_FACE}, .battleAnimScript = gBattleAnimMove_Crunch, + .validApprenticeMove = TRUE, }, [MOVE_MIRROR_COAT] = @@ -6190,6 +6377,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_TAUNT}, .battleAnimScript = gBattleAnimMove_MirrorCoat, + .validApprenticeMove = TRUE, }, [MOVE_PSYCH_UP] = @@ -6216,6 +6404,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PsychUp, + .validApprenticeMove = TRUE, }, [MOVE_EXTREME_SPEED] = @@ -6238,6 +6427,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ExtremeSpeed, + .validApprenticeMove = TRUE, }, [MOVE_ANCIENT_POWER] = @@ -6265,6 +6455,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_AncientPower, + .validApprenticeMove = TRUE, }, [MOVE_SHADOW_BALL] = @@ -6291,6 +6482,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ShadowBall, + .validApprenticeMove = TRUE, }, [MOVE_FUTURE_SIGHT] = @@ -6320,6 +6512,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_CONFUSION, COMBO_STARTER_KINESIS, COMBO_STARTER_PSYCHIC}, .battleAnimScript = gBattleAnimMove_FutureSight, + .validApprenticeMove = TRUE, }, [MOVE_ROCK_SMASH] = @@ -6346,6 +6539,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RockSmash, + .validApprenticeMove = TRUE, }, [MOVE_WHIRLPOOL] = @@ -6371,6 +6565,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Whirlpool, + .validApprenticeMove = TRUE, }, [MOVE_BEAT_UP] = @@ -6392,6 +6587,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BeatUp, + .validApprenticeMove = TRUE, }, [MOVE_FAKE_OUT] = @@ -6418,6 +6614,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_FAKE_OUT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FakeOut, + .validApprenticeMove = TRUE, }, [MOVE_UPROAR] = @@ -6451,6 +6648,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Uproar, + .validApprenticeMove = TRUE, }, [MOVE_STOCKPILE] = @@ -6476,6 +6674,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_STOCKPILE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Stockpile, + .validApprenticeMove = TRUE, }, [MOVE_SPIT_UP] = @@ -6498,6 +6697,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_STOCKPILE}, .battleAnimScript = gBattleAnimMove_SpitUp, + .validApprenticeMove = TRUE, }, [MOVE_SWALLOW] = @@ -6524,6 +6724,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_STOCKPILE}, .battleAnimScript = gBattleAnimMove_Swallow, + .validApprenticeMove = TRUE, }, [MOVE_HEAT_WAVE] = @@ -6550,6 +6751,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_HeatWave, + .validApprenticeMove = TRUE, }, [MOVE_HAIL] = @@ -6574,6 +6776,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_HAIL, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Hail, + .validApprenticeMove = TRUE, }, [MOVE_TORMENT] = @@ -6597,6 +6800,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Torment, + .validApprenticeMove = TRUE, }, [MOVE_FLATTER] = @@ -6620,6 +6824,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARM}, .battleAnimScript = gBattleAnimMove_Flatter, + .validApprenticeMove = TRUE, }, [MOVE_WILL_O_WISP] = @@ -6643,6 +6848,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_WillOWisp, + .validApprenticeMove = TRUE, }, [MOVE_MEMENTO] = @@ -6665,6 +6871,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Memento, + .validApprenticeMove = TRUE, }, [MOVE_FACADE] = @@ -6687,6 +6894,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Facade, + .validApprenticeMove = TRUE, }, [MOVE_FOCUS_PUNCH] = @@ -6717,6 +6925,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_FocusPunch, + .validApprenticeMove = TRUE, }, [MOVE_SMELLING_SALTS] = @@ -6733,7 +6942,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = STATUS1_PARALYSIS, + .argument = { .status = STATUS1_PARALYSIS }, .makesContact = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REMOVE_STATUS, @@ -6743,6 +6952,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SmellingSalts, + .validApprenticeMove = TRUE, }, [MOVE_FOLLOW_ME] = @@ -6770,6 +6980,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FollowMe, + .validApprenticeMove = TRUE, }, [MOVE_NATURE_POWER] = @@ -6798,6 +7009,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_NaturePower, + .validApprenticeMove = TRUE, }, [MOVE_CHARGE] = @@ -6823,6 +7035,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_CHARGE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Charge, + .validApprenticeMove = TRUE, }, [MOVE_TAUNT] = @@ -6847,6 +7060,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_TAUNT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Taunt, + .validApprenticeMove = TRUE, }, [MOVE_HELPING_HAND] = @@ -6875,6 +7089,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HelpingHand, + .validApprenticeMove = TRUE, }, [MOVE_TRICK] = @@ -6900,6 +7115,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Trick, + .validApprenticeMove = TRUE, }, [MOVE_ROLE_PLAY] = @@ -6925,6 +7141,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RolePlay, + .validApprenticeMove = TRUE, }, [MOVE_WISH] = @@ -6951,6 +7168,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Wish, + .validApprenticeMove = TRUE, }, [MOVE_ASSIST] = @@ -6981,6 +7199,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Assist, + .validApprenticeMove = TRUE, }, [MOVE_INGRAIN] = @@ -7007,6 +7226,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Ingrain, + .validApprenticeMove = TRUE, }, [MOVE_SUPERPOWER] = @@ -7033,6 +7253,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_LOCK_ON, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_Superpower, + .validApprenticeMove = TRUE, }, [MOVE_MAGIC_COAT] = @@ -7057,6 +7278,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MagicCoat, + .validApprenticeMove = TRUE, }, [MOVE_RECYCLE] = @@ -7082,6 +7304,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Recycle, + .validApprenticeMove = TRUE, }, [MOVE_REVENGE] = @@ -7102,6 +7325,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_REVENGE, .contestComboMoves = {COMBO_STARTER_PAYBACK}, .battleAnimScript = gBattleAnimMove_Revenge, + .validApprenticeMove = TRUE, }, [MOVE_BRICK_BREAK] = @@ -7124,6 +7348,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_BrickBreak, + .validApprenticeMove = TRUE, }, [MOVE_YAWN] = @@ -7147,6 +7372,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_YAWN, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Yawn, + .validApprenticeMove = TRUE, }, [MOVE_KNOCK_OFF] = @@ -7172,6 +7398,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, .battleAnimScript = gBattleAnimMove_KnockOff, + .validApprenticeMove = TRUE, }, [MOVE_ENDEAVOR] = @@ -7195,6 +7422,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ENDURE}, .battleAnimScript = gBattleAnimMove_Endeavor, + .validApprenticeMove = TRUE, }, [MOVE_ERUPTION] = @@ -7216,6 +7444,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_EARTHQUAKE, COMBO_STARTER_ENDURE, COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Eruption, + .validApprenticeMove = TRUE, }, [MOVE_SKILL_SWAP] = @@ -7239,6 +7468,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SkillSwap, + .validApprenticeMove = TRUE, }, [MOVE_IMPRISON] = @@ -7266,6 +7496,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Imprison, + .validApprenticeMove = TRUE, }, [MOVE_REFRESH] = @@ -7291,6 +7522,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SING, COMBO_STARTER_WATER_SPORT}, .battleAnimScript = gBattleAnimMove_Refresh, + .validApprenticeMove = TRUE, }, [MOVE_GRUDGE] = @@ -7316,6 +7548,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CURSE}, .battleAnimScript = gBattleAnimMove_Grudge, + .validApprenticeMove = TRUE, }, [MOVE_SNATCH] = @@ -7343,6 +7576,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Snatch, + .validApprenticeMove = TRUE, }, [MOVE_SECRET_POWER] = @@ -7368,6 +7602,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SecretPower, + .validApprenticeMove = TRUE, }, [MOVE_DIVE] = @@ -7389,12 +7624,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .instructBanned = TRUE, .assistBanned = TRUE, .skyBattleBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_PKMNHIDUNDERWATER, COMPRESS_BITS(STATUS3_UNDERWATER)), + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNHIDUNDERWATER, .status = COMPRESS_BITS(STATUS3_UNDERWATER) }, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_DIVE, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SURF}, .battleAnimScript = gBattleAnimMove_Dive, + .validApprenticeMove = TRUE, }, [MOVE_ARM_THRUST] = @@ -7442,6 +7678,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Camouflage, + .validApprenticeMove = TRUE, }, [MOVE_TAIL_GLOW] = @@ -7467,6 +7704,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_TailGlow, + .validApprenticeMove = TRUE, }, [MOVE_LUSTER_PURGE] = @@ -7492,6 +7730,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_LusterPurge, + .validApprenticeMove = TRUE, }, [MOVE_MIST_BALL] = @@ -7518,6 +7757,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_MistBall, + .validApprenticeMove = TRUE, }, [MOVE_FEATHER_DANCE] = @@ -7542,6 +7782,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FeatherDance, + .validApprenticeMove = TRUE, }, [MOVE_TEETER_DANCE] = @@ -7566,6 +7807,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_TeeterDance, + .validApprenticeMove = TRUE, }, [MOVE_BLAZE_KICK] = @@ -7593,6 +7835,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_BlazeKick, + .validApprenticeMove = TRUE, }, [MOVE_MUD_SPORT] = @@ -7618,6 +7861,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_MUD_SPORT, .contestComboMoves = {COMBO_STARTER_MUD_SLAP, COMBO_STARTER_SANDSTORM, COMBO_STARTER_WATER_SPORT}, .battleAnimScript = gBattleAnimMove_MudSport, + .validApprenticeMove = TRUE, }, [MOVE_ICE_BALL] = @@ -7670,6 +7914,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_NeedleArm, + .validApprenticeMove = TRUE, }, [MOVE_SLACK_OFF] = @@ -7696,6 +7941,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SlackOff, + .validApprenticeMove = TRUE, }, [MOVE_HYPER_VOICE] = @@ -7719,6 +7965,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HyperVoice, + .validApprenticeMove = TRUE, }, [MOVE_POISON_FANG] = @@ -7772,6 +8019,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SWORDS_DANCE}, .battleAnimScript = gBattleAnimMove_CrushClaw, + .validApprenticeMove = TRUE, }, [MOVE_BLAST_BURN] = @@ -7797,6 +8045,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_BlastBurn, + .validApprenticeMove = TRUE, }, [MOVE_HYDRO_CANNON] = @@ -7822,6 +8071,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_HydroCannon, + .validApprenticeMove = TRUE, }, [MOVE_METEOR_MASH] = @@ -7850,6 +8100,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MeteorMash, + .validApprenticeMove = TRUE, }, [MOVE_ASTONISH] = @@ -7877,6 +8128,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Astonish, + .validApprenticeMove = TRUE, }, [MOVE_WEATHER_BALL] = @@ -7900,6 +8152,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SANDSTORM, COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_WeatherBall, + .validApprenticeMove = TRUE, }, [MOVE_AROMATHERAPY] = @@ -7925,6 +8178,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Aromatherapy, + .validApprenticeMove = TRUE, }, [MOVE_FAKE_TEARS] = @@ -7948,6 +8202,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_FakeTears, + .validApprenticeMove = TRUE, }, [MOVE_AIR_CUTTER] = @@ -7972,6 +8227,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_AirCutter, + .validApprenticeMove = TRUE, }, [MOVE_OVERHEAT] = @@ -7998,6 +8254,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Overheat, + .validApprenticeMove = TRUE, }, [MOVE_ODOR_SLEUTH] = @@ -8022,6 +8279,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_OdorSleuth, + .validApprenticeMove = TRUE, }, [MOVE_ROCK_TOMB] = @@ -8047,6 +8305,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_ROCK_THROW}, .battleAnimScript = gBattleAnimMove_RockTomb, + .validApprenticeMove = TRUE, }, [MOVE_SILVER_WIND] = @@ -8074,6 +8333,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SilverWind, + .validApprenticeMove = TRUE, }, [MOVE_METAL_SOUND] = @@ -8099,6 +8359,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_METAL_SOUND, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_MetalSound, + .validApprenticeMove = TRUE, }, [MOVE_GRASS_WHISTLE] = @@ -8124,6 +8385,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GrassWhistle, + .validApprenticeMove = TRUE, }, [MOVE_TICKLE] = @@ -8147,6 +8409,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Tickle, + .validApprenticeMove = TRUE, }, [MOVE_COSMIC_POWER] = @@ -8172,6 +8435,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_CosmicPower, + .validApprenticeMove = TRUE, }, [MOVE_WATER_SPOUT] = @@ -8193,6 +8457,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_WaterSpout, + .validApprenticeMove = TRUE, }, [MOVE_SIGNAL_BEAM] = @@ -8218,6 +8483,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_SignalBeam, + .validApprenticeMove = TRUE, }, [MOVE_SHADOW_PUNCH] = @@ -8241,6 +8507,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ShadowPunch, + .validApprenticeMove = TRUE, }, [MOVE_EXTRASENSORY] = @@ -8267,6 +8534,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Extrasensory, + .validApprenticeMove = TRUE, }, [MOVE_SKY_UPPERCUT] = @@ -8291,6 +8559,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_SkyUppercut, + .validApprenticeMove = TRUE, }, [MOVE_SAND_TOMB] = @@ -8315,6 +8584,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_SANDSTORM}, .battleAnimScript = gBattleAnimMove_SandTomb, + .validApprenticeMove = TRUE, }, [MOVE_SHEER_COLD] = @@ -8336,6 +8606,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_MIND_READER}, .battleAnimScript = gBattleAnimMove_SheerCold, + .validApprenticeMove = TRUE, }, [MOVE_MUDDY_WATER] = @@ -8362,6 +8633,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_MuddyWater, + .validApprenticeMove = TRUE, }, [MOVE_BULLET_SEED] = @@ -8407,6 +8679,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_AerialAce, + .validApprenticeMove = TRUE, }, [MOVE_ICICLE_SPEAR] = @@ -8453,6 +8726,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_IronDefense, + .validApprenticeMove = TRUE, }, [MOVE_BLOCK] = @@ -8477,6 +8751,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Block, + .validApprenticeMove = TRUE, }, [MOVE_HOWL] = @@ -8503,6 +8778,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Howl, + .validApprenticeMove = TRUE, }, [MOVE_DRAGON_CLAW] = @@ -8525,6 +8801,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, .battleAnimScript = gBattleAnimMove_DragonClaw, + .validApprenticeMove = TRUE, }, [MOVE_FRENZY_PLANT] = @@ -8551,6 +8828,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_FrenzyPlant, + .validApprenticeMove = TRUE, }, [MOVE_BULK_UP] = @@ -8576,6 +8854,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_BulkUp, + .validApprenticeMove = TRUE, }, [MOVE_BOUNCE] = @@ -8597,7 +8876,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_PKMNSPRANGUP, COMPRESS_BITS(STATUS3_ON_AIR)), + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNSPRANGUP, .status = COMPRESS_BITS(STATUS3_ON_AIR) }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, @@ -8607,6 +8886,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Bounce, + .validApprenticeMove = TRUE, }, [MOVE_MUD_SHOT] = @@ -8659,6 +8939,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PoisonTail, + .validApprenticeMove = TRUE, }, [MOVE_COVET] = @@ -8688,6 +8969,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Covet, + .validApprenticeMove = TRUE, }, [MOVE_VOLT_TACKLE] = @@ -8717,6 +8999,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_VoltTackle, + .validApprenticeMove = TRUE, }, [MOVE_MAGICAL_LEAF] = @@ -8738,6 +9021,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_GROWTH}, .battleAnimScript = gBattleAnimMove_MagicalLeaf, + .validApprenticeMove = TRUE, }, [MOVE_WATER_SPORT] = @@ -8763,6 +9047,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_WATER_SPORT, .contestComboMoves = {COMBO_STARTER_MUD_SPORT, COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_WaterSport, + .validApprenticeMove = TRUE, }, [MOVE_CALM_MIND] = @@ -8788,6 +9073,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_CALM_MIND, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_CalmMind, + .validApprenticeMove = TRUE, }, [MOVE_LEAF_BLADE] = @@ -8812,6 +9098,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LeafBlade, + .validApprenticeMove = TRUE, }, [MOVE_DRAGON_DANCE] = @@ -8838,6 +9125,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = COMBO_STARTER_DRAGON_DANCE, .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, .battleAnimScript = gBattleAnimMove_DragonDance, + .validApprenticeMove = TRUE, }, [MOVE_ROCK_BLAST] = @@ -8881,6 +9169,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_ShockWave, + .validApprenticeMove = TRUE, }, [MOVE_WATER_PULSE] = @@ -8907,6 +9196,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_WaterPulse, + .validApprenticeMove = TRUE, }, [MOVE_DOOM_DESIRE] = @@ -8930,6 +9220,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DoomDesire, + .validApprenticeMove = TRUE, }, [MOVE_PSYCHO_BOOST] = @@ -8955,6 +9246,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboStarterId = 0, .contestComboMoves = {COMBO_STARTER_CALM_MIND}, .battleAnimScript = gBattleAnimMove_PsychoBoost, + .validApprenticeMove = TRUE, }, [MOVE_ROOST] = @@ -9046,7 +9338,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = STATUS1_SLEEP, + .argument = { .status = STATUS1_SLEEP }, .makesContact = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REMOVE_STATUS, @@ -10266,7 +10558,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = 50, + .argument = { .absorbPercentage = 50 }, .makesContact = TRUE, .punchingMove = TRUE, .healingMove = B_HEAL_BLOCKING >= GEN_6, @@ -11270,7 +11562,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = HOLD_EFFECT_PLATE, + .argument = { .holdEffect = HOLD_EFFECT_PLATE }, .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, @@ -11700,7 +11992,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_VANISHEDINSTANTLY, COMPRESS_BITS(STATUS3_PHANTOM_FORCE)), + .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = COMPRESS_BITS(STATUS3_PHANTOM_FORCE) }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FEINT, }), @@ -11750,7 +12042,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_USER, .priority = 3, .category = DAMAGE_CATEGORY_STATUS, - .argument = TRUE, // Protects the whole side. + .argument = { .protect.side = TRUE, }, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, .snatchAffected = TRUE, .ignoresProtect = TRUE, @@ -11865,7 +12157,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = STATUS1_PSN_ANY, + .argument = { .status = STATUS1_PSN_ANY }, .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, @@ -12511,7 +12803,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_USER, .priority = 3, .category = DAMAGE_CATEGORY_STATUS, - .argument = TRUE, // Protects the whole side. + .argument = { .protect.side = TRUE, }, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, .snatchAffected = TRUE, .ignoresProtect = TRUE, @@ -12640,7 +12932,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .zMove = { .powerOverride = 160 }, - .argument = STATUS1_ANY, + .argument = { .status = STATUS1_ANY }, .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, @@ -12667,7 +12959,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_PKMNTOOKTARGETHIGH, COMPRESS_BITS(STATUS3_ON_AIR)), + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKTARGETHIGH, .status = COMPRESS_BITS(STATUS3_ON_AIR) }, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, @@ -13247,7 +13539,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = 50, + .argument = { .absorbPercentage = 50 }, .makesContact = TRUE, .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, @@ -13582,7 +13874,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = HOLD_EFFECT_DRIVE, + .argument = { .holdEffect = HOLD_EFFECT_DRIVE }, .metronomeBanned = TRUE, .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_COOL, @@ -13605,7 +13897,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = STATUS1_SLEEP, + .argument = { .status = STATUS1_SLEEP }, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, .metronomeBanned = TRUE, @@ -13763,7 +14055,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_CLOAKEDINAFREEZINGLIGHT), + .argument.twoTurnAttack = { .stringId = STRINGID_CLOAKEDINAFREEZINGLIGHT }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, @@ -13792,7 +14084,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_CLOAKEDINAFREEZINGLIGHT), + .argument.twoTurnAttack = { .stringId = STRINGID_CLOAKEDINAFREEZINGLIGHT }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_BURN, .chance = 30, @@ -13943,7 +14235,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .zMove = { .powerOverride = 170 }, - .argument = TYPE_FLYING, + .argument = { .type = TYPE_FLYING }, .makesContact = TRUE, .minimizeDoubleDamage = TRUE, .gravityBanned = TRUE, @@ -13969,7 +14261,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, - .argument = TRUE, // Protects the whole side. + .argument = { .protect.side = TRUE }, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, .snatchAffected = TRUE, .ignoresProtect = TRUE, @@ -14105,7 +14397,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_VANISHEDINSTANTLY, COMPRESS_BITS(STATUS3_PHANTOM_FORCE)), + .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = COMPRESS_BITS(STATUS3_PHANTOM_FORCE) }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FEINT, }), @@ -14130,7 +14422,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, - .argument = TYPE_GHOST, + .argument = { .type = TYPE_GHOST }, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, @@ -14203,7 +14495,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = 50, + .argument = { .absorbPercentage = 50 }, .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -14226,7 +14518,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, - .argument = TYPE_GRASS, + .argument = { .type = TYPE_GRASS }, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, @@ -14276,7 +14568,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = TYPE_WATER, + .argument = { .type = TYPE_WATER }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, .chance = 10, @@ -14371,7 +14663,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = 75, // restores 75% HP instead of 50% HP + .argument = { .absorbPercentage = 75 }, .makesContact = TRUE, .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, @@ -14395,7 +14687,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_USER, .priority = 3, .category = DAMAGE_CATEGORY_STATUS, - .argument = TRUE, // Protects the whole side. + .argument = { .protect.side = TRUE, }, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, @@ -14967,7 +15259,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .skyBattleBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_PKNMABSORBINGPOWER), + .argument.twoTurnAttack = { .stringId = STRINGID_PKNMABSORBINGPOWER }, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, @@ -15007,7 +15299,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Doubles the amount of\n" "Prize Money received."), - .effect = EFFECT_DO_NOTHING, + .effect = EFFECT_HAPPY_HOUR, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -15077,7 +15369,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Congratulates you on your\n" "special day."), - .effect = EFFECT_DO_NOTHING, + .effect = EFFECT_CELEBRATE, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -15107,7 +15399,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "The user and ally hold hands\n" "making them happy."), - .effect = EFFECT_DO_NOTHING, + .effect = EFFECT_HOLD_HANDS, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -15265,7 +15557,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = 75, // restores 75% HP instead of 50% HP + .argument = { .absorbPercentage = 75 }, .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_COOL, @@ -15507,7 +15799,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 2, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MOVE_FIRST_IMPRESSION, + .argument = { .moveProperty = MOVE_FIRST_IMPRESSION }, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, .contestCategory = CONTEST_CATEGORY_COOL, @@ -15605,7 +15897,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = STATUS1_BURN, + .argument = { .status = STATUS1_BURN }, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -15661,7 +15953,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, - .argument = MOVE_EFFECT_FLORAL_HEALING, + .argument = { .moveProperty = MOVE_EFFECT_FLORAL_HEALING }, .mirrorMoveBanned = TRUE, .healingMove = TRUE, .magicCoatAffected = TRUE, @@ -15736,7 +16028,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .slicingMove = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_PKMNTOOKSUNLIGHT, B_WEATHER_SUN), + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKSUNLIGHT, .status = B_WEATHER_SUN }, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, @@ -16053,7 +16345,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .thawsUser = TRUE, - .argument = TYPE_FIRE, + .argument = { .type = TYPE_FIRE }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REMOVE_ARG_TYPE, .self = TRUE, @@ -16714,7 +17006,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = HOLD_EFFECT_MEMORY, + .argument = { .holdEffect = HOLD_EFFECT_MEMORY }, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -16911,7 +17203,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = B_UPDATED_MOVE_DATA >= GEN_8 ? 100 : 50, // restores 100% HP instead of 50% HP + .argument = { .absorbPercentage = B_UPDATED_MOVE_DATA >= GEN_8 ? 100 : 50 }, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, .metronomeBanned = TRUE, .healingMove = B_HEAL_BLOCKING >= GEN_6, @@ -17071,7 +17363,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Wrap foe with whirlwind of\n" "scent. Heals party's status."), - .effect = EFFECT_SPARKLY_SWIRL, // Temprorary + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_8 ? 120 : 90, .type = TYPE_FAIRY, .accuracy = B_UPDATED_MOVE_DATA >= GEN_8 ? 85 : 100, @@ -17081,11 +17373,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, .metronomeBanned = TRUE, - // .additionalEffects = ADDITIONAL_EFFECTS({ - // .moveEffect = 0, // MOVE_EFFECT_AROMATHERAPY, Added 0 for Sheer Force boost - // .chance = 100, - // .sheerForceBoost = SHEER_FORCE_NO_BOOST, - // }), + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_AROMATHERAPY, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), .battleAnimScript = gBattleAnimMove_SparklySwirl, }, @@ -17301,7 +17593,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, - .argument = TYPE_PSYCHIC, + .argument = { .type = TYPE_PSYCHIC }, .magicCoatAffected = TRUE, .powderMove = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, @@ -18047,7 +18339,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .argument = ARG_TRY_REMOVE_TERRAIN_FAIL, // Remove a field terrain if there is one and hit, otherwise fail. + .argument = { .moveProperty = ARG_TRY_REMOVE_TERRAIN_FAIL }, // Remove a field terrain if there is one and hit, otherwise fail. .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -18070,7 +18362,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MOVE_EFFECT_SCALE_SHOT, + .argument = { .moveProperty = MOVE_EFFECT_SCALE_SHOT }, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, @@ -18093,7 +18385,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .instructBanned = TRUE, - .argument = TWO_TURN_ARG(STRINGID_METEORBEAMCHARGING), + .argument.twoTurnAttack = { .stringId = STRINGID_METEORBEAMCHARGING }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, .self = TRUE, @@ -19003,7 +19295,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = STATUS1_PSN_ANY, + .argument = { .status = STATUS1_PSN_ANY }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_POISON, .chance = 50, @@ -19115,7 +19407,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = STATUS1_ANY, + .argument = { .status = STATUS1_ANY }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_BURN, .chance = 30, @@ -19478,7 +19770,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .argument = ARG_TRY_REMOVE_TERRAIN_HIT, // Remove the active field terrain if there is one. + .argument = { .moveProperty = ARG_TRY_REMOVE_TERRAIN_HIT }, // Remove the active field terrain if there is one. .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, .battleAnimScript = gBattleAnimMove_IceSpinner, }, @@ -20061,7 +20353,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = 50, + .argument = { .absorbPercentage = 50 }, .makesContact = TRUE, .slicingMove = TRUE, .healingMove = TRUE, @@ -20084,7 +20376,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .metronomeBanned = TRUE, - .argument = TYPE_ELECTRIC, + .argument = { .type = TYPE_ELECTRIC }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REMOVE_ARG_TYPE, .self = TRUE, @@ -20363,7 +20655,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = 50, + .argument = { .absorbPercentage = 50 }, .thawsUser = TRUE, .metronomeBanned = TRUE, .healingMove = TRUE, @@ -20430,7 +20722,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = TWO_TURN_ARG(STRINGID_ELECTROSHOTCHARGING, B_WEATHER_RAIN), + .argument.twoTurnAttack = { .stringId = STRINGID_ELECTROSHOTCHARGING, .status = B_WEATHER_RAIN }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, .self = TRUE, @@ -21056,7 +21348,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = ARG_SET_PSYCHIC_TERRAIN, // Set Psychic Terrain. If there's a different field terrain active, overwrite it. + .argument = { .moveProperty = ARG_SET_PSYCHIC_TERRAIN }, // Set Psychic Terrain. If there's a different field terrain active, overwrite it. .battleAnimScript = gBattleAnimMove_GenesisSupernova, }, [MOVE_SINISTER_ARROW_RAID] = @@ -21113,7 +21405,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = ARG_TRY_REMOVE_TERRAIN_HIT, // Remove the active field terrain if there is one. + .argument = { .moveProperty = ARG_TRY_REMOVE_TERRAIN_HIT }, // Remove the active field terrain if there is one. .battleAnimScript = gBattleAnimMove_SplinteredStormshards, }, [MOVE_LETS_SNUGGLE_FOREVER] = @@ -21252,8 +21544,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_SUN, .battleAnimScript = gBattleAnimMove_MaxFlare, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SUN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_FLUTTERBY] = @@ -21268,8 +21564,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_LOWER_SP_ATK, .battleAnimScript = gBattleAnimMove_MaxFlutterby, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SP_ATK_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_LIGHTNING] = @@ -21284,8 +21584,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_ELECTRIC_TERRAIN, .battleAnimScript = gBattleAnimMove_MaxLightning, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ELECTRIC_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_STRIKE] = @@ -21300,8 +21604,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_LOWER_SPEED, .battleAnimScript = gBattleAnimMove_MaxStrike, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SPEED_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_KNUCKLE] = @@ -21316,8 +21624,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_RAISE_TEAM_ATTACK, .battleAnimScript = gBattleAnimMove_MaxKnuckle, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_ATTACK, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_PHANTASM] = @@ -21332,8 +21644,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_LOWER_DEFENSE, .battleAnimScript = gBattleAnimMove_MaxPhantasm, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_DEFENSE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_HAILSTORM] = @@ -21348,8 +21664,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_HAIL, .battleAnimScript = gBattleAnimMove_MaxHailstorm, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_HAIL, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_OOZE] = @@ -21364,8 +21684,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_RAISE_TEAM_SP_ATK, .battleAnimScript = gBattleAnimMove_MaxOoze, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_SP_ATK, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_GEYSER] = @@ -21380,8 +21704,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_RAIN, .battleAnimScript = gBattleAnimMove_MaxGeyser, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_AIRSTREAM] = @@ -21396,8 +21724,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_RAISE_TEAM_SPEED, .battleAnimScript = gBattleAnimMove_MaxAirstream, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_SPEED, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_STARFALL] = @@ -21412,8 +21744,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_MISTY_TERRAIN, .battleAnimScript = gBattleAnimMove_MaxStarfall, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_MISTY_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_WYRMWIND] = @@ -21428,8 +21764,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_LOWER_ATTACK, .battleAnimScript = gBattleAnimMove_MaxWyrmwind, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_ATTACK_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_MINDSTORM] = @@ -21444,8 +21784,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_PSYCHIC_TERRAIN, .battleAnimScript = gBattleAnimMove_MaxMindstorm, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PSYCHIC_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_ROCKFALL] = @@ -21460,8 +21804,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_SANDSTORM, .battleAnimScript = gBattleAnimMove_MaxRockfall, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SANDSTORM, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_QUAKE] = @@ -21476,9 +21824,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_RAISE_TEAM_SP_DEF, .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, .battleAnimScript = gBattleAnimMove_MaxQuake, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_SP_DEF, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_DARKNESS] = @@ -21493,8 +21845,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_LOWER_SP_DEF, .battleAnimScript = gBattleAnimMove_MaxDarkness, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SP_DEF_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_OVERGROWTH] = @@ -21509,8 +21865,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_GRASSY_TERRAIN, .battleAnimScript = gBattleAnimMove_MaxOvergrowth, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_GRASSY_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_STEELSPIKE] = @@ -21525,8 +21885,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_RAISE_TEAM_DEFENSE, .battleAnimScript = gBattleAnimMove_MaxSteelspike, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_DEFENSE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_VINE_LASH] = @@ -21541,8 +21905,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_VINE_LASH, .battleAnimScript = gBattleAnimMove_GMaxVineLash, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_VINE_LASH, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_WILDFIRE] = @@ -21557,13 +21925,17 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_WILDFIRE, .battleAnimScript = gBattleAnimMove_GMaxWildfire, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WILDFIRE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CANNONADE] = { - .name = COMPOUND_STRING("G-Max Canonade"), + .name = COMPOUND_STRING("G-Max Cannonade"), .description = sNullDescription, //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, @@ -21573,8 +21945,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_CANNONADE, .battleAnimScript = gBattleAnimMove_GMaxCannonade, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CANNONADE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_BEFUDDLE] = @@ -21589,8 +21965,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_EFFECT_SPORE_FOES, .battleAnimScript = gBattleAnimMove_GMaxBefuddle, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_EFFECT_SPORE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_VOLT_CRASH] = @@ -21605,8 +21985,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_PARALYZE_FOES, .battleAnimScript = gBattleAnimMove_GMaxVoltCrash, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYZE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_GOLD_RUSH] = @@ -21621,8 +22005,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_CONFUSE_FOES_PAY_DAY, .battleAnimScript = gBattleAnimMove_GMaxGoldRush, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CHI_STRIKE] = @@ -21637,8 +22025,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_CRIT_PLUS, .battleAnimScript = gBattleAnimMove_GMaxChiStrike, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CRIT_PLUS_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_TERROR] = @@ -21653,8 +22045,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_MEAN_LOOK, .battleAnimScript = gBattleAnimMove_GMaxTerror, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PREVENT_ESCAPE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_FOAM_BURST] = @@ -21669,8 +22065,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_LOWER_SPEED_2_FOES, .battleAnimScript = gBattleAnimMove_GMaxFoamBurst, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SPEED_2_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_RESONANCE] = @@ -21685,8 +22085,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_AURORA_VEIL, .battleAnimScript = gBattleAnimMove_GMaxResonance, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_AURORA_VEIL, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CUDDLE] = @@ -21701,8 +22105,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_INFATUATE_FOES, .battleAnimScript = gBattleAnimMove_GMaxCuddle, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_INFATUATE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_REPLENISH] = @@ -21717,8 +22125,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_RECYCLE_BERRIES, .battleAnimScript = gBattleAnimMove_GMaxReplenish, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECYCLE_BERRIES, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_MALODOR] = @@ -21733,8 +22145,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_POISON_FOES, .battleAnimScript = gBattleAnimMove_GMaxMalodor, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_MELTDOWN] = @@ -21749,8 +22165,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_TORMENT_FOES, .battleAnimScript = gBattleAnimMove_GMaxMeltdown, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_TORMENT_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_DRUM_SOLO] = @@ -21765,9 +22185,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_FIXED_POWER, .ignoresTargetAbility = TRUE, .battleAnimScript = gBattleAnimMove_GMaxDrumSolo, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIXED_POWER, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_FIREBALL] = @@ -21782,9 +22206,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_FIXED_POWER, .ignoresTargetAbility = TRUE, .battleAnimScript = gBattleAnimMove_GMaxFireball, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIXED_POWER, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_HYDROSNIPE] = @@ -21799,9 +22227,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_FIXED_POWER, .ignoresTargetAbility = TRUE, .battleAnimScript = gBattleAnimMove_GMaxHydrosnipe, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIXED_POWER, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_WIND_RAGE] = @@ -21816,8 +22248,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_DEFOG, .battleAnimScript = gBattleAnimMove_GMaxWindRage, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEFOG, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_GRAVITAS] = @@ -21832,8 +22268,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_GRAVITY, .battleAnimScript = gBattleAnimMove_GMaxGravitas, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_GRAVITY, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_STONESURGE] = @@ -21848,8 +22288,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_STEALTH_ROCK, .battleAnimScript = gBattleAnimMove_GMaxStonesurge, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEALTH_ROCK, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_VOLCALITH] = @@ -21864,8 +22308,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_VOLCALITH, .battleAnimScript = gBattleAnimMove_GMaxVolcalith, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_VOLCALITH, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_TARTNESS] = @@ -21880,8 +22328,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_LOWER_EVASIVENESS_FOES, .battleAnimScript = gBattleAnimMove_GMaxTartness, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_EVASIVENESS_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_SWEETNESS] = @@ -21896,8 +22348,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_AROMATHERAPY, .battleAnimScript = gBattleAnimMove_GMaxSweetness, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_AROMATHERAPY, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_SANDBLAST] = @@ -21912,8 +22368,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_SANDBLAST_FOES, .battleAnimScript = gBattleAnimMove_GMaxSandblast, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SANDBLAST_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_STUN_SHOCK] = @@ -21928,8 +22388,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_POISON_PARALYZE_FOES, .battleAnimScript = gBattleAnimMove_GMaxStunShock, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON_PARALYZE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CENTIFERNO] = @@ -21944,8 +22408,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_FIRE_SPIN_FOES, .battleAnimScript = gBattleAnimMove_GMaxCentiferno, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIRE_SPIN_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_SMITE] = @@ -21960,8 +22428,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_CONFUSE_FOES, .battleAnimScript = gBattleAnimMove_GMaxSmite, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, @@ -21977,8 +22449,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_YAWN_FOE, .battleAnimScript = gBattleAnimMove_GMaxSnooze, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_YAWN_FOE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_FINALE] = @@ -21993,8 +22469,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_HEAL_TEAM, .battleAnimScript = gBattleAnimMove_GMaxFinale, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_HEAL_TEAM, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_STEELSURGE] = @@ -22009,8 +22489,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_STEELSURGE, .battleAnimScript = gBattleAnimMove_GMaxSteelsurge, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEELSURGE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_DEPLETION] = @@ -22025,8 +22509,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_SPITE, .battleAnimScript = gBattleAnimMove_GMaxDepletion, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPITE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_ONE_BLOW] = @@ -22041,14 +22529,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_BYPASS_PROTECT, + .ignoresProtect = TRUE, .battleAnimScript = gBattleAnimMove_GMaxOneBlow, }, [MOVE_G_MAX_RAPID_FLOW] = { .name = COMPOUND_STRING("G-Max Rapid Flow"), - .description = sNullDescription, //ANIM TODO + .description = sNullDescription, .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -22057,8 +22545,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = MAX_EFFECT_BYPASS_PROTECT, + .ignoresProtect = TRUE, .battleAnimScript = gBattleAnimMove_GMaxRapidFlow, }, - }; diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 1f08b77599..577263e77b 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -454,3 +454,6 @@ const u16 gObjectEventPal_BeastBall[] = INCBIN_U16("graphics/object_events/pics/ const u16 gObjectEventPal_StrangeBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_strange.gbapal"); #endif //ITEM_STRANGE_BALL #endif //OW_FOLLOWERS_POKEBALLS + +const u32 gFieldEffectObjectPic_CaveDust[] = INCBIN_U32("graphics/field_effects/pics/cave_dust.4bpp"); +const u16 gFieldEffectObjectPalette_CaveDust[] = INCBIN_U16("graphics/field_effects/palettes/cave_dust.gbapal"); diff --git a/src/data/object_events/object_event_pic_tables_followers.h b/src/data/object_events/object_event_pic_tables_followers.h index 07193cedc7..d77010c0c0 100644 --- a/src/data/object_events/object_event_pic_tables_followers.h +++ b/src/data/object_events/object_event_pic_tables_followers.h @@ -19,9 +19,9 @@ static const struct SpriteFrameImage sPicTable_VenusaurF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_VenusaurMega[] = { +static const struct SpriteFrameImage sPicTable_VenusaurMega[] = { overworld_ascending_frames(gObjectEventPic_VenusaurMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS /*static const struct SpriteFrameImage sPicTable_VenusaurGmax[] = { @@ -41,12 +41,12 @@ static const struct SpriteFrameImage sPicTable_Charizard[] = { overworld_ascending_frames(gObjectEventPic_Charizard, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_CharizardMegaX[] = { +static const struct SpriteFrameImage sPicTable_CharizardMegaX[] = { overworld_ascending_frames(gObjectEventPic_CharizardMegaX, 4, 4), }; static const struct SpriteFrameImage sPicTable_CharizardMegaY[] = { overworld_ascending_frames(gObjectEventPic_CharizardMegaY, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS /*static const struct SpriteFrameImage sPicTable_CharizardGmax[] = { @@ -66,9 +66,9 @@ static const struct SpriteFrameImage sPicTable_Blastoise[] = { overworld_ascending_frames(gObjectEventPic_Blastoise, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_BlastoiseMega[] = { +static const struct SpriteFrameImage sPicTable_BlastoiseMega[] = { overworld_ascending_frames(gObjectEventPic_BlastoiseMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS /*static const struct SpriteFrameImage sPicTable_BlastoiseGmax[] = { @@ -110,9 +110,9 @@ static const struct SpriteFrameImage sPicTable_Beedrill[] = { overworld_ascending_frames(gObjectEventPic_Beedrill, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_BeedrillMega[] = { +static const struct SpriteFrameImage sPicTable_BeedrillMega[] = { overworld_ascending_frames(gObjectEventPic_BeedrillMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_WEEDLE @@ -127,9 +127,9 @@ static const struct SpriteFrameImage sPicTable_Pidgeot[] = { overworld_ascending_frames(gObjectEventPic_Pidgeot, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_PidgeotMega[] = { +static const struct SpriteFrameImage sPicTable_PidgeotMega[] = { overworld_ascending_frames(gObjectEventPic_PidgeotMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_PIDGEY @@ -548,9 +548,9 @@ static const struct SpriteFrameImage sPicTable_AlakazamF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_AlakazamMega[] = { +static const struct SpriteFrameImage sPicTable_AlakazamMega[] = { overworld_ascending_frames(gObjectEventPic_AlakazamMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_ABRA @@ -646,9 +646,9 @@ static const struct SpriteFrameImage sPicTable_Slowking[] = { #endif //P_GEN_2_CROSS_EVOS #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_SlowbroMega[] = { +static const struct SpriteFrameImage sPicTable_SlowbroMega[] = { overworld_ascending_frames(gObjectEventPic_SlowbroMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #if P_GALARIAN_FORMS @@ -759,9 +759,9 @@ static const struct SpriteFrameImage sPicTable_Gengar[] = { overworld_ascending_frames(gObjectEventPic_Gengar, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_GengarMega[] = { +static const struct SpriteFrameImage sPicTable_GengarMega[] = { overworld_ascending_frames(gObjectEventPic_GengarMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS /*static const struct SpriteFrameImage sPicTable_GengarGmax[] = { @@ -784,9 +784,9 @@ static const struct SpriteFrameImage sPicTable_SteelixF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_SteelixMega[] = { +static const struct SpriteFrameImage sPicTable_SteelixMega[] = { overworld_ascending_frames(gObjectEventPic_SteelixMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_GEN_2_CROSS_EVOS #endif //P_FAMILY_ONIX @@ -974,9 +974,9 @@ static const struct SpriteFrameImage sPicTable_Kangaskhan[] = { overworld_ascending_frames(gObjectEventPic_Kangaskhan, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_KangaskhanMega[] = { +static const struct SpriteFrameImage sPicTable_KangaskhanMega[] = { overworld_ascending_frames(gObjectEventPic_KangaskhanMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_KANGASKHAN @@ -1060,9 +1060,9 @@ static const struct SpriteFrameImage sPicTable_ScizorF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_ScizorMega[] = { +static const struct SpriteFrameImage sPicTable_ScizorMega[] = { overworld_ascending_frames(gObjectEventPic_ScizorMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_GEN_2_CROSS_EVOS @@ -1121,9 +1121,9 @@ static const struct SpriteFrameImage sPicTable_Pinsir[] = { overworld_ascending_frames(gObjectEventPic_Pinsir, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_PinsirMega[] = { +static const struct SpriteFrameImage sPicTable_PinsirMega[] = { overworld_ascending_frames(gObjectEventPic_PinsirMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_PINSIR @@ -1162,9 +1162,9 @@ static const struct SpriteFrameImage sPicTable_GyaradosF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_GyaradosMega[] = { +static const struct SpriteFrameImage sPicTable_GyaradosMega[] = { overworld_ascending_frames(gObjectEventPic_GyaradosMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MAGIKARP @@ -1273,9 +1273,9 @@ static const struct SpriteFrameImage sPicTable_Aerodactyl[] = { overworld_ascending_frames(gObjectEventPic_Aerodactyl, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_AerodactylMega[] = { +static const struct SpriteFrameImage sPicTable_AerodactylMega[] = { overworld_ascending_frames(gObjectEventPic_AerodactylMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_AERODACTYL @@ -1345,12 +1345,12 @@ static const struct SpriteFrameImage sPicTable_Mewtwo[] = { overworld_ascending_frames(gObjectEventPic_Mewtwo, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_MewtwoMegaX[] = { +static const struct SpriteFrameImage sPicTable_MewtwoMegaX[] = { overworld_ascending_frames(gObjectEventPic_MewtwoMegaX, 4, 4), }; static const struct SpriteFrameImage sPicTable_MewtwoMegaY[] = { overworld_ascending_frames(gObjectEventPic_MewtwoMegaY, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MEWTWO @@ -1500,9 +1500,9 @@ static const struct SpriteFrameImage sPicTable_Ampharos[] = { overworld_ascending_frames(gObjectEventPic_Ampharos, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_AmpharosMega[] = { +static const struct SpriteFrameImage sPicTable_AmpharosMega[] = { overworld_ascending_frames(gObjectEventPic_AmpharosMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MAREEP @@ -1842,9 +1842,9 @@ static const struct SpriteFrameImage sPicTable_HeracrossF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_HeracrossMega[] = { +static const struct SpriteFrameImage sPicTable_HeracrossMega[] = { overworld_ascending_frames(gObjectEventPic_HeracrossMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_HERACROSS @@ -2002,9 +2002,9 @@ static const struct SpriteFrameImage sPicTable_HoundoomF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_HoundoomMega[] = { +static const struct SpriteFrameImage sPicTable_HoundoomMega[] = { overworld_ascending_frames(gObjectEventPic_HoundoomMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_HOUNDOUR @@ -2074,9 +2074,9 @@ static const struct SpriteFrameImage sPicTable_Tyranitar[] = { overworld_ascending_frames(gObjectEventPic_Tyranitar, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_TyranitarMega[] = { +static const struct SpriteFrameImage sPicTable_TyranitarMega[] = { overworld_ascending_frames(gObjectEventPic_TyranitarMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_LARVITAR @@ -2109,9 +2109,9 @@ static const struct SpriteFrameImage sPicTable_Sceptile[] = { overworld_ascending_frames(gObjectEventPic_Sceptile, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_SceptileMega[] = { +static const struct SpriteFrameImage sPicTable_SceptileMega[] = { overworld_ascending_frames(gObjectEventPic_SceptileMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_TREECKO @@ -2141,9 +2141,9 @@ static const struct SpriteFrameImage sPicTable_BlazikenF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_BlazikenMega[] = { +static const struct SpriteFrameImage sPicTable_BlazikenMega[] = { overworld_ascending_frames(gObjectEventPic_BlazikenMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_TORCHIC @@ -2158,9 +2158,9 @@ static const struct SpriteFrameImage sPicTable_Swampert[] = { overworld_ascending_frames(gObjectEventPic_Swampert, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_SwampertMega[] = { +static const struct SpriteFrameImage sPicTable_SwampertMega[] = { overworld_ascending_frames(gObjectEventPic_SwampertMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MUDKIP @@ -2289,9 +2289,9 @@ static const struct SpriteFrameImage sPicTable_Gardevoir[] = { overworld_ascending_frames(gObjectEventPic_Gardevoir, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_GardevoirMega[] = { +static const struct SpriteFrameImage sPicTable_GardevoirMega[] = { overworld_ascending_frames(gObjectEventPic_GardevoirMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #if P_GEN_4_CROSS_EVOS @@ -2299,9 +2299,9 @@ static const struct SpriteFrameImage sPicTable_Gallade[] = { overworld_ascending_frames(gObjectEventPic_Gallade, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_GalladeMega[] = { +static const struct SpriteFrameImage sPicTable_GalladeMega[] = { overworld_ascending_frames(gObjectEventPic_GalladeMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_RALTS @@ -2394,9 +2394,9 @@ static const struct SpriteFrameImage sPicTable_Sableye[] = { overworld_ascending_frames(gObjectEventPic_Sableye, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_SableyeMega[] = { +static const struct SpriteFrameImage sPicTable_SableyeMega[] = { overworld_ascending_frames(gObjectEventPic_SableyeMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_SABLEYE @@ -2405,9 +2405,9 @@ static const struct SpriteFrameImage sPicTable_Mawile[] = { overworld_ascending_frames(gObjectEventPic_Mawile, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_MawileMega[] = { +static const struct SpriteFrameImage sPicTable_MawileMega[] = { overworld_ascending_frames(gObjectEventPic_MawileMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MAWILE @@ -2422,9 +2422,9 @@ static const struct SpriteFrameImage sPicTable_Aggron[] = { overworld_ascending_frames(gObjectEventPic_Aggron, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_AggronMega[] = { +static const struct SpriteFrameImage sPicTable_AggronMega[] = { overworld_ascending_frames(gObjectEventPic_AggronMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_ARON @@ -2446,9 +2446,9 @@ static const struct SpriteFrameImage sPicTable_MedichamF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_MedichamMega[] = { +static const struct SpriteFrameImage sPicTable_MedichamMega[] = { overworld_ascending_frames(gObjectEventPic_MedichamMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_MEDITITE @@ -2460,9 +2460,9 @@ static const struct SpriteFrameImage sPicTable_Manectric[] = { overworld_ascending_frames(gObjectEventPic_Manectric, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_ManectricMega[] = { +static const struct SpriteFrameImage sPicTable_ManectricMega[] = { overworld_ascending_frames(gObjectEventPic_ManectricMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_ELECTRIKE @@ -2540,9 +2540,9 @@ static const struct SpriteFrameImage sPicTable_Sharpedo[] = { overworld_ascending_frames(gObjectEventPic_Sharpedo, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_SharpedoMega[] = { +static const struct SpriteFrameImage sPicTable_SharpedoMega[] = { overworld_ascending_frames(gObjectEventPic_SharpedoMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_CARVANHA @@ -2573,9 +2573,9 @@ static const struct SpriteFrameImage sPicTable_CameruptF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_CameruptMega[] = { +static const struct SpriteFrameImage sPicTable_CameruptMega[] = { overworld_ascending_frames(gObjectEventPic_CameruptMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_NUMEL @@ -2634,9 +2634,9 @@ static const struct SpriteFrameImage sPicTable_Altaria[] = { overworld_ascending_frames(gObjectEventPic_Altaria, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_AltariaMega[] = { +static const struct SpriteFrameImage sPicTable_AltariaMega[] = { overworld_ascending_frames(gObjectEventPic_AltariaMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_SWABLU @@ -2752,9 +2752,9 @@ static const struct SpriteFrameImage sPicTable_Banette[] = { overworld_ascending_frames(gObjectEventPic_Banette, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_BanetteMega[] = { +static const struct SpriteFrameImage sPicTable_BanetteMega[] = { overworld_ascending_frames(gObjectEventPic_BanetteMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_SHUPPET @@ -2794,9 +2794,9 @@ static const struct SpriteFrameImage sPicTable_Absol[] = { overworld_ascending_frames(gObjectEventPic_Absol, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_AbsolMega[] = { +static const struct SpriteFrameImage sPicTable_AbsolMega[] = { overworld_ascending_frames(gObjectEventPic_AbsolMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_ABSOL @@ -2808,9 +2808,9 @@ static const struct SpriteFrameImage sPicTable_Glalie[] = { overworld_ascending_frames(gObjectEventPic_Glalie, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_GlalieMega[] = { +static const struct SpriteFrameImage sPicTable_GlalieMega[] = { overworld_ascending_frames(gObjectEventPic_GlalieMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #if P_GEN_4_CROSS_EVOS @@ -2872,9 +2872,9 @@ static const struct SpriteFrameImage sPicTable_Salamence[] = { overworld_ascending_frames(gObjectEventPic_Salamence, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_SalamenceMega[] = { +static const struct SpriteFrameImage sPicTable_SalamenceMega[] = { overworld_ascending_frames(gObjectEventPic_SalamenceMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_BAGON @@ -2889,9 +2889,9 @@ static const struct SpriteFrameImage sPicTable_Metagross[] = { overworld_ascending_frames(gObjectEventPic_Metagross, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_MetagrossMega[] = { +static const struct SpriteFrameImage sPicTable_MetagrossMega[] = { overworld_ascending_frames(gObjectEventPic_MetagrossMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_BELDUM @@ -2918,9 +2918,9 @@ static const struct SpriteFrameImage sPicTable_Latias[] = { overworld_ascending_frames(gObjectEventPic_Latias, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_LatiasMega[] = { +static const struct SpriteFrameImage sPicTable_LatiasMega[] = { overworld_ascending_frames(gObjectEventPic_LatiasMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_LATIAS @@ -2929,9 +2929,9 @@ static const struct SpriteFrameImage sPicTable_Latios[] = { overworld_ascending_frames(gObjectEventPic_Latios, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_LatiosMega[] = { +static const struct SpriteFrameImage sPicTable_LatiosMega[] = { overworld_ascending_frames(gObjectEventPic_LatiosMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_LATIOS @@ -2940,9 +2940,9 @@ static const struct SpriteFrameImage sPicTable_Kyogre[] = { overworld_ascending_frames(gObjectEventPic_Kyogre, 8, 8), }; #if P_PRIMAL_REVERSIONS -/*static const struct SpriteFrameImage sPicTable_KyogrePrimal[] = { +static const struct SpriteFrameImage sPicTable_KyogrePrimal[] = { overworld_ascending_frames(gObjectEventPic_KyogrePrimal, 4, 4), -};*/ +}; #endif //P_PRIMAL_REVERSIONS #endif //P_FAMILY_KYOGRE @@ -2951,9 +2951,9 @@ static const struct SpriteFrameImage sPicTable_Groudon[] = { overworld_ascending_frames(gObjectEventPic_Groudon, 8, 8), }; #if P_PRIMAL_REVERSIONS -/*static const struct SpriteFrameImage sPicTable_GroudonPrimal[] = { +static const struct SpriteFrameImage sPicTable_GroudonPrimal[] = { overworld_ascending_frames(gObjectEventPic_GroudonPrimal, 4, 4), -};*/ +}; #endif //P_PRIMAL_REVERSIONS #endif //P_FAMILY_GROUDON @@ -2962,9 +2962,9 @@ static const struct SpriteFrameImage sPicTable_Rayquaza[] = { overworld_ascending_frames(gObjectEventPic_Rayquaza, 8, 8), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_RayquazaMega[] = { +static const struct SpriteFrameImage sPicTable_RayquazaMega[] = { overworld_ascending_frames(gObjectEventPic_RayquazaMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_RAYQUAZA @@ -3247,9 +3247,9 @@ static const struct SpriteFrameImage sPicTable_Lopunny[] = { overworld_ascending_frames(gObjectEventPic_Lopunny, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_LopunnyMega[] = { +static const struct SpriteFrameImage sPicTable_LopunnyMega[] = { overworld_ascending_frames(gObjectEventPic_LopunnyMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_BUNEARY @@ -3318,9 +3318,9 @@ static const struct SpriteFrameImage sPicTable_GarchompF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_GarchompMega[] = { +static const struct SpriteFrameImage sPicTable_GarchompMega[] = { overworld_ascending_frames(gObjectEventPic_GarchompMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_GIBLE @@ -3332,9 +3332,9 @@ static const struct SpriteFrameImage sPicTable_Lucario[] = { overworld_ascending_frames(gObjectEventPic_Lucario, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_LucarioMega[] = { +static const struct SpriteFrameImage sPicTable_LucarioMega[] = { overworld_ascending_frames(gObjectEventPic_LucarioMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_RIOLU @@ -3423,9 +3423,9 @@ static const struct SpriteFrameImage sPicTable_AbomasnowF[] = { }; #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_AbomasnowMega[] = { +static const struct SpriteFrameImage sPicTable_AbomasnowMega[] = { overworld_ascending_frames(gObjectEventPic_AbomasnowMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_SNOVER @@ -3770,9 +3770,9 @@ static const struct SpriteFrameImage sPicTable_Audino[] = { overworld_ascending_frames(gObjectEventPic_Audino, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_AudinoMega[] = { +static const struct SpriteFrameImage sPicTable_AudinoMega[] = { overworld_ascending_frames(gObjectEventPic_AudinoMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_AUDINO @@ -4679,32 +4679,32 @@ static const struct SpriteFrameImage sPicTable_Pangoro[] = { static const struct SpriteFrameImage sPicTable_FurfrouNatural[] = { overworld_ascending_frames(gObjectEventPic_FurfrouNatural, 4, 4), }; -static const struct SpriteFrameImage sPicTable_FurfrouHeartTrim[] = { - overworld_ascending_frames(gObjectEventPic_FurfrouHeartTrim, 4, 4), +static const struct SpriteFrameImage sPicTable_FurfrouHeart[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouHeart, 4, 4), }; -static const struct SpriteFrameImage sPicTable_FurfrouStarTrim[] = { - overworld_ascending_frames(gObjectEventPic_FurfrouStarTrim, 4, 4), +static const struct SpriteFrameImage sPicTable_FurfrouStar[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouStar, 4, 4), }; -static const struct SpriteFrameImage sPicTable_FurfrouDiamondTrim[] = { - overworld_ascending_frames(gObjectEventPic_FurfrouDiamondTrim, 4, 4), +static const struct SpriteFrameImage sPicTable_FurfrouDiamond[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouDiamond, 4, 4), }; -static const struct SpriteFrameImage sPicTable_FurfrouDebutanteTrim[] = { - overworld_ascending_frames(gObjectEventPic_FurfrouDebutanteTrim, 4, 4), +static const struct SpriteFrameImage sPicTable_FurfrouDebutante[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouDebutante, 4, 4), }; -static const struct SpriteFrameImage sPicTable_FurfrouMatronTrim[] = { - overworld_ascending_frames(gObjectEventPic_FurfrouMatronTrim, 4, 4), +static const struct SpriteFrameImage sPicTable_FurfrouMatron[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouMatron, 4, 4), }; -static const struct SpriteFrameImage sPicTable_FurfrouDandyTrim[] = { - overworld_ascending_frames(gObjectEventPic_FurfrouDandyTrim, 4, 4), +static const struct SpriteFrameImage sPicTable_FurfrouDandy[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouDandy, 4, 4), }; -static const struct SpriteFrameImage sPicTable_FurfrouLaReineTrim[] = { - overworld_ascending_frames(gObjectEventPic_FurfrouLaReineTrim, 4, 4), +static const struct SpriteFrameImage sPicTable_FurfrouLaReine[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouLaReine, 4, 4), }; -static const struct SpriteFrameImage sPicTable_FurfrouKabukiTrim[] = { - overworld_ascending_frames(gObjectEventPic_FurfrouKabukiTrim, 4, 4), +static const struct SpriteFrameImage sPicTable_FurfrouKabuki[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouKabuki, 4, 4), }; -static const struct SpriteFrameImage sPicTable_FurfrouPharaohTrim[] = { - overworld_ascending_frames(gObjectEventPic_FurfrouPharaohTrim, 4, 4), +static const struct SpriteFrameImage sPicTable_FurfrouPharaoh[] = { + overworld_ascending_frames(gObjectEventPic_FurfrouPharaoh, 4, 4), }; #endif //P_FAMILY_FURFROU @@ -4960,9 +4960,9 @@ static const struct SpriteFrameImage sPicTable_Diancie[] = { overworld_ascending_frames(gObjectEventPic_Diancie, 4, 4), }; #if P_MEGA_EVOLUTIONS -/*static const struct SpriteFrameImage sPicTable_DiancieMega[] = { +static const struct SpriteFrameImage sPicTable_DiancieMega[] = { overworld_ascending_frames(gObjectEventPic_DiancieMega, 4, 4), -};*/ +}; #endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_DIANCIE @@ -5418,9 +5418,9 @@ static const struct SpriteFrameImage sPicTable_NecrozmaDawnWings[] = { overworld_ascending_frames(gObjectEventPic_NecrozmaDawnWings, 4, 4), }; #if P_ULTRA_BURST_FORMS -/*static const struct SpriteFrameImage sPicTable_NecrozmaUltra[] = { +static const struct SpriteFrameImage sPicTable_NecrozmaUltra[] = { overworld_ascending_frames(gObjectEventPic_NecrozmaUltra, 4, 4), -};*/ +}; #endif //P_ULTRA_BURST_FORMS #endif //P_FUSION_FORMS #endif //P_FAMILY_NECROZMA diff --git a/src/data/party_menu.h b/src/data/party_menu.h index 841cedca88..ec7026fcb5 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -659,6 +659,8 @@ static const u8 *const sActionStringTable[] = [PARTY_MSG_ALREADY_HOLDING_ONE] = gText_AlreadyHoldingOne, [PARTY_MSG_WHICH_APPLIANCE] = gText_WhichAppliance, [PARTY_MSG_CHOOSE_SECOND_FUSION] = gText_NextFusionMon, + [PARTY_MSG_NO_POKEMON] = COMPOUND_STRING("You have no POKéMON."), + [PARTY_MSG_CHOOSE_MON_FOR_BOX] = gText_SendWhichMonToPC, }; static const u8 *const sDescriptionStringTable[] = @@ -686,39 +688,41 @@ static const u16 sUnusedData[] = 0x0121, 0x013b, 0x000f, 0x0013, 0x0039, 0x0046, 0x0094, 0x00f9, 0x007f, 0x0123, }; +static const u8 sText_Trade4[] = _("TRADE"); + struct { const u8 *text; TaskFunc func; } static const sCursorOptions[MENU_FIELD_MOVES] = { - [MENU_SUMMARY] = {gText_Summary5, CursorCb_Summary}, - [MENU_SWITCH] = {gText_Switch2, CursorCb_Switch}, + [MENU_SUMMARY] = {COMPOUND_STRING("SUMMARY"), CursorCb_Summary}, + [MENU_SWITCH] = {COMPOUND_STRING("SWITCH"), CursorCb_Switch}, [MENU_CANCEL1] = {gText_Cancel2, CursorCb_Cancel1}, - [MENU_ITEM] = {gText_Item, CursorCb_Item}, + [MENU_ITEM] = {COMPOUND_STRING("ITEM"), CursorCb_Item}, [MENU_GIVE] = {gMenuText_Give, CursorCb_Give}, - [MENU_TAKE_ITEM] = {gText_Take, CursorCb_TakeItem}, - [MENU_MAIL] = {gText_Mail, CursorCb_Mail}, - [MENU_TAKE_MAIL] = {gText_Take2, CursorCb_TakeMail}, - [MENU_READ] = {gText_Read2, CursorCb_Read}, + [MENU_TAKE_ITEM] = {COMPOUND_STRING("TAKE"), CursorCb_TakeItem}, + [MENU_MAIL] = {COMPOUND_STRING("MAIL"), CursorCb_Mail}, + [MENU_TAKE_MAIL] = {COMPOUND_STRING("TAKE"), CursorCb_TakeMail}, + [MENU_READ] = {COMPOUND_STRING("READ"), CursorCb_Read}, [MENU_CANCEL2] = {gText_Cancel2, CursorCb_Cancel2}, - [MENU_SHIFT] = {gText_Shift, CursorCb_SendMon}, - [MENU_SEND_OUT] = {gText_SendOut, CursorCb_SendMon}, - [MENU_ENTER] = {gText_Enter, CursorCb_Enter}, - [MENU_NO_ENTRY] = {gText_NoEntry, CursorCb_NoEntry}, - [MENU_STORE] = {gText_Store, CursorCb_Store}, + [MENU_SHIFT] = {COMPOUND_STRING("SHIFT"), CursorCb_SendMon}, + [MENU_SEND_OUT] = {COMPOUND_STRING("SEND OUT"), CursorCb_SendMon}, + [MENU_ENTER] = {COMPOUND_STRING("ENTER"), CursorCb_Enter}, + [MENU_NO_ENTRY] = {COMPOUND_STRING("NO ENTRY"), CursorCb_NoEntry}, + [MENU_STORE] = {COMPOUND_STRING("STORE"), CursorCb_Store}, [MENU_REGISTER] = {gText_Register, CursorCb_Register}, - [MENU_TRADE1] = {gText_Trade4, CursorCb_Trade1}, - [MENU_TRADE2] = {gText_Trade4, CursorCb_Trade2}, + [MENU_TRADE1] = {sText_Trade4, CursorCb_Trade1}, + [MENU_TRADE2] = {sText_Trade4, CursorCb_Trade2}, [MENU_TOSS] = {gMenuText_Toss, CursorCb_Toss}, - [MENU_CATALOG_BULB] = {gText_LightBulb, CursorCb_CatalogBulb}, - [MENU_CATALOG_OVEN] = {gText_MicrowaveOven, CursorCb_CatalogOven}, - [MENU_CATALOG_WASHING] = {gText_WashingMachine, CursorCb_CatalogWashing}, - [MENU_CATALOG_FRIDGE] = {gText_Refrigerator, CursorCb_CatalogFridge}, - [MENU_CATALOG_FAN] = {gText_ElectricFan, CursorCb_CatalogFan}, - [MENU_CATALOG_MOWER] = {gText_LawnMower, CursorCb_CatalogMower}, - [MENU_CHANGE_FORM] = {gText_ChangeForm, CursorCb_ChangeForm}, - [MENU_CHANGE_ABILITY] = {gText_ChangeAbility, CursorCb_ChangeAbility}, + [MENU_CATALOG_BULB] = {COMPOUND_STRING("Light bulb"), CursorCb_CatalogBulb}, + [MENU_CATALOG_OVEN] = {COMPOUND_STRING("Microwave oven"), CursorCb_CatalogOven}, + [MENU_CATALOG_WASHING] = {COMPOUND_STRING("Washing machine"), CursorCb_CatalogWashing}, + [MENU_CATALOG_FRIDGE] = {COMPOUND_STRING("Refrigerator"), CursorCb_CatalogFridge}, + [MENU_CATALOG_FAN] = {COMPOUND_STRING("Electric fan"), CursorCb_CatalogFan}, + [MENU_CATALOG_MOWER] = {COMPOUND_STRING("Lawn mower"), CursorCb_CatalogMower}, + [MENU_CHANGE_FORM] = {COMPOUND_STRING("Change form"), CursorCb_ChangeForm}, + [MENU_CHANGE_ABILITY] = {COMPOUND_STRING("Change Ability"), CursorCb_ChangeAbility}, }; static const u8 sPartyMenuAction_SummarySwitchCancel[] = {MENU_SUMMARY, MENU_SWITCH, MENU_CANCEL1}; @@ -836,7 +840,7 @@ static const u8 *const sUnionRoomTradeMessages[] = }; static const u32 sHeldItemGfx[] = INCBIN_U32("graphics/party_menu/hold_icons.4bpp"); -static const u16 sHeldItemPalette[] = INCBIN_U16("graphics/party_menu/hold_icons.gbapal"); +const u16 gHeldItemPalette[] = INCBIN_U16("graphics/party_menu/hold_icons.gbapal"); static const struct OamData sOamData_HeldItem = { @@ -873,14 +877,14 @@ static const union AnimCmd *const sSpriteAnimTable_HeldItem[] = sSpriteAnim_HeldMail, }; -static const struct SpriteSheet sSpriteSheet_HeldItem = +const struct SpriteSheet gSpriteSheet_HeldItem = { .data = sHeldItemGfx, .size = sizeof(sHeldItemGfx), .tag = TAG_HELD_ITEM }; static const struct SpritePalette sSpritePalette_HeldItem = { - .data = sHeldItemPalette, .tag = TAG_HELD_ITEM + .data = gHeldItemPalette, .tag = TAG_HELD_ITEM }; static const struct SpriteTemplate sSpriteTemplate_HeldItem = diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index 340bdb1fa6..1cab4fc833 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -410,22 +410,33 @@ static const struct FormChange sGlalieFormChangeTable[] = { #if P_FAMILY_CASTFORM static const struct FormChange sCastformFormChangeTable[] = { +#if OW_FOLLOWERS_WEATHER_FORMS == TRUE + {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CASTFORM_SUNNY, WEATHER_SUNNY_CLOUDS}, + {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CASTFORM_SUNNY, WEATHER_DROUGHT}, + {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CASTFORM_RAINY, WEATHER_RAIN}, + {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CASTFORM_RAINY, WEATHER_RAIN_THUNDERSTORM}, + {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CASTFORM_RAINY, WEATHER_DOWNPOUR}, + {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CASTFORM_SNOWY, WEATHER_SNOW}, + {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CASTFORM_NORMAL, WEATHER_NONE}, + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_CASTFORM_NORMAL}, // To prevent Battles from being affected. + {FORM_CHANGE_DEPOSIT, SPECIES_CASTFORM_NORMAL}, // To prevent depositing weather forms into the PC. +#endif //OW_FOLLOWERS_WEATHER_FORMS #if B_WEATHER_FORMS >= GEN_5 - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SUNNY, B_WEATHER_SUN, ABILITY_FORECAST}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_RAINY, B_WEATHER_RAIN, ABILITY_FORECAST}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SNOWY, B_WEATHER_HAIL | B_WEATHER_SNOW, ABILITY_FORECAST}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, ~(B_WEATHER_SUN | B_WEATHER_RAIN | B_WEATHER_HAIL | B_WEATHER_SNOW), ABILITY_FORECAST}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, B_WEATHER_NONE, ABILITY_FORECAST}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SUNNY, B_WEATHER_SUN, ABILITY_FORECAST}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_RAINY, B_WEATHER_RAIN, ABILITY_FORECAST}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SNOWY, B_WEATHER_HAIL | B_WEATHER_SNOW, ABILITY_FORECAST}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, ~(B_WEATHER_SUN | B_WEATHER_RAIN | B_WEATHER_HAIL | B_WEATHER_SNOW), ABILITY_FORECAST}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, B_WEATHER_NONE, ABILITY_FORECAST}, #else - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SUNNY, B_WEATHER_SUN}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_RAINY, B_WEATHER_RAIN}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SNOWY, B_WEATHER_HAIL | B_WEATHER_SNOW}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, ~(B_WEATHER_SUN | B_WEATHER_RAIN | B_WEATHER_HAIL | B_WEATHER_SNOW)}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, B_WEATHER_NONE}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SUNNY, B_WEATHER_SUN}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_RAINY, B_WEATHER_RAIN}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SNOWY, B_WEATHER_HAIL | B_WEATHER_SNOW}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, ~(B_WEATHER_SUN | B_WEATHER_RAIN | B_WEATHER_HAIL | B_WEATHER_SNOW)}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, B_WEATHER_NONE}, #endif - {FORM_CHANGE_BATTLE_SWITCH, SPECIES_CASTFORM_NORMAL}, - {FORM_CHANGE_FAINT, SPECIES_CASTFORM_NORMAL}, - {FORM_CHANGE_END_BATTLE, SPECIES_CASTFORM_NORMAL}, + {FORM_CHANGE_BATTLE_SWITCH, SPECIES_CASTFORM_NORMAL}, + {FORM_CHANGE_FAINT, SPECIES_CASTFORM_NORMAL}, + {FORM_CHANGE_END_BATTLE, SPECIES_CASTFORM_NORMAL}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CASTFORM @@ -531,18 +542,24 @@ static const struct FormChange sBurmyFormChangeTable[] = { #if P_FAMILY_CHERUBI static const struct FormChange sCherrimFormChangeTable[] = { +#if OW_FOLLOWERS_WEATHER_FORMS == TRUE + {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CHERRIM_SUNSHINE, WEATHER_DROUGHT}, + {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CHERRIM_OVERCAST, WEATHER_NONE}, + {FORM_CHANGE_BEGIN_BATTLE, SPECIES_CHERRIM_OVERCAST}, // To prevent Battles from being affected. + {FORM_CHANGE_DEPOSIT, SPECIES_CHERRIM_OVERCAST}, // To prevent depositing weather forms into the PC. +#endif //OW_FOLLOWERS_WEATHER_FORMS #if B_WEATHER_FORMS >= GEN_5 - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_SUNSHINE, B_WEATHER_SUN, ABILITY_FLOWER_GIFT}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_OVERCAST, ~B_WEATHER_SUN, ABILITY_FLOWER_GIFT}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_OVERCAST, B_WEATHER_NONE, ABILITY_FLOWER_GIFT}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_SUNSHINE, B_WEATHER_SUN, ABILITY_FLOWER_GIFT}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_OVERCAST, ~B_WEATHER_SUN, ABILITY_FLOWER_GIFT}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_OVERCAST, B_WEATHER_NONE, ABILITY_FLOWER_GIFT}, #else - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_SUNSHINE, B_WEATHER_SUN}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_OVERCAST, ~B_WEATHER_SUN}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_OVERCAST, B_WEATHER_NONE}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_SUNSHINE, B_WEATHER_SUN}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_OVERCAST, ~B_WEATHER_SUN}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CHERRIM_OVERCAST, B_WEATHER_NONE}, #endif - {FORM_CHANGE_BATTLE_SWITCH, SPECIES_CHERRIM_OVERCAST}, - {FORM_CHANGE_FAINT, SPECIES_CHERRIM_OVERCAST}, - {FORM_CHANGE_END_BATTLE, SPECIES_CHERRIM_OVERCAST}, + {FORM_CHANGE_BATTLE_SWITCH, SPECIES_CHERRIM_OVERCAST}, + {FORM_CHANGE_FAINT, SPECIES_CHERRIM_OVERCAST}, + {FORM_CHANGE_END_BATTLE, SPECIES_CHERRIM_OVERCAST}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CHERUBI diff --git a/src/data/pokemon/form_species_tables.h b/src/data/pokemon/form_species_tables.h index ee391a74a0..53ee47f933 100644 --- a/src/data/pokemon/form_species_tables.h +++ b/src/data/pokemon/form_species_tables.h @@ -1459,15 +1459,15 @@ static const u16 sFlorgesFormSpeciesIdTable[] = { #if P_FAMILY_FURFROU static const u16 sFurfrouFormSpeciesIdTable[] = { SPECIES_FURFROU_NATURAL, - SPECIES_FURFROU_HEART_TRIM, - SPECIES_FURFROU_STAR_TRIM, - SPECIES_FURFROU_DIAMOND_TRIM, - SPECIES_FURFROU_DEBUTANTE_TRIM, - SPECIES_FURFROU_MATRON_TRIM, - SPECIES_FURFROU_DANDY_TRIM, - SPECIES_FURFROU_LA_REINE_TRIM, - SPECIES_FURFROU_KABUKI_TRIM, - SPECIES_FURFROU_PHARAOH_TRIM, + SPECIES_FURFROU_HEART, + SPECIES_FURFROU_STAR, + SPECIES_FURFROU_DIAMOND, + SPECIES_FURFROU_DEBUTANTE, + SPECIES_FURFROU_MATRON, + SPECIES_FURFROU_DANDY, + SPECIES_FURFROU_LA_REINE, + SPECIES_FURFROU_KABUKI, + SPECIES_FURFROU_PHARAOH, FORM_SPECIES_END, }; #endif //P_FAMILY_FURFROU diff --git a/src/data/pokemon/pokedex_orders.h b/src/data/pokemon/pokedex_orders.h index 1b0b32c63c..b2f5f3cc02 100644 --- a/src/data/pokemon/pokedex_orders.h +++ b/src/data/pokemon/pokedex_orders.h @@ -1894,15 +1894,15 @@ const u16 gPokedexOrder_Weight[] = NATIONAL_DEX_SIMISEAR, NATIONAL_DEX_MARACTUS, NATIONAL_DEX_FURFROU,//_NATURAL, - //NATIONAL_DEX_FURFROU_HEART_TRIM, - //NATIONAL_DEX_FURFROU_STAR_TRIM, - //NATIONAL_DEX_FURFROU_DIAMOND_TRIM, - //NATIONAL_DEX_FURFROU_DEBUTANTE_TRIM, - //NATIONAL_DEX_FURFROU_MATRON_TRIM, - //NATIONAL_DEX_FURFROU_DANDY_TRIM, - //NATIONAL_DEX_FURFROU_LA_REINE_TRIM, - //NATIONAL_DEX_FURFROU_KABUKI_TRIM, - //NATIONAL_DEX_FURFROU_PHARAOH_TRIM, + //NATIONAL_DEX_FURFROU_HEART, + //NATIONAL_DEX_FURFROU_STAR, + //NATIONAL_DEX_FURFROU_DIAMOND, + //NATIONAL_DEX_FURFROU_DEBUTANTE, + //NATIONAL_DEX_FURFROU_MATRON, + //NATIONAL_DEX_FURFROU_DANDY, + //NATIONAL_DEX_FURFROU_LA_REINE, + //NATIONAL_DEX_FURFROU_KABUKI, + //NATIONAL_DEX_FURFROU_PHARAOH, NATIONAL_DEX_PERRSERKER, NATIONAL_DEX_INDEEDEE,//_MALE, //NATIONAL_DEX_INDEEDEE_FEMALE, @@ -3711,15 +3711,15 @@ const u16 gPokedexOrder_Height[] = NATIONAL_DEX_TALONFLAME, NATIONAL_DEX_VIVILLON, NATIONAL_DEX_FURFROU,//_NATURAL, - //NATIONAL_DEX_FURFROU_HEART_TRIM, - //NATIONAL_DEX_FURFROU_STAR_TRIM, - //NATIONAL_DEX_FURFROU_DIAMOND_TRIM, - //NATIONAL_DEX_FURFROU_DEBUTANTE_TRIM, - //NATIONAL_DEX_FURFROU_MATRON_TRIM, - //NATIONAL_DEX_FURFROU_DANDY_TRIM, - //NATIONAL_DEX_FURFROU_LA_REINE_TRIM, - //NATIONAL_DEX_FURFROU_KABUKI_TRIM, - //NATIONAL_DEX_FURFROU_PHARAOH_TRIM, + //NATIONAL_DEX_FURFROU_HEART, + //NATIONAL_DEX_FURFROU_STAR, + //NATIONAL_DEX_FURFROU_DIAMOND, + //NATIONAL_DEX_FURFROU_DEBUTANTE, + //NATIONAL_DEX_FURFROU_MATRON, + //NATIONAL_DEX_FURFROU_DANDY, + //NATIONAL_DEX_FURFROU_LA_REINE, + //NATIONAL_DEX_FURFROU_KABUKI, + //NATIONAL_DEX_FURFROU_PHARAOH, //NATIONAL_DEX_ZYGARDE_10, //NATIONAL_DEX_ZYGARDE_10_POWER_CONSTRUCT, NATIONAL_DEX_SALAZZLE, diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 864fdc5297..5b3d31786e 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -1,10 +1,13 @@ #include "constants/abilities.h" #include "species_info/shared_dex_text.h" +#include "species_info/shared_front_pic_anims.h" // Macros for ease of use. #define EVOLUTION(...) (const struct Evolution[]) { __VA_ARGS__, { EVOLUTIONS_END }, } +#define ANIM_FRAMES(...) (const union AnimCmd *const[]) { sAnim_GeneralFrame0, (const union AnimCmd[]) { __VA_ARGS__ ANIMCMD_END, }, } + #if P_FOOTPRINTS #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, #else @@ -42,77 +45,41 @@ #define OVERWORLD_PAL_FEMALE(...) #endif //OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE -#define OVERWORLD(picTable, _size, shadow, _tracks, ...) \ -.overworldData = { \ - .tileTag = TAG_NONE, \ - .paletteTag = OBJ_EVENT_PAL_TAG_DYNAMIC, \ - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, \ - .size = (_size == SIZE_32x32 ? 512 : 2048), \ - .width = (_size == SIZE_32x32 ? 32 : 64), \ - .height = (_size == SIZE_32x32 ? 32 : 64), \ - .paletteSlot = PALSLOT_NPC_1, \ - .shadowSize = shadow, \ - .inanimate = FALSE, \ - .compressed = COMP, \ - .tracks = _tracks, \ - .oam = (_size == SIZE_32x32 ? &gObjectEventBaseOam_32x32 : &gObjectEventBaseOam_64x64), \ - .subspriteTables = (_size == SIZE_32x32 ? sOamTables_32x32 : sOamTables_64x64), \ - .anims = sAnimTable_Following, \ - .images = picTable, \ - .affineAnims = gDummySpriteAffineAnimTable, \ -}, \ - OVERWORLD_PAL(__VA_ARGS__) +#define OVERWORLD_DATA(picTable, _size, shadow, _tracks, _anims) \ +{ \ + .tileTag = TAG_NONE, \ + .paletteTag = OBJ_EVENT_PAL_TAG_DYNAMIC, \ + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, \ + .size = (_size == SIZE_32x32 ? 512 : 2048), \ + .width = (_size == SIZE_32x32 ? 32 : 64), \ + .height = (_size == SIZE_32x32 ? 32 : 64), \ + .paletteSlot = PALSLOT_NPC_1, \ + .shadowSize = shadow, \ + .inanimate = FALSE, \ + .compressed = COMP, \ + .tracks = _tracks, \ + .oam = (_size == SIZE_32x32 ? &gObjectEventBaseOam_32x32 : &gObjectEventBaseOam_64x64), \ + .subspriteTables = (_size == SIZE_32x32 ? sOamTables_32x32 : sOamTables_64x64), \ + .anims = _anims, \ + .images = picTable, \ + .affineAnims = gDummySpriteAffineAnimTable, \ +} -#define OVERWORLD_SET_ANIM(picTable, _size, shadow, _tracks, _anims, ...) \ -.overworldData = { \ - .tileTag = TAG_NONE, \ - .paletteTag = OBJ_EVENT_PAL_TAG_DYNAMIC, \ - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, \ - .size = (_size == SIZE_32x32 ? 512 : 2048), \ - .width = (_size == SIZE_32x32 ? 32 : 64), \ - .height = (_size == SIZE_32x32 ? 32 : 64), \ - .paletteSlot = PALSLOT_NPC_1, \ - .shadowSize = shadow, \ - .inanimate = FALSE, \ - .compressed = COMP, \ - .tracks = _tracks, \ - .oam = (_size == SIZE_32x32 ? &gObjectEventBaseOam_32x32 : &gObjectEventBaseOam_64x64), \ - .subspriteTables = (_size == SIZE_32x32 ? sOamTables_32x32 : sOamTables_64x64), \ - .anims = _anims, \ - .images = picTable, \ - .affineAnims = gDummySpriteAffineAnimTable, \ -}, \ +#define OVERWORLD(objEventPic, _size, shadow, _tracks, _anims, ...) \ + .overworldData = OVERWORLD_DATA(objEventPic, _size, shadow, _tracks, _anims), \ OVERWORLD_PAL(__VA_ARGS__) #if P_GENDER_DIFFERENCES -#define OVERWORLD_FEMALE(picTable, _size, shadow, _tracks, ...) \ -.overworldDataFemale = { \ - .tileTag = TAG_NONE, \ - .paletteTag = OBJ_EVENT_PAL_TAG_DYNAMIC, \ - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, \ - .size = (_size == SIZE_32x32 ? 512 : 2048), \ - .width = (_size == SIZE_32x32 ? 32 : 64), \ - .height = (_size == SIZE_32x32 ? 32 : 64), \ - .paletteSlot = PALSLOT_NPC_1, \ - .shadowSize = shadow, \ - .inanimate = FALSE, \ - .compressed = COMP, \ - .tracks = _tracks, \ - .oam = (_size == SIZE_32x32 ? &gObjectEventBaseOam_32x32 : &gObjectEventBaseOam_64x64), \ - .subspriteTables = (_size == SIZE_32x32 ? sOamTables_32x32 : sOamTables_64x64), \ - .anims = sAnimTable_Following, \ - .images = picTable, \ - .affineAnims = gDummySpriteAffineAnimTable, \ -}, \ +#define OVERWORLD_FEMALE(objEventPic, _size, shadow, _tracks, _anims, ...) \ + .overworldDataFemale = OVERWORLD_DATA(objEventPic, _size, shadow, _tracks, _anims), \ OVERWORLD_PAL_FEMALE(__VA_ARGS__) #else -#define OVERWORLD_FEMALE(picTable, _size, shadow, _tracks, ...) +#define OVERWORLD_FEMALE(...) #endif //P_GENDER_DIFFERENCES #else -#define OVERWORLD(picTable, _size, shadow, _tracks, ...) -#define OVERWORLD_SET_ANIM(picTable, _size, shadow, _tracks, _anims, ...) -#define OVERWORLD_FEMALE(picTable, _size, shadow, _tracks, ...) +#define OVERWORLD(...) +#define OVERWORLD_FEMALE(...) #define OVERWORLD_PAL(...) #define OVERWORLD_PAL_FEMALE(...) #endif //OW_POKEMON_OBJECT_EVENTS @@ -145,7 +112,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .frontPic = gMonFrontPic_CircledQuestionMark, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_None, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CircledQuestionMark, .backPicSize = MON_COORDS_SIZE(40, 40), diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 314b5bd73f..05bad13974 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -41,7 +41,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Bulbasaur, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 13, - .frontAnimFrames = sAnims_Bulbasaur, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_JUMPS_H_JUMPS, .backPic = gMonBackPic_Bulbasaur, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 32) : MON_COORDS_SIZE(56, 40), @@ -58,6 +62,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bulbasaur, gShinyOverworldPalette_Bulbasaur ) @@ -105,7 +110,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Ivysaur, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 9, - .frontAnimFrames = sAnims_Ivysaur, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Ivysaur, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), @@ -122,6 +131,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ivysaur, gShinyOverworldPalette_Ivysaur ) @@ -174,7 +184,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Venusaur, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Venusaur, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_ROTATE_UP_SLAM_DOWN, .backPic = gMonBackPic_Venusaur, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 48), @@ -197,6 +211,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Venusaur, gShinyOverworldPalette_Venusaur ) @@ -204,7 +219,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_VenusaurF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sVenusaurLevelUpLearnset, .teachableLearnset = sVenusaurTeachableLearnset, @@ -250,7 +266,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_VenusaurMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_VenusaurMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_VenusaurMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -262,6 +278,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 4, SHADOW(2, 6, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Venusaur) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_VenusaurMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_VenusaurMega, + gShinyOverworldPalette_VenusaurMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sVenusaurLevelUpLearnset, .teachableLearnset = sVenusaurTeachableLearnset, @@ -309,7 +336,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_VenusaurGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_VenusaurGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_VenusaurGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -368,7 +395,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Charmander, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 10, - .frontAnimFrames = sAnims_Charmander, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 46), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Charmander, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(48, 48), @@ -385,6 +416,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Charmander, gShinyOverworldPalette_Charmander ) @@ -432,7 +464,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Charmeleon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 8, - .frontAnimFrames = sAnims_Charmeleon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_BACK_AND_LUNGE, .backPic = gMonBackPic_Charmeleon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), @@ -449,6 +485,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Charmeleon, gShinyOverworldPalette_Charmeleon ) @@ -500,7 +537,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Charizard, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, - .frontAnimFrames = sAnims_Charizard, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Charizard, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -517,6 +557,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Charizard, gShinyOverworldPalette_Charizard ) @@ -563,7 +604,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_CharizardMegaX, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_CharizardMegaX, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CharizardMegaX, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -575,6 +616,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 0, SHADOW(2, 13, SHADOW_SIZE_L) FOOTPRINT(Charizard) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_CharizardMegaX, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_CharizardMegaX, + gShinyOverworldPalette_CharizardMegaX + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sCharizardLevelUpLearnset, .teachableLearnset = sCharizardTeachableLearnset, @@ -619,7 +671,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_CharizardMegaY, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_CharizardMegaY, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CharizardMegaY, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -631,6 +683,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 0, SHADOW(-1, 14, SHADOW_SIZE_L) FOOTPRINT(Charizard) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_CharizardMegaY, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_CharizardMegaY, + gShinyOverworldPalette_CharizardMegaY + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sCharizardLevelUpLearnset, .teachableLearnset = sCharizardTeachableLearnset, @@ -677,7 +740,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_CharizardGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_CharizardGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CharizardGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -736,7 +799,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Squirtle, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 11, - .frontAnimFrames = sAnims_Squirtle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONCAVE : ANIM_V_JUMPS_BIG, .backPic = gMonBackPic_Squirtle, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(48, 48), @@ -753,6 +821,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Squirtle, gShinyOverworldPalette_Squirtle ) @@ -800,7 +869,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Wartortle, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 7, - .frontAnimFrames = sAnims_Wartortle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Wartortle, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), @@ -817,6 +890,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Wartortle, gShinyOverworldPalette_Wartortle ) @@ -868,7 +942,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Blastoise, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 4, - .frontAnimFrames = sAnims_Blastoise, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .frontAnimDelay = P_GBA_STYLE_SPECIES_GFX ? 50 : 20, .backPic = gMonBackPic_Blastoise, @@ -886,6 +965,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Blastoise, gShinyOverworldPalette_Blastoise ) @@ -933,7 +1013,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_BlastoiseMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_BlastoiseMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_BlastoiseMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -945,6 +1025,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 2, SHADOW(4, 11, SHADOW_SIZE_L) FOOTPRINT(Blastoise) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_BlastoiseMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_BlastoiseMega, + gShinyOverworldPalette_BlastoiseMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sBlastoiseLevelUpLearnset, .teachableLearnset = sBlastoiseTeachableLearnset, @@ -991,7 +1082,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_BlastoiseGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_BlastoiseGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_BlastoiseGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1050,7 +1141,16 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Caterpie, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 12, - .frontAnimFrames = sAnims_Caterpie, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SWING_CONCAVE, .backPic = gMonBackPic_Caterpie, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 40), @@ -1067,6 +1167,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Caterpie, gShinyOverworldPalette_Caterpie ) @@ -1113,7 +1214,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Metapod, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 20 : 14, - .frontAnimFrames = sAnims_Metapod, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SWING_CONCAVE, .backPic = gMonBackPic_Metapod, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(40, 48), @@ -1130,6 +1234,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Metapod, gShinyOverworldPalette_Metapod ) @@ -1188,7 +1293,21 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Butterfree, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 10, - .frontAnimFrames = sAnims_Butterfree, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SLIDE_WOBBLE : ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 12, .backPic = gMonBackPic_Butterfree, @@ -1212,6 +1331,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Butterfree, gShinyOverworldPalette_Butterfree ) @@ -1219,7 +1339,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_ButterfreeF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sButterfreeLevelUpLearnset, .teachableLearnset = sButterfreeTeachableLearnset, @@ -1267,7 +1388,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_ButterfreeGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_ButterfreeGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 7, .backPic = gMonBackPic_ButterfreeGmax, @@ -1327,7 +1448,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Weedle, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 18 : 13, - .frontAnimFrames = sAnims_Weedle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .frontAnimDelay = 10, .backPic = gMonBackPic_Weedle, @@ -1345,6 +1474,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Weedle, gShinyOverworldPalette_Weedle ) @@ -1391,7 +1521,19 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Kakuna, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(24, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 11, - .frontAnimFrames = sAnims_Kakuna, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_GLOW_ORANGE, .frontAnimDelay = 20, .backPic = gMonBackPic_Kakuna, @@ -1409,6 +1551,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Kakuna, gShinyOverworldPalette_Kakuna ) @@ -1467,7 +1610,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Beedrill, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 5, - .frontAnimFrames = sAnims_Beedrill, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_VIBRATE : ANIM_ZIGZAG_SLOW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 9, .backPic = gMonBackPic_Beedrill, @@ -1485,6 +1636,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Beedrill, gShinyOverworldPalette_Beedrill ) @@ -1534,7 +1686,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_BeedrillMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_BeedrillMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_BeedrillMega, @@ -1547,6 +1699,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 2, SHADOW(1, 14, SHADOW_SIZE_S) FOOTPRINT(Beedrill) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_BeedrillMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_BeedrillMega, + gShinyOverworldPalette_BeedrillMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sBeedrillLevelUpLearnset, .teachableLearnset = sBeedrillTeachableLearnset, @@ -1598,7 +1761,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Pidgey, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 12, - .frontAnimFrames = sAnims_Pidgey, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SLIDE_SLOW : ANIM_V_STRETCH, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 16 : 0, .backPic = gMonBackPic_Pidgey, @@ -1616,6 +1783,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pidgey, gShinyOverworldPalette_Pidgey ) @@ -1666,7 +1834,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Pidgeotto, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 6, - .frontAnimFrames = sAnims_Pidgeotto, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_STRETCH, .frontAnimDelay = 25, .backPic = gMonBackPic_Pidgeotto, @@ -1684,6 +1858,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pidgeotto, gShinyOverworldPalette_Pidgeotto ) @@ -1743,7 +1918,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Pidgeot, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 2, - .frontAnimFrames = sAnims_Pidgeot, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_FRONT_FLIP : ANIM_GROW_VIBRATE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 4 : 5, .backPic = gMonBackPic_Pidgeot, @@ -1761,6 +1939,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pidgeot, gShinyOverworldPalette_Pidgeot ) @@ -1807,7 +1986,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PidgeotMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_PidgeotMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_PidgeotMega, @@ -1820,6 +1999,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 0, SHADOW(-7, 19, SHADOW_SIZE_M) FOOTPRINT(Pidgeot) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_PidgeotMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_PidgeotMega, + gShinyOverworldPalette_PidgeotMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sPidgeotLevelUpLearnset, .teachableLearnset = sPidgeotTeachableLearnset, @@ -1867,7 +2057,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Rattata, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 32) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 13, - .frontAnimFrames = sAnims_Rattata, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_RAPID_H_HOPS : ANIM_H_JUMPS, .backPic = gMonBackPic_Rattata, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(64, 56), @@ -1890,6 +2085,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rattata, gShinyOverworldPalette_Rattata ) @@ -1897,7 +2093,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_RattataF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sRattataLevelUpLearnset, .teachableLearnset = sRattataTeachableLearnset, @@ -1943,7 +2140,20 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Raticate, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 6, - .frontAnimFrames = sAnims_Raticate, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_FIGURE_8 : ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, .backPic = gMonBackPic_Raticate, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(64, 48), @@ -1966,6 +2176,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Raticate, gShinyOverworldPalette_Raticate ) @@ -1973,7 +2184,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_RaticateF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sRaticateLevelUpLearnset, .teachableLearnset = sRaticateTeachableLearnset, @@ -2019,7 +2231,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_RattataAlola, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_RattataAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_RattataAlola, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2036,6 +2248,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RattataAlola, gShinyOverworldPalette_RattataAlola ) @@ -2082,7 +2295,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_RaticateAlola, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_RaticateAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_RaticateAlola, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -2099,6 +2312,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RaticateAlola, gShinyOverworldPalette_RaticateAlola ) @@ -2142,7 +2356,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_RaticateAlola, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_RaticateAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_RaticateAlola, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -2159,6 +2373,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RaticateAlola, gShinyOverworldPalette_RaticateAlola ) @@ -2211,7 +2426,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Spearow, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 12, - .frontAnimFrames = sAnims_Spearow, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_RISING_WOBBLE : ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Spearow, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 56), @@ -2228,6 +2448,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Spearow, gShinyOverworldPalette_Spearow ) @@ -2275,7 +2496,16 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Fearow, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Fearow, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = ANIM_FIGURE_8, .frontAnimDelay = 2, .enemyMonElevation = 6, @@ -2294,6 +2524,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Fearow, gShinyOverworldPalette_Fearow ) @@ -2340,7 +2571,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Ekans, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 10, - .frontAnimFrames = sAnims_Ekans, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_STRETCH : ANIM_V_STRETCH, .frontAnimDelay = 30, .backPic = gMonBackPic_Ekans, @@ -2358,6 +2596,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Ekans, gShinyOverworldPalette_Ekans ) @@ -2410,7 +2649,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Arbok, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 1, - .frontAnimFrames = sAnims_Arbok, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Arbok, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 64), @@ -2427,6 +2670,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Arbok, gShinyOverworldPalette_Arbok ) @@ -2471,7 +2715,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Pichu, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 14, - .frontAnimFrames = sAnims_Pichu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_JUMPS_BIG, .backPic = gMonBackPic_Pichu, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 56), @@ -2488,6 +2738,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pichu, gShinyOverworldPalette_Pichu ) @@ -2532,7 +2783,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PichuSpikyEared, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_PichuSpikyEared, + .frontAnimFrames = ANIM_FRAMES( + 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, 1), + ), .frontAnimId = ANIM_V_JUMPS_H_JUMPS, .backPic = gMonBackPic_PichuSpikyEared, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -2544,7 +2803,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 1, SHADOW(2, 0, SHADOW_SIZE_S) FOOTPRINT(Pichu) - OVERWORLD_SET_ANIM( + OVERWORLD( sPicTable_PichuSpikyEared, SIZE_32x32, SHADOW_SIZE_M, @@ -2602,7 +2861,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Pikachu, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Pikachu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 60), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_FLASH_YELLOW, .frontAnimDelay = P_GBA_STYLE_SPECIES_GFX ? 0 : 25, .backPic = gMonBackPic_Pikachu, @@ -2629,6 +2893,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pikachu, gShinyOverworldPalette_Pikachu ) @@ -2636,7 +2901,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_PikachuF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) FOOTPRINT(Pikachu) .levelUpLearnset = sPikachuLevelUpLearnset, @@ -2682,7 +2948,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuCosplay, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuCosplay, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuCosplay, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2733,7 +2999,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuRockStar, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuRockStar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuRockStar, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2785,7 +3051,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuBelle, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuBelle, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuBelle, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2837,7 +3103,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuPopStar, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuPopStar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuPopStar, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2888,7 +3154,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuPhD, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuPhD, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuPhD, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2939,7 +3205,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuLibre, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuLibre, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuLibre, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2998,7 +3264,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuOriginal, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuOriginal, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuOriginal, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3053,7 +3319,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuHoenn, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuHoenn, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuHoenn, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3108,7 +3374,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuSinnoh, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuSinnoh, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuSinnoh, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3163,7 +3429,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuUnova, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuUnova, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuUnova, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3218,7 +3484,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuKalos, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuKalos, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuKalos, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3273,7 +3539,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuAlola, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuAlola, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3329,7 +3595,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuPartner, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuPartner, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuPartner, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3384,7 +3650,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuWorld, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_PikachuWorld, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuWorld, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3442,7 +3708,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PikachuGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_PikachuGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PikachuGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3496,7 +3762,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Pikachu, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Pikachu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 60), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_FLASH_YELLOW, .frontAnimDelay = 25, .backPic = gMonBackPic_Pikachu, @@ -3524,6 +3795,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pikachu, gShinyOverworldPalette_Pikachu ) @@ -3583,7 +3855,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Raichu, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 3, - .frontAnimFrames = sAnims_Raichu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_STRETCH : ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Raichu, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), @@ -3604,6 +3882,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Raichu, gShinyOverworldPalette_Raichu ) @@ -3611,7 +3890,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_RaichuF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sRaichuLevelUpLearnset, .teachableLearnset = sRaichuTeachableLearnset, @@ -3656,7 +3936,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_RaichuAlola, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_RaichuAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 4, .backPic = gMonBackPic_RaichuAlola, @@ -3674,6 +3954,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RaichuAlola, gShinyOverworldPalette_RaichuAlola ) @@ -3724,7 +4005,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Sandshrew, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 11, - .frontAnimFrames = sAnims_Sandshrew, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONCAVE_FAST_SHORT, .backPic = gMonBackPic_Sandshrew, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -3741,6 +4028,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sandshrew, gShinyOverworldPalette_Sandshrew ) @@ -3789,7 +4077,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Sandslash, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 6, - .frontAnimFrames = sAnims_Sandslash, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_STRETCH : ANIM_H_SHAKE, .backPic = gMonBackPic_Sandslash, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3806,6 +4100,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sandslash, gShinyOverworldPalette_Sandslash ) @@ -3853,7 +4148,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_SandshrewAlola, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_SandshrewAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SandshrewAlola, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -3870,6 +4165,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SandshrewAlola, gShinyOverworldPalette_SandshrewAlola ) @@ -3919,7 +4215,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_SandslashAlola, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_SandslashAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SandslashAlola, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3936,6 +4232,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SandslashAlola, gShinyOverworldPalette_SandslashAlola ) @@ -3989,7 +4286,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_NidoranF, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 13, - .frontAnimFrames = sAnims_NidoranF, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 50), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .frontAnimDelay = 28, .backPic = gMonBackPic_NidoranF, @@ -4007,6 +4314,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_NidoranF, gShinyOverworldPalette_NidoranF ) @@ -4057,7 +4365,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Nidorina, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 8, - .frontAnimFrames = sAnims_Nidorina, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Nidorina, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(56, 56), @@ -4074,6 +4385,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Nidorina, gShinyOverworldPalette_Nidorina ) @@ -4131,7 +4443,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Nidoqueen, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 2, - .frontAnimFrames = sAnims_Nidoqueen, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Nidoqueen, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), @@ -4148,6 +4463,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Nidoqueen, gShinyOverworldPalette_Nidoqueen ) @@ -4196,7 +4512,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_NidoranM, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_NidoranM, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_NidoranM, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(48, 48), @@ -4213,6 +4533,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_NidoranM, gShinyOverworldPalette_NidoranM ) @@ -4263,7 +4584,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Nidorino, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 8, - .frontAnimFrames = sAnims_Nidorino, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SHRINK_GROW : ANIM_V_STRETCH, .backPic = gMonBackPic_Nidorino, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -4280,6 +4605,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Nidorino, gShinyOverworldPalette_Nidorino ) @@ -4337,7 +4663,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Nidoking, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Nidoking, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .frontAnimDelay = 25, .backPic = gMonBackPic_Nidoking, @@ -4355,6 +4686,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Nidoking, gShinyOverworldPalette_Nidoking ) @@ -4414,7 +4746,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Cleffa, .frontPicSize = MON_COORDS_SIZE(32, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 20 : 18, - .frontAnimFrames = sAnims_Cleffa, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Cleffa, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -4431,6 +4768,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cleffa, gShinyOverworldPalette_Cleffa ) @@ -4484,7 +4822,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Clefairy, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 12, - .frontAnimFrames = sAnims_Clefairy, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Clefairy, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 40), @@ -4501,6 +4843,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Clefairy, gShinyOverworldPalette_Clefairy ) @@ -4560,7 +4903,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Clefable, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 6, - .frontAnimFrames = sAnims_Clefable, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 48), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW : ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Clefable, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), @@ -4577,6 +4924,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Clefable, gShinyOverworldPalette_Clefable ) @@ -4624,7 +4972,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Vulpix, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 11, - .frontAnimFrames = sAnims_Vulpix, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Vulpix, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), @@ -4641,6 +4995,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vulpix, gShinyOverworldPalette_Vulpix ) @@ -4690,7 +5045,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Ninetales, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Ninetales, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SHAKE : ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Ninetales, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), @@ -4707,6 +5068,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ninetales, gShinyOverworldPalette_Ninetales ) @@ -4754,7 +5116,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_VulpixAlola, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_VulpixAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_VulpixAlola, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4771,6 +5133,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_VulpixAlola, gShinyOverworldPalette_VulpixAlola ) @@ -4821,7 +5184,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_NinetalesAlola, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_NinetalesAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_NinetalesAlola, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4838,6 +5201,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_NinetalesAlola, gShinyOverworldPalette_NinetalesAlola ) @@ -4899,7 +5263,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Igglybuff, .frontPicSize = MON_COORDS_SIZE(32, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 18 : 17, - .frontAnimFrames = sAnims_Igglybuff, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_SWING_CONCAVE_FAST, .backPic = gMonBackPic_Igglybuff, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(40, 40), @@ -4916,6 +5286,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Igglybuff, gShinyOverworldPalette_Igglybuff ) @@ -4969,7 +5340,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Jigglypuff, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 14, - .frontAnimFrames = sAnims_Jigglypuff, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, .backPic = gMonBackPic_Jigglypuff, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 48), @@ -4986,6 +5363,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Jigglypuff, gShinyOverworldPalette_Jigglypuff ) @@ -5045,7 +5423,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Wigglytuff, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(48, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 4, - .frontAnimFrames = sAnims_Wigglytuff, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_JUMPS, .backPic = gMonBackPic_Wigglytuff, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 64), @@ -5062,6 +5446,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Wigglytuff, gShinyOverworldPalette_Wigglytuff ) @@ -5108,7 +5493,21 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Zubat, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 16, - .frontAnimFrames = sAnims_Zubat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 16, .backPic = gMonBackPic_Zubat, @@ -5132,6 +5531,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zubat, gShinyOverworldPalette_Zubat ) @@ -5139,7 +5539,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_ZubatF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sZubatLevelUpLearnset, .teachableLearnset = sZubatTeachableLearnset, @@ -5184,7 +5585,27 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Golbat, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 7, - .frontAnimFrames = sAnims_Golbat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 10, .backPic = gMonBackPic_Golbat, @@ -5208,6 +5629,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Golbat, gShinyOverworldPalette_Golbat ) @@ -5215,7 +5637,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_GolbatF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sGolbatLevelUpLearnset, .teachableLearnset = sGolbatTeachableLearnset, @@ -5266,7 +5689,25 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Crobat, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 6, - .frontAnimFrames = sAnims_Crobat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 6 : 9, .backPic = gMonBackPic_Crobat, @@ -5284,6 +5725,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Crobat, gShinyOverworldPalette_Crobat ) @@ -5332,7 +5774,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Oddish, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Oddish, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 6), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SQUISH_AND_BOUNCE : ANIM_V_JUMPS_H_JUMPS, .backPic = gMonBackPic_Oddish, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(48, 48), @@ -5349,6 +5799,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Oddish, gShinyOverworldPalette_Oddish ) @@ -5396,7 +5847,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Gloom, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 11, - .frontAnimFrames = sAnims_Gloom, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 21), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Gloom, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 48), @@ -5419,6 +5875,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gloom, gShinyOverworldPalette_Gloom ) @@ -5426,7 +5883,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_GloomF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sGloomLevelUpLearnset, .teachableLearnset = sGloomTeachableLearnset, @@ -5480,7 +5938,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Vileplume, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 7, - .frontAnimFrames = sAnims_Vileplume, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 38), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW : ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Vileplume, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -5503,6 +5964,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vileplume, gShinyOverworldPalette_Vileplume ) @@ -5510,7 +5972,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_VileplumeF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sVileplumeLevelUpLearnset, .teachableLearnset = sVileplumeTeachableLearnset, @@ -5563,7 +6026,24 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Bellossom, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 12, - .frontAnimFrames = sAnims_Bellossom, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONCAVE : ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Bellossom, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -5580,6 +6060,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bellossom, gShinyOverworldPalette_Bellossom ) @@ -5633,7 +6114,24 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Paras, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Paras, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .frontAnimDelay = 10, .backPic = gMonBackPic_Paras, @@ -5651,6 +6149,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Paras, gShinyOverworldPalette_Paras ) @@ -5704,7 +6203,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Parasect, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 7, - .frontAnimFrames = sAnims_Parasect, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SHAKE, .frontAnimDelay = 45, .backPic = gMonBackPic_Parasect, @@ -5722,6 +6228,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Parasect, gShinyOverworldPalette_Parasect ) @@ -5772,7 +6279,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Venonat, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(40, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Venonat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 35), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_JUMPS_H_JUMPS, .frontAnimDelay = 20, .backPic = gMonBackPic_Venonat, @@ -5790,6 +6304,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Venonat, gShinyOverworldPalette_Venonat ) @@ -5842,7 +6357,30 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Venomoth, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 9, - .frontAnimFrames = sAnims_Venomoth, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ), .frontAnimId = ANIM_ZIGZAG_SLOW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 16, .backPic = gMonBackPic_Venomoth, @@ -5860,6 +6398,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Venomoth, gShinyOverworldPalette_Venomoth ) @@ -5918,7 +6457,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Diglett, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(32, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 18 : 17, - .frontAnimFrames = sAnims_Diglett, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .frontAnimDelay = 25, .backPic = gMonBackPic_Diglett, @@ -5936,6 +6479,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Diglett, gShinyOverworldPalette_Diglett ) @@ -5984,7 +6528,18 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Dugtrio, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 11, - .frontAnimFrames = sAnims_Dugtrio, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 35), + 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), + ), .frontAnimId = ANIM_H_SHAKE_SLOW, .frontAnimDelay = 35, .backPic = gMonBackPic_Dugtrio, @@ -6002,6 +6557,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Dugtrio, gShinyOverworldPalette_Dugtrio ) @@ -6049,7 +6605,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_DiglettAlola, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 19, - .frontAnimFrames = sAnims_DiglettAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DiglettAlola, .backPicSize = MON_COORDS_SIZE(40, 48), @@ -6066,6 +6622,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DiglettAlola, gShinyOverworldPalette_DiglettAlola ) @@ -6116,7 +6673,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_DugtrioAlola, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_DugtrioAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DugtrioAlola, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -6133,6 +6690,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DugtrioAlola, gShinyOverworldPalette_DugtrioAlola ) @@ -6187,7 +6745,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Meowth, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 10, - .frontAnimFrames = sAnims_Meowth, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .frontAnimDelay = 40, .backPic = gMonBackPic_Meowth, @@ -6205,6 +6770,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Meowth, gShinyOverworldPalette_Meowth ) @@ -6258,7 +6824,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Persian, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 4, - .frontAnimFrames = sAnims_Persian, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .frontAnimDelay = 20, .backPic = gMonBackPic_Persian, @@ -6276,6 +6845,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Persian, gShinyOverworldPalette_Persian ) @@ -6323,7 +6893,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MeowthAlola, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_MeowthAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MeowthAlola, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6340,6 +6910,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MeowthAlola, gShinyOverworldPalette_MeowthAlola ) @@ -6389,7 +6960,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PersianAlola, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_PersianAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PersianAlola, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6406,6 +6977,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_PersianAlola, gShinyOverworldPalette_PersianAlola ) @@ -6454,7 +7026,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MeowthGalar, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_MeowthGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MeowthGalar, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6471,6 +7043,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MeowthGalar, gShinyOverworldPalette_MeowthGalar ) @@ -6518,7 +7091,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Perrserker, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Perrserker, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Perrserker, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6535,6 +7108,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Perrserker, gShinyOverworldPalette_Perrserker ) @@ -6582,7 +7156,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MeowthGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_MeowthGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MeowthGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6642,7 +7216,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Psyduck, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 11, - .frontAnimFrames = sAnims_Psyduck, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_JUMPS_H_JUMPS, .backPic = gMonBackPic_Psyduck, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(48, 48), @@ -6659,6 +7239,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Psyduck, gShinyOverworldPalette_Psyduck ) @@ -6705,7 +7286,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Golduck, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 4, - .frontAnimFrames = sAnims_Golduck, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SHAKE_SLOW, .backPic = gMonBackPic_Golduck, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 64), @@ -6722,6 +7309,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Golduck, gShinyOverworldPalette_Golduck ) @@ -6772,7 +7360,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Mankey, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 11, - .frontAnimFrames = sAnims_Mankey, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .frontAnimDelay = 20, .backPic = gMonBackPic_Mankey, @@ -6790,6 +7385,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mankey, gShinyOverworldPalette_Mankey ) @@ -6840,7 +7436,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Primeape, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 6, - .frontAnimFrames = sAnims_Primeape, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL : ANIM_BOUNCE_ROTATE_TO_SIDES, .backPic = gMonBackPic_Primeape, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 48), @@ -6857,6 +7461,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Primeape, gShinyOverworldPalette_Primeape ) @@ -6903,7 +7508,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Annihilape, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Annihilape, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Annihilape, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6920,6 +7525,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Annihilape, gShinyOverworldPalette_Annihilape ) @@ -6967,7 +7573,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Growlithe, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 9, - .frontAnimFrames = sAnims_Growlithe, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BACK_AND_LUNGE : ANIM_V_STRETCH, .frontAnimDelay = 30, .backPic = gMonBackPic_Growlithe, @@ -6985,6 +7598,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Growlithe, gShinyOverworldPalette_Growlithe ) @@ -7032,7 +7646,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Arcanine, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Arcanine, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 38), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_VIBRATE : ANIM_V_SHAKE, .frontAnimDelay = P_GBA_STYLE_SPECIES_GFX ? 40 : 8, .backPic = gMonBackPic_Arcanine, @@ -7050,6 +7667,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Arcanine, gShinyOverworldPalette_Arcanine ) @@ -7096,7 +7714,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_GrowlitheHisui, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_GrowlitheHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GrowlitheHisui, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -7113,6 +7731,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GrowlitheHisui, gShinyOverworldPalette_GrowlitheHisui ) @@ -7160,7 +7779,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_ArcanineHisui, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_ArcanineHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ArcanineHisui, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7177,6 +7796,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ArcanineHisui, gShinyOverworldPalette_ArcanineHisui ) @@ -7227,7 +7847,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Poliwag, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 32) : MON_COORDS_SIZE(64, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 19 : 13, - .frontAnimFrames = sAnims_Poliwag, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Poliwag, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 32) : MON_COORDS_SIZE(48, 32), @@ -7244,6 +7868,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Poliwag, gShinyOverworldPalette_Poliwag ) @@ -7292,7 +7917,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Poliwhirl, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 9, - .frontAnimFrames = sAnims_Poliwhirl, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .frontAnimDelay = 5, .backPic = gMonBackPic_Poliwhirl, @@ -7310,6 +7941,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Poliwhirl, gShinyOverworldPalette_Poliwhirl ) @@ -7367,7 +7999,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Poliwrath, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 6, - .frontAnimFrames = sAnims_Poliwrath, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Poliwrath, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -7384,6 +8019,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Poliwrath, gShinyOverworldPalette_Poliwrath ) @@ -7437,7 +8073,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Politoed, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 4, - .frontAnimFrames = sAnims_Politoed, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .frontAnimDelay = 40, .backPic = gMonBackPic_Politoed, @@ -7461,6 +8104,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Politoed, gShinyOverworldPalette_Politoed ) @@ -7468,7 +8112,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_PolitoedF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sPolitoedLevelUpLearnset, .teachableLearnset = sPolitoedTeachableLearnset, @@ -7521,7 +8166,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Abra, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 10, - .frontAnimFrames = sAnims_Abra, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 21), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 21), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_JUMPS : ANIM_H_VIBRATE, .backPic = gMonBackPic_Abra, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), @@ -7538,6 +8189,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Abra, gShinyOverworldPalette_Abra ) @@ -7586,7 +8238,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Kadabra, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Kadabra, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Kadabra, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), @@ -7609,6 +8265,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Kadabra, gShinyOverworldPalette_Kadabra ) @@ -7616,7 +8273,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_KadabraF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_NONE + TRACKS_NONE, + sAnimTable_Following ) .levelUpLearnset = sKadabraLevelUpLearnset, .teachableLearnset = sKadabraTeachableLearnset, @@ -7672,7 +8330,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Alakazam, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 2, - .frontAnimFrames = sAnims_Alakazam, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 54), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_STRETCH : ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Alakazam, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(64, 56), @@ -7695,6 +8357,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Alakazam, gShinyOverworldPalette_Alakazam ) @@ -7702,7 +8365,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_AlakazamF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_NONE + TRACKS_NONE, + sAnimTable_Following ) .levelUpLearnset = sAlakazamLevelUpLearnset, .teachableLearnset = sAlakazamTeachableLearnset, @@ -7748,7 +8412,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_AlakazamMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_AlakazamMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 7, .backPic = gMonBackPic_AlakazamMega, @@ -7761,6 +8425,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 2, SHADOW(0, 18, SHADOW_SIZE_L) FOOTPRINT(Alakazam) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_AlakazamMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE, + sAnimTable_Following, + gOverworldPalette_AlakazamMega, + gShinyOverworldPalette_AlakazamMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sAlakazamLevelUpLearnset, .teachableLearnset = sAlakazamTeachableLearnset, @@ -7819,7 +8494,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Machop, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 8, - .frontAnimFrames = sAnims_Machop, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SQUISH_AND_BOUNCE : ANIM_V_STRETCH, .backPic = gMonBackPic_Machop, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(48, 56), @@ -7836,6 +8517,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Machop, gShinyOverworldPalette_Machop ) @@ -7888,7 +8570,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Machoke, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 4, - .frontAnimFrames = sAnims_Machoke, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Machoke, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), @@ -7905,6 +8591,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Machoke, gShinyOverworldPalette_Machoke ) @@ -7964,7 +8651,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Machamp, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, - .frontAnimFrames = sAnims_Machamp, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_H_JUMPS, .backPic = gMonBackPic_Machamp, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(64, 56), @@ -7981,6 +8676,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Machamp, gShinyOverworldPalette_Machamp ) @@ -8033,7 +8729,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MachampGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_MachampGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MachampGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -8092,7 +8788,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Bellsprout, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 12, - .frontAnimFrames = sAnims_Bellsprout, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_STRETCH : ANIM_H_JUMPS, .backPic = gMonBackPic_Bellsprout, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(40, 48), @@ -8109,6 +8809,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bellsprout, gShinyOverworldPalette_Bellsprout ) @@ -8155,7 +8856,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Weepinbell, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Weepinbell, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONVEX, .frontAnimDelay = 3, .backPic = gMonBackPic_Weepinbell, @@ -8173,6 +8882,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Weepinbell, gShinyOverworldPalette_Weepinbell ) @@ -8226,7 +8936,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Victreebel, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 6, - .frontAnimFrames = sAnims_Victreebel, + .frontAnimFrames = ANIM_FRAMES( + 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), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Victreebel, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -8243,6 +8961,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Victreebel, gShinyOverworldPalette_Victreebel ) @@ -8290,7 +9009,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Tentacool, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 48) : MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 7, - .frontAnimFrames = sAnims_Tentacool, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Tentacool, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(64, 48), @@ -8307,6 +9032,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Tentacool, gShinyOverworldPalette_Tentacool ) @@ -8354,7 +9080,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Tentacruel, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Tentacruel, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 19), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 19), + ANIMCMD_FRAME(1, 19), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SQUISH_AND_BOUNCE : ANIM_V_SLIDE_WOBBLE, .backPic = gMonBackPic_Tentacruel, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -8371,6 +9103,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Tentacruel, gShinyOverworldPalette_Tentacruel ) @@ -8439,7 +9172,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Geodude, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(64, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 18 : 19, - .frontAnimFrames = sAnims_Geodude, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 16 : 10, .backPic = gMonBackPic_Geodude, @@ -8457,6 +9194,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Geodude, gShinyOverworldPalette_Geodude ) @@ -8505,7 +9243,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Graveler, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 9, - .frontAnimFrames = sAnims_Graveler, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL : ANIM_V_SHAKE, .backPic = gMonBackPic_Graveler, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(64, 48), @@ -8522,6 +9266,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Graveler, gShinyOverworldPalette_Graveler ) @@ -8570,7 +9315,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Golem, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 6, - .frontAnimFrames = sAnims_Golem, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 31), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_ROTATE_UP_SLAM_DOWN, .backPic = gMonBackPic_Golem, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 32) : MON_COORDS_SIZE(64, 48), @@ -8587,6 +9338,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Golem, gShinyOverworldPalette_Golem ) @@ -8634,7 +9386,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_GeodudeAlola, .frontPicSize = MON_COORDS_SIZE(48, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_GeodudeAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 16, .backPic = gMonBackPic_GeodudeAlola, @@ -8652,6 +9404,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GeodudeAlola, gShinyOverworldPalette_GeodudeAlola ) @@ -8701,7 +9454,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_GravelerAlola, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_GravelerAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GravelerAlola, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -8718,6 +9471,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GravelerAlola, gShinyOverworldPalette_GravelerAlola ) @@ -8767,7 +9521,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_GolemAlola, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_GolemAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GolemAlola, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -8784,6 +9538,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GolemAlola, gShinyOverworldPalette_GolemAlola ) @@ -8833,7 +9588,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Ponyta, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 6, - .frontAnimFrames = sAnims_Ponyta, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_GLOW_ORANGE : ANIM_V_SHAKE, .frontAnimDelay = P_GBA_STYLE_SPECIES_GFX ? 0 : 10, .backPic = gMonBackPic_Ponyta, @@ -8851,6 +9609,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ponyta, gShinyOverworldPalette_Ponyta ) @@ -8898,7 +9657,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Rapidash, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, - .frontAnimFrames = sAnims_Rapidash, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_CIRCULAR_VIBRATE : ANIM_H_SHAKE, .backPic = gMonBackPic_Rapidash, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -8915,6 +9678,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rapidash, gShinyOverworldPalette_Rapidash ) @@ -8961,7 +9725,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PonytaGalar, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_PonytaGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PonytaGalar, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -8978,6 +9742,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_PonytaGalar, gShinyOverworldPalette_PonytaGalar ) @@ -9026,7 +9791,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_RapidashGalar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_RapidashGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_RapidashGalar, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -9043,6 +9808,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RapidashGalar, gShinyOverworldPalette_RapidashGalar ) @@ -9093,7 +9859,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Slowpoke, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 16, - .frontAnimFrames = sAnims_Slowpoke, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Slowpoke, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -9110,6 +9880,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Slowpoke, gShinyOverworldPalette_Slowpoke ) @@ -9160,7 +9931,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Slowbro, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 4, - .frontAnimFrames = sAnims_Slowbro, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONCAVE : ANIM_H_STRETCH, .backPic = gMonBackPic_Slowbro, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -9177,6 +9951,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Slowbro, gShinyOverworldPalette_Slowbro ) @@ -9225,7 +10000,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Slowking, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 64) : MON_COORDS_SIZE(48, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Slowking, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Slowking, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 64), @@ -9242,6 +10021,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Slowking, gShinyOverworldPalette_Slowking ) @@ -9290,7 +10070,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_SlowbroMega, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_SlowbroMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SlowbroMega, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -9302,6 +10082,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 0, SHADOW(0, 13, SHADOW_SIZE_L) FOOTPRINT(Slowbro) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_SlowbroMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_SlowbroMega, + gShinyOverworldPalette_SlowbroMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sSlowbroLevelUpLearnset, .teachableLearnset = sSlowbroTeachableLearnset, @@ -9348,7 +10139,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_SlowpokeGalar, .frontPicSize = MON_COORDS_SIZE(56, 32), .frontPicYOffset = 19, - .frontAnimFrames = sAnims_SlowpokeGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SlowpokeGalar, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -9365,6 +10156,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SlowpokeGalar, gShinyOverworldPalette_SlowpokeGalar ) @@ -9415,7 +10207,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_SlowbroGalar, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_SlowbroGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SlowbroGalar, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -9427,7 +10219,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 0, SHADOW(-5, 9, SHADOW_SIZE_L) FOOTPRINT(Slowbro) - OVERWORLD_SET_ANIM( + OVERWORLD( sPicTable_SlowbroGalar, SIZE_32x32, SHADOW_SIZE_M, @@ -9480,7 +10272,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_SlowkingGalar, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_SlowkingGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SlowkingGalar, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -9497,6 +10289,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SlowkingGalar, gShinyOverworldPalette_SlowkingGalar ) @@ -9548,7 +10341,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Magnemite, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 24) : MON_COORDS_SIZE(48, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 21 : 20, - .frontAnimFrames = sAnims_Magnemite, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 28), + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 28), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_TUMBLING_FRONT_FLIP_TWICE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 16 : 17, .backPic = gMonBackPic_Magnemite, @@ -9566,6 +10365,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Magnemite, gShinyOverworldPalette_Magnemite ) @@ -9612,7 +10412,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Magneton, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 7, - .frontAnimFrames = sAnims_Magneton, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ), .frontAnimId = ANIM_FLASH_YELLOW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 9, .backPic = gMonBackPic_Magneton, @@ -9630,6 +10438,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Magneton, gShinyOverworldPalette_Magneton ) @@ -9684,7 +10493,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Magnezone, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Magnezone, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 4, .backPic = gMonBackPic_Magnezone, @@ -9702,6 +10517,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Magnezone, gShinyOverworldPalette_Magnezone ) @@ -9760,7 +10576,20 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Farfetchd, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 7, - .frontAnimFrames = sAnims_Farfetchd, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, .backPic = gMonBackPic_Farfetchd, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 48), @@ -9772,7 +10601,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 1, SHADOW(-3, 5, SHADOW_SIZE_M) FOOTPRINT(Farfetchd) - OVERWORLD_SET_ANIM( + OVERWORLD( sPicTable_Farfetchd, SIZE_32x32, SHADOW_SIZE_M, @@ -9826,7 +10655,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_FarfetchdGalar, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_FarfetchdGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_FarfetchdGalar, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -9843,6 +10672,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_FarfetchdGalar, gShinyOverworldPalette_FarfetchdGalar ) @@ -9892,7 +10722,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Sirfetchd, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Sirfetchd, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Sirfetchd, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -9909,6 +10739,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sirfetchd, gShinyOverworldPalette_Sirfetchd ) @@ -9957,7 +10788,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Doduo, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 7, - .frontAnimFrames = sAnims_Doduo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE_SLOW, .backPic = gMonBackPic_Doduo, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), @@ -9980,6 +10817,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Doduo, gShinyOverworldPalette_Doduo ) @@ -9987,7 +10825,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_DoduoF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sDoduoLevelUpLearnset, .teachableLearnset = sDoduoTeachableLearnset, @@ -10039,7 +10878,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Dodrio, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Dodrio, + .frontAnimFrames = ANIM_FRAMES( + 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, 8), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_LUNGE_GROW : ANIM_V_STRETCH, .backPic = gMonBackPic_Dodrio, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -10062,6 +10909,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dodrio, gShinyOverworldPalette_Dodrio ) @@ -10069,7 +10917,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_DodrioF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sDodrioLevelUpLearnset, .teachableLearnset = sDodrioTeachableLearnset, @@ -10118,7 +10967,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Seel, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 8, - .frontAnimFrames = sAnims_Seel, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONCAVE : ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Seel, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 40), @@ -10135,6 +10989,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Seel, gShinyOverworldPalette_Seel ) @@ -10185,7 +11040,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Dewgong, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 2, - .frontAnimFrames = sAnims_Dewgong, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Dewgong, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), @@ -10202,6 +11061,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dewgong, gShinyOverworldPalette_Dewgong ) @@ -10249,7 +11109,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Grimer, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 9, - .frontAnimFrames = sAnims_Grimer, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Grimer, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(64, 40), @@ -10266,6 +11132,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Grimer, gShinyOverworldPalette_Grimer ) @@ -10315,7 +11182,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Muk, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 7, - .frontAnimFrames = sAnims_Muk, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_DEEP_V_SQUISH_AND_BOUNCE, .frontAnimDelay = 45, .backPic = gMonBackPic_Muk, @@ -10333,6 +11206,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Muk, gShinyOverworldPalette_Muk ) @@ -10380,7 +11254,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_GrimerAlola, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_GrimerAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GrimerAlola, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -10397,6 +11271,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GrimerAlola, gShinyOverworldPalette_GrimerAlola ) @@ -10448,7 +11323,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MukAlola, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_MukAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MukAlola, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -10465,6 +11340,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MukAlola, gShinyOverworldPalette_MukAlola ) @@ -10520,7 +11396,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Shellder, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 13, - .frontAnimFrames = sAnims_Shellder, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_TWIST, .frontAnimDelay = 20, .backPic = gMonBackPic_Shellder, @@ -10538,6 +11419,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Shellder, gShinyOverworldPalette_Shellder ) @@ -10590,7 +11472,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Cloyster, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 3, - .frontAnimFrames = sAnims_Cloyster, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SLIDE_WOBBLE : ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Cloyster, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -10607,6 +11494,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Cloyster, gShinyOverworldPalette_Cloyster ) @@ -10653,7 +11541,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Gastly, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 13, - .frontAnimFrames = sAnims_Gastly, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_GLOW_BLACK : ANIM_SHRINK_GROW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 4 : 13, .backPic = gMonBackPic_Gastly, @@ -10671,6 +11567,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Gastly, gShinyOverworldPalette_Gastly ) @@ -10717,7 +11614,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Haunter, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 13, - .frontAnimFrames = sAnims_Haunter, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_FLICKER_INCREASING, .frontAnimDelay = 23, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 4 : 14, @@ -10736,6 +11639,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Haunter, gShinyOverworldPalette_Haunter ) @@ -10794,7 +11698,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Gengar, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 7, - .frontAnimFrames = sAnims_Gengar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_IN_STAGES, .backPic = gMonBackPic_Gengar, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), @@ -10811,6 +11719,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gengar, gShinyOverworldPalette_Gengar ) @@ -10858,7 +11767,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_GengarMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_GengarMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GengarMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -10870,6 +11779,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 2, SHADOW(6, 1, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Gengar) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_GengarMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_GengarMega, + gShinyOverworldPalette_GengarMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sGengarLevelUpLearnset, .teachableLearnset = sGengarTeachableLearnset, @@ -10916,7 +11836,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_GengarGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_GengarGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GengarGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -10975,7 +11895,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Onix, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 3, - .frontAnimFrames = sAnims_Onix, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_RAPID_H_HOPS : ANIM_H_SHAKE, .backPic = gMonBackPic_Onix, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), @@ -10992,6 +11915,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Onix, gShinyOverworldPalette_Onix ) @@ -11041,7 +11965,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Steelix, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Steelix, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 21), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 21), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SHAKE : ANIM_V_SHAKE, .frontAnimDelay = 45, .backPic = gMonBackPic_Steelix, @@ -11065,6 +11995,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Steelix, gShinyOverworldPalette_Steelix ) @@ -11072,7 +12003,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_SteelixF, SIZE_64x64, SHADOW_SIZE_M, - TRACKS_SLITHER + TRACKS_SLITHER, + sAnimTable_Following ) .levelUpLearnset = sSteelixLevelUpLearnset, .teachableLearnset = sSteelixTeachableLearnset, @@ -11119,7 +12051,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_SteelixMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_SteelixMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SteelixMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -11131,6 +12063,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 0, SHADOW(1, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Steelix) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_SteelixMega, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_SLITHER, + sAnimTable_Following, + gOverworldPalette_SteelixMega, + gShinyOverworldPalette_SteelixMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sSteelixLevelUpLearnset, .teachableLearnset = sSteelixTeachableLearnset, @@ -11183,7 +12126,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Drowzee, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Drowzee, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_CIRCLE_C_CLOCKWISE_SLOW : ANIM_V_STRETCH, .frontAnimDelay = 48, .backPic = gMonBackPic_Drowzee, @@ -11201,6 +12151,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Drowzee, gShinyOverworldPalette_Drowzee ) @@ -11251,7 +12202,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Hypno, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 3, - .frontAnimFrames = sAnims_Hypno, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .frontAnimDelay = 40, .backPic = gMonBackPic_Hypno, @@ -11275,6 +12234,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hypno, gShinyOverworldPalette_Hypno ) @@ -11282,7 +12242,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_HypnoF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sHypnoLevelUpLearnset, .teachableLearnset = sHypnoTeachableLearnset, @@ -11327,7 +12288,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Krabby, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 14, - .frontAnimFrames = sAnims_Krabby, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SLIDE : ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Krabby, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 40), @@ -11344,6 +12312,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Krabby, gShinyOverworldPalette_Krabby ) @@ -11391,7 +12360,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Kingler, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 8, - .frontAnimFrames = sAnims_Kingler, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 14), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_ZIGZAG_SLOW : ANIM_V_SHAKE_TWICE, .frontAnimDelay = P_GBA_STYLE_SPECIES_GFX ? 0 : 4, .backPic = gMonBackPic_Kingler, @@ -11409,6 +12381,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kingler, gShinyOverworldPalette_Kingler ) @@ -11457,7 +12430,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_KinglerGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_KinglerGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_KinglerGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -11524,7 +12497,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Voltorb, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 32) : MON_COORDS_SIZE(32, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 19 : 15, - .frontAnimFrames = sAnims_Voltorb, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 4), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SQUISH_AND_BOUNCE : ANIM_SWING_CONCAVE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 10 : 0, .backPic = gMonBackPic_Voltorb, @@ -11542,6 +12521,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Voltorb, gShinyOverworldPalette_Voltorb ) @@ -11588,7 +12568,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Electrode, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 11, - .frontAnimFrames = sAnims_Electrode, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 34), + ANIMCMD_FRAME(1, 34), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SQUISH_AND_BOUNCE : ANIM_SHRINK_GROW_VIBRATE_SLOW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 12 : 0, .backPic = gMonBackPic_Electrode, @@ -11606,6 +12591,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Electrode, gShinyOverworldPalette_Electrode ) @@ -11652,7 +12638,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_VoltorbHisui, .frontPicSize = MON_COORDS_SIZE(32, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_VoltorbHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_VoltorbHisui, .backPicSize = MON_COORDS_SIZE(48, 32), @@ -11669,6 +12655,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_VoltorbHisui, gShinyOverworldPalette_VoltorbHisui ) @@ -11716,7 +12703,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_ElectrodeHisui, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_ElectrodeHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ElectrodeHisui, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -11733,6 +12720,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ElectrodeHisui, gShinyOverworldPalette_ElectrodeHisui ) @@ -11783,7 +12771,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Exeggcute, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(56, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 12, - .frontAnimFrames = sAnims_Exeggcute, + .frontAnimFrames = ANIM_FRAMES( + 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), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Exeggcute, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(64, 32), @@ -11800,6 +12798,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Exeggcute, gShinyOverworldPalette_Exeggcute ) @@ -11857,7 +12856,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Exeggutor, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Exeggutor, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Exeggutor, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 48), @@ -11874,6 +12876,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Exeggutor, gShinyOverworldPalette_Exeggutor ) @@ -11920,7 +12923,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_ExeggutorAlola, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_ExeggutorAlola, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ExeggutorAlola, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -11937,6 +12940,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ExeggutorAlola, gShinyOverworldPalette_ExeggutorAlola ) @@ -11987,7 +12991,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Cubone, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(56, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 13, - .frontAnimFrames = sAnims_Cubone, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL : ANIM_V_SQUISH_AND_BOUNCE, .frontAnimDelay = P_GBA_STYLE_SPECIES_GFX ? 0 : 30, .backPic = gMonBackPic_Cubone, @@ -12005,6 +13016,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cubone, gShinyOverworldPalette_Cubone ) @@ -12054,7 +13066,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Marowak, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 8, - .frontAnimFrames = sAnims_Marowak, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES, .backPic = gMonBackPic_Marowak, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 56), @@ -12071,6 +13090,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Marowak, gShinyOverworldPalette_Marowak ) @@ -12114,7 +13134,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MarowakAlola, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_MarowakAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MarowakAlola, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -12131,6 +13151,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MarowakAlola, gShinyOverworldPalette_MarowakAlola ) @@ -12174,7 +13195,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MarowakAlola, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_MarowakAlola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MarowakAlola, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -12191,6 +13212,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MarowakAlola, gShinyOverworldPalette_MarowakAlola ) @@ -12247,7 +13269,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Tyrogue, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 48) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Tyrogue, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_STRETCH : ANIM_BACK_AND_LUNGE, .backPic = gMonBackPic_Tyrogue, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -12264,6 +13289,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tyrogue, gShinyOverworldPalette_Tyrogue ) @@ -12317,7 +13343,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Hitmonlee, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 5, - .frontAnimFrames = sAnims_Hitmonlee, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_STRETCH : ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Hitmonlee, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(64, 56), @@ -12334,6 +13364,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hitmonlee, gShinyOverworldPalette_Hitmonlee ) @@ -12382,7 +13413,19 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Hitmonchan, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(48, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Hitmonchan, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Hitmonchan, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 56), @@ -12399,6 +13442,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hitmonchan, gShinyOverworldPalette_Hitmonchan ) @@ -12448,7 +13492,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Hitmontop, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 7, - .frontAnimFrames = sAnims_Hitmontop, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 26), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_VIBRATE : ANIM_SWING_CONCAVE, .backPic = gMonBackPic_Hitmontop, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -12465,6 +13515,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hitmontop, gShinyOverworldPalette_Hitmontop ) @@ -12513,7 +13564,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Lickitung, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 7, - .frontAnimFrames = sAnims_Lickitung, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SQUISH_AND_BOUNCE_SLOW : ANIM_V_STRETCH, .backPic = gMonBackPic_Lickitung, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(64, 40), @@ -12530,6 +13584,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lickitung, gShinyOverworldPalette_Lickitung ) @@ -12578,7 +13633,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Lickilicky, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Lickilicky, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 50), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Lickilicky, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -12595,6 +13660,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lickilicky, gShinyOverworldPalette_Lickilicky ) @@ -12647,7 +13713,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Koffing, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 10, - .frontAnimFrames = sAnims_Koffing, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SHRINK_GROW : ANIM_V_SLIDE_WOBBLE_SMALL, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 14, .backPic = gMonBackPic_Koffing, @@ -12665,6 +13737,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Koffing, gShinyOverworldPalette_Koffing ) @@ -12718,7 +13791,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Weezing, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 0, - .frontAnimFrames = sAnims_Weezing, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 6 : 3, .backPic = gMonBackPic_Weezing, @@ -12736,6 +13815,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Weezing, gShinyOverworldPalette_Weezing ) @@ -12784,7 +13864,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_WeezingGalar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_WeezingGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 6, .backPic = gMonBackPic_WeezingGalar, @@ -12802,6 +13882,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_WeezingGalar, gShinyOverworldPalette_WeezingGalar ) @@ -12851,7 +13932,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Rhyhorn, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(56, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 12, - .frontAnimFrames = sAnims_Rhyhorn, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Rhyhorn, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(64, 48), @@ -12874,6 +13961,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rhyhorn, gShinyOverworldPalette_Rhyhorn ) @@ -12881,7 +13969,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_RhyhornF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sRhyhornLevelUpLearnset, .teachableLearnset = sRhyhornTeachableLearnset, @@ -12926,7 +14015,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Rhydon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 3, - .frontAnimFrames = sAnims_Rhydon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SHRINK_GROW : ANIM_V_STRETCH, .backPic = gMonBackPic_Rhydon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 56), @@ -12949,6 +14041,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rhydon, gShinyOverworldPalette_Rhydon ) @@ -12956,7 +14049,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_RhydonF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sRhydonLevelUpLearnset, .teachableLearnset = sRhydonTeachableLearnset, @@ -13008,7 +14102,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Rhyperior, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Rhyperior, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 50), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Rhyperior, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -13031,6 +14131,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rhyperior, gShinyOverworldPalette_Rhyperior ) @@ -13038,7 +14139,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_RhyperiorF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sRhyperiorLevelUpLearnset, .teachableLearnset = sRhyperiorTeachableLearnset, @@ -13086,7 +14188,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Happiny, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Happiny, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Happiny, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -13103,6 +14209,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Happiny, gShinyOverworldPalette_Happiny ) @@ -13152,7 +14259,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Chansey, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Chansey, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SQUISH_AND_BOUNCE_SLOW : ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Chansey, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -13169,6 +14280,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Chansey, gShinyOverworldPalette_Chansey ) @@ -13217,7 +14329,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Blissey, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 5, - .frontAnimFrames = sAnims_Blissey, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Blissey, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(64, 32), @@ -13234,6 +14350,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Blissey, gShinyOverworldPalette_Blissey ) @@ -13285,7 +14402,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Tangela, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 12, - .frontAnimFrames = sAnims_Tangela, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 40), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL : ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Tangela, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -13302,6 +14423,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tangela, gShinyOverworldPalette_Tangela ) @@ -13349,7 +14471,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Tangrowth, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Tangrowth, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Tangrowth, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -13370,6 +14500,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tangrowth, gShinyOverworldPalette_Tangrowth ) @@ -13377,7 +14508,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_TangrowthF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sTangrowthLevelUpLearnset, .teachableLearnset = sTangrowthTeachableLearnset, @@ -13423,7 +14555,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Kangaskhan, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 1, - .frontAnimFrames = sAnims_Kangaskhan, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Kangaskhan, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), @@ -13440,6 +14577,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kangaskhan, gShinyOverworldPalette_Kangaskhan ) @@ -13488,7 +14626,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_KangaskhanMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_KangaskhanMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_KangaskhanMega, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -13500,6 +14638,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 2, SHADOW(0, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Kangaskhan) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_KangaskhanMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_KangaskhanMega, + gShinyOverworldPalette_KangaskhanMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sKangaskhanLevelUpLearnset, .teachableLearnset = sKangaskhanTeachableLearnset, @@ -13553,7 +14702,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Horsea, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 14, - .frontAnimFrames = sAnims_Horsea, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_TWIST : ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Horsea, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 40), @@ -13570,6 +14725,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Horsea, gShinyOverworldPalette_Horsea ) @@ -13622,7 +14778,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Seadra, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 6, - .frontAnimFrames = sAnims_Seadra, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE, .backPic = gMonBackPic_Seadra, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), @@ -13639,6 +14801,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Seadra, gShinyOverworldPalette_Seadra ) @@ -13699,7 +14862,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Kingdra, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 1, - .frontAnimFrames = sAnims_Kingdra, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_CIRCLE_INTO_BG, .backPic = gMonBackPic_Kingdra, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -13716,6 +14885,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Kingdra, gShinyOverworldPalette_Kingdra ) @@ -13764,7 +14934,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Goldeen, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 13, - .frontAnimFrames = sAnims_Goldeen, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONVEX : ANIM_H_SLIDE_WOBBLE, .backPic = gMonBackPic_Goldeen, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 48), @@ -13787,6 +14967,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Goldeen, gShinyOverworldPalette_Goldeen ) @@ -13794,7 +14975,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_GoldeenF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_SPOT + TRACKS_SPOT, + sAnimTable_Following ) .levelUpLearnset = sGoldeenLevelUpLearnset, .teachableLearnset = sGoldeenTeachableLearnset, @@ -13840,7 +15022,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Seaking, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 5, - .frontAnimFrames = sAnims_Seaking, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .backPic = gMonBackPic_Seaking, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), @@ -13863,6 +15051,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Seaking, gShinyOverworldPalette_Seaking ) @@ -13870,7 +15059,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_SeakingF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_SPOT + TRACKS_SPOT, + sAnimTable_Following ) .levelUpLearnset = sSeakingLevelUpLearnset, .teachableLearnset = sSeakingTeachableLearnset, @@ -13918,7 +15108,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Staryu, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 11, - .frontAnimFrames = sAnims_Staryu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_TWIST_TWICE, .backPic = gMonBackPic_Staryu, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 56), @@ -13935,6 +15131,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Staryu, gShinyOverworldPalette_Staryu ) @@ -13982,7 +15179,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Starmie, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Starmie, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_TWIST, .backPic = gMonBackPic_Starmie, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(64, 64), @@ -13999,6 +15202,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Starmie, gShinyOverworldPalette_Starmie ) @@ -14054,7 +15258,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MimeJr, .frontPicSize = MON_COORDS_SIZE(32, 56), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_MimeJr, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_MimeJr, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -14071,6 +15282,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MimeJr, gShinyOverworldPalette_MimeJr ) @@ -14123,7 +15335,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MrMime, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 6, - .frontAnimFrames = sAnims_MrMime, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_MrMime, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(64, 48), @@ -14140,6 +15359,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MrMime, gShinyOverworldPalette_MrMime ) @@ -14187,7 +15407,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MrMimeGalar, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_MrMimeGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MrMimeGalar, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -14204,6 +15424,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MrMimeGalar, gShinyOverworldPalette_MrMimeGalar ) @@ -14251,7 +15472,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MrRime, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_MrRime, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MrRime, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -14268,6 +15489,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MrRime, gShinyOverworldPalette_MrRime ) @@ -14319,7 +15541,16 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Scyther, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 1, - .frontAnimFrames = sAnims_Scyther, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_VIBRATE, .frontAnimDelay = 10, .backPic = gMonBackPic_Scyther, @@ -14341,6 +15572,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Scyther, gShinyOverworldPalette_Scyther ) @@ -14348,7 +15580,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_ScytherF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sScytherLevelUpLearnset, .teachableLearnset = sScytherTeachableLearnset, @@ -14400,7 +15633,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Scizor, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 2, - .frontAnimFrames = sAnims_Scizor, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_H_VIBRATE, .frontAnimDelay = 19, .backPic = gMonBackPic_Scizor, @@ -14422,6 +15658,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Scizor, gShinyOverworldPalette_Scizor ) @@ -14429,7 +15666,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_ScizorF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sScizorLevelUpLearnset, .teachableLearnset = sScizorTeachableLearnset, @@ -14475,7 +15713,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_ScizorMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_ScizorMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ScizorMega, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -14487,6 +15725,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 0, SHADOW(5, 15, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Scizor) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_ScizorMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_ScizorMega, + gShinyOverworldPalette_ScizorMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sScizorLevelUpLearnset, .teachableLearnset = sScizorTeachableLearnset, @@ -14534,7 +15783,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Kleavor, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Kleavor, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Kleavor, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -14551,6 +15800,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kleavor, gShinyOverworldPalette_Kleavor ) @@ -14603,7 +15853,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Smoochum, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(24, 40) : MON_COORDS_SIZE(32, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 13, - .frontAnimFrames = sAnims_Smoochum, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_GROW_VIBRATE, .frontAnimDelay = 40, .backPic = gMonBackPic_Smoochum, @@ -14621,6 +15874,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Smoochum, gShinyOverworldPalette_Smoochum ) @@ -14672,7 +15926,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Jynx, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 9, - .frontAnimFrames = sAnims_Jynx, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Jynx, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(56, 64), @@ -14689,6 +15949,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Jynx, gShinyOverworldPalette_Jynx ) @@ -14738,7 +15999,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Elekid, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 12, - .frontAnimFrames = sAnims_Elekid, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_FLASH_YELLOW, .backPic = gMonBackPic_Elekid, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 48), @@ -14755,6 +16020,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Elekid, gShinyOverworldPalette_Elekid ) @@ -14804,7 +16070,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Electabuzz, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 4, - .frontAnimFrames = sAnims_Electabuzz, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_FLASH_YELLOW : ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW, .backPic = gMonBackPic_Electabuzz, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 64), @@ -14821,6 +16093,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Electabuzz, gShinyOverworldPalette_Electabuzz ) @@ -14875,7 +16148,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Electivire, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Electivire, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GLOW_YELLOW, .backPic = gMonBackPic_Electivire, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -14892,6 +16169,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Electivire, gShinyOverworldPalette_Electivire ) @@ -14942,7 +16220,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Magby, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(32, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 11, - .frontAnimFrames = sAnims_Magby, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Magby, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(40, 48), @@ -14959,6 +16242,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Magby, gShinyOverworldPalette_Magby ) @@ -15007,7 +16291,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Magmar, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Magmar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Magmar, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 64), @@ -15024,6 +16311,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Magmar, gShinyOverworldPalette_Magmar ) @@ -15079,7 +16367,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Magmortar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Magmortar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Magmortar, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -15096,6 +16387,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Magmortar, gShinyOverworldPalette_Magmortar ) @@ -15147,7 +16439,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Pinsir, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 5, - .frontAnimFrames = sAnims_Pinsir, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_GROW_VIBRATE : ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Pinsir, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), @@ -15164,6 +16462,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pinsir, gShinyOverworldPalette_Pinsir ) @@ -15212,7 +16511,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PinsirMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_PinsirMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 4, .backPic = gMonBackPic_PinsirMega, @@ -15225,6 +16524,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 2, SHADOW(3, 12, SHADOW_SIZE_L) FOOTPRINT(Pinsir) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_PinsirMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_PinsirMega, + gShinyOverworldPalette_PinsirMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sPinsirLevelUpLearnset, .teachableLearnset = sPinsirTeachableLearnset, @@ -15278,7 +16588,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Tauros, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 5, - .frontAnimFrames = sAnims_Tauros, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .frontAnimDelay = 10, .backPic = gMonBackPic_Tauros, @@ -15296,6 +16611,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tauros, gShinyOverworldPalette_Tauros ) @@ -15342,7 +16658,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_TaurosPaldeaCombat, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_TaurosPaldea, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_TaurosPaldeaCombat, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -15359,6 +16675,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TaurosPaldeaCombat, gShinyOverworldPalette_TaurosPaldeaCombat ) @@ -15406,7 +16723,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_TaurosPaldeaBlaze, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_TaurosPaldea, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_TaurosPaldeaBlaze, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -15423,6 +16740,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TaurosPaldeaBlaze, gShinyOverworldPalette_TaurosPaldeaBlaze ) @@ -15470,7 +16788,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_TaurosPaldeaAqua, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_TaurosPaldea, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_TaurosPaldeaAqua, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -15487,6 +16805,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TaurosPaldeaAqua, gShinyOverworldPalette_TaurosPaldeaAqua ) @@ -15537,7 +16856,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Magikarp, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 4, - .frontAnimFrames = sAnims_Magikarp, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES, .backPic = gMonBackPic_Magikarp, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), @@ -15560,6 +16889,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Magikarp, gShinyOverworldPalette_Magikarp ) @@ -15567,7 +16897,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_MagikarpF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_SPOT + TRACKS_SPOT, + sAnimTable_Following ) .tmIlliterate = TRUE, .levelUpLearnset = sMagikarpLevelUpLearnset, @@ -15612,7 +16943,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Gyarados, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 2, - .frontAnimFrames = sAnims_Gyarados, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, .backPic = gMonBackPic_Gyarados, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), @@ -15635,6 +16970,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Gyarados, gShinyOverworldPalette_Gyarados ) @@ -15642,7 +16978,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_GyaradosF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_SLITHER + TRACKS_SLITHER, + sAnimTable_Following ) .levelUpLearnset = sGyaradosLevelUpLearnset, .teachableLearnset = sGyaradosTeachableLearnset, @@ -15688,7 +17025,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_GyaradosMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_GyaradosMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 6, .backPic = gMonBackPic_GyaradosMega, @@ -15701,6 +17038,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 0, SHADOW(3, 17, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Gyarados) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_GyaradosMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_SLITHER, + sAnimTable_Following, + gOverworldPalette_GyaradosMega, + gShinyOverworldPalette_GyaradosMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sGyaradosLevelUpLearnset, .teachableLearnset = sGyaradosTeachableLearnset, @@ -15750,7 +17098,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Lapras, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 2, - .frontAnimFrames = sAnims_Lapras, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Lapras, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(56, 64), @@ -15767,6 +17118,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Lapras, gShinyOverworldPalette_Lapras ) @@ -15817,7 +17169,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_LaprasGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_LaprasGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_LaprasGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -15879,7 +17231,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Ditto, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 17 : 15, - .frontAnimFrames = sAnims_Ditto, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Ditto, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(48, 32), @@ -15896,6 +17253,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Ditto, gShinyOverworldPalette_Ditto ) @@ -15943,7 +17301,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Eevee, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 11, - .frontAnimFrames = sAnims_Eevee, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 33), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Eevee, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), @@ -15966,6 +17327,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Eevee, gShinyOverworldPalette_Eevee ) @@ -15973,7 +17335,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = sPicTable_EeveeF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sEeveeLevelUpLearnset, .teachableLearnset = sEeveeTeachableLearnset, @@ -16030,7 +17393,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_EeveeGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_EeveeGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_EeveeGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -16084,7 +17447,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Eevee, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Eevee, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 33), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Eevee, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -16111,6 +17477,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Eevee, gShinyOverworldPalette_Eevee ) @@ -16159,7 +17526,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Vaporeon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 9, - .frontAnimFrames = sAnims_Vaporeon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_STRETCH : ANIM_GLOW_BLUE, .backPic = gMonBackPic_Vaporeon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), @@ -16176,6 +17546,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vaporeon, gShinyOverworldPalette_Vaporeon ) @@ -16220,7 +17591,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Jolteon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 10, - .frontAnimFrames = sAnims_Jolteon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SQUISH_AND_BOUNCE : ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Jolteon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(56, 56), @@ -16237,6 +17611,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Jolteon, gShinyOverworldPalette_Jolteon ) @@ -16281,7 +17656,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Flareon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 11, - .frontAnimFrames = sAnims_Flareon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_STRETCH : ANIM_V_SHAKE, .backPic = gMonBackPic_Flareon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(64, 56), @@ -16298,6 +17676,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Flareon, gShinyOverworldPalette_Flareon ) @@ -16343,7 +17722,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Espeon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 9, - .frontAnimFrames = sAnims_Espeon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Espeon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), @@ -16360,6 +17743,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Espeon, gShinyOverworldPalette_Espeon ) @@ -16404,7 +17788,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Umbreon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 9, - .frontAnimFrames = sAnims_Umbreon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Umbreon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -16421,6 +17808,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Umbreon, gShinyOverworldPalette_Umbreon ) @@ -16467,7 +17855,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Leafeon, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Leafeon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Leafeon, .backPicSize = MON_COORDS_SIZE(48, 64), @@ -16484,6 +17876,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Leafeon, gShinyOverworldPalette_Leafeon ) @@ -16528,7 +17921,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Glaceon, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Glaceon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Glaceon, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -16545,6 +17942,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Glaceon, gShinyOverworldPalette_Glaceon ) @@ -16592,7 +17990,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Sylveon, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Sylveon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Sylveon, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -16609,6 +18011,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sylveon, gShinyOverworldPalette_Sylveon ) @@ -16660,7 +18063,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Porygon, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 14, - .frontAnimFrames = sAnims_Porygon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Porygon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 40), @@ -16677,6 +18085,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Porygon, gShinyOverworldPalette_Porygon ) @@ -16728,7 +18137,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Porygon2, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Porygon2, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 0 : 9, .backPic = gMonBackPic_Porygon2, @@ -16746,6 +18161,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Porygon2, gShinyOverworldPalette_Porygon2 ) @@ -16799,7 +18215,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_PorygonZ, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Porygon_Z, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 40), + ), .frontAnimId = ANIM_CIRCLE_C_CLOCKWISE_SLOW, .enemyMonElevation = 12, .backPic = gMonBackPic_PorygonZ, @@ -16817,6 +18238,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_PorygonZ, gShinyOverworldPalette_PorygonZ ) @@ -16871,7 +18293,16 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Omanyte, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 14, - .frontAnimFrames = sAnims_Omanyte, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE_SMALL, .backPic = gMonBackPic_Omanyte, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 40), @@ -16888,6 +18319,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Omanyte, gShinyOverworldPalette_Omanyte ) @@ -16934,7 +18366,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Omastar, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 9, - .frontAnimFrames = sAnims_Omastar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Omastar, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), @@ -16951,6 +18388,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Omastar, gShinyOverworldPalette_Omastar ) @@ -17003,7 +18441,16 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Kabuto, .frontPicSize = MON_COORDS_SIZE(40, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 17 : 16, - .frontAnimFrames = sAnims_Kabuto, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .backPic = gMonBackPic_Kabuto, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -17020,6 +18467,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Kabuto, gShinyOverworldPalette_Kabuto ) @@ -17072,7 +18520,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Kabutops, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 2, - .frontAnimFrames = sAnims_Kabutops, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Kabutops, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), @@ -17089,6 +18542,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kabutops, gShinyOverworldPalette_Kabutops ) @@ -17135,7 +18589,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Aerodactyl, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 4, - .frontAnimFrames = sAnims_Aerodactyl, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 25), + ), .frontAnimId = ANIM_V_SLIDE_SLOW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 7 : 9, .backPic = gMonBackPic_Aerodactyl, @@ -17153,6 +18612,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Aerodactyl, gShinyOverworldPalette_Aerodactyl ) @@ -17200,7 +18660,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_AerodactylMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_AerodactylMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 7, .backPic = gMonBackPic_AerodactylMega, @@ -17213,6 +18673,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 2, SHADOW(-2, 16, SHADOW_SIZE_M) FOOTPRINT(Aerodactyl) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_AerodactylMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE, + sAnimTable_Following, + gOverworldPalette_AerodactylMega, + gShinyOverworldPalette_AerodactylMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sAerodactylLevelUpLearnset, .teachableLearnset = sAerodactylTeachableLearnset, @@ -17264,7 +18735,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Munchlax, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Munchlax, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Munchlax, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -17281,6 +18756,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Munchlax, gShinyOverworldPalette_Munchlax ) @@ -17330,7 +18806,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Snorlax, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 1, - .frontAnimFrames = sAnims_Snorlax, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONCAVE : ANIM_V_STRETCH, .backPic = gMonBackPic_Snorlax, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 40), @@ -17347,6 +18827,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Snorlax, gShinyOverworldPalette_Snorlax ) @@ -17397,7 +18878,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_SnorlaxGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_SnorlaxGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SnorlaxGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -17463,7 +18944,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Articuno, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 2, - .frontAnimFrames = sAnims_Articuno, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_VIBRATE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 6 : 0, .backPic = gMonBackPic_Articuno, @@ -17481,6 +18967,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Articuno, gShinyOverworldPalette_Articuno ) @@ -17529,7 +19016,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_ArticunoGalar, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_ArticunoGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 10, .backPic = gMonBackPic_ArticunoGalar, @@ -17547,6 +19034,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ArticunoGalar, gShinyOverworldPalette_ArticunoGalar ) @@ -17608,7 +19096,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Zapdos, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Zapdos, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_FLASH_YELLOW, .enemyMonElevation = 8, .backPic = gMonBackPic_Zapdos, @@ -17626,6 +19119,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Zapdos, gShinyOverworldPalette_Zapdos ) @@ -17674,7 +19168,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_ZapdosGalar, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_ZapdosGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ZapdosGalar, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -17691,6 +19185,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ZapdosGalar, gShinyOverworldPalette_ZapdosGalar ) @@ -17748,7 +19243,40 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Moltres, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 1, - .frontAnimFrames = sAnims_Moltres, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 5 : 0, .backPic = gMonBackPic_Moltres, @@ -17766,6 +19294,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Moltres, gShinyOverworldPalette_Moltres ) @@ -17814,7 +19343,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MoltresGalar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_MoltresGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MoltresGalar, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -17831,6 +19360,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MoltresGalar, gShinyOverworldPalette_MoltresGalar ) @@ -17883,7 +19413,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Dratini, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 9, - .frontAnimFrames = sAnims_Dratini, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Dratini, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), @@ -17900,6 +19434,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Dratini, gShinyOverworldPalette_Dratini ) @@ -17947,7 +19482,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Dragonair, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 1, - .frontAnimFrames = sAnims_Dragonair, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SHAKE : ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Dragonair, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(40, 56), @@ -17964,6 +19504,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Dragonair, gShinyOverworldPalette_Dragonair ) @@ -18016,7 +19557,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Dragonite, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Dragonite, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SLIDE_SLOW : ANIM_V_SHAKE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 6 : 0, .backPic = gMonBackPic_Dragonite, @@ -18034,6 +19579,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Dragonite, gShinyOverworldPalette_Dragonite ) @@ -18086,7 +19632,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Mewtwo, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Mewtwo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Mewtwo, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), @@ -18103,6 +19652,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mewtwo, gShinyOverworldPalette_Mewtwo ) @@ -18153,7 +19703,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MewtwoMegaX, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_MewtwoMegaX, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MewtwoMegaX, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -18165,6 +19715,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 2, SHADOW(1, 12, SHADOW_SIZE_M) FOOTPRINT(Mewtwo) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_MewtwoMegaX, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_MewtwoMegaX, + gShinyOverworldPalette_MewtwoMegaX + ) + #endif //OW_BATTLE_ONLY_FORMS .isLegendary = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, @@ -18212,7 +19773,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_MewtwoMegaY, .frontPicSize = MON_COORDS_SIZE(40, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_MewtwoMegaY, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 3, .backPic = gMonBackPic_MewtwoMegaY, @@ -18225,6 +19786,17 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconPalIndex = 2, SHADOW(0, 14, SHADOW_SIZE_S) FOOTPRINT(Mewtwo) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_MewtwoMegaY, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_MewtwoMegaY, + gShinyOverworldPalette_MewtwoMegaY + ) + #endif //OW_BATTLE_ONLY_FORMS .isLegendary = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, @@ -18283,7 +19855,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .frontPic = gMonFrontPic_Mew, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 9, - .frontAnimFrames = sAnims_Mew, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONVEX : ANIM_ZIGZAG_SLOW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 11, .backPic = gMonBackPic_Mew, @@ -18301,6 +19877,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Mew, gShinyOverworldPalette_Mew ) diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index b3bd0da95a..fc12c19d46 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -41,7 +41,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Chikorita, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 10, - .frontAnimFrames = sAnims_Chikorita, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Chikorita, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(56, 48), @@ -58,6 +62,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Chikorita, gShinyOverworldPalette_Chikorita ) @@ -105,7 +110,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Bayleef, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(48, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 3, - .frontAnimFrames = sAnims_Bayleef, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Bayleef, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), @@ -122,6 +130,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bayleef, gShinyOverworldPalette_Bayleef ) @@ -174,7 +183,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Meganium, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Meganium, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_STRETCH : ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Meganium, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -197,6 +209,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Meganium, gShinyOverworldPalette_Meganium ) @@ -204,7 +217,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_MeganiumF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sMeganiumLevelUpLearnset, .teachableLearnset = sMeganiumTeachableLearnset, @@ -249,7 +263,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Cyndaquil, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Cyndaquil, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_JUMPS_SMALL : ANIM_V_STRETCH, .backPic = gMonBackPic_Cyndaquil, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 64), @@ -266,6 +285,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cyndaquil, gShinyOverworldPalette_Cyndaquil ) @@ -313,7 +333,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Quilava, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 9, - .frontAnimFrames = sAnims_Quilava, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_STRETCH : ANIM_H_STRETCH, .backPic = gMonBackPic_Quilava, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -330,6 +353,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Quilava, gShinyOverworldPalette_Quilava ) @@ -384,7 +408,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Typhlosion, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Typhlosion, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .frontAnimDelay = 20, .backPic = gMonBackPic_Typhlosion, @@ -402,6 +429,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Typhlosion, gShinyOverworldPalette_Typhlosion ) @@ -448,7 +476,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_TyphlosionHisui, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_TyphlosionHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_TyphlosionHisui, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -465,6 +493,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TyphlosionHisui, gShinyOverworldPalette_TyphlosionHisui ) @@ -514,7 +543,14 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Totodile, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 14, - .frontAnimFrames = sAnims_Totodile, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_H_JUMPS, .backPic = gMonBackPic_Totodile, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), @@ -531,6 +567,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Totodile, gShinyOverworldPalette_Totodile ) @@ -579,7 +616,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Croconaw, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 5, - .frontAnimFrames = sAnims_Croconaw, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Croconaw, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(56, 64), @@ -596,6 +636,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Croconaw, gShinyOverworldPalette_Croconaw ) @@ -648,7 +689,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Feraligatr, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 1, - .frontAnimFrames = sAnims_Feraligatr, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 40), + ), .frontAnimId = ANIM_H_SHAKE, .frontAnimDelay = 5, .backPic = gMonBackPic_Feraligatr, @@ -666,6 +712,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Feraligatr, gShinyOverworldPalette_Feraligatr ) @@ -712,7 +759,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Sentret, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 56) : MON_COORDS_SIZE(40, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 2, - .frontAnimFrames = sAnims_Sentret, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Sentret, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(48, 64), @@ -729,6 +781,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sentret, gShinyOverworldPalette_Sentret ) @@ -775,7 +828,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Furret, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 4, - .frontAnimFrames = sAnims_Furret, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Furret, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), @@ -792,6 +848,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Furret, gShinyOverworldPalette_Furret ) @@ -838,7 +895,20 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Hoothoot, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 12, - .frontAnimFrames = sAnims_Hoothoot, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = ANIM_V_SLIDE_SLOW, .backPic = gMonBackPic_Hoothoot, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 64), @@ -855,6 +925,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hoothoot, gShinyOverworldPalette_Hoothoot ) @@ -907,7 +978,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Noctowl, .frontPicSize = MON_COORDS_SIZE(40, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 2, - .frontAnimFrames = sAnims_Noctowl, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Noctowl, .backPicSize = MON_COORDS_SIZE(48, 64), @@ -924,6 +998,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Noctowl, gShinyOverworldPalette_Noctowl ) @@ -970,7 +1045,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Ledyba, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 10, - .frontAnimFrames = sAnims_Ledyba, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Ledyba, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -993,6 +1073,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Ledyba, gShinyOverworldPalette_Ledyba ) @@ -1000,7 +1081,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_LedybaF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_BUG + TRACKS_BUG, + sAnimTable_Following ) .levelUpLearnset = sLedybaLevelUpLearnset, .teachableLearnset = sLedybaTeachableLearnset, @@ -1045,7 +1127,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Ledian, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 6, - .frontAnimFrames = sAnims_Ledian, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SLIDE_SLOW : ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 10, .backPic = gMonBackPic_Ledian, @@ -1069,6 +1156,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ledian, gShinyOverworldPalette_Ledian ) @@ -1076,7 +1164,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_LedianF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sLedianLevelUpLearnset, .teachableLearnset = sLedianTeachableLearnset, @@ -1121,7 +1210,16 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Spinarak, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(48, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 19 : 16, - .frontAnimFrames = sAnims_Spinarak, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ), .frontAnimId = ANIM_CIRCLE_C_CLOCKWISE_SLOW, .backPic = gMonBackPic_Spinarak, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 24) : MON_COORDS_SIZE(64, 32), @@ -1138,6 +1236,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Spinarak, gShinyOverworldPalette_Spinarak ) @@ -1190,7 +1289,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Ariados, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 7, - .frontAnimFrames = sAnims_Ariados, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Ariados, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -1207,6 +1311,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Ariados, gShinyOverworldPalette_Ariados ) @@ -1254,7 +1359,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Chinchou, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 12, - .frontAnimFrames = sAnims_Chinchou, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Chinchou, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -1271,6 +1382,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Chinchou, gShinyOverworldPalette_Chinchou ) @@ -1318,7 +1430,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Lanturn, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Lanturn, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE_SMALL, .backPic = gMonBackPic_Lanturn, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -1335,6 +1453,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Lanturn, gShinyOverworldPalette_Lanturn ) @@ -1383,7 +1502,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Togepi, .frontPicSize = MON_COORDS_SIZE(24, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 20 : 16, - .frontAnimFrames = sAnims_Togepi, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONCAVE : ANIM_V_JUMPS_BIG, .backPic = gMonBackPic_Togepi, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(48, 40), @@ -1400,6 +1523,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Togepi, gShinyOverworldPalette_Togepi ) @@ -1446,7 +1570,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Togetic, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 8, - .frontAnimFrames = sAnims_Togetic, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Togetic, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), @@ -1463,6 +1591,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Togetic, gShinyOverworldPalette_Togetic ) @@ -1517,7 +1646,15 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Togekiss, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Togekiss, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_SWING_CONVEX, .enemyMonElevation = 14, .backPic = gMonBackPic_Togekiss, @@ -1535,6 +1672,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Togekiss, gShinyOverworldPalette_Togekiss ) @@ -1582,7 +1720,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Natu, .frontPicSize = MON_COORDS_SIZE(32, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 20 : 17, - .frontAnimFrames = sAnims_Natu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_JUMPS, .frontAnimDelay = 30, .backPic = gMonBackPic_Natu, @@ -1600,6 +1744,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Natu, gShinyOverworldPalette_Natu ) @@ -1647,7 +1792,15 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Xatu, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 56) : MON_COORDS_SIZE(40, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 5, - .frontAnimFrames = sAnims_Xatu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Xatu, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), @@ -1668,6 +1821,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Xatu, gShinyOverworldPalette_Xatu ) @@ -1675,7 +1829,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_XatuF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sXatuLevelUpLearnset, .teachableLearnset = sXatuTeachableLearnset, @@ -1720,7 +1875,14 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Mareep, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 12, - .frontAnimFrames = sAnims_Mareep, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .frontAnimDelay = 50, .backPic = gMonBackPic_Mareep, @@ -1738,6 +1900,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mareep, gShinyOverworldPalette_Mareep ) @@ -1784,7 +1947,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Flaaffy, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 9, - .frontAnimFrames = sAnims_Flaaffy, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_JUMPS_BIG : ANIM_V_STRETCH, .backPic = gMonBackPic_Flaaffy, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 56), @@ -1801,6 +1970,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Flaaffy, gShinyOverworldPalette_Flaaffy ) @@ -1856,7 +2026,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Ampharos, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 2, - .frontAnimFrames = sAnims_Ampharos, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_FLASH_YELLOW, .frontAnimDelay = 10, .backPic = gMonBackPic_Ampharos, @@ -1874,6 +2048,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ampharos, gShinyOverworldPalette_Ampharos ) @@ -1921,7 +2096,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_AmpharosMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_AmpharosMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_AmpharosMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1933,6 +2108,17 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .iconPalIndex = 0, SHADOW(-7, 13, SHADOW_SIZE_M) FOOTPRINT(Ampharos) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_AmpharosMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_AmpharosMega, + gShinyOverworldPalette_AmpharosMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sAmpharosLevelUpLearnset, .teachableLearnset = sAmpharosTeachableLearnset, @@ -1985,7 +2171,15 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Azurill, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 11, - .frontAnimFrames = sAnims_Azurill, + .frontAnimFrames = ANIM_FRAMES( + 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), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Azurill, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -2002,6 +2196,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Azurill, gShinyOverworldPalette_Azurill ) @@ -2053,7 +2248,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Marill, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Marill, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Marill, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(64, 40), @@ -2070,6 +2269,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Marill, gShinyOverworldPalette_Marill ) @@ -2128,7 +2328,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Azumarill, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 6, - .frontAnimFrames = sAnims_Azumarill, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW : ANIM_SHRINK_GROW, .backPic = gMonBackPic_Azumarill, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 64), @@ -2145,6 +2351,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Azumarill, gShinyOverworldPalette_Azumarill ) @@ -2192,7 +2399,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Bonsly, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Bonsly, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES, .backPic = gMonBackPic_Bonsly, .backPicSize = MON_COORDS_SIZE(40, 64), @@ -2209,6 +2422,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bonsly, gShinyOverworldPalette_Bonsly ) @@ -2256,7 +2470,14 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Sudowoodo, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 7, - .frontAnimFrames = sAnims_Sudowoodo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Sudowoodo, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 56), @@ -2279,6 +2500,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sudowoodo, gShinyOverworldPalette_Sudowoodo ) @@ -2286,7 +2508,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_SudowoodoF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sSudowoodoLevelUpLearnset, .teachableLearnset = sSudowoodoTeachableLearnset, @@ -2336,7 +2559,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Hoppip, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 14, - .frontAnimFrames = sAnims_Hoppip, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 11 : 15, .backPic = gMonBackPic_Hoppip, @@ -2354,6 +2582,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Hoppip, gShinyOverworldPalette_Hoppip ) @@ -2404,7 +2633,16 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Skiploom, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Skiploom, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_RISING_WOBBLE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 12 : 15, .backPic = gMonBackPic_Skiploom, @@ -2422,6 +2660,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Skiploom, gShinyOverworldPalette_Skiploom ) @@ -2479,7 +2718,14 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Jumpluff, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 9, - .frontAnimFrames = sAnims_Jumpluff, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE_SMALL, .enemyMonElevation = 9, .backPic = gMonBackPic_Jumpluff, @@ -2497,6 +2743,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Jumpluff, gShinyOverworldPalette_Jumpluff ) @@ -2543,7 +2790,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Aipom, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 64) : MON_COORDS_SIZE(32, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 1, - .frontAnimFrames = sAnims_Aipom, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Aipom, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 64), @@ -2566,6 +2816,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Aipom, gShinyOverworldPalette_Aipom ) @@ -2573,7 +2824,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_AipomF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sAipomLevelUpLearnset, .teachableLearnset = sAipomTeachableLearnset, @@ -2619,7 +2871,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Ambipom, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Ambipom, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_BACK_AND_LUNGE, .backPic = gMonBackPic_Ambipom, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2642,6 +2898,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ambipom, gShinyOverworldPalette_Ambipom ) @@ -2649,7 +2906,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_AmbipomF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sAmbipomLevelUpLearnset, .teachableLearnset = sAmbipomTeachableLearnset, @@ -2699,7 +2957,14 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Sunkern, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 32) : MON_COORDS_SIZE(32, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 17, - .frontAnimFrames = sAnims_Sunkern, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_JUMPS_SMALL : ANIM_H_JUMPS, .backPic = gMonBackPic_Sunkern, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(48, 48), @@ -2716,6 +2981,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Sunkern, gShinyOverworldPalette_Sunkern ) @@ -2766,7 +3032,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Sunflora, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Sunflora, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Sunflora, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), @@ -2783,6 +3053,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sunflora, gShinyOverworldPalette_Sunflora ) @@ -2830,7 +3101,30 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Yanma, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 14, - .frontAnimFrames = sAnims_Yanma, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ), .frontAnimId = ANIM_FIGURE_8, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 13, .backPic = gMonBackPic_Yanma, @@ -2848,6 +3142,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Yanma, gShinyOverworldPalette_Yanma ) @@ -2896,7 +3191,34 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Yanmega, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Yanmega, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ), .frontAnimId = ANIM_H_VIBRATE, .enemyMonElevation = 6, .backPic = gMonBackPic_Yanmega, @@ -2914,6 +3236,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Yanmega, gShinyOverworldPalette_Yanmega ) @@ -2961,7 +3284,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Wooper, .frontPicSize = MON_COORDS_SIZE(40, 32), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Wooper, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Wooper, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -2984,6 +3311,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Wooper, gShinyOverworldPalette_Wooper ) @@ -2991,7 +3319,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_WooperF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sWooperLevelUpLearnset, .teachableLearnset = sWooperTeachableLearnset, @@ -3037,7 +3366,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Quagsire, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 5, - .frontAnimFrames = sAnims_Quagsire, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Quagsire, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), @@ -3060,6 +3392,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Quagsire, gShinyOverworldPalette_Quagsire ) @@ -3067,7 +3400,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_QuagsireF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sQuagsireLevelUpLearnset, .teachableLearnset = sQuagsireTeachableLearnset, @@ -3111,7 +3445,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_WooperPaldea, .frontPicSize = MON_COORDS_SIZE(40, 32), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_WooperPaldea, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_WooperPaldea, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -3128,6 +3462,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_WooperPaldea, gShinyOverworldPalette_WooperPaldea ) @@ -3176,7 +3511,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Clodsire, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Clodsire, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Clodsire, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3193,6 +3528,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Clodsire, gShinyOverworldPalette_Clodsire ) @@ -3244,7 +3580,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Murkrow, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 15, - .frontAnimFrames = sAnims_Murkrow, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 0 : 12, .backPic = gMonBackPic_Murkrow, @@ -3268,6 +3607,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Murkrow, gShinyOverworldPalette_Murkrow ) @@ -3275,7 +3615,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_MurkrowF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sMurkrowLevelUpLearnset, .teachableLearnset = sMurkrowTeachableLearnset, @@ -3321,7 +3662,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Honchkrow, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Honchkrow, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 21), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Honchkrow, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3338,6 +3684,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Honchkrow, gShinyOverworldPalette_Honchkrow ) @@ -3386,7 +3733,18 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Misdreavus, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 13, - .frontAnimFrames = sAnims_Misdreavus, + .frontAnimFrames = ANIM_FRAMES( + 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, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 12, .backPic = gMonBackPic_Misdreavus, @@ -3404,6 +3762,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Misdreavus, gShinyOverworldPalette_Misdreavus ) @@ -3452,7 +3811,18 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Mismagius, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Mismagius, + .frontAnimFrames = ANIM_FRAMES( + 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, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 3, .backPic = gMonBackPic_Mismagius, @@ -3470,6 +3840,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mismagius, gShinyOverworldPalette_Mismagius ) @@ -3515,7 +3886,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Unown ##letter, \ .frontPicSize = MON_COORDS_SIZE(frontWidth, frontHeight), \ .frontPicYOffset = 16, \ - .frontAnimFrames = sAnims_Unown, \ + .frontAnimFrames = sAnims_SingleFramePlaceHolder, \ .frontAnimId = ANIM_ZIGZAG_FAST, \ .enemyMonElevation = 8, \ .backPic = gMonBackPic_Unown ##letter, \ @@ -3533,6 +3904,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_NONE, \ + sAnimTable_Following, \ gOverworldPalette_Unown, \ gShinyOverworldPalette_Unown, \ ) \ @@ -3611,7 +3983,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Wynaut, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Wynaut, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .frontAnimDelay = 15, .backPic = gMonBackPic_Wynaut, @@ -3629,6 +4007,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Wynaut, gShinyOverworldPalette_Wynaut ) @@ -3676,7 +4055,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Wobbuffet, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 5, - .frontAnimFrames = sAnims_Wobbuffet, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_DEEP_V_SQUISH_AND_BOUNCE : ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Wobbuffet, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(56, 56), @@ -3703,6 +4088,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Wobbuffet, gShinyOverworldPalette_Wobbuffet ) @@ -3710,7 +4096,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_WobbuffetF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .tmIlliterate = TRUE, .levelUpLearnset = sWobbuffetLevelUpLearnset, @@ -3756,7 +4143,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Girafarig, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 0, - .frontAnimFrames = sAnims_Girafarig, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_JUMPS_BIG : ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Girafarig, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -3779,6 +4170,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Girafarig, gShinyOverworldPalette_Girafarig ) @@ -3786,7 +4178,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_GirafarigF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sGirafarigLevelUpLearnset, .teachableLearnset = sGirafarigTeachableLearnset, @@ -3832,7 +4225,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Farigiraf, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Farigiraf, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Farigiraf, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3849,6 +4242,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Farigiraf, gShinyOverworldPalette_Farigiraf ) @@ -3896,7 +4290,16 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Pineco, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 12, - .frontAnimFrames = sAnims_Pineco, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONCAVE, .backPic = gMonBackPic_Pineco, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 40), @@ -3913,6 +4316,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Pineco, gShinyOverworldPalette_Pineco ) @@ -3959,7 +4363,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Forretress, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 8, - .frontAnimFrames = sAnims_Forretress, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Forretress, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -3976,6 +4385,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Forretress, gShinyOverworldPalette_Forretress ) @@ -4028,7 +4438,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Dunsparce, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 32) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 17 : 9, - .frontAnimFrames = sAnims_Dunsparce, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .frontAnimDelay = 10, .backPic = gMonBackPic_Dunsparce, @@ -4046,6 +4461,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Dunsparce, gShinyOverworldPalette_Dunsparce ) @@ -4094,7 +4510,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_DudunsparceTwoSegment, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Dudunsparce, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DudunsparceTwoSegment, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4111,6 +4527,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Dudunsparce, gShinyOverworldPalette_Dudunsparce ) @@ -4156,7 +4573,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_DudunsparceThreeSegment, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Dudunsparce, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DudunsparceThreeSegment, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4173,6 +4590,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_DudunsparceThreeSegment, gShinyOverworldPalette_DudunsparceThreeSegment ) @@ -4221,7 +4639,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Gligar, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 4, - .frontAnimFrames = sAnims_Gligar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 17), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SHRINK_GROW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 6 : 8, .backPic = gMonBackPic_Gligar, @@ -4245,6 +4666,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Gligar, gShinyOverworldPalette_Gligar ) @@ -4252,7 +4674,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_GligarF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_NONE + TRACKS_NONE, + sAnimTable_Following ) .levelUpLearnset = sGligarLevelUpLearnset, .teachableLearnset = sGligarTeachableLearnset, @@ -4299,7 +4722,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Gliscor, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Gliscor, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 40), + ), .frontAnimId = ANIM_SWING_CONVEX, .enemyMonElevation = 9, .backPic = gMonBackPic_Gliscor, @@ -4317,6 +4745,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gliscor, gShinyOverworldPalette_Gliscor ) @@ -4368,7 +4797,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Snubbull, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 12, - .frontAnimFrames = sAnims_Snubbull, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Snubbull, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(56, 40), @@ -4385,6 +4817,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Snubbull, gShinyOverworldPalette_Snubbull ) @@ -4439,7 +4872,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Granbull, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 56) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 4, - .frontAnimFrames = sAnims_Granbull, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Granbull, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(56, 48), @@ -4456,6 +4892,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Granbull, gShinyOverworldPalette_Granbull ) @@ -4512,7 +4949,15 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Qwilfish, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 8, - .frontAnimFrames = sAnims_Qwilfish, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_GROW_IN_STAGES, .frontAnimDelay = 39, .backPic = gMonBackPic_Qwilfish, @@ -4530,6 +4975,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Qwilfish, gShinyOverworldPalette_Qwilfish ) @@ -4578,7 +5024,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_QwilfishHisui, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_QwilfishHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 9, .backPic = gMonBackPic_QwilfishHisui, @@ -4596,6 +5042,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_QwilfishHisui, gShinyOverworldPalette_QwilfishHisui ) @@ -4643,7 +5090,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Overqwil, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Overqwil, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Overqwil, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4660,6 +5107,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Overqwil, gShinyOverworldPalette_Overqwil ) @@ -4714,7 +5162,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Shuckle, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 8, - .frontAnimFrames = sAnims_Shuckle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_SWING_CONCAVE, .backPic = gMonBackPic_Shuckle, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(48, 48), @@ -4731,6 +5183,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Shuckle, gShinyOverworldPalette_Shuckle ) @@ -4778,7 +5231,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Heracross, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 1, - .frontAnimFrames = sAnims_Heracross, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_LUNGE_GROW : ANIM_V_STRETCH, .backPic = gMonBackPic_Heracross, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(48, 64), @@ -4801,6 +5260,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Heracross, gShinyOverworldPalette_Heracross ) @@ -4808,7 +5268,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_HeracrossF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sHeracrossLevelUpLearnset, .teachableLearnset = sHeracrossTeachableLearnset, @@ -4855,7 +5316,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_HeracrossMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_HeracrossMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_HeracrossMega, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -4867,6 +5328,17 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .iconPalIndex = 0, SHADOW(2, 13, SHADOW_SIZE_M) FOOTPRINT(Heracross) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_HeracrossMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_HeracrossMega, + gShinyOverworldPalette_HeracrossMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sHeracrossLevelUpLearnset, .teachableLearnset = sHeracrossTeachableLearnset, @@ -4917,7 +5389,14 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Sneasel, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 8, - .frontAnimFrames = sAnims_Sneasel, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_STRETCH : ANIM_H_JUMPS, .backPic = gMonBackPic_Sneasel, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 64), @@ -4940,6 +5419,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sneasel, gShinyOverworldPalette_Sneasel ) @@ -4947,7 +5427,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_SneaselF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sSneaselLevelUpLearnset, .teachableLearnset = sSneaselTeachableLearnset, @@ -4997,7 +5478,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Weavile, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Weavile, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Weavile, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5020,6 +5504,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Weavile, gShinyOverworldPalette_Weavile ) @@ -5027,7 +5512,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_WeavileF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sWeavileLevelUpLearnset, .teachableLearnset = sWeavileTeachableLearnset, @@ -5074,7 +5560,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_SneaselHisui, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_SneaselHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SneaselHisui, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -5097,6 +5583,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SneaselHisui, gShinyOverworldPalette_SneaselHisui ) @@ -5104,7 +5591,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_SneaselHisuiF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .isHisuianForm = TRUE, .levelUpLearnset = sSneaselHisuiLevelUpLearnset, @@ -5151,7 +5639,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Sneasler, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Sneasler, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Sneasler, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5168,6 +5656,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sneasler, gShinyOverworldPalette_Sneasler ) @@ -5221,7 +5710,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Teddiursa, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 12, - .frontAnimFrames = sAnims_Teddiursa, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Teddiursa, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -5238,6 +5730,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Teddiursa, gShinyOverworldPalette_Teddiursa ) @@ -5288,7 +5781,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Ursaring, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, - .frontAnimFrames = sAnims_Ursaring, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SHAKE : ANIM_H_SHAKE, .backPic = gMonBackPic_Ursaring, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(56, 64), @@ -5311,6 +5807,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ursaring, gShinyOverworldPalette_Ursaring ) @@ -5318,7 +5815,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_UrsaringF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sUrsaringLevelUpLearnset, .teachableLearnset = sUrsaringTeachableLearnset, @@ -5363,7 +5861,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Ursaluna, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Ursaluna, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Ursaluna, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5380,6 +5878,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ursaluna, gShinyOverworldPalette_Ursaluna ) @@ -5425,7 +5924,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_UrsalunaBloodmoon, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_UrsalunaBloodmoon, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_UrsalunaBloodmoon, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5482,7 +5981,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Slugma, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(32, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 12, - .frontAnimFrames = sAnims_Slugma, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Slugma, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 56), @@ -5499,6 +6004,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Slugma, gShinyOverworldPalette_Slugma ) @@ -5552,7 +6058,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Magcargo, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 56) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 6, - .frontAnimFrames = sAnims_Magcargo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Magcargo, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), @@ -5569,6 +6081,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Magcargo, gShinyOverworldPalette_Magcargo ) @@ -5619,7 +6132,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Swinub, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 24) : MON_COORDS_SIZE(40, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 20 : 18, - .frontAnimFrames = sAnims_Swinub, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Swinub, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 24) : MON_COORDS_SIZE(56, 40), @@ -5636,6 +6154,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Swinub, gShinyOverworldPalette_Swinub ) @@ -5687,7 +6206,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Piloswine, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Piloswine, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Piloswine, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(64, 48), @@ -5710,6 +6234,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Piloswine, gShinyOverworldPalette_Piloswine ) @@ -5717,7 +6242,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_PiloswineF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sPiloswineLevelUpLearnset, .teachableLearnset = sPiloswineTeachableLearnset, @@ -5768,7 +6294,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Mamoswine, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Mamoswine, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_BACK_AND_LUNGE, .backPic = gMonBackPic_Mamoswine, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -5789,6 +6319,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mamoswine, gShinyOverworldPalette_Mamoswine ) @@ -5796,7 +6327,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_MamoswineF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sMamoswineLevelUpLearnset, .teachableLearnset = sMamoswineTeachableLearnset, @@ -5854,7 +6386,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Corsola, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Corsola, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Corsola, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 48), @@ -5871,6 +6409,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Corsola, gShinyOverworldPalette_Corsola ) @@ -5918,7 +6457,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_CorsolaGalar, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_CorsolaGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CorsolaGalar, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -5935,6 +6474,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_CorsolaGalar, gShinyOverworldPalette_CorsolaGalar ) @@ -5983,7 +6523,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Cursola, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Cursola, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Cursola, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6000,6 +6540,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cursola, gShinyOverworldPalette_Cursola ) @@ -6051,7 +6592,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Remoraid, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 11, - .frontAnimFrames = sAnims_Remoraid, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_JUMPS_SMALL : ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Remoraid, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -6068,6 +6613,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Remoraid, gShinyOverworldPalette_Remoraid ) @@ -6119,7 +6665,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Octillery, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 8, - .frontAnimFrames = sAnims_Octillery, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .frontAnimDelay = 20, .backPic = gMonBackPic_Octillery, @@ -6143,6 +6694,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Octillery, gShinyOverworldPalette_Octillery ) @@ -6150,7 +6702,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_OctilleryF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_SLITHER + TRACKS_SLITHER, + sAnimTable_Following ) .levelUpLearnset = sOctilleryLevelUpLearnset, .teachableLearnset = sOctilleryTeachableLearnset, @@ -6195,7 +6748,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Delibird, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 7, - .frontAnimFrames = sAnims_Delibird, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_JUMPS_SMALL : ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Delibird, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(56, 56), @@ -6212,6 +6768,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Delibird, gShinyOverworldPalette_Delibird ) @@ -6260,7 +6817,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Mantyke, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Mantyke, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_TWIST_TWICE, .backPic = gMonBackPic_Mantyke, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6277,6 +6839,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mantyke, gShinyOverworldPalette_Mantyke ) @@ -6330,7 +6893,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Mantine, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 9, - .frontAnimFrames = sAnims_Mantine, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 40), + ), .frontAnimId = ANIM_SWING_CONVEX, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 0 : 6, .backPic = gMonBackPic_Mantine, @@ -6348,6 +6916,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Mantine, gShinyOverworldPalette_Mantine ) @@ -6396,7 +6965,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Skarmory, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 1, - .frontAnimFrames = sAnims_Skarmory, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_STRETCH : ANIM_V_SHAKE, .backPic = gMonBackPic_Skarmory, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(48, 64), @@ -6413,6 +6985,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Skarmory, gShinyOverworldPalette_Skarmory ) @@ -6460,7 +7033,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Houndour, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 9, - .frontAnimFrames = sAnims_Houndour, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Houndour, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(40, 48), @@ -6477,6 +7053,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Houndour, gShinyOverworldPalette_Houndour ) @@ -6523,7 +7100,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Houndoom, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 0, - .frontAnimFrames = sAnims_Houndoom, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Houndoom, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6546,6 +7126,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Houndoom, gShinyOverworldPalette_Houndoom ) @@ -6553,7 +7134,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_HoundoomF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sHoundoomLevelUpLearnset, .teachableLearnset = sHoundoomTeachableLearnset, @@ -6598,7 +7180,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_HoundoomMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_HoundoomMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_HoundoomMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6610,6 +7192,17 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .iconPalIndex = 0, SHADOW(-5, 13, SHADOW_SIZE_L) FOOTPRINT(Houndoom) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_HoundoomMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_HoundoomMega, + gShinyOverworldPalette_HoundoomMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sHoundoomLevelUpLearnset, .teachableLearnset = sHoundoomTeachableLearnset, @@ -6657,7 +7250,15 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Phanpy, .frontPicSize = MON_COORDS_SIZE(40, 32), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Phanpy, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Phanpy, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(56, 40), @@ -6674,6 +7275,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Phanpy, gShinyOverworldPalette_Phanpy ) @@ -6721,7 +7323,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Donphan, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 9, - .frontAnimFrames = sAnims_Donphan, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SHAKE_TWICE : ANIM_ROTATE_UP_SLAM_DOWN, .backPic = gMonBackPic_Donphan, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(64, 48), @@ -6744,6 +7350,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Donphan, gShinyOverworldPalette_Donphan ) @@ -6751,7 +7358,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = sPicTable_DonphanF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sDonphanLevelUpLearnset, .teachableLearnset = sDonphanTeachableLearnset, @@ -6800,7 +7408,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Stantler, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Stantler, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Stantler, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), @@ -6817,6 +7428,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Stantler, gShinyOverworldPalette_Stantler ) @@ -6865,7 +7477,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Wyrdeer, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Wyrdeer, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Wyrdeer, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6882,6 +7494,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Wyrdeer, gShinyOverworldPalette_Wyrdeer ) @@ -6933,7 +7546,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Smeargle, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Smeargle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_JUMPS : ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Smeargle, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -6950,6 +7568,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Smeargle, gShinyOverworldPalette_Smeargle ) @@ -7003,7 +7622,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Miltank, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 8, - .frontAnimFrames = sAnims_Miltank, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Miltank, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -7020,6 +7642,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Miltank, gShinyOverworldPalette_Miltank ) @@ -7078,7 +7701,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Raikou, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 5, - .frontAnimFrames = sAnims_Raikou, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_FLASH_YELLOW : ANIM_V_STRETCH, .backPic = gMonBackPic_Raikou, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -7095,6 +7722,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Raikou, gShinyOverworldPalette_Raikou ) @@ -7154,7 +7782,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Entei, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 2, - .frontAnimFrames = sAnims_Entei, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Entei, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 48), @@ -7171,6 +7802,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Entei, gShinyOverworldPalette_Entei ) @@ -7230,7 +7862,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Suicune, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 3, - .frontAnimFrames = sAnims_Suicune, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Suicune, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7247,6 +7882,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Suicune, gShinyOverworldPalette_Suicune ) @@ -7295,7 +7931,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Larvitar, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 48) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 10, - .frontAnimFrames = sAnims_Larvitar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Larvitar, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 64), @@ -7312,6 +7953,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Larvitar, gShinyOverworldPalette_Larvitar ) @@ -7358,7 +8000,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Pupitar, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 11, - .frontAnimFrames = sAnims_Pupitar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SHAKE : ANIM_H_SHAKE, .backPic = gMonBackPic_Pupitar, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -7375,6 +8020,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Pupitar, gShinyOverworldPalette_Pupitar ) @@ -7426,7 +8072,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Tyranitar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Tyranitar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SHAKE : ANIM_V_SHAKE, .frontAnimDelay = 10, .backPic = gMonBackPic_Tyranitar, @@ -7444,6 +8094,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tyranitar, gShinyOverworldPalette_Tyranitar ) @@ -7491,7 +8142,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_TyranitarMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_TyranitarMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_TyranitarMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7503,6 +8154,17 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .iconPalIndex = 1, SHADOW(-1, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Tyranitar) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_TyranitarMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_TyranitarMega, + gShinyOverworldPalette_TyranitarMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sTyranitarLevelUpLearnset, .teachableLearnset = sTyranitarTeachableLearnset, @@ -7556,7 +8218,20 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Lugia, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Lugia, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_IN_STAGES, .frontAnimDelay = 20, .enemyMonElevation = 6, @@ -7575,6 +8250,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Lugia, gShinyOverworldPalette_Lugia ) @@ -7632,7 +8308,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_HoOh, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_HoOh, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_GROW_VIBRATE, .enemyMonElevation = 6, .backPic = gMonBackPic_HoOh, @@ -7650,6 +8329,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_HoOh, gShinyOverworldPalette_HoOh ) @@ -7707,7 +8387,12 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .frontPic = gMonFrontPic_Celebi, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 12, - .frontAnimFrames = sAnims_Celebi, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_RISING_WOBBLE : ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 15, .backPic = gMonBackPic_Celebi, @@ -7725,6 +8410,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Celebi, gShinyOverworldPalette_Celebi ) diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index af1b4476d8..7b87415c76 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -41,7 +41,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Treecko, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Treecko, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 3), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Treecko, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(56, 48), @@ -58,6 +64,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Treecko, gShinyOverworldPalette_Treecko ) @@ -104,7 +111,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Grovyle, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 5, - .frontAnimFrames = sAnims_Grovyle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 6), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Grovyle, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -121,6 +134,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Grovyle, gShinyOverworldPalette_Grovyle ) @@ -172,7 +186,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Sceptile, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Sceptile, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 26), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Sceptile, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -189,6 +207,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sceptile, gShinyOverworldPalette_Sceptile ) @@ -236,7 +255,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_SceptileMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_SceptileMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SceptileMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -248,6 +267,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 1, SHADOW(3, 11, SHADOW_SIZE_L) FOOTPRINT(Sceptile) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_SceptileMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_SceptileMega, + gShinyOverworldPalette_SceptileMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sSceptileLevelUpLearnset, .teachableLearnset = sSceptileTeachableLearnset, @@ -295,7 +325,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Torchic, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(32, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 12, - .frontAnimFrames = sAnims_Torchic, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_STRETCH : ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Torchic, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(40, 48), @@ -316,6 +354,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Torchic, gShinyOverworldPalette_Torchic ) @@ -323,7 +362,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_TorchicF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sTorchicLevelUpLearnset, .teachableLearnset = sTorchicTeachableLearnset, @@ -369,7 +409,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Combusken, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(48, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 3, - .frontAnimFrames = sAnims_Combusken, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 12), + ), .frontAnimId = ANIM_V_JUMPS_H_JUMPS, .backPic = gMonBackPic_Combusken, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -392,6 +436,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Combusken, gShinyOverworldPalette_Combusken ) @@ -399,7 +444,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_CombuskenF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sCombuskenLevelUpLearnset, .teachableLearnset = sCombuskenTeachableLearnset, @@ -449,7 +495,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Blaziken, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Blaziken, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Blaziken, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -472,6 +524,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Blaziken, gShinyOverworldPalette_Blaziken ) @@ -479,7 +532,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_BlazikenF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sBlazikenLevelUpLearnset, .teachableLearnset = sBlazikenTeachableLearnset, @@ -525,7 +579,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_BlazikenMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_BlazikenMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_BlazikenMega, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -537,6 +591,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(2, 11, SHADOW_SIZE_M) FOOTPRINT(Blaziken) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_BlazikenMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_BlazikenMega, + gShinyOverworldPalette_BlazikenMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sBlazikenLevelUpLearnset, .teachableLearnset = sBlazikenTeachableLearnset, @@ -584,7 +649,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Mudkip, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 13, - .frontAnimFrames = sAnims_Mudkip, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 13), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Mudkip, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(48, 48), @@ -601,6 +672,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mudkip, gShinyOverworldPalette_Mudkip ) @@ -647,7 +719,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Marshtomp, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 7, - .frontAnimFrames = sAnims_Marshtomp, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SLIDE : ANIM_V_STRETCH, .backPic = gMonBackPic_Marshtomp, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -664,6 +746,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Marshtomp, gShinyOverworldPalette_Marshtomp ) @@ -715,7 +798,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Swampert, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 6, - .frontAnimFrames = sAnims_Swampert, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_JUMPS_BIG : ANIM_H_SHAKE, .backPic = gMonBackPic_Swampert, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -732,6 +821,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Swampert, gShinyOverworldPalette_Swampert ) @@ -779,7 +869,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_SwampertMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_SwampertMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SwampertMega, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -791,6 +881,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(6, 8, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Swampert) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_SwampertMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_SwampertMega, + gShinyOverworldPalette_SwampertMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sSwampertLevelUpLearnset, .teachableLearnset = sSwampertTeachableLearnset, @@ -848,7 +949,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Poochyena, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 11, - .frontAnimFrames = sAnims_Poochyena, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Poochyena, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), @@ -865,6 +970,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Poochyena, gShinyOverworldPalette_Poochyena ) @@ -915,7 +1021,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Mightyena, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 3, - .frontAnimFrames = sAnims_Mightyena, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Mightyena, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -932,6 +1044,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mightyena, gShinyOverworldPalette_Mightyena ) @@ -992,7 +1105,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Zigzagoon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(56, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 12, - .frontAnimFrames = sAnims_Zigzagoon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Zigzagoon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(56, 56), @@ -1009,6 +1128,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zigzagoon, gShinyOverworldPalette_Zigzagoon ) @@ -1062,7 +1182,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Linoone, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 13, - .frontAnimFrames = sAnims_Linoone, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Linoone, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(56, 40), @@ -1079,6 +1205,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Linoone, gShinyOverworldPalette_Linoone ) @@ -1125,7 +1252,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_ZigzagoonGalar, .frontPicSize = MON_COORDS_SIZE(56, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_ZigzagoonGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ZigzagoonGalar, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -1142,6 +1269,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ZigzagoonGalar, gShinyOverworldPalette_ZigzagoonGalar ) @@ -1190,7 +1318,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_LinooneGalar, .frontPicSize = MON_COORDS_SIZE(64, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_LinooneGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_LinooneGalar, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -1207,6 +1335,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_LinooneGalar, gShinyOverworldPalette_LinooneGalar ) @@ -1254,7 +1383,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Obstagoon, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Obstagoon, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Obstagoon, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1271,6 +1400,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Obstagoon, gShinyOverworldPalette_Obstagoon ) @@ -1326,7 +1456,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Wurmple, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 12, - .frontAnimFrames = sAnims_Wurmple, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Wurmple, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 56), @@ -1343,6 +1477,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Wurmple, gShinyOverworldPalette_Wurmple ) @@ -1390,7 +1525,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Silcoon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 17 : 10, - .frontAnimFrames = sAnims_Silcoon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Silcoon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 24) : MON_COORDS_SIZE(64, 40), @@ -1407,6 +1546,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Silcoon, gShinyOverworldPalette_Silcoon ) @@ -1462,7 +1602,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Beautifly, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Beautifly, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ), .frontAnimId = ANIM_V_SLIDE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 10, .backPic = gMonBackPic_Beautifly, @@ -1486,6 +1636,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Beautifly, gShinyOverworldPalette_Beautifly ) @@ -1493,7 +1644,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_BeautiflyF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_NONE + TRACKS_NONE, + sAnimTable_Following ) .levelUpLearnset = sBeautiflyLevelUpLearnset, .teachableLearnset = sBeautiflyTeachableLearnset, @@ -1542,7 +1694,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Cascoon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 32) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 10, - .frontAnimFrames = sAnims_Cascoon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SLIDE, .backPic = gMonBackPic_Cascoon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 24) : MON_COORDS_SIZE(56, 40), @@ -1559,6 +1717,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Cascoon, gShinyOverworldPalette_Cascoon ) @@ -1616,7 +1775,23 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Dustox, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 12, - .frontAnimFrames = sAnims_Dustox, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_JUMPS_H_JUMPS, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 10 : 12, .backPic = gMonBackPic_Dustox, @@ -1640,6 +1815,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Dustox, gShinyOverworldPalette_Dustox ) @@ -1647,7 +1823,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_DustoxF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_NONE + TRACKS_NONE, + sAnimTable_Following ) .levelUpLearnset = sDustoxLevelUpLearnset, .teachableLearnset = sDustoxTeachableLearnset, @@ -1693,7 +1870,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Lotad, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 13, - .frontAnimFrames = sAnims_Lotad, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 55), + ANIMCMD_FRAME(0, 22), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Lotad, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -1710,6 +1891,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lotad, gShinyOverworldPalette_Lotad ) @@ -1757,7 +1939,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Lombre, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 10, - .frontAnimFrames = sAnims_Lombre, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Lombre, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(48, 56), @@ -1774,6 +1962,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lombre, gShinyOverworldPalette_Lombre ) @@ -1826,7 +2015,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Ludicolo, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Ludicolo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, .backPic = gMonBackPic_Ludicolo, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -1849,6 +2046,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ludicolo, gShinyOverworldPalette_Ludicolo ) @@ -1856,7 +2054,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_LudicoloF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sLudicoloLevelUpLearnset, .teachableLearnset = sLudicoloTeachableLearnset, @@ -1902,7 +2101,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Seedot, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 48) : MON_COORDS_SIZE(32, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 12, - .frontAnimFrames = sAnims_Seedot, + .frontAnimFrames = ANIM_FRAMES( + 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), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES : ANIM_V_JUMPS_H_JUMPS, .backPic = gMonBackPic_Seedot, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(48, 48), @@ -1919,6 +2128,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Seedot, gShinyOverworldPalette_Seedot ) @@ -1966,7 +2176,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Nuzleaf, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(40, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 7, - .frontAnimFrames = sAnims_Nuzleaf, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Nuzleaf, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -1989,6 +2209,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Nuzleaf, gShinyOverworldPalette_Nuzleaf ) @@ -1996,7 +2217,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_NuzleafF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sNuzleafLevelUpLearnset, .teachableLearnset = sNuzleafTeachableLearnset, @@ -2051,7 +2273,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Shiftry, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 7, - .frontAnimFrames = sAnims_Shiftry, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Shiftry, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -2074,6 +2300,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Shiftry, gShinyOverworldPalette_Shiftry ) @@ -2081,7 +2308,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_ShiftryF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sShiftryLevelUpLearnset, .teachableLearnset = sShiftryTeachableLearnset, @@ -2126,7 +2354,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Taillow, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 32) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 11, - .frontAnimFrames = sAnims_Taillow, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_JUMPS_BIG, .backPic = gMonBackPic_Taillow, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 32) : MON_COORDS_SIZE(56, 40), @@ -2143,6 +2381,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Taillow, gShinyOverworldPalette_Taillow ) @@ -2195,7 +2434,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Swellow, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 5, - .frontAnimFrames = sAnims_Swellow, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Swellow, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(56, 56), @@ -2212,6 +2455,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Swellow, gShinyOverworldPalette_Swellow ) @@ -2263,7 +2507,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Wingull, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 32) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 24 : 11, - .frontAnimFrames = sAnims_Wingull, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 13), + ), .frontAnimId = ANIM_H_PIVOT, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 16 : 15, .backPic = gMonBackPic_Wingull, @@ -2281,6 +2529,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Wingull, gShinyOverworldPalette_Wingull ) @@ -2338,7 +2587,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Pelipper, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 2, - .frontAnimFrames = sAnims_Pelipper, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 8, .backPic = gMonBackPic_Pelipper, @@ -2356,6 +2615,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Pelipper, gShinyOverworldPalette_Pelipper ) @@ -2410,7 +2670,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Ralts, .frontPicSize = MON_COORDS_SIZE(24, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 12, - .frontAnimFrames = sAnims_Ralts, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Ralts, .backPicSize = MON_COORDS_SIZE(32, 40), @@ -2427,6 +2691,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ralts, gShinyOverworldPalette_Ralts ) @@ -2473,7 +2738,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Kirlia, .frontPicSize = MON_COORDS_SIZE(32, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Kirlia, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 39), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Kirlia, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 56) : MON_COORDS_SIZE(48, 56), @@ -2490,6 +2759,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kirlia, gShinyOverworldPalette_Kirlia ) @@ -2542,7 +2812,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Gardevoir, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, - .frontAnimFrames = sAnims_Gardevoir, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SQUISH_AND_BOUNCE : ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Gardevoir, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(48, 56), @@ -2559,6 +2833,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gardevoir, gShinyOverworldPalette_Gardevoir ) @@ -2606,7 +2881,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_GardevoirMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_GardevoirMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GardevoirMega, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -2618,6 +2893,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 1, SHADOW(1, 14, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Gardevoir) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_GardevoirMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_GardevoirMega, + gShinyOverworldPalette_GardevoirMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sGardevoirLevelUpLearnset, .teachableLearnset = sGardevoirTeachableLearnset, @@ -2674,7 +2960,10 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Gallade, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Gallade, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Gallade, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2691,6 +2980,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gallade, gShinyOverworldPalette_Gallade ) @@ -2738,7 +3028,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_GalladeMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_GalladeMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GalladeMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2750,6 +3040,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 1, SHADOW(-2, 13, SHADOW_SIZE_L) FOOTPRINT(Gallade) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_GalladeMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_GalladeMega, + gShinyOverworldPalette_GalladeMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sGalladeLevelUpLearnset, .teachableLearnset = sGalladeTeachableLearnset, @@ -2799,7 +3100,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Surskit, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 8, - .frontAnimFrames = sAnims_Surskit, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Surskit, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(56, 40), @@ -2816,6 +3123,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Surskit, gShinyOverworldPalette_Surskit ) @@ -2870,7 +3178,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Masquerain, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 4, - .frontAnimFrames = sAnims_Masquerain, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 10, .backPic = gMonBackPic_Masquerain, @@ -2888,6 +3206,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Masquerain, gShinyOverworldPalette_Masquerain ) @@ -2940,7 +3259,19 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Shroomish, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 14, - .frontAnimFrames = sAnims_Shroomish, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Shroomish, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(56, 48), @@ -2957,6 +3288,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Shroomish, gShinyOverworldPalette_Shroomish ) @@ -3009,7 +3341,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Breloom, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(48, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 3, - .frontAnimFrames = sAnims_Breloom, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Breloom, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -3026,6 +3364,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Breloom, gShinyOverworldPalette_Breloom ) @@ -3072,7 +3411,14 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Slakoth, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 32) : MON_COORDS_SIZE(56, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 18 : 15, - .frontAnimFrames = sAnims_Slakoth, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Slakoth, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -3089,6 +3435,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Slakoth, gShinyOverworldPalette_Slakoth ) @@ -3135,7 +3482,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Vigoroth, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 7, - .frontAnimFrames = sAnims_Vigoroth, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_H_JUMPS, .backPic = gMonBackPic_Vigoroth, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(56, 64), @@ -3152,6 +3507,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vigoroth, gShinyOverworldPalette_Vigoroth ) @@ -3203,7 +3559,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Slaking, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 7, - .frontAnimFrames = sAnims_Slaking, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Slaking, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -3220,6 +3584,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Slaking, gShinyOverworldPalette_Slaking ) @@ -3267,7 +3632,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Nincada, .frontPicSize = MON_COORDS_SIZE(56, 32), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 18 : 16, - .frontAnimFrames = sAnims_Nincada, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 33), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Nincada, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 24) : MON_COORDS_SIZE(64, 32), @@ -3284,6 +3655,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Nincada, gShinyOverworldPalette_Nincada ) @@ -3331,7 +3703,26 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Ninjask, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 11, - .frontAnimFrames = sAnims_Ninjask, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 33), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .enemyMonElevation = 10, .backPic = gMonBackPic_Ninjask, @@ -3349,6 +3740,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Ninjask, gShinyOverworldPalette_Ninjask ) @@ -3393,7 +3785,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Shedinja, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Shedinja, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 33), + ANIMCMD_FRAME(1, 33), + ANIMCMD_FRAME(0, 33), + ANIMCMD_FRAME(1, 33), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 8, .backPic = gMonBackPic_Shedinja, @@ -3411,6 +3809,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Shedinja, gShinyOverworldPalette_Shedinja ) @@ -3457,7 +3856,18 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Whismur, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 13, - .frontAnimFrames = sAnims_Whismur, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 33), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ), .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Whismur, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(56, 40), @@ -3474,6 +3884,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Whismur, gShinyOverworldPalette_Whismur ) @@ -3520,7 +3931,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Loudred, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Loudred, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 33), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW : ANIM_SHRINK_GROW, .backPic = gMonBackPic_Loudred, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -3537,6 +3954,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Loudred, gShinyOverworldPalette_Loudred ) @@ -3590,7 +4008,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Exploud, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, - .frontAnimFrames = sAnims_Exploud, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 9), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Exploud, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3607,6 +4029,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Exploud, gShinyOverworldPalette_Exploud ) @@ -3654,7 +4077,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Makuhita, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 8, - .frontAnimFrames = sAnims_Makuhita, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 22), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONCAVE : ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Makuhita, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(56, 56), @@ -3671,6 +4104,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Makuhita, gShinyOverworldPalette_Makuhita ) @@ -3718,7 +4152,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Hariyama, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, - .frontAnimFrames = sAnims_Hariyama, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_ROTATE_UP_TO_SIDES, .backPic = gMonBackPic_Hariyama, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3735,6 +4174,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hariyama, gShinyOverworldPalette_Hariyama ) @@ -3782,7 +4222,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Nosepass, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 10, - .frontAnimFrames = sAnims_Nosepass, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 27), + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 27), + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 27), + ANIMCMD_FRAME(0, 3), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW : ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Nosepass, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(56, 48), @@ -3799,6 +4247,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Nosepass, gShinyOverworldPalette_Nosepass ) @@ -3849,7 +4298,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Probopass, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Probopass, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE, .enemyMonElevation = 6, .backPic = gMonBackPic_Probopass, @@ -3867,6 +4322,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Probopass, gShinyOverworldPalette_Probopass ) @@ -3918,7 +4374,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Skitty, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 12, - .frontAnimFrames = sAnims_Skitty, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 9), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Skitty, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -3935,6 +4395,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Skitty, gShinyOverworldPalette_Skitty ) @@ -3992,7 +4453,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Delcatty, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 4, - .frontAnimFrames = sAnims_Delcatty, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 46), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Delcatty, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 64), @@ -4009,6 +4474,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Delcatty, gShinyOverworldPalette_Delcatty ) @@ -4061,7 +4527,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Sableye, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 10, - .frontAnimFrames = sAnims_Sableye, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GLOW_BLACK, .backPic = gMonBackPic_Sableye, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(48, 48), @@ -4078,6 +4550,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sableye, gShinyOverworldPalette_Sableye ) @@ -4126,7 +4599,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_SableyeMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_SableyeMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SableyeMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4138,6 +4611,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 2, SHADOW(3, 7, SHADOW_SIZE_S) FOOTPRINT(Sableye) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_SableyeMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_SableyeMega, + gShinyOverworldPalette_SableyeMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sSableyeLevelUpLearnset, .teachableLearnset = sSableyeTeachableLearnset, @@ -4194,7 +4678,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Mawile, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Mawile, + .frontAnimFrames = ANIM_FRAMES( + 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), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Mawile, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4211,6 +4703,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mawile, gShinyOverworldPalette_Mawile ) @@ -4260,7 +4753,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_MawileMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_MawileMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MawileMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4272,6 +4765,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(0, 9, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Mawile) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_MawileMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_MawileMega, + gShinyOverworldPalette_MawileMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sMawileLevelUpLearnset, .teachableLearnset = sMawileTeachableLearnset, @@ -4321,7 +4825,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Aron, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 24) : MON_COORDS_SIZE(32, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 20 : 14, - .frontAnimFrames = sAnims_Aron, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 33), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 33), + ANIMCMD_FRAME(1, 33), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Aron, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(48, 40), @@ -4338,6 +4848,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Aron, gShinyOverworldPalette_Aron ) @@ -4385,7 +4896,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Lairon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 8, - .frontAnimFrames = sAnims_Lairon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 29), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 29), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Lairon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 32) : MON_COORDS_SIZE(64, 40), @@ -4402,6 +4919,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lairon, gShinyOverworldPalette_Lairon ) @@ -4454,7 +4972,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Aggron, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Aggron, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Aggron, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4471,6 +4993,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Aggron, gShinyOverworldPalette_Aggron ) @@ -4519,7 +5042,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_AggronMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_AggronMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_AggronMega, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4531,6 +5054,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 2, SHADOW(1, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Aggron) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_AggronMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_AggronMega, + gShinyOverworldPalette_AggronMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sAggronLevelUpLearnset, .teachableLearnset = sAggronTeachableLearnset, @@ -4578,7 +5112,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Meditite, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(48, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 10, - .frontAnimFrames = sAnims_Meditite, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 22), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES, .backPic = gMonBackPic_Meditite, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(48, 48), @@ -4601,6 +5139,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Meditite, gShinyOverworldPalette_Meditite ) @@ -4608,7 +5147,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_MedititeF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sMedititeLevelUpLearnset, .teachableLearnset = sMedititeTeachableLearnset, @@ -4653,7 +5193,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Medicham, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 64) : MON_COORDS_SIZE(40, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, - .frontAnimFrames = sAnims_Medicham, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Medicham, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 64) : MON_COORDS_SIZE(56, 64), @@ -4676,6 +5224,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Medicham, gShinyOverworldPalette_Medicham ) @@ -4683,7 +5232,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_MedichamF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sMedichamLevelUpLearnset, .teachableLearnset = sMedichamTeachableLearnset, @@ -4729,7 +5279,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_MedichamMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_MedichamMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MedichamMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4741,6 +5291,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(-2, 13, SHADOW_SIZE_S) FOOTPRINT(Medicham) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_MedichamMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_MedichamMega, + gShinyOverworldPalette_MedichamMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sMedichamLevelUpLearnset, .teachableLearnset = sMedichamTeachableLearnset, @@ -4788,7 +5349,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Electrike, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 32) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 18 : 14, - .frontAnimFrames = sAnims_Electrike, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 3), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Electrike, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 32) : MON_COORDS_SIZE(56, 40), @@ -4805,6 +5372,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Electrike, gShinyOverworldPalette_Electrike ) @@ -4851,7 +5419,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Manectric, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 56) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 2, - .frontAnimFrames = sAnims_Manectric, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 33), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 3), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Manectric, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(56, 64), @@ -4868,6 +5442,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Manectric, gShinyOverworldPalette_Manectric ) @@ -4914,7 +5489,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_ManectricMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_ManectricMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ManectricMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4926,6 +5501,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(1, 10, SHADOW_SIZE_L) FOOTPRINT(Manectric) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_ManectricMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_ManectricMega, + gShinyOverworldPalette_ManectricMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sManectricLevelUpLearnset, .teachableLearnset = sManectricTeachableLearnset, @@ -4978,7 +5564,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Plusle, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 11, - .frontAnimFrames = sAnims_Plusle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SQUISH_AND_BOUNCE : ANIM_V_JUMPS_H_JUMPS, .backPic = gMonBackPic_Plusle, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(56, 64), @@ -4995,6 +5587,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Plusle, gShinyOverworldPalette_Plusle ) @@ -5047,7 +5640,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Minun, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 11, - .frontAnimFrames = sAnims_Minun, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_CIRCULAR_STRETCH_TWICE : ANIM_V_JUMPS_H_JUMPS, .backPic = gMonBackPic_Minun, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(48, 64), @@ -5064,6 +5663,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Minun, gShinyOverworldPalette_Minun ) @@ -5118,7 +5718,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Volbeat, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Volbeat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Volbeat, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(48, 64), @@ -5135,6 +5743,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Volbeat, gShinyOverworldPalette_Volbeat ) @@ -5191,7 +5800,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Illumise, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 10, - .frontAnimFrames = sAnims_Illumise, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_BOUNCE_ROTATE_TO_SIDES : ANIM_RISING_WOBBLE, .backPic = gMonBackPic_Illumise, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -5208,6 +5823,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Illumise, gShinyOverworldPalette_Illumise ) @@ -5258,7 +5874,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Budew, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Budew, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Budew, .backPicSize = MON_COORDS_SIZE(40, 56), @@ -5275,6 +5895,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Budew, gShinyOverworldPalette_Budew ) @@ -5324,7 +5945,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Roselia, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 11, - .frontAnimFrames = sAnims_Roselia, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 22), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Roselia, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -5347,6 +5972,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Roselia, gShinyOverworldPalette_Roselia ) @@ -5354,7 +5980,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_RoseliaF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sRoseliaLevelUpLearnset, .teachableLearnset = sRoseliaTeachableLearnset, @@ -5410,7 +6037,10 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Roserade, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Roserade, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Roserade, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -5433,6 +6063,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Roserade, gShinyOverworldPalette_Roserade ) @@ -5440,7 +6071,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_RoseradeF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sRoseradeLevelUpLearnset, .teachableLearnset = sRoseradeTeachableLearnset, @@ -5488,7 +6120,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Gulpin, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 18 : 15, - .frontAnimFrames = sAnims_Gulpin, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_FRAME(0, 4), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Gulpin, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), @@ -5511,6 +6149,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Gulpin, gShinyOverworldPalette_Gulpin ) @@ -5518,7 +6157,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_GulpinF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_SPOT + TRACKS_SPOT, + sAnimTable_Following ) .levelUpLearnset = sGulpinLevelUpLearnset, .teachableLearnset = sGulpinTeachableLearnset, @@ -5565,7 +6205,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Swalot, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 5, - .frontAnimFrames = sAnims_Swalot, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Swalot, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 64), @@ -5588,6 +6233,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Swalot, gShinyOverworldPalette_Swalot ) @@ -5595,7 +6241,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_SwalotF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_SLITHER + TRACKS_SLITHER, + sAnimTable_Following ) .levelUpLearnset = sSwalotLevelUpLearnset, .teachableLearnset = sSwalotTeachableLearnset, @@ -5641,7 +6288,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Carvanha, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Carvanha, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, .backPic = gMonBackPic_Carvanha, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 48), @@ -5658,6 +6315,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Carvanha, gShinyOverworldPalette_Carvanha ) @@ -5705,7 +6363,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Sharpedo, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 0, - .frontAnimFrames = sAnims_Sharpedo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 22), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH_TWICE, .backPic = gMonBackPic_Sharpedo, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5722,6 +6390,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Sharpedo, gShinyOverworldPalette_Sharpedo ) @@ -5770,7 +6439,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_SharpedoMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_SharpedoMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 1, .backPic = gMonBackPic_SharpedoMega, @@ -5783,6 +6452,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(-2, 14, SHADOW_SIZE_M) FOOTPRINT(Sharpedo) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_SharpedoMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE, + sAnimTable_Following, + gOverworldPalette_SharpedoMega, + gShinyOverworldPalette_SharpedoMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sSharpedoLevelUpLearnset, .teachableLearnset = sSharpedoTeachableLearnset, @@ -5830,7 +6510,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Wailmer, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 10, - .frontAnimFrames = sAnims_Wailmer, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Wailmer, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 24) : MON_COORDS_SIZE(64, 48), @@ -5847,6 +6535,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Wailmer, gShinyOverworldPalette_Wailmer ) @@ -5893,7 +6582,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Wailord, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 4, - .frontAnimFrames = sAnims_Wailord, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 48), + ANIMCMD_FRAME(0, 33), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .frontAnimDelay = 10, .backPic = gMonBackPic_Wailord, @@ -5911,6 +6604,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Wailord, gShinyOverworldPalette_Wailord ) @@ -5961,7 +6655,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Numel, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 15 : 9, - .frontAnimFrames = sAnims_Numel, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 40), + ), .frontAnimId = ANIM_V_SLIDE, .backPic = gMonBackPic_Numel, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(56, 56), @@ -5984,6 +6684,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Numel, gShinyOverworldPalette_Numel ) @@ -5991,7 +6692,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_NumelF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sNumelLevelUpLearnset, .teachableLearnset = sNumelTeachableLearnset, @@ -6041,7 +6743,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Camerupt, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 6, - .frontAnimFrames = sAnims_Camerupt, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Camerupt, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 32) : MON_COORDS_SIZE(64, 40), @@ -6064,6 +6774,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Camerupt, gShinyOverworldPalette_Camerupt ) @@ -6071,7 +6782,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_CameruptF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sCameruptLevelUpLearnset, .teachableLearnset = sCameruptTeachableLearnset, @@ -6118,7 +6830,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CameruptMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_CameruptMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CameruptMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6130,6 +6842,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(1, 6, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Camerupt) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_CameruptMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_CameruptMega, + gShinyOverworldPalette_CameruptMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sCameruptLevelUpLearnset, .teachableLearnset = sCameruptTeachableLearnset, @@ -6182,7 +6905,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Torkoal, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 3, - .frontAnimFrames = sAnims_Torkoal, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Torkoal, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -6199,6 +6928,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Torkoal, gShinyOverworldPalette_Torkoal ) @@ -6246,7 +6976,19 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Spoink, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Spoink, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + 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, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH_TWICE, .backPic = gMonBackPic_Spoink, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(40, 64), @@ -6263,6 +7005,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Spoink, gShinyOverworldPalette_Spoink ) @@ -6309,7 +7052,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Grumpig, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 2, - .frontAnimFrames = sAnims_Grumpig, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .frontAnimDelay = 15, .backPic = gMonBackPic_Grumpig, @@ -6327,6 +7076,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Grumpig, gShinyOverworldPalette_Grumpig ) @@ -6378,7 +7128,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Spinda, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Spinda, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 13), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_JUMPS : ANIM_CIRCLE_INTO_BG, .backPic = gMonBackPic_Spinda, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -6395,6 +7151,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Spinda, gShinyOverworldPalette_Spinda ) @@ -6447,7 +7204,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Trapinch, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 32) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 12, - .frontAnimFrames = sAnims_Trapinch, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Trapinch, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 40) : MON_COORDS_SIZE(48, 48), @@ -6464,6 +7227,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Trapinch, gShinyOverworldPalette_Trapinch ) @@ -6515,7 +7279,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Vibrava, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 10, - .frontAnimFrames = sAnims_Vibrava, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Vibrava, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 32) : MON_COORDS_SIZE(64, 40), @@ -6532,6 +7304,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vibrava, gShinyOverworldPalette_Vibrava ) @@ -6588,7 +7361,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Flygon, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Flygon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_ZIGZAG_SLOW, .enemyMonElevation = 7, .backPic = gMonBackPic_Flygon, @@ -6606,6 +7387,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Flygon, gShinyOverworldPalette_Flygon ) @@ -6653,7 +7435,19 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Cacnea, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 32) : MON_COORDS_SIZE(56, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 13, - .frontAnimFrames = sAnims_Cacnea, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, .backPic = gMonBackPic_Cacnea, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -6670,6 +7464,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cacnea, gShinyOverworldPalette_Cacnea ) @@ -6718,7 +7513,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Cacturne, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Cacturne, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SLIDE, .backPic = gMonBackPic_Cacturne, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -6739,6 +7540,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cacturne, gShinyOverworldPalette_Cacturne ) @@ -6746,7 +7548,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_CacturneF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sCacturneLevelUpLearnset, .teachableLearnset = sCacturneTeachableLearnset, @@ -6791,7 +7594,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Swablu, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 17 : 14, - .frontAnimFrames = sAnims_Swablu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SLIDE : ANIM_GROW_VIBRATE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 12 : 0, .backPic = gMonBackPic_Swablu, @@ -6809,6 +7620,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Swablu, gShinyOverworldPalette_Swablu ) @@ -6855,7 +7667,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Altaria, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 1, - .frontAnimFrames = sAnims_Altaria, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_STRETCH : ANIM_V_STRETCH, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, .backPic = gMonBackPic_Altaria, @@ -6873,6 +7691,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Altaria, gShinyOverworldPalette_Altaria ) @@ -6920,7 +7739,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_AltariaMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_AltariaMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 6, .backPic = gMonBackPic_AltariaMega, @@ -6933,6 +7752,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(-2, 17, SHADOW_SIZE_L) FOOTPRINT(Altaria) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_AltariaMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE, + sAnimTable_Following, + gOverworldPalette_AltariaMega, + gShinyOverworldPalette_AltariaMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sAltariaLevelUpLearnset, .teachableLearnset = sAltariaTeachableLearnset, @@ -6982,7 +7812,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Zangoose, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Zangoose, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Zangoose, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 56), @@ -6999,6 +7837,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zangoose, gShinyOverworldPalette_Zangoose ) @@ -7049,7 +7888,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Seviper, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 6, - .frontAnimFrames = sAnims_Seviper, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Seviper, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7066,6 +7913,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BIKE_TIRE, + sAnimTable_Following, gOverworldPalette_Seviper, gShinyOverworldPalette_Seviper ) @@ -7121,7 +7969,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Lunatone, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Lunatone, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_SWING_CONVEX_FAST, .enemyMonElevation = 13, .backPic = gMonBackPic_Lunatone, @@ -7139,6 +7993,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Lunatone, gShinyOverworldPalette_Lunatone ) @@ -7193,7 +8048,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Solrock, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, - .frontAnimFrames = sAnims_Solrock, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_ROTATE_TO_SIDES_TWICE, .enemyMonElevation = 4, .backPic = gMonBackPic_Solrock, @@ -7211,6 +8072,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Solrock, gShinyOverworldPalette_Solrock ) @@ -7261,7 +8123,21 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Barboach, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 48) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 15, - .frontAnimFrames = sAnims_Barboach, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 0 : 7, .backPic = gMonBackPic_Barboach, @@ -7279,6 +8155,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Barboach, gShinyOverworldPalette_Barboach ) @@ -7329,7 +8206,21 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Whiscash, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Whiscash, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, .backPic = gMonBackPic_Whiscash, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -7346,6 +8237,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Whiscash, gShinyOverworldPalette_Whiscash ) @@ -7392,7 +8284,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Corphish, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 8, - .frontAnimFrames = sAnims_Corphish, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Corphish, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 48), @@ -7409,6 +8309,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Corphish, gShinyOverworldPalette_Corphish ) @@ -7455,7 +8356,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Crawdaunt, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 4, - .frontAnimFrames = sAnims_Crawdaunt, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Crawdaunt, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -7472,6 +8379,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Crawdaunt, gShinyOverworldPalette_Crawdaunt ) @@ -7519,7 +8427,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Baltoy, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 14, - .frontAnimFrames = sAnims_Baltoy, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 4 : 8, .backPic = gMonBackPic_Baltoy, @@ -7537,6 +8453,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Baltoy, gShinyOverworldPalette_Baltoy ) @@ -7583,7 +8500,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Claydol, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 3, - .frontAnimFrames = sAnims_Claydol, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE_SMALL, .enemyMonElevation = 10, .backPic = gMonBackPic_Claydol, @@ -7601,6 +8526,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Claydol, gShinyOverworldPalette_Claydol ) @@ -7654,7 +8580,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Lileep, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Lileep, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Lileep, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(48, 48), @@ -7671,6 +8603,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Lileep, gShinyOverworldPalette_Lileep ) @@ -7724,7 +8657,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Cradily, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Cradily, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Cradily, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(56, 64), @@ -7741,6 +8682,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Cradily, gShinyOverworldPalette_Cradily ) @@ -7793,7 +8735,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Anorith, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 7, - .frontAnimFrames = sAnims_Anorith, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_TWIST, .backPic = gMonBackPic_Anorith, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 24) : MON_COORDS_SIZE(56, 32), @@ -7810,6 +8760,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Anorith, gShinyOverworldPalette_Anorith ) @@ -7862,7 +8813,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Armaldo, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 2, - .frontAnimFrames = sAnims_Armaldo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Armaldo, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 64), @@ -7879,6 +8836,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Armaldo, gShinyOverworldPalette_Armaldo ) @@ -7929,7 +8887,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Feebas, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 48) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 10, - .frontAnimFrames = sAnims_Feebas, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, .backPic = gMonBackPic_Feebas, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -7946,6 +8912,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Feebas, gShinyOverworldPalette_Feebas ) @@ -7998,7 +8965,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Milotic, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 2, - .frontAnimFrames = sAnims_Milotic, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_GLOW_BLUE : ANIM_CIRCULAR_STRETCH_TWICE, .frontAnimDelay = 45, .backPic = gMonBackPic_Milotic, @@ -8022,6 +8997,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Milotic, gShinyOverworldPalette_Milotic ) @@ -8029,7 +9005,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_MiloticF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_SLITHER + TRACKS_SLITHER, + sAnimTable_Following ) .levelUpLearnset = sMiloticLevelUpLearnset, .teachableLearnset = sMiloticTeachableLearnset, @@ -8076,7 +9053,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformNormal, .frontPicSize = MON_COORDS_SIZE(24, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_CastformNormal, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 24), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 24), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 16, .backPic = gMonBackPic_CastformNormal, @@ -8094,6 +9077,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_CastformNormal, gShinyOverworldPalette_CastformNormal ) @@ -8143,7 +9127,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformSunny, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_CastformSunny, + .frontAnimFrames = ANIM_FRAMES( + 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), + ), .frontAnimId = ANIM_GROW_VIBRATE, .enemyMonElevation = 5, .backPic = gMonBackPic_CastformSunny, @@ -8161,6 +9153,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_CastformSunny, gShinyOverworldPalette_CastformSunny ) @@ -8210,7 +9203,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformRainy, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_CastformRainy, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_SWING_CONVEX_FAST, .enemyMonElevation = 5, .backPic = gMonBackPic_CastformRainy, @@ -8228,6 +9227,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_CastformRainy, gShinyOverworldPalette_CastformRainy ) @@ -8277,7 +9277,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformSnowy, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_CastformSnowy, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 29), + ANIMCMD_FRAME(0, 12), + ), .frontAnimId = ANIM_V_STRETCH, .enemyMonElevation = 5, .backPic = gMonBackPic_CastformSnowy, @@ -8295,6 +9301,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_CastformSnowy, gShinyOverworldPalette_CastformSnowy ) @@ -8348,7 +9355,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Kecleon, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 5, - .frontAnimFrames = sAnims_Kecleon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_FLICKER_INCREASING, .frontAnimDelay = 30, .backPic = gMonBackPic_Kecleon, @@ -8366,6 +9379,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kecleon, gShinyOverworldPalette_Kecleon ) @@ -8418,7 +9432,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Shuppet, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(40, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 13, - .frontAnimFrames = sAnims_Shuppet, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 12 : 14, .backPic = gMonBackPic_Shuppet, @@ -8436,6 +9458,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Shuppet, gShinyOverworldPalette_Shuppet ) @@ -8487,7 +9510,15 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Banette, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 12 : 7, - .frontAnimFrames = sAnims_Banette, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONVEX : ANIM_CIRCULAR_STRETCH_TWICE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, .backPic = gMonBackPic_Banette, @@ -8505,6 +9536,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Banette, gShinyOverworldPalette_Banette ) @@ -8552,7 +9584,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_BanetteMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_BanetteMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_BanetteMega, @@ -8565,6 +9597,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(0, 16, SHADOW_SIZE_M) FOOTPRINT(Banette) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_BanetteMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_BanetteMega, + gShinyOverworldPalette_BanetteMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sBanetteLevelUpLearnset, .teachableLearnset = sBanetteTeachableLearnset, @@ -8618,7 +9661,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Duskull, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 12, - .frontAnimFrames = sAnims_Duskull, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_ZIGZAG_FAST, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 9 : 13, .backPic = gMonBackPic_Duskull, @@ -8636,6 +9685,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Duskull, gShinyOverworldPalette_Duskull ) @@ -8688,7 +9738,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Dusclops, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 5 : 3, - .frontAnimFrames = sAnims_Dusclops, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_VIBRATE, .frontAnimDelay = 30, .backPic = gMonBackPic_Dusclops, @@ -8706,6 +9762,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dusclops, gShinyOverworldPalette_Dusclops ) @@ -8765,7 +9822,18 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Dusknoir, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Dusknoir, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ), .frontAnimId = ANIM_H_SLIDE, .enemyMonElevation = 6, .backPic = gMonBackPic_Dusknoir, @@ -8783,6 +9851,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dusknoir, gShinyOverworldPalette_Dusknoir ) @@ -8834,7 +9903,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Tropius, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Tropius, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Tropius, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(56, 64), @@ -8851,6 +9926,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tropius, gShinyOverworldPalette_Tropius ) @@ -8900,7 +9976,16 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Chingling, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Chingling, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .backPic = gMonBackPic_Chingling, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -8917,6 +10002,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Chingling, gShinyOverworldPalette_Chingling ) @@ -8972,7 +10058,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Chimecho, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Chimecho, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 12 : 16, .backPic = gMonBackPic_Chimecho, @@ -8990,6 +10086,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Chimecho, gShinyOverworldPalette_Chimecho ) @@ -9042,7 +10139,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Absol, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 64) : MON_COORDS_SIZE(56, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 0 : 2, - .frontAnimFrames = sAnims_Absol, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_CIRCULAR_VIBRATE, .frontAnimDelay = 45, .backPic = gMonBackPic_Absol, @@ -9060,6 +10163,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Absol, gShinyOverworldPalette_Absol ) @@ -9109,7 +10213,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_AbsolMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_AbsolMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_AbsolMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -9121,6 +10225,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(1, 7, SHADOW_SIZE_L) FOOTPRINT(Absol) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_AbsolMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_AbsolMega, + gShinyOverworldPalette_AbsolMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sAbsolLevelUpLearnset, .teachableLearnset = sAbsolTeachableLearnset, @@ -9174,7 +10289,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Snorunt, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(32, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 12, - .frontAnimFrames = sAnims_Snorunt, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .frontAnimDelay = 20, .backPic = gMonBackPic_Snorunt, @@ -9192,6 +10313,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Snorunt, gShinyOverworldPalette_Snorunt ) @@ -9243,7 +10365,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Glalie, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 48) : MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 10 : 8, - .frontAnimFrames = sAnims_Glalie, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_ZIGZAG_FAST, .enemyMonElevation = 12, .backPic = gMonBackPic_Glalie, @@ -9261,6 +10389,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Glalie, gShinyOverworldPalette_Glalie ) @@ -9307,7 +10436,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_GlalieMega, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_GlalieMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_GlalieMega, @@ -9320,6 +10449,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(3, 18, SHADOW_SIZE_L) FOOTPRINT(Glalie) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_GlalieMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_GlalieMega, + gShinyOverworldPalette_GlalieMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sGlalieLevelUpLearnset, .teachableLearnset = sGlalieTeachableLearnset, @@ -9366,7 +10506,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Froslass, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Froslass, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 7, .backPic = gMonBackPic_Froslass, @@ -9384,6 +10528,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Froslass, gShinyOverworldPalette_Froslass ) @@ -9435,7 +10580,16 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Spheal, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 40) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 16 : 11, - .frontAnimFrames = sAnims_Spheal, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 43), + ANIMCMD_FRAME(1, 60), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SPIN : ANIM_SPIN_LONG, .frontAnimDelay = 15, .backPic = gMonBackPic_Spheal, @@ -9453,6 +10607,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Spheal, gShinyOverworldPalette_Spheal ) @@ -9503,7 +10658,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Sealeo, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Sealeo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Sealeo, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -9520,6 +10681,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sealeo, gShinyOverworldPalette_Sealeo ) @@ -9575,7 +10737,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Walrein, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Walrein, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Walrein, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), @@ -9592,6 +10760,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Walrein, gShinyOverworldPalette_Walrein ) @@ -9640,7 +10809,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Clamperl, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(40, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 14 : 11, - .frontAnimFrames = sAnims_Clamperl, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_TWIST, .backPic = gMonBackPic_Clamperl, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(56, 40), @@ -9657,6 +10832,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Clamperl, gShinyOverworldPalette_Clamperl ) @@ -9708,7 +10884,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Huntail, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Huntail, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Huntail, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 64) : MON_COORDS_SIZE(64, 56), @@ -9725,6 +10907,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Huntail, gShinyOverworldPalette_Huntail ) @@ -9770,7 +10953,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Gorebyss, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 6, - .frontAnimFrames = sAnims_Gorebyss, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .backPic = gMonBackPic_Gorebyss, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 56) : MON_COORDS_SIZE(64, 56), @@ -9787,6 +10976,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Gorebyss, gShinyOverworldPalette_Gorebyss ) @@ -9835,7 +11025,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Relicanth, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 8, - .frontAnimFrames = sAnims_Relicanth, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_TIP_MOVE_FORWARD, .backPic = gMonBackPic_Relicanth, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 40), @@ -9858,6 +11054,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Relicanth, gShinyOverworldPalette_Relicanth ) @@ -9865,7 +11062,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = sPicTable_RelicanthF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_NONE + TRACKS_NONE, + sAnimTable_Following ) .levelUpLearnset = sRelicanthLevelUpLearnset, .teachableLearnset = sRelicanthTeachableLearnset, @@ -9912,7 +11110,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Luvdisc, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 48) : MON_COORDS_SIZE(32, 40), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 24 : 14, - .frontAnimFrames = sAnims_Luvdisc, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .backPic = gMonBackPic_Luvdisc, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(32, 48) : MON_COORDS_SIZE(40, 48), @@ -9929,6 +11133,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SPOT, + sAnimTable_Following, gOverworldPalette_Luvdisc, gShinyOverworldPalette_Luvdisc ) @@ -9977,7 +11182,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Bagon, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 48) : MON_COORDS_SIZE(32, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 11 : 9, - .frontAnimFrames = sAnims_Bagon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SHAKE_TWICE : ANIM_H_SHAKE, .backPic = gMonBackPic_Bagon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(48, 56), @@ -9994,6 +11205,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bagon, gShinyOverworldPalette_Bagon ) @@ -10041,7 +11253,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Shelgon, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Shelgon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SLIDE, .backPic = gMonBackPic_Shelgon, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -10058,6 +11276,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Shelgon, gShinyOverworldPalette_Shelgon ) @@ -10110,7 +11329,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Salamence, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 3, - .frontAnimFrames = sAnims_Salamence, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SHAKE, .frontAnimDelay = 70, .backPic = gMonBackPic_Salamence, @@ -10128,6 +11353,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Salamence, gShinyOverworldPalette_Salamence ) @@ -10176,7 +11402,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_SalamenceMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_SalamenceMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SalamenceMega, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -10188,6 +11414,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(3, 8, SHADOW_SIZE_L) FOOTPRINT(Salamence) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_SalamenceMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_SalamenceMega, + gShinyOverworldPalette_SalamenceMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sSalamenceLevelUpLearnset, .teachableLearnset = sSalamenceTeachableLearnset, @@ -10236,7 +11473,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Beldum, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(48, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Beldum, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .enemyMonElevation = 8, .backPic = gMonBackPic_Beldum, @@ -10254,6 +11497,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Beldum, gShinyOverworldPalette_Beldum ) @@ -10301,7 +11545,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Metang, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 9, - .frontAnimFrames = sAnims_Metang, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_V_SLIDE, .backPic = gMonBackPic_Metang, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 32) : MON_COORDS_SIZE(64, 40), @@ -10318,6 +11568,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Metang, gShinyOverworldPalette_Metang ) @@ -10370,7 +11621,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Metagross, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 6 : 9, - .frontAnimFrames = sAnims_Metagross, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Metagross, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 24) : MON_COORDS_SIZE(64, 56), @@ -10387,6 +11644,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Metagross, gShinyOverworldPalette_Metagross ) @@ -10434,7 +11692,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_MetagrossMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_MetagrossMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 4, .backPic = gMonBackPic_MetagrossMega, @@ -10447,6 +11705,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(1, 15, SHADOW_SIZE_L) FOOTPRINT(Metagross) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_MetagrossMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_MetagrossMega, + gShinyOverworldPalette_MetagrossMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sMetagrossLevelUpLearnset, .teachableLearnset = sMetagrossTeachableLearnset, @@ -10501,7 +11770,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Regirock, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(56, 64) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 3, - .frontAnimFrames = sAnims_Regirock, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Regirock, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 56), @@ -10518,6 +11793,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Regirock, gShinyOverworldPalette_Regirock ) @@ -10572,7 +11848,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Regice, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Regice, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_FOUR_PETAL : ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Regice, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(64, 48), @@ -10589,6 +11871,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Regice, gShinyOverworldPalette_Regice ) @@ -10644,7 +11927,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Registeel, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 56), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 3 : 5, - .frontAnimFrames = sAnims_Registeel, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Registeel, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 40) : MON_COORDS_SIZE(64, 48), @@ -10661,6 +11950,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Registeel, gShinyOverworldPalette_Registeel ) @@ -10715,7 +12005,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Latias, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(64, 48), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 8, - .frontAnimFrames = sAnims_Latias, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONCAVE_FAST_SHORT : ANIM_ZIGZAG_SLOW, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 6 : 12, .backPic = gMonBackPic_Latias, @@ -10733,6 +12029,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Latias, gShinyOverworldPalette_Latias ) @@ -10782,7 +12079,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_LatiasMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_LatiasMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_LatiasMega, @@ -10795,6 +12092,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 2, SHADOW(-1, 19, SHADOW_SIZE_L) FOOTPRINT(Latias) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_LatiasMega, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_NONE, + sAnimTable_Following, + gOverworldPalette_LatiasMega, + gShinyOverworldPalette_LatiasMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isLegendary = TRUE, .isMegaEvolution = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -10850,7 +12158,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Latios, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 0, - .frontAnimFrames = sAnims_Latios, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_V_SHAKE : ANIM_CIRCLE_C_CLOCKWISE_SLOW, .enemyMonElevation = 6, .backPic = gMonBackPic_Latios, @@ -10868,6 +12182,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Latios, gShinyOverworldPalette_Latios ) @@ -10917,7 +12232,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_LatiosMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_LatiosMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_LatiosMega, @@ -10930,6 +12245,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 2, SHADOW(-1, 19, SHADOW_SIZE_L) FOOTPRINT(Latios) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_LatiosMega, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_NONE, + sAnimTable_Following, + gOverworldPalette_LatiosMega, + gShinyOverworldPalette_LatiosMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isLegendary = TRUE, .isMegaEvolution = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -10985,7 +12311,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Kyogre, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 4 : 0, - .frontAnimFrames = sAnims_Kyogre, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONCAVE_FAST_SHORT, .frontAnimDelay = 60, .backPic = gMonBackPic_Kyogre, @@ -11003,6 +12335,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Kyogre, gShinyOverworldPalette_Kyogre ) @@ -11052,7 +12385,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_KyogrePrimal, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_KyogrePrimal, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_KyogrePrimal, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -11064,6 +12397,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(-1, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Kyogre) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_KyogrePrimal, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_NONE, + sAnimTable_Following, + gOverworldPalette_KyogrePrimal, + gShinyOverworldPalette_KyogrePrimal + ) + #endif //OW_BATTLE_ONLY_FORMS .isLegendary = TRUE, .isPrimalReversion = TRUE, .isFrontierBanned = TRUE, @@ -11120,7 +12464,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Groudon, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, - .frontAnimFrames = sAnims_Groudon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Groudon, .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 48), @@ -11137,6 +12487,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Groudon, gShinyOverworldPalette_Groudon ) @@ -11187,7 +12538,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_GroudonPrimal, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_GroudonPrimal, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GroudonPrimal, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -11199,6 +12550,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 0, SHADOW(2, 11, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Groudon) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_GroudonPrimal, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_GroudonPrimal, + gShinyOverworldPalette_GroudonPrimal + ) + #endif //OW_BATTLE_ONLY_FORMS .isLegendary = TRUE, .isPrimalReversion = TRUE, .isFrontierBanned = TRUE, @@ -11256,7 +12618,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Rayquaza, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Rayquaza, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ), .frontAnimId = ANIM_H_SHAKE, .frontAnimDelay = 60, .enemyMonElevation = 6, @@ -11275,6 +12643,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Rayquaza, gShinyOverworldPalette_Rayquaza ) @@ -11326,7 +12695,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_RayquazaMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_RayquazaMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 4, .backPic = gMonBackPic_RayquazaMega, @@ -11339,6 +12708,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconPalIndex = 1, SHADOW(0, 15, SHADOW_SIZE_L) FOOTPRINT(Rayquaza) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_RayquazaMega, + SIZE_64x64, + SHADOW_SIZE_M, + TRACKS_NONE, + sAnimTable_Following, + gOverworldPalette_RayquazaMega, + gShinyOverworldPalette_RayquazaMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isLegendary = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, @@ -11397,7 +12777,18 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Jirachi, .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(56, 48), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Jirachi, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONVEX : ANIM_RISING_WOBBLE, .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 12 : 14, .backPic = gMonBackPic_Jirachi, @@ -11415,6 +12806,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Jirachi, gShinyOverworldPalette_Jirachi ) @@ -11470,7 +12862,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_DeoxysNormal, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_DeoxysNormal, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_DeoxysNormal, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -11487,6 +12885,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DeoxysNormal, gShinyOverworldPalette_DeoxysNormal ) @@ -11533,7 +12932,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_DeoxysAttack, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_DeoxysAttack, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_DeoxysAttack, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -11549,6 +12954,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DeoxysAttack, gShinyOverworldPalette_DeoxysAttack ) @@ -11595,7 +13001,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_DeoxysDefense, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_DeoxysDefense, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_DeoxysDefense, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -11612,6 +13024,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DeoxysDefense, gShinyOverworldPalette_DeoxysDefense ) @@ -11658,7 +13071,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_DeoxysSpeed, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_DeoxysSpeed, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_DeoxysSpeed, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -11675,6 +13094,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DeoxysSpeed, gShinyOverworldPalette_DeoxysSpeed ) diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index be0cfba99e..a6d6302012 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -41,7 +41,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Turtwig, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Turtwig, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Turtwig, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -58,6 +62,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Turtwig, gShinyOverworldPalette_Turtwig ) @@ -105,7 +110,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Grotle, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Grotle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Grotle, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -122,6 +131,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Grotle, gShinyOverworldPalette_Grotle ) @@ -175,7 +185,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Torterra, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Torterra, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Torterra, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -192,6 +205,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Torterra, gShinyOverworldPalette_Torterra ) @@ -239,7 +253,14 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Chimchar, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Chimchar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_V_JUMPS_BIG, .backPic = gMonBackPic_Chimchar, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -256,6 +277,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Chimchar, gShinyOverworldPalette_Chimchar ) @@ -304,7 +326,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Monferno, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Monferno, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Monferno, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -321,6 +349,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Monferno, gShinyOverworldPalette_Monferno ) @@ -374,7 +403,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Infernape, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Infernape, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Infernape, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -391,6 +424,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Infernape, gShinyOverworldPalette_Infernape ) @@ -441,7 +475,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Piplup, .frontPicSize = MON_COORDS_SIZE(24, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Piplup, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Piplup, .backPicSize = MON_COORDS_SIZE(40, 48), @@ -458,6 +496,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Piplup, gShinyOverworldPalette_Piplup ) @@ -508,7 +547,17 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Prinplup, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Prinplup, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 50), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Prinplup, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -525,6 +574,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Prinplup, gShinyOverworldPalette_Prinplup ) @@ -580,7 +630,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Empoleon, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Empoleon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Empoleon, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -597,6 +651,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Empoleon, gShinyOverworldPalette_Empoleon ) @@ -647,7 +702,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Starly, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Starly, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Starly, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -670,6 +731,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Starly, gShinyOverworldPalette_Starly ) @@ -677,7 +739,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_StarlyF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sStarlyLevelUpLearnset, .teachableLearnset = sStarlyTeachableLearnset, @@ -722,7 +785,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Staravia, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Staravia, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Staravia, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -745,6 +811,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Staravia, gShinyOverworldPalette_Staravia ) @@ -752,7 +819,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_StaraviaF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sStaraviaLevelUpLearnset, .teachableLearnset = sStaraviaTeachableLearnset, @@ -804,7 +872,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Staraptor, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Staraptor, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Staraptor, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -825,6 +896,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Staraptor, gShinyOverworldPalette_Staraptor ) @@ -832,7 +904,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_StaraptorF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sStaraptorLevelUpLearnset, .teachableLearnset = sStaraptorTeachableLearnset, @@ -877,7 +950,15 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Bidoof, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Bidoof, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Bidoof, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -900,6 +981,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bidoof, gShinyOverworldPalette_Bidoof ) @@ -907,7 +989,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_BidoofF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sBidoofLevelUpLearnset, .teachableLearnset = sBidoofTeachableLearnset, @@ -952,7 +1035,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Bibarel, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Bibarel, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Bibarel, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -973,6 +1062,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bibarel, gShinyOverworldPalette_Bibarel ) @@ -980,7 +1070,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_BibarelF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sBibarelLevelUpLearnset, .teachableLearnset = sBibarelTeachableLearnset, @@ -1026,7 +1117,24 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Kricketot, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Kricketot, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_JUMPS, .backPic = gMonBackPic_Kricketot, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -1049,6 +1157,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kricketot, gShinyOverworldPalette_Kricketot ) @@ -1056,7 +1165,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_KricketotF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .tmIlliterate = TRUE, .levelUpLearnset = sKricketotLevelUpLearnset, @@ -1102,7 +1212,15 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Kricketune, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Kricketune, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 27), + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 27), + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 27), + ANIMCMD_FRAME(0, 3), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Kricketune, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -1125,6 +1243,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kricketune, gShinyOverworldPalette_Kricketune ) @@ -1132,7 +1251,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_KricketuneF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sKricketuneLevelUpLearnset, .teachableLearnset = sKricketuneTeachableLearnset, @@ -1177,7 +1297,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Shinx, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Shinx, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Shinx, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -1200,6 +1324,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Shinx, gShinyOverworldPalette_Shinx ) @@ -1207,7 +1332,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_ShinxF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sShinxLevelUpLearnset, .teachableLearnset = sShinxTeachableLearnset, @@ -1252,7 +1378,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Luxio, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Luxio, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Luxio, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1275,6 +1404,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Luxio, gShinyOverworldPalette_Luxio ) @@ -1282,7 +1412,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_LuxioF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sLuxioLevelUpLearnset, .teachableLearnset = sLuxioTeachableLearnset, @@ -1332,7 +1463,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Luxray, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Luxray, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GLOW_YELLOW, .backPic = gMonBackPic_Luxray, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1355,6 +1492,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Luxray, gShinyOverworldPalette_Luxray ) @@ -1362,7 +1500,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_LuxrayF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sLuxrayLevelUpLearnset, .teachableLearnset = sLuxrayTeachableLearnset, @@ -1407,7 +1546,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Cranidos, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Cranidos, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Cranidos, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -1424,6 +1566,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cranidos, gShinyOverworldPalette_Cranidos ) @@ -1470,7 +1613,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Rampardos, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Rampardos, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 50), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Rampardos, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1487,6 +1636,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rampardos, gShinyOverworldPalette_Rampardos ) @@ -1533,7 +1683,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Shieldon, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Shieldon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Shieldon, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -1550,6 +1704,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Shieldon, gShinyOverworldPalette_Shieldon ) @@ -1596,7 +1751,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Bastiodon, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Bastiodon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_BACK_AND_LUNGE, .backPic = gMonBackPic_Bastiodon, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -1613,6 +1772,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bastiodon, gShinyOverworldPalette_Bastiodon ) @@ -1677,6 +1837,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_BurmyPlant, gShinyOverworldPalette_BurmyPlant ) @@ -1744,6 +1905,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_BurmySandy, gShinyOverworldPalette_BurmySandy ) @@ -1811,6 +1973,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_BurmyTrash, gShinyOverworldPalette_BurmyTrash ) @@ -1879,6 +2042,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_WormadamPlant, gShinyOverworldPalette_WormadamPlant ) @@ -1943,6 +2107,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_WormadamSandy, gShinyOverworldPalette_WormadamSandy ) @@ -2008,6 +2173,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_WormadamTrash, gShinyOverworldPalette_WormadamTrash ) @@ -2062,13 +2228,14 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .shinyPalette = gMonShinyPalette_Mothim, \ .iconSprite = gMonIcon_Mothim, \ .iconPalIndex = 0, \ - SHADOW(-1, 9, SHADOW_SIZE_S) \ + SHADOW(-1, 9, SHADOW_SIZE_S) \ FOOTPRINT(Mothim) \ OVERWORLD( \ sPicTable_Mothim, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Mothim, \ gShinyOverworldPalette_Mothim \ ) \ @@ -2121,7 +2288,15 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Combee, .frontPicSize = MON_COORDS_SIZE(64, 40), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Combee, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 15, .backPic = gMonBackPic_Combee, @@ -2143,6 +2318,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Combee, gShinyOverworldPalette_Combee ) @@ -2150,7 +2326,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_CombeeF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .tmIlliterate = TRUE, .levelUpLearnset = sCombeeLevelUpLearnset, @@ -2197,7 +2374,17 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Vespiquen, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Vespiquen, + .frontAnimFrames = ANIM_FRAMES( + 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_FRAME(1, 12), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_LUNGE_GROW, .enemyMonElevation = 4, .backPic = gMonBackPic_Vespiquen, @@ -2215,6 +2402,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vespiquen, gShinyOverworldPalette_Vespiquen ) @@ -2261,7 +2449,17 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Pachirisu, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Pachirisu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 50), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Pachirisu, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2282,6 +2480,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pachirisu, gShinyOverworldPalette_Pachirisu ) @@ -2289,7 +2488,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_PachirisuF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sPachirisuLevelUpLearnset, .teachableLearnset = sPachirisuTeachableLearnset, @@ -2335,7 +2535,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Buizel, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Buizel, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Buizel, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -2356,6 +2560,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Buizel, gShinyOverworldPalette_Buizel ) @@ -2363,7 +2568,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_BuizelF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sBuizelLevelUpLearnset, .teachableLearnset = sBuizelTeachableLearnset, @@ -2408,7 +2614,14 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Floatzel, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Floatzel, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Floatzel, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2429,6 +2642,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Floatzel, gShinyOverworldPalette_Floatzel ) @@ -2436,7 +2650,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_FloatzelF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sFloatzelLevelUpLearnset, .teachableLearnset = sFloatzelTeachableLearnset, @@ -2482,7 +2697,17 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Cherubi, .frontPicSize = MON_COORDS_SIZE(40, 32), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Cherubi, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 50), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Cherubi, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -2499,6 +2724,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cherubi, gShinyOverworldPalette_Cherubi ) @@ -2546,7 +2772,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_CherrimOvercast, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_CherrimOvercast, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_DEEP_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CherrimOvercast, .backPicSize = MON_COORDS_SIZE(40, 56), @@ -2563,6 +2795,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_CherrimOvercast, gShinyOverworldPalette_CherrimOvercast ) @@ -2610,7 +2843,14 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_CherrimSunshine, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_CherrimSunshine, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_CherrimSunshine, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2684,6 +2924,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ShellosWestSea, gShinyOverworldPalette_ShellosWestSea ) @@ -2748,6 +2989,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ShellosEast, gShinyOverworldPalette_ShellosEast ) @@ -2812,6 +3054,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GastrodonWestSea, gShinyOverworldPalette_GastrodonWestSea ) @@ -2874,6 +3117,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GastrodonEast, gShinyOverworldPalette_GastrodonEast ) @@ -2921,7 +3165,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Drifloon, .frontPicSize = MON_COORDS_SIZE(32, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Drifloon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 5, .backPic = gMonBackPic_Drifloon, @@ -2939,6 +3188,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Drifloon, gShinyOverworldPalette_Drifloon ) @@ -2985,7 +3235,14 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Drifblim, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Drifblim, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 7, .backPic = gMonBackPic_Drifblim, @@ -3003,6 +3260,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Drifblim, gShinyOverworldPalette_Drifblim ) @@ -3049,7 +3307,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Buneary, .frontPicSize = MON_COORDS_SIZE(32, 64), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Buneary, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Buneary, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3066,6 +3327,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Buneary, gShinyOverworldPalette_Buneary ) @@ -3112,7 +3374,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Lopunny, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Lopunny, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Lopunny, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3129,6 +3395,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lopunny, gShinyOverworldPalette_Lopunny ) @@ -3176,7 +3443,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_LopunnyMega, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_LopunnyMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_LopunnyMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3188,6 +3455,17 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconPalIndex = 2, SHADOW(0, 13, SHADOW_SIZE_S) FOOTPRINT(Lopunny) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_LopunnyMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_LopunnyMega, + gShinyOverworldPalette_LopunnyMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sLopunnyLevelUpLearnset, .teachableLearnset = sLopunnyTeachableLearnset, @@ -3235,7 +3513,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Glameow, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Glameow, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Glameow, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3252,6 +3534,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Glameow, gShinyOverworldPalette_Glameow ) @@ -3298,7 +3581,15 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Purugly, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Purugly, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Purugly, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3315,6 +3606,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Purugly, gShinyOverworldPalette_Purugly ) @@ -3361,7 +3653,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Stunky, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Stunky, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_TIP_MOVE_FORWARD, .backPic = gMonBackPic_Stunky, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3378,6 +3676,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Stunky, gShinyOverworldPalette_Stunky ) @@ -3424,7 +3723,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Skuntank, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Skuntank, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Skuntank, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3441,6 +3744,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Skuntank, gShinyOverworldPalette_Skuntank ) @@ -3488,7 +3792,18 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Bronzor, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Bronzor, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 9, .backPic = gMonBackPic_Bronzor, @@ -3506,6 +3821,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bronzor, gShinyOverworldPalette_Bronzor ) @@ -3553,7 +3869,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Bronzong, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Bronzong, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE_SMALL, .enemyMonElevation = 7, .backPic = gMonBackPic_Bronzong, @@ -3571,6 +3893,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bronzong, gShinyOverworldPalette_Bronzong ) @@ -3618,7 +3941,24 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Chatot, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Chatot, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Chatot, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -3635,6 +3975,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Chatot, gShinyOverworldPalette_Chatot ) @@ -3683,7 +4024,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Spiritomb, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Spiritomb, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_IN_STAGES, .backPic = gMonBackPic_Spiritomb, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3700,6 +4044,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Spiritomb, gShinyOverworldPalette_Spiritomb ) @@ -3747,7 +4092,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Gible, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Gible, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Gible, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -3770,6 +4119,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gible, gShinyOverworldPalette_Gible ) @@ -3777,7 +4127,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_GibleF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sGibleLevelUpLearnset, .teachableLearnset = sGibleTeachableLearnset, @@ -3822,7 +4173,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Gabite, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Gabite, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Gabite, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3845,6 +4199,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gabite, gShinyOverworldPalette_Gabite ) @@ -3852,7 +4207,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_GabiteF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sGabiteLevelUpLearnset, .teachableLearnset = sGabiteTeachableLearnset, @@ -3902,7 +4258,14 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Garchomp, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Garchomp, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Garchomp, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3923,6 +4286,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Garchomp, gShinyOverworldPalette_Garchomp ) @@ -3930,7 +4294,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_GarchompF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sGarchompLevelUpLearnset, .teachableLearnset = sGarchompTeachableLearnset, @@ -3976,7 +4341,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_GarchompMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_GarchompMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GarchompMega, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3988,6 +4353,17 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconPalIndex = 0, SHADOW(1, 12, SHADOW_SIZE_L) FOOTPRINT(Garchomp) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_GarchompMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_GarchompMega, + gShinyOverworldPalette_GarchompMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sGarchompLevelUpLearnset, .teachableLearnset = sGarchompTeachableLearnset, @@ -4035,7 +4411,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Riolu, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Riolu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 28), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_RAPID_H_HOPS, .backPic = gMonBackPic_Riolu, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4052,6 +4433,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Riolu, gShinyOverworldPalette_Riolu ) @@ -4099,7 +4481,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Lucario, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Lucario, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Lucario, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4116,6 +4501,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lucario, gShinyOverworldPalette_Lucario ) @@ -4164,7 +4550,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_LucarioMega, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_LucarioMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_LucarioMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4176,6 +4562,17 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconPalIndex = 2, SHADOW(-1, 11, SHADOW_SIZE_M) FOOTPRINT(Lucario) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_LucarioMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_LucarioMega, + gShinyOverworldPalette_LucarioMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sLucarioLevelUpLearnset, .teachableLearnset = sLucarioTeachableLearnset, @@ -4223,7 +4620,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Hippopotas, .frontPicSize = MON_COORDS_SIZE(64, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Hippopotas, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Hippopotas, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -4248,6 +4649,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hippopotas, gShinyOverworldPalette_Hippopotas ) @@ -4255,7 +4657,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_HippopotasF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sHippopotasLevelUpLearnset, .teachableLearnset = sHippopotasTeachableLearnset, @@ -4300,7 +4703,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Hippowdon, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Hippowdon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Hippowdon, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4325,6 +4731,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hippowdon, gShinyOverworldPalette_Hippowdon ) @@ -4376,7 +4783,24 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Skorupi, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Skorupi, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Skorupi, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4393,6 +4817,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Skorupi, gShinyOverworldPalette_Skorupi ) @@ -4440,7 +4865,17 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Drapion, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Drapion, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_JUMPS_BIG, .backPic = gMonBackPic_Drapion, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4457,6 +4892,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Drapion, gShinyOverworldPalette_Drapion ) @@ -4504,7 +4940,12 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Croagunk, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Croagunk, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 28), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_RAPID_H_HOPS, .backPic = gMonBackPic_Croagunk, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -4527,6 +4968,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Croagunk, gShinyOverworldPalette_Croagunk ) @@ -4534,7 +4976,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_CroagunkF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sCroagunkLevelUpLearnset, .teachableLearnset = sCroagunkTeachableLearnset, @@ -4580,7 +5023,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Toxicroak, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Toxicroak, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Toxicroak, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -4603,6 +5052,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Toxicroak, gShinyOverworldPalette_Toxicroak ) @@ -4610,7 +5060,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_ToxicroakF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sToxicroakLevelUpLearnset, .teachableLearnset = sToxicroakTeachableLearnset, @@ -4655,7 +5106,20 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Carnivine, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Carnivine, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_FIGURE_8, .enemyMonElevation = 8, .backPic = gMonBackPic_Carnivine, @@ -4673,6 +5137,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Carnivine, gShinyOverworldPalette_Carnivine ) @@ -4720,7 +5185,16 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Finneon, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Finneon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE_SMALL, .backPic = gMonBackPic_Finneon, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -4743,6 +5217,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Finneon, gShinyOverworldPalette_Finneon ) @@ -4750,7 +5225,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_FinneonF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sFinneonLevelUpLearnset, .teachableLearnset = sFinneonTeachableLearnset, @@ -4795,7 +5271,14 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Lumineon, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Lumineon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Lumineon, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -4818,6 +5301,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lumineon, gShinyOverworldPalette_Lumineon ) @@ -4825,7 +5309,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_LumineonF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sLumineonLevelUpLearnset, .teachableLearnset = sLumineonTeachableLearnset, @@ -4871,7 +5356,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Snover, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Snover, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Snover, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4894,6 +5383,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Snover, gShinyOverworldPalette_Snover ) @@ -4901,7 +5391,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_SnoverF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sSnoverLevelUpLearnset, .teachableLearnset = sSnoverTeachableLearnset, @@ -4948,7 +5439,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Abomasnow, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Abomasnow, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Abomasnow, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4969,6 +5464,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Abomasnow, gShinyOverworldPalette_Abomasnow ) @@ -4976,7 +5472,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = sPicTable_AbomasnowF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sAbomasnowLevelUpLearnset, .teachableLearnset = sAbomasnowTeachableLearnset, @@ -5024,7 +5521,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_AbomasnowMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_AbomasnowMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_AbomasnowMega, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5036,6 +5533,17 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconPalIndex = 1, SHADOW(0, 12, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Abomasnow) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_AbomasnowMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_AbomasnowMega, + gShinyOverworldPalette_AbomasnowMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sAbomasnowLevelUpLearnset, .teachableLearnset = sAbomasnowTeachableLearnset, @@ -5084,7 +5592,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Rotom, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Rotom, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GLOW_YELLOW, .enemyMonElevation = 10, .backPic = gMonBackPic_Rotom, @@ -5102,6 +5616,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rotom, gShinyOverworldPalette_Rotom ) @@ -5157,7 +5672,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_RotomHeat, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_RotomHeat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 6, .backPic = gMonBackPic_RotomHeat, @@ -5175,6 +5694,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RotomHeat, gShinyOverworldPalette_RotomHeat ) @@ -5223,7 +5743,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_RotomWash, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_RotomWash, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .enemyMonElevation = 6, .backPic = gMonBackPic_RotomWash, @@ -5241,6 +5765,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RotomWash, gShinyOverworldPalette_RotomWash ) @@ -5288,7 +5813,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_RotomFrost, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_RotomFrost, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_H_STRETCH, .enemyMonElevation = 6, .backPic = gMonBackPic_RotomFrost, @@ -5306,6 +5834,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RotomFrost, gShinyOverworldPalette_RotomFrost ) @@ -5353,7 +5882,34 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_RotomFan, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_RotomFan, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(0, 3), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .frontAnimDelay = 7, .enemyMonElevation = 6, @@ -5372,6 +5928,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RotomFan, gShinyOverworldPalette_RotomFan ) @@ -5419,7 +5976,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_RotomMow, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_RotomMow, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_TIP_MOVE_FORWARD, .enemyMonElevation = 6, .backPic = gMonBackPic_RotomMow, @@ -5437,6 +6000,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RotomMow, gShinyOverworldPalette_RotomMow ) @@ -5492,7 +6056,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Uxie, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Uxie, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONCAVE, .enemyMonElevation = 6, .backPic = gMonBackPic_Uxie, @@ -5510,6 +6078,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Uxie, gShinyOverworldPalette_Uxie ) @@ -5566,7 +6135,16 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Mesprit, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Mesprit, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 6, .backPic = gMonBackPic_Mesprit, @@ -5584,6 +6162,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mesprit, gShinyOverworldPalette_Mesprit ) @@ -5639,7 +6218,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Azelf, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Azelf, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 6, .backPic = gMonBackPic_Azelf, @@ -5657,6 +6240,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Azelf, gShinyOverworldPalette_Azelf ) @@ -5713,7 +6297,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Dialga, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Dialga, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Dialga, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5730,6 +6317,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dialga, gShinyOverworldPalette_Dialga ) @@ -5779,7 +6367,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_DialgaOrigin, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_DialgaOrigin, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DialgaOrigin, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5796,6 +6384,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_DialgaOrigin, gShinyOverworldPalette_DialgaOrigin ) @@ -5855,7 +6444,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Palkia, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Palkia, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Palkia, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5872,6 +6464,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Palkia, gShinyOverworldPalette_Palkia ) @@ -5921,7 +6514,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_PalkiaOrigin, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_PalkiaOrigin, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_PalkiaOrigin, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5938,6 +6531,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_PalkiaOrigin, gShinyOverworldPalette_PalkiaOrigin ) @@ -5995,7 +6589,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Heatran, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Heatran, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GLOW_ORANGE, .backPic = gMonBackPic_Heatran, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -6012,6 +6610,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Heatran, gShinyOverworldPalette_Heatran ) @@ -6066,7 +6665,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Regigigas, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Regigigas, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Regigigas, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -6083,6 +6685,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Regigigas, gShinyOverworldPalette_Regigigas ) @@ -6139,7 +6742,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_GiratinaAltered, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_GiratinaAltered, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_GiratinaAltered, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6156,6 +6763,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GiratinaAltered, gShinyOverworldPalette_GiratinaAltered ) @@ -6205,7 +6813,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_GiratinaOrigin, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_GiratinaOrigin, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_LUNGE_GROW, .enemyMonElevation = 7, .backPic = gMonBackPic_GiratinaOrigin, @@ -6223,6 +6837,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GiratinaOrigin, gShinyOverworldPalette_GiratinaOrigin ) @@ -6280,7 +6895,14 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Cresselia, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Cresselia, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 3, .backPic = gMonBackPic_Cresselia, @@ -6298,6 +6920,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cresselia, gShinyOverworldPalette_Cresselia ) @@ -6352,7 +6975,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Phione, .frontPicSize = MON_COORDS_SIZE(56, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Phione, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_Phione, @@ -6370,6 +6997,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Phione, gShinyOverworldPalette_Phione ) @@ -6423,7 +7051,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Manaphy, .frontPicSize = MON_COORDS_SIZE(64, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Manaphy, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONVEX, .enemyMonElevation = 10, .backPic = gMonBackPic_Manaphy, @@ -6441,6 +7073,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Manaphy, gShinyOverworldPalette_Manaphy ) @@ -6497,7 +7130,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_Darkrai, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Darkrai, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GLOW_BLACK, .enemyMonElevation = 4, .backPic = gMonBackPic_Darkrai, @@ -6515,6 +7152,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Darkrai, gShinyOverworldPalette_Darkrai ) @@ -6574,7 +7212,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_ShayminLand, .frontPicSize = MON_COORDS_SIZE(40, 32), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_ShayminLand, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ShayminLand, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -6591,6 +7233,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ShayminLand, gShinyOverworldPalette_ShayminLand ) @@ -6647,7 +7290,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .frontPic = gMonFrontPic_ShayminSky, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_ShayminSky, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_ShayminSky, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -6664,6 +7311,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ShayminSky, gShinyOverworldPalette_ShayminSky ) @@ -6744,6 +7392,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = SIZE_64x64, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Arceus ##typeName, \ gShinyOverworldPalette_Arceus ##typeName \ ) \ diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 052b0f40c5..d55a7bf1d0 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -41,7 +41,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Victini, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Victini, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 46), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_JUMPS, .backPic = gMonBackPic_Victini, .backPicSize = MON_COORDS_SIZE(40, 64), @@ -58,6 +62,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Victini, gShinyOverworldPalette_Victini ) @@ -107,7 +112,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Snivy, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Snivy, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Snivy, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -124,6 +133,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Snivy, gShinyOverworldPalette_Snivy ) @@ -170,7 +180,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Servine, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Servine, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Servine, .backPicSize = MON_COORDS_SIZE(48, 64), @@ -187,6 +205,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Servine, gShinyOverworldPalette_Servine ) @@ -232,7 +251,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Serperior, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Serperior, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Serperior, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -249,6 +274,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Serperior, gShinyOverworldPalette_Serperior ) @@ -295,7 +321,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Tepig, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Tepig, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Tepig, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -312,6 +344,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tepig, gShinyOverworldPalette_Tepig ) @@ -358,7 +391,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Pignite, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Pignite, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Pignite, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -375,6 +412,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pignite, gShinyOverworldPalette_Pignite ) @@ -421,7 +459,30 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Emboar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Emboar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ), .frontAnimId = ANIM_DEEP_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Emboar, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -438,6 +499,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Emboar, gShinyOverworldPalette_Emboar ) @@ -484,7 +546,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Oshawott, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Oshawott, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_H_JUMPS, .backPic = gMonBackPic_Oshawott, .backPicSize = MON_COORDS_SIZE(40, 48), @@ -501,6 +571,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Oshawott, gShinyOverworldPalette_Oshawott ) @@ -547,7 +618,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Dewott, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Dewott, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Dewott, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -564,6 +641,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dewott, gShinyOverworldPalette_Dewott ) @@ -610,7 +688,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Samurott, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Samurott, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Samurott, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -627,6 +708,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Samurott, gShinyOverworldPalette_Samurott ) @@ -673,7 +755,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_SamurottHisui, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_SamurottHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SamurottHisui, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -690,6 +772,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SamurottHisui, gShinyOverworldPalette_SamurottHisui ) @@ -739,7 +822,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Patrat, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Patrat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Patrat, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -756,6 +842,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Patrat, gShinyOverworldPalette_Patrat ) @@ -802,7 +889,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Watchog, .frontPicSize = MON_COORDS_SIZE(32, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Watchog, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Watchog, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -819,6 +914,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Watchog, gShinyOverworldPalette_Watchog ) @@ -865,7 +961,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Lillipup, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Lillipup, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_H_JUMPS, .backPic = gMonBackPic_Lillipup, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -882,6 +986,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lillipup, gShinyOverworldPalette_Lillipup ) @@ -928,7 +1033,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Herdier, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Herdier, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Herdier, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -945,6 +1057,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Herdier, gShinyOverworldPalette_Herdier ) @@ -996,7 +1109,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Stoutland, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Stoutland, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Stoutland, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1013,6 +1132,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Stoutland, gShinyOverworldPalette_Stoutland ) @@ -1059,7 +1179,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Purrloin, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Purrloin, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 54), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Purrloin, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -1076,6 +1200,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Purrloin, gShinyOverworldPalette_Purrloin ) @@ -1122,7 +1247,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Liepard, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Liepard, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Liepard, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -1139,6 +1268,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Liepard, gShinyOverworldPalette_Liepard ) @@ -1185,7 +1315,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Pansage, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Pansage, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 13), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Pansage, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -1202,6 +1338,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pansage, gShinyOverworldPalette_Pansage ) @@ -1248,7 +1385,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Simisage, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Simisage, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Simisage, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -1265,6 +1406,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Simisage, gShinyOverworldPalette_Simisage ) @@ -1312,7 +1454,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Pansear, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Pansear, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Pansear, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -1329,6 +1474,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pansear, gShinyOverworldPalette_Pansear ) @@ -1376,7 +1522,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Simisear, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Simisear, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONCAVE_FAST, .backPic = gMonBackPic_Simisear, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -1393,6 +1545,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Simisear, gShinyOverworldPalette_Simisear ) @@ -1439,7 +1592,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Panpour, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Panpour, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Panpour, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -1456,6 +1613,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Panpour, gShinyOverworldPalette_Panpour ) @@ -1502,7 +1660,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Simipour, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Simipour, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Simipour, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -1519,6 +1680,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Simipour, gShinyOverworldPalette_Simipour ) @@ -1565,7 +1727,16 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Munna, .frontPicSize = MON_COORDS_SIZE(32, 32), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Munna, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_RISING_WOBBLE, .enemyMonElevation = 7, .backPic = gMonBackPic_Munna, @@ -1583,6 +1754,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Munna, gShinyOverworldPalette_Munna ) @@ -1629,7 +1801,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Musharna, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Musharna, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_ROTATE_TO_SIDES_TWICE, .enemyMonElevation = 5, .backPic = gMonBackPic_Musharna, @@ -1647,6 +1825,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Musharna, gShinyOverworldPalette_Musharna ) @@ -1693,7 +1872,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Pidove, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Pidove, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 46), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Pidove, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -1710,6 +1893,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pidove, gShinyOverworldPalette_Pidove ) @@ -1756,7 +1940,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Tranquill, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Tranquill, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Tranquill, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -1773,6 +1961,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tranquill, gShinyOverworldPalette_Tranquill ) @@ -1824,7 +2013,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Unfezant, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Unfezant, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Unfezant, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1851,6 +2044,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Unfezant, gShinyOverworldPalette_Unfezant ) @@ -1859,6 +2053,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_UnfezantF, gShinyOverworldPalette_UnfezantF ) @@ -1905,7 +2100,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Blitzle, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Blitzle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Blitzle, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -1922,6 +2124,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Blitzle, gShinyOverworldPalette_Blitzle ) @@ -1968,7 +2171,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Zebstrika, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Zebstrika, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_BACK_AND_LUNGE, .backPic = gMonBackPic_Zebstrika, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1985,6 +2192,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zebstrika, gShinyOverworldPalette_Zebstrika ) @@ -2037,7 +2245,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Roggenrola, .frontPicSize = MON_COORDS_SIZE(24, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Roggenrola, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Roggenrola, .backPicSize = MON_COORDS_SIZE(40, 48), @@ -2054,6 +2266,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Roggenrola, gShinyOverworldPalette_Roggenrola ) @@ -2107,7 +2320,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Boldore, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Boldore, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Boldore, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -2124,6 +2344,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Boldore, gShinyOverworldPalette_Boldore ) @@ -2182,7 +2403,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Gigalith, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Gigalith, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_ROTATE_UP_SLAM_DOWN, .backPic = gMonBackPic_Gigalith, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -2199,6 +2424,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gigalith, gShinyOverworldPalette_Gigalith ) @@ -2245,7 +2471,27 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Woobat, .frontPicSize = MON_COORDS_SIZE(64, 32), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Woobat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_FOUR_PETAL, .enemyMonElevation = 19, .backPic = gMonBackPic_Woobat, @@ -2263,6 +2509,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Woobat, gShinyOverworldPalette_Woobat ) @@ -2309,7 +2556,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Swoobat, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Swoobat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, .enemyMonElevation = 10, .backPic = gMonBackPic_Swoobat, @@ -2327,6 +2581,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Swoobat, gShinyOverworldPalette_Swoobat ) @@ -2374,7 +2629,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Drilbur, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Drilbur, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONCAVE_FAST_SHORT, .backPic = gMonBackPic_Drilbur, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -2391,6 +2652,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Drilbur, gShinyOverworldPalette_Drilbur ) @@ -2438,7 +2700,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Excadrill, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Excadrill, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Excadrill, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2455,6 +2722,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Excadrill, gShinyOverworldPalette_Excadrill ) @@ -2503,7 +2771,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Audino, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Audino, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Audino, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -2520,6 +2792,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Audino, gShinyOverworldPalette_Audino ) @@ -2570,7 +2843,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_AudinoMega, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_AudinoMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_AudinoMega, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -2582,6 +2855,17 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconPalIndex = 1, SHADOW(-1, 7, SHADOW_SIZE_M) FOOTPRINT(Audino) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_AudinoMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_AudinoMega, + gShinyOverworldPalette_AudinoMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sAudinoLevelUpLearnset, .teachableLearnset = sAudinoTeachableLearnset, @@ -2630,7 +2914,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Timburr, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Timburr, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Timburr, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -2647,6 +2935,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Timburr, gShinyOverworldPalette_Timburr ) @@ -2693,7 +2982,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Gurdurr, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Gurdurr, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Gurdurr, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -2710,6 +3007,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gurdurr, gShinyOverworldPalette_Gurdurr ) @@ -2756,7 +3054,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Conkeldurr, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Conkeldurr, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Conkeldurr, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2773,6 +3074,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Conkeldurr, gShinyOverworldPalette_Conkeldurr ) @@ -2819,7 +3121,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Tympole, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Tympole, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Tympole, .backPicSize = MON_COORDS_SIZE(40, 32), @@ -2836,6 +3141,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tympole, gShinyOverworldPalette_Tympole ) @@ -2882,7 +3188,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Palpitoad, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Palpitoad, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 13), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Palpitoad, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -2899,6 +3211,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Palpitoad, gShinyOverworldPalette_Palpitoad ) @@ -2950,7 +3263,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Seismitoad, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Seismitoad, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_H_JUMPS, .backPic = gMonBackPic_Seismitoad, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -2967,6 +3288,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Seismitoad, gShinyOverworldPalette_Seismitoad ) @@ -3014,7 +3336,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Throh, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Throh, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Throh, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3031,6 +3358,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Throh, gShinyOverworldPalette_Throh ) @@ -3079,7 +3407,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Sawk, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Sawk, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Sawk, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -3096,6 +3427,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sawk, gShinyOverworldPalette_Sawk ) @@ -3143,7 +3475,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Sewaddle, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Sewaddle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_CIRCLE_INTO_BG, .backPic = gMonBackPic_Sewaddle, .backPicSize = MON_COORDS_SIZE(40, 48), @@ -3160,6 +3498,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sewaddle, gShinyOverworldPalette_Sewaddle ) @@ -3207,7 +3546,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Swadloon, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Swadloon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Swadloon, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -3224,6 +3568,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Swadloon, gShinyOverworldPalette_Swadloon ) @@ -3276,7 +3621,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Leavanny, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Leavanny, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Leavanny, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -3293,6 +3642,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Leavanny, gShinyOverworldPalette_Leavanny ) @@ -3344,7 +3694,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Venipede, .frontPicSize = MON_COORDS_SIZE(48, 32), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Venipede, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Venipede, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -3361,6 +3719,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Venipede, gShinyOverworldPalette_Venipede ) @@ -3412,7 +3771,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Whirlipede, .frontPicSize = MON_COORDS_SIZE(56, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Whirlipede, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_TIP_MOVE_FORWARD, .backPic = gMonBackPic_Whirlipede, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -3429,6 +3795,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Whirlipede, gShinyOverworldPalette_Whirlipede ) @@ -3485,7 +3852,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Scolipede, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Scolipede, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Scolipede, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3502,6 +3872,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Scolipede, gShinyOverworldPalette_Scolipede ) @@ -3555,7 +3926,17 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Cottonee, .frontPicSize = MON_COORDS_SIZE(48, 32), .frontPicYOffset = 18, - .frontAnimFrames = sAnims_Cottonee, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 50), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Cottonee, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -3572,6 +3953,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cottonee, gShinyOverworldPalette_Cottonee ) @@ -3619,7 +4001,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Whimsicott, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Whimsicott, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Whimsicott, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3636,6 +4022,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Whimsicott, gShinyOverworldPalette_Whimsicott ) @@ -3683,7 +4070,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Petilil, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Petilil, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .enemyMonElevation = 7, .backPic = gMonBackPic_Petilil, @@ -3701,6 +4094,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Petilil, gShinyOverworldPalette_Petilil ) @@ -3750,7 +4144,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Lilligant, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Lilligant, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Lilligant, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3767,6 +4165,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lilligant, gShinyOverworldPalette_Lilligant ) @@ -3816,7 +4215,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_LilligantHisui, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_LilligantHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_LilligantHisui, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -3833,6 +4232,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_LilligantHisui, gShinyOverworldPalette_LilligantHisui ) @@ -3901,6 +4301,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_BasculinRedStriped, gShinyOverworldPalette_BasculinRedStriped ) @@ -3966,6 +4367,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_BasculinBlueStriped, gShinyOverworldPalette_BasculinBlueStriped ) @@ -4032,6 +4434,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_BasculinWhiteStriped, gShinyOverworldPalette_BasculinWhiteStriped ) @@ -4079,7 +4482,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_BasculegionM, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Basculegion, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_BasculegionM, @@ -4097,6 +4500,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_BasculegionM, gShinyOverworldPalette_BasculegionM ) @@ -4141,7 +4545,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_BasculegionF, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Basculegion, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_BasculegionF, @@ -4159,6 +4563,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_BasculegionF, gShinyOverworldPalette_BasculegionF ) @@ -4208,7 +4613,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Sandile, .frontPicSize = MON_COORDS_SIZE(48, 32), .frontPicYOffset = 18, - .frontAnimFrames = sAnims_Sandile, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Sandile, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -4225,6 +4634,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sandile, gShinyOverworldPalette_Sandile ) @@ -4272,7 +4682,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Krokorok, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Krokorok, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Krokorok, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -4289,6 +4702,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Krokorok, gShinyOverworldPalette_Krokorok ) @@ -4341,7 +4755,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Krookodile, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Krookodile, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONCAVE_FAST_SHORT, .backPic = gMonBackPic_Krookodile, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4358,6 +4778,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Krookodile, gShinyOverworldPalette_Krookodile ) @@ -4404,7 +4825,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Darumaka, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Darumaka, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONCAVE, .backPic = gMonBackPic_Darumaka, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -4421,6 +4846,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Darumaka, gShinyOverworldPalette_Darumaka ) @@ -4468,7 +4894,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_DarmanitanStandard, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_DarmanitanStandard, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_DarmanitanStandard, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4485,6 +4916,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DarmanitanStandard, gShinyOverworldPalette_DarmanitanStandard ) @@ -4530,7 +4962,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_DarmanitanZen, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_DarmanitanZen, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_DarmanitanZen, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -4586,7 +5021,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_DarumakaGalar, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_DarumakaGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DarumakaGalar, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -4603,6 +5038,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DarumakaGalar, gShinyOverworldPalette_DarumakaGalar ) @@ -4651,7 +5087,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_DarmanitanGalarStandard, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_DarmanitanGalarStandard, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DarmanitanGalarStandard, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -4668,6 +5104,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DarmanitanGalarStandard, gShinyOverworldPalette_DarmanitanGalarStandard ) @@ -4715,7 +5152,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_DarmanitanGalarZen, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_DarmanitanGalarZen, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DarmanitanGalarZen, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4775,7 +5212,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Maractus, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Maractus, + .frontAnimFrames = ANIM_FRAMES( + 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), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Maractus, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4792,6 +5237,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Maractus, gShinyOverworldPalette_Maractus ) @@ -4840,7 +5286,17 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Dwebble, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Dwebble, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 50), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Dwebble, .backPicSize = MON_COORDS_SIZE(56, 32), @@ -4857,6 +5313,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dwebble, gShinyOverworldPalette_Dwebble ) @@ -4904,7 +5361,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Crustle, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Crustle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Crustle, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4921,6 +5385,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Crustle, gShinyOverworldPalette_Crustle ) @@ -4968,7 +5433,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Scraggy, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Scraggy, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Scraggy, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -4985,6 +5454,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Scraggy, gShinyOverworldPalette_Scraggy ) @@ -5033,7 +5503,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Scrafty, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Scrafty, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Scrafty, .backPicSize = MON_COORDS_SIZE(48, 64), @@ -5050,6 +5524,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Scrafty, gShinyOverworldPalette_Scrafty ) @@ -5096,7 +5571,16 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Sigilyph, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Sigilyph, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 7), + ), .frontAnimId = ANIM_FIGURE_8, .enemyMonElevation = 7, .backPic = gMonBackPic_Sigilyph, @@ -5114,6 +5598,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sigilyph, gShinyOverworldPalette_Sigilyph ) @@ -5162,7 +5647,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Yamask, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Yamask, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 10, .backPic = gMonBackPic_Yamask, @@ -5180,6 +5671,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Yamask, gShinyOverworldPalette_Yamask ) @@ -5228,7 +5720,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Cofagrigus, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Cofagrigus, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GLOW_BLACK, .backPic = gMonBackPic_Cofagrigus, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -5245,6 +5741,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cofagrigus, gShinyOverworldPalette_Cofagrigus ) @@ -5290,7 +5787,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_YamaskGalar, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_YamaskGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 4, .backPic = gMonBackPic_YamaskGalar, @@ -5308,6 +5805,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_YamaskGalar, gShinyOverworldPalette_YamaskGalar ) @@ -5355,7 +5853,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Runerigus, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Runerigus, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_Runerigus, @@ -5373,6 +5871,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Runerigus, gShinyOverworldPalette_Runerigus ) @@ -5420,7 +5919,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Tirtouga, .frontPicSize = MON_COORDS_SIZE(56, 40), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Tirtouga, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_RISING_WOBBLE, .backPic = gMonBackPic_Tirtouga, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -5437,6 +5941,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tirtouga, gShinyOverworldPalette_Tirtouga ) @@ -5483,7 +5988,18 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Carracosta, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Carracosta, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 35), + 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), + ), .frontAnimId = ANIM_H_SHAKE_SLOW, .backPic = gMonBackPic_Carracosta, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -5500,6 +6016,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Carracosta, gShinyOverworldPalette_Carracosta ) @@ -5546,7 +6063,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Archen, .frontPicSize = MON_COORDS_SIZE(56, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Archen, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 46), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Archen, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -5563,6 +6084,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Archen, gShinyOverworldPalette_Archen ) @@ -5609,7 +6131,16 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Archeops, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Archeops, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_RISING_WOBBLE, .enemyMonElevation = 11, .backPic = gMonBackPic_Archeops, @@ -5627,6 +6158,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Archeops, gShinyOverworldPalette_Archeops ) @@ -5674,7 +6206,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Trubbish, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Trubbish, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Trubbish, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -5691,6 +6227,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Trubbish, gShinyOverworldPalette_Trubbish ) @@ -5740,7 +6277,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Garbodor, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Garbodor, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Garbodor, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5757,6 +6298,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Garbodor, gShinyOverworldPalette_Garbodor ) @@ -5807,7 +6349,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_GarbodorGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_GarbodorGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GarbodorGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5866,7 +6408,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Zorua, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Zorua, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_CIRCULAR_VIBRATE, .backPic = gMonBackPic_Zorua, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -5883,6 +6431,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zorua, gShinyOverworldPalette_Zorua ) @@ -5930,7 +6479,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Zoroark, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Zoroark, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_FLICKER_INCREASING, .backPic = gMonBackPic_Zoroark, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -5947,6 +6502,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zoroark, gShinyOverworldPalette_Zoroark ) @@ -5993,7 +6549,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_ZoruaHisui, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_ZoruaHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ZoruaHisui, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -6010,6 +6566,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ZoruaHisui, gShinyOverworldPalette_ZoruaHisui ) @@ -6057,7 +6614,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_ZoroarkHisui, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_ZoroarkHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ZoroarkHisui, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6074,6 +6631,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ZoroarkHisui, gShinyOverworldPalette_ZoroarkHisui ) @@ -6123,7 +6681,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Minccino, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Minccino, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Minccino, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -6140,6 +6702,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Minccino, gShinyOverworldPalette_Minccino ) @@ -6187,7 +6750,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Cinccino, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Cinccino, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SLIDE, .backPic = gMonBackPic_Cinccino, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6204,6 +6773,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cinccino, gShinyOverworldPalette_Cinccino ) @@ -6254,7 +6824,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Gothita, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Gothita, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Gothita, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -6271,6 +6846,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gothita, gShinyOverworldPalette_Gothita ) @@ -6321,7 +6897,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Gothorita, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Gothorita, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Gothorita, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6338,6 +6920,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gothorita, gShinyOverworldPalette_Gothorita ) @@ -6387,7 +6970,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Gothitelle, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Gothitelle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Gothitelle, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6404,6 +6992,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gothitelle, gShinyOverworldPalette_Gothitelle ) @@ -6451,7 +7040,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Solosis, .frontPicSize = MON_COORDS_SIZE(32, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Solosis, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_TWIST, .enemyMonElevation = 14, .backPic = gMonBackPic_Solosis, @@ -6469,6 +7063,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Solosis, gShinyOverworldPalette_Solosis ) @@ -6515,7 +7110,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Duosion, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Duosion, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .enemyMonElevation = 7, .backPic = gMonBackPic_Duosion, @@ -6533,6 +7133,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Duosion, gShinyOverworldPalette_Duosion ) @@ -6578,7 +7179,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Reuniclus, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Reuniclus, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 8, .backPic = gMonBackPic_Reuniclus, @@ -6596,6 +7203,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Reuniclus, gShinyOverworldPalette_Reuniclus ) @@ -6642,7 +7250,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Ducklett, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Ducklett, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Ducklett, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -6659,6 +7275,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ducklett, gShinyOverworldPalette_Ducklett ) @@ -6705,7 +7322,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Swanna, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Swanna, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Swanna, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6722,6 +7342,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Swanna, gShinyOverworldPalette_Swanna ) @@ -6773,7 +7394,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Vanillite, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Vanillite, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Vanillite, .backPicSize = MON_COORDS_SIZE(40, 48), @@ -6790,6 +7417,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vanillite, gShinyOverworldPalette_Vanillite ) @@ -6841,7 +7469,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Vanillish, .frontPicSize = MON_COORDS_SIZE(32, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Vanillish, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Vanillish, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -6858,6 +7490,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vanillish, gShinyOverworldPalette_Vanillish ) @@ -6908,7 +7541,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Vanilluxe, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Vanilluxe, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Vanilluxe, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6925,6 +7562,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vanilluxe, gShinyOverworldPalette_Vanilluxe ) @@ -6988,6 +7626,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DeerlingSpring, gShinyOverworldPalette_DeerlingSpring ) @@ -7052,6 +7691,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DeerlingSummer, gShinyOverworldPalette_DeerlingSummer ) @@ -7116,6 +7756,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DeerlingAutumn, gShinyOverworldPalette_DeerlingAutumn ) @@ -7180,6 +7821,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DeerlingWinter, gShinyOverworldPalette_DeerlingWinter ) @@ -7244,6 +7886,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SawsbuckSpring, gShinyOverworldPalette_SawsbuckSpring ) @@ -7306,6 +7949,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SawsbuckSummer, gShinyOverworldPalette_SawsbuckSummer ) @@ -7368,6 +8012,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SawsbuckAutumn, gShinyOverworldPalette_SawsbuckAutumn ) @@ -7430,6 +8075,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SawsbuckWinter, gShinyOverworldPalette_SawsbuckWinter ) @@ -7478,7 +8124,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Emolga, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Emolga, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 21), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .enemyMonElevation = 19, .backPic = gMonBackPic_Emolga, @@ -7496,6 +8147,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Emolga, gShinyOverworldPalette_Emolga ) @@ -7543,7 +8195,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Karrablast, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Karrablast, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Karrablast, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -7560,6 +8215,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Karrablast, gShinyOverworldPalette_Karrablast ) @@ -7606,7 +8262,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Escavalier, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Escavalier, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_BACK_AND_LUNGE, .backPic = gMonBackPic_Escavalier, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -7623,6 +8283,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Escavalier, gShinyOverworldPalette_Escavalier ) @@ -7671,7 +8332,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Foongus, .frontPicSize = MON_COORDS_SIZE(32, 32), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Foongus, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_SWING_CONCAVE_FAST, .backPic = gMonBackPic_Foongus, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -7688,6 +8355,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Foongus, gShinyOverworldPalette_Foongus ) @@ -7737,7 +8405,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Amoonguss, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Amoonguss, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Amoonguss, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -7754,6 +8429,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Amoonguss, gShinyOverworldPalette_Amoonguss ) @@ -7800,7 +8476,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Frillish, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Frillish, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_RISING_WOBBLE, .backPic = gMonBackPic_Frillish, .backPicSize = MON_COORDS_SIZE(40, 56), @@ -7827,6 +8508,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Frillish, gShinyOverworldPalette_Frillish ) @@ -7835,6 +8517,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_FrillishF, gShinyOverworldPalette_FrillishF ) @@ -7881,7 +8564,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Jellicent, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Jellicent, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Jellicent, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -7908,6 +8597,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Jellicent, gShinyOverworldPalette_Jellicent ) @@ -7916,6 +8606,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_JellicentF, gShinyOverworldPalette_JellicentF ) @@ -7962,7 +8653,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Alomomola, .frontPicSize = MON_COORDS_SIZE(32, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Alomomola, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONCAVE, .backPic = gMonBackPic_Alomomola, .backPicSize = MON_COORDS_SIZE(48, 64), @@ -7979,6 +8674,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Alomomola, gShinyOverworldPalette_Alomomola ) @@ -8026,7 +8722,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Joltik, .frontPicSize = MON_COORDS_SIZE(32, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Joltik, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Joltik, .backPicSize = MON_COORDS_SIZE(48, 32), @@ -8043,6 +8745,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Joltik, gShinyOverworldPalette_Joltik ) @@ -8089,7 +8792,16 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Galvantula, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Galvantula, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ), .frontAnimId = ANIM_CIRCLE_C_CLOCKWISE_SLOW, .backPic = gMonBackPic_Galvantula, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -8106,6 +8818,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Galvantula, gShinyOverworldPalette_Galvantula ) @@ -8153,7 +8866,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Ferroseed, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Ferroseed, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Ferroseed, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -8170,6 +8889,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ferroseed, gShinyOverworldPalette_Ferroseed ) @@ -8221,7 +8941,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Ferrothorn, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Ferrothorn, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .enemyMonElevation = 10, .backPic = gMonBackPic_Ferrothorn, @@ -8239,6 +8965,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ferrothorn, gShinyOverworldPalette_Ferrothorn ) @@ -8286,7 +9013,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Klink, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Klink, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .enemyMonElevation = 12, .backPic = gMonBackPic_Klink, @@ -8304,6 +9036,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Klink, gShinyOverworldPalette_Klink ) @@ -8350,7 +9083,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Klang, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Klang, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .enemyMonElevation = 8, .backPic = gMonBackPic_Klang, @@ -8368,6 +9106,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Klang, gShinyOverworldPalette_Klang ) @@ -8414,7 +9153,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Klinklang, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Klinklang, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .enemyMonElevation = 4, .backPic = gMonBackPic_Klinklang, @@ -8432,6 +9176,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Klinklang, gShinyOverworldPalette_Klinklang ) @@ -8478,7 +9223,24 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Tynamo, .frontPicSize = MON_COORDS_SIZE(40, 24), .frontPicYOffset = 22, - .frontAnimFrames = sAnims_Tynamo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE_SMALL, .enemyMonElevation = 16, .backPic = gMonBackPic_Tynamo, @@ -8496,6 +9258,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tynamo, gShinyOverworldPalette_Tynamo ) @@ -8542,7 +9305,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Eelektrik, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Eelektrik, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 4), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_Eelektrik, @@ -8560,6 +9329,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Eelektrik, gShinyOverworldPalette_Eelektrik ) @@ -8605,7 +9375,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Eelektross, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Eelektross, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 27), + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 27), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW, .enemyMonElevation = 8, .backPic = gMonBackPic_Eelektross, @@ -8623,6 +9400,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Eelektross, gShinyOverworldPalette_Eelektross ) @@ -8669,7 +9447,16 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Elgyem, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Elgyem, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_RISING_WOBBLE, .backPic = gMonBackPic_Elgyem, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -8686,6 +9473,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Elgyem, gShinyOverworldPalette_Elgyem ) @@ -8732,7 +9520,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Beheeyem, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Beheeyem, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Beheeyem, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -8749,6 +9540,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Beheeyem, gShinyOverworldPalette_Beheeyem ) @@ -8800,7 +9592,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Litwick, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Litwick, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Litwick, .backPicSize = MON_COORDS_SIZE(40, 40), @@ -8817,6 +9614,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Litwick, gShinyOverworldPalette_Litwick ) @@ -8867,7 +9665,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Lampent, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Lampent, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 6, .backPic = gMonBackPic_Lampent, @@ -8885,6 +9688,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lampent, gShinyOverworldPalette_Lampent ) @@ -8934,7 +9738,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Chandelure, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Chandelure, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 6, .backPic = gMonBackPic_Chandelure, @@ -8952,6 +9760,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Chandelure, gShinyOverworldPalette_Chandelure ) @@ -8998,7 +9807,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Axew, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Axew, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Axew, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -9015,6 +9827,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Axew, gShinyOverworldPalette_Axew ) @@ -9061,7 +9874,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Fraxure, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Fraxure, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Fraxure, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -9078,6 +9894,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Fraxure, gShinyOverworldPalette_Fraxure ) @@ -9123,7 +9940,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Haxorus, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Haxorus, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Haxorus, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -9140,6 +9962,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Haxorus, gShinyOverworldPalette_Haxorus ) @@ -9190,7 +10013,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Cubchoo, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Cubchoo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Cubchoo, .backPicSize = MON_COORDS_SIZE(40, 40), @@ -9207,6 +10034,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cubchoo, gShinyOverworldPalette_Cubchoo ) @@ -9257,7 +10085,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Beartic, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Beartic, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Beartic, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -9274,6 +10107,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Beartic, gShinyOverworldPalette_Beartic ) @@ -9321,7 +10155,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Cryogonal, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Cryogonal, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 48), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SHRINK_GROW, .enemyMonElevation = 3, .backPic = gMonBackPic_Cryogonal, @@ -9339,6 +10179,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cryogonal, gShinyOverworldPalette_Cryogonal ) @@ -9385,7 +10226,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Shelmet, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Shelmet, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_TWIST, .backPic = gMonBackPic_Shelmet, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -9402,6 +10249,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Shelmet, gShinyOverworldPalette_Shelmet ) @@ -9448,7 +10296,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Accelgor, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Accelgor, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Accelgor, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -9465,6 +10316,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Accelgor, gShinyOverworldPalette_Accelgor ) @@ -9512,7 +10364,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Stunfisk, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Stunfisk, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Stunfisk, .backPicSize = MON_COORDS_SIZE(64, 24), @@ -9529,6 +10384,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Stunfisk, gShinyOverworldPalette_Stunfisk ) @@ -9576,7 +10432,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_StunfiskGalar, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_StunfiskGalar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_StunfiskGalar, .backPicSize = MON_COORDS_SIZE(64, 24), @@ -9593,6 +10449,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_StunfiskGalar, gShinyOverworldPalette_StunfiskGalar ) @@ -9643,7 +10500,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Mienfoo, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Mienfoo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Mienfoo, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -9660,6 +10520,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mienfoo, gShinyOverworldPalette_Mienfoo ) @@ -9706,7 +10567,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Mienshao, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Mienshao, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Mienshao, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -9723,6 +10592,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mienshao, gShinyOverworldPalette_Mienshao ) @@ -9770,7 +10640,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Druddigon, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Druddigon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW, .backPic = gMonBackPic_Druddigon, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -9787,6 +10665,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Druddigon, gShinyOverworldPalette_Druddigon ) @@ -9836,7 +10715,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Golett, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Golett, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Golett, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -9853,6 +10736,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Golett, gShinyOverworldPalette_Golett ) @@ -9900,7 +10784,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Golurk, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Golurk, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Golurk, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -9917,6 +10804,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Golurk, gShinyOverworldPalette_Golurk ) @@ -9963,7 +10851,16 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Pawniard, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Pawniard, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Pawniard, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -9980,6 +10877,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pawniard, gShinyOverworldPalette_Pawniard ) @@ -10027,7 +10925,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Bisharp, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Bisharp, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Bisharp, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -10044,6 +10945,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bisharp, gShinyOverworldPalette_Bisharp ) @@ -10090,7 +10992,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Kingambit, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Kingambit, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Kingambit, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -10107,6 +11009,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_64x64, SHADOW_SIZE_L, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Kingambit, gShinyOverworldPalette_Kingambit ) @@ -10154,7 +11057,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Bouffalant, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Bouffalant, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Bouffalant, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -10171,6 +11078,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bouffalant, gShinyOverworldPalette_Bouffalant ) @@ -10218,7 +11126,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Rufflet, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Rufflet, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Rufflet, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -10235,6 +11149,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rufflet, gShinyOverworldPalette_Rufflet ) @@ -10281,7 +11196,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Braviary, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Braviary, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 6, .backPic = gMonBackPic_Braviary, @@ -10299,6 +11218,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Braviary, gShinyOverworldPalette_Braviary ) @@ -10344,7 +11264,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_BraviaryHisui, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_BraviaryHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 3, .backPic = gMonBackPic_BraviaryHisui, @@ -10362,6 +11282,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_BraviaryHisui, gShinyOverworldPalette_BraviaryHisui ) @@ -10411,7 +11332,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Vullaby, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Vullaby, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Vullaby, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -10428,6 +11353,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vullaby, gShinyOverworldPalette_Vullaby ) @@ -10474,7 +11400,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Mandibuzz, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Mandibuzz, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Mandibuzz, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -10491,6 +11421,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mandibuzz, gShinyOverworldPalette_Mandibuzz ) @@ -10537,7 +11468,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Heatmor, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Heatmor, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Heatmor, .backPicSize = MON_COORDS_SIZE(64, 24), @@ -10554,6 +11488,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Heatmor, gShinyOverworldPalette_Heatmor ) @@ -10601,7 +11536,25 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Durant, .frontPicSize = MON_COORDS_SIZE(48, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Durant, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ), .frontAnimId = ANIM_RAPID_H_HOPS, .backPic = gMonBackPic_Durant, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -10618,6 +11571,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Durant, gShinyOverworldPalette_Durant ) @@ -10665,7 +11619,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Deino, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Deino, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Deino, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -10682,6 +11640,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Deino, gShinyOverworldPalette_Deino ) @@ -10728,7 +11687,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Zweilous, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Zweilous, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Zweilous, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -10745,6 +11707,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zweilous, gShinyOverworldPalette_Zweilous ) @@ -10790,7 +11753,16 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Hydreigon, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Hydreigon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_RISING_WOBBLE, .enemyMonElevation = 3, .backPic = gMonBackPic_Hydreigon, @@ -10808,6 +11780,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hydreigon, gShinyOverworldPalette_Hydreigon ) @@ -10854,7 +11827,19 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Larvesta, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Larvesta, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_GLOW_ORANGE, .backPic = gMonBackPic_Larvesta, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -10871,6 +11856,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Larvesta, gShinyOverworldPalette_Larvesta ) @@ -10919,7 +11905,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Volcarona, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Volcarona, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 6, .backPic = gMonBackPic_Volcarona, @@ -10937,6 +11928,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Volcarona, gShinyOverworldPalette_Volcarona ) @@ -10983,7 +11975,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Cobalion, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Cobalion, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Cobalion, .backPicSize = MON_COORDS_SIZE(48, 64), @@ -11000,6 +11996,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cobalion, gShinyOverworldPalette_Cobalion ) @@ -11048,7 +12045,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Terrakion, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Terrakion, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Terrakion, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -11065,6 +12070,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Terrakion, gShinyOverworldPalette_Terrakion ) @@ -11113,7 +12119,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Virizion, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Virizion, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Virizion, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -11130,6 +12139,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Virizion, gShinyOverworldPalette_Virizion ) @@ -11178,7 +12188,30 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_TornadusIncarnate, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_TornadusIncarnate, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ), .frontAnimId = ANIM_FIGURE_8, .enemyMonElevation = 7, .backPic = gMonBackPic_TornadusIncarnate, @@ -11196,6 +12229,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TornadusIncarnate, gShinyOverworldPalette_TornadusIncarnate ) @@ -11244,7 +12278,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_TornadusTherian, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_TornadusTherian, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_TornadusTherian, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -11261,6 +12301,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TornadusTherian, gShinyOverworldPalette_TornadusTherian ) @@ -11311,7 +12352,30 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_ThundurusIncarnate, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_ThundurusIncarnate, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ), .frontAnimId = ANIM_FIGURE_8, .enemyMonElevation = 7, .backPic = gMonBackPic_ThundurusIncarnate, @@ -11329,6 +12393,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ThundurusIncarnate, gShinyOverworldPalette_ThundurusIncarnate ) @@ -11377,7 +12442,24 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_ThundurusTherian, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_ThundurusTherian, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_RISING_WOBBLE, .enemyMonElevation = 7, .backPic = gMonBackPic_ThundurusTherian, @@ -11395,6 +12477,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ThundurusTherian, gShinyOverworldPalette_ThundurusTherian ) @@ -11445,7 +12528,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Reshiram, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Reshiram, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Reshiram, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -11462,6 +12548,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Reshiram, gShinyOverworldPalette_Reshiram ) @@ -11511,7 +12598,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Zekrom, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Zekrom, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Zekrom, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -11528,6 +12618,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zekrom, gShinyOverworldPalette_Zekrom ) @@ -11577,7 +12668,30 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_LandorusIncarnate, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_LandorusIncarnate, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ), .frontAnimId = ANIM_FIGURE_8, .enemyMonElevation = 7, .backPic = gMonBackPic_LandorusIncarnate, @@ -11595,6 +12709,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_LandorusIncarnate, gShinyOverworldPalette_LandorusIncarnate ) @@ -11643,7 +12758,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_LandorusTherian, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_LandorusTherian, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_CIRCULAR_VIBRATE, .backPic = gMonBackPic_LandorusTherian, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -11660,6 +12781,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_LandorusTherian, gShinyOverworldPalette_LandorusTherian ) @@ -11713,7 +12835,12 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_Kyurem, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Kyurem, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Kyurem, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -11730,6 +12857,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kyurem, gShinyOverworldPalette_Kyurem ) @@ -11786,7 +12914,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_KyuremWhite, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_KyuremWhite, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_KyuremWhite, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -11803,6 +12934,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_KyuremWhite, gShinyOverworldPalette_KyuremWhite ) @@ -11859,7 +12991,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_KyuremBlack, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_KyuremBlack, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_KyuremBlack, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -11876,6 +13011,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_KyuremBlack, gShinyOverworldPalette_KyuremBlack ) @@ -11928,7 +13064,10 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_KeldeoOrdinary, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_KeldeoOrdinary, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_KeldeoOrdinary, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -11945,6 +13084,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_KeldeoOrdinary, gShinyOverworldPalette_KeldeoOrdinary ) @@ -11995,7 +13135,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_KeldeoResolute, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_KeldeoResolute, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_JUMPS_H_JUMPS, .backPic = gMonBackPic_KeldeoResolute, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -12060,7 +13204,15 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_MeloettaAria, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_MeloettaAria, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .enemyMonElevation = 8, .backPic = gMonBackPic_MeloettaAria, @@ -12078,6 +13230,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MeloettaAria, gShinyOverworldPalette_MeloettaAria ) @@ -12131,7 +13284,14 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .frontPic = gMonFrontPic_MeloettaPirouette, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_MeloettaPirouette, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .enemyMonElevation = 5, .backPic = gMonBackPic_MeloettaPirouette, @@ -12149,6 +13309,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MeloettaPirouette, gShinyOverworldPalette_MeloettaPirouette ) @@ -12215,6 +13376,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Genesect, \ gShinyOverworldPalette_Genesect \ ) \ diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 147fadbaf8..b42696983e 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -41,7 +41,13 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Chespin, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Chespin, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Chespin, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -58,6 +64,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Chespin, gShinyOverworldPalette_Chespin ) @@ -104,7 +111,13 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Quilladin, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Quilladin, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_LUNGE_GROW, .backPic = gMonBackPic_Quilladin, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -121,6 +134,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Quilladin, gShinyOverworldPalette_Quilladin ) @@ -166,7 +180,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Chesnaught, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Chesnaught, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_IN_STAGES, .backPic = gMonBackPic_Chesnaught, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -183,6 +201,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Chesnaught, gShinyOverworldPalette_Chesnaught ) @@ -229,7 +248,15 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Fennekin, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Fennekin, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Fennekin, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -246,6 +273,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Fennekin, gShinyOverworldPalette_Fennekin ) @@ -292,7 +320,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Braixen, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Braixen, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Braixen, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -309,6 +341,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Braixen, gShinyOverworldPalette_Braixen ) @@ -354,7 +387,15 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Delphox, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Delphox, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Delphox, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -371,6 +412,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Delphox, gShinyOverworldPalette_Delphox ) @@ -417,7 +459,15 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Froakie, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Froakie, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 13), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 11), + ), .frontAnimId = ANIM_H_JUMPS, .backPic = gMonBackPic_Froakie, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -434,6 +484,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Froakie, gShinyOverworldPalette_Froakie ) @@ -480,7 +531,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Frogadier, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Frogadier, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Frogadier, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -497,6 +551,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Frogadier, gShinyOverworldPalette_Frogadier ) @@ -556,6 +611,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Greninja, gShinyOverworldPalette_Greninja ) @@ -598,7 +654,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Greninja, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Greninja, + .frontAnimFrames =sAnims_Greninja, .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Greninja, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -615,6 +671,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Greninja, gShinyOverworldPalette_Greninja ) @@ -658,7 +715,13 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_GreninjaAsh, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_GreninjaAsh, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_GreninjaAsh, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -715,7 +778,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Bunnelby, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Bunnelby, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Bunnelby, .backPicSize = MON_COORDS_SIZE(48, 64), @@ -732,6 +798,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bunnelby, gShinyOverworldPalette_Bunnelby ) @@ -778,7 +845,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Diggersby, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Diggersby, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Diggersby, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -795,6 +865,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Diggersby, gShinyOverworldPalette_Diggersby ) @@ -841,7 +912,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Fletchling, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Fletchling, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 7), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_JUMPS_SMALL, .backPic = gMonBackPic_Fletchling, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -858,6 +936,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Fletchling, gShinyOverworldPalette_Fletchling ) @@ -904,7 +983,16 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Fletchinder, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Fletchinder, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SLIDE_SLOW, .enemyMonElevation = 9, .backPic = gMonBackPic_Fletchinder, @@ -922,6 +1010,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Fletchinder, gShinyOverworldPalette_Fletchinder ) @@ -967,7 +1056,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Talonflame, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Talonflame, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 55), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 7, .backPic = gMonBackPic_Talonflame, @@ -985,6 +1077,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Talonflame, gShinyOverworldPalette_Talonflame ) @@ -1037,13 +1130,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .shinyPalette = gMonShinyPalette_Scatterbug, \ .iconSprite = gMonIcon_Scatterbug, \ .iconPalIndex = 1, \ - SHADOW(1, 1, SHADOW_SIZE_S) \ + SHADOW(1, 1, SHADOW_SIZE_S) \ FOOTPRINT(Scatterbug) \ OVERWORLD( \ sPicTable_Scatterbug, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Scatterbug, \ gShinyOverworldPalette_Scatterbug \ ) \ @@ -1074,7 +1168,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = [SPECIES_SCATTERBUG_OCEAN] = SCATTERBUG_SPECIES_INFO(OCEAN), [SPECIES_SCATTERBUG_JUNGLE] = SCATTERBUG_SPECIES_INFO(JUNGLE), [SPECIES_SCATTERBUG_FANCY] = SCATTERBUG_SPECIES_INFO(FANCY), - [SPECIES_SCATTERBUG_POKEBALL] = SCATTERBUG_SPECIES_INFO(POKEBALL), + [SPECIES_SCATTERBUG_POKEBALL] = SCATTERBUG_SPECIES_INFO(POKEBALL), #define SPEWPA_SPECIES_INFO(evolution) \ { \ @@ -1119,13 +1213,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .shinyPalette = gMonShinyPalette_Spewpa, \ .iconSprite = gMonIcon_Spewpa, \ .iconPalIndex = 1, \ - SHADOW(0, 2, SHADOW_SIZE_M) \ + SHADOW(0, 2, SHADOW_SIZE_M) \ FOOTPRINT(Spewpa) \ OVERWORLD( \ sPicTable_Spewpa, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Spewpa, \ gShinyOverworldPalette_Spewpa \ ) \ @@ -1201,13 +1296,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .shinyPalette = gMonShinyPalette_Vivillon ##form, \ .iconSprite = gMonIcon_Vivillon ##form, \ .iconPalIndex = iconPal, \ - SHADOW(0, 20, SHADOW_SIZE_M) \ + SHADOW(0, 20, SHADOW_SIZE_M) \ FOOTPRINT(Vivillon) \ OVERWORLD( \ sPicTable_Vivillon ##form, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Vivillon ##form, \ gShinyOverworldPalette_Vivillon ##form \ ) \ @@ -1435,7 +1531,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Litleo, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Litleo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_BACK_AND_LUNGE, .backPic = gMonBackPic_Litleo, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -1452,6 +1552,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Litleo, gShinyOverworldPalette_Litleo ) @@ -1498,7 +1599,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Pyroar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Pyroar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Pyroar, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1523,6 +1627,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pyroar, gShinyOverworldPalette_Pyroar ) @@ -1530,7 +1635,8 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = sPicTable_PyroarF, SIZE_32x32, SHADOW_SIZE_M, - TRACKS_FOOT + TRACKS_FOOT, + sAnimTable_Following ) .levelUpLearnset = sPyroarLevelUpLearnset, .teachableLearnset = sPyroarTeachableLearnset, @@ -1587,6 +1693,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Flabebe##Form, \ gShinyOverworldPalette_Flabebe##Form \ ) \ @@ -1675,6 +1782,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Floette ##form, \ gShinyOverworldPalette_Floette ##form \ ) \ @@ -1823,6 +1931,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Florges ##Form, \ gShinyOverworldPalette_Florges ##Form \ ) \ @@ -1914,7 +2023,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Skiddo, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Skiddo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Skiddo, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -1931,6 +2043,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Skiddo, gShinyOverworldPalette_Skiddo ) @@ -1977,7 +2090,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Gogoat, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Gogoat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Gogoat, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -1994,6 +2111,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gogoat, gShinyOverworldPalette_Gogoat ) @@ -2041,7 +2159,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Pancham, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Pancham, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Pancham, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -2058,6 +2183,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pancham, gShinyOverworldPalette_Pancham ) @@ -2105,7 +2231,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Pangoro, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Pangoro, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_BACK_AND_LUNGE, .backPic = gMonBackPic_Pangoro, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2122,6 +2255,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pangoro, gShinyOverworldPalette_Pangoro ) @@ -2175,13 +2309,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .shinyPalette = gMonShinyPalette_Furfrou##_form, \ .iconSprite = gMonIcon_Furfrou##_form, \ .iconPalIndex = _iconIdx, \ - SHADOW(3, 10, SHADOW_SIZE_XL_BATTLE_ONLY) \ + SHADOW(3, 10, SHADOW_SIZE_XL_BATTLE_ONLY) \ FOOTPRINT(Furfrou) \ OVERWORLD( \ sPicTable_Furfrou##_form, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Furfrou##_form, \ gShinyOverworldPalette_Furfrou##_form \ ) \ @@ -2192,16 +2327,16 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .formChangeTable = sFurfrouFormChangeTable, \ } - [SPECIES_FURFROU_NATURAL] = FURFROU_MISC_INFO(Natural, FALSE, 48, 3, 56, 0, 0), - [SPECIES_FURFROU_HEART_TRIM] = FURFROU_MISC_INFO(HeartTrim, FALSE, 56, 2, 56, 1, 0), - [SPECIES_FURFROU_STAR_TRIM] = FURFROU_MISC_INFO(StarTrim, FALSE, 56, 2, 64, 1, 0), - [SPECIES_FURFROU_DIAMOND_TRIM] = FURFROU_MISC_INFO(DiamondTrim, FALSE, 48, 2, 56, 1, 0), - [SPECIES_FURFROU_DEBUTANTE_TRIM] = FURFROU_MISC_INFO(DebutanteTrim, TRUE, 48, 2, 56, 1, 2), - [SPECIES_FURFROU_MATRON_TRIM] = FURFROU_MISC_INFO(MatronTrim, FALSE, 48, 2, 56, 1, 2), - [SPECIES_FURFROU_DANDY_TRIM] = FURFROU_MISC_INFO(DandyTrim, FALSE, 48, 2, 56, 1, 1), - [SPECIES_FURFROU_LA_REINE_TRIM] = FURFROU_MISC_INFO(LaReineTrim, FALSE, 48, 2, 56, 1, 0), - [SPECIES_FURFROU_KABUKI_TRIM] = FURFROU_MISC_INFO(KabukiTrim, FALSE, 56, 2, 56, 1, 0), - [SPECIES_FURFROU_PHARAOH_TRIM] = FURFROU_MISC_INFO(PharaohTrim, FALSE, 48, 2, 56, 1, 0), + [SPECIES_FURFROU_NATURAL] = FURFROU_MISC_INFO(Natural, FALSE, 48, 3, 56, 0, 0), + [SPECIES_FURFROU_HEART] = FURFROU_MISC_INFO(Heart, FALSE, 56, 2, 56, 1, 0), + [SPECIES_FURFROU_STAR] = FURFROU_MISC_INFO(Star, FALSE, 56, 2, 64, 1, 0), + [SPECIES_FURFROU_DIAMOND] = FURFROU_MISC_INFO(Diamond, FALSE, 48, 2, 56, 1, 0), + [SPECIES_FURFROU_DEBUTANTE] = FURFROU_MISC_INFO(Debutante, TRUE, 48, 2, 56, 1, 2), + [SPECIES_FURFROU_MATRON] = FURFROU_MISC_INFO(Matron, FALSE, 48, 2, 56, 1, 2), + [SPECIES_FURFROU_DANDY] = FURFROU_MISC_INFO(Dandy, FALSE, 48, 2, 56, 1, 1), + [SPECIES_FURFROU_LA_REINE] = FURFROU_MISC_INFO(LaReine, FALSE, 48, 2, 56, 1, 0), + [SPECIES_FURFROU_KABUKI] = FURFROU_MISC_INFO(Kabuki, FALSE, 56, 2, 56, 1, 0), + [SPECIES_FURFROU_PHARAOH] = FURFROU_MISC_INFO(Pharaoh, FALSE, 48, 2, 56, 1, 0), #endif //P_FAMILY_FURFROU #if P_FAMILY_ESPURR @@ -2242,7 +2377,15 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Espurr, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Espurr, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Espurr, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -2259,6 +2402,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Espurr, gShinyOverworldPalette_Espurr ) @@ -2323,6 +2467,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MeowsticM, gShinyOverworldPalette_MeowsticM ) @@ -2385,6 +2530,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MeowsticF, gShinyOverworldPalette_MeowsticF ) @@ -2432,7 +2578,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Honedge, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Honedge, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SWING_CONVEX, .enemyMonElevation = 4, .backPic = gMonBackPic_Honedge, @@ -2450,6 +2600,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Honedge, gShinyOverworldPalette_Honedge ) @@ -2496,7 +2647,13 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Doublade, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Doublade, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_VIBRATE, .enemyMonElevation = 5, .backPic = gMonBackPic_Doublade, @@ -2514,6 +2671,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Doublade, gShinyOverworldPalette_Doublade ) @@ -2562,7 +2720,13 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_AegislashShield, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_AegislashShield, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_VIBRATE, .enemyMonElevation = 3, .backPic = gMonBackPic_AegislashShield, @@ -2580,6 +2744,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_AegislashShield, gShinyOverworldPalette_AegislashShield ) @@ -2632,7 +2797,13 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_AegislashBlade, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_AegislashBlade, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_CIRCLE_C_CLOCKWISE_SLOW, .enemyMonElevation = 3, .backPic = gMonBackPic_AegislashBlade, @@ -2690,7 +2861,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Spritzee, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Spritzee, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 14, .backPic = gMonBackPic_Spritzee, @@ -2708,6 +2886,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Spritzee, gShinyOverworldPalette_Spritzee ) @@ -2755,7 +2934,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Aromatisse, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Aromatisse, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Aromatisse, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2772,6 +2954,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Aromatisse, gShinyOverworldPalette_Aromatisse ) @@ -2818,7 +3001,15 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Swirlix, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Swirlix, + .frontAnimFrames = ANIM_FRAMES( + 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), + ), .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .backPic = gMonBackPic_Swirlix, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -2835,6 +3026,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Swirlix, gShinyOverworldPalette_Swirlix ) @@ -2882,7 +3074,13 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Slurpuff, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Slurpuff, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Slurpuff, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2899,6 +3097,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Slurpuff, gShinyOverworldPalette_Slurpuff ) @@ -2945,7 +3144,12 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Inkay, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Inkay, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 25), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE, .enemyMonElevation = 14, .backPic = gMonBackPic_Inkay, @@ -2963,6 +3167,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Inkay, gShinyOverworldPalette_Inkay ) @@ -3009,7 +3214,12 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Malamar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Malamar, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Malamar, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3026,6 +3236,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Malamar, gShinyOverworldPalette_Malamar ) @@ -3072,7 +3283,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Binacle, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Binacle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ), .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Binacle, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3089,6 +3307,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Binacle, gShinyOverworldPalette_Binacle ) @@ -3136,7 +3355,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Barbaracle, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Barbaracle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Barbaracle, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3153,6 +3375,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Barbaracle, gShinyOverworldPalette_Barbaracle ) @@ -3199,7 +3422,16 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Skrelp, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Skrelp, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE_SMALL, .backPic = gMonBackPic_Skrelp, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3216,6 +3448,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Skrelp, gShinyOverworldPalette_Skrelp ) @@ -3262,7 +3495,12 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Dragalge, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Dragalge, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_FRONT_FLIP, .backPic = gMonBackPic_Dragalge, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3279,6 +3517,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dragalge, gShinyOverworldPalette_Dragalge ) @@ -3326,7 +3565,13 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Clauncher, .frontPicSize = MON_COORDS_SIZE(56, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Clauncher, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_TIP_MOVE_FORWARD, .backPic = gMonBackPic_Clauncher, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3343,6 +3588,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Clauncher, gShinyOverworldPalette_Clauncher ) @@ -3390,7 +3636,16 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Clawitzer, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Clawitzer, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ), .frontAnimId = ANIM_CIRCLE_C_CLOCKWISE_SLOW, .backPic = gMonBackPic_Clawitzer, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3407,6 +3662,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Clawitzer, gShinyOverworldPalette_Clawitzer ) @@ -3453,7 +3709,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Helioptile, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Helioptile, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GLOW_YELLOW, .backPic = gMonBackPic_Helioptile, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3470,6 +3730,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Helioptile, gShinyOverworldPalette_Helioptile ) @@ -3517,7 +3778,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Heliolisk, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Heliolisk, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 30), + ), .frontAnimId = ANIM_RAPID_H_HOPS, .backPic = gMonBackPic_Heliolisk, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -3534,6 +3799,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Heliolisk, gShinyOverworldPalette_Heliolisk ) @@ -3580,7 +3846,12 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Tyrunt, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Tyrunt, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Tyrunt, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3597,6 +3868,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tyrunt, gShinyOverworldPalette_Tyrunt ) @@ -3643,7 +3915,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Tyrantrum, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Tyrantrum, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Tyrantrum, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -3660,6 +3935,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tyrantrum, gShinyOverworldPalette_Tyrantrum ) @@ -3706,7 +3982,18 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Amaura, .frontPicSize = MON_COORDS_SIZE(32, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Amaura, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 11), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_CONCAVE_ARC_SMALL_TWICE, .backPic = gMonBackPic_Amaura, .backPicSize = MON_COORDS_SIZE(40, 64), @@ -3723,6 +4010,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Amaura, gShinyOverworldPalette_Amaura ) @@ -3769,7 +4057,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Aurorus, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Aurorus, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Aurorus, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3786,6 +4077,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Aurorus, gShinyOverworldPalette_Aurorus ) @@ -3837,7 +4129,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Hawlucha, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Hawlucha, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Hawlucha, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3854,6 +4150,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hawlucha, gShinyOverworldPalette_Hawlucha ) @@ -3901,7 +4198,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Dedenne, .frontPicSize = MON_COORDS_SIZE(64, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Dedenne, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GLOW_YELLOW, .backPic = gMonBackPic_Dedenne, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3918,6 +4219,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dedenne, gShinyOverworldPalette_Dedenne ) @@ -3966,7 +4268,17 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Carbink, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Carbink, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_ZIGZAG_SLOW, .enemyMonElevation = 4, .backPic = gMonBackPic_Carbink, @@ -3984,6 +4296,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Carbink, gShinyOverworldPalette_Carbink ) @@ -4031,7 +4344,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Goomy, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Goomy, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 28), + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Goomy, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -4048,6 +4365,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Goomy, gShinyOverworldPalette_Goomy ) @@ -4096,7 +4414,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Sliggoo, .frontPicSize = MON_COORDS_SIZE(32, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Sliggoo, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Sliggoo, .backPicSize = MON_COORDS_SIZE(48, 64), @@ -4113,6 +4435,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sliggoo, gShinyOverworldPalette_Sliggoo ) @@ -4160,7 +4483,13 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Goodra, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Goodra, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Goodra, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4177,6 +4506,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Goodra, gShinyOverworldPalette_Goodra ) @@ -4224,7 +4554,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_SliggooHisui, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_SliggooHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SliggooHisui, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4241,6 +4571,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SliggooHisui, gShinyOverworldPalette_SliggooHisui ) @@ -4289,7 +4620,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_GoodraHisui, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_GoodraHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GoodraHisui, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4306,6 +4637,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GoodraHisui, gShinyOverworldPalette_GoodraHisui ) @@ -4356,7 +4688,17 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Klefki, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Klefki, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_FOUR_PETAL, .enemyMonElevation = 5, .backPic = gMonBackPic_Klefki, @@ -4374,6 +4716,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Klefki, gShinyOverworldPalette_Klefki ) @@ -4421,7 +4764,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Phantump, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Phantump, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_Phantump, @@ -4439,6 +4786,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Phantump, gShinyOverworldPalette_Phantump ) @@ -4486,7 +4834,14 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Trevenant, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Trevenant, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Trevenant, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4503,6 +4858,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Trevenant, gShinyOverworldPalette_Trevenant ) @@ -4566,6 +4922,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pumpkaboo, gShinyOverworldPalette_Pumpkaboo ) @@ -4630,6 +4987,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pumpkaboo, gShinyOverworldPalette_Pumpkaboo ) @@ -4694,6 +5052,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pumpkaboo, gShinyOverworldPalette_Pumpkaboo ) @@ -4760,6 +5119,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pumpkaboo, gShinyOverworldPalette_Pumpkaboo ) @@ -4825,6 +5185,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gourgeist, gShinyOverworldPalette_Gourgeist ) @@ -4887,6 +5248,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gourgeist, gShinyOverworldPalette_Gourgeist ) @@ -4949,6 +5311,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gourgeist, gShinyOverworldPalette_Gourgeist ) @@ -5013,6 +5376,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gourgeist, gShinyOverworldPalette_Gourgeist ) @@ -5066,7 +5430,13 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Bergmite, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Bergmite, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 11), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_LUNGE_GROW, .backPic = gMonBackPic_Bergmite, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -5083,6 +5453,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bergmite, gShinyOverworldPalette_Bergmite ) @@ -5130,7 +5501,12 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Avalugg, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Avalugg, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Avalugg, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -5147,6 +5523,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Avalugg, gShinyOverworldPalette_Avalugg ) @@ -5192,7 +5569,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_AvaluggHisui, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_AvaluggHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_AvaluggHisui, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -5209,6 +5586,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_AvaluggHisui, gShinyOverworldPalette_AvaluggHisui ) @@ -5262,7 +5640,16 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Noibat, .frontPicSize = MON_COORDS_SIZE(64, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Noibat, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_RISING_WOBBLE, .enemyMonElevation = 8, .backPic = gMonBackPic_Noibat, @@ -5280,6 +5667,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Noibat, gShinyOverworldPalette_Noibat ) @@ -5330,7 +5718,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Noivern, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Noivern, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Noivern, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5347,6 +5738,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Noivern, gShinyOverworldPalette_Noivern ) @@ -5406,6 +5798,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_XerneasNeutral, gShinyOverworldPalette_XerneasNeutral ) @@ -5468,6 +5861,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_XerneasNeutral, gShinyOverworldPalette_XerneasNeutral ) @@ -5519,7 +5913,12 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Yveltal, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Yveltal, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_FRONT_FLIP, .enemyMonElevation = 5, .backPic = gMonBackPic_Yveltal, @@ -5537,6 +5936,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Yveltal, gShinyOverworldPalette_Yveltal ) @@ -5600,6 +6000,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zygarde50, gShinyOverworldPalette_Zygarde50 ) @@ -5662,6 +6063,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zygarde50, gShinyOverworldPalette_Zygarde50 ) @@ -5724,6 +6126,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zygarde10, gShinyOverworldPalette_Zygarde10 ) @@ -5787,6 +6190,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zygarde10, gShinyOverworldPalette_Zygarde10 ) @@ -5837,7 +6241,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_ZygardeComplete, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_ZygardeComplete, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_ZygardeComplete, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5854,6 +6262,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ZygardeComplete, gShinyOverworldPalette_ZygardeComplete ) @@ -5906,7 +6315,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Diancie, .frontPicSize = MON_COORDS_SIZE(40, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Diancie, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Diancie, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5923,6 +6336,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Diancie, gShinyOverworldPalette_Diancie ) @@ -5974,7 +6388,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_DiancieMega, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_DiancieMega, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DiancieMega, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -5986,6 +6400,17 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconPalIndex = 0, SHADOW(0, 12, SHADOW_SIZE_M) FOOTPRINT(Diancie) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_DiancieMega, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_DiancieMega, + gShinyOverworldPalette_DiancieMega + ) + #endif //OW_BATTLE_ONLY_FORMS .isMythical = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, @@ -6036,7 +6461,17 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_HoopaConfined, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_HoopaConfined, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_ZIGZAG_SLOW, .enemyMonElevation = 13, .backPic = gMonBackPic_HoopaConfined, @@ -6054,6 +6489,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_HoopaConfined, gShinyOverworldPalette_HoopaConfined ) @@ -6103,7 +6539,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_HoopaUnbound, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_HoopaUnbound, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GROW_IN_STAGES, .enemyMonElevation = 3, .backPic = gMonBackPic_HoopaUnbound, @@ -6121,6 +6560,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_HoopaUnbound, gShinyOverworldPalette_HoopaUnbound ) @@ -6172,7 +6612,10 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .frontPic = gMonFrontPic_Volcanion, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Volcanion, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Volcanion, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6189,6 +6632,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Volcanion, gShinyOverworldPalette_Volcanion ) diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index cb126fd171..fb97530b74 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -41,7 +41,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Rowlet, .frontPicSize = MON_COORDS_SIZE(31, 37), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Rowlet, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Rowlet, .backPicSize = MON_COORDS_SIZE(43, 36), @@ -58,6 +61,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rowlet, gShinyOverworldPalette_Rowlet ) @@ -105,7 +109,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Dartrix, .frontPicSize = MON_COORDS_SIZE(34, 47), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Dartrix, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Dartrix, .backPicSize = MON_COORDS_SIZE(56, 54), @@ -122,6 +129,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dartrix, gShinyOverworldPalette_Dartrix ) @@ -168,7 +176,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Decidueye, .frontPicSize = MON_COORDS_SIZE(45, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Decidueye, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SHRINK_GROW_VIBRATE_FAST, .backPic = gMonBackPic_Decidueye, .backPicSize = MON_COORDS_SIZE(46, 62), @@ -185,6 +196,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Decidueye, gShinyOverworldPalette_Decidueye ) @@ -231,7 +243,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_DecidueyeHisui, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_DecidueyeHisui, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DecidueyeHisui, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -248,6 +260,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_DecidueyeHisui, gShinyOverworldPalette_DecidueyeHisui ) @@ -297,7 +310,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Litten, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Litten, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Litten, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -314,6 +327,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Litten, gShinyOverworldPalette_Litten ) @@ -360,7 +374,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Torracat, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Torracat, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Torracat, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -377,6 +391,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Torracat, gShinyOverworldPalette_Torracat ) @@ -422,7 +437,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Incineroar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Incineroar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Incineroar, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -439,6 +454,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Incineroar, gShinyOverworldPalette_Incineroar ) @@ -485,7 +501,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Popplio, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Popplio, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Popplio, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -502,6 +518,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Popplio, gShinyOverworldPalette_Popplio ) @@ -548,7 +565,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Brionne, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Brionne, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Brionne, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -565,6 +582,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Brionne, gShinyOverworldPalette_Brionne ) @@ -610,7 +628,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Primarina, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Primarina, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHAKE_GLOW_BLUE_SLOW, .backPic = gMonBackPic_Primarina, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -627,6 +645,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Primarina, gShinyOverworldPalette_Primarina ) @@ -674,7 +693,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Pikipek, .frontPicSize = MON_COORDS_SIZE(29, 40), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Pikipek, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Pikipek, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -691,6 +714,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pikipek, gShinyOverworldPalette_Pikipek ) @@ -738,7 +762,12 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Trumbeak, .frontPicSize = MON_COORDS_SIZE(44, 53), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Trumbeak, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Trumbeak, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -755,6 +784,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Trumbeak, gShinyOverworldPalette_Trumbeak ) @@ -801,7 +831,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Toucannon, .frontPicSize = MON_COORDS_SIZE(59, 59), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Toucannon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SHAKE_GLOW_RED_SLOW, .backPic = gMonBackPic_Toucannon, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -818,6 +851,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Toucannon, gShinyOverworldPalette_Toucannon ) @@ -865,7 +899,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Yungoos, .frontPicSize = MON_COORDS_SIZE(64, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Yungoos, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Yungoos, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -882,6 +916,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Yungoos, gShinyOverworldPalette_Yungoos ) @@ -925,7 +960,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Gumshoos, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Gumshoos, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Gumshoos, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -942,6 +977,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gumshoos, gShinyOverworldPalette_Gumshoos ) @@ -984,7 +1020,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Gumshoos, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Gumshoos, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Gumshoos, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -1001,6 +1037,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gumshoos, gShinyOverworldPalette_Gumshoos ) @@ -1050,7 +1087,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Grubbin, .frontPicSize = MON_COORDS_SIZE(48, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Grubbin, + .frontAnimFrames = sAnims_Vikavolt, .frontAnimId = ANIM_H_SLIDE, .backPic = gMonBackPic_Grubbin, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -1067,6 +1104,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Grubbin, gShinyOverworldPalette_Grubbin ) @@ -1114,7 +1152,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Charjabug, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Charjabug, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_SHAKE_FLASH_YELLOW_SLOW, .backPic = gMonBackPic_Charjabug, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -1131,6 +1173,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Charjabug, gShinyOverworldPalette_Charjabug ) @@ -1192,6 +1235,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vikavolt, gShinyOverworldPalette_Vikavolt ) @@ -1233,7 +1277,15 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Vikavolt, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Vikavolt, + .frontAnimFrames = ANIM_FRAMES( + 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, 1), + ), .frontAnimId = ANIM_BOUNCE_ROTATE_TO_SIDES, .enemyMonElevation = 8, .backPic = gMonBackPic_Vikavolt, @@ -1251,6 +1303,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Vikavolt, gShinyOverworldPalette_Vikavolt ) @@ -1301,7 +1354,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Crabrawler, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Crabrawler, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Crabrawler, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -1318,6 +1371,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Crabrawler, gShinyOverworldPalette_Crabrawler ) @@ -1366,7 +1420,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Crabominable, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Crabominable, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHRINK_GROW_VIBRATE_FAST, .backPic = gMonBackPic_Crabominable, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1383,6 +1437,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Crabominable, gShinyOverworldPalette_Crabominable ) @@ -1430,7 +1485,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_OricorioBaile, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Oricorio, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_CONCAVE_ARC_SMALL, .backPic = gMonBackPic_OricorioBaile, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1447,6 +1502,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_OricorioBaile, gShinyOverworldPalette_OricorioBaile ) @@ -1495,7 +1551,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_OricorioPomPom, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Oricorio, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_OricorioPomPom, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1512,6 +1568,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_OricorioPomPom, gShinyOverworldPalette_OricorioPomPom ) @@ -1560,7 +1617,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_OricorioPau, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Oricorio, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_OricorioPau, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1577,6 +1634,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_OricorioPau, gShinyOverworldPalette_OricorioPau ) @@ -1625,7 +1683,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_OricorioSensu, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Oricorio, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_OricorioSensu, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1642,6 +1700,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_OricorioSensu, gShinyOverworldPalette_OricorioSensu ) @@ -1692,7 +1751,40 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Cutiefly, .frontPicSize = MON_COORDS_SIZE(33, 35), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Cutiefly, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 35), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 10, .backPic = gMonBackPic_Cutiefly, @@ -1710,6 +1802,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cutiefly, gShinyOverworldPalette_Cutiefly ) @@ -1772,6 +1865,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ribombee, gShinyOverworldPalette_Ribombee ) @@ -1832,6 +1926,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ribombee, gShinyOverworldPalette_Ribombee ) @@ -1894,6 +1989,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rockruff, gShinyOverworldPalette_Rockruff ) @@ -1955,6 +2051,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rockruff, gShinyOverworldPalette_Rockruff ) @@ -2002,7 +2099,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_LycanrocMidday, .frontPicSize = MON_COORDS_SIZE(57, 53), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_LycanrocMidday, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_LycanrocMidday, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2019,6 +2119,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_LycanrocMidday, gShinyOverworldPalette_LycanrocMidday ) @@ -2064,7 +2165,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_LycanrocMidnight, .frontPicSize = MON_COORDS_SIZE(56, 61), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_LycanrocMidnight, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SHRINK_GROW_VIBRATE_SLOW, .backPic = gMonBackPic_LycanrocMidnight, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2081,6 +2185,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_LycanrocMidnight, gShinyOverworldPalette_LycanrocMidnight ) @@ -2126,7 +2231,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_LycanrocDusk, .frontPicSize = MON_COORDS_SIZE(57, 58), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_LycanrocDusk, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_LycanrocDusk, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2143,6 +2251,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_LycanrocDusk, gShinyOverworldPalette_LycanrocDusk ) @@ -2190,7 +2299,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_WishiwashiSolo, .frontPicSize = MON_COORDS_SIZE(40, 24), .frontPicYOffset = 20, - .frontAnimFrames = sAnims_WishiwashiSolo, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SLIDE_WOBBLE_SMALL, .enemyMonElevation = 12, .backPic = gMonBackPic_WishiwashiSolo, @@ -2208,6 +2317,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_WishiwashiSolo, gShinyOverworldPalette_WishiwashiSolo ) @@ -2255,8 +2365,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_WishiwashiSchool, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_WishiwashiSchool, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, //Todo + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_WishiwashiSchool, .backPicSize = MON_COORDS_SIZE(64, 56), .backPicYOffset = 5, @@ -2314,7 +2424,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Mareanie, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Mareanie, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_GLOW_PURPLE, .backPic = gMonBackPic_Mareanie, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -2331,6 +2441,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mareanie, gShinyOverworldPalette_Mareanie ) @@ -2378,7 +2489,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Toxapex, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Toxapex, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHAKE_GLOW_PURPLE_SLOW, .backPic = gMonBackPic_Toxapex, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2395,6 +2506,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Toxapex, gShinyOverworldPalette_Toxapex ) @@ -2442,7 +2554,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Mudbray, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Mudbray, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Mudbray, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2459,6 +2571,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mudbray, gShinyOverworldPalette_Mudbray ) @@ -2506,7 +2619,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Mudsdale, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Mudsdale, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Mudsdale, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2523,6 +2636,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mudsdale, gShinyOverworldPalette_Mudsdale ) @@ -2570,7 +2684,14 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Dewpider, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Dewpider, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Dewpider, .backPicSize = MON_COORDS_SIZE(40, 48), @@ -2587,6 +2708,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dewpider, gShinyOverworldPalette_Dewpider ) @@ -2648,6 +2770,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Araquanid, gShinyOverworldPalette_Araquanid ) @@ -2707,6 +2830,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Araquanid, gShinyOverworldPalette_Araquanid ) @@ -2757,7 +2881,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Fomantis, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Fomantis, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE_SLOW, .backPic = gMonBackPic_Fomantis, .backPicSize = MON_COORDS_SIZE(40, 56), @@ -2774,6 +2898,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Fomantis, gShinyOverworldPalette_Fomantis ) @@ -2818,7 +2943,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Lurantis, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Lurantis, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Lurantis, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -2835,6 +2960,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lurantis, gShinyOverworldPalette_Lurantis ) @@ -2877,7 +3003,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Lurantis, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Lurantis, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Lurantis, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -2894,6 +3020,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lurantis, gShinyOverworldPalette_Lurantis ) @@ -2945,7 +3072,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Morelull, .frontPicSize = MON_COORDS_SIZE(24, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Morelull, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHAKE_FLASH_YELLOW, .backPic = gMonBackPic_Morelull, .backPicSize = MON_COORDS_SIZE(40, 48), @@ -2962,6 +3089,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Morelull, gShinyOverworldPalette_Morelull ) @@ -3010,7 +3138,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Shiinotic, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Shiinotic, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHAKE_GLOW_WHITE_SLOW, .backPic = gMonBackPic_Shiinotic, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3027,6 +3155,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Shiinotic, gShinyOverworldPalette_Shiinotic ) @@ -3074,7 +3203,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Salandit, .frontPicSize = MON_COORDS_SIZE(56, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Salandit, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_GLOW_RED, .backPic = gMonBackPic_Salandit, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -3091,6 +3224,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Salandit, gShinyOverworldPalette_Salandit ) @@ -3152,6 +3286,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Salazzle, gShinyOverworldPalette_Salazzle ) @@ -3211,6 +3346,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Salazzle, gShinyOverworldPalette_Salazzle ) @@ -3260,7 +3396,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Stufful, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Stufful, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Stufful, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -3277,6 +3417,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Stufful, gShinyOverworldPalette_Stufful ) @@ -3323,7 +3464,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Bewear, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Bewear, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 60), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_Bewear, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3340,6 +3485,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bewear, gShinyOverworldPalette_Bewear ) @@ -3387,7 +3533,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Bounsweet, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Bounsweet, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Bounsweet, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -3404,6 +3550,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bounsweet, gShinyOverworldPalette_Bounsweet ) @@ -3452,7 +3599,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Steenee, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Steenee, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Steenee, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -3469,6 +3616,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Steenee, gShinyOverworldPalette_Steenee ) @@ -3516,7 +3664,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Tsareena, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Tsareena, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Tsareena, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -3533,6 +3681,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tsareena, gShinyOverworldPalette_Tsareena ) @@ -3581,7 +3730,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Comfey, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Comfey, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 8, .backPic = gMonBackPic_Comfey, @@ -3599,6 +3748,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Comfey, gShinyOverworldPalette_Comfey ) @@ -3646,7 +3796,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Oranguru, .frontPicSize = MON_COORDS_SIZE(56, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Oranguru, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_SHRINK_GROW_SLOW, .backPic = gMonBackPic_Oranguru, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3663,6 +3816,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Oranguru, gShinyOverworldPalette_Oranguru ) @@ -3710,7 +3864,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Passimian, .frontPicSize = MON_COORDS_SIZE(57, 60), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Passimian, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_Passimian, .backPicSize = MON_COORDS_SIZE(51, 52), @@ -3727,6 +3884,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Passimian, gShinyOverworldPalette_Passimian ) @@ -3774,7 +3932,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Wimpod, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Wimpod, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SHAKE_H_SLIDE_FAST, .backPic = gMonBackPic_Wimpod, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3791,6 +3953,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Wimpod, gShinyOverworldPalette_Wimpod ) @@ -3837,7 +4000,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Golisopod, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Golisopod, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_SHRINK_GROW_VIBRATE_FAST, .backPic = gMonBackPic_Golisopod, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3854,6 +4021,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Golisopod, gShinyOverworldPalette_Golisopod ) @@ -3901,7 +4069,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Sandygast, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Sandygast, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .backPic = gMonBackPic_Sandygast, .backPicSize = MON_COORDS_SIZE(40, 48), @@ -3918,6 +4086,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sandygast, gShinyOverworldPalette_Sandygast ) @@ -3965,7 +4134,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Palossand, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Palossand, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Palossand, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3982,6 +4151,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Palossand, gShinyOverworldPalette_Palossand ) @@ -4028,7 +4198,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Pyukumuku, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Pyukumuku, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Pyukumuku, .backPicSize = MON_COORDS_SIZE(48, 32), @@ -4045,6 +4219,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pyukumuku, gShinyOverworldPalette_Pyukumuku ) @@ -4092,7 +4267,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_TypeNull, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_TypeNull, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_SHAKE, .backPic = gMonBackPic_TypeNull, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -4109,6 +4284,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TypeNull, gShinyOverworldPalette_TypeNull ) @@ -4154,7 +4330,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Silvally, \ .frontPicSize = MON_COORDS_SIZE(64, 64), \ .frontPicYOffset = 0, \ - .frontAnimFrames = sAnims_Silvally, \ + .frontAnimFrames = sAnims_SingleFramePlaceHolder, \ .frontAnimId = ANIM_V_SHAKE, \ .backPic = gMonBackPic_Silvally, \ .backPicSize = MON_COORDS_SIZE(56, 64), \ @@ -4171,11 +4347,12 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_Silvally, \ gShinyOverworldPalette_Silvally \ ) \ .isLegendary = TRUE, \ - .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ .levelUpLearnset = sSilvallyLevelUpLearnset, \ .teachableLearnset = sSilvallyTeachableLearnset, \ .formSpeciesIdTable = sSilvallyFormSpeciesIdTable, \ @@ -4245,7 +4422,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_MiniorMeteor, \ .frontPicSize = MON_COORDS_SIZE(48, 40), \ .frontPicYOffset = 14, \ - .frontAnimFrames = sAnims_MiniorMeteor, \ + .frontAnimFrames = sAnims_SingleFramePlaceHolder, \ .frontAnimId = ANIM_TUMBLING_FRONT_FLIP_TWICE, \ .enemyMonElevation = 17, \ .backPic = gMonBackPic_MiniorMeteor, \ @@ -4256,12 +4433,13 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .shinyPalette = gMonShinyPalette_MiniorMeteor, \ .iconSprite = gMonIcon_MiniorMeteor, \ .iconPalIndex = 0, \ - SHADOW(0, 14, SHADOW_SIZE_S) \ + SHADOW(0, 14, SHADOW_SIZE_S) \ OVERWORLD( \ sPicTable_MiniorMeteor, \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_MiniorMeteor, \ gShinyOverworldPalette_MiniorMeteor \ ) \ @@ -4282,7 +4460,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_MiniorCore, \ .frontPicSize = MON_COORDS_SIZE(48, 40), \ .frontPicYOffset = 16, \ - .frontAnimFrames = sAnims_MiniorMeteor, \ + .frontAnimFrames = sAnims_SingleFramePlaceHolder, \ .frontAnimId = ANIM_TUMBLING_FRONT_FLIP_TWICE, \ .enemyMonElevation = 17, \ .backPic = gMonBackPic_MiniorCore, \ @@ -4293,7 +4471,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .shinyPalette = gMonShinyPalette_MiniorCore, \ .iconSprite = gMonIcon_MiniorCore##Form, \ .iconPalIndex = iconPal, \ - SHADOW(-2, 12, SHADOW_SIZE_S) \ + SHADOW(-2, 12, SHADOW_SIZE_S) \ .formChangeTable = sMinior ##Form##FormChangeTable, \ MINIOR_MISC_INFO(color), \ } @@ -4352,7 +4530,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Komala, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Komala, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_DIP, .backPic = gMonBackPic_Komala, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -4369,6 +4547,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Komala, gShinyOverworldPalette_Komala ) @@ -4417,7 +4596,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Turtonator, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Turtonator, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 44), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_SHAKE_GLOW_RED, .backPic = gMonBackPic_Turtonator, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4434,6 +4617,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Turtonator, gShinyOverworldPalette_Turtonator ) @@ -4495,6 +4679,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Togedemaru, gShinyOverworldPalette_Togedemaru ) @@ -4555,6 +4740,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Togedemaru, gShinyOverworldPalette_Togedemaru ) @@ -4602,7 +4788,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_MimikyuDisguised, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_MimikyuDisguised, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_DEEP_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MimikyuDisguised, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -4619,6 +4805,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MimikyuDisguised, gShinyOverworldPalette_MimikyuDisguised ) @@ -4663,7 +4850,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_MimikyuBusted, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_MimikyuBusted, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_DEEP_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MimikyuBusted, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -4716,7 +4903,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_MimikyuDisguised, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_MimikyuDisguised, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_DEEP_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MimikyuDisguised, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -4733,6 +4920,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MimikyuDisguised, gShinyOverworldPalette_MimikyuDisguised ) @@ -4779,7 +4967,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_MimikyuBusted, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_MimikyuBusted, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_DEEP_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MimikyuBusted, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -4840,7 +5028,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Bruxish, .frontPicSize = MON_COORDS_SIZE(56, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Bruxish, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_RISING_WOBBLE, .backPic = gMonBackPic_Bruxish, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -4857,6 +5045,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bruxish, gShinyOverworldPalette_Bruxish ) @@ -4905,7 +5094,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Drampa, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Drampa, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 50), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .backPic = gMonBackPic_Drampa, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -4922,6 +5114,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Drampa, gShinyOverworldPalette_Drampa ) @@ -4970,7 +5163,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Dhelmise, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Dhelmise, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SWING_CONVEX, .enemyMonElevation = 2, .backPic = gMonBackPic_Dhelmise, @@ -4988,6 +5181,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dhelmise, gShinyOverworldPalette_Dhelmise ) @@ -5035,7 +5229,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_JangmoO, .frontPicSize = MON_COORDS_SIZE(36, 43), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Jangmo_O, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_JangmoO, .backPicSize = MON_COORDS_SIZE(42, 56), @@ -5052,6 +5249,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_JangmoO, gShinyOverworldPalette_JangmoO ) @@ -5099,7 +5297,10 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_HakamoO, .frontPicSize = MON_COORDS_SIZE(53, 61), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Hakamo_O, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 5), + ), .frontAnimId = ANIM_H_STRETCH, .backPic = gMonBackPic_HakamoO, .backPicSize = MON_COORDS_SIZE(49, 56), @@ -5116,6 +5317,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_HakamoO, gShinyOverworldPalette_HakamoO ) @@ -5176,6 +5378,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_KommoO, gShinyOverworldPalette_KommoO ) @@ -5218,7 +5421,13 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_KommoO, .frontPicSize = MON_COORDS_SIZE(63, 63), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Kommo_O, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_SHRINK_GROW_VIBRATE_FAST, .backPic = gMonBackPic_KommoO, .backPicSize = MON_COORDS_SIZE(60, 60), @@ -5235,6 +5444,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_KommoO, gShinyOverworldPalette_KommoO ) @@ -5284,7 +5494,15 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_TapuKoko, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_TapuKoko, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_TRIANGLE_DOWN_TWICE, .enemyMonElevation = 9, .backPic = gMonBackPic_TapuKoko, @@ -5302,6 +5520,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TapuKoko, gShinyOverworldPalette_TapuKoko ) @@ -5350,7 +5569,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_TapuLele, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_TapuLele, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SLIDE_WOBBLE_SMALL, .enemyMonElevation = 8, .backPic = gMonBackPic_TapuLele, @@ -5368,6 +5591,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TapuLele, gShinyOverworldPalette_TapuLele ) @@ -5416,7 +5640,13 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_TapuBulu, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_TapuBulu, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 40), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_V_SHAKE_TWICE, .enemyMonElevation = 5, .backPic = gMonBackPic_TapuBulu, @@ -5434,6 +5664,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TapuBulu, gShinyOverworldPalette_TapuBulu ) @@ -5482,7 +5713,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_TapuFini, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_TapuFini, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(1, 60), + ANIMCMD_FRAME(1, 60), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_SHAKE_GLOW_BLUE_SLOW, .frontAnimDelay = 5, .enemyMonElevation = 6, @@ -5501,6 +5736,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TapuFini, gShinyOverworldPalette_TapuFini ) @@ -5549,7 +5785,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Cosmog, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Cosmog, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_JUMPS_V_STRETCH, .enemyMonElevation = 7, .backPic = gMonBackPic_Cosmog, @@ -5567,6 +5803,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cosmog, gShinyOverworldPalette_Cosmog ) @@ -5617,7 +5854,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Cosmoem, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Cosmoem, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_RISING_WOBBLE, .enemyMonElevation = 3, .backPic = gMonBackPic_Cosmoem, @@ -5635,6 +5872,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cosmoem, gShinyOverworldPalette_Cosmoem ) @@ -5685,7 +5923,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Solgaleo, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Solgaleo, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Solgaleo, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5702,6 +5940,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Solgaleo, gShinyOverworldPalette_Solgaleo ) @@ -5749,7 +5988,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Lunala, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Lunala, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_CIRCULAR_VIBRATE, .enemyMonElevation = 6, .backPic = gMonBackPic_Lunala, @@ -5767,6 +6006,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lunala, gShinyOverworldPalette_Lunala ) @@ -5816,7 +6056,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Nihilego, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Nihilego, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_CIRCULAR_STRETCH_TWICE, .enemyMonElevation = 6, .backPic = gMonBackPic_Nihilego, @@ -5834,6 +6074,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Nihilego, gShinyOverworldPalette_Nihilego ) @@ -5883,7 +6124,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Buzzwole, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Buzzwole, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHRINK_GROW_VIBRATE_FAST, .backPic = gMonBackPic_Buzzwole, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -5900,6 +6141,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Buzzwole, gShinyOverworldPalette_Buzzwole ) @@ -5948,7 +6190,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Pheromosa, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Pheromosa, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHRINK_GROW, .backPic = gMonBackPic_Pheromosa, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5965,6 +6207,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pheromosa, gShinyOverworldPalette_Pheromosa ) @@ -6013,7 +6256,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Xurkitree, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Xurkitree, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHAKE_FLASH_YELLOW_FAST, .backPic = gMonBackPic_Xurkitree, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6030,6 +6273,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Xurkitree, gShinyOverworldPalette_Xurkitree ) @@ -6080,7 +6324,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Celesteela, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Celesteela, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_GROW_STUTTER_SLOW, .backPic = gMonBackPic_Celesteela, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6097,6 +6341,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Celesteela, gShinyOverworldPalette_Celesteela ) @@ -6145,7 +6390,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Kartana, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Kartana, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_VIBRATE, .enemyMonElevation = 3, .backPic = gMonBackPic_Kartana, @@ -6163,6 +6408,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kartana, gShinyOverworldPalette_Kartana ) @@ -6211,7 +6457,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Guzzlord, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Guzzlord, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHRINK_GROW_VIBRATE_FAST, .backPic = gMonBackPic_Guzzlord, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6228,6 +6474,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Guzzlord, gShinyOverworldPalette_Guzzlord ) @@ -6278,7 +6525,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Necrozma, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Necrozma, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_GROW_VIBRATE, .enemyMonElevation = 6, .backPic = gMonBackPic_Necrozma, @@ -6296,6 +6543,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Necrozma, gShinyOverworldPalette_Necrozma ) @@ -6346,7 +6594,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_NecrozmaDuskMane, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Necrozma, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_NecrozmaDuskMane, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6363,6 +6611,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_NecrozmaDuskMane, gShinyOverworldPalette_NecrozmaDuskMane ) @@ -6414,7 +6663,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_NecrozmaDawnWings, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Necrozma, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 6, .backPic = gMonBackPic_NecrozmaDawnWings, @@ -6432,6 +6681,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_NecrozmaDawnWings, gShinyOverworldPalette_NecrozmaDawnWings ) @@ -6486,7 +6736,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_NecrozmaUltra, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Necrozma, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_NecrozmaUltra, @@ -6499,6 +6749,17 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconPalIndex = 2, SHADOW(-1, 16, SHADOW_SIZE_L) FOOTPRINT(Necrozma) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_NecrozmaUltra, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_NecrozmaUltra, + gShinyOverworldPalette_NecrozmaUltra + ) + #endif //OW_BATTLE_ONLY_FORMS .isLegendary = TRUE, .isUltraBurst = TRUE, .cannotBeTraded = TRUE, @@ -6550,7 +6811,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Magearna, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Magearna, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Magearna, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6567,6 +6828,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Magearna, gShinyOverworldPalette_Magearna ) @@ -6614,7 +6876,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_MagearnaOriginal, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Magearna, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_MagearnaOriginal, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6631,6 +6893,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MagearnaOriginal, gShinyOverworldPalette_MagearnaOriginal ) @@ -6683,7 +6946,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Marshadow, .frontPicSize = MON_COORDS_SIZE(32, 56), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Marshadow, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 54), + ANIMCMD_FRAME(0, 10), + ), .frontAnimId = ANIM_V_SHAKE, .backPic = gMonBackPic_Marshadow, .backPicSize = MON_COORDS_SIZE(40, 56), @@ -6700,6 +6967,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Marshadow, gShinyOverworldPalette_Marshadow ) @@ -6748,7 +7016,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Poipole, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Poipole, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHAKE_GLOW_PURPLE_SLOW, .enemyMonElevation = 9, .backPic = gMonBackPic_Poipole, @@ -6766,6 +7034,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Poipole, gShinyOverworldPalette_Poipole ) @@ -6812,7 +7081,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Naganadel, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Naganadel, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_TRIANGLE_DOWN_TWICE, .enemyMonElevation = 7, .backPic = gMonBackPic_Naganadel, @@ -6830,6 +7099,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Naganadel, gShinyOverworldPalette_Naganadel ) @@ -6878,7 +7148,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Stakataka, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Stakataka, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Stakataka, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -6895,6 +7165,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Stakataka, gShinyOverworldPalette_Stakataka ) @@ -6943,7 +7214,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Blacephalon, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Blacephalon, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_SHAKE_GLOW_RED, .backPic = gMonBackPic_Blacephalon, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -6960,6 +7231,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Blacephalon, gShinyOverworldPalette_Blacephalon ) @@ -7007,7 +7279,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Zeraora, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Zeraora, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_STRETCH, .backPic = gMonBackPic_Zeraora, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -7024,6 +7296,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zeraora, gShinyOverworldPalette_Zeraora ) @@ -7072,7 +7345,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Meltan, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Meltan, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_GROW_STUTTER_SLOW, .backPic = gMonBackPic_Meltan, .backPicSize = MON_COORDS_SIZE(40, 40), @@ -7089,6 +7362,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Meltan, gShinyOverworldPalette_Meltan ) @@ -7135,7 +7409,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_Melmetal, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Melmetal, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Melmetal, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -7152,6 +7426,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Melmetal, gShinyOverworldPalette_Melmetal ) @@ -7202,7 +7477,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .frontPic = gMonFrontPic_MelmetalGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_MelmetalGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MelmetalGmax, .backPicSize = MON_COORDS_SIZE(64, 64), diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index d372fb3b3c..ee3a17dfe9 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -41,7 +41,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Grookey, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Grookey, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Grookey, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -58,6 +58,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Grookey, gShinyOverworldPalette_Grookey ) @@ -103,7 +104,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Thwackey, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Thwackey, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Thwackey, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -120,6 +121,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Thwackey, gShinyOverworldPalette_Thwackey ) @@ -164,7 +166,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Rillaboom, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Rillaboom, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Rillaboom, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -181,6 +183,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rillaboom, gShinyOverworldPalette_Rillaboom ) @@ -227,7 +230,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_RillaboomGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_RillaboomGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_RillaboomGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -286,7 +289,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Scorbunny, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Scorbunny, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Scorbunny, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -303,6 +306,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Scorbunny, gShinyOverworldPalette_Scorbunny ) @@ -348,7 +352,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Raboot, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Raboot, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Raboot, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -365,6 +369,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Raboot, gShinyOverworldPalette_Raboot ) @@ -410,7 +415,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Cinderace, .frontPicSize = MON_COORDS_SIZE(40, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Cinderace, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Cinderace, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -427,6 +432,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cinderace, gShinyOverworldPalette_Cinderace ) @@ -474,7 +480,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_CinderaceGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_CinderaceGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CinderaceGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -534,7 +540,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Sobble, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Sobble, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Sobble, .backPicSize = MON_COORDS_SIZE(40, 56), @@ -551,6 +557,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sobble, gShinyOverworldPalette_Sobble ) @@ -596,7 +603,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Drizzile, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Drizzile, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Drizzile, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -613,6 +620,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Drizzile, gShinyOverworldPalette_Drizzile ) @@ -658,7 +666,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Inteleon, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Inteleon, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Inteleon, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -675,6 +683,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Inteleon, gShinyOverworldPalette_Inteleon ) @@ -722,7 +731,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_InteleonGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_InteleonGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_InteleonGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -781,7 +790,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Skwovet, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Skwovet, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Skwovet, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -798,6 +807,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Skwovet, gShinyOverworldPalette_Skwovet ) @@ -845,7 +855,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Greedent, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Greedent, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Greedent, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -862,6 +872,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Greedent, gShinyOverworldPalette_Greedent ) @@ -908,7 +919,15 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Rookidee, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Rookidee, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Rookidee, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -925,6 +944,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rookidee, gShinyOverworldPalette_Rookidee ) @@ -971,7 +991,15 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Corvisquire, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Corvisquire, + .frontAnimFrames = ANIM_FRAMES( + 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, 1), + ), .frontAnimId = ANIM_CIRCLE_INTO_BG, .enemyMonElevation = 10, .backPic = gMonBackPic_Corvisquire, @@ -989,6 +1017,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Corvisquire, gShinyOverworldPalette_Corvisquire ) @@ -1034,7 +1063,11 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Corviknight, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Corviknight, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Corviknight, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1051,6 +1084,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Corviknight, gShinyOverworldPalette_Corviknight ) @@ -1098,7 +1132,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_CorviknightGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_CorviknightGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CorviknightGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1156,7 +1190,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Blipbug, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Blipbug, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Blipbug, .backPicSize = MON_COORDS_SIZE(40, 56), @@ -1173,6 +1207,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Blipbug, gShinyOverworldPalette_Blipbug ) @@ -1221,7 +1256,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Dottler, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Dottler, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Dottler, .backPicSize = MON_COORDS_SIZE(56, 32), @@ -1238,6 +1273,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dottler, gShinyOverworldPalette_Dottler ) @@ -1284,7 +1320,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Orbeetle, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Orbeetle, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_Orbeetle, @@ -1302,6 +1338,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Orbeetle, gShinyOverworldPalette_Orbeetle ) @@ -1350,7 +1387,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_OrbeetleGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_OrbeetleGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_OrbeetleGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1409,7 +1446,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Nickit, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Nickit, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Nickit, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -1426,6 +1463,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Nickit, gShinyOverworldPalette_Nickit ) @@ -1472,7 +1510,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Thievul, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Thievul, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Thievul, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -1489,6 +1527,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Thievul, gShinyOverworldPalette_Thievul ) @@ -1535,7 +1574,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Gossifleur, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Gossifleur, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Gossifleur, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -1552,6 +1591,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Gossifleur, gShinyOverworldPalette_Gossifleur ) @@ -1598,7 +1638,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Eldegoss, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Eldegoss, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Eldegoss, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -1615,6 +1655,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Eldegoss, gShinyOverworldPalette_Eldegoss ) @@ -1661,7 +1702,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Wooloo, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Wooloo, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Wooloo, .backPicSize = MON_COORDS_SIZE(56, 32), @@ -1678,6 +1719,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Wooloo, gShinyOverworldPalette_Wooloo ) @@ -1724,7 +1766,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Dubwool, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Dubwool, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Dubwool, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -1741,6 +1783,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dubwool, gShinyOverworldPalette_Dubwool ) @@ -1786,7 +1829,11 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Chewtle, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Chewtle, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 1), + ), //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Chewtle, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -1803,6 +1850,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Chewtle, gShinyOverworldPalette_Chewtle ) @@ -1848,7 +1896,11 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Drednaw, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Drednaw, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_GROW_VIBRATE, .backPic = gMonBackPic_Drednaw, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -1865,6 +1917,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Drednaw, gShinyOverworldPalette_Drednaw ) @@ -1912,7 +1965,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_DrednawGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_DrednawGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DrednawGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1971,7 +2024,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Yamper, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Yamper, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Yamper, .backPicSize = MON_COORDS_SIZE(48, 48), @@ -1988,6 +2041,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Yamper, gShinyOverworldPalette_Yamper ) @@ -2034,7 +2088,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Boltund, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Boltund, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Boltund, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2051,6 +2105,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Boltund, gShinyOverworldPalette_Boltund ) @@ -2097,7 +2152,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Rolycoly, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Rolycoly, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, .frontAnimId = ANIM_H_SLIDE_SLOW, .backPic = gMonBackPic_Rolycoly, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -2114,6 +2169,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Rolycoly, gShinyOverworldPalette_Rolycoly ) @@ -2159,7 +2215,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Carkol, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Carkol, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Carkol, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -2176,6 +2232,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Carkol, gShinyOverworldPalette_Carkol ) @@ -2221,7 +2278,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Coalossal, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Coalossal, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, .frontAnimId = ANIM_GLOW_RED, .backPic = gMonBackPic_Coalossal, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -2238,6 +2295,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Coalossal, gShinyOverworldPalette_Coalossal ) @@ -2285,7 +2343,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_CoalossalGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_CoalossalGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CoalossalGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2344,7 +2402,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Applin, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Applin, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Applin, .backPicSize = MON_COORDS_SIZE(40, 48), @@ -2361,6 +2419,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Applin, gShinyOverworldPalette_Applin ) @@ -2409,7 +2468,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Flapple, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Flapple, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 9, .backPic = gMonBackPic_Flapple, @@ -2427,6 +2486,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Flapple, gShinyOverworldPalette_Flapple ) @@ -2474,7 +2534,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_FlappleGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_FlappleGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_FlappleGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2530,7 +2590,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Appletun, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Appletun, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Appletun, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -2547,6 +2607,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Appletun, gShinyOverworldPalette_Appletun ) @@ -2594,7 +2655,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_AppletunGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_AppletunGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_AppletunGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2651,7 +2712,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Dipplin, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Dipplin, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Dipplin, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2668,6 +2729,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dipplin, gShinyOverworldPalette_Dipplin ) @@ -2713,7 +2775,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Hydrapple, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Hydrapple, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Hydrapple, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2730,6 +2792,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hydrapple, gShinyOverworldPalette_Hydrapple ) @@ -2776,7 +2839,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Silicobra, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Silicobra, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Silicobra, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -2793,6 +2856,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Silicobra, gShinyOverworldPalette_Silicobra ) @@ -2839,7 +2903,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Sandaconda, .frontPicSize = MON_COORDS_SIZE(64, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Sandaconda, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Sandaconda, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -2856,6 +2920,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sandaconda, gShinyOverworldPalette_Sandaconda ) @@ -2903,7 +2968,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_SandacondaGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_SandacondaGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SandacondaGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2961,7 +3026,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Cramorant, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Cramorant, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Cramorant, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -2978,6 +3043,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cramorant, gShinyOverworldPalette_Cramorant ) @@ -3025,7 +3091,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_CramorantGulping, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Cramorant, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CramorantGulping, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3081,7 +3147,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_CramorantGorging, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Cramorant, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CramorantGorging, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3139,7 +3205,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Arrokuda, .frontPicSize = MON_COORDS_SIZE(56, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Arrokuda, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Arrokuda, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -3156,6 +3222,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Arrokuda, gShinyOverworldPalette_Arrokuda ) @@ -3202,7 +3269,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Barraskewda, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Barraskewda, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Barraskewda, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -3219,6 +3286,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Barraskewda, gShinyOverworldPalette_Barraskewda ) @@ -3265,7 +3333,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Toxel, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Toxel, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Toxel, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -3282,6 +3350,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Toxel, gShinyOverworldPalette_Toxel ) @@ -3329,7 +3398,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_ToxtricityAmped, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Toxtricity, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ToxtricityAmped, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -3346,6 +3415,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ToxtricityAmped, gShinyOverworldPalette_ToxtricityAmped ) @@ -3389,7 +3459,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_ToxtricityGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_ToxtricityGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ToxtricityGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3445,7 +3515,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_ToxtricityLowKey, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Toxtricity, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ToxtricityLowKey, .backPicSize = MON_COORDS_SIZE(48, 64), @@ -3462,6 +3532,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ToxtricityLowKey, gShinyOverworldPalette_ToxtricityLowKey ) @@ -3505,7 +3576,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_ToxtricityGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_ToxtricityGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ToxtricityGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3563,7 +3634,11 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Sizzlipede, .frontPicSize = MON_COORDS_SIZE(48, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Sizzlipede, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 1), + ), .frontAnimId = ANIM_H_VIBRATE, .backPic = gMonBackPic_Sizzlipede, .backPicSize = MON_COORDS_SIZE(40, 32), @@ -3580,6 +3655,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sizzlipede, gShinyOverworldPalette_Sizzlipede ) @@ -3626,7 +3702,11 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Centiskorch, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Centiskorch, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 1), + ), //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Centiskorch, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -3643,6 +3723,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Centiskorch, gShinyOverworldPalette_Centiskorch ) @@ -3690,7 +3771,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_CentiskorchGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_CentiskorchGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CentiskorchGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3749,7 +3830,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Clobbopus, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Clobbopus, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Clobbopus, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -3766,6 +3847,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Clobbopus, gShinyOverworldPalette_Clobbopus ) @@ -3811,7 +3893,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Grapploct, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Grapploct, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Grapploct, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -3828,6 +3910,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Grapploct, gShinyOverworldPalette_Grapploct ) @@ -3873,7 +3956,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Sinistea, .frontPicSize = MON_COORDS_SIZE(40, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Sinistea, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 9, .backPic = gMonBackPic_Sinistea, @@ -3891,6 +3974,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sinistea, gShinyOverworldPalette_Sinistea ) @@ -3937,7 +4021,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Sinistea, .frontPicSize = MON_COORDS_SIZE(40, 32), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Sinistea, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 10, .backPic = gMonBackPic_Sinistea, @@ -3955,6 +4039,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sinistea, gShinyOverworldPalette_Sinistea ) @@ -4000,7 +4085,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Polteageist, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Polteageist, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 12, .backPic = gMonBackPic_Polteageist, @@ -4018,6 +4103,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Polteageist, gShinyOverworldPalette_Polteageist ) @@ -4063,7 +4149,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Polteageist, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Polteageist, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 11, .backPic = gMonBackPic_Polteageist, @@ -4081,6 +4167,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Polteageist, gShinyOverworldPalette_Polteageist ) @@ -4128,7 +4215,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Hatenna, .frontPicSize = MON_COORDS_SIZE(48, 48), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Hatenna, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Hatenna, .backPicSize = MON_COORDS_SIZE(40, 40), @@ -4145,6 +4232,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hatenna, gShinyOverworldPalette_Hatenna ) @@ -4190,7 +4278,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Hattrem, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Hattrem, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Hattrem, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -4207,6 +4295,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hattrem, gShinyOverworldPalette_Hattrem ) @@ -4251,7 +4340,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Hatterene, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Hatterene, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Hatterene, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -4268,6 +4357,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Hatterene, gShinyOverworldPalette_Hatterene ) @@ -4315,7 +4405,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_HattereneGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_HattereneGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_HattereneGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4374,7 +4464,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Impidimp, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Impidimp, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Impidimp, .backPicSize = MON_COORDS_SIZE(48, 40), @@ -4391,6 +4481,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Impidimp, gShinyOverworldPalette_Impidimp ) @@ -4436,7 +4527,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Morgrem, .frontPicSize = MON_COORDS_SIZE(48, 56), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Morgrem, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Morgrem, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -4453,6 +4544,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Morgrem, gShinyOverworldPalette_Morgrem ) @@ -4498,7 +4590,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Grimmsnarl, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Grimmsnarl, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Grimmsnarl, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -4515,6 +4607,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Grimmsnarl, gShinyOverworldPalette_Grimmsnarl ) @@ -4562,7 +4655,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_GrimmsnarlGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_GrimmsnarlGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GrimmsnarlGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4620,7 +4713,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Milcery, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Milcery, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 10, .backPic = gMonBackPic_Milcery, @@ -4638,6 +4731,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Milcery, gShinyOverworldPalette_Milcery ) @@ -4691,7 +4785,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Alcremie ##sweet, \ .frontPicSize = MON_COORDS_SIZE(40, 56), \ .frontPicYOffset = 7, \ - .frontAnimFrames = sAnims_Alcremie, \ + .frontAnimFrames = sAnims_SingleFramePlaceHolder, \ /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ \ .backPic = gMonBackPic_Alcremie ##sweet, \ .backPicSize = MON_COORDS_SIZE(48, 56), \ @@ -4701,13 +4795,14 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .shinyPalette = gMonShinyPalette_Alcremie ##sweet, \ .iconSprite = gMonIcon_AlcremieStrawberryVanillaCream, /*AlcremieStrawberry##cream##*/ \ .iconPalIndex = 1, \ - SHADOW(0, 5, SHADOW_SIZE_S) \ + SHADOW(0, 5, SHADOW_SIZE_S) \ FOOTPRINT(Alcremie) \ OVERWORLD( \ sPicTable_AlcremieStrawberry, /*Alcremie ##sweet*/ \ SIZE_32x32, \ SHADOW_SIZE_M, \ TRACKS_FOOT, \ + sAnimTable_Following, \ gOverworldPalette_AlcremieStrawberryVanillaCream, /*Alcremie ##sweet##cream*/ \ gShinyOverworldPalette_AlcremieStrawberryVanillaCream /*Alcremie ##sweet##cream*/ \ ) \ @@ -4802,7 +4897,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_AlcremieGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_AlcremieGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_AlcremieGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4860,7 +4955,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Falinks, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Falinks, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Falinks, .backPicSize = MON_COORDS_SIZE(64, 40), @@ -4877,6 +4972,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Falinks, gShinyOverworldPalette_Falinks ) @@ -4922,7 +5018,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Pincurchin, .frontPicSize = MON_COORDS_SIZE(40, 40), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Pincurchin, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Pincurchin, .backPicSize = MON_COORDS_SIZE(56, 40), @@ -4939,6 +5035,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pincurchin, gShinyOverworldPalette_Pincurchin ) @@ -4987,7 +5084,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Snom, .frontPicSize = MON_COORDS_SIZE(40, 32), .frontPicYOffset = 20, - .frontAnimFrames = sAnims_Snom, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Snom, .backPicSize = MON_COORDS_SIZE(48, 32), @@ -5004,6 +5101,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Snom, gShinyOverworldPalette_Snom ) @@ -5050,7 +5148,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Frosmoth, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Frosmoth, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 7, .backPic = gMonBackPic_Frosmoth, @@ -5068,6 +5166,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Frosmoth, gShinyOverworldPalette_Frosmoth ) @@ -5114,7 +5213,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Stonjourner, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Stonjourner, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Stonjourner, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -5131,6 +5230,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Stonjourner, gShinyOverworldPalette_Stonjourner ) @@ -5178,7 +5278,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_EiscueIce, .frontPicSize = MON_COORDS_SIZE(40, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Eiscue, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_EiscueIce, .backPicSize = MON_COORDS_SIZE(48, 64), @@ -5195,6 +5295,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_EiscueIce, gShinyOverworldPalette_EiscueIce ) @@ -5242,7 +5343,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_EiscueNoice, .frontPicSize = MON_COORDS_SIZE(40, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Eiscue, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_EiscueNoice, .backPicSize = MON_COORDS_SIZE(40, 64), @@ -5300,7 +5401,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_IndeedeeM, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Indeedee, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_IndeedeeM, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -5317,6 +5418,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IndeedeeM, gShinyOverworldPalette_IndeedeeM ) @@ -5362,7 +5464,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_IndeedeeF, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Indeedee, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_IndeedeeF, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -5379,6 +5481,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IndeedeeF, gShinyOverworldPalette_IndeedeeF ) @@ -5427,7 +5530,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_MorpekoFullBelly, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Morpeko, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MorpekoFullBelly, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -5444,6 +5547,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MorpekoFullBelly, gShinyOverworldPalette_MorpekoFullBelly ) @@ -5491,7 +5595,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_MorpekoHangry, .frontPicSize = MON_COORDS_SIZE(32, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Morpeko, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_MorpekoHangry, .backPicSize = MON_COORDS_SIZE(48, 56), @@ -5550,7 +5654,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Cufant, .frontPicSize = MON_COORDS_SIZE(56, 48), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Cufant, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Cufant, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -5567,6 +5671,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cufant, gShinyOverworldPalette_Cufant ) @@ -5613,7 +5718,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Copperajah, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Copperajah, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Copperajah, .backPicSize = MON_COORDS_SIZE(64, 32), @@ -5630,6 +5735,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Copperajah, gShinyOverworldPalette_Copperajah ) @@ -5678,7 +5784,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_CopperajahGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_CopperajahGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CopperajahGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5737,7 +5843,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Dracozolt, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Dracozolt, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Dracozolt, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -5754,6 +5860,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dracozolt, gShinyOverworldPalette_Dracozolt ) @@ -5799,7 +5906,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Arctozolt, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Arctozolt, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Arctozolt, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -5816,6 +5923,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Arctozolt, gShinyOverworldPalette_Arctozolt ) @@ -5862,7 +5970,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Dracovish, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Dracovish, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Dracovish, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5879,6 +5987,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dracovish, gShinyOverworldPalette_Dracovish ) @@ -5925,7 +6034,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Arctovish, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Arctovish, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Arctovish, .backPicSize = MON_COORDS_SIZE(64, 48), @@ -5942,6 +6051,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Arctovish, gShinyOverworldPalette_Arctovish ) @@ -5987,7 +6097,11 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Duraludon, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Duraludon, + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 60), + ANIMCMD_FRAME(0, 2), + ), .frontAnimId = ANIM_SHAKE_FLASH_YELLOW_FAST, .backPic = gMonBackPic_Duraludon, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6004,6 +6118,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Duraludon, gShinyOverworldPalette_Duraludon ) @@ -6053,7 +6168,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_DuraludonGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_DuraludonGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_DuraludonGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6112,7 +6227,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Archaludon, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Archaludon, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Archaludon, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6129,6 +6244,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Archaludon, gShinyOverworldPalette_Archaludon ) @@ -6176,7 +6292,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Dreepy, .frontPicSize = MON_COORDS_SIZE(48, 40), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Dreepy, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_Dreepy, @@ -6194,6 +6310,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dreepy, gShinyOverworldPalette_Dreepy ) @@ -6239,7 +6356,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Drakloak, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Drakloak, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_Drakloak, @@ -6257,6 +6374,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Drakloak, gShinyOverworldPalette_Drakloak ) @@ -6302,7 +6420,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Dragapult, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Dragapult, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 3, .backPic = gMonBackPic_Dragapult, @@ -6320,6 +6438,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dragapult, gShinyOverworldPalette_Dragapult ) @@ -6365,7 +6484,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_ZacianHero, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Zacian, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ZacianHero, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6382,6 +6501,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ZacianHero, gShinyOverworldPalette_ZacianHero ) @@ -6431,7 +6551,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_ZacianCrowned, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Zacian, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ZacianCrowned, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6448,6 +6568,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ZacianCrowned, gShinyOverworldPalette_ZacianCrowned ) @@ -6499,7 +6620,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_ZamazentaHero, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Zamazenta, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ZamazentaHero, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6516,6 +6637,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ZamazentaHero, gShinyOverworldPalette_ZamazentaHero ) @@ -6565,7 +6687,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_ZamazentaCrowned, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Zamazenta, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ZamazentaCrowned, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6582,6 +6704,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ZamazentaCrowned, gShinyOverworldPalette_ZamazentaCrowned ) @@ -6633,7 +6756,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Eternatus, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Eternatus, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 4, .backPic = gMonBackPic_Eternatus, @@ -6651,6 +6774,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Eternatus, gShinyOverworldPalette_Eternatus ) @@ -6699,7 +6823,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_EternatusEternamax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Eternatus, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 13, .backPic = gMonBackPic_EternatusEternamax, @@ -6758,7 +6882,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Kubfu, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Kubfu, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Kubfu, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -6775,6 +6899,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Kubfu, gShinyOverworldPalette_Kubfu ) @@ -6825,7 +6950,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_UrshifuSingleStrike, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Urshifu, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_UrshifuSingleStrike, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6842,6 +6967,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Urshifu, gShinyOverworldPalette_Urshifu ) @@ -6891,7 +7017,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_UrshifuSingleStrikeGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_UrshifuSingleStrikeGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_UrshifuSingleStrikeGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6949,7 +7075,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_UrshifuRapidStrike, .frontPicSize = MON_COORDS_SIZE(56, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Urshifu, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_UrshifuRapidStrike, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -6966,6 +7092,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Urshifu, gShinyOverworldPalette_Urshifu ) @@ -7015,7 +7142,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_UrshifuRapidStrikeGmax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_UrshifuRapidStrikeGmax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_UrshifuRapidStrikeGmax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7076,7 +7203,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Zarude, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Zarude, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Zarude, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -7093,6 +7220,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Zarude, gShinyOverworldPalette_Zarude ) @@ -7140,7 +7268,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_ZarudeDada, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Zarude, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ZarudeDada, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -7199,7 +7327,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Regieleki, .frontPicSize = MON_COORDS_SIZE(64, 56), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Regieleki, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_Regieleki, @@ -7217,6 +7345,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Regieleki, gShinyOverworldPalette_Regieleki ) @@ -7265,7 +7394,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Regidrago, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Regidrago, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_Regidrago, @@ -7283,6 +7412,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Regidrago, gShinyOverworldPalette_Regidrago ) @@ -7330,7 +7460,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Glastrier, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Glastrier, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Glastrier, .backPicSize = MON_COORDS_SIZE(56, 64), @@ -7347,6 +7477,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Glastrier, gShinyOverworldPalette_Glastrier ) @@ -7395,7 +7526,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Spectrier, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Spectrier, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Spectrier, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -7412,6 +7543,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Spectrier, gShinyOverworldPalette_Spectrier ) @@ -7460,7 +7592,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_Calyrex, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Calyrex, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Calyrex, .backPicSize = MON_COORDS_SIZE(56, 48), @@ -7477,6 +7609,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Calyrex, gShinyOverworldPalette_Calyrex ) @@ -7526,7 +7659,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_CalyrexIce, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Calyrex, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CalyrexIce, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7543,6 +7676,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_CalyrexIce, gShinyOverworldPalette_CalyrexIce ) @@ -7592,7 +7726,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_CalyrexShadow, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Calyrex, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_CalyrexShadow, .backPicSize = MON_COORDS_SIZE(64, 56), @@ -7609,6 +7743,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_CalyrexShadow, gShinyOverworldPalette_CalyrexShadow ) @@ -7661,7 +7796,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_EnamorusIncarnate, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_EnamorusIncarnate, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 7, .backPic = gMonBackPic_EnamorusIncarnate, @@ -7679,6 +7814,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_EnamorusIncarnate, gShinyOverworldPalette_EnamorusIncarnate ) @@ -7727,7 +7863,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .frontPic = gMonFrontPic_EnamorusTherian, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_EnamorusTherian, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_EnamorusTherian, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7744,6 +7880,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_EnamorusTherian, gShinyOverworldPalette_EnamorusTherian ) diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index d0fa8ab74d..f4f76eec33 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -41,7 +41,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Sprigatito, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Sprigatito, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Sprigatito, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -58,6 +58,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Sprigatito, gShinyOverworldPalette_Sprigatito ) @@ -104,7 +105,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Floragato, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Floragato, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Floragato, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -121,6 +122,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Floragato, gShinyOverworldPalette_Floragato ) @@ -166,7 +168,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Meowscarada, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Meowscarada, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Meowscarada, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -183,6 +185,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Meowscarada, gShinyOverworldPalette_Meowscarada ) @@ -229,7 +232,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Fuecoco, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Fuecoco, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Fuecoco, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -246,6 +249,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Fuecoco, gShinyOverworldPalette_Fuecoco ) @@ -292,7 +296,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Crocalor, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Crocalor, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Crocalor, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -309,6 +313,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Crocalor, gShinyOverworldPalette_Crocalor ) @@ -354,7 +359,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Skeledirge, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Skeledirge, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Skeledirge, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -371,6 +376,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Skeledirge, gShinyOverworldPalette_Skeledirge ) @@ -417,7 +423,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Quaxly, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Quaxly, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Quaxly, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -434,6 +440,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Quaxly, gShinyOverworldPalette_Quaxly ) @@ -480,7 +487,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Quaxwell, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Quaxwell, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Quaxwell, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -497,6 +504,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Quaxwell, gShinyOverworldPalette_Quaxwell ) @@ -542,7 +550,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Quaquaval, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Quaquaval, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Quaquaval, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -559,6 +567,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Quaquaval, gShinyOverworldPalette_Quaquaval ) @@ -605,7 +614,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Lechonk, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Lechonk, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Lechonk, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -622,6 +631,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lechonk, gShinyOverworldPalette_Lechonk ) @@ -668,7 +678,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_OinkologneM, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Oinkologne, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_OinkologneM, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -685,6 +695,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_OinkologneM, gShinyOverworldPalette_OinkologneM ) @@ -730,7 +741,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_OinkologneF, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Oinkologne, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_OinkologneF, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -747,6 +758,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_OinkologneF, gShinyOverworldPalette_OinkologneF ) @@ -794,7 +806,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Tarountula, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Tarountula, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Tarountula, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -811,6 +823,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Tarountula, gShinyOverworldPalette_Tarountula ) @@ -857,7 +870,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Spidops, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Spidops, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Spidops, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -874,6 +887,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Spidops, gShinyOverworldPalette_Spidops ) @@ -920,7 +934,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Nymble, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Nymble, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Nymble, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -937,6 +951,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Nymble, gShinyOverworldPalette_Nymble ) @@ -983,7 +998,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Lokix, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Lokix, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Lokix, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1000,6 +1015,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Lokix, gShinyOverworldPalette_Lokix ) @@ -1046,7 +1062,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Pawmi, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Pawmi, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Pawmi, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1063,6 +1079,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pawmi, gShinyOverworldPalette_Pawmi ) @@ -1109,7 +1126,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Pawmo, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Pawmo, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Pawmo, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1126,6 +1143,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pawmo, gShinyOverworldPalette_Pawmo ) @@ -1171,7 +1189,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Pawmot, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Pawmot, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Pawmot, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1188,6 +1206,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pawmot, gShinyOverworldPalette_Pawmot ) @@ -1234,7 +1253,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Tandemaus, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Tandemaus, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Tandemaus, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1251,6 +1270,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Tandemaus, gShinyOverworldPalette_Tandemaus ) @@ -1298,7 +1318,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_MausholdThree, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Maushold, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_MausholdThree, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1315,6 +1335,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MausholdThree, gShinyOverworldPalette_MausholdThree ) @@ -1359,7 +1380,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_MausholdFour, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 15, - .frontAnimFrames = sAnims_Maushold, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_MausholdFour, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1376,6 +1397,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_MausholdFour, gShinyOverworldPalette_MausholdFour ) @@ -1423,7 +1445,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Fidough, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Fidough, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Fidough, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1440,6 +1462,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Fidough, gShinyOverworldPalette_Fidough ) @@ -1486,7 +1509,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Dachsbun, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Dachsbun, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Dachsbun, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1503,6 +1526,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dachsbun, gShinyOverworldPalette_Dachsbun ) @@ -1549,7 +1573,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Smoliv, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Smoliv, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Smoliv, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1566,6 +1590,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Smoliv, gShinyOverworldPalette_Smoliv ) @@ -1612,7 +1637,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Dolliv, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Dolliv, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Dolliv, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1629,6 +1654,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Dolliv, gShinyOverworldPalette_Dolliv ) @@ -1674,7 +1700,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Arboliva, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Arboliva, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Arboliva, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1691,6 +1717,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Arboliva, gShinyOverworldPalette_Arboliva ) @@ -1737,7 +1764,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Squawkabilly, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Squawkabilly, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_Squawkabilly, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1754,6 +1781,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_SquawkabillyGreen, gShinyOverworldPalette_SquawkabillyGreen ) @@ -1800,7 +1828,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Squawkabilly, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Squawkabilly, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_Squawkabilly, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1817,6 +1845,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_SquawkabillyBlue, gShinyOverworldPalette_SquawkabillyBlue ) @@ -1863,7 +1892,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Squawkabilly, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Squawkabilly, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_Squawkabilly, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1880,6 +1909,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_SquawkabillyYellow, gShinyOverworldPalette_SquawkabillyYellow ) @@ -1926,7 +1956,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Squawkabilly, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Squawkabilly, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_Squawkabilly, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -1943,6 +1973,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_SquawkabillyWhite, gShinyOverworldPalette_SquawkabillyWhite ) @@ -1991,7 +2022,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Nacli, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Nacli, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Nacli, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2008,6 +2039,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Nacli, gShinyOverworldPalette_Nacli ) @@ -2054,7 +2086,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Naclstack, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Naclstack, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Naclstack, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2071,6 +2103,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Naclstack, gShinyOverworldPalette_Naclstack ) @@ -2116,7 +2149,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Garganacl, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Garganacl, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Garganacl, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2133,6 +2166,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Garganacl, gShinyOverworldPalette_Garganacl ) @@ -2179,7 +2213,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Charcadet, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Charcadet, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Charcadet, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2196,6 +2230,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Charcadet, gShinyOverworldPalette_Charcadet ) @@ -2243,7 +2278,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Armarouge, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Armarouge, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Armarouge, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2260,6 +2295,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Armarouge, gShinyOverworldPalette_Armarouge ) @@ -2304,7 +2340,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Ceruledge, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Ceruledge, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Ceruledge, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2321,6 +2357,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Ceruledge, gShinyOverworldPalette_Ceruledge ) @@ -2367,7 +2404,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Tadbulb, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Tadbulb, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 12, .backPic = gMonBackPic_Tadbulb, @@ -2385,6 +2422,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Tadbulb, gShinyOverworldPalette_Tadbulb ) @@ -2431,7 +2469,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Bellibolt, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Bellibolt, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Bellibolt, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2448,6 +2486,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Bellibolt, gShinyOverworldPalette_Bellibolt ) @@ -2494,7 +2533,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Wattrel, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Wattrel, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Wattrel, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2511,6 +2550,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Wattrel, gShinyOverworldPalette_Wattrel ) @@ -2557,7 +2597,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Kilowattrel, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Kilowattrel, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Kilowattrel, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2574,6 +2614,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Kilowattrel, gShinyOverworldPalette_Kilowattrel ) @@ -2620,7 +2661,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Maschiff, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Maschiff, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Maschiff, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2637,6 +2678,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Maschiff, gShinyOverworldPalette_Maschiff ) @@ -2683,7 +2725,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Mabosstiff, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Mabosstiff, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Mabosstiff, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2700,6 +2742,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Mabosstiff, gShinyOverworldPalette_Mabosstiff ) @@ -2746,7 +2789,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Shroodle, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Shroodle, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Shroodle, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2763,6 +2806,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Shroodle, gShinyOverworldPalette_Shroodle ) @@ -2809,7 +2853,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Grafaiai, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Grafaiai, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Grafaiai, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2826,6 +2870,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Grafaiai, gShinyOverworldPalette_Grafaiai ) @@ -2872,7 +2917,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Bramblin, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Bramblin, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Bramblin, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2889,6 +2934,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Bramblin, gShinyOverworldPalette_Bramblin ) @@ -2935,7 +2981,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Brambleghast, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Brambleghast, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Brambleghast, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -2952,6 +2998,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Brambleghast, gShinyOverworldPalette_Brambleghast ) @@ -3000,7 +3047,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Toedscool, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Toedscool, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Toedscool, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3017,6 +3064,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Toedscool, gShinyOverworldPalette_Toedscool ) @@ -3065,7 +3113,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Toedscruel, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Toedscruel, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Toedscruel, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3082,6 +3130,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Toedscruel, gShinyOverworldPalette_Toedscruel ) @@ -3128,7 +3177,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Klawf, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Klawf, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Klawf, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3145,6 +3194,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Klawf, gShinyOverworldPalette_Klawf ) @@ -3192,7 +3242,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Capsakid, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Capsakid, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Capsakid, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3209,6 +3259,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Capsakid, gShinyOverworldPalette_Capsakid ) @@ -3255,7 +3306,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Scovillain, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Scovillain, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Scovillain, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3267,7 +3318,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 1, SHADOW(6, 11, SHADOW_SIZE_M) FOOTPRINT(Scovillain) - OVERWORLD_SET_ANIM( + OVERWORLD( sPicTable_Scovillain, SIZE_32x32, SHADOW_SIZE_M, @@ -3319,7 +3370,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Rellor, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Rellor, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Rellor, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3336,6 +3387,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_BUG, + sAnimTable_Following, gOverworldPalette_Rellor, gShinyOverworldPalette_Rellor ) @@ -3382,7 +3434,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Rabsca, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Rabsca, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Rabsca, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3399,6 +3451,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Rabsca, gShinyOverworldPalette_Rabsca ) @@ -3445,7 +3498,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Flittle, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 12, - .frontAnimFrames = sAnims_Flittle, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Flittle, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3462,6 +3515,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Flittle, gShinyOverworldPalette_Flittle ) @@ -3508,7 +3562,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Espathra, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Espathra, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Espathra, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3525,6 +3579,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Espathra, gShinyOverworldPalette_Espathra ) @@ -3571,7 +3626,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Tinkatink, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Tinkatink, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Tinkatink, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3583,7 +3638,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 1, SHADOW(-3, 1, SHADOW_SIZE_S) FOOTPRINT(Tinkatink) - OVERWORLD_SET_ANIM( + OVERWORLD( sPicTable_Tinkatink, SIZE_32x32, SHADOW_SIZE_S, @@ -3635,7 +3690,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Tinkatuff, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_Tinkatuff, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Tinkatuff, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3647,7 +3702,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 1, SHADOW(-4, 5, SHADOW_SIZE_L) FOOTPRINT(Tinkatuff) - OVERWORLD_SET_ANIM( + OVERWORLD( sPicTable_Tinkatuff, SIZE_32x32, SHADOW_SIZE_S, @@ -3698,7 +3753,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Tinkaton, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Tinkaton, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Tinkaton, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3710,7 +3765,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconPalIndex = 1, SHADOW(-5, 15, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Tinkaton) - OVERWORLD_SET_ANIM( + OVERWORLD( sPicTable_Tinkaton, SIZE_32x32, SHADOW_SIZE_M, @@ -3761,7 +3816,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Wiglett, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_Wiglett, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Wiglett, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3778,6 +3833,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Wiglett, gShinyOverworldPalette_Wiglett ) @@ -3823,7 +3879,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Wugtrio, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Wugtrio, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Wugtrio, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3840,6 +3896,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Wugtrio, gShinyOverworldPalette_Wugtrio ) @@ -3886,7 +3943,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Bombirdier, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Bombirdier, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_Bombirdier, @@ -3904,6 +3961,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Bombirdier, gShinyOverworldPalette_Bombirdier ) @@ -3950,7 +4008,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Finizen, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Finizen, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Finizen, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -3967,6 +4025,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Finizen, gShinyOverworldPalette_Finizen ) @@ -4013,7 +4072,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_PalafinZero, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Palafin, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_PalafinZero, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4030,6 +4089,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_PalafinZero, gShinyOverworldPalette_PalafinZero ) @@ -4076,7 +4136,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_PalafinHero, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Palafin, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_PalafinHero, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4093,6 +4153,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_PalafinHero, gShinyOverworldPalette_PalafinHero ) @@ -4141,7 +4202,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Varoom, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Varoom, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Varoom, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4158,6 +4219,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Varoom, gShinyOverworldPalette_Varoom ) @@ -4204,7 +4266,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Revavroom, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_Revavroom, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Revavroom, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4221,6 +4283,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Revavroom, gShinyOverworldPalette_Revavroom ) @@ -4267,7 +4330,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Cyclizar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Cyclizar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Cyclizar, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4284,6 +4347,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cyclizar, gShinyOverworldPalette_Cyclizar ) @@ -4331,7 +4395,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Orthworm, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Orthworm, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Orthworm, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4348,6 +4412,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_Orthworm, gShinyOverworldPalette_Orthworm ) @@ -4395,7 +4460,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Glimmet, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 16, - .frontAnimFrames = sAnims_Glimmet, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 11, .backPic = gMonBackPic_Glimmet, @@ -4413,6 +4478,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Glimmet, gShinyOverworldPalette_Glimmet ) @@ -4459,7 +4525,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Glimmora, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Glimmora, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_Glimmora, @@ -4477,6 +4543,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Glimmora, gShinyOverworldPalette_Glimmora ) @@ -4523,7 +4590,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Greavard, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Greavard, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Greavard, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4540,6 +4607,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Greavard, gShinyOverworldPalette_Greavard ) @@ -4586,7 +4654,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Houndstone, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Houndstone, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Houndstone, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4603,6 +4671,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Houndstone, gShinyOverworldPalette_Houndstone ) @@ -4649,7 +4718,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Flamigo, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Flamigo, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Flamigo, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4666,6 +4735,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Flamigo, gShinyOverworldPalette_Flamigo ) @@ -4713,7 +4783,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Cetoddle, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Cetoddle, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Cetoddle, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4730,6 +4800,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cetoddle, gShinyOverworldPalette_Cetoddle ) @@ -4776,7 +4847,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Cetitan, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Cetitan, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Cetitan, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4793,6 +4864,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Cetitan, gShinyOverworldPalette_Cetitan ) @@ -4839,7 +4911,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Veluza, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 11, - .frontAnimFrames = sAnims_Veluza, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 5, .backPic = gMonBackPic_Veluza, @@ -4857,6 +4929,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Veluza, gShinyOverworldPalette_Veluza ) @@ -4904,7 +4977,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Dondozo, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Dondozo, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 1, .backPic = gMonBackPic_Dondozo, @@ -4922,6 +4995,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_64x64, SHADOW_SIZE_L, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Dondozo, gShinyOverworldPalette_Dondozo ) @@ -4969,7 +5043,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_TatsugiriCurly, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Tatsugiri, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_TatsugiriCurly, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -4986,6 +5060,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_TatsugiriCurly, gShinyOverworldPalette_TatsugiriCurly ) @@ -5031,7 +5106,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_TatsugiriDroopy, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Tatsugiri, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_TatsugiriDroopy, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5048,6 +5123,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_TatsugiriDroopy, gShinyOverworldPalette_TatsugiriDroopy ) @@ -5093,7 +5169,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_TatsugiriStretchy, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 14, - .frontAnimFrames = sAnims_Tatsugiri, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ .backPic = gMonBackPic_TatsugiriStretchy, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5110,6 +5186,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_TatsugiriStretchy, gShinyOverworldPalette_TatsugiriStretchy ) @@ -5159,7 +5236,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_GreatTusk, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_GreatTusk, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GreatTusk, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5176,6 +5253,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GreatTusk, gShinyOverworldPalette_GreatTusk ) @@ -5224,7 +5302,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_ScreamTail, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_ScreamTail, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ScreamTail, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5241,6 +5319,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ScreamTail, gShinyOverworldPalette_ScreamTail ) @@ -5289,7 +5368,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_BruteBonnet, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_BruteBonnet, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_BruteBonnet, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5306,6 +5385,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_BruteBonnet, gShinyOverworldPalette_BruteBonnet ) @@ -5356,7 +5436,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_FlutterMane, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_FlutterMane, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 18, .backPic = gMonBackPic_FlutterMane, @@ -5374,6 +5454,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_FlutterMane, gShinyOverworldPalette_FlutterMane ) @@ -5421,7 +5502,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_SlitherWing, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_SlitherWing, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SlitherWing, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5438,6 +5519,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_SlitherWing, gShinyOverworldPalette_SlitherWing ) @@ -5486,7 +5568,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_SandyShocks, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_SandyShocks, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_SandyShocks, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5503,6 +5585,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_SandyShocks, gShinyOverworldPalette_SandyShocks ) @@ -5551,7 +5634,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_IronTreads, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 9, - .frontAnimFrames = sAnims_IronTreads, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_IronTreads, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5568,6 +5651,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IronTreads, gShinyOverworldPalette_IronTreads ) @@ -5616,7 +5700,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_IronBundle, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_IronBundle, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_IronBundle, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5633,6 +5717,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IronBundle, gShinyOverworldPalette_IronBundle ) @@ -5681,7 +5766,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_IronHands, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_IronHands, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_IronHands, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5698,6 +5783,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IronHands, gShinyOverworldPalette_IronHands ) @@ -5746,7 +5832,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_IronJugulis, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_IronJugulis, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 7, .backPic = gMonBackPic_IronJugulis, @@ -5764,6 +5850,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_IronJugulis, gShinyOverworldPalette_IronJugulis ) @@ -5812,7 +5899,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_IronMoth, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_IronMoth, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 8, .backPic = gMonBackPic_IronMoth, @@ -5830,6 +5917,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IronMoth, gShinyOverworldPalette_IronMoth ) @@ -5878,7 +5966,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_IronThorns, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_IronThorns, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_IronThorns, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5895,6 +5983,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IronThorns, gShinyOverworldPalette_IronThorns ) @@ -5942,7 +6031,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Frigibax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Frigibax, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Frigibax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -5959,6 +6048,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Frigibax, gShinyOverworldPalette_Frigibax ) @@ -6005,7 +6095,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Arctibax, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 6, - .frontAnimFrames = sAnims_Arctibax, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Arctibax, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6022,6 +6112,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Arctibax, gShinyOverworldPalette_Arctibax ) @@ -6067,7 +6158,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Baxcalibur, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Baxcalibur, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Baxcalibur, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6084,6 +6175,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Baxcalibur, gShinyOverworldPalette_Baxcalibur ) @@ -6130,7 +6222,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_GimmighoulChest, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 4, - .frontAnimFrames = sAnims_Gimmighoul, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GimmighoulChest, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6147,6 +6239,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_GimmighoulChest, gShinyOverworldPalette_GimmighoulChest ) @@ -6193,7 +6286,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_GimmighoulRoaming, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 17, - .frontAnimFrames = sAnims_Gimmighoul, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GimmighoulRoaming, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6248,7 +6341,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Gholdengo, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Gholdengo, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Gholdengo, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6265,6 +6358,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Gholdengo, gShinyOverworldPalette_Gholdengo ) @@ -6311,7 +6405,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_WoChien, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_WoChien, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_WoChien, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6328,6 +6422,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_SLITHER, + sAnimTable_Following, gOverworldPalette_WoChien, gShinyOverworldPalette_WoChien ) @@ -6376,7 +6471,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_ChienPao, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_ChienPao, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_ChienPao, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6393,6 +6488,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_ChienPao, gShinyOverworldPalette_ChienPao ) @@ -6441,7 +6537,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_TingLu, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_TingLu, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_TingLu, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6458,6 +6554,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TingLu, gShinyOverworldPalette_TingLu ) @@ -6506,7 +6603,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_ChiYu, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 10, - .frontAnimFrames = sAnims_ChiYu, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 15, .backPic = gMonBackPic_ChiYu, @@ -6524,6 +6621,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_ChiYu, gShinyOverworldPalette_ChiYu ) @@ -6573,7 +6671,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_RoaringMoon, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_RoaringMoon, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 0, .backPic = gMonBackPic_RoaringMoon, @@ -6591,6 +6689,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RoaringMoon, gShinyOverworldPalette_RoaringMoon ) @@ -6638,7 +6737,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_IronValiant, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_IronValiant, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_IronValiant, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6655,6 +6754,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IronValiant, gShinyOverworldPalette_IronValiant ) @@ -6702,7 +6802,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Koraidon, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Koraidon, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Koraidon, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6719,6 +6819,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Koraidon, gShinyOverworldPalette_Koraidon ) @@ -6768,7 +6869,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Miraidon, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_Miraidon, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Miraidon, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6785,6 +6886,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Miraidon, gShinyOverworldPalette_Miraidon ) @@ -6834,7 +6936,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_WalkingWake, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_WalkingWake, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_WalkingWake, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6851,6 +6953,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_WalkingWake, gShinyOverworldPalette_WalkingWake ) @@ -6898,7 +7001,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_IronLeaves, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_IronLeaves, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_IronLeaves, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -6915,6 +7018,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IronLeaves, gShinyOverworldPalette_IronLeaves ) @@ -6962,7 +7066,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Poltchageist, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Poltchageist, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 10, .backPic = gMonBackPic_Poltchageist, @@ -6980,6 +7084,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Poltchageist, gShinyOverworldPalette_Poltchageist ) @@ -7025,7 +7130,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Poltchageist, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 7, - .frontAnimFrames = sAnims_Poltchageist, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 10, .backPic = gMonBackPic_Poltchageist, @@ -7043,6 +7148,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_S, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Poltchageist, gShinyOverworldPalette_Poltchageist ) @@ -7089,7 +7195,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Sinistcha, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Sinistcha, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 10, .backPic = gMonBackPic_Sinistcha, @@ -7107,6 +7213,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Sinistcha, gShinyOverworldPalette_Sinistcha ) @@ -7151,7 +7258,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Sinistcha, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_Sinistcha, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 10, .backPic = gMonBackPic_Sinistcha, @@ -7169,6 +7276,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_NONE, + sAnimTable_Following, gOverworldPalette_Sinistcha, gShinyOverworldPalette_Sinistcha ) @@ -7216,7 +7324,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Okidogi, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_Okidogi, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Okidogi, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7233,6 +7341,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Okidogi, gShinyOverworldPalette_Okidogi ) @@ -7281,7 +7390,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Munkidori, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 5, - .frontAnimFrames = sAnims_Munkidori, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Munkidori, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7298,6 +7407,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Munkidori, gShinyOverworldPalette_Munkidori ) @@ -7346,7 +7456,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Fezandipiti, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = sAnims_Fezandipiti, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Fezandipiti, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7363,6 +7473,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Fezandipiti, gShinyOverworldPalette_Fezandipiti ) @@ -7374,67 +7485,68 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = #endif //P_FAMILY_FEZANDIPITI #if P_FAMILY_OGERPON -#define OGERPON_SPECIES_INFO(Form1, Form2, type, ability, color, frontYOffset, backYOffset, iconpalette, isTeraform) \ - { \ - .baseHP = 80, \ - .baseAttack = 120, \ - .baseDefense = 84, \ - .baseSpeed = 110, \ - .baseSpAttack = 60, \ - .baseSpDefense = 96, \ - .types = MON_TYPES(TYPE_GRASS, type), \ - .forceTeraType = type, \ - .catchRate = 5, \ - .expYield = 275, \ - .evYield_Attack = 3, \ - .genderRatio = MON_FEMALE, \ - .eggCycles = 10, \ - .friendship = STANDARD_FRIENDSHIP, \ - .growthRate = GROWTH_SLOW, \ - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), \ - .abilities = { ability, ABILITY_NONE }, \ - .bodyColor = color, \ - .speciesName = _("Ogerpon"), \ - .cryId = CRY_OGERPON, \ - .natDexNum = NATIONAL_DEX_OGERPON, \ - .categoryName = _("Mask"), \ - .height = 12, \ - .weight = 398, \ - .description = gOgerpon##Form1##MaskPokedexText, \ - .pokemonScale = 356, \ - .pokemonOffset = 17, \ - .trainerScale = 256, \ - .trainerOffset = 0, \ - .frontPic = gMonFrontPic_Ogerpon##Form2, \ - .frontPicSize = MON_COORDS_SIZE(64, 64), \ - .frontPicYOffset = frontYOffset, \ - .frontAnimFrames = sAnims_Ogerpon, \ - /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ \ - .backPic = gMonBackPic_Ogerpon##Form2, \ - .backPicSize = MON_COORDS_SIZE(64, 64), \ - .backPicYOffset = backYOffset, \ - /*.backAnimId = BACK_ANIM_NONE,*/ \ - .palette = gMonPalette_Ogerpon##Form2, \ - .shinyPalette = gMonShinyPalette_Ogerpon##Form2, \ - .iconSprite = gMonIcon_Ogerpon##Form1, \ - .iconPalIndex = iconpalette, \ - SHADOW(7, 13, SHADOW_SIZE_L) \ - FOOTPRINT(Ogerpon) \ - OVERWORLD( \ - sPicTable_Ogerpon##Form2, \ - SIZE_32x32, \ - SHADOW_SIZE_M, \ - TRACKS_FOOT, \ - gOverworldPalette_Ogerpon##Form2, \ - gShinyOverworldPalette_Ogerpon##Form2 \ - ) \ - .levelUpLearnset = sOgerponLevelUpLearnset, \ - .teachableLearnset = sOgerponTeachableLearnset, \ - .formSpeciesIdTable = sOgerponFormSpeciesIdTable, \ - .formChangeTable = sOgerponFormChangeTable, \ - .isLegendary = TRUE, \ - .isTeraForm = isTeraform, \ - .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ +#define OGERPON_SPECIES_INFO(Form1, Form2, type, ability, color, frontYOffset, backYOffset, iconpalette, isTeraform) \ + { \ + .baseHP = 80, \ + .baseAttack = 120, \ + .baseDefense = 84, \ + .baseSpeed = 110, \ + .baseSpAttack = 60, \ + .baseSpDefense = 96, \ + .types = MON_TYPES(TYPE_GRASS, type), \ + .forceTeraType = type, \ + .catchRate = 5, \ + .expYield = 275, \ + .evYield_Attack = 3, \ + .genderRatio = MON_FEMALE, \ + .eggCycles = 10, \ + .friendship = STANDARD_FRIENDSHIP, \ + .growthRate = GROWTH_SLOW, \ + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), \ + .abilities = { ability, ABILITY_NONE }, \ + .bodyColor = color, \ + .speciesName = _("Ogerpon"), \ + .cryId = CRY_OGERPON, \ + .natDexNum = NATIONAL_DEX_OGERPON, \ + .categoryName = _("Mask"), \ + .height = 12, \ + .weight = 398, \ + .description = gOgerpon##Form1##MaskPokedexText, \ + .pokemonScale = 356, \ + .pokemonOffset = 17, \ + .trainerScale = 256, \ + .trainerOffset = 0, \ + .frontPic = gMonFrontPic_Ogerpon##Form2, \ + .frontPicSize = MON_COORDS_SIZE(64, 64), \ + .frontPicYOffset = frontYOffset, \ + .frontAnimFrames = sAnims_SingleFramePlaceHolder, \ + /*.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE,*/ \ + .backPic = gMonBackPic_Ogerpon##Form2, \ + .backPicSize = MON_COORDS_SIZE(64, 64), \ + .backPicYOffset = backYOffset, \ + /*.backAnimId = BACK_ANIM_NONE,*/ \ + .palette = gMonPalette_Ogerpon##Form2, \ + .shinyPalette = gMonShinyPalette_Ogerpon##Form2, \ + .iconSprite = gMonIcon_Ogerpon##Form1, \ + .iconPalIndex = iconpalette, \ + SHADOW(7, 13, SHADOW_SIZE_L) \ + FOOTPRINT(Ogerpon) \ + OVERWORLD( \ + sPicTable_Ogerpon##Form2, \ + SIZE_32x32, \ + SHADOW_SIZE_M, \ + TRACKS_FOOT, \ + sAnimTable_Following, \ + gOverworldPalette_Ogerpon##Form2, \ + gShinyOverworldPalette_Ogerpon##Form2 \ + ) \ + .levelUpLearnset = sOgerponLevelUpLearnset, \ + .teachableLearnset = sOgerponTeachableLearnset, \ + .formSpeciesIdTable = sOgerponFormSpeciesIdTable, \ + .formChangeTable = sOgerponFormChangeTable, \ + .isLegendary = TRUE, \ + .isTeraForm = isTeraform, \ + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ } [SPECIES_OGERPON_TEAL] = OGERPON_SPECIES_INFO(Teal, Teal, TYPE_GRASS, ABILITY_DEFIANT, BODY_COLOR_GREEN, 1, 7, 1, FALSE), @@ -7489,7 +7601,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_GougingFire, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 2, - .frontAnimFrames = sAnims_GougingFire, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GougingFire, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7506,6 +7618,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_GougingFire, gShinyOverworldPalette_GougingFire ) @@ -7554,7 +7667,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_RagingBolt, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_RagingBolt, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_RagingBolt, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7571,6 +7684,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_64x64, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_RagingBolt, gShinyOverworldPalette_RagingBolt ) @@ -7618,7 +7732,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_IronBoulder, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 3, - .frontAnimFrames = sAnims_IronBoulder, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_IronBoulder, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7635,6 +7749,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IronBoulder, gShinyOverworldPalette_IronBoulder ) @@ -7683,7 +7798,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_IronCrown, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_IronCrown, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_IronCrown, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7700,6 +7815,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_IronCrown, gShinyOverworldPalette_IronCrown ) @@ -7748,7 +7864,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_TerapagosNormal, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_TerapagosNormal, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 1, .backPic = gMonBackPic_TerapagosNormal, @@ -7766,6 +7882,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TerapagosNormal, gShinyOverworldPalette_TerapagosNormal ) @@ -7817,7 +7934,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_TerapagosTerastal, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 8, - .frontAnimFrames = sAnims_TerapagosTerastal, + .frontAnimFrames = sAnims_TwoFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .enemyMonElevation = 1, .backPic = gMonBackPic_TerapagosTerastal, @@ -7835,6 +7952,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_TerapagosTerastal, gShinyOverworldPalette_TerapagosTerastal ) @@ -7885,7 +8003,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_TerapagosStellar, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 0, - .frontAnimFrames = sAnims_TerapagosStellar, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_TerapagosStellar, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7946,7 +8064,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPic = gMonFrontPic_Pecharunt, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 13, - .frontAnimFrames = sAnims_Pecharunt, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Pecharunt, .backPicSize = MON_COORDS_SIZE(64, 64), @@ -7963,6 +8081,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = SIZE_32x32, SHADOW_SIZE_M, TRACKS_FOOT, + sAnimTable_Following, gOverworldPalette_Pecharunt, gShinyOverworldPalette_Pecharunt ) diff --git a/src/data/pokemon/species_info/shared_front_pic_anims.h b/src/data/pokemon/species_info/shared_front_pic_anims.h new file mode 100644 index 0000000000..ba1ddfd53e --- /dev/null +++ b/src/data/pokemon/species_info/shared_front_pic_anims.h @@ -0,0 +1,448 @@ +static const union AnimCmd *const sAnims_SingleFramePlaceHolder[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_TwoFramePlaceHolder[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, + }, +}; + +#if P_FAMILY_BURMY +static const union AnimCmd *const sAnims_Burmy[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_Wormadam[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_Mothim[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_BURMY + +#if P_FAMILY_SHELLOS +static const union AnimCmd *const sAnims_Shellos[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 36), + ANIMCMD_FRAME(0, 10), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_Gastrodon[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_SHELLOS + +#if P_FAMILY_ARCEUS +static const union AnimCmd *const sAnims_Arceus[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_ARCEUS + +#if P_FAMILY_BASCULIN +static const union AnimCmd *const sAnims_Basculin[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 10), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_BASCULIN + +#if P_FAMILY_DEERLING +static const union AnimCmd *const sAnims_Deerling[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_Sawsbuck[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_DEERLING + +#if P_FAMILY_GENESECT +static const union AnimCmd *const sAnims_Genesect[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_GENESECT + +#if P_FAMILY_FROAKIE +static const union AnimCmd *const sAnims_Greninja[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(0, 20), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_GRENINJA + +#if P_FAMILY_SCATTERBUG +static const union AnimCmd *const sAnims_Scatterbug[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 35), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_Spewpa[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 18), + ANIMCMD_FRAME(1, 18), + ANIMCMD_FRAME(0, 10), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_Vivillon[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 50), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_SCATTERBUG + +#if P_FAMILY_FLABEBE +static const union AnimCmd *const sAnims_Flabebe[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 27), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_Floette[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 25), + ANIMCMD_FRAME(1, 50), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_Florges[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_FLABEBE + +#if P_FAMILY_FURFROU +static const union AnimCmd *const sAnims_Furfrou[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 27), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_FURFROU + +#if P_FAMILY_ESPURR +static const union AnimCmd *const sAnims_Meowstic[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_MEOWSTIC + +#if P_FAMILY_PUMPKABOO +static const union AnimCmd *const sAnims_Pumpkaboo[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 15), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_Gourgeist[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 15), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_PUMPKABOO + +#if P_FAMILY_XERNEAS +static const union AnimCmd *const sAnims_Xerneas[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 15), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_XERNEAS + +#if P_FAMILY_ZYGARDE +static const union AnimCmd *const sAnims_Zygarde50[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 25), + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, + }, +}; + +static const union AnimCmd *const sAnims_Zygarde10[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_ZYGARDE + +#if P_FAMILY_GRUBBIN +static const union AnimCmd *const sAnims_Vikavolt[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 15), + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_GRUBBIN + +#if P_FAMILY_CUTIEFLY +static const union AnimCmd *const sAnims_Ribombee[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_CUTIEFLY + +#if P_FAMILY_ROCKRUFF +static const union AnimCmd *const sAnims_Rockruff[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_ROCKRUFF + +#if P_FAMILY_DEWPIDER +static const union AnimCmd *const sAnims_Araquanid[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 45), + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_DEWPIDER + +#if P_FAMILY_SALANDIT +static const union AnimCmd *const sAnims_Salazzle[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_SALANDIT + +#if P_FAMILY_TOGEDEMARU +static const union AnimCmd *const sAnims_Togedemaru[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_TOGEDEMARU + +#if P_FAMILY_JANGMO_O +static const union AnimCmd *const sAnims_Kommo_O[] = +{ + sAnim_GeneralFrame0, + (const union AnimCmd[]) { + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(1, 20), + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, + }, +}; +#endif //P_FAMILY_JANGMO_O diff --git a/src/data/pokemon_graphics/front_pic_anims.h b/src/data/pokemon_graphics/front_pic_anims.h deleted file mode 100644 index 3fceeb2ff9..0000000000 --- a/src/data/pokemon_graphics/front_pic_anims.h +++ /dev/null @@ -1,12833 +0,0 @@ -#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \ -static const union AnimCmd sAnim_##name##_1[] = \ -{ \ - ANIMCMD_FRAME(0, 1), \ - ANIMCMD_END, \ -} - -#define PLACEHOLDER_ANIM_TWO_FRAMES(name) \ -static const union AnimCmd sAnim_##name##_1[] = \ -{ \ - ANIMCMD_FRAME(0, 30), \ - ANIMCMD_FRAME(1, 30), \ - ANIMCMD_FRAME(0, 1), \ - ANIMCMD_END, \ -} - -static const union AnimCmd sAnim_None_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_FAMILY_BULBASAUR -static const union AnimCmd sAnim_Bulbasaur_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Ivysaur_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Venusaur_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(VenusaurMega); -#endif //P_MEGA_EVOLUTIONS - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(VenusaurGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_BULBASAUR - -#if P_FAMILY_CHARMANDER -static const union AnimCmd sAnim_Charmander_1[] = -{ - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 46), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Charmeleon_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Charizard_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(CharizardMegaX); -#endif //P_MEGA_EVOLUTIONS - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(CharizardMegaY); -#endif //P_MEGA_EVOLUTIONS - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(CharizardGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_CHARMANDER - -#if P_FAMILY_SQUIRTLE -static const union AnimCmd sAnim_Squirtle_1[] = -{ - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Wartortle_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Blastoise_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(BlastoiseMega); -#endif //P_MEGA_EVOLUTIONS - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(BlastoiseGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SQUIRTLE - -#if P_FAMILY_CATERPIE -static const union AnimCmd sAnim_Caterpie_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Metapod_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Butterfree_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(ButterfreeGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_CATERPIE - -#if P_FAMILY_WEEDLE -static const union AnimCmd sAnim_Weedle_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Kakuna_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Beedrill_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(BeedrillMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_WEEDLE - -#if P_FAMILY_PIDGEY -static const union AnimCmd sAnim_Pidgey_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Pidgeotto_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Pidgeot_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(PidgeotMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_PIDGEY - -#if P_FAMILY_RATTATA -static const union AnimCmd sAnim_Rattata_1[] = -{ - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Raticate_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -#if P_ALOLAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(RattataAlola); -PLACEHOLDER_ANIM_SINGLE_FRAME(RaticateAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_RATTATA - -#if P_FAMILY_SPEAROW -static const union AnimCmd sAnim_Spearow_1[] = -{ - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Fearow_1[] = -{ - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; -#endif //P_FAMILY_SPEAROW - -#if P_FAMILY_EKANS -static const union AnimCmd sAnim_Ekans_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Arbok_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_EKANS - -#if P_FAMILY_PIKACHU -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Pichu_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_PichuSpikyEared_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, 1), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS - -static const union AnimCmd sAnim_Pikachu_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 60), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_COSPLAY_PIKACHU_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuCosplay); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuRockStar); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuBelle); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuPopStar); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuPhD); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuLibre); -#endif //P_COSPLAY_PIKACHU_FORMS -#if P_CAP_PIKACHU_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuOriginal); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuHoenn); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuSinnoh); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuUnova); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuKalos); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuAlola); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuPartner); -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuWorld); -#endif //P_CAP_PIKACHU_FORMS - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(PikachuGmax); -#endif //P_GIGANTAMAX_FORMS - -static const union AnimCmd sAnim_Raichu_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_ALOLAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(RaichuAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_PIKACHU - -#if P_FAMILY_SANDSHREW -static const union AnimCmd sAnim_Sandshrew_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Sandslash_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_ALOLAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(SandshrewAlola); -PLACEHOLDER_ANIM_SINGLE_FRAME(SandslashAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_SANDSHREW - -#if P_FAMILY_NIDORAN -static const union AnimCmd sAnim_NidoranF_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 50), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Nidorina_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Nidoqueen_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_NidoranM_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Nidorino_1[] = -{ - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 23), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Nidoking_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_NIDORAN - -#if P_FAMILY_CLEFAIRY -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Cleffa_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS - -static const union AnimCmd sAnim_Clefairy_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Clefable_1[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 48), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_CLEFAIRY - -#if P_FAMILY_VULPIX -static const union AnimCmd sAnim_Vulpix_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Ninetales_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_ALOLAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(VulpixAlola); -PLACEHOLDER_ANIM_SINGLE_FRAME(NinetalesAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_VULPIX - -#if P_FAMILY_JIGGLYPUFF -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Igglybuff_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS - -static const union AnimCmd sAnim_Jigglypuff_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Wigglytuff_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_JIGGLYPUFF - -#if P_FAMILY_ZUBAT -static const union AnimCmd sAnim_Zubat_1[] = -{ - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Golbat_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Crobat_1[] = -{ - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_ZUBAT - -#if P_FAMILY_ODDISH -static const union AnimCmd sAnim_Oddish_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 6), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gloom_1[] = -{ - ANIMCMD_FRAME(0, 21), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Vileplume_1[] = -{ - ANIMCMD_FRAME(1, 38), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Bellossom_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_ODDISH - -#if P_FAMILY_PARAS -static const union AnimCmd sAnim_Paras_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Parasect_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_PARAS - -#if P_FAMILY_VENONAT -static const union AnimCmd sAnim_Venonat_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 35), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Venomoth_1[] = -{ - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; -#endif //P_FAMILY_VENONAT - -#if P_FAMILY_DIGLETT -static const union AnimCmd sAnim_Diglett_1[] = -{ - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Dugtrio_1[] = -{ - ANIMCMD_FRAME(1, 35), - 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_END, -}; - -#if P_ALOLAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(DiglettAlola); -PLACEHOLDER_ANIM_SINGLE_FRAME(DugtrioAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_DIGLETT - -#if P_FAMILY_MEOWTH -static const union AnimCmd sAnim_Meowth_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 17), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Persian_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_ALOLAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(MeowthAlola); -PLACEHOLDER_ANIM_SINGLE_FRAME(PersianAlola); -#endif //P_ALOLAN_FORMS - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(MeowthGalar); -PLACEHOLDER_ANIM_SINGLE_FRAME(Perrserker); -#endif //P_GALARIAN_FORMS - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(MeowthGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_MEOWTH - -#if P_FAMILY_PSYDUCK -static const union AnimCmd sAnim_Psyduck_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Golduck_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_PSYDUCK - -#if P_FAMILY_MANKEY -static const union AnimCmd sAnim_Mankey_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 28), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Primeape_1[] = -{ - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_GEN_9_CROSS_EVOS -PLACEHOLDER_ANIM_SINGLE_FRAME(Annihilape); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_MANKEY - -#if P_FAMILY_GROWLITHE -static const union AnimCmd sAnim_Growlithe_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Arcanine_1[] = -{ - ANIMCMD_FRAME(1, 38), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(GrowlitheHisui); -PLACEHOLDER_ANIM_SINGLE_FRAME(ArcanineHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_GROWLITHE - -#if P_FAMILY_POLIWAG -static const union AnimCmd sAnim_Poliwag_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Poliwhirl_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Poliwrath_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Politoed_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_POLIWAG - -#if P_FAMILY_ABRA -static const union AnimCmd sAnim_Abra_1[] = -{ - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 21), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 21), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Kadabra_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Alakazam_1[] = -{ - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 54), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(AlakazamMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_ABRA - -#if P_FAMILY_MACHOP -static const union AnimCmd sAnim_Machop_1[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Machoke_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Machamp_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(MachampGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_MACHOP - -#if P_FAMILY_BELLSPROUT -static const union AnimCmd sAnim_Bellsprout_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Weepinbell_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Victreebel_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_END, -}; -#endif //P_FAMILY_BELLSPROUT - -#if P_FAMILY_TENTACOOL -static const union AnimCmd sAnim_Tentacool_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Tentacruel_1[] = -{ - ANIMCMD_FRAME(0, 19), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 19), - ANIMCMD_FRAME(1, 19), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -#endif //P_FAMILY_TENTACOOL - -#if P_FAMILY_GEODUDE -static const union AnimCmd sAnim_Geodude_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Graveler_1[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Golem_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 31), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -#if P_ALOLAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(GeodudeAlola); -PLACEHOLDER_ANIM_SINGLE_FRAME(GravelerAlola); -PLACEHOLDER_ANIM_SINGLE_FRAME(GolemAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_GEODUDE - -#if P_FAMILY_PONYTA -static const union AnimCmd sAnim_Ponyta_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Rapidash_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(PonytaGalar); -PLACEHOLDER_ANIM_SINGLE_FRAME(RapidashGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_PONYTA - -#if P_FAMILY_SLOWPOKE -static const union AnimCmd sAnim_Slowpoke_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Slowbro_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Slowking_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(SlowbroMega); -#endif //P_MEGA_EVOLUTIONS - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(SlowpokeGalar); -PLACEHOLDER_ANIM_SINGLE_FRAME(SlowbroGalar); -#if P_GEN_2_CROSS_EVOS -PLACEHOLDER_ANIM_SINGLE_FRAME(SlowkingGalar); -#endif //P_GEN_2_CROSS_EVOS -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_SLOWPOKE - -#if P_FAMILY_MAGNEMITE -static const union AnimCmd sAnim_Magnemite_1[] = -{ - ANIMCMD_FRAME(0, 28), - ANIMCMD_FRAME(1, 28), - ANIMCMD_FRAME(0, 28), - ANIMCMD_FRAME(1, 28), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Magneton_1[] = -{ - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Magnezone_1[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_MAGNEMITE - -#if P_FAMILY_FARFETCHD -static const union AnimCmd sAnim_Farfetchd_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(FarfetchdGalar); -PLACEHOLDER_ANIM_SINGLE_FRAME(Sirfetchd); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_FARFETCHD - -#if P_FAMILY_DODUO -static const union AnimCmd sAnim_Doduo_1[] = -{ - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Dodrio_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, 8), - ANIMCMD_END, -}; -#endif //P_FAMILY_DODUO - -#if P_FAMILY_SEEL -static const union AnimCmd sAnim_Seel_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Dewgong_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_FAMILY_SEEL - -#if P_FAMILY_GRIMER -static const union AnimCmd sAnim_Grimer_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Muk_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_ALOLAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(GrimerAlola); -PLACEHOLDER_ANIM_SINGLE_FRAME(MukAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_GRIMER - -#if P_FAMILY_SHELLDER -static const union AnimCmd sAnim_Shellder_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Cloyster_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_SHELLDER - -#if P_FAMILY_GASTLY -static const union AnimCmd sAnim_Gastly_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Haunter_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gengar_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(GengarMega); -#endif //P_MEGA_EVOLUTIONS - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(GengarGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_GASTLY - -#if P_FAMILY_ONIX -static const union AnimCmd sAnim_Onix_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Steelix_1[] = -{ - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 21), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 21), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(SteelixMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_ONIX - -#if P_FAMILY_DROWZEE -static const union AnimCmd sAnim_Drowzee_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Hypno_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_DROWZEE - -#if P_FAMILY_KRABBY -static const union AnimCmd sAnim_Krabby_1[] = -{ - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Kingler_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 14), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(KinglerGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_KRABBY - -#if P_FAMILY_VOLTORB -static const union AnimCmd sAnim_Voltorb_1[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Electrode_1[] = -{ - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 34), - ANIMCMD_FRAME(1, 34), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(VoltorbHisui); -PLACEHOLDER_ANIM_SINGLE_FRAME(ElectrodeHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_VOLTORB - -#if P_FAMILY_EXEGGCUTE -static const union AnimCmd sAnim_Exeggcute_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_END, -}; - -static const union AnimCmd sAnim_Exeggutor_1[] = -{ - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_ALOLAN_FORMS -PLACEHOLDER_ANIM_TWO_FRAMES(ExeggutorAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_EXEGGCUTE - -#if P_FAMILY_CUBONE -static const union AnimCmd sAnim_Cubone_1[] = -{ - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_LOOP(1), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Marowak_1[] = -{ - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_END, -}; - -#if P_ALOLAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(MarowakAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_CUBONE - -#if P_FAMILY_HITMONS -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Tyrogue_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS - -static const union AnimCmd sAnim_Hitmonlee_1[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Hitmonchan_1[] = -{ - ANIMCMD_FRAME(0, 17), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Hitmontop_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 26), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_HITMONS - -#if P_FAMILY_LICKITUNG -static const union AnimCmd sAnim_Lickitung_1[] = -{ - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Lickilicky_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 50), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_LICKITUNG - -#if P_FAMILY_KOFFING -static const union AnimCmd sAnim_Koffing_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Weezing_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(WeezingGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_KOFFING - -#if P_FAMILY_RHYHORN -static const union AnimCmd sAnim_Rhyhorn_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Rhydon_1[] = -{ - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Rhyperior_1[] = -{ - ANIMCMD_FRAME(0, 50), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_RHYHORN - -#if P_FAMILY_CHANSEY -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Happiny_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS - -static const union AnimCmd sAnim_Chansey_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Blissey_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_CHANSEY - -#if P_FAMILY_TANGELA -static const union AnimCmd sAnim_Tangela_1[] = -{ - ANIMCMD_FRAME(0, 40), - ANIMCMD_FRAME(1, 24), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Tangrowth_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_TANGELA - -#if P_FAMILY_KANGASKHAN -static const union AnimCmd sAnim_Kangaskhan_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(KangaskhanMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_KANGASKHAN - -#if P_FAMILY_HORSEA -static const union AnimCmd sAnim_Horsea_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Seadra_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Kingdra_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_HORSEA - -#if P_FAMILY_GOLDEEN -static const union AnimCmd sAnim_Goldeen_1[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Seaking_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_GOLDEEN - -#if P_FAMILY_STARYU -static const union AnimCmd sAnim_Staryu_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Starmie_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_STARYU - -#if P_FAMILY_MR_MIME -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_MimeJr_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS - -static const union AnimCmd sAnim_MrMime_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(MrMimeGalar); -PLACEHOLDER_ANIM_SINGLE_FRAME(MrRime); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_MR_MIME - -#if P_FAMILY_SCYTHER -static const union AnimCmd sAnim_Scyther_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Scizor_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(ScizorMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_GEN_2_CROSS_EVOS - -#if P_GEN_8_CROSS_EVOS -PLACEHOLDER_ANIM_SINGLE_FRAME(Kleavor); -#endif //P_GEN_8_CROSS_EVOS -#endif //P_FAMILY_SCYTHER - -#if P_FAMILY_JYNX -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Smoochum_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS - -static const union AnimCmd sAnim_Jynx_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_JYNX - -#if P_FAMILY_ELECTABUZZ -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Elekid_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS - -static const union AnimCmd sAnim_Electabuzz_1[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Electivire_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_ELECTABUZZ - -#if P_FAMILY_MAGMAR -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Magby_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS - -static const union AnimCmd sAnim_Magmar_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Magmortar_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_MAGMAR - -#if P_FAMILY_PINSIR -static const union AnimCmd sAnim_Pinsir_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(PinsirMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_PINSIR - -#if P_FAMILY_TAUROS -static const union AnimCmd sAnim_Tauros_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_PALDEAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(TaurosPaldea); -#endif //P_PALDEAN_FORMS -#endif //P_FAMILY_TAUROS - -#if P_FAMILY_MAGIKARP -static const union AnimCmd sAnim_Magikarp_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gyarados_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(GyaradosMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MAGIKARP - -#if P_FAMILY_LAPRAS -static const union AnimCmd sAnim_Lapras_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(LaprasGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_LAPRAS - -#if P_FAMILY_DITTO -static const union AnimCmd sAnim_Ditto_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_DITTO - -#if P_FAMILY_EEVEE -static const union AnimCmd sAnim_Eevee_1[] = -{ - ANIMCMD_FRAME(1, 33), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(EeveeGmax); -#endif //P_GIGANTAMAX_FORMS - -static const union AnimCmd sAnim_Vaporeon_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Jolteon_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Flareon_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Espeon_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Umbreon_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_GEN_2_CROSS_EVOS - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Leafeon_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Glaceon_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS - -#if P_GEN_6_CROSS_EVOS -static const union AnimCmd sAnim_Sylveon_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_GEN_6_CROSS_EVOS -#endif //P_FAMILY_EEVEE - -#if P_FAMILY_PORYGON -static const union AnimCmd sAnim_Porygon_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GEN_2_CROSS_EVOS -static const union AnimCmd sAnim_Porygon2_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Porygon_Z_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 40), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_PORYGON - -#if P_FAMILY_OMANYTE -static const union AnimCmd sAnim_Omanyte_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Omastar_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_OMANYTE - -#if P_FAMILY_KABUTO -static const union AnimCmd sAnim_Kabuto_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Kabutops_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_KABUTO - -#if P_FAMILY_AERODACTYL -static const union AnimCmd sAnim_Aerodactyl_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 25), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(AerodactylMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_AERODACTYL - -#if P_FAMILY_SNORLAX -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Munchlax_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS - -static const union AnimCmd sAnim_Snorlax_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(SnorlaxGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SNORLAX - -#if P_FAMILY_ARTICUNO -static const union AnimCmd sAnim_Articuno_1[] = -{ - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(ArticunoGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_ARTICUNO - -#if P_FAMILY_ZAPDOS -static const union AnimCmd sAnim_Zapdos_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(ZapdosGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_ZAPDOS - -#if P_FAMILY_MOLTRES -static const union AnimCmd sAnim_Moltres_1[] = -{ - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(MoltresGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_MOLTRES - -#if P_FAMILY_DRATINI -static const union AnimCmd sAnim_Dratini_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Dragonair_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Dragonite_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_DRATINI - -#if P_FAMILY_MEWTWO -static const union AnimCmd sAnim_Mewtwo_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(MewtwoMegaX); -#endif //P_MEGA_EVOLUTIONS - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(MewtwoMegaY); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MEWTWO - -#if P_FAMILY_MEW -static const union AnimCmd sAnim_Mew_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_MEW - -#if P_FAMILY_CHIKORITA -static const union AnimCmd sAnim_Chikorita_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Bayleef_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Meganium_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_CHIKORITA - -#if P_FAMILY_CYNDAQUIL -static const union AnimCmd sAnim_Cyndaquil_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Quilava_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Typhlosion_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(TyphlosionHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_CYNDAQUIL - -#if P_FAMILY_TOTODILE -static const union AnimCmd sAnim_Totodile_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Croconaw_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Feraligatr_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 40), - ANIMCMD_END, -}; -#endif //P_FAMILY_TOTODILE - -#if P_FAMILY_SENTRET -static const union AnimCmd sAnim_Sentret_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Furret_1[] = -{ - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_SENTRET - -#if P_FAMILY_HOOTHOOT -static const union AnimCmd sAnim_Hoothoot_1[] = -{ - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Noctowl_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_HOOTHOOT - -#if P_FAMILY_LEDYBA -static const union AnimCmd sAnim_Ledyba_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Ledian_1[] = -{ - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_END, -}; -#endif //P_FAMILY_LEDYBA - -#if P_FAMILY_SPINARAK -static const union AnimCmd sAnim_Spinarak_1[] = -{ - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Ariados_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SPINARAK - -#if P_FAMILY_CHINCHOU -static const union AnimCmd sAnim_Chinchou_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Lanturn_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_CHINCHOU - -#if P_FAMILY_TOGEPI -static const union AnimCmd sAnim_Togepi_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Togetic_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Togekiss_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_TOGEPI - -#if P_FAMILY_NATU -static const union AnimCmd sAnim_Natu_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Xatu_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_NATU - -#if P_FAMILY_MAREEP -static const union AnimCmd sAnim_Mareep_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Flaaffy_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Ampharos_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(AmpharosMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MAREEP - -#if P_FAMILY_MARILL -#if P_GEN_3_CROSS_EVOS -static const union AnimCmd sAnim_Azurill_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, -}; -#endif //P_GEN_3_CROSS_EVOS - -static const union AnimCmd sAnim_Marill_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Azumarill_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_MARILL - -#if P_FAMILY_SUDOWOODO -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Bonsly_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS - -static const union AnimCmd sAnim_Sudowoodo_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_SUDOWOODO - -#if P_FAMILY_HOPPIP -static const union AnimCmd sAnim_Hoppip_1[] = -{ - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Skiploom_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Jumpluff_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_HOPPIP - -#if P_FAMILY_AIPOM -static const union AnimCmd sAnim_Aipom_1[] = -{ - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Ambipom_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_AIPOM - -#if P_FAMILY_SUNKERN -static const union AnimCmd sAnim_Sunkern_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Sunflora_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_SUNKERN - -#if P_FAMILY_YANMA -static const union AnimCmd sAnim_Yanma_1[] = -{ - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Yanmega_1[] = -{ - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_YANMA - -#if P_FAMILY_WOOPER -static const union AnimCmd sAnim_Wooper_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Quagsire_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_PALDEAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(WooperPaldea); -PLACEHOLDER_ANIM_TWO_FRAMES(Clodsire); -#endif //P_PALDEAN_FORMS -#endif //P_FAMILY_WOOPER - -#if P_FAMILY_MURKROW -static const union AnimCmd sAnim_Murkrow_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Honchkrow_1[] = -{ - ANIMCMD_FRAME(0, 21), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_MURKROW - -#if P_FAMILY_MISDREAVUS -static const union AnimCmd sAnim_Misdreavus_1[] = -{ - 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, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Mismagius_1[] = -{ - 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, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_MISDREAVUS - -#if P_FAMILY_UNOWN -PLACEHOLDER_ANIM_SINGLE_FRAME(Unown); -#endif //P_FAMILY_UNOWN - -#if P_FAMILY_WOBBUFFET -#if P_GEN_3_CROSS_EVOS -static const union AnimCmd sAnim_Wynaut_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_GEN_3_CROSS_EVOS - -static const union AnimCmd sAnim_Wobbuffet_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_WOBBUFFET - -#if P_FAMILY_GIRAFARIG -static const union AnimCmd sAnim_Girafarig_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -#if P_GEN_9_CROSS_EVOS -PLACEHOLDER_ANIM_SINGLE_FRAME(Farigiraf); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_GIRAFARIG - -#if P_FAMILY_PINECO -static const union AnimCmd sAnim_Pineco_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Forretress_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_PINECO - -#if P_FAMILY_DUNSPARCE -static const union AnimCmd sAnim_Dunsparce_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GEN_9_CROSS_EVOS -PLACEHOLDER_ANIM_SINGLE_FRAME(Dudunsparce); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_DUNSPARCE - -#if P_FAMILY_GLIGAR -static const union AnimCmd sAnim_Gligar_1[] = -{ - ANIMCMD_FRAME(1, 17), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Gliscor_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 40), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_GLIGAR - -#if P_FAMILY_SNUBBULL -static const union AnimCmd sAnim_Snubbull_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Granbull_1[] = -{ - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_SNUBBULL - -#if P_FAMILY_QWILFISH -static const union AnimCmd sAnim_Qwilfish_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(QwilfishHisui); -PLACEHOLDER_ANIM_SINGLE_FRAME(Overqwil); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_QWILFISH - -#if P_FAMILY_SHUCKLE -static const union AnimCmd sAnim_Shuckle_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_FAMILY_SHUCKLE - -#if P_FAMILY_HERACROSS -static const union AnimCmd sAnim_Heracross_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(HeracrossMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_HERACROSS - -#if P_FAMILY_SNEASEL -static const union AnimCmd sAnim_Sneasel_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Weavile_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(SneaselHisui); -PLACEHOLDER_ANIM_SINGLE_FRAME(Sneasler); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_SNEASEL - -#if P_FAMILY_TEDDIURSA -static const union AnimCmd sAnim_Teddiursa_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Ursaring_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_GEN_8_CROSS_EVOS -PLACEHOLDER_ANIM_SINGLE_FRAME(Ursaluna); -PLACEHOLDER_ANIM_SINGLE_FRAME(UrsalunaBloodmoon); -#endif //P_GEN_8_CROSS_EVOS -#endif //P_FAMILY_TEDDIURSA - -#if P_FAMILY_SLUGMA -static const union AnimCmd sAnim_Slugma_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Magcargo_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SLUGMA - -#if P_FAMILY_SWINUB -static const union AnimCmd sAnim_Swinub_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Piloswine_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Mamoswine_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_SWINUB - -#if P_FAMILY_CORSOLA -static const union AnimCmd sAnim_Corsola_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(CorsolaGalar); -PLACEHOLDER_ANIM_SINGLE_FRAME(Cursola); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_CORSOLA - -#if P_FAMILY_REMORAID -static const union AnimCmd sAnim_Remoraid_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Octillery_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_REMORAID - -#if P_FAMILY_DELIBIRD -static const union AnimCmd sAnim_Delibird_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_DELIBIRD - -#if P_FAMILY_MANTINE -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Mantyke_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS - -static const union AnimCmd sAnim_Mantine_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 40), - ANIMCMD_END, -}; -#endif //P_FAMILY_MANTINE - -#if P_FAMILY_SKARMORY -static const union AnimCmd sAnim_Skarmory_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_SKARMORY - -#if P_FAMILY_HOUNDOUR -static const union AnimCmd sAnim_Houndour_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Houndoom_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(HoundoomMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_HOUNDOUR - -#if P_FAMILY_PHANPY -static const union AnimCmd sAnim_Phanpy_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Donphan_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_PHANPY - -#if P_FAMILY_STANTLER -static const union AnimCmd sAnim_Stantler_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_GEN_8_CROSS_EVOS -PLACEHOLDER_ANIM_SINGLE_FRAME(Wyrdeer); -#endif //P_GEN_8_CROSS_EVOS -#endif //P_FAMILY_STANTLER - -#if P_FAMILY_SMEARGLE -static const union AnimCmd sAnim_Smeargle_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SMEARGLE - -#if P_FAMILY_MILTANK -static const union AnimCmd sAnim_Miltank_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_FAMILY_MILTANK - -#if P_FAMILY_RAIKOU -static const union AnimCmd sAnim_Raikou_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_RAIKOU - -#if P_FAMILY_ENTEI -static const union AnimCmd sAnim_Entei_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_ENTEI - -#if P_FAMILY_SUICUNE -static const union AnimCmd sAnim_Suicune_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_SUICUNE - -#if P_FAMILY_LARVITAR -static const union AnimCmd sAnim_Larvitar_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Pupitar_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Tyranitar_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(TyranitarMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_LARVITAR - -#if P_FAMILY_LUGIA -static const union AnimCmd sAnim_Lugia_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_LUGIA - -#if P_FAMILY_HO_OH -static const union AnimCmd sAnim_HoOh_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_HO_OH - -#if P_FAMILY_CELEBI -static const union AnimCmd sAnim_Celebi_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_FAMILY_CELEBI - -#if P_FAMILY_TREECKO -static const union AnimCmd sAnim_Treecko_1[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Grovyle_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 6), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Sceptile_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 26), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(SceptileMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_TREECKO - -#if P_FAMILY_TORCHIC -static const union AnimCmd sAnim_Torchic_1[] = -{ - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Combusken_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 12), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Blaziken_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(BlazikenMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_TORCHIC - -#if P_FAMILY_MUDKIP -static const union AnimCmd sAnim_Mudkip_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 13), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Marshtomp_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Swampert_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(SwampertMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MUDKIP - -#if P_FAMILY_POOCHYENA -static const union AnimCmd sAnim_Poochyena_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Mightyena_1[] = -{ - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_END, -}; -#endif //P_FAMILY_POOCHYENA - -#if P_FAMILY_ZIGZAGOON -static const union AnimCmd sAnim_Zigzagoon_1[] = -{ - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Linoone_1[] = -{ - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(ZigzagoonGalar); -PLACEHOLDER_ANIM_SINGLE_FRAME(LinooneGalar); -PLACEHOLDER_ANIM_SINGLE_FRAME(Obstagoon); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_ZIGZAGOON - -#if P_FAMILY_WURMPLE -static const union AnimCmd sAnim_Wurmple_1[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Silcoon_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Beautifly_1[] = -{ - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Cascoon_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Dustox_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_WURMPLE - -#if P_FAMILY_LOTAD -static const union AnimCmd sAnim_Lotad_1[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 55), - ANIMCMD_FRAME(0, 22), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Lombre_1[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Ludicolo_1[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_END, -}; -#endif //P_FAMILY_LOTAD - -#if P_FAMILY_SEEDOT -static const union AnimCmd sAnim_Seedot_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_END, -}; - -static const union AnimCmd sAnim_Nuzleaf_1[] = -{ - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Shiftry_1[] = -{ - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SEEDOT - -#if P_FAMILY_TAILLOW -static const union AnimCmd sAnim_Taillow_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Swellow_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; -#endif //P_FAMILY_TAILLOW - -#if P_FAMILY_WINGULL -static const union AnimCmd sAnim_Wingull_1[] = -{ - ANIMCMD_FRAME(0, 17), - ANIMCMD_FRAME(1, 23), - ANIMCMD_FRAME(0, 13), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Pelipper_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_WINGULL - -#if P_FAMILY_RALTS -static const union AnimCmd sAnim_Ralts_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Kirlia_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 39), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gardevoir_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(GardevoirMega); -#endif //P_MEGA_EVOLUTIONS - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Gallade_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(GalladeMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_RALTS - -#if P_FAMILY_SURSKIT -static const union AnimCmd sAnim_Surskit_1[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Masquerain_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -#endif //P_FAMILY_SURSKIT - -#if P_FAMILY_SHROOMISH -static const union AnimCmd sAnim_Shroomish_1[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Breloom_1[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; -#endif //P_FAMILY_SHROOMISH - -#if P_FAMILY_SLAKOTH -static const union AnimCmd sAnim_Slakoth_1[] = -{ - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Vigoroth_1[] = -{ - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Slaking_1[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_END, -}; -#endif //P_FAMILY_SLAKOTH - -#if P_FAMILY_NINCADA -static const union AnimCmd sAnim_Nincada_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 33), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Ninjask_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 33), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Shedinja_1[] = -{ - ANIMCMD_FRAME(0, 33), - ANIMCMD_FRAME(1, 33), - ANIMCMD_FRAME(0, 33), - ANIMCMD_FRAME(1, 33), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; -#endif //P_FAMILY_NINCADA - -#if P_FAMILY_WHISMUR -static const union AnimCmd sAnim_Whismur_1[] = -{ - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 33), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Loudred_1[] = -{ - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 33), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Exploud_1[] = -{ - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 9), - ANIMCMD_END, -}; -#endif //P_FAMILY_WHISMUR - -#if P_FAMILY_MAKUHITA -static const union AnimCmd sAnim_Makuhita_1[] = -{ - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 22), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Hariyama_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; -#endif //P_FAMILY_MAKUHITA - -#if P_FAMILY_NOSEPASS -static const union AnimCmd sAnim_Nosepass_1[] = -{ - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 27), - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 27), - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 27), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Probopass_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_NOSEPASS - -#if P_FAMILY_SKITTY -static const union AnimCmd sAnim_Skitty_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 9), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Delcatty_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 46), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SKITTY - -#if P_FAMILY_SABLEYE -static const union AnimCmd sAnim_Sableye_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(SableyeMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_SABLEYE - -#if P_FAMILY_MAWILE -static const union AnimCmd sAnim_Mawile_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_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(MawileMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MAWILE - -#if P_FAMILY_ARON -static const union AnimCmd sAnim_Aron_1[] = -{ - ANIMCMD_FRAME(0, 33), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 33), - ANIMCMD_FRAME(1, 33), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Lairon_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 29), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 29), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Aggron_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(AggronMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_ARON - -#if P_FAMILY_MEDITITE -static const union AnimCmd sAnim_Meditite_1[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 22), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Medicham_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(MedichamMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MEDITITE - -#if P_FAMILY_ELECTRIKE -static const union AnimCmd sAnim_Electrike_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 17), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Manectric_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 33), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(ManectricMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_ELECTRIKE - -#if P_FAMILY_PLUSLE -static const union AnimCmd sAnim_Plusle_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_PLUSLE - -#if P_FAMILY_MINUN -static const union AnimCmd sAnim_Minun_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_MINUN - -#if P_FAMILY_VOLBEAT_ILLUMISE -static const union AnimCmd sAnim_Volbeat_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Illumise_1[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; -#endif //P_FAMILY_VOLBEAT_ILLUMISE - -#if P_FAMILY_ROSELIA -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Budew_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS - -static const union AnimCmd sAnim_Roselia_1[] = -{ - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 22), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Roserade_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_ROSELIA - -#if P_FAMILY_GULPIN -static const union AnimCmd sAnim_Gulpin_1[] = -{ - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Swalot_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_FAMILY_GULPIN - -#if P_FAMILY_CARVANHA -static const union AnimCmd sAnim_Carvanha_1[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Sharpedo_1[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 22), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(SharpedoMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_CARVANHA - -#if P_FAMILY_WAILMER -static const union AnimCmd sAnim_Wailmer_1[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Wailord_1[] = -{ - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 48), - ANIMCMD_FRAME(0, 33), - ANIMCMD_END, -}; -#endif //P_FAMILY_WAILMER - -#if P_FAMILY_NUMEL -static const union AnimCmd sAnim_Numel_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 40), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Camerupt_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(CameruptMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_NUMEL - -#if P_FAMILY_TORKOAL -static const union AnimCmd sAnim_Torkoal_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_TORKOAL - -#if P_FAMILY_SPOINK -static const union AnimCmd sAnim_Spoink_1[] = -{ - ANIMCMD_FRAME(0, 5), - 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, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Grumpig_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_SPOINK - -#if P_FAMILY_SPINDA -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, -}; -#endif //P_FAMILY_SPINDA - -#if P_FAMILY_TRAPINCH -static const union AnimCmd sAnim_Trapinch_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Vibrava_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Flygon_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; -#endif //P_FAMILY_TRAPINCH - -#if P_FAMILY_CACNEA -static const union AnimCmd sAnim_Cacnea_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Cacturne_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_CACNEA - -#if P_FAMILY_SWABLU -static const union AnimCmd sAnim_Swablu_1[] = -{ - ANIMCMD_FRAME(0, 1), - 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_END, -}; - -static const union AnimCmd sAnim_Altaria_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(AltariaMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_SWABLU - -#if P_FAMILY_ZANGOOSE -static const union AnimCmd sAnim_Zangoose_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; -#endif //P_FAMILY_ZANGOOSE - -#if P_FAMILY_SEVIPER -static const union AnimCmd sAnim_Seviper_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; -#endif //P_FAMILY_SEVIPER - -#if P_FAMILY_LUNATONE -static const union AnimCmd sAnim_Lunatone_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_LUNATONE - -#if P_FAMILY_SOLROCK -static const union AnimCmd sAnim_Solrock_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_SOLROCK - -#if P_FAMILY_BARBOACH -static const union AnimCmd sAnim_Barboach_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Whiscash_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_BARBOACH - -#if P_FAMILY_CORPHISH -static const union AnimCmd sAnim_Corphish_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Crawdaunt_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_CORPHISH - -#if P_FAMILY_BALTOY -static const union AnimCmd sAnim_Baltoy_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Claydol_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_BALTOY - -#if P_FAMILY_LILEEP -static const union AnimCmd sAnim_Lileep_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Cradily_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_LILEEP - -#if P_FAMILY_ANORITH -static const union AnimCmd sAnim_Anorith_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Armaldo_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_ANORITH - -#if P_FAMILY_FEEBAS -static const union AnimCmd sAnim_Feebas_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Milotic_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_FEEBAS - -#if P_FAMILY_CASTFORM -static const union AnimCmd sAnim_CastformNormal_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_CastformSunny_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_CastformRainy_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, -}; -#endif //P_FAMILY_CASTFORM - -#if P_FAMILY_KECLEON -static const union AnimCmd sAnim_Kecleon_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_KECLEON - -#if P_FAMILY_SHUPPET -static const union AnimCmd sAnim_Shuppet_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Banette_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(BanetteMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_SHUPPET - -#if P_FAMILY_DUSKULL -static const union AnimCmd sAnim_Duskull_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Dusclops_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Dusknoir_1[] = -{ - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_DUSKULL - -#if P_FAMILY_TROPIUS -static const union AnimCmd sAnim_Tropius_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_TROPIUS - -#if P_FAMILY_CHIMECHO -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Chingling_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS - -static const union AnimCmd sAnim_Chimecho_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_CHIMECHO - -#if P_FAMILY_ABSOL -static const union AnimCmd sAnim_Absol_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(AbsolMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_ABSOL - -#if P_FAMILY_SNORUNT -static const union AnimCmd sAnim_Snorunt_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Glalie_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(GlalieMega); -#endif //P_MEGA_EVOLUTIONS - -#if P_GEN_4_CROSS_EVOS -static const union AnimCmd sAnim_Froslass_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_SNORUNT - -#if P_FAMILY_SPHEAL -static const union AnimCmd sAnim_Spheal_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 43), - ANIMCMD_FRAME(1, 60), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Sealeo_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Walrein_1[] = -{ - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_SPHEAL - -#if P_FAMILY_CLAMPERL -static const union AnimCmd sAnim_Clamperl_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Huntail_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gorebyss_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_CLAMPERL - -#if P_FAMILY_RELICANTH -static const union AnimCmd sAnim_Relicanth_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_RELICANTH - -#if P_FAMILY_LUVDISC -static const union AnimCmd sAnim_Luvdisc_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_LUVDISC - -#if P_FAMILY_BAGON -static const union AnimCmd sAnim_Bagon_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Shelgon_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Salamence_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(SalamenceMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_BAGON - -#if P_FAMILY_BELDUM -static const union AnimCmd sAnim_Beldum_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Metang_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Metagross_1[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(MetagrossMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_BELDUM - -#if P_FAMILY_REGIROCK -static const union AnimCmd sAnim_Regirock_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_REGIROCK - -#if P_FAMILY_REGICE -static const union AnimCmd sAnim_Regice_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_REGICE - -#if P_FAMILY_REGISTEEL -static const union AnimCmd sAnim_Registeel_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_REGISTEEL - -#if P_FAMILY_LATIAS -static const union AnimCmd sAnim_Latias_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(LatiasMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_LATIAS - -#if P_FAMILY_LATIOS -static const union AnimCmd sAnim_Latios_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(LatiosMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_LATIOS - -#if P_FAMILY_KYOGRE -static const union AnimCmd sAnim_Kyogre_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_PRIMAL_REVERSIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(KyogrePrimal); -#endif //P_PRIMAL_REVERSIONS -#endif //P_FAMILY_KYOGRE - -#if P_FAMILY_GROUDON -static const union AnimCmd sAnim_Groudon_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_PRIMAL_REVERSIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(GroudonPrimal); -#endif //P_PRIMAL_REVERSIONS -#endif //P_FAMILY_GROUDON - -#if P_FAMILY_RAYQUAZA -static const union AnimCmd sAnim_Rayquaza_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(RayquazaMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_RAYQUAZA - -#if P_FAMILY_JIRACHI -static const union AnimCmd sAnim_Jirachi_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_JIRACHI - -#if P_FAMILY_DEOXYS -static const union AnimCmd sAnim_DeoxysNormal_1[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(1, 26), - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_DeoxysAttack_1[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_DeoxysDefense_1[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_DeoxysSpeed_1[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; -#endif //P_FAMILY_DEOXYS - -#if P_FAMILY_TURTWIG -static const union AnimCmd sAnim_Turtwig_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Grotle_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Torterra_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_TURTWIG - -#if P_FAMILY_CHIMCHAR -static const union AnimCmd sAnim_Chimchar_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Monferno_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Infernape_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_CHIMCHAR - -#if P_FAMILY_PIPLUP -static const union AnimCmd sAnim_Piplup_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Prinplup_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 50), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Empoleon_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_PIPLUP - -#if P_FAMILY_STARLY -static const union AnimCmd sAnim_Starly_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Staravia_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Staraptor_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_STARLY - -#if P_FAMILY_BIDOOF -static const union AnimCmd sAnim_Bidoof_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Bibarel_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_BIDOOF - -#if P_FAMILY_KRICKETOT -static const union AnimCmd sAnim_Kricketot_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Kricketune_1[] = -{ - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 27), - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 27), - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 27), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; -#endif //P_FAMILY_KRICKETOT - -#if P_FAMILY_SHINX -static const union AnimCmd sAnim_Shinx_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Luxio_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Luxray_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_SHINX - -#if P_FAMILY_CRANIDOS -static const union AnimCmd sAnim_Cranidos_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Rampardos_1[] = -{ - ANIMCMD_FRAME(0, 50), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_CRANIDOS - -#if P_FAMILY_SHIELDON -static const union AnimCmd sAnim_Shieldon_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Bastiodon_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_FAMILY_SHIELDON - -#if P_FAMILY_BURMY -static const union AnimCmd sAnim_Burmy_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Wormadam_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Mothim_1[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_BURMY - -#if P_FAMILY_COMBEE -static const union AnimCmd sAnim_Combee_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Vespiquen_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_FRAME(1, 12), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -#endif //P_FAMILY_COMBEE - -#if P_FAMILY_PACHIRISU -static const union AnimCmd sAnim_Pachirisu_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 50), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_PACHIRISU - -#if P_FAMILY_BUIZEL -static const union AnimCmd sAnim_Buizel_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Floatzel_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 28), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_BUIZEL - -#if P_FAMILY_CHERUBI -static const union AnimCmd sAnim_Cherubi_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 50), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_CherrimOvercast_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_CherrimSunshine_1[] = -{ - 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, -}; -#endif //P_FAMILY_CHERUBI - -#if P_FAMILY_SHELLOS -static const union AnimCmd sAnim_Shellos_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gastrodon_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_SHELLOS - -#if P_FAMILY_DRIFLOON -static const union AnimCmd sAnim_Drifloon_1[] = -{ - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Drifblim_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_DRIFLOON - -#if P_FAMILY_BUNEARY -static const union AnimCmd sAnim_Buneary_1[] = -{ - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Lopunny_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(LopunnyMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_BUNEARY - -#if P_FAMILY_GLAMEOW -static const union AnimCmd sAnim_Glameow_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Purugly_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; -#endif //P_FAMILY_GLAMEOW - -#if P_FAMILY_STUNKY -static const union AnimCmd sAnim_Stunky_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Skuntank_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_STUNKY - -#if P_FAMILY_BRONZOR -static const union AnimCmd sAnim_Bronzor_1[] = -{ - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Bronzong_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_BRONZOR - -#if P_FAMILY_CHATOT -static const union AnimCmd sAnim_Chatot_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_CHATOT - -#if P_FAMILY_SPIRITOMB -static const union AnimCmd sAnim_Spiritomb_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SPIRITOMB - -#if P_FAMILY_GIBLE -static const union AnimCmd sAnim_Gible_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gabite_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Garchomp_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(GarchompMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_GIBLE - -#if P_FAMILY_RIOLU -static const union AnimCmd sAnim_Riolu_1[] = -{ - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 28), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Lucario_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(LucarioMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_RIOLU - -#if P_FAMILY_HIPPOPOTAS -static const union AnimCmd sAnim_Hippopotas_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Hippowdon_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_HIPPOPOTAS - -#if P_FAMILY_SKORUPI -static const union AnimCmd sAnim_Skorupi_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Drapion_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_SKORUPI - -#if P_FAMILY_CROAGUNK -static const union AnimCmd sAnim_Croagunk_1[] = -{ - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 28), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Toxicroak_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_CROAGUNK - -#if P_FAMILY_CARNIVINE -static const union AnimCmd sAnim_Carnivine_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_CARNIVINE - -#if P_FAMILY_FINNEON -static const union AnimCmd sAnim_Finneon_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Lumineon_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -#endif //P_FAMILY_FINNEON - -#if P_FAMILY_SNOVER -static const union AnimCmd sAnim_Snover_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Abomasnow_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(AbomasnowMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_SNOVER - -#if P_FAMILY_ROTOM -static const union AnimCmd sAnim_Rotom_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_RotomHeat_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_RotomWash_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_RotomFrost_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_RotomFan_1[] = -{ - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 3), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_RotomMow_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_ROTOM - -#if P_FAMILY_UXIE -static const union AnimCmd sAnim_Uxie_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_UXIE - -#if P_FAMILY_MESPRIT -static const union AnimCmd sAnim_Mesprit_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_MESPRIT - -#if P_FAMILY_AZELF -static const union AnimCmd sAnim_Azelf_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_AZELF - -#if P_FAMILY_DIALGA -static const union AnimCmd sAnim_Dialga_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -PLACEHOLDER_ANIM_SINGLE_FRAME(DialgaOrigin); -#endif //P_FAMILY_DIALGA - -#if P_FAMILY_PALKIA -static const union AnimCmd sAnim_Palkia_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -PLACEHOLDER_ANIM_SINGLE_FRAME(PalkiaOrigin); -#endif //P_FAMILY_PALKIA - -#if P_FAMILY_HEATRAN -static const union AnimCmd sAnim_Heatran_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_HEATRAN - -#if P_FAMILY_REGIGIGAS -static const union AnimCmd sAnim_Regigigas_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_REGIGIGAS - -#if P_FAMILY_GIRATINA -static const union AnimCmd sAnim_GiratinaAltered_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_GiratinaOrigin_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_GIRATINA - -#if P_FAMILY_CRESSELIA -static const union AnimCmd sAnim_Cresselia_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_CRESSELIA - -#if P_FAMILY_MANAPHY -static const union AnimCmd sAnim_Phione_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Manaphy_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_MANAPHY - -#if P_FAMILY_DARKRAI -static const union AnimCmd sAnim_Darkrai_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_DARKRAI - -#if P_FAMILY_SHAYMIN -static const union AnimCmd sAnim_ShayminLand_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_ShayminSky_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SHAYMIN - -#if P_FAMILY_ARCEUS -static const union AnimCmd sAnim_Arceus_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_ARCEUS - -#if P_FAMILY_VICTINI -static const union AnimCmd sAnim_Victini_1[] = -{ - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 46), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_VICTINI - -#if P_FAMILY_SNIVY -static const union AnimCmd sAnim_Snivy_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Servine_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Serperior_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SNIVY - -#if P_FAMILY_TEPIG -static const union AnimCmd sAnim_Tepig_1[] = -{ - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Pignite_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Emboar_1[] = -{ - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; -#endif //P_FAMILY_TEPIG - -#if P_FAMILY_OSHAWOTT -static const union AnimCmd sAnim_Oshawott_1[] = -{ - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Dewott_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 28), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Samurott_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(SamurottHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_OSHAWOTT - -#if P_FAMILY_PATRAT -static const union AnimCmd sAnim_Patrat_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Watchog_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0 , 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; -#endif //P_FAMILY_PATRAT - -#if P_FAMILY_LILLIPUP -static const union AnimCmd sAnim_Lillipup_1[] = -{ - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Herdier_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Stoutland_1[] = -{ - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_LILLIPUP - -#if P_FAMILY_PURRLOIN -static const union AnimCmd sAnim_Purrloin_1[] = -{ - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(1, 54), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Liepard_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_PURRLOIN - -#if P_FAMILY_PANSAGE -static const union AnimCmd sAnim_Pansage_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 13), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Simisage_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_PANSAGE - -#if P_FAMILY_PANSEAR -static const union AnimCmd sAnim_Pansear_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Simisear_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_PANSEAR - -#if P_FAMILY_PANPOUR -static const union AnimCmd sAnim_Panpour_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Simipour_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_PANPOUR - -#if P_FAMILY_MUNNA -static const union AnimCmd sAnim_Munna_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Musharna_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_MUNNA - -#if P_FAMILY_PIDOVE -static const union AnimCmd sAnim_Pidove_1[] = -{ - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 46), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Tranquill_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Unfezant_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_PIDOVE - -#if P_FAMILY_BLITZLE -static const union AnimCmd sAnim_Blitzle_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Zebstrika_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_FAMILY_BLITZLE - -#if P_FAMILY_ROGGENROLA -static const union AnimCmd sAnim_Roggenrola_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Boldore_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gigalith_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_ROGGENROLA - -#if P_FAMILY_WOOBAT -static const union AnimCmd sAnim_Woobat_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Swoobat_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_WOOBAT - -#if P_FAMILY_DRILBUR -static const union AnimCmd sAnim_Drilbur_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Excadrill_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_DRILBUR - -#if P_FAMILY_AUDINO -static const union AnimCmd sAnim_Audino_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(AudinoMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_AUDINO - -#if P_FAMILY_TIMBURR -static const union AnimCmd sAnim_Timburr_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gurdurr_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Conkeldurr_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_TIMBURR - -#if P_FAMILY_TYMPOLE -static const union AnimCmd sAnim_Tympole_1[] = -{ - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Palpitoad_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 13), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Seismitoad_1[] = -{ - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; -#endif //P_FAMILY_TYMPOLE - -#if P_FAMILY_THROH -static const union AnimCmd sAnim_Throh_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_THROH - -#if P_FAMILY_SAWK -static const union AnimCmd sAnim_Sawk_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SAWK - -#if P_FAMILY_SEWADDLE -static const union AnimCmd sAnim_Sewaddle_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Swadloon_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Leavanny_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_SEWADDLE - -#if P_FAMILY_VENIPEDE -static const union AnimCmd sAnim_Venipede_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Whirlipede_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Scolipede_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_VENIPEDE - -#if P_FAMILY_COTTONEE -static const union AnimCmd sAnim_Cottonee_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 50), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Whimsicott_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_COTTONEE - -#if P_FAMILY_PETILIL -static const union AnimCmd sAnim_Petilil_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Lilligant_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(LilligantHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_PETILIL - -#if P_FAMILY_BASCULIN -static const union AnimCmd sAnim_Basculin_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(Basculegion); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_BASCULIN - -#if P_FAMILY_SANDILE -static const union AnimCmd sAnim_Sandile_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Krokorok_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Krookodile_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SANDILE - -#if P_FAMILY_DARUMAKA -static const union AnimCmd sAnim_Darumaka_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_DarmanitanStandard_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_DarmanitanZen_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(DarumakaGalar); -PLACEHOLDER_ANIM_SINGLE_FRAME(DarmanitanGalarStandard); -PLACEHOLDER_ANIM_SINGLE_FRAME(DarmanitanGalarZen); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_DARUMAKA - -#if P_FAMILY_MARACTUS -static const union AnimCmd sAnim_Maractus_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_END, -}; -#endif //P_FAMILY_MARACTUS - -#if P_FAMILY_DWEBBLE -static const union AnimCmd sAnim_Dwebble_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 50), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Crustle_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_DWEBBLE - -#if P_FAMILY_SCRAGGY -static const union AnimCmd sAnim_Scraggy_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Scrafty_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SCRAGGY - -#if P_FAMILY_SIGILYPH -static const union AnimCmd sAnim_Sigilyph_1[] = -{ - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 7), - ANIMCMD_END, -}; -#endif //P_FAMILY_SIGILYPH - -#if P_FAMILY_YAMASK -static const union AnimCmd sAnim_Yamask_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Cofagrigus_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(YamaskGalar); -PLACEHOLDER_ANIM_SINGLE_FRAME(Runerigus); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_YAMASK - -#if P_FAMILY_TIRTOUGA -static const union AnimCmd sAnim_Tirtouga_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Carracosta_1[] = -{ - ANIMCMD_FRAME(1, 35), - 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_END, -}; -#endif //P_FAMILY_TIRTOUGA - -#if P_FAMILY_ARCHEN -static const union AnimCmd sAnim_Archen_1[] = -{ - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 46), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Archeops_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_ARCHEN - -#if P_FAMILY_TRUBBISH -static const union AnimCmd sAnim_Trubbish_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Garbodor_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(GarbodorGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_TRUBBISH - -#if P_FAMILY_ZORUA -static const union AnimCmd sAnim_Zorua_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Zoroark_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(ZoruaHisui); -PLACEHOLDER_ANIM_SINGLE_FRAME(ZoroarkHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_ZORUA - -#if P_FAMILY_MINCCINO -static const union AnimCmd sAnim_Minccino_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Cinccino_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_MINCCINO - -#if P_FAMILY_GOTHITA -static const union AnimCmd sAnim_Gothita_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gothorita_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gothitelle_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_GOTHITA - -#if P_FAMILY_SOLOSIS -static const union AnimCmd sAnim_Solosis_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Duosion_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Reuniclus_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SOLOSIS - -#if P_FAMILY_DUCKLETT -static const union AnimCmd sAnim_Ducklett_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Swanna_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_DUCKLETT - -#if P_FAMILY_VANILLITE -static const union AnimCmd sAnim_Vanillite_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Vanillish_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Vanilluxe_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_VANILLITE - -#if P_FAMILY_DEERLING -static const union AnimCmd sAnim_Deerling_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Sawsbuck_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_DEERLING - -#if P_FAMILY_EMOLGA -static const union AnimCmd sAnim_Emolga_1[] = -{ - ANIMCMD_FRAME(0, 21), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_EMOLGA - -#if P_FAMILY_KARRABLAST -static const union AnimCmd sAnim_Karrablast_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Escavalier_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_FAMILY_KARRABLAST - -#if P_FAMILY_FOONGUS -static const union AnimCmd sAnim_Foongus_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Amoonguss_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -#endif //P_FAMILY_FOONGUS - -#if P_FAMILY_FRILLISH -static const union AnimCmd sAnim_Frillish_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Jellicent_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -#endif //P_FAMILY_FRILLISH - -#if P_FAMILY_ALOMOMOLA -static const union AnimCmd sAnim_Alomomola_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_ALOMOMOLA - -#if P_FAMILY_JOLTIK -static const union AnimCmd sAnim_Joltik_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Galvantula_1[] = -{ - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_END, -}; -#endif //P_FAMILY_JOLTIK - -#if P_FAMILY_FERROSEED -static const union AnimCmd sAnim_Ferroseed_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 28), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Ferrothorn_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_FERROSEED - -#if P_FAMILY_KLINK -static const union AnimCmd sAnim_Klink_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Klang_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Klinklang_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_KLINK - -#if P_FAMILY_TYNAMO -static const union AnimCmd sAnim_Tynamo_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Eelektrik_1[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Eelektross_1[] = -{ - ANIMCMD_FRAME(1, 27), - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 24), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 27), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_TYNAMO - -#if P_FAMILY_ELGYEM -static const union AnimCmd sAnim_Elgyem_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Beheeyem_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_ELGYEM - -#if P_FAMILY_LITWICK -static const union AnimCmd sAnim_Litwick_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Lampent_1[] = -{ - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Chandelure_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_LITWICK - -#if P_FAMILY_AXEW -static const union AnimCmd sAnim_Axew_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Fraxure_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Haxorus_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_AXEW - -#if P_FAMILY_CUBCHOO -static const union AnimCmd sAnim_Cubchoo_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Beartic_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_CUBCHOO - -#if P_FAMILY_CRYOGONAL -static const union AnimCmd sAnim_Cryogonal_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 48), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_CRYOGONAL - -#if P_FAMILY_SHELMET -static const union AnimCmd sAnim_Shelmet_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Accelgor_1[] = -{ - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_SHELMET - -#if P_FAMILY_STUNFISK -static const union AnimCmd sAnim_Stunfisk_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -#if P_GALARIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(StunfiskGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_STUNFISK - -#if P_FAMILY_MIENFOO -static const union AnimCmd sAnim_Mienfoo_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Mienshao_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; -#endif //P_FAMILY_MIENFOO - -#if P_FAMILY_DRUDDIGON -static const union AnimCmd sAnim_Druddigon_1[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; -#endif //P_FAMILY_DRUDDIGON - -#if P_FAMILY_GOLETT -static const union AnimCmd sAnim_Golett_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Golurk_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_GOLETT - -#if P_FAMILY_PAWNIARD -static const union AnimCmd sAnim_Pawniard_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Bisharp_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -#if P_GEN_9_CROSS_EVOS -PLACEHOLDER_ANIM_SINGLE_FRAME(Kingambit); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_PAWNIARD - -#if P_FAMILY_BOUFFALANT -static const union AnimCmd sAnim_Bouffalant_1[] = -{ - ANIMCMD_FRAME(0, 28), - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_BOUFFALANT - -#if P_FAMILY_RUFFLET -static const union AnimCmd sAnim_Rufflet_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Braviary_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(BraviaryHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_RUFFLET - -#if P_FAMILY_VULLABY -static const union AnimCmd sAnim_Vullaby_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Mandibuzz_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_VULLABY - -#if P_FAMILY_HEATMOR -static const union AnimCmd sAnim_Heatmor_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_HEATMOR - -#if P_FAMILY_DURANT -static const union AnimCmd sAnim_Durant_1[] = -{ - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_END, -}; -#endif //P_FAMILY_DURANT - -#if P_FAMILY_DEINO -static const union AnimCmd sAnim_Deino_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Zweilous_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Hydreigon_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_DEINO - -#if P_FAMILY_LARVESTA -static const union AnimCmd sAnim_Larvesta_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Volcarona_1[] = -{ - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_END, -}; -#endif //P_FAMILY_LARVESTA - -#if P_FAMILY_COBALION -static const union AnimCmd sAnim_Cobalion_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_COBALION - -#if P_FAMILY_TERRAKION -static const union AnimCmd sAnim_Terrakion_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_TERRAKION - -#if P_FAMILY_VIRIZION -static const union AnimCmd sAnim_Virizion_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_VIRIZION - -#if P_FAMILY_TORNADUS -static const union AnimCmd sAnim_TornadusIncarnate_1[] = -{ - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_TornadusTherian_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_TORNADUS - -#if P_FAMILY_THUNDURUS -static const union AnimCmd sAnim_ThundurusIncarnate_1[] = -{ - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_ThundurusTherian_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_THUNDURUS - -#if P_FAMILY_RESHIRAM -static const union AnimCmd sAnim_Reshiram_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_RESHIRAM - -#if P_FAMILY_ZEKROM -static const union AnimCmd sAnim_Zekrom_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_ZEKROM - -#if P_FAMILY_LANDORUS -static const union AnimCmd sAnim_LandorusIncarnate_1[] = -{ - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_LandorusTherian_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_LANDORUS - -#if P_FAMILY_KYUREM -static const union AnimCmd sAnim_Kyurem_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_FUSION_FORMS -static const union AnimCmd sAnim_KyuremWhite_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FUSION_FORMS - -#if P_FUSION_FORMS -static const union AnimCmd sAnim_KyuremBlack_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FUSION_FORMS -#endif //P_FAMILY_KYUREM - -#if P_FAMILY_KELDEO -static const union AnimCmd sAnim_KeldeoOrdinary_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_KeldeoResolute_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_KELDEO - -#if P_FAMILY_MELOETTA -static const union AnimCmd sAnim_MeloettaAria_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_MeloettaPirouette_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_MELOETTA - -#if P_FAMILY_GENESECT -static const union AnimCmd sAnim_Genesect_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_GENESECT - -#if P_FAMILY_CHESPIN -static const union AnimCmd sAnim_Chespin_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 24), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 24), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Quilladin_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Chesnaught_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_CHESPIN - -#if P_FAMILY_FENNEKIN -static const union AnimCmd sAnim_Fennekin_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Braixen_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Delphox_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_FENNEKIN - -#if P_FAMILY_FROAKIE -static const union AnimCmd sAnim_Froakie_1[] = -{ - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 13), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 11), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Frogadier_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Greninja_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_GreninjaAsh_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_FROAKIE - -#if P_FAMILY_BUNNELBY -static const union AnimCmd sAnim_Bunnelby_1[] = -{ - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Diggersby_1[] = -{ - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_BUNNELBY - -#if P_FAMILY_FLETCHLING -static const union AnimCmd sAnim_Fletchling_1[] = -{ - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 7), - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -static const union AnimCmd sAnim_Fletchinder_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Talonflame_1[] = -{ - ANIMCMD_FRAME(1, 55), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_FLETCHLING - -#if P_FAMILY_SCATTERBUG -static const union AnimCmd sAnim_Scatterbug_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Spewpa_1[] = -{ - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Vivillon_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; -#endif //P_FAMILY_SCATTERBUG - -#if P_FAMILY_LITLEO -static const union AnimCmd sAnim_Litleo_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Pyroar_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_LITLEO - -#if P_FAMILY_FLABEBE -static const union AnimCmd sAnim_Flabebe_1[] = -{ - ANIMCMD_FRAME(1, 27), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 23), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Floette_1[] = -{ - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Florges_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_FLABEBE - -#if P_FAMILY_SKIDDO -static const union AnimCmd sAnim_Skiddo_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gogoat_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 36), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_SKIDDO - -#if P_FAMILY_PANCHAM -static const union AnimCmd sAnim_Pancham_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Pangoro_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_PANCHAM - -#if P_FAMILY_FURFROU -static const union AnimCmd sAnim_Furfrou_1[] = -{ - ANIMCMD_FRAME(0, 27), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_FURFROU - -#if P_FAMILY_ESPURR -static const union AnimCmd sAnim_Espurr_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Meowstic_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_ESPURR - -#if P_FAMILY_HONEDGE -static const union AnimCmd sAnim_Honedge_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Doublade_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_AegislashShield_1[] = -{ - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_AegislashBlade_1[] = -{ - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_HONEDGE - -#if P_FAMILY_SPRITZEE -static const union AnimCmd sAnim_Spritzee_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Aromatisse_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_FAMILY_SPRITZEE - -#if P_FAMILY_SWIRLIX -static const union AnimCmd sAnim_Swirlix_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_END, -}; - -static const union AnimCmd sAnim_Slurpuff_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_SWIRLIX - -#if P_FAMILY_INKAY -static const union AnimCmd sAnim_Inkay_1[] = -{ - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 25), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Malamar_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_INKAY - -#if P_FAMILY_BINACLE -static const union AnimCmd sAnim_Binacle_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Barbaracle_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_BINACLE - -#if P_FAMILY_SKRELP -static const union AnimCmd sAnim_Skrelp_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Dragalge_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_SKRELP - -#if P_FAMILY_CLAUNCHER -static const union AnimCmd sAnim_Clauncher_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Clawitzer_1[] = -{ - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(0, 6), - ANIMCMD_END, -}; -#endif //P_FAMILY_CLAUNCHER - -#if P_FAMILY_HELIOPTILE -static const union AnimCmd sAnim_Helioptile_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Heliolisk_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -#endif //P_FAMILY_HELIOPTILE - -#if P_FAMILY_TYRUNT -static const union AnimCmd sAnim_Tyrunt_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Tyrantrum_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_TYRUNT - -#if P_FAMILY_AMAURA -static const union AnimCmd sAnim_Amaura_1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 11), - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 5), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Aurorus_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_AMAURA - -#if P_FAMILY_HAWLUCHA -static const union AnimCmd sAnim_Hawlucha_1[] = -{ - ANIMCMD_FRAME(0, 28), - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_HAWLUCHA - -#if P_FAMILY_DEDENNE -static const union AnimCmd sAnim_Dedenne_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_DEDENNE - -#if P_FAMILY_CARBINK -static const union AnimCmd sAnim_Carbink_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_CARBINK - -#if P_FAMILY_GOOMY -static const union AnimCmd sAnim_Goomy_1[] = -{ - ANIMCMD_FRAME(0, 28), - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Sliggoo_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Goodra_1[] = -{ - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 18), - ANIMCMD_FRAME(1, 18), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(SliggooHisui); -PLACEHOLDER_ANIM_SINGLE_FRAME(GoodraHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_GOOMY - -#if P_FAMILY_KLEFKI -static const union AnimCmd sAnim_Klefki_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_KLEFKI - -#if P_FAMILY_PHANTUMP -static const union AnimCmd sAnim_Phantump_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Trevenant_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_PHANTUMP - -#if P_FAMILY_PUMPKABOO -static const union AnimCmd sAnim_Pumpkaboo_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Gourgeist_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_PUMPKABOO - -#if P_FAMILY_BERGMITE -static const union AnimCmd sAnim_Bergmite_1[] = -{ - ANIMCMD_FRAME(0, 11), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Avalugg_1[] = -{ - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(AvaluggHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_BERGMITE - -#if P_FAMILY_NOIBAT -static const union AnimCmd sAnim_Noibat_1[] = -{ - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Noivern_1[] = -{ - ANIMCMD_FRAME(1, 32), - ANIMCMD_FRAME(0, 20), - ANIMCMD_END, -}; -#endif //P_FAMILY_NOIBAT - -#if P_FAMILY_XERNEAS -static const union AnimCmd sAnim_Xerneas_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_XERNEAS - -#if P_FAMILY_YVELTAL -static const union AnimCmd sAnim_Yveltal_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_YVELTAL - -#if P_FAMILY_ZYGARDE -static const union AnimCmd sAnim_Zygarde50_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Zygarde10_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_ZygardeComplete_1[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 15), - ANIMCMD_END, -}; -#endif //P_FAMILY_ZYGARDE - -#if P_FAMILY_DIANCIE -static const union AnimCmd sAnim_Diancie_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -#if P_MEGA_EVOLUTIONS -PLACEHOLDER_ANIM_SINGLE_FRAME(DiancieMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_DIANCIE - -#if P_FAMILY_HOOPA -static const union AnimCmd sAnim_HoopaConfined_1[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_HoopaUnbound_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_HOOPA - -#if P_FAMILY_VOLCANION -static const union AnimCmd sAnim_Volcanion_1[] = -{ - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_VOLCANION - -#if P_FAMILY_ROWLET -static const union AnimCmd sAnim_Rowlet_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Dartrix_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Decidueye_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -#if P_HISUIAN_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(DecidueyeHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_ROWLET - -#if P_FAMILY_LITTEN -PLACEHOLDER_ANIM_SINGLE_FRAME(Litten); -PLACEHOLDER_ANIM_SINGLE_FRAME(Torracat); -PLACEHOLDER_ANIM_SINGLE_FRAME(Incineroar); -#endif //P_FAMILY_LITTEN - -#if P_FAMILY_POPPLIO -PLACEHOLDER_ANIM_SINGLE_FRAME(Popplio); -PLACEHOLDER_ANIM_SINGLE_FRAME(Brionne); -PLACEHOLDER_ANIM_SINGLE_FRAME(Primarina); -#endif //P_FAMILY_POPPLIO - -#if P_FAMILY_PIKIPEK -static const union AnimCmd sAnim_Pikipek_1[] = -{ - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Trumbeak_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Toucannon_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_PIKIPEK - -#if P_FAMILY_YUNGOOS -PLACEHOLDER_ANIM_SINGLE_FRAME(Yungoos); -PLACEHOLDER_ANIM_SINGLE_FRAME(Gumshoos); -#endif //P_FAMILY_YUNGOOS - -#if P_FAMILY_GRUBBIN -static const union AnimCmd sAnim_Grubbin_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Charjabug_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Vikavolt_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, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_GRUBBIN - -#if P_FAMILY_CRABRAWLER -PLACEHOLDER_ANIM_SINGLE_FRAME(Crabrawler); -PLACEHOLDER_ANIM_SINGLE_FRAME(Crabominable); -#endif //P_FAMILY_CRABRAWLER - -#if P_FAMILY_ORICORIO -PLACEHOLDER_ANIM_SINGLE_FRAME(Oricorio); -#endif //P_FAMILY_ORICORIO - -#if P_FAMILY_CUTIEFLY -static const union AnimCmd sAnim_Cutiefly_1[] = -{ - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 35), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 1), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Ribombee_1[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -#endif //P_FAMILY_CUTIEFLY - -#if P_FAMILY_ROCKRUFF -static const union AnimCmd sAnim_Rockruff_1[] = -{ - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_LycanrocMidday_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_LycanrocMidnight_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_LycanrocDusk_1[] = -{ - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_ROCKRUFF - -#if P_FAMILY_WISHIWASHI -PLACEHOLDER_ANIM_SINGLE_FRAME(WishiwashiSolo); -PLACEHOLDER_ANIM_SINGLE_FRAME(WishiwashiSchool); -#endif //P_FAMILY_WISHIWASHI - -#if P_FAMILY_MAREANIE -PLACEHOLDER_ANIM_SINGLE_FRAME(Mareanie); -PLACEHOLDER_ANIM_SINGLE_FRAME(Toxapex); -#endif //P_FAMILY_MAREANIE - -#if P_FAMILY_MUDBRAY -PLACEHOLDER_ANIM_SINGLE_FRAME(Mudbray); -PLACEHOLDER_ANIM_SINGLE_FRAME(Mudsdale); -#endif //P_FAMILY_MUDBRAY - -#if P_FAMILY_DEWPIDER -static const union AnimCmd sAnim_Dewpider_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 9), - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 9), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Araquanid_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 45), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_DEWPIDER - -#if P_FAMILY_FOMANTIS -PLACEHOLDER_ANIM_SINGLE_FRAME(Fomantis); -PLACEHOLDER_ANIM_SINGLE_FRAME(Lurantis); -#endif //P_FAMILY_FOMANTIS - -#if P_FAMILY_MORELULL -PLACEHOLDER_ANIM_SINGLE_FRAME(Morelull); -PLACEHOLDER_ANIM_SINGLE_FRAME(Shiinotic); -#endif //P_FAMILY_MORELULL - -#if P_FAMILY_SALANDIT -static const union AnimCmd sAnim_Salandit_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Salazzle_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_SALANDIT - -#if P_FAMILY_STUFFUL -static const union AnimCmd sAnim_Stufful_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Bewear_1[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 60), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_STUFFUL - -#if P_FAMILY_BOUNSWEET -PLACEHOLDER_ANIM_SINGLE_FRAME(Bounsweet); -PLACEHOLDER_ANIM_SINGLE_FRAME(Steenee); -PLACEHOLDER_ANIM_SINGLE_FRAME(Tsareena); -#endif //P_FAMILY_BOUNSWEET - -#if P_FAMILY_COMFEY -PLACEHOLDER_ANIM_SINGLE_FRAME(Comfey); -#endif //P_FAMILY_COMFEY - -#if P_FAMILY_ORANGURU -static const union AnimCmd sAnim_Oranguru_1[] = -{ - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_ORANGURU - -#if P_FAMILY_PASSIMIAN -static const union AnimCmd sAnim_Passimian_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_PASSIMIAN - -#if P_FAMILY_WIMPOD -static const union AnimCmd sAnim_Wimpod_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Golisopod_1[] = -{ - ANIMCMD_FRAME(0, 25), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_WIMPOD - -#if P_FAMILY_SANDYGAST -PLACEHOLDER_ANIM_SINGLE_FRAME(Sandygast); -PLACEHOLDER_ANIM_SINGLE_FRAME(Palossand); -#endif //P_FAMILY_SANDYGAST - -#if P_FAMILY_PYUKUMUKU -static const union AnimCmd sAnim_Pyukumuku_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_PYUKUMUKU - -#if P_FAMILY_TYPE_NULL -PLACEHOLDER_ANIM_SINGLE_FRAME(TypeNull); -PLACEHOLDER_ANIM_SINGLE_FRAME(Silvally); -#endif //P_FAMILY_TYPE_NULL - -#if P_FAMILY_MINIOR -PLACEHOLDER_ANIM_SINGLE_FRAME(MiniorMeteor); -PLACEHOLDER_ANIM_SINGLE_FRAME(MiniorCore); -#endif //P_FAMILY_MINIOR - -#if P_FAMILY_KOMALA -PLACEHOLDER_ANIM_SINGLE_FRAME(Komala); -#endif //P_FAMILY_KOMALA - -#if P_FAMILY_TURTONATOR -static const union AnimCmd sAnim_Turtonator_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 44), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_TURTONATOR - -#if P_FAMILY_TOGEDEMARU -static const union AnimCmd sAnim_Togedemaru_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; -#endif //P_FAMILY_TOGEDEMARU - -#if P_FAMILY_MIMIKYU -PLACEHOLDER_ANIM_SINGLE_FRAME(MimikyuDisguised); -PLACEHOLDER_ANIM_SINGLE_FRAME(MimikyuBusted); -#endif //P_FAMILY_MIMIKYU - -#if P_FAMILY_BRUXISH -PLACEHOLDER_ANIM_SINGLE_FRAME(Bruxish); -#endif //P_FAMILY_BRUXISH - -#if P_FAMILY_DRAMPA -static const union AnimCmd sAnim_Drampa_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 50), - ANIMCMD_END, -}; -#endif //P_FAMILY_DRAMPA - -#if P_FAMILY_DHELMISE -PLACEHOLDER_ANIM_SINGLE_FRAME(Dhelmise); -#endif //P_FAMILY_DHELMISE - -#if P_FAMILY_JANGMO_O -static const union AnimCmd sAnim_Jangmo_O_1[] = -{ - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Hakamo_O_1[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Kommo_O_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_JANGMO_O - -#if P_FAMILY_TAPU_KOKO -static const union AnimCmd sAnim_TapuKoko_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_TAPU_KOKO - -#if P_FAMILY_TAPU_LELE -static const union AnimCmd sAnim_TapuLele_1[] = -{ - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_TAPU_LELE - -#if P_FAMILY_TAPU_BULU -static const union AnimCmd sAnim_TapuBulu_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 40), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_TAPU_BULU - -#if P_FAMILY_TAPU_FINI -static const union AnimCmd sAnim_TapuFini_1[] = -{ - ANIMCMD_FRAME(1, 60), - ANIMCMD_FRAME(1, 60), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -#endif //P_FAMILY_TAPU_FINI - -#if P_FAMILY_COSMOG -PLACEHOLDER_ANIM_SINGLE_FRAME(Cosmog); -PLACEHOLDER_ANIM_SINGLE_FRAME(Cosmoem); -PLACEHOLDER_ANIM_SINGLE_FRAME(Solgaleo); -PLACEHOLDER_ANIM_SINGLE_FRAME(Lunala); -#endif //P_FAMILY_COSMOG - -#if P_FAMILY_NIHILEGO -PLACEHOLDER_ANIM_SINGLE_FRAME(Nihilego); -#endif //P_FAMILY_NIHILEGO - -#if P_FAMILY_BUZZWOLE -PLACEHOLDER_ANIM_SINGLE_FRAME(Buzzwole); -#endif //P_FAMILY_BUZZWOLE - -#if P_FAMILY_PHEROMOSA -PLACEHOLDER_ANIM_SINGLE_FRAME(Pheromosa); -#endif //P_FAMILY_PHEROMOSA - -#if P_FAMILY_XURKITREE -PLACEHOLDER_ANIM_SINGLE_FRAME(Xurkitree); -#endif //P_FAMILY_XURKITREE - -#if P_FAMILY_CELESTEELA -PLACEHOLDER_ANIM_SINGLE_FRAME(Celesteela); -#endif //P_FAMILY_CELESTEELA - -#if P_FAMILY_KARTANA -PLACEHOLDER_ANIM_SINGLE_FRAME(Kartana); -#endif //P_FAMILY_KARTANA - -#if P_FAMILY_GUZZLORD -PLACEHOLDER_ANIM_SINGLE_FRAME(Guzzlord); -#endif //P_FAMILY_GUZZLORD - -#if P_FAMILY_NECROZMA -PLACEHOLDER_ANIM_SINGLE_FRAME(Necrozma); -#endif //P_FAMILY_NECROZMA - -#if P_FAMILY_MAGEARNA -PLACEHOLDER_ANIM_SINGLE_FRAME(Magearna); -#endif //P_FAMILY_MAGEARNA - -#if P_FAMILY_MARSHADOW -static const union AnimCmd sAnim_Marshadow_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 54), - ANIMCMD_FRAME(0, 10), - ANIMCMD_END, -}; -#endif //P_FAMILY_MARSHADOW - -#if P_FAMILY_POIPOLE -PLACEHOLDER_ANIM_SINGLE_FRAME(Poipole); -PLACEHOLDER_ANIM_SINGLE_FRAME(Naganadel); -#endif //P_FAMILY_POIPOLE - -#if P_FAMILY_STAKATAKA -PLACEHOLDER_ANIM_SINGLE_FRAME(Stakataka); -#endif //P_FAMILY_STAKATAKA - -#if P_FAMILY_BLACEPHALON -PLACEHOLDER_ANIM_SINGLE_FRAME(Blacephalon); -#endif //P_FAMILY_BLACEPHALON - -#if P_FAMILY_ZERAORA -PLACEHOLDER_ANIM_SINGLE_FRAME(Zeraora); -#endif //P_FAMILY_ZERAORA - -#if P_FAMILY_MELTAN -PLACEHOLDER_ANIM_SINGLE_FRAME(Meltan); -PLACEHOLDER_ANIM_SINGLE_FRAME(Melmetal); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(MelmetalGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_MELTAN - -#if P_FAMILY_GROOKEY -PLACEHOLDER_ANIM_SINGLE_FRAME(Grookey); -PLACEHOLDER_ANIM_SINGLE_FRAME(Thwackey); -PLACEHOLDER_ANIM_SINGLE_FRAME(Rillaboom); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(RillaboomGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_GROOKEY - -#if P_FAMILY_SCORBUNNY -PLACEHOLDER_ANIM_SINGLE_FRAME(Scorbunny); -PLACEHOLDER_ANIM_SINGLE_FRAME(Raboot); -PLACEHOLDER_ANIM_SINGLE_FRAME(Cinderace); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(CinderaceGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SCORBUNNY - -#if P_FAMILY_SOBBLE -PLACEHOLDER_ANIM_SINGLE_FRAME(Sobble); -PLACEHOLDER_ANIM_SINGLE_FRAME(Drizzile); -PLACEHOLDER_ANIM_SINGLE_FRAME(Inteleon); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(InteleonGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SOBBLE - -#if P_FAMILY_SKWOVET -PLACEHOLDER_ANIM_SINGLE_FRAME(Skwovet); -PLACEHOLDER_ANIM_SINGLE_FRAME(Greedent); -#endif //P_FAMILY_SKWOVET - -#if P_FAMILY_ROOKIDEE -static const union AnimCmd sAnim_Rookidee_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 15), - ANIMCMD_FRAME(0, 15), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 10), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Corvisquire_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, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Corviknight_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 50), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(CorviknightGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_ROOKIDEE - -#if P_FAMILY_BLIPBUG -PLACEHOLDER_ANIM_SINGLE_FRAME(Blipbug); -PLACEHOLDER_ANIM_SINGLE_FRAME(Dottler); -PLACEHOLDER_ANIM_SINGLE_FRAME(Orbeetle); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(OrbeetleGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_BLIPBUG - -#if P_FAMILY_NICKIT -PLACEHOLDER_ANIM_SINGLE_FRAME(Nickit); -PLACEHOLDER_ANIM_SINGLE_FRAME(Thievul); -#endif //P_FAMILY_NICKIT - -#if P_FAMILY_GOSSIFLEUR -PLACEHOLDER_ANIM_SINGLE_FRAME(Gossifleur); -PLACEHOLDER_ANIM_SINGLE_FRAME(Eldegoss); -#endif //P_FAMILY_GOSSIFLEUR - -#if P_FAMILY_WOOLOO -PLACEHOLDER_ANIM_SINGLE_FRAME(Wooloo); -PLACEHOLDER_ANIM_SINGLE_FRAME(Dubwool); -#endif //P_FAMILY_WOOLOO - -#if P_FAMILY_CHEWTLE -static const union AnimCmd sAnim_Chewtle_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 20), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Drednaw_1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(DrednawGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_CHEWTLE - -#if P_FAMILY_YAMPER -PLACEHOLDER_ANIM_SINGLE_FRAME(Yamper); -PLACEHOLDER_ANIM_SINGLE_FRAME(Boltund); -#endif //P_FAMILY_YAMPER - -#if P_FAMILY_ROLYCOLY -PLACEHOLDER_ANIM_TWO_FRAMES(Rolycoly); -PLACEHOLDER_ANIM_TWO_FRAMES(Carkol); -PLACEHOLDER_ANIM_TWO_FRAMES(Coalossal); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(CoalossalGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_ROLYCOLY - -#if P_FAMILY_APPLIN -PLACEHOLDER_ANIM_TWO_FRAMES(Applin); -PLACEHOLDER_ANIM_TWO_FRAMES(Flapple); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(FlappleGmax); -#endif //P_GIGANTAMAX_FORMS - -PLACEHOLDER_ANIM_TWO_FRAMES(Appletun); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(AppletunGmax); -#endif //P_GIGANTAMAX_FORMS - -#if P_GEN_9_CROSS_EVOS -PLACEHOLDER_ANIM_SINGLE_FRAME(Dipplin); -PLACEHOLDER_ANIM_SINGLE_FRAME(Hydrapple); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_APPLIN - -#if P_FAMILY_SILICOBRA -PLACEHOLDER_ANIM_SINGLE_FRAME(Silicobra); -PLACEHOLDER_ANIM_SINGLE_FRAME(Sandaconda); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(SandacondaGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SILICOBRA - -#if P_FAMILY_CRAMORANT -PLACEHOLDER_ANIM_SINGLE_FRAME(Cramorant); -#endif //P_FAMILY_CRAMORANT - -#if P_FAMILY_ARROKUDA -PLACEHOLDER_ANIM_SINGLE_FRAME(Arrokuda); -PLACEHOLDER_ANIM_SINGLE_FRAME(Barraskewda); -#endif //P_FAMILY_ARROKUDA - -#if P_FAMILY_TOXEL -PLACEHOLDER_ANIM_SINGLE_FRAME(Toxel); -PLACEHOLDER_ANIM_SINGLE_FRAME(Toxtricity); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(ToxtricityGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_TOXEL - -#if P_FAMILY_SIZZLIPEDE -static const union AnimCmd sAnim_Sizzlipede_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 25), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd sAnim_Centiskorch_1[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_FRAME(1, 35), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(CentiskorchGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SIZZLIPEDE - -#if P_FAMILY_CLOBBOPUS -PLACEHOLDER_ANIM_SINGLE_FRAME(Clobbopus); -PLACEHOLDER_ANIM_SINGLE_FRAME(Grapploct); -#endif //P_FAMILY_CLOBBOPUS - -#if P_FAMILY_SINISTEA -PLACEHOLDER_ANIM_SINGLE_FRAME(Sinistea); -PLACEHOLDER_ANIM_SINGLE_FRAME(Polteageist); -#endif //P_FAMILY_SINISTEA - -#if P_FAMILY_HATENNA -PLACEHOLDER_ANIM_SINGLE_FRAME(Hatenna); -PLACEHOLDER_ANIM_SINGLE_FRAME(Hattrem); -PLACEHOLDER_ANIM_SINGLE_FRAME(Hatterene); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(HattereneGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_HATENNA - -#if P_FAMILY_IMPIDIMP -PLACEHOLDER_ANIM_SINGLE_FRAME(Impidimp); -PLACEHOLDER_ANIM_SINGLE_FRAME(Morgrem); -PLACEHOLDER_ANIM_SINGLE_FRAME(Grimmsnarl); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(GrimmsnarlGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_IMPIDIMP - -#if P_FAMILY_MILCERY -PLACEHOLDER_ANIM_SINGLE_FRAME(Milcery); -PLACEHOLDER_ANIM_SINGLE_FRAME(Alcremie); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(AlcremieGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_MILCERY - -#if P_FAMILY_FALINKS -PLACEHOLDER_ANIM_SINGLE_FRAME(Falinks); -#endif //P_FAMILY_FALINKS - -#if P_FAMILY_PINCURCHIN -PLACEHOLDER_ANIM_TWO_FRAMES(Pincurchin); -#endif //P_FAMILY_PINCURCHIN - -#if P_FAMILY_SNOM -PLACEHOLDER_ANIM_SINGLE_FRAME(Snom); -PLACEHOLDER_ANIM_SINGLE_FRAME(Frosmoth); -#endif //P_FAMILY_SNOM - -#if P_FAMILY_STONJOURNER -PLACEHOLDER_ANIM_SINGLE_FRAME(Stonjourner); -#endif //P_FAMILY_STONJOURNER - -#if P_FAMILY_EISCUE -PLACEHOLDER_ANIM_SINGLE_FRAME(Eiscue); -#endif //P_FAMILY_EISCUE - -#if P_FAMILY_INDEEDEE -PLACEHOLDER_ANIM_SINGLE_FRAME(Indeedee); -#endif //P_FAMILY_INDEEDEE - -#if P_FAMILY_MORPEKO -PLACEHOLDER_ANIM_SINGLE_FRAME(Morpeko); -#endif //P_FAMILY_MORPEKO - -#if P_FAMILY_CUFANT -PLACEHOLDER_ANIM_SINGLE_FRAME(Cufant); -PLACEHOLDER_ANIM_SINGLE_FRAME(Copperajah); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(CopperajahGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_CUFANT - -#if P_FAMILY_DRACOZOLT -PLACEHOLDER_ANIM_SINGLE_FRAME(Dracozolt); -#endif //P_FAMILY_DRACOZOLT - -#if P_FAMILY_ARCTOZOLT -PLACEHOLDER_ANIM_SINGLE_FRAME(Arctozolt); -#endif //P_FAMILY_ARCTOZOLT - -#if P_FAMILY_DRACOVISH -PLACEHOLDER_ANIM_SINGLE_FRAME(Dracovish); -#endif //P_FAMILY_DRACOVISH - -#if P_FAMILY_ARCTOVISH -PLACEHOLDER_ANIM_SINGLE_FRAME(Arctovish); -#endif //P_FAMILY_ARCTOVISH - -#if P_FAMILY_DURALUDON -static const union AnimCmd sAnim_Duraludon_1[] = -{ - - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(1, 60), - ANIMCMD_FRAME(0, 2), - ANIMCMD_END, -}; - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(DuraludonGmax); -#endif //P_GIGANTAMAX_FORMS - -#if P_GEN_9_CROSS_EVOS -PLACEHOLDER_ANIM_SINGLE_FRAME(Archaludon); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_DURALUDON - -#if P_FAMILY_DREEPY -PLACEHOLDER_ANIM_SINGLE_FRAME(Dreepy); -PLACEHOLDER_ANIM_SINGLE_FRAME(Drakloak); -PLACEHOLDER_ANIM_SINGLE_FRAME(Dragapult); -#endif //P_FAMILY_DREEPY - -#if P_FAMILY_ZACIAN -PLACEHOLDER_ANIM_SINGLE_FRAME(Zacian); -#endif //P_FAMILY_ZACIAN - -#if P_FAMILY_ZAMAZENTA -PLACEHOLDER_ANIM_SINGLE_FRAME(Zamazenta); -#endif //P_FAMILY_ZAMAZENTA - -#if P_FAMILY_ETERNATUS -PLACEHOLDER_ANIM_SINGLE_FRAME(Eternatus); -#endif //P_FAMILY_ETERNATUS - -#if P_FAMILY_KUBFU -PLACEHOLDER_ANIM_SINGLE_FRAME(Kubfu); -PLACEHOLDER_ANIM_SINGLE_FRAME(Urshifu); - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(UrshifuSingleStrikeGmax); -#endif //P_GIGANTAMAX_FORMS - -#if P_GIGANTAMAX_FORMS -PLACEHOLDER_ANIM_SINGLE_FRAME(UrshifuRapidStrikeGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_KUBFU - -#if P_FAMILY_ZARUDE -PLACEHOLDER_ANIM_SINGLE_FRAME(Zarude); -#endif //P_FAMILY_ZARUDE - -#if P_FAMILY_REGIELEKI -PLACEHOLDER_ANIM_SINGLE_FRAME(Regieleki); -#endif //P_FAMILY_REGIELEKI - -#if P_FAMILY_REGIDRAGO -PLACEHOLDER_ANIM_SINGLE_FRAME(Regidrago); -#endif //P_FAMILY_REGIDRAGO - -#if P_FAMILY_GLASTRIER -PLACEHOLDER_ANIM_SINGLE_FRAME(Glastrier); -#endif //P_FAMILY_GLASTRIER - -#if P_FAMILY_SPECTRIER -PLACEHOLDER_ANIM_SINGLE_FRAME(Spectrier); -#endif //P_FAMILY_SPECTRIER - -#if P_FAMILY_CALYREX -PLACEHOLDER_ANIM_SINGLE_FRAME(Calyrex); -#endif //P_FAMILY_CALYREX - -#if P_FAMILY_ENAMORUS -PLACEHOLDER_ANIM_TWO_FRAMES(EnamorusIncarnate); -PLACEHOLDER_ANIM_SINGLE_FRAME(EnamorusTherian); -#endif //P_FAMILY_ENAMORUS - -#if P_FAMILY_SPRIGATITO -PLACEHOLDER_ANIM_SINGLE_FRAME(Sprigatito); -PLACEHOLDER_ANIM_SINGLE_FRAME(Floragato); -PLACEHOLDER_ANIM_SINGLE_FRAME(Meowscarada); -#endif //P_FAMILY_SPRIGATITO - -#if P_FAMILY_FUECOCO -PLACEHOLDER_ANIM_SINGLE_FRAME(Fuecoco); -PLACEHOLDER_ANIM_SINGLE_FRAME(Crocalor); -PLACEHOLDER_ANIM_SINGLE_FRAME(Skeledirge); -#endif //P_FAMILY_FUECOCO - -#if P_FAMILY_QUAXLY -PLACEHOLDER_ANIM_SINGLE_FRAME(Quaxly); -PLACEHOLDER_ANIM_SINGLE_FRAME(Quaxwell); -PLACEHOLDER_ANIM_SINGLE_FRAME(Quaquaval); -#endif //P_FAMILY_QUAXLY - -#if P_FAMILY_LECHONK -PLACEHOLDER_ANIM_SINGLE_FRAME(Lechonk); -PLACEHOLDER_ANIM_SINGLE_FRAME(Oinkologne); -#endif //P_FAMILY_LECHONK - -#if P_FAMILY_TAROUNTULA -PLACEHOLDER_ANIM_SINGLE_FRAME(Tarountula); -PLACEHOLDER_ANIM_SINGLE_FRAME(Spidops); -#endif //P_FAMILY_TAROUNTULA - -#if P_FAMILY_NYMBLE -PLACEHOLDER_ANIM_SINGLE_FRAME(Nymble); -PLACEHOLDER_ANIM_SINGLE_FRAME(Lokix); -#endif //P_FAMILY_NYMBLE - -#if P_FAMILY_PAWMI -PLACEHOLDER_ANIM_SINGLE_FRAME(Pawmi); -PLACEHOLDER_ANIM_SINGLE_FRAME(Pawmo); -PLACEHOLDER_ANIM_SINGLE_FRAME(Pawmot); -#endif //P_FAMILY_PAWMI - -#if P_FAMILY_TANDEMAUS -PLACEHOLDER_ANIM_SINGLE_FRAME(Tandemaus); -PLACEHOLDER_ANIM_SINGLE_FRAME(Maushold); -#endif //P_FAMILY_TANDEMAUS - -#if P_FAMILY_FIDOUGH -PLACEHOLDER_ANIM_SINGLE_FRAME(Fidough); -PLACEHOLDER_ANIM_SINGLE_FRAME(Dachsbun); -#endif //P_FAMILY_FIDOUGH - -#if P_FAMILY_SMOLIV -PLACEHOLDER_ANIM_SINGLE_FRAME(Smoliv); -PLACEHOLDER_ANIM_SINGLE_FRAME(Dolliv); -PLACEHOLDER_ANIM_SINGLE_FRAME(Arboliva); -#endif //P_FAMILY_SMOLIV - -#if P_FAMILY_SQUAWKABILLY -PLACEHOLDER_ANIM_SINGLE_FRAME(Squawkabilly); -#endif //P_FAMILY_SQUAWKABILLY - -#if P_FAMILY_NACLI -PLACEHOLDER_ANIM_SINGLE_FRAME(Nacli); -PLACEHOLDER_ANIM_SINGLE_FRAME(Naclstack); -PLACEHOLDER_ANIM_SINGLE_FRAME(Garganacl); -#endif //P_FAMILY_NACLI - -#if P_FAMILY_CHARCADET -PLACEHOLDER_ANIM_SINGLE_FRAME(Charcadet); -PLACEHOLDER_ANIM_SINGLE_FRAME(Armarouge); -PLACEHOLDER_ANIM_SINGLE_FRAME(Ceruledge); -#endif //P_FAMILY_CHARCADET - -#if P_FAMILY_TADBULB -PLACEHOLDER_ANIM_SINGLE_FRAME(Tadbulb); -PLACEHOLDER_ANIM_SINGLE_FRAME(Bellibolt); -#endif //P_FAMILY_TADBULB - -#if P_FAMILY_WATTREL -PLACEHOLDER_ANIM_SINGLE_FRAME(Wattrel); -PLACEHOLDER_ANIM_SINGLE_FRAME(Kilowattrel); -#endif //P_FAMILY_WATTREL - -#if P_FAMILY_MASCHIFF -PLACEHOLDER_ANIM_SINGLE_FRAME(Maschiff); -PLACEHOLDER_ANIM_SINGLE_FRAME(Mabosstiff); -#endif //P_FAMILY_MASCHIFF - -#if P_FAMILY_SHROODLE -PLACEHOLDER_ANIM_SINGLE_FRAME(Shroodle); -PLACEHOLDER_ANIM_SINGLE_FRAME(Grafaiai); -#endif //P_FAMILY_SHROODLE - -#if P_FAMILY_BRAMBLIN -PLACEHOLDER_ANIM_SINGLE_FRAME(Bramblin); -PLACEHOLDER_ANIM_SINGLE_FRAME(Brambleghast); -#endif //P_FAMILY_BRAMBLIN - -#if P_FAMILY_TOEDSCOOL -PLACEHOLDER_ANIM_SINGLE_FRAME(Toedscool); -PLACEHOLDER_ANIM_SINGLE_FRAME(Toedscruel); -#endif //P_FAMILY_TOEDSCOOL - -#if P_FAMILY_KLAWF -PLACEHOLDER_ANIM_SINGLE_FRAME(Klawf); -#endif //P_FAMILY_KLAWF - -#if P_FAMILY_CAPSAKID -PLACEHOLDER_ANIM_SINGLE_FRAME(Capsakid); -PLACEHOLDER_ANIM_SINGLE_FRAME(Scovillain); -#endif //P_FAMILY_CAPSAKID - -#if P_FAMILY_RELLOR -PLACEHOLDER_ANIM_SINGLE_FRAME(Rellor); -PLACEHOLDER_ANIM_SINGLE_FRAME(Rabsca); -#endif //P_FAMILY_RELLOR - -#if P_FAMILY_FLITTLE -PLACEHOLDER_ANIM_SINGLE_FRAME(Flittle); -PLACEHOLDER_ANIM_SINGLE_FRAME(Espathra); -#endif //P_FAMILY_FLITTLE - -#if P_FAMILY_TINKATINK -PLACEHOLDER_ANIM_SINGLE_FRAME(Tinkatink); -PLACEHOLDER_ANIM_SINGLE_FRAME(Tinkatuff); -PLACEHOLDER_ANIM_SINGLE_FRAME(Tinkaton); -#endif //P_FAMILY_TINKATINK - -#if P_FAMILY_WIGLETT -PLACEHOLDER_ANIM_SINGLE_FRAME(Wiglett); -PLACEHOLDER_ANIM_SINGLE_FRAME(Wugtrio); -#endif //P_FAMILY_WIGLETT - -#if P_FAMILY_BOMBIRDIER -PLACEHOLDER_ANIM_SINGLE_FRAME(Bombirdier); -#endif //P_FAMILY_BOMBIRDIER - -#if P_FAMILY_FINIZEN -PLACEHOLDER_ANIM_SINGLE_FRAME(Finizen); -PLACEHOLDER_ANIM_SINGLE_FRAME(Palafin); -#endif //P_FAMILY_FINIZEN - -#if P_FAMILY_VAROOM -PLACEHOLDER_ANIM_SINGLE_FRAME(Varoom); -PLACEHOLDER_ANIM_SINGLE_FRAME(Revavroom); -#endif //P_FAMILY_VAROOM - -#if P_FAMILY_CYCLIZAR -PLACEHOLDER_ANIM_SINGLE_FRAME(Cyclizar); -#endif //P_FAMILY_CYCLIZAR - -#if P_FAMILY_ORTHWORM -PLACEHOLDER_ANIM_SINGLE_FRAME(Orthworm); -#endif //P_FAMILY_ORTHWORM - -#if P_FAMILY_GLIMMET -PLACEHOLDER_ANIM_SINGLE_FRAME(Glimmet); -PLACEHOLDER_ANIM_SINGLE_FRAME(Glimmora); -#endif //P_FAMILY_GLIMMET - -#if P_FAMILY_GREAVARD -PLACEHOLDER_ANIM_SINGLE_FRAME(Greavard); -PLACEHOLDER_ANIM_SINGLE_FRAME(Houndstone); -#endif //P_FAMILY_GREAVARD - -#if P_FAMILY_FLAMIGO -PLACEHOLDER_ANIM_SINGLE_FRAME(Flamigo); -#endif //P_FAMILY_FLAMIGO - -#if P_FAMILY_CETODDLE -PLACEHOLDER_ANIM_SINGLE_FRAME(Cetoddle); -PLACEHOLDER_ANIM_SINGLE_FRAME(Cetitan); -#endif //P_FAMILY_CETODDLE - -#if P_FAMILY_VELUZA -PLACEHOLDER_ANIM_SINGLE_FRAME(Veluza); -#endif //P_FAMILY_VELUZA - -#if P_FAMILY_DONDOZO -PLACEHOLDER_ANIM_SINGLE_FRAME(Dondozo); -#endif //P_FAMILY_DONDOZO - -#if P_FAMILY_TATSUGIRI -PLACEHOLDER_ANIM_SINGLE_FRAME(Tatsugiri); -#endif //P_FAMILY_TATSUGIRI - -#if P_FAMILY_GREAT_TUSK -PLACEHOLDER_ANIM_TWO_FRAMES(GreatTusk); -#endif //P_FAMILY_GREAT_TUSK - -#if P_FAMILY_SCREAM_TAIL -PLACEHOLDER_ANIM_SINGLE_FRAME(ScreamTail); -#endif //P_FAMILY_SCREAM_TAIL - -#if P_FAMILY_BRUTE_BONNET -PLACEHOLDER_ANIM_SINGLE_FRAME(BruteBonnet); -#endif //P_FAMILY_BRUTE_BONNET - -#if P_FAMILY_FLUTTER_MANE -PLACEHOLDER_ANIM_SINGLE_FRAME(FlutterMane); -#endif //P_FAMILY_FLUTTER_MANE - -#if P_FAMILY_SLITHER_WING -PLACEHOLDER_ANIM_SINGLE_FRAME(SlitherWing); -#endif //P_FAMILY_SLITHER_WING - -#if P_FAMILY_SANDY_SHOCKS -PLACEHOLDER_ANIM_SINGLE_FRAME(SandyShocks); -#endif //P_FAMILY_SANDY_SHOCKS - -#if P_FAMILY_IRON_TREADS -PLACEHOLDER_ANIM_SINGLE_FRAME(IronTreads); -#endif //P_FAMILY_IRON_TREADS - -#if P_FAMILY_IRON_BUNDLE -PLACEHOLDER_ANIM_SINGLE_FRAME(IronBundle); -#endif //P_FAMILY_IRON_BUNDLE - -#if P_FAMILY_IRON_HANDS -PLACEHOLDER_ANIM_SINGLE_FRAME(IronHands); -#endif //P_FAMILY_IRON_HANDS - -#if P_FAMILY_IRON_JUGULIS -PLACEHOLDER_ANIM_SINGLE_FRAME(IronJugulis); -#endif //P_FAMILY_IRON_JUGULIS - -#if P_FAMILY_IRON_MOTH -PLACEHOLDER_ANIM_SINGLE_FRAME(IronMoth); -#endif //P_FAMILY_IRON_MOTH - -#if P_FAMILY_IRON_THORNS -PLACEHOLDER_ANIM_SINGLE_FRAME(IronThorns); -#endif //P_FAMILY_IRON_THORNS - -#if P_FAMILY_FRIGIBAX -PLACEHOLDER_ANIM_TWO_FRAMES(Frigibax); -PLACEHOLDER_ANIM_SINGLE_FRAME(Arctibax); -PLACEHOLDER_ANIM_SINGLE_FRAME(Baxcalibur); -#endif //P_FAMILY_FRIGIBAX - -#if P_FAMILY_GIMMIGHOUL -PLACEHOLDER_ANIM_SINGLE_FRAME(Gimmighoul); -PLACEHOLDER_ANIM_SINGLE_FRAME(Gholdengo); -#endif //P_FAMILY_GIMMIGHOUL - -#if P_FAMILY_WO_CHIEN -PLACEHOLDER_ANIM_SINGLE_FRAME(WoChien); -#endif //P_FAMILY_WO_CHIEN - -#if P_FAMILY_CHIEN_PAO -PLACEHOLDER_ANIM_SINGLE_FRAME(ChienPao); -#endif //P_FAMILY_CHIEN_PAO - -#if P_FAMILY_TING_LU -PLACEHOLDER_ANIM_SINGLE_FRAME(TingLu); -#endif //P_FAMILY_TING_LU - -#if P_FAMILY_CHI_YU -PLACEHOLDER_ANIM_SINGLE_FRAME(ChiYu); -#endif //P_FAMILY_CHI_YU - -#if P_FAMILY_ROARING_MOON -PLACEHOLDER_ANIM_SINGLE_FRAME(RoaringMoon); -#endif //P_FAMILY_ROARING_MOON - -#if P_FAMILY_IRON_VALIANT -PLACEHOLDER_ANIM_SINGLE_FRAME(IronValiant); -#endif //P_FAMILY_IRON_VALIANT - -#if P_FAMILY_KORAIDON -PLACEHOLDER_ANIM_SINGLE_FRAME(Koraidon); -#endif //P_FAMILY_KORAIDON - -#if P_FAMILY_MIRAIDON -PLACEHOLDER_ANIM_SINGLE_FRAME(Miraidon); -#endif //P_FAMILY_MIRAIDON - -#if P_FAMILY_WALKING_WAKE -PLACEHOLDER_ANIM_SINGLE_FRAME(WalkingWake); -#endif //P_FAMILY_WALKING_WAKE - -#if P_FAMILY_IRON_LEAVES -PLACEHOLDER_ANIM_SINGLE_FRAME(IronLeaves); -#endif //P_FAMILY_IRON_LEAVES - -#if P_FAMILY_POLTCHAGEIST -PLACEHOLDER_ANIM_SINGLE_FRAME(Poltchageist); -PLACEHOLDER_ANIM_SINGLE_FRAME(Sinistcha); -#endif //P_FAMILY_POLTCHAGEIST - -#if P_FAMILY_OKIDOGI -PLACEHOLDER_ANIM_SINGLE_FRAME(Okidogi); -#endif //P_FAMILY_OKIDOGI - -#if P_FAMILY_MUNKIDORI -PLACEHOLDER_ANIM_SINGLE_FRAME(Munkidori); -#endif //P_FAMILY_MUNKIDORI - -#if P_FAMILY_FEZANDIPITI -PLACEHOLDER_ANIM_SINGLE_FRAME(Fezandipiti); -#endif //P_FAMILY_FEZANDIPITI - -#if P_FAMILY_OGERPON -PLACEHOLDER_ANIM_SINGLE_FRAME(Ogerpon); -#endif //P_FAMILY_OGERPON - -#if P_FAMILY_GOUGING_FIRE -PLACEHOLDER_ANIM_SINGLE_FRAME(GougingFire); -#endif //P_FAMILY_GOUGING_FIRE - -#if P_FAMILY_RAGING_BOLT -PLACEHOLDER_ANIM_SINGLE_FRAME(RagingBolt); -#endif //P_FAMILY_RAGING_BOLT - -#if P_FAMILY_IRON_BOULDER -PLACEHOLDER_ANIM_SINGLE_FRAME(IronBoulder); -#endif //P_FAMILY_IRON_BOULDER - -#if P_FAMILY_IRON_CROWN -PLACEHOLDER_ANIM_SINGLE_FRAME(IronCrown); -#endif //P_FAMILY_IRON_CROWN - -#if P_FAMILY_TERAPAGOS -static const union AnimCmd sAnim_TerapagosNormal_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -static const union AnimCmd sAnim_TerapagosTerastal_1[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; -PLACEHOLDER_ANIM_SINGLE_FRAME(TerapagosStellar); -#endif //P_FAMILY_TERAPAGOS - -#if P_FAMILY_PECHARUNT -PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt); -#endif //P_FAMILY_PECHARUNT - -static const union AnimCmd sAnim_Egg_1[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(2, 6), - ANIMCMD_FRAME(3, 6), - ANIMCMD_END, -}; - -#define SINGLE_ANIMATION(name) \ -static const union AnimCmd *const sAnims_##name[] = \ -{ \ - sAnim_GeneralFrame0, \ - sAnim_##name##_1, \ -} - - -SINGLE_ANIMATION(None); -#if P_FAMILY_BULBASAUR -SINGLE_ANIMATION(Bulbasaur); -SINGLE_ANIMATION(Ivysaur); -SINGLE_ANIMATION(Venusaur); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(VenusaurMega); -#endif //P_MEGA_EVOLUTIONS -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(VenusaurGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_BULBASAUR -#if P_FAMILY_CHARMANDER -SINGLE_ANIMATION(Charmander); -SINGLE_ANIMATION(Charmeleon); -SINGLE_ANIMATION(Charizard); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(CharizardMegaX); -SINGLE_ANIMATION(CharizardMegaY); -#endif //P_MEGA_EVOLUTIONS -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(CharizardGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_CHARMANDER -#if P_FAMILY_SQUIRTLE -SINGLE_ANIMATION(Squirtle); -SINGLE_ANIMATION(Wartortle); -SINGLE_ANIMATION(Blastoise); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(BlastoiseMega); -#endif //P_MEGA_EVOLUTIONS -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(BlastoiseGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SQUIRTLE -#if P_FAMILY_CATERPIE -SINGLE_ANIMATION(Caterpie); -SINGLE_ANIMATION(Metapod); -SINGLE_ANIMATION(Butterfree); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(ButterfreeGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_CATERPIE -#if P_FAMILY_WEEDLE -SINGLE_ANIMATION(Weedle); -SINGLE_ANIMATION(Kakuna); -SINGLE_ANIMATION(Beedrill); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(BeedrillMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_WEEDLE -#if P_FAMILY_PIDGEY -SINGLE_ANIMATION(Pidgey); -SINGLE_ANIMATION(Pidgeotto); -SINGLE_ANIMATION(Pidgeot); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(PidgeotMega); -#endif -#endif //P_FAMILY_PIDGEY -#if P_FAMILY_RATTATA -SINGLE_ANIMATION(Rattata); -SINGLE_ANIMATION(Raticate); -#if P_ALOLAN_FORMS -SINGLE_ANIMATION(RattataAlola); -SINGLE_ANIMATION(RaticateAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_RATTATA -#if P_FAMILY_SPEAROW -SINGLE_ANIMATION(Spearow); -SINGLE_ANIMATION(Fearow); -#endif //P_FAMILY_SPEAROW -#if P_FAMILY_EKANS -SINGLE_ANIMATION(Ekans); -SINGLE_ANIMATION(Arbok); -#endif //P_FAMILY_EKANS -#if P_FAMILY_PIKACHU -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Pichu); -SINGLE_ANIMATION(PichuSpikyEared); -#endif //P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Pikachu); -#if P_COSPLAY_PIKACHU_FORMS -SINGLE_ANIMATION(PikachuCosplay); -SINGLE_ANIMATION(PikachuRockStar); -SINGLE_ANIMATION(PikachuBelle); -SINGLE_ANIMATION(PikachuPopStar); -SINGLE_ANIMATION(PikachuPhD); -SINGLE_ANIMATION(PikachuLibre); -#endif //P_COSPLAY_PIKACHU_FORMS -#if P_CAP_PIKACHU_FORMS -SINGLE_ANIMATION(PikachuOriginal); -SINGLE_ANIMATION(PikachuHoenn); -SINGLE_ANIMATION(PikachuSinnoh); -SINGLE_ANIMATION(PikachuUnova); -SINGLE_ANIMATION(PikachuKalos); -SINGLE_ANIMATION(PikachuAlola); -SINGLE_ANIMATION(PikachuPartner); -SINGLE_ANIMATION(PikachuWorld); -#endif //P_CAP_PIKACHU_FORMS -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(PikachuGmax); -#endif //P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(Raichu); -#if P_ALOLAN_FORMS -SINGLE_ANIMATION(RaichuAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_PIKACHU -#if P_FAMILY_SANDSHREW -SINGLE_ANIMATION(Sandshrew); -SINGLE_ANIMATION(Sandslash); -#if P_ALOLAN_FORMS -SINGLE_ANIMATION(SandshrewAlola); -SINGLE_ANIMATION(SandslashAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_SANDSHREW -#if P_FAMILY_NIDORAN -SINGLE_ANIMATION(NidoranF); -SINGLE_ANIMATION(Nidorina); -SINGLE_ANIMATION(Nidoqueen); -SINGLE_ANIMATION(NidoranM); -SINGLE_ANIMATION(Nidorino); -SINGLE_ANIMATION(Nidoking); -#endif //P_FAMILY_NIDORAN -#if P_FAMILY_CLEFAIRY -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Cleffa); -#endif //P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Clefairy); -SINGLE_ANIMATION(Clefable); -#endif //P_FAMILY_CLEFAIRY -#if P_FAMILY_VULPIX -SINGLE_ANIMATION(Vulpix); -SINGLE_ANIMATION(Ninetales); -#if P_ALOLAN_FORMS -SINGLE_ANIMATION(VulpixAlola); -SINGLE_ANIMATION(NinetalesAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_VULPIX -#if P_FAMILY_JIGGLYPUFF -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Igglybuff); -#endif //P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Jigglypuff); -SINGLE_ANIMATION(Wigglytuff); -#endif //P_FAMILY_JIGGLYPUFF -#if P_FAMILY_ZUBAT -SINGLE_ANIMATION(Zubat); -SINGLE_ANIMATION(Golbat); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Crobat); -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_ZUBAT -#if P_FAMILY_ODDISH -SINGLE_ANIMATION(Oddish); -SINGLE_ANIMATION(Gloom); -SINGLE_ANIMATION(Vileplume); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Bellossom); -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_ODDISH -#if P_FAMILY_PARAS -SINGLE_ANIMATION(Paras); -SINGLE_ANIMATION(Parasect); -#endif //P_FAMILY_PARAS -#if P_FAMILY_VENONAT -SINGLE_ANIMATION(Venonat); -SINGLE_ANIMATION(Venomoth); -#endif //P_FAMILY_VENONAT -#if P_FAMILY_DIGLETT -SINGLE_ANIMATION(Diglett); -SINGLE_ANIMATION(Dugtrio); -#if P_ALOLAN_FORMS -SINGLE_ANIMATION(DiglettAlola); -SINGLE_ANIMATION(DugtrioAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_DIGLETT -#if P_FAMILY_MEOWTH -SINGLE_ANIMATION(Meowth); -SINGLE_ANIMATION(Persian); -#if P_ALOLAN_FORMS -SINGLE_ANIMATION(MeowthAlola); -SINGLE_ANIMATION(PersianAlola); -#endif //P_ALOLAN_FORMS -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(MeowthGalar); -SINGLE_ANIMATION(Perrserker); -#endif //P_GALARIAN_FORMS -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(MeowthGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_MEOWTH -#if P_FAMILY_PSYDUCK -SINGLE_ANIMATION(Psyduck); -SINGLE_ANIMATION(Golduck); -#endif //P_FAMILY_PSYDUCK -#if P_FAMILY_MANKEY -SINGLE_ANIMATION(Mankey); -SINGLE_ANIMATION(Primeape); -#if P_GEN_9_CROSS_EVOS -SINGLE_ANIMATION(Annihilape); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_MANKEY -#if P_FAMILY_GROWLITHE -SINGLE_ANIMATION(Growlithe); -SINGLE_ANIMATION(Arcanine); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(GrowlitheHisui); -SINGLE_ANIMATION(ArcanineHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_GROWLITHE -#if P_FAMILY_POLIWAG -SINGLE_ANIMATION(Poliwag); -SINGLE_ANIMATION(Poliwhirl); -SINGLE_ANIMATION(Poliwrath); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Politoed); -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_POLIWAG -#if P_FAMILY_ABRA -SINGLE_ANIMATION(Abra); -SINGLE_ANIMATION(Kadabra); -SINGLE_ANIMATION(Alakazam); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(AlakazamMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_ABRA -#if P_FAMILY_MACHOP -SINGLE_ANIMATION(Machop); -SINGLE_ANIMATION(Machoke); -SINGLE_ANIMATION(Machamp); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(MachampGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_MACHOP -#if P_FAMILY_BELLSPROUT -SINGLE_ANIMATION(Bellsprout); -SINGLE_ANIMATION(Weepinbell); -SINGLE_ANIMATION(Victreebel); -#endif //P_FAMILY_BELLSPROUT -#if P_FAMILY_TENTACOOL -SINGLE_ANIMATION(Tentacool); -SINGLE_ANIMATION(Tentacruel); -#endif //P_FAMILY_TENTACOOL -#if P_FAMILY_GEODUDE -SINGLE_ANIMATION(Geodude); -SINGLE_ANIMATION(Graveler); -SINGLE_ANIMATION(Golem); -#if P_ALOLAN_FORMS -SINGLE_ANIMATION(GeodudeAlola); -SINGLE_ANIMATION(GravelerAlola); -SINGLE_ANIMATION(GolemAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_GEODUDE -#if P_FAMILY_PONYTA -SINGLE_ANIMATION(Ponyta); -SINGLE_ANIMATION(Rapidash); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(PonytaGalar); -SINGLE_ANIMATION(RapidashGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_PONYTA -#if P_FAMILY_SLOWPOKE -SINGLE_ANIMATION(Slowpoke); -SINGLE_ANIMATION(Slowbro); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Slowking); -#endif //P_GEN_2_CROSS_EVOS -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(SlowbroMega); -#endif //P_MEGA_EVOLUTIONS -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(SlowpokeGalar); -SINGLE_ANIMATION(SlowbroGalar); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(SlowkingGalar); -#endif //P_GEN_2_CROSS_EVOS -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_SLOWPOKE -#if P_FAMILY_MAGNEMITE -SINGLE_ANIMATION(Magnemite); -SINGLE_ANIMATION(Magneton); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Magnezone); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_MAGNEMITE -#if P_FAMILY_FARFETCHD -SINGLE_ANIMATION(Farfetchd); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(FarfetchdGalar); -SINGLE_ANIMATION(Sirfetchd); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_FARFETCHD -#if P_FAMILY_DODUO -SINGLE_ANIMATION(Doduo); -SINGLE_ANIMATION(Dodrio); -#endif //P_FAMILY_DODUO -#if P_FAMILY_SEEL -SINGLE_ANIMATION(Seel); -SINGLE_ANIMATION(Dewgong); -#endif //P_FAMILY_SEEL -#if P_FAMILY_GRIMER -SINGLE_ANIMATION(Grimer); -SINGLE_ANIMATION(Muk); -#if P_ALOLAN_FORMS -SINGLE_ANIMATION(GrimerAlola); -SINGLE_ANIMATION(MukAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_GRIMER -#if P_FAMILY_SHELLDER -SINGLE_ANIMATION(Shellder); -SINGLE_ANIMATION(Cloyster); -#endif //P_FAMILY_SHELLDER -#if P_FAMILY_GASTLY -SINGLE_ANIMATION(Gastly); -SINGLE_ANIMATION(Haunter); -SINGLE_ANIMATION(Gengar); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(GengarMega); -#endif //P_MEGA_EVOLUTIONS -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(GengarGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_GASTLY -#if P_FAMILY_ONIX -SINGLE_ANIMATION(Onix); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Steelix); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(SteelixMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_ONIX -#if P_FAMILY_DROWZEE -SINGLE_ANIMATION(Drowzee); -SINGLE_ANIMATION(Hypno); -#endif //P_FAMILY_DROWZEE -#if P_FAMILY_KRABBY -SINGLE_ANIMATION(Krabby); -SINGLE_ANIMATION(Kingler); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(KinglerGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_KRABBY -#if P_FAMILY_VOLTORB -SINGLE_ANIMATION(Voltorb); -SINGLE_ANIMATION(Electrode); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(VoltorbHisui); -SINGLE_ANIMATION(ElectrodeHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_VOLTORB -#if P_FAMILY_EXEGGCUTE -SINGLE_ANIMATION(Exeggcute); -SINGLE_ANIMATION(Exeggutor); -#if P_ALOLAN_FORMS -SINGLE_ANIMATION(ExeggutorAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_EXEGGCUTE -#if P_FAMILY_CUBONE -SINGLE_ANIMATION(Cubone); -SINGLE_ANIMATION(Marowak); -#if P_ALOLAN_FORMS -SINGLE_ANIMATION(MarowakAlola); -#endif //P_ALOLAN_FORMS -#endif //P_FAMILY_CUBONE -#if P_FAMILY_HITMONS -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Tyrogue); -#endif //P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Hitmonlee); -SINGLE_ANIMATION(Hitmonchan); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Hitmontop); -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_HITMONS -#if P_FAMILY_LICKITUNG -SINGLE_ANIMATION(Lickitung); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Lickilicky); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_LICKITUNG -#if P_FAMILY_KOFFING -SINGLE_ANIMATION(Koffing); -SINGLE_ANIMATION(Weezing); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(WeezingGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_KOFFING -#if P_FAMILY_RHYHORN -SINGLE_ANIMATION(Rhyhorn); -SINGLE_ANIMATION(Rhydon); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Rhyperior); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_RHYHORN -#if P_FAMILY_CHANSEY -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Happiny); -#endif //P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Chansey); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Blissey); -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_CHANSEY -#if P_FAMILY_TANGELA -SINGLE_ANIMATION(Tangela); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Tangrowth); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_TANGELA -#if P_FAMILY_KANGASKHAN -SINGLE_ANIMATION(Kangaskhan); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(KangaskhanMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_KANGASKHAN -#if P_FAMILY_HORSEA -SINGLE_ANIMATION(Horsea); -SINGLE_ANIMATION(Seadra); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Kingdra); -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_HORSEA -#if P_FAMILY_GOLDEEN -SINGLE_ANIMATION(Goldeen); -SINGLE_ANIMATION(Seaking); -#endif //P_FAMILY_GOLDEEN -#if P_FAMILY_STARYU -SINGLE_ANIMATION(Staryu); -SINGLE_ANIMATION(Starmie); -#endif //P_FAMILY_STARYU -#if P_FAMILY_MR_MIME -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(MimeJr); -#endif //P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(MrMime); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(MrMimeGalar); -SINGLE_ANIMATION(MrRime); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_MR_MIME -#if P_FAMILY_SCYTHER -SINGLE_ANIMATION(Scyther); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Scizor); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(ScizorMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_GEN_2_CROSS_EVOS -#if P_GEN_8_CROSS_EVOS -SINGLE_ANIMATION(Kleavor); -#endif //P_GEN_8_CROSS_EVOS -#endif //P_FAMILY_SCYTHER -#if P_FAMILY_JYNX -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Smoochum); -#endif //P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Jynx); -#endif //P_FAMILY_JYNX -#if P_FAMILY_ELECTABUZZ -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Elekid); -#endif //P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Electabuzz); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Electivire); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_ELECTABUZZ -#if P_FAMILY_MAGMAR -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Magby); -#endif //P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Magmar); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Magmortar); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_MAGMAR -#if P_FAMILY_PINSIR -SINGLE_ANIMATION(Pinsir); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(PinsirMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_PINSIR -#if P_FAMILY_TAUROS -SINGLE_ANIMATION(Tauros); -#if P_PALDEAN_FORMS -SINGLE_ANIMATION(TaurosPaldea); -#endif //P_PALDEAN_FORMS -#endif //P_FAMILY_TAUROS -#if P_FAMILY_MAGIKARP -SINGLE_ANIMATION(Magikarp); -SINGLE_ANIMATION(Gyarados); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(GyaradosMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MAGIKARP -#if P_FAMILY_LAPRAS -SINGLE_ANIMATION(Lapras); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(LaprasGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_LAPRAS -#if P_FAMILY_DITTO -SINGLE_ANIMATION(Ditto); -#endif //P_FAMILY_DITTO -#if P_FAMILY_EEVEE -SINGLE_ANIMATION(Eevee); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(EeveeGmax); -#endif //P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(Vaporeon); -SINGLE_ANIMATION(Jolteon); -SINGLE_ANIMATION(Flareon); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Espeon); -SINGLE_ANIMATION(Umbreon); -#endif //P_GEN_2_CROSS_EVOS -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Leafeon); -SINGLE_ANIMATION(Glaceon); -#endif //P_GEN_4_CROSS_EVOS -#if P_GEN_6_CROSS_EVOS -SINGLE_ANIMATION(Sylveon); -#endif //P_GEN_6_CROSS_EVOS -#endif //P_FAMILY_EEVEE -#if P_FAMILY_PORYGON -SINGLE_ANIMATION(Porygon); -#if P_GEN_2_CROSS_EVOS -SINGLE_ANIMATION(Porygon2); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Porygon_Z); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_GEN_2_CROSS_EVOS -#endif //P_FAMILY_PORYGON -#if P_FAMILY_OMANYTE -SINGLE_ANIMATION(Omanyte); -SINGLE_ANIMATION(Omastar); -#endif //P_FAMILY_OMANYTE -#if P_FAMILY_KABUTO -SINGLE_ANIMATION(Kabuto); -SINGLE_ANIMATION(Kabutops); -#endif //P_FAMILY_KABUTO -#if P_FAMILY_AERODACTYL -SINGLE_ANIMATION(Aerodactyl); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(AerodactylMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_AERODACTYL -#if P_FAMILY_SNORLAX -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Munchlax); -#endif //P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Snorlax); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(SnorlaxGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SNORLAX -#if P_FAMILY_ARTICUNO -SINGLE_ANIMATION(Articuno); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(ArticunoGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_ARTICUNO -#if P_FAMILY_ZAPDOS -SINGLE_ANIMATION(Zapdos); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(ZapdosGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_ZAPDOS -#if P_FAMILY_MOLTRES -SINGLE_ANIMATION(Moltres); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(MoltresGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_MOLTRES -#if P_FAMILY_DRATINI -SINGLE_ANIMATION(Dratini); -SINGLE_ANIMATION(Dragonair); -SINGLE_ANIMATION(Dragonite); -#endif //P_FAMILY_DRATINI -#if P_FAMILY_MEWTWO -SINGLE_ANIMATION(Mewtwo); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(MewtwoMegaX); -SINGLE_ANIMATION(MewtwoMegaY); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MEWTWO -#if P_FAMILY_MEW -SINGLE_ANIMATION(Mew); -#endif //P_FAMILY_MEW -#if P_FAMILY_CHIKORITA -SINGLE_ANIMATION(Chikorita); -SINGLE_ANIMATION(Bayleef); -SINGLE_ANIMATION(Meganium); -#endif //P_FAMILY_CHIKORITA -#if P_FAMILY_CYNDAQUIL -SINGLE_ANIMATION(Cyndaquil); -SINGLE_ANIMATION(Quilava); -SINGLE_ANIMATION(Typhlosion); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(TyphlosionHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_CYNDAQUIL -#if P_FAMILY_TOTODILE -SINGLE_ANIMATION(Totodile); -SINGLE_ANIMATION(Croconaw); -SINGLE_ANIMATION(Feraligatr); -#endif //P_FAMILY_TOTODILE -#if P_FAMILY_SENTRET -SINGLE_ANIMATION(Sentret); -SINGLE_ANIMATION(Furret); -#endif //P_FAMILY_SENTRET -#if P_FAMILY_HOOTHOOT -SINGLE_ANIMATION(Hoothoot); -SINGLE_ANIMATION(Noctowl); -#endif //P_FAMILY_HOOTHOOT -#if P_FAMILY_LEDYBA -SINGLE_ANIMATION(Ledyba); -SINGLE_ANIMATION(Ledian); -#endif //P_FAMILY_LEDYBA -#if P_FAMILY_SPINARAK -SINGLE_ANIMATION(Spinarak); -SINGLE_ANIMATION(Ariados); -#endif //P_FAMILY_SPINARAK -#if P_FAMILY_CHINCHOU -SINGLE_ANIMATION(Chinchou); -SINGLE_ANIMATION(Lanturn); -#endif //P_FAMILY_CHINCHOU -#if P_FAMILY_TOGEPI -SINGLE_ANIMATION(Togepi); -SINGLE_ANIMATION(Togetic); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Togekiss); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_TOGEPI -#if P_FAMILY_NATU -SINGLE_ANIMATION(Natu); -SINGLE_ANIMATION(Xatu); -#endif //P_FAMILY_NATU -#if P_FAMILY_MAREEP -SINGLE_ANIMATION(Mareep); -SINGLE_ANIMATION(Flaaffy); -SINGLE_ANIMATION(Ampharos); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(AmpharosMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MAREEP -#if P_FAMILY_MARILL -#if P_GEN_3_CROSS_EVOS -SINGLE_ANIMATION(Azurill); -#endif //P_GEN_3_CROSS_EVOS -SINGLE_ANIMATION(Marill); -SINGLE_ANIMATION(Azumarill); -#endif //P_FAMILY_MARILL -#if P_FAMILY_SUDOWOODO -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Bonsly); -#endif //P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Sudowoodo); -#endif //P_FAMILY_SUDOWOODO -#if P_FAMILY_HOPPIP -SINGLE_ANIMATION(Hoppip); -SINGLE_ANIMATION(Skiploom); -SINGLE_ANIMATION(Jumpluff); -#endif //P_FAMILY_HOPPIP -#if P_FAMILY_AIPOM -SINGLE_ANIMATION(Aipom); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Ambipom); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_AIPOM -#if P_FAMILY_SUNKERN -SINGLE_ANIMATION(Sunkern); -SINGLE_ANIMATION(Sunflora); -#endif //P_FAMILY_SUNKERN -#if P_FAMILY_YANMA -SINGLE_ANIMATION(Yanma); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Yanmega); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_YANMA -#if P_FAMILY_WOOPER -SINGLE_ANIMATION(Wooper); -SINGLE_ANIMATION(Quagsire); -#if P_PALDEAN_FORMS -SINGLE_ANIMATION(WooperPaldea); -SINGLE_ANIMATION(Clodsire); -#endif //P_PALDEAN_FORMS -#endif //P_FAMILY_WOOPER -#if P_FAMILY_MURKROW -SINGLE_ANIMATION(Murkrow); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Honchkrow); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_MURKROW -#if P_FAMILY_MISDREAVUS -SINGLE_ANIMATION(Misdreavus); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Mismagius); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_MISDREAVUS -#if P_FAMILY_UNOWN -SINGLE_ANIMATION(Unown); -#endif //P_FAMILY_UNOWN -#if P_FAMILY_WOBBUFFET -#if P_GEN_3_CROSS_EVOS -SINGLE_ANIMATION(Wynaut); -#endif //P_GEN_3_CROSS_EVOS -SINGLE_ANIMATION(Wobbuffet); -#endif //P_FAMILY_WOBBUFFET -#if P_FAMILY_GIRAFARIG -SINGLE_ANIMATION(Girafarig); -#if P_GEN_9_CROSS_EVOS -SINGLE_ANIMATION(Farigiraf); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_GIRAFARIG -#if P_FAMILY_PINECO -SINGLE_ANIMATION(Pineco); -SINGLE_ANIMATION(Forretress); -#endif //P_FAMILY_PINECO -#if P_FAMILY_DUNSPARCE -SINGLE_ANIMATION(Dunsparce); -#if P_GEN_9_CROSS_EVOS -SINGLE_ANIMATION(Dudunsparce); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_DUNSPARCE -#if P_FAMILY_GLIGAR -SINGLE_ANIMATION(Gligar); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Gliscor); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_GLIGAR -#if P_FAMILY_SNUBBULL -SINGLE_ANIMATION(Snubbull); -SINGLE_ANIMATION(Granbull); -#endif //P_FAMILY_SNUBBULL -#if P_FAMILY_QWILFISH -SINGLE_ANIMATION(Qwilfish); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(QwilfishHisui); -SINGLE_ANIMATION(Overqwil); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_QWILFISH -#if P_FAMILY_SHUCKLE -SINGLE_ANIMATION(Shuckle); -#endif //P_FAMILY_SHUCKLE -#if P_FAMILY_HERACROSS -SINGLE_ANIMATION(Heracross); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(HeracrossMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_HERACROSS -#if P_FAMILY_SNEASEL -SINGLE_ANIMATION(Sneasel); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Weavile); -#endif //P_GEN_4_CROSS_EVOS -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(SneaselHisui); -SINGLE_ANIMATION(Sneasler); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_SNEASEL -#if P_FAMILY_TEDDIURSA -SINGLE_ANIMATION(Teddiursa); -SINGLE_ANIMATION(Ursaring); -#if P_GEN_8_CROSS_EVOS -SINGLE_ANIMATION(Ursaluna); -SINGLE_ANIMATION(UrsalunaBloodmoon); -#endif //P_GEN_8_CROSS_EVOS -#endif //P_FAMILY_TEDDIURSA -#if P_FAMILY_SLUGMA -SINGLE_ANIMATION(Slugma); -SINGLE_ANIMATION(Magcargo); -#endif //P_FAMILY_SLUGMA -#if P_FAMILY_SWINUB -SINGLE_ANIMATION(Swinub); -SINGLE_ANIMATION(Piloswine); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Mamoswine); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_SWINUB -#if P_FAMILY_CORSOLA -SINGLE_ANIMATION(Corsola); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(CorsolaGalar); -SINGLE_ANIMATION(Cursola); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_CORSOLA -#if P_FAMILY_REMORAID -SINGLE_ANIMATION(Remoraid); -SINGLE_ANIMATION(Octillery); -#endif //P_FAMILY_REMORAID -#if P_FAMILY_DELIBIRD -SINGLE_ANIMATION(Delibird); -#endif //P_FAMILY_DELIBIRD -#if P_FAMILY_MANTINE -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Mantyke); -#endif //P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Mantine); -#endif //P_FAMILY_MANTINE -#if P_FAMILY_SKARMORY -SINGLE_ANIMATION(Skarmory); -#endif //P_FAMILY_SKARMORY -#if P_FAMILY_HOUNDOUR -SINGLE_ANIMATION(Houndour); -SINGLE_ANIMATION(Houndoom); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(HoundoomMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_HOUNDOUR -#if P_FAMILY_PHANPY -SINGLE_ANIMATION(Phanpy); -SINGLE_ANIMATION(Donphan); -#endif //P_FAMILY_PHANPY -#if P_FAMILY_STANTLER -SINGLE_ANIMATION(Stantler); -#if P_GEN_8_CROSS_EVOS -SINGLE_ANIMATION(Wyrdeer); -#endif //P_GEN_8_CROSS_EVOS -#endif //P_FAMILY_STANTLER -#if P_FAMILY_SMEARGLE -SINGLE_ANIMATION(Smeargle); -#endif //P_FAMILY_SMEARGLE -#if P_FAMILY_MILTANK -SINGLE_ANIMATION(Miltank); -#endif //P_FAMILY_MILTANK -#if P_FAMILY_RAIKOU -SINGLE_ANIMATION(Raikou); -#endif //P_FAMILY_RAIKOU -#if P_FAMILY_ENTEI -SINGLE_ANIMATION(Entei); -#endif //P_FAMILY_ENTEI -#if P_FAMILY_SUICUNE -SINGLE_ANIMATION(Suicune); -#endif //P_FAMILY_SUICUNE -#if P_FAMILY_LARVITAR -SINGLE_ANIMATION(Larvitar); -SINGLE_ANIMATION(Pupitar); -SINGLE_ANIMATION(Tyranitar); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(TyranitarMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_LARVITAR -#if P_FAMILY_LUGIA -SINGLE_ANIMATION(Lugia); -#endif //P_FAMILY_LUGIA -#if P_FAMILY_HO_OH -SINGLE_ANIMATION(HoOh); -#endif //P_FAMILY_HO_OH -#if P_FAMILY_CELEBI -SINGLE_ANIMATION(Celebi); -#endif //P_FAMILY_CELEBI -#if P_FAMILY_TREECKO -SINGLE_ANIMATION(Treecko); -SINGLE_ANIMATION(Grovyle); -SINGLE_ANIMATION(Sceptile); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(SceptileMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_TREECKO -#if P_FAMILY_TORCHIC -SINGLE_ANIMATION(Torchic); -SINGLE_ANIMATION(Combusken); -SINGLE_ANIMATION(Blaziken); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(BlazikenMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_TORCHIC -#if P_FAMILY_MUDKIP -SINGLE_ANIMATION(Mudkip); -SINGLE_ANIMATION(Marshtomp); -SINGLE_ANIMATION(Swampert); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(SwampertMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MUDKIP -#if P_FAMILY_POOCHYENA -SINGLE_ANIMATION(Poochyena); -SINGLE_ANIMATION(Mightyena); -#endif //P_FAMILY_POOCHYENA -#if P_FAMILY_ZIGZAGOON -SINGLE_ANIMATION(Zigzagoon); -SINGLE_ANIMATION(Linoone); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(ZigzagoonGalar); -SINGLE_ANIMATION(LinooneGalar); -SINGLE_ANIMATION(Obstagoon); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_ZIGZAGOON -#if P_FAMILY_WURMPLE -SINGLE_ANIMATION(Wurmple); -SINGLE_ANIMATION(Silcoon); -SINGLE_ANIMATION(Beautifly); -SINGLE_ANIMATION(Cascoon); -SINGLE_ANIMATION(Dustox); -#endif //P_FAMILY_WURMPLE -#if P_FAMILY_LOTAD -SINGLE_ANIMATION(Lotad); -SINGLE_ANIMATION(Lombre); -SINGLE_ANIMATION(Ludicolo); -#endif //P_FAMILY_LOTAD -#if P_FAMILY_SEEDOT -SINGLE_ANIMATION(Seedot); -SINGLE_ANIMATION(Nuzleaf); -SINGLE_ANIMATION(Shiftry); -#endif //P_FAMILY_SEEDOT -#if P_FAMILY_TAILLOW -SINGLE_ANIMATION(Taillow); -SINGLE_ANIMATION(Swellow); -#endif //P_FAMILY_TAILLOW -#if P_FAMILY_WINGULL -SINGLE_ANIMATION(Wingull); -SINGLE_ANIMATION(Pelipper); -#endif //P_FAMILY_WINGULL -#if P_FAMILY_RALTS -SINGLE_ANIMATION(Ralts); -SINGLE_ANIMATION(Kirlia); -SINGLE_ANIMATION(Gardevoir); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(GardevoirMega); -#endif //P_MEGA_EVOLUTIONS -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Gallade); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(GalladeMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_RALTS -#if P_FAMILY_SURSKIT -SINGLE_ANIMATION(Surskit); -SINGLE_ANIMATION(Masquerain); -#endif //P_FAMILY_SURSKIT -#if P_FAMILY_SHROOMISH -SINGLE_ANIMATION(Shroomish); -SINGLE_ANIMATION(Breloom); -#endif //P_FAMILY_SHROOMISH -#if P_FAMILY_SLAKOTH -SINGLE_ANIMATION(Slakoth); -SINGLE_ANIMATION(Vigoroth); -SINGLE_ANIMATION(Slaking); -#endif //P_FAMILY_SLAKOTH -#if P_FAMILY_NINCADA -SINGLE_ANIMATION(Nincada); -SINGLE_ANIMATION(Ninjask); -SINGLE_ANIMATION(Shedinja); -#endif //P_FAMILY_NINCADA -#if P_FAMILY_WHISMUR -SINGLE_ANIMATION(Whismur); -SINGLE_ANIMATION(Loudred); -SINGLE_ANIMATION(Exploud); -#endif //P_FAMILY_WHISMUR -#if P_FAMILY_MAKUHITA -SINGLE_ANIMATION(Makuhita); -SINGLE_ANIMATION(Hariyama); -#endif //P_FAMILY_MAKUHITA -#if P_FAMILY_NOSEPASS -SINGLE_ANIMATION(Nosepass); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Probopass); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_NOSEPASS -#if P_FAMILY_SKITTY -SINGLE_ANIMATION(Skitty); -SINGLE_ANIMATION(Delcatty); -#endif //P_FAMILY_SKITTY -#if P_FAMILY_SABLEYE -SINGLE_ANIMATION(Sableye); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(SableyeMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_SABLEYE -#if P_FAMILY_MAWILE -SINGLE_ANIMATION(Mawile); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(MawileMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MAWILE -#if P_FAMILY_ARON -SINGLE_ANIMATION(Aron); -SINGLE_ANIMATION(Lairon); -SINGLE_ANIMATION(Aggron); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(AggronMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_ARON -#if P_FAMILY_MEDITITE -SINGLE_ANIMATION(Meditite); -SINGLE_ANIMATION(Medicham); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(MedichamMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_MEDITITE -#if P_FAMILY_ELECTRIKE -SINGLE_ANIMATION(Electrike); -SINGLE_ANIMATION(Manectric); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(ManectricMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_ELECTRIKE -#if P_FAMILY_PLUSLE -SINGLE_ANIMATION(Plusle); -#endif //P_FAMILY_PLUSLE -#if P_FAMILY_MINUN -SINGLE_ANIMATION(Minun); -#endif //P_FAMILY_MINUN -#if P_FAMILY_VOLBEAT_ILLUMISE -SINGLE_ANIMATION(Volbeat); -SINGLE_ANIMATION(Illumise); -#endif //P_FAMILY_VOLBEAT_ILLUMISE -#if P_FAMILY_ROSELIA -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Budew); -#endif //P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Roselia); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Roserade); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_ROSELIA -#if P_FAMILY_GULPIN -SINGLE_ANIMATION(Gulpin); -SINGLE_ANIMATION(Swalot); -#endif //P_FAMILY_GULPIN -#if P_FAMILY_CARVANHA -SINGLE_ANIMATION(Carvanha); -SINGLE_ANIMATION(Sharpedo); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(SharpedoMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_CARVANHA -#if P_FAMILY_WAILMER -SINGLE_ANIMATION(Wailmer); -SINGLE_ANIMATION(Wailord); -#endif //P_FAMILY_WAILMER -#if P_FAMILY_NUMEL -SINGLE_ANIMATION(Numel); -SINGLE_ANIMATION(Camerupt); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(CameruptMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_NUMEL -#if P_FAMILY_TORKOAL -SINGLE_ANIMATION(Torkoal); -#endif //P_FAMILY_TORKOAL -#if P_FAMILY_SPOINK -SINGLE_ANIMATION(Spoink); -SINGLE_ANIMATION(Grumpig); -#endif //P_FAMILY_SPOINK -#if P_FAMILY_SPINDA -SINGLE_ANIMATION(Spinda); -#endif //P_FAMILY_SPINDA -#if P_FAMILY_TRAPINCH -SINGLE_ANIMATION(Trapinch); -SINGLE_ANIMATION(Vibrava); -SINGLE_ANIMATION(Flygon); -#endif //P_FAMILY_TRAPINCH -#if P_FAMILY_CACNEA -SINGLE_ANIMATION(Cacnea); -SINGLE_ANIMATION(Cacturne); -#endif //P_FAMILY_CACNEA -#if P_FAMILY_SWABLU -SINGLE_ANIMATION(Swablu); -SINGLE_ANIMATION(Altaria); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(AltariaMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_SWABLU -#if P_FAMILY_ZANGOOSE -SINGLE_ANIMATION(Zangoose); -#endif //P_FAMILY_ZANGOOSE -#if P_FAMILY_SEVIPER -SINGLE_ANIMATION(Seviper); -#endif //P_FAMILY_SEVIPER -#if P_FAMILY_LUNATONE -SINGLE_ANIMATION(Lunatone); -#endif //P_FAMILY_LUNATONE -#if P_FAMILY_SOLROCK -SINGLE_ANIMATION(Solrock); -#endif //P_FAMILY_SOLROCK -#if P_FAMILY_BARBOACH -SINGLE_ANIMATION(Barboach); -SINGLE_ANIMATION(Whiscash); -#endif //P_FAMILY_BARBOACH -#if P_FAMILY_CORPHISH -SINGLE_ANIMATION(Corphish); -SINGLE_ANIMATION(Crawdaunt); -#endif //P_FAMILY_CORPHISH -#if P_FAMILY_BALTOY -SINGLE_ANIMATION(Baltoy); -SINGLE_ANIMATION(Claydol); -#endif //P_FAMILY_BALTOY -#if P_FAMILY_LILEEP -SINGLE_ANIMATION(Lileep); -SINGLE_ANIMATION(Cradily); -#endif //P_FAMILY_LILEEP -#if P_FAMILY_ANORITH -SINGLE_ANIMATION(Anorith); -SINGLE_ANIMATION(Armaldo); -#endif //P_FAMILY_ANORITH -#if P_FAMILY_FEEBAS -SINGLE_ANIMATION(Feebas); -SINGLE_ANIMATION(Milotic); -#endif //P_FAMILY_FEEBAS -#if P_FAMILY_CASTFORM -SINGLE_ANIMATION(CastformNormal); -SINGLE_ANIMATION(CastformSunny); -SINGLE_ANIMATION(CastformRainy); -SINGLE_ANIMATION(CastformSnowy); -#endif //P_FAMILY_CASTFORM -#if P_FAMILY_KECLEON -SINGLE_ANIMATION(Kecleon); -#endif //P_FAMILY_KECLEON -#if P_FAMILY_SHUPPET -SINGLE_ANIMATION(Shuppet); -SINGLE_ANIMATION(Banette); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(BanetteMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_SHUPPET -#if P_FAMILY_DUSKULL -SINGLE_ANIMATION(Duskull); -SINGLE_ANIMATION(Dusclops); -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Dusknoir); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_DUSKULL -#if P_FAMILY_TROPIUS -SINGLE_ANIMATION(Tropius); -#endif //P_FAMILY_TROPIUS -#if P_FAMILY_CHIMECHO -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Chingling); -#endif //P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Chimecho); -#endif //P_FAMILY_CHIMECHO -#if P_FAMILY_ABSOL -SINGLE_ANIMATION(Absol); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(AbsolMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_ABSOL -#if P_FAMILY_SNORUNT -SINGLE_ANIMATION(Snorunt); -SINGLE_ANIMATION(Glalie); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(GlalieMega); -#endif //P_MEGA_EVOLUTIONS -#if P_GEN_4_CROSS_EVOS -SINGLE_ANIMATION(Froslass); -#endif //P_GEN_4_CROSS_EVOS -#endif //P_FAMILY_SNORUNT -#if P_FAMILY_SPHEAL -SINGLE_ANIMATION(Spheal); -SINGLE_ANIMATION(Sealeo); -SINGLE_ANIMATION(Walrein); -#endif //P_FAMILY_SPHEAL -#if P_FAMILY_CLAMPERL -SINGLE_ANIMATION(Clamperl); -SINGLE_ANIMATION(Huntail); -SINGLE_ANIMATION(Gorebyss); -#endif //P_FAMILY_CLAMPERL -#if P_FAMILY_RELICANTH -SINGLE_ANIMATION(Relicanth); -#endif //P_FAMILY_RELICANTH -#if P_FAMILY_LUVDISC -SINGLE_ANIMATION(Luvdisc); -#endif //P_FAMILY_LUVDISC -#if P_FAMILY_BAGON -SINGLE_ANIMATION(Bagon); -SINGLE_ANIMATION(Shelgon); -SINGLE_ANIMATION(Salamence); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(SalamenceMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_BAGON -#if P_FAMILY_BELDUM -SINGLE_ANIMATION(Beldum); -SINGLE_ANIMATION(Metang); -SINGLE_ANIMATION(Metagross); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(MetagrossMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_BELDUM -#if P_FAMILY_REGIROCK -SINGLE_ANIMATION(Regirock); -#endif //P_FAMILY_REGIROCK -#if P_FAMILY_REGICE -SINGLE_ANIMATION(Regice); -#endif //P_FAMILY_REGICE -#if P_FAMILY_REGISTEEL -SINGLE_ANIMATION(Registeel); -#endif //P_FAMILY_REGISTEEL -#if P_FAMILY_LATIAS -SINGLE_ANIMATION(Latias); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(LatiasMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_LATIAS -#if P_FAMILY_LATIOS -SINGLE_ANIMATION(Latios); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(LatiosMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_LATIOS -#if P_FAMILY_KYOGRE -SINGLE_ANIMATION(Kyogre); -#if P_PRIMAL_REVERSIONS -SINGLE_ANIMATION(KyogrePrimal); -#endif //P_PRIMAL_REVERSIONS -#endif //P_FAMILY_KYOGRE -#if P_FAMILY_GROUDON -SINGLE_ANIMATION(Groudon); -#if P_PRIMAL_REVERSIONS -SINGLE_ANIMATION(GroudonPrimal); -#endif //P_PRIMAL_REVERSIONS -#endif //P_FAMILY_GROUDON -#if P_FAMILY_RAYQUAZA -SINGLE_ANIMATION(Rayquaza); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(RayquazaMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_RAYQUAZA -#if P_FAMILY_JIRACHI -SINGLE_ANIMATION(Jirachi); -#endif //P_FAMILY_JIRACHI -#if P_FAMILY_DEOXYS -SINGLE_ANIMATION(DeoxysNormal); -SINGLE_ANIMATION(DeoxysAttack); -SINGLE_ANIMATION(DeoxysDefense); -SINGLE_ANIMATION(DeoxysSpeed); -#endif //P_FAMILY_DEOXYS -#if P_FAMILY_TURTWIG -SINGLE_ANIMATION(Turtwig); -SINGLE_ANIMATION(Grotle); -SINGLE_ANIMATION(Torterra); -#endif //P_FAMILY_TURTWIG -#if P_FAMILY_CHIMCHAR -SINGLE_ANIMATION(Chimchar); -SINGLE_ANIMATION(Monferno); -SINGLE_ANIMATION(Infernape); -#endif //P_FAMILY_CHIMCHAR -#if P_FAMILY_PIPLUP -SINGLE_ANIMATION(Piplup); -SINGLE_ANIMATION(Prinplup); -SINGLE_ANIMATION(Empoleon); -#endif //P_FAMILY_PIPLUP -#if P_FAMILY_STARLY -SINGLE_ANIMATION(Starly); -SINGLE_ANIMATION(Staravia); -SINGLE_ANIMATION(Staraptor); -#endif //P_FAMILY_STARLY -#if P_FAMILY_BIDOOF -SINGLE_ANIMATION(Bidoof); -SINGLE_ANIMATION(Bibarel); -#endif //P_FAMILY_BIDOOF -#if P_FAMILY_KRICKETOT -SINGLE_ANIMATION(Kricketot); -SINGLE_ANIMATION(Kricketune); -#endif //P_FAMILY_KRICKETOT -#if P_FAMILY_SHINX -SINGLE_ANIMATION(Shinx); -SINGLE_ANIMATION(Luxio); -SINGLE_ANIMATION(Luxray); -#endif //P_FAMILY_SHINX -#if P_FAMILY_CRANIDOS -SINGLE_ANIMATION(Cranidos); -SINGLE_ANIMATION(Rampardos); -#endif //P_FAMILY_CRANIDOS -#if P_FAMILY_SHIELDON -SINGLE_ANIMATION(Shieldon); -SINGLE_ANIMATION(Bastiodon); -#endif //P_FAMILY_SHIELDON -#if P_FAMILY_BURMY -SINGLE_ANIMATION(Burmy); -SINGLE_ANIMATION(Wormadam); -SINGLE_ANIMATION(Mothim); -#endif //P_FAMILY_BURMY -#if P_FAMILY_COMBEE -SINGLE_ANIMATION(Combee); -SINGLE_ANIMATION(Vespiquen); -#endif //P_FAMILY_COMBEE -#if P_FAMILY_PACHIRISU -SINGLE_ANIMATION(Pachirisu); -#endif //P_FAMILY_PACHIRISU -#if P_FAMILY_BUIZEL -SINGLE_ANIMATION(Buizel); -SINGLE_ANIMATION(Floatzel); -#endif //P_FAMILY_BUIZEL -#if P_FAMILY_CHERUBI -SINGLE_ANIMATION(Cherubi); -SINGLE_ANIMATION(CherrimOvercast); -SINGLE_ANIMATION(CherrimSunshine); -#endif //P_FAMILY_CHERUBI -#if P_FAMILY_SHELLOS -SINGLE_ANIMATION(Shellos); -SINGLE_ANIMATION(Gastrodon); -#endif //P_FAMILY_SHELLOS -#if P_FAMILY_DRIFLOON -SINGLE_ANIMATION(Drifloon); -SINGLE_ANIMATION(Drifblim); -#endif //P_FAMILY_DRIFLOON -#if P_FAMILY_BUNEARY -SINGLE_ANIMATION(Buneary); -SINGLE_ANIMATION(Lopunny); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(LopunnyMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_BUNEARY -#if P_FAMILY_GLAMEOW -SINGLE_ANIMATION(Glameow); -SINGLE_ANIMATION(Purugly); -#endif //P_FAMILY_GLAMEOW -#if P_FAMILY_STUNKY -SINGLE_ANIMATION(Stunky); -SINGLE_ANIMATION(Skuntank); -#endif //P_FAMILY_STUNKY -#if P_FAMILY_BRONZOR -SINGLE_ANIMATION(Bronzor); -SINGLE_ANIMATION(Bronzong); -#endif //P_FAMILY_BRONZOR -#if P_FAMILY_CHATOT -SINGLE_ANIMATION(Chatot); -#endif //P_FAMILY_CHATOT -#if P_FAMILY_SPIRITOMB -SINGLE_ANIMATION(Spiritomb); -#endif //P_FAMILY_SPIRITOMB -#if P_FAMILY_GIBLE -SINGLE_ANIMATION(Gible); -SINGLE_ANIMATION(Gabite); -SINGLE_ANIMATION(Garchomp); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(GarchompMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_GIBLE -#if P_FAMILY_RIOLU -SINGLE_ANIMATION(Riolu); -SINGLE_ANIMATION(Lucario); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(LucarioMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_RIOLU -#if P_FAMILY_HIPPOPOTAS -SINGLE_ANIMATION(Hippopotas); -SINGLE_ANIMATION(Hippowdon); -#endif //P_FAMILY_HIPPOPOTAS -#if P_FAMILY_SKORUPI -SINGLE_ANIMATION(Skorupi); -SINGLE_ANIMATION(Drapion); -#endif //P_FAMILY_SKORUPI -#if P_FAMILY_CROAGUNK -SINGLE_ANIMATION(Croagunk); -SINGLE_ANIMATION(Toxicroak); -#endif //P_FAMILY_CROAGUNK -#if P_FAMILY_CARNIVINE -SINGLE_ANIMATION(Carnivine); -#endif //P_FAMILY_CARNIVINE -#if P_FAMILY_FINNEON -SINGLE_ANIMATION(Finneon); -SINGLE_ANIMATION(Lumineon); -#endif //P_FAMILY_FINNEON -#if P_FAMILY_SNOVER -SINGLE_ANIMATION(Snover); -SINGLE_ANIMATION(Abomasnow); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(AbomasnowMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_SNOVER -#if P_FAMILY_ROTOM -SINGLE_ANIMATION(Rotom); -SINGLE_ANIMATION(RotomHeat); -SINGLE_ANIMATION(RotomWash); -SINGLE_ANIMATION(RotomFrost); -SINGLE_ANIMATION(RotomFan); -SINGLE_ANIMATION(RotomMow); -#endif //P_FAMILY_ROTOM -#if P_FAMILY_UXIE -SINGLE_ANIMATION(Uxie); -#endif //P_FAMILY_UXIE -#if P_FAMILY_MESPRIT -SINGLE_ANIMATION(Mesprit); -#endif //P_FAMILY_MESPRIT -#if P_FAMILY_AZELF -SINGLE_ANIMATION(Azelf); -#endif //P_FAMILY_AZELF -#if P_FAMILY_DIALGA -SINGLE_ANIMATION(Dialga); -SINGLE_ANIMATION(DialgaOrigin); -#endif //P_FAMILY_DIALGA -#if P_FAMILY_PALKIA -SINGLE_ANIMATION(Palkia); -SINGLE_ANIMATION(PalkiaOrigin); -#endif //P_FAMILY_PALKIA -#if P_FAMILY_HEATRAN -SINGLE_ANIMATION(Heatran); -#endif //P_FAMILY_HEATRAN -#if P_FAMILY_REGIGIGAS -SINGLE_ANIMATION(Regigigas); -#endif //P_FAMILY_REGIGIGAS -#if P_FAMILY_GIRATINA -SINGLE_ANIMATION(GiratinaAltered); -SINGLE_ANIMATION(GiratinaOrigin); -#endif //P_FAMILY_GIRATINA -#if P_FAMILY_CRESSELIA -SINGLE_ANIMATION(Cresselia); -#endif //P_FAMILY_CRESSELIA -#if P_FAMILY_MANAPHY -SINGLE_ANIMATION(Phione); -SINGLE_ANIMATION(Manaphy); -#endif //P_FAMILY_MANAPHY -#if P_FAMILY_DARKRAI -SINGLE_ANIMATION(Darkrai); -#endif //P_FAMILY_DARKRAI -#if P_FAMILY_SHAYMIN -SINGLE_ANIMATION(ShayminLand); -SINGLE_ANIMATION(ShayminSky); -#endif //P_FAMILY_SHAYMIN -#if P_FAMILY_ARCEUS -SINGLE_ANIMATION(Arceus); -#endif //P_FAMILY_ARCEUS -#if P_FAMILY_VICTINI -SINGLE_ANIMATION(Victini); -#endif //P_FAMILY_VICTINI -#if P_FAMILY_SNIVY -SINGLE_ANIMATION(Snivy); -SINGLE_ANIMATION(Servine); -SINGLE_ANIMATION(Serperior); -#endif //P_FAMILY_SNIVY -#if P_FAMILY_TEPIG -SINGLE_ANIMATION(Tepig); -SINGLE_ANIMATION(Pignite); -SINGLE_ANIMATION(Emboar); -#endif //P_FAMILY_TEPIG -#if P_FAMILY_OSHAWOTT -SINGLE_ANIMATION(Oshawott); -SINGLE_ANIMATION(Dewott); -SINGLE_ANIMATION(Samurott); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(SamurottHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_OSHAWOTT -#if P_FAMILY_PATRAT -SINGLE_ANIMATION(Patrat); -SINGLE_ANIMATION(Watchog); -#endif //P_FAMILY_PATRAT -#if P_FAMILY_LILLIPUP -SINGLE_ANIMATION(Lillipup); -SINGLE_ANIMATION(Herdier); -SINGLE_ANIMATION(Stoutland); -#endif //P_FAMILY_LILLIPUP -#if P_FAMILY_PURRLOIN -SINGLE_ANIMATION(Purrloin); -SINGLE_ANIMATION(Liepard); -#endif //P_FAMILY_PURRLOIN -#if P_FAMILY_PANSAGE -SINGLE_ANIMATION(Pansage); -SINGLE_ANIMATION(Simisage); -#endif //P_FAMILY_PANSAGE -#if P_FAMILY_PANSEAR -SINGLE_ANIMATION(Pansear); -SINGLE_ANIMATION(Simisear); -#endif //P_FAMILY_PANSEAR -#if P_FAMILY_PANPOUR -SINGLE_ANIMATION(Panpour); -SINGLE_ANIMATION(Simipour); -#endif //P_FAMILY_PANPOUR -#if P_FAMILY_MUNNA -SINGLE_ANIMATION(Munna); -SINGLE_ANIMATION(Musharna); -#endif //P_FAMILY_MUNNA -#if P_FAMILY_PIDOVE -SINGLE_ANIMATION(Pidove); -SINGLE_ANIMATION(Tranquill); -SINGLE_ANIMATION(Unfezant); -#endif //P_FAMILY_PIDOVE -#if P_FAMILY_BLITZLE -SINGLE_ANIMATION(Blitzle); -SINGLE_ANIMATION(Zebstrika); -#endif //P_FAMILY_BLITZLE -#if P_FAMILY_ROGGENROLA -SINGLE_ANIMATION(Roggenrola); -SINGLE_ANIMATION(Boldore); -SINGLE_ANIMATION(Gigalith); -#endif //P_FAMILY_ROGGENROLA -#if P_FAMILY_WOOBAT -SINGLE_ANIMATION(Woobat); -SINGLE_ANIMATION(Swoobat); -#endif //P_FAMILY_WOOBAT -#if P_FAMILY_DRILBUR -SINGLE_ANIMATION(Drilbur); -SINGLE_ANIMATION(Excadrill); -#endif //P_FAMILY_DRILBUR -#if P_FAMILY_AUDINO -SINGLE_ANIMATION(Audino); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(AudinoMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_AUDINO -#if P_FAMILY_TIMBURR -SINGLE_ANIMATION(Timburr); -SINGLE_ANIMATION(Gurdurr); -SINGLE_ANIMATION(Conkeldurr); -#endif //P_FAMILY_TIMBURR -#if P_FAMILY_TYMPOLE -SINGLE_ANIMATION(Tympole); -SINGLE_ANIMATION(Palpitoad); -SINGLE_ANIMATION(Seismitoad); -#endif //P_FAMILY_TYMPOLE -#if P_FAMILY_THROH -SINGLE_ANIMATION(Throh); -#endif //P_FAMILY_THROH -#if P_FAMILY_SAWK -SINGLE_ANIMATION(Sawk); -#endif //P_FAMILY_SAWK -#if P_FAMILY_SEWADDLE -SINGLE_ANIMATION(Sewaddle); -SINGLE_ANIMATION(Swadloon); -SINGLE_ANIMATION(Leavanny); -#endif //P_FAMILY_SEWADDLE -#if P_FAMILY_VENIPEDE -SINGLE_ANIMATION(Venipede); -SINGLE_ANIMATION(Whirlipede); -SINGLE_ANIMATION(Scolipede); -#endif //P_FAMILY_VENIPEDE -#if P_FAMILY_COTTONEE -SINGLE_ANIMATION(Cottonee); -SINGLE_ANIMATION(Whimsicott); -#endif //P_FAMILY_COTTONEE -#if P_FAMILY_PETILIL -SINGLE_ANIMATION(Petilil); -SINGLE_ANIMATION(Lilligant); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(LilligantHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_PETILIL -#if P_FAMILY_BASCULIN -SINGLE_ANIMATION(Basculin); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(Basculegion); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_BASCULIN -#if P_FAMILY_SANDILE -SINGLE_ANIMATION(Sandile); -SINGLE_ANIMATION(Krokorok); -SINGLE_ANIMATION(Krookodile); -#endif //P_FAMILY_SANDILE -#if P_FAMILY_DARUMAKA -SINGLE_ANIMATION(Darumaka); -SINGLE_ANIMATION(DarmanitanStandard); -SINGLE_ANIMATION(DarmanitanZen); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(DarumakaGalar); -SINGLE_ANIMATION(DarmanitanGalarStandard); -SINGLE_ANIMATION(DarmanitanGalarZen); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_DARUMAKA -#if P_FAMILY_MARACTUS -SINGLE_ANIMATION(Maractus); -#endif //P_FAMILY_MARACTUS -#if P_FAMILY_DWEBBLE -SINGLE_ANIMATION(Dwebble); -SINGLE_ANIMATION(Crustle); -#endif //P_FAMILY_DWEBBLE -#if P_FAMILY_SCRAGGY -SINGLE_ANIMATION(Scraggy); -SINGLE_ANIMATION(Scrafty); -#endif //P_FAMILY_SCRAGGY -#if P_FAMILY_SIGILYPH -SINGLE_ANIMATION(Sigilyph); -#endif //P_FAMILY_SIGILYPH -#if P_FAMILY_YAMASK -SINGLE_ANIMATION(Yamask); -SINGLE_ANIMATION(Cofagrigus); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(YamaskGalar); -SINGLE_ANIMATION(Runerigus); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_YAMASK -#if P_FAMILY_TIRTOUGA -SINGLE_ANIMATION(Tirtouga); -SINGLE_ANIMATION(Carracosta); -#endif //P_FAMILY_TIRTOUGA -#if P_FAMILY_ARCHEN -SINGLE_ANIMATION(Archen); -SINGLE_ANIMATION(Archeops); -#endif //P_FAMILY_ARCHEN -#if P_FAMILY_TRUBBISH -SINGLE_ANIMATION(Trubbish); -SINGLE_ANIMATION(Garbodor); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(GarbodorGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_TRUBBISH -#if P_FAMILY_ZORUA -SINGLE_ANIMATION(Zorua); -SINGLE_ANIMATION(Zoroark); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(ZoruaHisui); -SINGLE_ANIMATION(ZoroarkHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_ZORUA -#if P_FAMILY_MINCCINO -SINGLE_ANIMATION(Minccino); -SINGLE_ANIMATION(Cinccino); -#endif //P_FAMILY_MINCCINO -#if P_FAMILY_GOTHITA -SINGLE_ANIMATION(Gothita); -SINGLE_ANIMATION(Gothorita); -SINGLE_ANIMATION(Gothitelle); -#endif //P_FAMILY_GOTHITA -#if P_FAMILY_SOLOSIS -SINGLE_ANIMATION(Solosis); -SINGLE_ANIMATION(Duosion); -SINGLE_ANIMATION(Reuniclus); -#endif //P_FAMILY_SOLOSIS -#if P_FAMILY_DUCKLETT -SINGLE_ANIMATION(Ducklett); -SINGLE_ANIMATION(Swanna); -#endif //P_FAMILY_DUCKLETT -#if P_FAMILY_VANILLITE -SINGLE_ANIMATION(Vanillite); -SINGLE_ANIMATION(Vanillish); -SINGLE_ANIMATION(Vanilluxe); -#endif //P_FAMILY_VANILLITE -#if P_FAMILY_DEERLING -SINGLE_ANIMATION(Deerling); -SINGLE_ANIMATION(Sawsbuck); -#endif //P_FAMILY_DEERLING -#if P_FAMILY_EMOLGA -SINGLE_ANIMATION(Emolga); -#endif //P_FAMILY_EMOLGA -#if P_FAMILY_KARRABLAST -SINGLE_ANIMATION(Karrablast); -SINGLE_ANIMATION(Escavalier); -#endif //P_FAMILY_KARRABLAST -#if P_FAMILY_FOONGUS -SINGLE_ANIMATION(Foongus); -SINGLE_ANIMATION(Amoonguss); -#endif //P_FAMILY_FOONGUS -#if P_FAMILY_FRILLISH -SINGLE_ANIMATION(Frillish); -SINGLE_ANIMATION(Jellicent); -#endif //P_FAMILY_FRILLISH -#if P_FAMILY_ALOMOMOLA -SINGLE_ANIMATION(Alomomola); -#endif //P_FAMILY_ALOMOMOLA -#if P_FAMILY_JOLTIK -SINGLE_ANIMATION(Joltik); -SINGLE_ANIMATION(Galvantula); -#endif //P_FAMILY_JOLTIK -#if P_FAMILY_FERROSEED -SINGLE_ANIMATION(Ferroseed); -SINGLE_ANIMATION(Ferrothorn); -#endif //P_FAMILY_FERROSEED -#if P_FAMILY_KLINK -SINGLE_ANIMATION(Klink); -SINGLE_ANIMATION(Klang); -SINGLE_ANIMATION(Klinklang); -#endif //P_FAMILY_KLINK -#if P_FAMILY_TYNAMO -SINGLE_ANIMATION(Tynamo); -SINGLE_ANIMATION(Eelektrik); -SINGLE_ANIMATION(Eelektross); -#endif //P_FAMILY_TYNAMO -#if P_FAMILY_ELGYEM -SINGLE_ANIMATION(Elgyem); -SINGLE_ANIMATION(Beheeyem); -#endif //P_FAMILY_ELGYEM -#if P_FAMILY_LITWICK -SINGLE_ANIMATION(Litwick); -SINGLE_ANIMATION(Lampent); -SINGLE_ANIMATION(Chandelure); -#endif //P_FAMILY_LITWICK -#if P_FAMILY_AXEW -SINGLE_ANIMATION(Axew); -SINGLE_ANIMATION(Fraxure); -SINGLE_ANIMATION(Haxorus); -#endif //P_FAMILY_AXEW -#if P_FAMILY_CUBCHOO -SINGLE_ANIMATION(Cubchoo); -SINGLE_ANIMATION(Beartic); -#endif //P_FAMILY_CUBCHOO -#if P_FAMILY_CRYOGONAL -SINGLE_ANIMATION(Cryogonal); -#endif //P_FAMILY_CRYOGONAL -#if P_FAMILY_SHELMET -SINGLE_ANIMATION(Shelmet); -SINGLE_ANIMATION(Accelgor); -#endif //P_FAMILY_SHELMET -#if P_FAMILY_STUNFISK -SINGLE_ANIMATION(Stunfisk); -#if P_GALARIAN_FORMS -SINGLE_ANIMATION(StunfiskGalar); -#endif //P_GALARIAN_FORMS -#endif //P_FAMILY_STUNFISK -#if P_FAMILY_MIENFOO -SINGLE_ANIMATION(Mienfoo); -SINGLE_ANIMATION(Mienshao); -#endif //P_FAMILY_MIENFOO -#if P_FAMILY_DRUDDIGON -SINGLE_ANIMATION(Druddigon); -#endif //P_FAMILY_DRUDDIGON -#if P_FAMILY_GOLETT -SINGLE_ANIMATION(Golett); -SINGLE_ANIMATION(Golurk); -#endif //P_FAMILY_GOLETT -#if P_FAMILY_PAWNIARD -SINGLE_ANIMATION(Pawniard); -SINGLE_ANIMATION(Bisharp); -#if P_GEN_9_CROSS_EVOS -SINGLE_ANIMATION(Kingambit); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_PAWNIARD -#if P_FAMILY_BOUFFALANT -SINGLE_ANIMATION(Bouffalant); -#endif //P_FAMILY_BOUFFALANT -#if P_FAMILY_RUFFLET -SINGLE_ANIMATION(Rufflet); -SINGLE_ANIMATION(Braviary); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(BraviaryHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_RUFFLET -#if P_FAMILY_VULLABY -SINGLE_ANIMATION(Vullaby); -SINGLE_ANIMATION(Mandibuzz); -#endif //P_FAMILY_VULLABY -#if P_FAMILY_HEATMOR -SINGLE_ANIMATION(Heatmor); -#endif //P_FAMILY_HEATMOR -#if P_FAMILY_DURANT -SINGLE_ANIMATION(Durant); -#endif //P_FAMILY_DURANT -#if P_FAMILY_DEINO -SINGLE_ANIMATION(Deino); -SINGLE_ANIMATION(Zweilous); -SINGLE_ANIMATION(Hydreigon); -#endif //P_FAMILY_DEINO -#if P_FAMILY_LARVESTA -SINGLE_ANIMATION(Larvesta); -SINGLE_ANIMATION(Volcarona); -#endif //P_FAMILY_LARVESTA -#if P_FAMILY_COBALION -SINGLE_ANIMATION(Cobalion); -#endif //P_FAMILY_COBALION -#if P_FAMILY_TERRAKION -SINGLE_ANIMATION(Terrakion); -#endif //P_FAMILY_TERRAKION -#if P_FAMILY_VIRIZION -SINGLE_ANIMATION(Virizion); -#endif //P_FAMILY_VIRIZION -#if P_FAMILY_TORNADUS -SINGLE_ANIMATION(TornadusIncarnate); -SINGLE_ANIMATION(TornadusTherian); -#endif //P_FAMILY_TORNADUS -#if P_FAMILY_THUNDURUS -SINGLE_ANIMATION(ThundurusIncarnate); -SINGLE_ANIMATION(ThundurusTherian); -#endif //P_FAMILY_THUNDURUS -#if P_FAMILY_RESHIRAM -SINGLE_ANIMATION(Reshiram); -#endif //P_FAMILY_RESHIRAM -#if P_FAMILY_ZEKROM -SINGLE_ANIMATION(Zekrom); -#endif //P_FAMILY_ZEKROM -#if P_FAMILY_LANDORUS -SINGLE_ANIMATION(LandorusIncarnate); -SINGLE_ANIMATION(LandorusTherian); -#endif //P_FAMILY_LANDORUS -#if P_FAMILY_KYUREM -SINGLE_ANIMATION(Kyurem); -#if P_FUSION_FORMS -SINGLE_ANIMATION(KyuremWhite); -SINGLE_ANIMATION(KyuremBlack); -#endif //P_FUSION_FORMS -#endif //P_FAMILY_KYUREM -#if P_FAMILY_KELDEO -SINGLE_ANIMATION(KeldeoOrdinary); -SINGLE_ANIMATION(KeldeoResolute); -#endif //P_FAMILY_KELDEO -#if P_FAMILY_MELOETTA -SINGLE_ANIMATION(MeloettaAria); -SINGLE_ANIMATION(MeloettaPirouette); -#endif //P_FAMILY_MELOETTA -#if P_FAMILY_GENESECT -SINGLE_ANIMATION(Genesect); -#endif //P_FAMILY_GENESECT -#if P_FAMILY_CHESPIN -SINGLE_ANIMATION(Chespin); -SINGLE_ANIMATION(Quilladin); -SINGLE_ANIMATION(Chesnaught); -#endif //P_FAMILY_CHESPIN -#if P_FAMILY_FENNEKIN -SINGLE_ANIMATION(Fennekin); -SINGLE_ANIMATION(Braixen); -SINGLE_ANIMATION(Delphox); -#endif //P_FAMILY_FENNEKIN -#if P_FAMILY_FROAKIE -SINGLE_ANIMATION(Froakie); -SINGLE_ANIMATION(Frogadier); -SINGLE_ANIMATION(Greninja); -SINGLE_ANIMATION(GreninjaAsh); -#endif //P_FAMILY_FROAKIE -#if P_FAMILY_BUNNELBY -SINGLE_ANIMATION(Bunnelby); -SINGLE_ANIMATION(Diggersby); -#endif //P_FAMILY_BUNNELBY -#if P_FAMILY_FLETCHLING -SINGLE_ANIMATION(Fletchling); -SINGLE_ANIMATION(Fletchinder); -SINGLE_ANIMATION(Talonflame); -#endif //P_FAMILY_FLETCHLING -#if P_FAMILY_SCATTERBUG -SINGLE_ANIMATION(Scatterbug); -SINGLE_ANIMATION(Spewpa); -SINGLE_ANIMATION(Vivillon); -#endif //P_FAMILY_SCATTERBUG -#if P_FAMILY_LITLEO -SINGLE_ANIMATION(Litleo); -SINGLE_ANIMATION(Pyroar); -#endif //P_FAMILY_LITLEO -#if P_FAMILY_FLABEBE -SINGLE_ANIMATION(Flabebe); -SINGLE_ANIMATION(Floette); -SINGLE_ANIMATION(Florges); -#endif //P_FAMILY_FLABEBE -#if P_FAMILY_SKIDDO -SINGLE_ANIMATION(Skiddo); -SINGLE_ANIMATION(Gogoat); -#endif //P_FAMILY_SKIDDO -#if P_FAMILY_PANCHAM -SINGLE_ANIMATION(Pancham); -SINGLE_ANIMATION(Pangoro); -#endif //P_FAMILY_PANCHAM -#if P_FAMILY_FURFROU -SINGLE_ANIMATION(Furfrou); -#endif //P_FAMILY_FURFROU -#if P_FAMILY_ESPURR -SINGLE_ANIMATION(Espurr); -SINGLE_ANIMATION(Meowstic); -#endif //P_FAMILY_ESPURR -#if P_FAMILY_HONEDGE -SINGLE_ANIMATION(Honedge); -SINGLE_ANIMATION(Doublade); -SINGLE_ANIMATION(AegislashShield); -SINGLE_ANIMATION(AegislashBlade); -#endif //P_FAMILY_HONEDGE -#if P_FAMILY_SPRITZEE -SINGLE_ANIMATION(Spritzee); -SINGLE_ANIMATION(Aromatisse); -#endif //P_FAMILY_SPRITZEE -#if P_FAMILY_SWIRLIX -SINGLE_ANIMATION(Swirlix); -SINGLE_ANIMATION(Slurpuff); -#endif //P_FAMILY_SWIRLIX -#if P_FAMILY_INKAY -SINGLE_ANIMATION(Inkay); -SINGLE_ANIMATION(Malamar); -#endif //P_FAMILY_INKAY -#if P_FAMILY_BINACLE -SINGLE_ANIMATION(Binacle); -SINGLE_ANIMATION(Barbaracle); -#endif //P_FAMILY_BINACLE -#if P_FAMILY_SKRELP -SINGLE_ANIMATION(Skrelp); -SINGLE_ANIMATION(Dragalge); -#endif //P_FAMILY_SKRELP -#if P_FAMILY_CLAUNCHER -SINGLE_ANIMATION(Clauncher); -SINGLE_ANIMATION(Clawitzer); -#endif //P_FAMILY_CLAUNCHER -#if P_FAMILY_HELIOPTILE -SINGLE_ANIMATION(Helioptile); -SINGLE_ANIMATION(Heliolisk); -#endif //P_FAMILY_HELIOPTILE -#if P_FAMILY_TYRUNT -SINGLE_ANIMATION(Tyrunt); -SINGLE_ANIMATION(Tyrantrum); -#endif //P_FAMILY_TYRUNT -#if P_FAMILY_AMAURA -SINGLE_ANIMATION(Amaura); -SINGLE_ANIMATION(Aurorus); -#endif //P_FAMILY_AMAURA -#if P_FAMILY_HAWLUCHA -SINGLE_ANIMATION(Hawlucha); -#endif //P_FAMILY_HAWLUCHA -#if P_FAMILY_DEDENNE -SINGLE_ANIMATION(Dedenne); -#endif //P_FAMILY_DEDENNE -#if P_FAMILY_CARBINK -SINGLE_ANIMATION(Carbink); -#endif //P_FAMILY_CARBINK -#if P_FAMILY_GOOMY -SINGLE_ANIMATION(Goomy); -SINGLE_ANIMATION(Sliggoo); -SINGLE_ANIMATION(Goodra); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(SliggooHisui); -SINGLE_ANIMATION(GoodraHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_GOOMY -#if P_FAMILY_KLEFKI -SINGLE_ANIMATION(Klefki); -#endif //P_FAMILY_KLEFKI -#if P_FAMILY_PHANTUMP -SINGLE_ANIMATION(Phantump); -SINGLE_ANIMATION(Trevenant); -#endif //P_FAMILY_PHANTUMP -#if P_FAMILY_PUMPKABOO -SINGLE_ANIMATION(Pumpkaboo); -SINGLE_ANIMATION(Gourgeist); -#endif //P_FAMILY_PUMPKABOO -#if P_FAMILY_BERGMITE -SINGLE_ANIMATION(Bergmite); -SINGLE_ANIMATION(Avalugg); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(AvaluggHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_BERGMITE -#if P_FAMILY_NOIBAT -SINGLE_ANIMATION(Noibat); -SINGLE_ANIMATION(Noivern); -#endif //P_FAMILY_NOIBAT -#if P_FAMILY_XERNEAS -SINGLE_ANIMATION(Xerneas); -#endif //P_FAMILY_XERNEAS -#if P_FAMILY_YVELTAL -SINGLE_ANIMATION(Yveltal); -#endif //P_FAMILY_YVELTAL -#if P_FAMILY_ZYGARDE -SINGLE_ANIMATION(Zygarde50); -SINGLE_ANIMATION(Zygarde10); -SINGLE_ANIMATION(ZygardeComplete); -#endif //P_FAMILY_ZYGARDE -#if P_FAMILY_DIANCIE -SINGLE_ANIMATION(Diancie); -#if P_MEGA_EVOLUTIONS -SINGLE_ANIMATION(DiancieMega); -#endif //P_MEGA_EVOLUTIONS -#endif //P_FAMILY_DIANCIE -#if P_FAMILY_HOOPA -SINGLE_ANIMATION(HoopaConfined); -SINGLE_ANIMATION(HoopaUnbound); -#endif //P_FAMILY_HOOPA -#if P_FAMILY_VOLCANION -SINGLE_ANIMATION(Volcanion); -#endif //P_FAMILY_VOLCANION -#if P_FAMILY_ROWLET -SINGLE_ANIMATION(Rowlet); -SINGLE_ANIMATION(Dartrix); -SINGLE_ANIMATION(Decidueye); -#if P_HISUIAN_FORMS -SINGLE_ANIMATION(DecidueyeHisui); -#endif //P_HISUIAN_FORMS -#endif //P_FAMILY_ROWLET -#if P_FAMILY_LITTEN -SINGLE_ANIMATION(Litten); -SINGLE_ANIMATION(Torracat); -SINGLE_ANIMATION(Incineroar); -#endif //P_FAMILY_LITTEN -#if P_FAMILY_POPPLIO -SINGLE_ANIMATION(Popplio); -SINGLE_ANIMATION(Brionne); -SINGLE_ANIMATION(Primarina); -#endif //P_FAMILY_POPPLIO -#if P_FAMILY_PIKIPEK -SINGLE_ANIMATION(Pikipek); -SINGLE_ANIMATION(Trumbeak); -SINGLE_ANIMATION(Toucannon); -#endif //P_FAMILY_PIKIPEK -#if P_FAMILY_YUNGOOS -SINGLE_ANIMATION(Yungoos); -SINGLE_ANIMATION(Gumshoos); -#endif //P_FAMILY_YUNGOOS -#if P_FAMILY_GRUBBIN -SINGLE_ANIMATION(Grubbin); -SINGLE_ANIMATION(Charjabug); -SINGLE_ANIMATION(Vikavolt); -#endif //P_FAMILY_GRUBBIN -#if P_FAMILY_CRABRAWLER -SINGLE_ANIMATION(Crabrawler); -SINGLE_ANIMATION(Crabominable); -#endif //P_FAMILY_CRABRAWLER -#if P_FAMILY_ORICORIO -SINGLE_ANIMATION(Oricorio); -#endif //P_FAMILY_ORICORIO -#if P_FAMILY_CUTIEFLY -SINGLE_ANIMATION(Cutiefly); -SINGLE_ANIMATION(Ribombee); -#endif //P_FAMILY_CUTIEFLY -#if P_FAMILY_ROCKRUFF -SINGLE_ANIMATION(Rockruff); -SINGLE_ANIMATION(LycanrocMidday); -SINGLE_ANIMATION(LycanrocMidnight); -SINGLE_ANIMATION(LycanrocDusk); -#endif //P_FAMILY_ROCKRUFF -#if P_FAMILY_WISHIWASHI -SINGLE_ANIMATION(WishiwashiSolo); -SINGLE_ANIMATION(WishiwashiSchool); -#endif //P_FAMILY_WISHIWASHI -#if P_FAMILY_MAREANIE -SINGLE_ANIMATION(Mareanie); -SINGLE_ANIMATION(Toxapex); -#endif //P_FAMILY_MAREANIE -#if P_FAMILY_MUDBRAY -SINGLE_ANIMATION(Mudbray); -SINGLE_ANIMATION(Mudsdale); -#endif //P_FAMILY_MUDBRAY -#if P_FAMILY_DEWPIDER -SINGLE_ANIMATION(Dewpider); -SINGLE_ANIMATION(Araquanid); -#endif //P_FAMILY_DEWPIDER -#if P_FAMILY_FOMANTIS -SINGLE_ANIMATION(Fomantis); -SINGLE_ANIMATION(Lurantis); -#endif //P_FAMILY_FOMANTIS -#if P_FAMILY_MORELULL -SINGLE_ANIMATION(Morelull); -SINGLE_ANIMATION(Shiinotic); -#endif //P_FAMILY_MORELULL -#if P_FAMILY_SALANDIT -SINGLE_ANIMATION(Salandit); -SINGLE_ANIMATION(Salazzle); -#endif //P_FAMILY_SALANDIT -#if P_FAMILY_STUFFUL -SINGLE_ANIMATION(Stufful); -SINGLE_ANIMATION(Bewear); -#endif //P_FAMILY_STUFFUL -#if P_FAMILY_BOUNSWEET -SINGLE_ANIMATION(Bounsweet); -SINGLE_ANIMATION(Steenee); -SINGLE_ANIMATION(Tsareena); -#endif //P_FAMILY_BOUNSWEET -#if P_FAMILY_COMFEY -SINGLE_ANIMATION(Comfey); -#endif //P_FAMILY_COMFEY -#if P_FAMILY_ORANGURU -SINGLE_ANIMATION(Oranguru); -#endif //P_FAMILY_ORANGURU -#if P_FAMILY_PASSIMIAN -SINGLE_ANIMATION(Passimian); -#endif //P_FAMILY_PASSIMIAN -#if P_FAMILY_WIMPOD -SINGLE_ANIMATION(Wimpod); -SINGLE_ANIMATION(Golisopod); -#endif //P_FAMILY_WIMPOD -#if P_FAMILY_SANDYGAST -SINGLE_ANIMATION(Sandygast); -SINGLE_ANIMATION(Palossand); -#endif //P_FAMILY_SANDYGAST -#if P_FAMILY_PYUKUMUKU -SINGLE_ANIMATION(Pyukumuku); -#endif //P_FAMILY_PYUKUMUKU -#if P_FAMILY_TYPE_NULL -SINGLE_ANIMATION(TypeNull); -SINGLE_ANIMATION(Silvally); -#endif //P_FAMILY_TYPE_NULL -#if P_FAMILY_MINIOR -SINGLE_ANIMATION(MiniorMeteor); -SINGLE_ANIMATION(MiniorCore); -#endif //P_FAMILY_MINIOR -#if P_FAMILY_KOMALA -SINGLE_ANIMATION(Komala); -#endif //P_FAMILY_KOMALA -#if P_FAMILY_TURTONATOR -SINGLE_ANIMATION(Turtonator); -#endif //P_FAMILY_TURTONATOR -#if P_FAMILY_TOGEDEMARU -SINGLE_ANIMATION(Togedemaru); -#endif //P_FAMILY_TOGEDEMARU -#if P_FAMILY_MIMIKYU -SINGLE_ANIMATION(MimikyuDisguised); -SINGLE_ANIMATION(MimikyuBusted); -#endif //P_FAMILY_MIMIKYU -#if P_FAMILY_BRUXISH -SINGLE_ANIMATION(Bruxish); -#endif //P_FAMILY_BRUXISH -#if P_FAMILY_DRAMPA -SINGLE_ANIMATION(Drampa); -#endif //P_FAMILY_DRAMPA -#if P_FAMILY_DHELMISE -SINGLE_ANIMATION(Dhelmise); -#endif //P_FAMILY_DHELMISE -#if P_FAMILY_JANGMO_O -SINGLE_ANIMATION(Jangmo_O); -SINGLE_ANIMATION(Hakamo_O); -SINGLE_ANIMATION(Kommo_O); -#endif //P_FAMILY_JANGMO_O -#if P_FAMILY_TAPU_KOKO -SINGLE_ANIMATION(TapuKoko); -#endif //P_FAMILY_TAPU_KOKO -#if P_FAMILY_TAPU_LELE -SINGLE_ANIMATION(TapuLele); -#endif //P_FAMILY_TAPU_LELE -#if P_FAMILY_TAPU_BULU -SINGLE_ANIMATION(TapuBulu); -#endif //P_FAMILY_TAPU_BULU -#if P_FAMILY_TAPU_FINI -SINGLE_ANIMATION(TapuFini); -#endif //P_FAMILY_TAPU_FINI -#if P_FAMILY_COSMOG -SINGLE_ANIMATION(Cosmog); -SINGLE_ANIMATION(Cosmoem); -SINGLE_ANIMATION(Solgaleo); -SINGLE_ANIMATION(Lunala); -#endif //P_FAMILY_COSMOG -#if P_FAMILY_NIHILEGO -SINGLE_ANIMATION(Nihilego); -#endif //P_FAMILY_NIHILEGO -#if P_FAMILY_BUZZWOLE -SINGLE_ANIMATION(Buzzwole); -#endif //P_FAMILY_BUZZWOLE -#if P_FAMILY_PHEROMOSA -SINGLE_ANIMATION(Pheromosa); -#endif //P_FAMILY_PHEROMOSA -#if P_FAMILY_XURKITREE -SINGLE_ANIMATION(Xurkitree); -#endif //P_FAMILY_XURKITREE -#if P_FAMILY_CELESTEELA -SINGLE_ANIMATION(Celesteela); -#endif //P_FAMILY_CELESTEELA -#if P_FAMILY_KARTANA -SINGLE_ANIMATION(Kartana); -#endif //P_FAMILY_KARTANA -#if P_FAMILY_GUZZLORD -SINGLE_ANIMATION(Guzzlord); -#endif //P_FAMILY_GUZZLORD -#if P_FAMILY_NECROZMA -SINGLE_ANIMATION(Necrozma); -#endif //P_FAMILY_NECROZMA -#if P_FAMILY_MAGEARNA -SINGLE_ANIMATION(Magearna); -#endif //P_FAMILY_MAGEARNA -#if P_FAMILY_MARSHADOW -SINGLE_ANIMATION(Marshadow); -#endif //P_FAMILY_MARSHADOW -#if P_FAMILY_POIPOLE -SINGLE_ANIMATION(Poipole); -SINGLE_ANIMATION(Naganadel); -#endif //P_FAMILY_POIPOLE -#if P_FAMILY_STAKATAKA -SINGLE_ANIMATION(Stakataka); -#endif //P_FAMILY_STAKATAKA -#if P_FAMILY_BLACEPHALON -SINGLE_ANIMATION(Blacephalon); -#endif //P_FAMILY_BLACEPHALON -#if P_FAMILY_ZERAORA -SINGLE_ANIMATION(Zeraora); -#endif //P_FAMILY_ZERAORA -#if P_FAMILY_MELTAN -SINGLE_ANIMATION(Meltan); -SINGLE_ANIMATION(Melmetal); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(MelmetalGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_MELTAN -#if P_FAMILY_GROOKEY -SINGLE_ANIMATION(Grookey); -SINGLE_ANIMATION(Thwackey); -SINGLE_ANIMATION(Rillaboom); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(RillaboomGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_GROOKEY -#if P_FAMILY_SCORBUNNY -SINGLE_ANIMATION(Scorbunny); -SINGLE_ANIMATION(Raboot); -SINGLE_ANIMATION(Cinderace); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(CinderaceGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SCORBUNNY -#if P_FAMILY_SOBBLE -SINGLE_ANIMATION(Sobble); -SINGLE_ANIMATION(Drizzile); -SINGLE_ANIMATION(Inteleon); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(InteleonGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SOBBLE -#if P_FAMILY_SKWOVET -SINGLE_ANIMATION(Skwovet); -SINGLE_ANIMATION(Greedent); -#endif //P_FAMILY_SKWOVET -#if P_FAMILY_ROOKIDEE -SINGLE_ANIMATION(Rookidee); -SINGLE_ANIMATION(Corvisquire); -SINGLE_ANIMATION(Corviknight); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(CorviknightGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_ROOKIDEE -#if P_FAMILY_BLIPBUG -SINGLE_ANIMATION(Blipbug); -SINGLE_ANIMATION(Dottler); -SINGLE_ANIMATION(Orbeetle); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(OrbeetleGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_BLIPBUG -#if P_FAMILY_NICKIT -SINGLE_ANIMATION(Nickit); -SINGLE_ANIMATION(Thievul); -#endif //P_FAMILY_NICKIT -#if P_FAMILY_GOSSIFLEUR -SINGLE_ANIMATION(Gossifleur); -SINGLE_ANIMATION(Eldegoss); -#endif //P_FAMILY_GOSSIFLEUR -#if P_FAMILY_WOOLOO -SINGLE_ANIMATION(Wooloo); -SINGLE_ANIMATION(Dubwool); -#endif //P_FAMILY_WOOLOO -#if P_FAMILY_CHEWTLE -SINGLE_ANIMATION(Chewtle); -SINGLE_ANIMATION(Drednaw); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(DrednawGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_CHEWTLE -#if P_FAMILY_YAMPER -SINGLE_ANIMATION(Yamper); -SINGLE_ANIMATION(Boltund); -#endif //P_FAMILY_YAMPER -#if P_FAMILY_ROLYCOLY -SINGLE_ANIMATION(Rolycoly); -SINGLE_ANIMATION(Carkol); -SINGLE_ANIMATION(Coalossal); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(CoalossalGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_ROLYCOLY -#if P_FAMILY_APPLIN -SINGLE_ANIMATION(Applin); -SINGLE_ANIMATION(Flapple); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(FlappleGmax); -#endif //P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(Appletun); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(AppletunGmax); -#endif //P_GIGANTAMAX_FORMS -#if P_GEN_9_CROSS_EVOS -SINGLE_ANIMATION(Dipplin); -SINGLE_ANIMATION(Hydrapple); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_APPLIN -#if P_FAMILY_SILICOBRA -SINGLE_ANIMATION(Silicobra); -SINGLE_ANIMATION(Sandaconda); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(SandacondaGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SILICOBRA -#if P_FAMILY_CRAMORANT -SINGLE_ANIMATION(Cramorant); -#endif //P_FAMILY_CRAMORANT -#if P_FAMILY_ARROKUDA -SINGLE_ANIMATION(Arrokuda); -SINGLE_ANIMATION(Barraskewda); -#endif //P_FAMILY_ARROKUDA -#if P_FAMILY_TOXEL -SINGLE_ANIMATION(Toxel); -SINGLE_ANIMATION(Toxtricity); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(ToxtricityGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_TOXEL -#if P_FAMILY_SIZZLIPEDE -SINGLE_ANIMATION(Sizzlipede); -SINGLE_ANIMATION(Centiskorch); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(CentiskorchGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_SIZZLIPEDE -#if P_FAMILY_CLOBBOPUS -SINGLE_ANIMATION(Clobbopus); -SINGLE_ANIMATION(Grapploct); -#endif //P_FAMILY_CLOBBOPUS -#if P_FAMILY_SINISTEA -SINGLE_ANIMATION(Sinistea); -SINGLE_ANIMATION(Polteageist); -#endif //P_FAMILY_SINISTEA -#if P_FAMILY_HATENNA -SINGLE_ANIMATION(Hatenna); -SINGLE_ANIMATION(Hattrem); -SINGLE_ANIMATION(Hatterene); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(HattereneGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_HATENNA -#if P_FAMILY_IMPIDIMP -SINGLE_ANIMATION(Impidimp); -SINGLE_ANIMATION(Morgrem); -SINGLE_ANIMATION(Grimmsnarl); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(GrimmsnarlGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_IMPIDIMP -#if P_FAMILY_MILCERY -SINGLE_ANIMATION(Milcery); -SINGLE_ANIMATION(Alcremie); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(AlcremieGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_MILCERY -#if P_FAMILY_FALINKS -SINGLE_ANIMATION(Falinks); -#endif //P_FAMILY_FALINKS -#if P_FAMILY_PINCURCHIN -SINGLE_ANIMATION(Pincurchin); -#endif //P_FAMILY_PINCURCHIN -#if P_FAMILY_SNOM -SINGLE_ANIMATION(Snom); -SINGLE_ANIMATION(Frosmoth); -#endif //P_FAMILY_SNOM -#if P_FAMILY_STONJOURNER -SINGLE_ANIMATION(Stonjourner); -#endif //P_FAMILY_STONJOURNER -#if P_FAMILY_EISCUE -SINGLE_ANIMATION(Eiscue); -#endif //P_FAMILY_EISCUE -#if P_FAMILY_INDEEDEE -SINGLE_ANIMATION(Indeedee); -#endif //P_FAMILY_INDEEDEE -#if P_FAMILY_MORPEKO -SINGLE_ANIMATION(Morpeko); -#endif //P_FAMILY_MORPEKO -#if P_FAMILY_CUFANT -SINGLE_ANIMATION(Cufant); -SINGLE_ANIMATION(Copperajah); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(CopperajahGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_CUFANT -#if P_FAMILY_DRACOZOLT -SINGLE_ANIMATION(Dracozolt); -#endif //P_FAMILY_DRACOZOLT -#if P_FAMILY_ARCTOZOLT -SINGLE_ANIMATION(Arctozolt); -#endif //P_FAMILY_ARCTOZOLT -#if P_FAMILY_DRACOVISH -SINGLE_ANIMATION(Dracovish); -#endif //P_FAMILY_DRACOVISH -#if P_FAMILY_ARCTOVISH -SINGLE_ANIMATION(Arctovish); -#endif //P_FAMILY_ARCTOVISH -#if P_FAMILY_DURALUDON -SINGLE_ANIMATION(Duraludon); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(DuraludonGmax); -#endif //P_GIGANTAMAX_FORMS -#if P_GEN_9_CROSS_EVOS -SINGLE_ANIMATION(Archaludon); -#endif //P_GEN_9_CROSS_EVOS -#endif //P_FAMILY_DURALUDON -#if P_FAMILY_DREEPY -SINGLE_ANIMATION(Dreepy); -SINGLE_ANIMATION(Drakloak); -SINGLE_ANIMATION(Dragapult); -#endif //P_FAMILY_DREEPY -#if P_FAMILY_ZACIAN -SINGLE_ANIMATION(Zacian); -#endif //P_FAMILY_ZACIAN -#if P_FAMILY_ZAMAZENTA -SINGLE_ANIMATION(Zamazenta); -#endif //P_FAMILY_ZAMAZENTA -#if P_FAMILY_ETERNATUS -SINGLE_ANIMATION(Eternatus); -#endif //P_FAMILY_ETERNATUS -#if P_FAMILY_KUBFU -SINGLE_ANIMATION(Kubfu); -SINGLE_ANIMATION(Urshifu); -#if P_GIGANTAMAX_FORMS -SINGLE_ANIMATION(UrshifuSingleStrikeGmax); -SINGLE_ANIMATION(UrshifuRapidStrikeGmax); -#endif //P_GIGANTAMAX_FORMS -#endif //P_FAMILY_KUBFU -#if P_FAMILY_ZARUDE -SINGLE_ANIMATION(Zarude); -#endif //P_FAMILY_ZARUDE -#if P_FAMILY_REGIELEKI -SINGLE_ANIMATION(Regieleki); -#endif //P_FAMILY_REGIELEKI -#if P_FAMILY_REGIDRAGO -SINGLE_ANIMATION(Regidrago); -#endif //P_FAMILY_REGIDRAGO -#if P_FAMILY_GLASTRIER -SINGLE_ANIMATION(Glastrier); -#endif //P_FAMILY_GLASTRIER -#if P_FAMILY_SPECTRIER -SINGLE_ANIMATION(Spectrier); -#endif //P_FAMILY_SPECTRIER -#if P_FAMILY_CALYREX -SINGLE_ANIMATION(Calyrex); -#endif //P_FAMILY_CALYREX -#if P_FAMILY_ENAMORUS -SINGLE_ANIMATION(EnamorusIncarnate); -SINGLE_ANIMATION(EnamorusTherian); -#endif //P_FAMILY_ENAMORUS -#if P_FAMILY_SPRIGATITO -SINGLE_ANIMATION(Sprigatito); -SINGLE_ANIMATION(Floragato); -SINGLE_ANIMATION(Meowscarada); -#endif //P_FAMILY_SPRIGATITO -#if P_FAMILY_FUECOCO -SINGLE_ANIMATION(Fuecoco); -SINGLE_ANIMATION(Crocalor); -SINGLE_ANIMATION(Skeledirge); -#endif //P_FAMILY_FUECOCO -#if P_FAMILY_QUAXLY -SINGLE_ANIMATION(Quaxly); -SINGLE_ANIMATION(Quaxwell); -SINGLE_ANIMATION(Quaquaval); -#endif //P_FAMILY_QUAXLY -#if P_FAMILY_LECHONK -SINGLE_ANIMATION(Lechonk); -SINGLE_ANIMATION(Oinkologne); -#endif //P_FAMILY_LECHONK -#if P_FAMILY_TAROUNTULA -SINGLE_ANIMATION(Tarountula); -SINGLE_ANIMATION(Spidops); -#endif //P_FAMILY_TAROUNTULA -#if P_FAMILY_NYMBLE -SINGLE_ANIMATION(Nymble); -SINGLE_ANIMATION(Lokix); -#endif //P_FAMILY_NYMBLE -#if P_FAMILY_PAWMI -SINGLE_ANIMATION(Pawmi); -SINGLE_ANIMATION(Pawmo); -SINGLE_ANIMATION(Pawmot); -#endif //P_FAMILY_PAWMI -#if P_FAMILY_TANDEMAUS -SINGLE_ANIMATION(Tandemaus); -SINGLE_ANIMATION(Maushold); -#endif //P_FAMILY_TANDEMAUS -#if P_FAMILY_FIDOUGH -SINGLE_ANIMATION(Fidough); -SINGLE_ANIMATION(Dachsbun); -#endif //P_FAMILY_FIDOUGH -#if P_FAMILY_SMOLIV -SINGLE_ANIMATION(Smoliv); -SINGLE_ANIMATION(Dolliv); -SINGLE_ANIMATION(Arboliva); -#endif //P_FAMILY_SMOLIV -#if P_FAMILY_SQUAWKABILLY -SINGLE_ANIMATION(Squawkabilly); -#endif //P_FAMILY_SQUAWKABILLY -#if P_FAMILY_NACLI -SINGLE_ANIMATION(Nacli); -SINGLE_ANIMATION(Naclstack); -SINGLE_ANIMATION(Garganacl); -#endif //P_FAMILY_NACLI -#if P_FAMILY_CHARCADET -SINGLE_ANIMATION(Charcadet); -SINGLE_ANIMATION(Armarouge); -SINGLE_ANIMATION(Ceruledge); -#endif //P_FAMILY_CHARCADET -#if P_FAMILY_TADBULB -SINGLE_ANIMATION(Tadbulb); -SINGLE_ANIMATION(Bellibolt); -#endif //P_FAMILY_TADBULB -#if P_FAMILY_WATTREL -SINGLE_ANIMATION(Wattrel); -SINGLE_ANIMATION(Kilowattrel); -#endif //P_FAMILY_WATTREL -#if P_FAMILY_MASCHIFF -SINGLE_ANIMATION(Maschiff); -SINGLE_ANIMATION(Mabosstiff); -#endif //P_FAMILY_MASCHIFF -#if P_FAMILY_SHROODLE -SINGLE_ANIMATION(Shroodle); -SINGLE_ANIMATION(Grafaiai); -#endif //P_FAMILY_SHROODLE -#if P_FAMILY_BRAMBLIN -SINGLE_ANIMATION(Bramblin); -SINGLE_ANIMATION(Brambleghast); -#endif //P_FAMILY_BRAMBLIN -#if P_FAMILY_TOEDSCOOL -SINGLE_ANIMATION(Toedscool); -SINGLE_ANIMATION(Toedscruel); -#endif //P_FAMILY_TOEDSCOOL -#if P_FAMILY_KLAWF -SINGLE_ANIMATION(Klawf); -#endif //P_FAMILY_KLAWF -#if P_FAMILY_CAPSAKID -SINGLE_ANIMATION(Capsakid); -SINGLE_ANIMATION(Scovillain); -#endif //P_FAMILY_CAPSAKID -#if P_FAMILY_RELLOR -SINGLE_ANIMATION(Rellor); -SINGLE_ANIMATION(Rabsca); -#endif //P_FAMILY_RELLOR -#if P_FAMILY_FLITTLE -SINGLE_ANIMATION(Flittle); -SINGLE_ANIMATION(Espathra); -#endif //P_FAMILY_FLITTLE -#if P_FAMILY_TINKATINK -SINGLE_ANIMATION(Tinkatink); -SINGLE_ANIMATION(Tinkatuff); -SINGLE_ANIMATION(Tinkaton); -#endif //P_FAMILY_TINKATINK -#if P_FAMILY_WIGLETT -SINGLE_ANIMATION(Wiglett); -SINGLE_ANIMATION(Wugtrio); -#endif //P_FAMILY_WIGLETT -#if P_FAMILY_BOMBIRDIER -SINGLE_ANIMATION(Bombirdier); -#endif //P_FAMILY_BOMBIRDIER -#if P_FAMILY_FINIZEN -SINGLE_ANIMATION(Finizen); -SINGLE_ANIMATION(Palafin); -#endif //P_FAMILY_FINIZEN -#if P_FAMILY_VAROOM -SINGLE_ANIMATION(Varoom); -SINGLE_ANIMATION(Revavroom); -#endif //P_FAMILY_VAROOM -#if P_FAMILY_CYCLIZAR -SINGLE_ANIMATION(Cyclizar); -#endif //P_FAMILY_CYCLIZAR -#if P_FAMILY_ORTHWORM -SINGLE_ANIMATION(Orthworm); -#endif //P_FAMILY_ORTHWORM -#if P_FAMILY_GLIMMET -SINGLE_ANIMATION(Glimmet); -SINGLE_ANIMATION(Glimmora); -#endif //P_FAMILY_GLIMMET -#if P_FAMILY_GREAVARD -SINGLE_ANIMATION(Greavard); -SINGLE_ANIMATION(Houndstone); -#endif //P_FAMILY_GREAVARD -#if P_FAMILY_FLAMIGO -SINGLE_ANIMATION(Flamigo); -#endif //P_FAMILY_FLAMIGO -#if P_FAMILY_CETODDLE -SINGLE_ANIMATION(Cetoddle); -SINGLE_ANIMATION(Cetitan); -#endif //P_FAMILY_CETODDLE -#if P_FAMILY_VELUZA -SINGLE_ANIMATION(Veluza); -#endif //P_FAMILY_VELUZA -#if P_FAMILY_DONDOZO -SINGLE_ANIMATION(Dondozo); -#endif //P_FAMILY_DONDOZO -#if P_FAMILY_TATSUGIRI -SINGLE_ANIMATION(Tatsugiri); -#endif //P_FAMILY_TATSUGIRI -#if P_FAMILY_GREAT_TUSK -SINGLE_ANIMATION(GreatTusk); -#endif //P_FAMILY_GREAT_TUSK -#if P_FAMILY_SCREAM_TAIL -SINGLE_ANIMATION(ScreamTail); -#endif //P_FAMILY_SCREAM_TAIL -#if P_FAMILY_BRUTE_BONNET -SINGLE_ANIMATION(BruteBonnet); -#endif //P_FAMILY_BRUTE_BONNET -#if P_FAMILY_FLUTTER_MANE -SINGLE_ANIMATION(FlutterMane); -#endif //P_FAMILY_FLUTTER_MANE -#if P_FAMILY_SLITHER_WING -SINGLE_ANIMATION(SlitherWing); -#endif //P_FAMILY_SLITHER_WING -#if P_FAMILY_SANDY_SHOCKS -SINGLE_ANIMATION(SandyShocks); -#endif //P_FAMILY_SANDY_SHOCKS -#if P_FAMILY_IRON_TREADS -SINGLE_ANIMATION(IronTreads); -#endif //P_FAMILY_IRON_TREADS -#if P_FAMILY_IRON_BUNDLE -SINGLE_ANIMATION(IronBundle); -#endif //P_FAMILY_IRON_BUNDLE -#if P_FAMILY_IRON_HANDS -SINGLE_ANIMATION(IronHands); -#endif //P_FAMILY_IRON_HANDS -#if P_FAMILY_IRON_JUGULIS -SINGLE_ANIMATION(IronJugulis); -#endif //P_FAMILY_IRON_JUGULIS -#if P_FAMILY_IRON_MOTH -SINGLE_ANIMATION(IronMoth); -#endif //P_FAMILY_IRON_MOTH -#if P_FAMILY_IRON_THORNS -SINGLE_ANIMATION(IronThorns); -#endif //P_FAMILY_IRON_THORNS -#if P_FAMILY_FRIGIBAX -SINGLE_ANIMATION(Frigibax); -SINGLE_ANIMATION(Arctibax); -SINGLE_ANIMATION(Baxcalibur); -#endif //P_FAMILY_FRIGIBAX -#if P_FAMILY_GIMMIGHOUL -SINGLE_ANIMATION(Gimmighoul); -SINGLE_ANIMATION(Gholdengo); -#endif //P_FAMILY_GIMMIGHOUL -#if P_FAMILY_WO_CHIEN -SINGLE_ANIMATION(WoChien); -#endif //P_FAMILY_WO_CHIEN -#if P_FAMILY_CHIEN_PAO -SINGLE_ANIMATION(ChienPao); -#endif //P_FAMILY_CHIEN_PAO -#if P_FAMILY_TING_LU -SINGLE_ANIMATION(TingLu); -#endif //P_FAMILY_TING_LU -#if P_FAMILY_CHI_YU -SINGLE_ANIMATION(ChiYu); -#endif //P_FAMILY_CHI_YU -#if P_FAMILY_ROARING_MOON -SINGLE_ANIMATION(RoaringMoon); -#endif //P_FAMILY_ROARING_MOON -#if P_FAMILY_IRON_VALIANT -SINGLE_ANIMATION(IronValiant); -#endif //P_FAMILY_IRON_VALIANT -#if P_FAMILY_KORAIDON -SINGLE_ANIMATION(Koraidon); -#endif //P_FAMILY_KORAIDON -#if P_FAMILY_MIRAIDON -SINGLE_ANIMATION(Miraidon); -#endif //P_FAMILY_MIRAIDON -#if P_FAMILY_WALKING_WAKE -SINGLE_ANIMATION(WalkingWake); -#endif //P_FAMILY_WALKING_WAKE -#if P_FAMILY_IRON_LEAVES -SINGLE_ANIMATION(IronLeaves); -#endif //P_FAMILY_IRON_LEAVES -#if P_FAMILY_POLTCHAGEIST -SINGLE_ANIMATION(Poltchageist); -SINGLE_ANIMATION(Sinistcha); -#endif //P_FAMILY_POLTCHAGEIST -#if P_FAMILY_OKIDOGI -SINGLE_ANIMATION(Okidogi); -#endif //P_FAMILY_OKIDOGI -#if P_FAMILY_MUNKIDORI -SINGLE_ANIMATION(Munkidori); -#endif //P_FAMILY_MUNKIDORI -#if P_FAMILY_FEZANDIPITI -SINGLE_ANIMATION(Fezandipiti); -#endif //P_FAMILY_FEZANDIPITI -#if P_FAMILY_OGERPON -SINGLE_ANIMATION(Ogerpon); -#endif //P_FAMILY_OGERPON -#if P_FAMILY_GOUGING_FIRE -SINGLE_ANIMATION(GougingFire); -#endif //P_FAMILY_GOUGING_FIRE -#if P_FAMILY_RAGING_BOLT -SINGLE_ANIMATION(RagingBolt); -#endif //P_FAMILY_RAGING_BOLT -#if P_FAMILY_IRON_BOULDER -SINGLE_ANIMATION(IronBoulder); -#endif //P_FAMILY_IRON_BOULDER -#if P_FAMILY_IRON_CROWN -SINGLE_ANIMATION(IronCrown); -#endif //P_FAMILY_IRON_CROWN -#if P_FAMILY_TERAPAGOS -SINGLE_ANIMATION(TerapagosNormal); -SINGLE_ANIMATION(TerapagosTerastal); -SINGLE_ANIMATION(TerapagosStellar); -#endif //P_FAMILY_TERAPAGOS -#if P_FAMILY_PECHARUNT -SINGLE_ANIMATION(Pecharunt); -#endif //P_FAMILY_PECHARUNT -SINGLE_ANIMATION(Egg); diff --git a/src/data/script_menu.h b/src/data/script_menu.h index 3b29171327..fc0b574a2f 100644 --- a/src/data/script_menu.h +++ b/src/data/script_menu.h @@ -1,23 +1,23 @@ // multichoice lists static const struct MenuAction MultichoiceList_BrineyOnDewford[] = { - {gText_Petalburg}, - {gText_Slateport}, + {COMPOUND_STRING("PETALBURG")}, + {COMPOUND_STRING("SLATEPORT")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_EnterInfo[] = { - {gText_Enter2}, + {COMPOUND_STRING("ENTER")}, {gText_Info2}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_ContestInfo[] = { - {gText_WhatsAContest}, - {gText_TypesOfContests}, - {gText_Ranks}, + {COMPOUND_STRING("What's a CONTEST?")}, + {COMPOUND_STRING("Types of CONTESTS")}, + {COMPOUND_STRING("Ranks")}, {gText_Cancel2}, }; @@ -56,30 +56,30 @@ static const struct MenuAction MultichoiceList_RegisterMenu[] = static const struct MenuAction MultichoiceList_Bike[] = { - {gText_Mach}, - {gText_Acro}, + {COMPOUND_STRING("MACH")}, + {COMPOUND_STRING("ACRO")}, }; static const struct MenuAction MultichoiceList_StatusInfo[] = { - {gText_Psn}, - {gText_Par}, - {gText_Slp}, - {gText_Brn}, - {gText_Frz}, + {COMPOUND_STRING("PSN")}, + {COMPOUND_STRING("PAR")}, + {COMPOUND_STRING("SLP")}, + {COMPOUND_STRING("BRN")}, + {COMPOUND_STRING("FRZ")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_BrineyOffDewford[] = { - {gText_Dewford}, + {COMPOUND_STRING("DEWFORD")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_ViewedPaintings[] = { - {gText_SawIt}, - {gText_NotYet}, + {COMPOUND_STRING("Saw it")}, + {COMPOUND_STRING("Not yet")}, }; static const struct MenuAction MultichoiceList_YesNoInfo2[] = @@ -91,8 +91,8 @@ static const struct MenuAction MultichoiceList_YesNoInfo2[] = static const struct MenuAction MultichoiceList_ChallengeInfo[] = { - {gText_Challenge}, - {gText_Info3}, + {COMPOUND_STRING("CHALLENGE")}, + {COMPOUND_STRING("INFO")}, {gText_Exit}, }; @@ -210,82 +210,82 @@ static const struct MenuAction MultichoiceList_Mechadoll5_Q3[] = static const struct MenuAction MultichoiceList_VendingMachine[] = { - {gText_FreshWaterAndPrice}, - {gText_SodaPopAndPrice}, - {gText_LemonadeAndPrice}, + {COMPOUND_STRING("FRESH WATER{CLEAR_TO 0x48}¥200")}, + {COMPOUND_STRING("SODA POP{CLEAR_TO 0x48}¥300")}, + {COMPOUND_STRING("LEMONADE{CLEAR_TO 0x48}¥350")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_MachBikeInfo[] = { - {gText_HowToRide}, - {gText_HowToTurn}, - {gText_SandySlopes}, + {COMPOUND_STRING("HOW TO RIDE")}, + {COMPOUND_STRING("HOW TO TURN")}, + {COMPOUND_STRING("SANDY SLOPES")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_AcroBikeInfo[] = { - {gText_Wheelies}, - {gText_BunnyHops}, - {gText_Jump}, + {COMPOUND_STRING("WHEELIES")}, + {COMPOUND_STRING("BUNNY-HOPS")}, + {COMPOUND_STRING("JUMP")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_Satisfaction[] = { - {gText_Satisfied}, - {gText_Dissatisfied}, + {COMPOUND_STRING("Satisfied")}, + {COMPOUND_STRING("Dissatisfied")}, }; static const struct MenuAction MultichoiceList_SternDeepSea[] = { - {gText_DeepSeaTooth}, - {gText_DeepSeaScale}, + {COMPOUND_STRING("DEEPSEATOOTH")}, + {COMPOUND_STRING("DEEPSEASCALE")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_UnusedAshVendor[] = { - {gText_BlueFlute2}, - {gText_YellowFlute2}, - {gText_RedFlute2}, - {gText_WhiteFlute2}, - {gText_BlackFlute2}, - {gText_GlassChair}, - {gText_GlassDesk}, + {COMPOUND_STRING("BLUE FLUTE")}, + {COMPOUND_STRING("YELLOW FLUTE")}, + {COMPOUND_STRING("RED FLUTE")}, + {COMPOUND_STRING("WHITE FLUTE")}, + {COMPOUND_STRING("BLACK FLUTE")}, + {COMPOUND_STRING("GLASS CHAIR")}, + {COMPOUND_STRING("GLASS DESK")}, {gText_Cancel2}, }; static const struct MenuAction MultichoiceList_GameCornerDolls[] = { - {gText_TreeckoDollAndPrice}, - {gText_TorchicDollAndPrice}, - {gText_MudkipDollAndPrice}, + {COMPOUND_STRING("TREECKO DOLL 1,000 COINS")}, + {COMPOUND_STRING("TORCHIC DOLL 1,000 COINS")}, + {COMPOUND_STRING("MUDKIP DOLL 1,000 COINS")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_GameCornerTMs[] = { - {gText_TM32AndPrice}, - {gText_TM29AndPrice}, - {gText_TM35AndPrice}, - {gText_TM24AndPrice}, - {gText_TM13AndPrice}, + {COMPOUND_STRING("TM32{CLEAR_TO 0x48}1,500 COINS")}, + {COMPOUND_STRING("TM29{CLEAR_TO 0x48}3,500 COINS")}, + {COMPOUND_STRING("TM35{CLEAR_TO 0x48}4,000 COINS")}, + {COMPOUND_STRING("TM24{CLEAR_TO 0x48}4,000 COINS")}, + {COMPOUND_STRING("TM13{CLEAR_TO 0x48}4,000 COINS")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_GameCornerCoins[] = { - {gText_50CoinsAndPrice}, - {gText_500CoinsAndPrice}, + {COMPOUND_STRING(" 50 COINS ¥1,000")}, + {COMPOUND_STRING("500 COINS ¥10,000")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_HowsFishing[] = { - {gText_Excellent2}, - {gText_NotSoGood}, + {COMPOUND_STRING("Excellent")}, + {COMPOUND_STRING("Not so good")}, }; static const struct MenuAction MultichoiceList_SSTidalSlateportWithBF[] = @@ -304,8 +304,8 @@ static const struct MenuAction MultichoiceList_SSTidalBattleFrontier[] = static const struct MenuAction MultichoiceList_RightLeft[] = { - {gText_Right}, - {gText_Left}, + {COMPOUND_STRING("Right")}, + {COMPOUND_STRING("Left")}, }; static const struct MenuAction MultichoiceList_SSTidalSlateportNoBF[] = @@ -452,8 +452,8 @@ static const struct MenuAction MultichoiceList_TourneyNoRecord[] = static const struct MenuAction MultichoiceList_Tent[] = { - {gText_RedTent}, - {gText_BlueTent}, + {COMPOUND_STRING("RED TENT")}, + {COMPOUND_STRING("BLUE TENT")}, }; static const struct MenuAction MultichoiceList_LinkServicesNoBerry[] = @@ -473,9 +473,9 @@ static const struct MenuAction MultichoiceList_YesNoInfo[] = static const struct MenuAction MultichoiceList_BattleMode[] = { - {gText_SingleBattle}, - {gText_DoubleBattle}, - {gText_MultiBattle}, + {COMPOUND_STRING("SINGLE BATTLE")}, + {COMPOUND_STRING("DOUBLE BATTLE")}, + {COMPOUND_STRING("MULTI BATTLE")}, {gText_Info2}, {gText_Exit}, }; @@ -506,46 +506,46 @@ static const struct MenuAction MultichoiceList_LinkServicesNoRecordBerry[] = static const struct MenuAction MultichoiceList_WirelessMinigame[] = { - {gText_PokemonJump}, - {gText_DodrioBerryPicking}, + {COMPOUND_STRING("POKéMON JUMP")}, + {COMPOUND_STRING("DODRIO BERRY-PICKING")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_LinkLeader[] = { - {gText_JoinGroup}, - {gText_BecomeLeader}, + {COMPOUND_STRING("JOIN GROUP")}, + {COMPOUND_STRING("BECOME LEADER")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_ContestRank[] = { - {gText_NormalRank}, - {gText_SuperRank}, - {gText_HyperRank}, - {gText_MasterRank}, + {COMPOUND_STRING("NORMAL RANK")}, + {COMPOUND_STRING("SUPER RANK")}, + {COMPOUND_STRING("HYPER RANK")}, + {COMPOUND_STRING("MASTER RANK")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_FrontierItemChoose[] = { - {gText_BattleBag}, - {gText_HeldItem}, + {COMPOUND_STRING("BATTLE BAG")}, + {COMPOUND_STRING("HELD ITEM")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_LinkContestInfo[] = { - {gText_LinkContest}, - {gText_AboutE_Mode}, - {gText_AboutG_Mode}, + {COMPOUND_STRING("LINK CONTEST")}, + {COMPOUND_STRING("ABOUT E-MODE")}, + {COMPOUND_STRING("ABOUT G-MODE")}, {gText_Cancel2}, }; static const struct MenuAction MultichoiceList_LinkContestMode[] = { - {gText_E_Mode}, - {gText_G_Mode}, + {COMPOUND_STRING("E-MODE")}, + {COMPOUND_STRING("G-MODE")}, {gText_Exit}, }; @@ -563,9 +563,9 @@ static const struct MenuAction MultichoiceList_ForcedStartMenu[] = static const struct MenuAction MultichoiceList_FrontierGamblerBet[] = { - {gText_5BP}, - {gText_10BP}, - {gText_15BP}, + {COMPOUND_STRING(" 5BP")}, + {COMPOUND_STRING("10BP")}, + {COMPOUND_STRING("15BP")}, {gText_Exit}, }; @@ -600,32 +600,32 @@ static const struct MenuAction MultichoiceList_UnusedSSTidal4[] = static const struct MenuAction MultichoiceList_Fossil[] = { - {gText_ClawFossil}, - {gText_RootFossil}, + {COMPOUND_STRING("CLAW FOSSIL")}, + {COMPOUND_STRING("ROOT FOSSIL")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_YesNo[] = { {gText_Yes}, - {gText_No4}, + {COMPOUND_STRING("NO")}, }; static const struct MenuAction MultichoiceList_FrontierRules[] = { - {gText_TwoStyles}, - {gText_Lv50_3}, - {gText_OpenLevel2}, - {gText_MonTypeAndNo}, - {gText_HoldItems}, + {COMPOUND_STRING("TWO STYLES")}, + {COMPOUND_STRING("LV. 50")}, + {COMPOUND_STRING("OPEN LEVEL")}, + {COMPOUND_STRING("{PKMN} TYPE & NO.")}, + {COMPOUND_STRING("HOLD ITEMS")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_FrontierPassInfo[] = { - {gText_Symbols2}, - {gText_Record3}, - {gText_BattlePts}, + {COMPOUND_STRING("SYMBOLS")}, + {COMPOUND_STRING("RECORD")}, + {COMPOUND_STRING("BATTLE PTS")}, {gText_Exit}, }; @@ -640,18 +640,18 @@ static const struct MenuAction MultichoiceList_BattleArenaRules[] = static const struct MenuAction MultichoiceList_BattleTowerRules[] = { - {gText_TowerInfo}, - {gText_BattleMon}, - {gText_BattleSalon}, - {gText_MultiLink2}, + {COMPOUND_STRING("TOWER INFO")}, + {COMPOUND_STRING("BATTLE {PKMN}")}, + {COMPOUND_STRING("BATTLE SALON")}, + {COMPOUND_STRING("MULTI-LINK")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_BattleDomeRules[] = { - {gText_Matchup}, - {gText_TourneyTree}, - {gText_DoubleKO}, + {COMPOUND_STRING("MATCHUP")}, + {COMPOUND_STRING("TOURNEY TREE")}, + {COMPOUND_STRING("DOUBLE KO")}, {gText_Exit}, }; @@ -661,7 +661,7 @@ static const struct MenuAction MultichoiceList_BattleFactoryRules[] = {gText_SwapPartners}, {gText_SwapNumber}, {gText_SwapNotes}, - {gText_OpenLevel3}, + {COMPOUND_STRING("OPEN LEVEL")}, {gText_Exit}, }; @@ -677,18 +677,18 @@ static const struct MenuAction MultichoiceList_BattlePalaceRules[] = static const struct MenuAction MultichoiceList_BattlePyramidRules[] = { - {gText_PyramidPokemon}, - {gText_PyramidTrainers}, - {gText_PyramidMaze}, - {gText_BattleBag2}, + {COMPOUND_STRING("PYRAMID: POKéMON")}, + {COMPOUND_STRING("PYRAMID: TRAINERS")}, + {COMPOUND_STRING("PYRAMID: MAZE")}, + {COMPOUND_STRING("BATTLE BAG")}, {gText_Exit}, }; static const struct MenuAction MultichoiceList_BattlePikeRules[] = { - {gText_PokenavAndBag}, - {gText_HeldItems}, - {gText_PokemonOrder}, + {COMPOUND_STRING("POKéNAV AND BAG")}, + {COMPOUND_STRING("HELD ITEMS")}, + {COMPOUND_STRING("POKéMON ORDER")}, {gText_Exit}, }; @@ -722,24 +722,24 @@ static const struct MenuAction MultichoiceList_GoOnRetire[] = static const struct MenuAction MultichoiceList_TVLati[] = { - {gText_Red}, - {gText_Blue}, + {COMPOUND_STRING("RED")}, + {COMPOUND_STRING("BLUE")}, }; static const struct MenuAction MultichoiceList_BattleTowerFeelings[] = { - {gText_IllBattleNow}, - {gText_IWon}, - {gText_ILost}, - {gText_IWontTell}, + {COMPOUND_STRING("I'll battle now!")}, + {COMPOUND_STRING("I won!")}, + {COMPOUND_STRING("I lost!")}, + {COMPOUND_STRING("I won't tell.")}, }; static const struct MenuAction MultichoiceList_WheresRayquaza[] = { - {gText_CaveOfOrigin}, - {gText_MtPyre}, - {gText_SkyPillar}, - {gText_DontRemember}, + {COMPOUND_STRING("CAVE OF ORIGIN")}, + {COMPOUND_STRING("MT. PYRE")}, + {COMPOUND_STRING("SKY PILLAR")}, + {COMPOUND_STRING("Don't remember")}, }; static const struct MenuAction MultichoiceList_SlateportTentRules[] = @@ -773,8 +773,8 @@ static const struct MenuAction MultichoiceList_TagMatchType[] = static const struct MenuAction MultichoiceList_BerryPlot[] = { - {gText_Fertilize}, - {gText_PlantBerry}, + {COMPOUND_STRING("FERTILIZE")}, + {COMPOUND_STRING("PLANT BERRY")}, {gText_Exit}, }; diff --git a/src/data/trainers.h b/src/data/trainers.h index 222c5e2269..af19c90ae2 100644 --- a/src/data/trainers.h +++ b/src/data/trainers.h @@ -9,7 +9,7 @@ #line 1 "src/data/trainers.party" #line 76 - [TRAINER_NONE] = + [DIFFICULTY_NORMAL][TRAINER_NONE] = { #line 78 .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, @@ -26,7 +26,7 @@ }, }, #line 84 - [TRAINER_SAWYER_1] = + [DIFFICULTY_NORMAL][TRAINER_SAWYER_1] = { #line 85 .trainerName = _("SAWYER"), @@ -58,7 +58,7 @@ }, }, #line 97 - [TRAINER_GRUNT_AQUA_HIDEOUT_1] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_1] = { #line 98 .trainerName = _("GRUNT"), @@ -90,7 +90,7 @@ }, }, #line 110 - [TRAINER_GRUNT_AQUA_HIDEOUT_2] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_2] = { #line 111 .trainerName = _("GRUNT"), @@ -133,7 +133,7 @@ }, }, #line 127 - [TRAINER_GRUNT_AQUA_HIDEOUT_3] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_3] = { #line 128 .trainerName = _("GRUNT"), @@ -165,7 +165,7 @@ }, }, #line 140 - [TRAINER_GRUNT_AQUA_HIDEOUT_4] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_4] = { #line 141 .trainerName = _("GRUNT"), @@ -197,7 +197,7 @@ }, }, #line 153 - [TRAINER_GRUNT_SEAFLOOR_CAVERN_1] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_1] = { #line 154 .trainerName = _("GRUNT"), @@ -229,7 +229,7 @@ }, }, #line 166 - [TRAINER_GRUNT_SEAFLOOR_CAVERN_2] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_2] = { #line 167 .trainerName = _("GRUNT"), @@ -261,7 +261,7 @@ }, }, #line 179 - [TRAINER_GRUNT_SEAFLOOR_CAVERN_3] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_3] = { #line 180 .trainerName = _("GRUNT"), @@ -293,7 +293,7 @@ }, }, #line 192 - [TRAINER_GABRIELLE_1] = + [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_1] = { #line 193 .trainerName = _("GABRIELLE"), @@ -382,7 +382,7 @@ F_TRAINER_FEMALE | }, }, #line 225 - [TRAINER_GRUNT_PETALBURG_WOODS] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_PETALBURG_WOODS] = { #line 226 .trainerName = _("GRUNT"), @@ -414,7 +414,7 @@ F_TRAINER_FEMALE | }, }, #line 238 - [TRAINER_MARCEL] = + [DIFFICULTY_NORMAL][TRAINER_MARCEL] = { #line 239 .trainerName = _("MARCEL"), @@ -459,7 +459,7 @@ F_TRAINER_FEMALE | }, }, #line 256 - [TRAINER_ALBERTO] = + [DIFFICULTY_NORMAL][TRAINER_ALBERTO] = { #line 257 .trainerName = _("ALBERTO"), @@ -502,7 +502,7 @@ F_TRAINER_FEMALE | }, }, #line 273 - [TRAINER_ED] = + [DIFFICULTY_NORMAL][TRAINER_ED] = { #line 274 .trainerName = _("ED"), @@ -545,7 +545,7 @@ F_TRAINER_FEMALE | }, }, #line 290 - [TRAINER_GRUNT_SEAFLOOR_CAVERN_4] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_4] = { #line 291 .trainerName = _("GRUNT"), @@ -579,7 +579,7 @@ F_TRAINER_FEMALE | }, }, #line 303 - [TRAINER_DECLAN] = + [DIFFICULTY_NORMAL][TRAINER_DECLAN] = { #line 304 .trainerName = _("DECLAN"), @@ -611,7 +611,7 @@ F_TRAINER_FEMALE | }, }, #line 316 - [TRAINER_GRUNT_RUSTURF_TUNNEL] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_RUSTURF_TUNNEL] = { #line 317 .trainerName = _("GRUNT"), @@ -643,7 +643,7 @@ F_TRAINER_FEMALE | }, }, #line 329 - [TRAINER_GRUNT_WEATHER_INST_1] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_1] = { #line 330 .trainerName = _("GRUNT"), @@ -686,7 +686,7 @@ F_TRAINER_FEMALE | }, }, #line 346 - [TRAINER_GRUNT_WEATHER_INST_2] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_2] = { #line 347 .trainerName = _("GRUNT"), @@ -729,7 +729,7 @@ F_TRAINER_FEMALE | }, }, #line 363 - [TRAINER_GRUNT_WEATHER_INST_3] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_3] = { #line 364 .trainerName = _("GRUNT"), @@ -783,7 +783,7 @@ F_TRAINER_FEMALE | }, }, #line 384 - [TRAINER_GRUNT_MUSEUM_1] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MUSEUM_1] = { #line 385 .trainerName = _("GRUNT"), @@ -815,7 +815,7 @@ F_TRAINER_FEMALE | }, }, #line 397 - [TRAINER_GRUNT_MUSEUM_2] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MUSEUM_2] = { #line 398 .trainerName = _("GRUNT"), @@ -858,7 +858,7 @@ F_TRAINER_FEMALE | }, }, #line 414 - [TRAINER_GRUNT_SPACE_CENTER_1] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_1] = { #line 415 .trainerName = _("GRUNT"), @@ -890,7 +890,7 @@ F_TRAINER_FEMALE | }, }, #line 427 - [TRAINER_GRUNT_MT_PYRE_1] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_1] = { #line 428 .trainerName = _("GRUNT"), @@ -922,7 +922,7 @@ F_TRAINER_FEMALE | }, }, #line 440 - [TRAINER_GRUNT_MT_PYRE_2] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_2] = { #line 441 .trainerName = _("GRUNT"), @@ -954,7 +954,7 @@ F_TRAINER_FEMALE | }, }, #line 453 - [TRAINER_GRUNT_MT_PYRE_3] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_3] = { #line 454 .trainerName = _("GRUNT"), @@ -997,7 +997,7 @@ F_TRAINER_FEMALE | }, }, #line 470 - [TRAINER_GRUNT_WEATHER_INST_4] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_4] = { #line 471 .trainerName = _("GRUNT"), @@ -1031,7 +1031,7 @@ F_TRAINER_FEMALE | }, }, #line 483 - [TRAINER_GRUNT_AQUA_HIDEOUT_5] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_5] = { #line 484 .trainerName = _("GRUNT"), @@ -1065,7 +1065,7 @@ F_TRAINER_FEMALE | }, }, #line 496 - [TRAINER_GRUNT_AQUA_HIDEOUT_6] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_6] = { #line 497 .trainerName = _("GRUNT"), @@ -1099,7 +1099,7 @@ F_TRAINER_FEMALE | }, }, #line 509 - [TRAINER_FREDRICK] = + [DIFFICULTY_NORMAL][TRAINER_FREDRICK] = { #line 510 .trainerName = _("FREDRICK"), @@ -1142,7 +1142,7 @@ F_TRAINER_FEMALE | }, }, #line 526 - [TRAINER_MATT] = + [DIFFICULTY_NORMAL][TRAINER_MATT] = { #line 527 .trainerName = _("MATT"), @@ -1187,7 +1187,7 @@ F_TRAINER_FEMALE | }, }, #line 544 - [TRAINER_ZANDER] = + [DIFFICULTY_NORMAL][TRAINER_ZANDER] = { #line 545 .trainerName = _("ZANDER"), @@ -1219,7 +1219,7 @@ F_TRAINER_FEMALE | }, }, #line 557 - [TRAINER_SHELLY_WEATHER_INSTITUTE] = + [DIFFICULTY_NORMAL][TRAINER_SHELLY_WEATHER_INSTITUTE] = { #line 558 .trainerName = _("SHELLY"), @@ -1264,7 +1264,7 @@ F_TRAINER_FEMALE | }, }, #line 574 - [TRAINER_SHELLY_SEAFLOOR_CAVERN] = + [DIFFICULTY_NORMAL][TRAINER_SHELLY_SEAFLOOR_CAVERN] = { #line 575 .trainerName = _("SHELLY"), @@ -1309,7 +1309,7 @@ F_TRAINER_FEMALE | }, }, #line 591 - [TRAINER_ARCHIE] = + [DIFFICULTY_NORMAL][TRAINER_ARCHIE] = { #line 592 .trainerName = _("ARCHIE"), @@ -1365,7 +1365,7 @@ F_TRAINER_FEMALE | }, }, #line 613 - [TRAINER_LEAH] = + [DIFFICULTY_NORMAL][TRAINER_LEAH] = { #line 614 .trainerName = _("LEAH"), @@ -1399,7 +1399,7 @@ F_TRAINER_FEMALE | }, }, #line 626 - [TRAINER_DAISY] = + [DIFFICULTY_NORMAL][TRAINER_DAISY] = { #line 627 .trainerName = _("DAISY"), @@ -1444,7 +1444,7 @@ F_TRAINER_FEMALE | }, }, #line 643 - [TRAINER_ROSE_1] = + [DIFFICULTY_NORMAL][TRAINER_ROSE_1] = { #line 644 .trainerName = _("ROSE"), @@ -1500,7 +1500,7 @@ F_TRAINER_FEMALE | }, }, #line 664 - [TRAINER_FELIX] = + [DIFFICULTY_NORMAL][TRAINER_FELIX] = { #line 665 .trainerName = _("FELIX"), @@ -1554,7 +1554,7 @@ F_TRAINER_FEMALE | }, }, #line 685 - [TRAINER_VIOLET] = + [DIFFICULTY_NORMAL][TRAINER_VIOLET] = { #line 686 .trainerName = _("VIOLET"), @@ -1599,7 +1599,7 @@ F_TRAINER_FEMALE | }, }, #line 702 - [TRAINER_ROSE_2] = + [DIFFICULTY_NORMAL][TRAINER_ROSE_2] = { #line 703 .trainerName = _("ROSE"), @@ -1644,7 +1644,7 @@ F_TRAINER_FEMALE | }, }, #line 719 - [TRAINER_ROSE_3] = + [DIFFICULTY_NORMAL][TRAINER_ROSE_3] = { #line 720 .trainerName = _("ROSE"), @@ -1700,7 +1700,7 @@ F_TRAINER_FEMALE | }, }, #line 740 - [TRAINER_ROSE_4] = + [DIFFICULTY_NORMAL][TRAINER_ROSE_4] = { #line 741 .trainerName = _("ROSE"), @@ -1756,7 +1756,7 @@ F_TRAINER_FEMALE | }, }, #line 761 - [TRAINER_ROSE_5] = + [DIFFICULTY_NORMAL][TRAINER_ROSE_5] = { #line 762 .trainerName = _("ROSE"), @@ -1812,7 +1812,7 @@ F_TRAINER_FEMALE | }, }, #line 782 - [TRAINER_DUSTY_1] = + [DIFFICULTY_NORMAL][TRAINER_DUSTY_1] = { #line 783 .trainerName = _("DUSTY"), @@ -1851,7 +1851,7 @@ F_TRAINER_FEMALE | }, }, #line 799 - [TRAINER_CHIP] = + [DIFFICULTY_NORMAL][TRAINER_CHIP] = { #line 800 .trainerName = _("CHIP"), @@ -1926,7 +1926,7 @@ F_TRAINER_FEMALE | }, }, #line 832 - [TRAINER_FOSTER] = + [DIFFICULTY_NORMAL][TRAINER_FOSTER] = { #line 833 .trainerName = _("FOSTER"), @@ -1983,7 +1983,7 @@ F_TRAINER_FEMALE | }, }, #line 857 - [TRAINER_DUSTY_2] = + [DIFFICULTY_NORMAL][TRAINER_DUSTY_2] = { #line 858 .trainerName = _("DUSTY"), @@ -2022,7 +2022,7 @@ F_TRAINER_FEMALE | }, }, #line 874 - [TRAINER_DUSTY_3] = + [DIFFICULTY_NORMAL][TRAINER_DUSTY_3] = { #line 875 .trainerName = _("DUSTY"), @@ -2061,7 +2061,7 @@ F_TRAINER_FEMALE | }, }, #line 891 - [TRAINER_DUSTY_4] = + [DIFFICULTY_NORMAL][TRAINER_DUSTY_4] = { #line 892 .trainerName = _("DUSTY"), @@ -2100,7 +2100,7 @@ F_TRAINER_FEMALE | }, }, #line 908 - [TRAINER_DUSTY_5] = + [DIFFICULTY_NORMAL][TRAINER_DUSTY_5] = { #line 909 .trainerName = _("DUSTY"), @@ -2139,7 +2139,7 @@ F_TRAINER_FEMALE | }, }, #line 925 - [TRAINER_GABBY_AND_TY_1] = + [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_1] = { #line 926 .trainerName = _("GABBY & TY"), @@ -2182,7 +2182,7 @@ F_TRAINER_FEMALE | }, }, #line 942 - [TRAINER_GABBY_AND_TY_2] = + [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_2] = { #line 943 .trainerName = _("GABBY & TY"), @@ -2225,7 +2225,7 @@ F_TRAINER_FEMALE | }, }, #line 959 - [TRAINER_GABBY_AND_TY_3] = + [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_3] = { #line 960 .trainerName = _("GABBY & TY"), @@ -2268,7 +2268,7 @@ F_TRAINER_FEMALE | }, }, #line 976 - [TRAINER_GABBY_AND_TY_4] = + [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_4] = { #line 977 .trainerName = _("GABBY & TY"), @@ -2311,7 +2311,7 @@ F_TRAINER_FEMALE | }, }, #line 993 - [TRAINER_GABBY_AND_TY_5] = + [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_5] = { #line 994 .trainerName = _("GABBY & TY"), @@ -2354,7 +2354,7 @@ F_TRAINER_FEMALE | }, }, #line 1010 - [TRAINER_GABBY_AND_TY_6] = + [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_6] = { #line 1011 .trainerName = _("GABBY & TY"), @@ -2411,7 +2411,7 @@ F_TRAINER_FEMALE | }, }, #line 1035 - [TRAINER_LOLA_1] = + [DIFFICULTY_NORMAL][TRAINER_LOLA_1] = { #line 1036 .trainerName = _("LOLA"), @@ -2456,7 +2456,7 @@ F_TRAINER_FEMALE | }, }, #line 1052 - [TRAINER_AUSTINA] = + [DIFFICULTY_NORMAL][TRAINER_AUSTINA] = { #line 1053 .trainerName = _("AUSTINA"), @@ -2490,7 +2490,7 @@ F_TRAINER_FEMALE | }, }, #line 1065 - [TRAINER_GWEN] = + [DIFFICULTY_NORMAL][TRAINER_GWEN] = { #line 1066 .trainerName = _("GWEN"), @@ -2524,7 +2524,7 @@ F_TRAINER_FEMALE | }, }, #line 1078 - [TRAINER_LOLA_2] = + [DIFFICULTY_NORMAL][TRAINER_LOLA_2] = { #line 1079 .trainerName = _("LOLA"), @@ -2569,7 +2569,7 @@ F_TRAINER_FEMALE | }, }, #line 1095 - [TRAINER_LOLA_3] = + [DIFFICULTY_NORMAL][TRAINER_LOLA_3] = { #line 1096 .trainerName = _("LOLA"), @@ -2614,7 +2614,7 @@ F_TRAINER_FEMALE | }, }, #line 1112 - [TRAINER_LOLA_4] = + [DIFFICULTY_NORMAL][TRAINER_LOLA_4] = { #line 1113 .trainerName = _("LOLA"), @@ -2659,7 +2659,7 @@ F_TRAINER_FEMALE | }, }, #line 1129 - [TRAINER_LOLA_5] = + [DIFFICULTY_NORMAL][TRAINER_LOLA_5] = { #line 1130 .trainerName = _("LOLA"), @@ -2704,7 +2704,7 @@ F_TRAINER_FEMALE | }, }, #line 1146 - [TRAINER_RICKY_1] = + [DIFFICULTY_NORMAL][TRAINER_RICKY_1] = { #line 1147 .trainerName = _("RICKY"), @@ -2743,7 +2743,7 @@ F_TRAINER_FEMALE | }, }, #line 1163 - [TRAINER_SIMON] = + [DIFFICULTY_NORMAL][TRAINER_SIMON] = { #line 1164 .trainerName = _("SIMON"), @@ -2786,7 +2786,7 @@ F_TRAINER_FEMALE | }, }, #line 1180 - [TRAINER_CHARLIE] = + [DIFFICULTY_NORMAL][TRAINER_CHARLIE] = { #line 1181 .trainerName = _("CHARLIE"), @@ -2818,7 +2818,7 @@ F_TRAINER_FEMALE | }, }, #line 1193 - [TRAINER_RICKY_2] = + [DIFFICULTY_NORMAL][TRAINER_RICKY_2] = { #line 1194 .trainerName = _("RICKY"), @@ -2857,7 +2857,7 @@ F_TRAINER_FEMALE | }, }, #line 1210 - [TRAINER_RICKY_3] = + [DIFFICULTY_NORMAL][TRAINER_RICKY_3] = { #line 1211 .trainerName = _("RICKY"), @@ -2896,7 +2896,7 @@ F_TRAINER_FEMALE | }, }, #line 1227 - [TRAINER_RICKY_4] = + [DIFFICULTY_NORMAL][TRAINER_RICKY_4] = { #line 1228 .trainerName = _("RICKY"), @@ -2935,7 +2935,7 @@ F_TRAINER_FEMALE | }, }, #line 1244 - [TRAINER_RICKY_5] = + [DIFFICULTY_NORMAL][TRAINER_RICKY_5] = { #line 1245 .trainerName = _("RICKY"), @@ -2974,7 +2974,7 @@ F_TRAINER_FEMALE | }, }, #line 1261 - [TRAINER_RANDALL] = + [DIFFICULTY_NORMAL][TRAINER_RANDALL] = { #line 1262 .trainerName = _("RANDALL"), @@ -3014,7 +3014,7 @@ F_TRAINER_FEMALE | }, }, #line 1278 - [TRAINER_PARKER] = + [DIFFICULTY_NORMAL][TRAINER_PARKER] = { #line 1279 .trainerName = _("PARKER"), @@ -3054,7 +3054,7 @@ F_TRAINER_FEMALE | }, }, #line 1295 - [TRAINER_GEORGE] = + [DIFFICULTY_NORMAL][TRAINER_GEORGE] = { #line 1296 .trainerName = _("GEORGE"), @@ -3096,7 +3096,7 @@ F_TRAINER_FEMALE | }, }, #line 1312 - [TRAINER_BERKE] = + [DIFFICULTY_NORMAL][TRAINER_BERKE] = { #line 1313 .trainerName = _("BERKE"), @@ -3135,7 +3135,7 @@ F_TRAINER_FEMALE | }, }, #line 1328 - [TRAINER_BRAXTON] = + [DIFFICULTY_NORMAL][TRAINER_BRAXTON] = { #line 1329 .trainerName = _("BRAXTON"), @@ -3248,7 +3248,7 @@ F_TRAINER_FEMALE | }, }, #line 1378 - [TRAINER_VINCENT] = + [DIFFICULTY_NORMAL][TRAINER_VINCENT] = { #line 1379 .trainerName = _("VINCENT"), @@ -3304,7 +3304,7 @@ F_TRAINER_FEMALE | }, }, #line 1400 - [TRAINER_LEROY] = + [DIFFICULTY_NORMAL][TRAINER_LEROY] = { #line 1401 .trainerName = _("LEROY"), @@ -3349,7 +3349,7 @@ F_TRAINER_FEMALE | }, }, #line 1418 - [TRAINER_WILTON_1] = + [DIFFICULTY_NORMAL][TRAINER_WILTON_1] = { #line 1419 .trainerName = _("WILTON"), @@ -3405,7 +3405,7 @@ F_TRAINER_FEMALE | }, }, #line 1440 - [TRAINER_EDGAR] = + [DIFFICULTY_NORMAL][TRAINER_EDGAR] = { #line 1441 .trainerName = _("EDGAR"), @@ -3450,7 +3450,7 @@ F_TRAINER_FEMALE | }, }, #line 1458 - [TRAINER_ALBERT] = + [DIFFICULTY_NORMAL][TRAINER_ALBERT] = { #line 1459 .trainerName = _("ALBERT"), @@ -3495,7 +3495,7 @@ F_TRAINER_FEMALE | }, }, #line 1476 - [TRAINER_SAMUEL] = + [DIFFICULTY_NORMAL][TRAINER_SAMUEL] = { #line 1477 .trainerName = _("SAMUEL"), @@ -3551,7 +3551,7 @@ F_TRAINER_FEMALE | }, }, #line 1498 - [TRAINER_VITO] = + [DIFFICULTY_NORMAL][TRAINER_VITO] = { #line 1499 .trainerName = _("VITO"), @@ -3618,7 +3618,7 @@ F_TRAINER_FEMALE | }, }, #line 1524 - [TRAINER_OWEN] = + [DIFFICULTY_NORMAL][TRAINER_OWEN] = { #line 1525 .trainerName = _("OWEN"), @@ -3674,7 +3674,7 @@ F_TRAINER_FEMALE | }, }, #line 1546 - [TRAINER_WILTON_2] = + [DIFFICULTY_NORMAL][TRAINER_WILTON_2] = { #line 1547 .trainerName = _("WILTON"), @@ -3730,7 +3730,7 @@ F_TRAINER_FEMALE | }, }, #line 1568 - [TRAINER_WILTON_3] = + [DIFFICULTY_NORMAL][TRAINER_WILTON_3] = { #line 1569 .trainerName = _("WILTON"), @@ -3786,7 +3786,7 @@ F_TRAINER_FEMALE | }, }, #line 1590 - [TRAINER_WILTON_4] = + [DIFFICULTY_NORMAL][TRAINER_WILTON_4] = { #line 1591 .trainerName = _("WILTON"), @@ -3842,7 +3842,7 @@ F_TRAINER_FEMALE | }, }, #line 1612 - [TRAINER_WILTON_5] = + [DIFFICULTY_NORMAL][TRAINER_WILTON_5] = { #line 1613 .trainerName = _("WILTON"), @@ -3898,7 +3898,7 @@ F_TRAINER_FEMALE | }, }, #line 1634 - [TRAINER_WARREN] = + [DIFFICULTY_NORMAL][TRAINER_WARREN] = { #line 1635 .trainerName = _("WARREN"), @@ -3943,7 +3943,7 @@ F_TRAINER_FEMALE | }, }, #line 1652 - [TRAINER_MARY] = + [DIFFICULTY_NORMAL][TRAINER_MARY] = { #line 1653 .trainerName = _("MARY"), @@ -3984,7 +3984,7 @@ F_TRAINER_FEMALE | }, }, #line 1668 - [TRAINER_ALEXIA] = + [DIFFICULTY_NORMAL][TRAINER_ALEXIA] = { #line 1669 .trainerName = _("ALEXIA"), @@ -4026,7 +4026,7 @@ F_TRAINER_FEMALE | }, }, #line 1685 - [TRAINER_JODY] = + [DIFFICULTY_NORMAL][TRAINER_JODY] = { #line 1686 .trainerName = _("JODY"), @@ -4067,7 +4067,7 @@ F_TRAINER_FEMALE | }, }, #line 1701 - [TRAINER_WENDY] = + [DIFFICULTY_NORMAL][TRAINER_WENDY] = { #line 1702 .trainerName = _("WENDY"), @@ -4146,7 +4146,7 @@ F_TRAINER_FEMALE | }, }, #line 1735 - [TRAINER_KEIRA] = + [DIFFICULTY_NORMAL][TRAINER_KEIRA] = { #line 1736 .trainerName = _("KEIRA"), @@ -4193,7 +4193,7 @@ F_TRAINER_FEMALE | }, }, #line 1753 - [TRAINER_BROOKE_1] = + [DIFFICULTY_NORMAL][TRAINER_BROOKE_1] = { #line 1754 .trainerName = _("BROOKE"), @@ -4251,7 +4251,7 @@ F_TRAINER_FEMALE | }, }, #line 1775 - [TRAINER_JENNIFER] = + [DIFFICULTY_NORMAL][TRAINER_JENNIFER] = { #line 1776 .trainerName = _("JENNIFER"), @@ -4287,7 +4287,7 @@ F_TRAINER_FEMALE | }, }, #line 1789 - [TRAINER_HOPE] = + [DIFFICULTY_NORMAL][TRAINER_HOPE] = { #line 1790 .trainerName = _("HOPE"), @@ -4323,7 +4323,7 @@ F_TRAINER_FEMALE | }, }, #line 1803 - [TRAINER_SHANNON] = + [DIFFICULTY_NORMAL][TRAINER_SHANNON] = { #line 1804 .trainerName = _("SHANNON"), @@ -4359,7 +4359,7 @@ F_TRAINER_FEMALE | }, }, #line 1817 - [TRAINER_MICHELLE] = + [DIFFICULTY_NORMAL][TRAINER_MICHELLE] = { #line 1818 .trainerName = _("MICHELLE"), @@ -4417,7 +4417,7 @@ F_TRAINER_FEMALE | }, }, #line 1839 - [TRAINER_CAROLINE] = + [DIFFICULTY_NORMAL][TRAINER_CAROLINE] = { #line 1840 .trainerName = _("CAROLINE"), @@ -4464,7 +4464,7 @@ F_TRAINER_FEMALE | }, }, #line 1857 - [TRAINER_JULIE] = + [DIFFICULTY_NORMAL][TRAINER_JULIE] = { #line 1858 .trainerName = _("JULIE"), @@ -4522,7 +4522,7 @@ F_TRAINER_FEMALE | }, }, #line 1879 - [TRAINER_BROOKE_2] = + [DIFFICULTY_NORMAL][TRAINER_BROOKE_2] = { #line 1880 .trainerName = _("BROOKE"), @@ -4580,7 +4580,7 @@ F_TRAINER_FEMALE | }, }, #line 1901 - [TRAINER_BROOKE_3] = + [DIFFICULTY_NORMAL][TRAINER_BROOKE_3] = { #line 1902 .trainerName = _("BROOKE"), @@ -4638,7 +4638,7 @@ F_TRAINER_FEMALE | }, }, #line 1923 - [TRAINER_BROOKE_4] = + [DIFFICULTY_NORMAL][TRAINER_BROOKE_4] = { #line 1924 .trainerName = _("BROOKE"), @@ -4696,7 +4696,7 @@ F_TRAINER_FEMALE | }, }, #line 1945 - [TRAINER_BROOKE_5] = + [DIFFICULTY_NORMAL][TRAINER_BROOKE_5] = { #line 1946 .trainerName = _("BROOKE"), @@ -4754,7 +4754,7 @@ F_TRAINER_FEMALE | }, }, #line 1967 - [TRAINER_PATRICIA] = + [DIFFICULTY_NORMAL][TRAINER_PATRICIA] = { #line 1968 .trainerName = _("PATRICIA"), @@ -4799,7 +4799,7 @@ F_TRAINER_FEMALE | }, }, #line 1984 - [TRAINER_KINDRA] = + [DIFFICULTY_NORMAL][TRAINER_KINDRA] = { #line 1985 .trainerName = _("KINDRA"), @@ -4844,7 +4844,7 @@ F_TRAINER_FEMALE | }, }, #line 2001 - [TRAINER_TAMMY] = + [DIFFICULTY_NORMAL][TRAINER_TAMMY] = { #line 2002 .trainerName = _("TAMMY"), @@ -4889,7 +4889,7 @@ F_TRAINER_FEMALE | }, }, #line 2018 - [TRAINER_VALERIE_1] = + [DIFFICULTY_NORMAL][TRAINER_VALERIE_1] = { #line 2019 .trainerName = _("VALERIE"), @@ -4923,7 +4923,7 @@ F_TRAINER_FEMALE | }, }, #line 2031 - [TRAINER_TASHA] = + [DIFFICULTY_NORMAL][TRAINER_TASHA] = { #line 2032 .trainerName = _("TASHA"), @@ -4957,7 +4957,7 @@ F_TRAINER_FEMALE | }, }, #line 2044 - [TRAINER_VALERIE_2] = + [DIFFICULTY_NORMAL][TRAINER_VALERIE_2] = { #line 2045 .trainerName = _("VALERIE"), @@ -5002,7 +5002,7 @@ F_TRAINER_FEMALE | }, }, #line 2061 - [TRAINER_VALERIE_3] = + [DIFFICULTY_NORMAL][TRAINER_VALERIE_3] = { #line 2062 .trainerName = _("VALERIE"), @@ -5047,7 +5047,7 @@ F_TRAINER_FEMALE | }, }, #line 2078 - [TRAINER_VALERIE_4] = + [DIFFICULTY_NORMAL][TRAINER_VALERIE_4] = { #line 2079 .trainerName = _("VALERIE"), @@ -5092,7 +5092,7 @@ F_TRAINER_FEMALE | }, }, #line 2095 - [TRAINER_VALERIE_5] = + [DIFFICULTY_NORMAL][TRAINER_VALERIE_5] = { #line 2096 .trainerName = _("VALERIE"), @@ -5148,7 +5148,7 @@ F_TRAINER_FEMALE | }, }, #line 2116 - [TRAINER_CINDY_1] = + [DIFFICULTY_NORMAL][TRAINER_CINDY_1] = { #line 2117 .trainerName = _("CINDY"), @@ -5186,7 +5186,7 @@ F_TRAINER_FEMALE | }, }, #line 2130 - [TRAINER_DAPHNE] = + [DIFFICULTY_NORMAL][TRAINER_DAPHNE] = { #line 2131 .trainerName = _("DAPHNE"), @@ -5251,7 +5251,7 @@ F_TRAINER_FEMALE | }, }, #line 2156 - [TRAINER_GRUNT_SPACE_CENTER_2] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_2] = { #line 2157 .trainerName = _("GRUNT"), @@ -5305,7 +5305,7 @@ F_TRAINER_FEMALE | }, }, #line 2177 - [TRAINER_CINDY_2] = + [DIFFICULTY_NORMAL][TRAINER_CINDY_2] = { #line 2178 .trainerName = _("CINDY"), @@ -5348,7 +5348,7 @@ F_TRAINER_FEMALE | }, }, #line 2193 - [TRAINER_BRIANNA] = + [DIFFICULTY_NORMAL][TRAINER_BRIANNA] = { #line 2194 .trainerName = _("BRIANNA"), @@ -5386,7 +5386,7 @@ F_TRAINER_FEMALE | }, }, #line 2207 - [TRAINER_NAOMI] = + [DIFFICULTY_NORMAL][TRAINER_NAOMI] = { #line 2208 .trainerName = _("NAOMI"), @@ -5424,7 +5424,7 @@ F_TRAINER_FEMALE | }, }, #line 2221 - [TRAINER_CINDY_3] = + [DIFFICULTY_NORMAL][TRAINER_CINDY_3] = { #line 2222 .trainerName = _("CINDY"), @@ -5462,7 +5462,7 @@ F_TRAINER_FEMALE | }, }, #line 2235 - [TRAINER_CINDY_4] = + [DIFFICULTY_NORMAL][TRAINER_CINDY_4] = { #line 2236 .trainerName = _("CINDY"), @@ -5500,7 +5500,7 @@ F_TRAINER_FEMALE | }, }, #line 2249 - [TRAINER_CINDY_5] = + [DIFFICULTY_NORMAL][TRAINER_CINDY_5] = { #line 2250 .trainerName = _("CINDY"), @@ -5538,7 +5538,7 @@ F_TRAINER_FEMALE | }, }, #line 2263 - [TRAINER_CINDY_6] = + [DIFFICULTY_NORMAL][TRAINER_CINDY_6] = { #line 2264 .trainerName = _("CINDY"), @@ -5583,7 +5583,7 @@ F_TRAINER_FEMALE | }, }, #line 2281 - [TRAINER_MELISSA] = + [DIFFICULTY_NORMAL][TRAINER_MELISSA] = { #line 2282 .trainerName = _("MELISSA"), @@ -5617,7 +5617,7 @@ F_TRAINER_FEMALE | }, }, #line 2294 - [TRAINER_SHEILA] = + [DIFFICULTY_NORMAL][TRAINER_SHEILA] = { #line 2295 .trainerName = _("SHEILA"), @@ -5651,7 +5651,7 @@ F_TRAINER_FEMALE | }, }, #line 2307 - [TRAINER_SHIRLEY] = + [DIFFICULTY_NORMAL][TRAINER_SHIRLEY] = { #line 2308 .trainerName = _("SHIRLEY"), @@ -5685,7 +5685,7 @@ F_TRAINER_FEMALE | }, }, #line 2320 - [TRAINER_JESSICA_1] = + [DIFFICULTY_NORMAL][TRAINER_JESSICA_1] = { #line 2321 .trainerName = _("JESSICA"), @@ -5744,7 +5744,7 @@ F_TRAINER_FEMALE | }, }, #line 2345 - [TRAINER_CONNIE] = + [DIFFICULTY_NORMAL][TRAINER_CONNIE] = { #line 2346 .trainerName = _("CONNIE"), @@ -5778,7 +5778,7 @@ F_TRAINER_FEMALE | }, }, #line 2358 - [TRAINER_BRIDGET] = + [DIFFICULTY_NORMAL][TRAINER_BRIDGET] = { #line 2359 .trainerName = _("BRIDGET"), @@ -5812,7 +5812,7 @@ F_TRAINER_FEMALE | }, }, #line 2371 - [TRAINER_OLIVIA] = + [DIFFICULTY_NORMAL][TRAINER_OLIVIA] = { #line 2372 .trainerName = _("OLIVIA"), @@ -5888,7 +5888,7 @@ F_TRAINER_FEMALE | }, }, #line 2403 - [TRAINER_TIFFANY] = + [DIFFICULTY_NORMAL][TRAINER_TIFFANY] = { #line 2404 .trainerName = _("TIFFANY"), @@ -5933,7 +5933,7 @@ F_TRAINER_FEMALE | }, }, #line 2420 - [TRAINER_JESSICA_2] = + [DIFFICULTY_NORMAL][TRAINER_JESSICA_2] = { #line 2421 .trainerName = _("JESSICA"), @@ -5992,7 +5992,7 @@ F_TRAINER_FEMALE | }, }, #line 2445 - [TRAINER_JESSICA_3] = + [DIFFICULTY_NORMAL][TRAINER_JESSICA_3] = { #line 2446 .trainerName = _("JESSICA"), @@ -6051,7 +6051,7 @@ F_TRAINER_FEMALE | }, }, #line 2470 - [TRAINER_JESSICA_4] = + [DIFFICULTY_NORMAL][TRAINER_JESSICA_4] = { #line 2471 .trainerName = _("JESSICA"), @@ -6110,7 +6110,7 @@ F_TRAINER_FEMALE | }, }, #line 2495 - [TRAINER_JESSICA_5] = + [DIFFICULTY_NORMAL][TRAINER_JESSICA_5] = { #line 2496 .trainerName = _("JESSICA"), @@ -6169,7 +6169,7 @@ F_TRAINER_FEMALE | }, }, #line 2520 - [TRAINER_WINSTON_1] = + [DIFFICULTY_NORMAL][TRAINER_WINSTON_1] = { #line 2521 .trainerName = _("WINSTON"), @@ -6205,7 +6205,7 @@ F_TRAINER_FEMALE | }, }, #line 2534 - [TRAINER_MOLLIE] = + [DIFFICULTY_NORMAL][TRAINER_MOLLIE] = { #line 2535 .trainerName = _("MOLLIE"), @@ -6250,7 +6250,7 @@ F_TRAINER_FEMALE | }, }, #line 2551 - [TRAINER_GARRET] = + [DIFFICULTY_NORMAL][TRAINER_GARRET] = { #line 2552 .trainerName = _("GARRET"), @@ -6286,7 +6286,7 @@ F_TRAINER_FEMALE | }, }, #line 2565 - [TRAINER_WINSTON_2] = + [DIFFICULTY_NORMAL][TRAINER_WINSTON_2] = { #line 2566 .trainerName = _("WINSTON"), @@ -6322,7 +6322,7 @@ F_TRAINER_FEMALE | }, }, #line 2579 - [TRAINER_WINSTON_3] = + [DIFFICULTY_NORMAL][TRAINER_WINSTON_3] = { #line 2580 .trainerName = _("WINSTON"), @@ -6358,7 +6358,7 @@ F_TRAINER_FEMALE | }, }, #line 2593 - [TRAINER_WINSTON_4] = + [DIFFICULTY_NORMAL][TRAINER_WINSTON_4] = { #line 2594 .trainerName = _("WINSTON"), @@ -6394,7 +6394,7 @@ F_TRAINER_FEMALE | }, }, #line 2607 - [TRAINER_WINSTON_5] = + [DIFFICULTY_NORMAL][TRAINER_WINSTON_5] = { #line 2608 .trainerName = _("WINSTON"), @@ -6437,7 +6437,7 @@ F_TRAINER_FEMALE | }, }, #line 2625 - [TRAINER_STEVE_1] = + [DIFFICULTY_NORMAL][TRAINER_STEVE_1] = { #line 2626 .trainerName = _("STEVE"), @@ -6469,7 +6469,7 @@ F_TRAINER_FEMALE | }, }, #line 2638 - [TRAINER_THALIA_1] = + [DIFFICULTY_NORMAL][TRAINER_THALIA_1] = { #line 2639 .trainerName = _("THALIA"), @@ -6514,7 +6514,7 @@ F_TRAINER_FEMALE | }, }, #line 2655 - [TRAINER_MARK] = + [DIFFICULTY_NORMAL][TRAINER_MARK] = { #line 2656 .trainerName = _("MARK"), @@ -6546,7 +6546,7 @@ F_TRAINER_FEMALE | }, }, #line 2668 - [TRAINER_GRUNT_MT_CHIMNEY_1] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_CHIMNEY_1] = { #line 2669 .trainerName = _("GRUNT"), @@ -6580,7 +6580,7 @@ F_TRAINER_FEMALE | }, }, #line 2681 - [TRAINER_STEVE_2] = + [DIFFICULTY_NORMAL][TRAINER_STEVE_2] = { #line 2682 .trainerName = _("STEVE"), @@ -6612,7 +6612,7 @@ F_TRAINER_FEMALE | }, }, #line 2694 - [TRAINER_STEVE_3] = + [DIFFICULTY_NORMAL][TRAINER_STEVE_3] = { #line 2695 .trainerName = _("STEVE"), @@ -6655,7 +6655,7 @@ F_TRAINER_FEMALE | }, }, #line 2711 - [TRAINER_STEVE_4] = + [DIFFICULTY_NORMAL][TRAINER_STEVE_4] = { #line 2712 .trainerName = _("STEVE"), @@ -6698,7 +6698,7 @@ F_TRAINER_FEMALE | }, }, #line 2728 - [TRAINER_STEVE_5] = + [DIFFICULTY_NORMAL][TRAINER_STEVE_5] = { #line 2729 .trainerName = _("STEVE"), @@ -6741,7 +6741,7 @@ F_TRAINER_FEMALE | }, }, #line 2745 - [TRAINER_LUIS] = + [DIFFICULTY_NORMAL][TRAINER_LUIS] = { #line 2746 .trainerName = _("LUIS"), @@ -6773,7 +6773,7 @@ F_TRAINER_FEMALE | }, }, #line 2758 - [TRAINER_DOMINIK] = + [DIFFICULTY_NORMAL][TRAINER_DOMINIK] = { #line 2759 .trainerName = _("DOMINIK"), @@ -6805,7 +6805,7 @@ F_TRAINER_FEMALE | }, }, #line 2771 - [TRAINER_DOUGLAS] = + [DIFFICULTY_NORMAL][TRAINER_DOUGLAS] = { #line 2772 .trainerName = _("DOUGLAS"), @@ -6848,7 +6848,7 @@ F_TRAINER_FEMALE | }, }, #line 2788 - [TRAINER_DARRIN] = + [DIFFICULTY_NORMAL][TRAINER_DARRIN] = { #line 2789 .trainerName = _("DARRIN"), @@ -6902,7 +6902,7 @@ F_TRAINER_FEMALE | }, }, #line 2809 - [TRAINER_TONY_1] = + [DIFFICULTY_NORMAL][TRAINER_TONY_1] = { #line 2810 .trainerName = _("TONY"), @@ -6934,7 +6934,7 @@ F_TRAINER_FEMALE | }, }, #line 2822 - [TRAINER_JEROME] = + [DIFFICULTY_NORMAL][TRAINER_JEROME] = { #line 2823 .trainerName = _("JEROME"), @@ -6966,7 +6966,7 @@ F_TRAINER_FEMALE | }, }, #line 2835 - [TRAINER_MATTHEW] = + [DIFFICULTY_NORMAL][TRAINER_MATTHEW] = { #line 2836 .trainerName = _("MATTHEW"), @@ -6998,7 +6998,7 @@ F_TRAINER_FEMALE | }, }, #line 2848 - [TRAINER_DAVID] = + [DIFFICULTY_NORMAL][TRAINER_DAVID] = { #line 2849 .trainerName = _("DAVID"), @@ -7041,7 +7041,7 @@ F_TRAINER_FEMALE | }, }, #line 2865 - [TRAINER_SPENCER] = + [DIFFICULTY_NORMAL][TRAINER_SPENCER] = { #line 2866 .trainerName = _("SPENCER"), @@ -7084,7 +7084,7 @@ F_TRAINER_FEMALE | }, }, #line 2882 - [TRAINER_ROLAND] = + [DIFFICULTY_NORMAL][TRAINER_ROLAND] = { #line 2883 .trainerName = _("ROLAND"), @@ -7116,7 +7116,7 @@ F_TRAINER_FEMALE | }, }, #line 2895 - [TRAINER_NOLEN] = + [DIFFICULTY_NORMAL][TRAINER_NOLEN] = { #line 2896 .trainerName = _("NOLEN"), @@ -7148,7 +7148,7 @@ F_TRAINER_FEMALE | }, }, #line 2908 - [TRAINER_STAN] = + [DIFFICULTY_NORMAL][TRAINER_STAN] = { #line 2909 .trainerName = _("STAN"), @@ -7180,7 +7180,7 @@ F_TRAINER_FEMALE | }, }, #line 2921 - [TRAINER_BARRY] = + [DIFFICULTY_NORMAL][TRAINER_BARRY] = { #line 2922 .trainerName = _("BARRY"), @@ -7212,7 +7212,7 @@ F_TRAINER_FEMALE | }, }, #line 2934 - [TRAINER_DEAN] = + [DIFFICULTY_NORMAL][TRAINER_DEAN] = { #line 2935 .trainerName = _("DEAN"), @@ -7266,7 +7266,7 @@ F_TRAINER_FEMALE | }, }, #line 2955 - [TRAINER_RODNEY] = + [DIFFICULTY_NORMAL][TRAINER_RODNEY] = { #line 2956 .trainerName = _("RODNEY"), @@ -7298,7 +7298,7 @@ F_TRAINER_FEMALE | }, }, #line 2968 - [TRAINER_RICHARD] = + [DIFFICULTY_NORMAL][TRAINER_RICHARD] = { #line 2969 .trainerName = _("RICHARD"), @@ -7330,7 +7330,7 @@ F_TRAINER_FEMALE | }, }, #line 2981 - [TRAINER_HERMAN] = + [DIFFICULTY_NORMAL][TRAINER_HERMAN] = { #line 2982 .trainerName = _("HERMAN"), @@ -7373,7 +7373,7 @@ F_TRAINER_FEMALE | }, }, #line 2998 - [TRAINER_SANTIAGO] = + [DIFFICULTY_NORMAL][TRAINER_SANTIAGO] = { #line 2999 .trainerName = _("SANTIAGO"), @@ -7416,7 +7416,7 @@ F_TRAINER_FEMALE | }, }, #line 3015 - [TRAINER_GILBERT] = + [DIFFICULTY_NORMAL][TRAINER_GILBERT] = { #line 3016 .trainerName = _("GILBERT"), @@ -7448,7 +7448,7 @@ F_TRAINER_FEMALE | }, }, #line 3028 - [TRAINER_FRANKLIN] = + [DIFFICULTY_NORMAL][TRAINER_FRANKLIN] = { #line 3029 .trainerName = _("FRANKLIN"), @@ -7480,7 +7480,7 @@ F_TRAINER_FEMALE | }, }, #line 3041 - [TRAINER_KEVIN] = + [DIFFICULTY_NORMAL][TRAINER_KEVIN] = { #line 3042 .trainerName = _("KEVIN"), @@ -7512,7 +7512,7 @@ F_TRAINER_FEMALE | }, }, #line 3054 - [TRAINER_JACK] = + [DIFFICULTY_NORMAL][TRAINER_JACK] = { #line 3055 .trainerName = _("JACK"), @@ -7544,7 +7544,7 @@ F_TRAINER_FEMALE | }, }, #line 3067 - [TRAINER_DUDLEY] = + [DIFFICULTY_NORMAL][TRAINER_DUDLEY] = { #line 3068 .trainerName = _("DUDLEY"), @@ -7598,7 +7598,7 @@ F_TRAINER_FEMALE | }, }, #line 3088 - [TRAINER_CHAD] = + [DIFFICULTY_NORMAL][TRAINER_CHAD] = { #line 3089 .trainerName = _("CHAD"), @@ -7641,7 +7641,7 @@ F_TRAINER_FEMALE | }, }, #line 3105 - [TRAINER_TONY_2] = + [DIFFICULTY_NORMAL][TRAINER_TONY_2] = { #line 3106 .trainerName = _("TONY"), @@ -7673,7 +7673,7 @@ F_TRAINER_FEMALE | }, }, #line 3118 - [TRAINER_TONY_3] = + [DIFFICULTY_NORMAL][TRAINER_TONY_3] = { #line 3119 .trainerName = _("TONY"), @@ -7705,7 +7705,7 @@ F_TRAINER_FEMALE | }, }, #line 3131 - [TRAINER_TONY_4] = + [DIFFICULTY_NORMAL][TRAINER_TONY_4] = { #line 3132 .trainerName = _("TONY"), @@ -7748,7 +7748,7 @@ F_TRAINER_FEMALE | }, }, #line 3148 - [TRAINER_TONY_5] = + [DIFFICULTY_NORMAL][TRAINER_TONY_5] = { #line 3149 .trainerName = _("TONY"), @@ -7791,7 +7791,7 @@ F_TRAINER_FEMALE | }, }, #line 3165 - [TRAINER_TAKAO] = + [DIFFICULTY_NORMAL][TRAINER_TAKAO] = { #line 3166 .trainerName = _("TAKAO"), @@ -7823,7 +7823,7 @@ F_TRAINER_FEMALE | }, }, #line 3178 - [TRAINER_HITOSHI] = + [DIFFICULTY_NORMAL][TRAINER_HITOSHI] = { #line 3179 .trainerName = _("HITOSHI"), @@ -7866,7 +7866,7 @@ F_TRAINER_FEMALE | }, }, #line 3195 - [TRAINER_KIYO] = + [DIFFICULTY_NORMAL][TRAINER_KIYO] = { #line 3196 .trainerName = _("KIYO"), @@ -7898,7 +7898,7 @@ F_TRAINER_FEMALE | }, }, #line 3208 - [TRAINER_KOICHI] = + [DIFFICULTY_NORMAL][TRAINER_KOICHI] = { #line 3209 .trainerName = _("KOICHI"), @@ -7941,7 +7941,7 @@ F_TRAINER_FEMALE | }, }, #line 3225 - [TRAINER_NOB_1] = + [DIFFICULTY_NORMAL][TRAINER_NOB_1] = { #line 3226 .trainerName = _("NOB"), @@ -7973,7 +7973,7 @@ F_TRAINER_FEMALE | }, }, #line 3238 - [TRAINER_NOB_2] = + [DIFFICULTY_NORMAL][TRAINER_NOB_2] = { #line 3239 .trainerName = _("NOB"), @@ -8005,7 +8005,7 @@ F_TRAINER_FEMALE | }, }, #line 3251 - [TRAINER_NOB_3] = + [DIFFICULTY_NORMAL][TRAINER_NOB_3] = { #line 3252 .trainerName = _("NOB"), @@ -8048,7 +8048,7 @@ F_TRAINER_FEMALE | }, }, #line 3268 - [TRAINER_NOB_4] = + [DIFFICULTY_NORMAL][TRAINER_NOB_4] = { #line 3269 .trainerName = _("NOB"), @@ -8102,7 +8102,7 @@ F_TRAINER_FEMALE | }, }, #line 3289 - [TRAINER_NOB_5] = + [DIFFICULTY_NORMAL][TRAINER_NOB_5] = { #line 3290 .trainerName = _("NOB"), @@ -8169,7 +8169,7 @@ F_TRAINER_FEMALE | }, }, #line 3314 - [TRAINER_YUJI] = + [DIFFICULTY_NORMAL][TRAINER_YUJI] = { #line 3315 .trainerName = _("YUJI"), @@ -8212,7 +8212,7 @@ F_TRAINER_FEMALE | }, }, #line 3331 - [TRAINER_DAISUKE] = + [DIFFICULTY_NORMAL][TRAINER_DAISUKE] = { #line 3332 .trainerName = _("DAISUKE"), @@ -8244,7 +8244,7 @@ F_TRAINER_FEMALE | }, }, #line 3344 - [TRAINER_ATSUSHI] = + [DIFFICULTY_NORMAL][TRAINER_ATSUSHI] = { #line 3345 .trainerName = _("ATSUSHI"), @@ -8276,7 +8276,7 @@ F_TRAINER_FEMALE | }, }, #line 3357 - [TRAINER_KIRK] = + [DIFFICULTY_NORMAL][TRAINER_KIRK] = { #line 3358 .trainerName = _("KIRK"), @@ -8332,7 +8332,7 @@ F_TRAINER_FEMALE | }, }, #line 3381 - [TRAINER_GRUNT_AQUA_HIDEOUT_7] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_7] = { #line 3382 .trainerName = _("GRUNT"), @@ -8377,7 +8377,7 @@ F_TRAINER_FEMALE | }, }, #line 3398 - [TRAINER_GRUNT_AQUA_HIDEOUT_8] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_8] = { #line 3399 .trainerName = _("GRUNT"), @@ -8409,7 +8409,7 @@ F_TRAINER_FEMALE | }, }, #line 3411 - [TRAINER_SHAWN] = + [DIFFICULTY_NORMAL][TRAINER_SHAWN] = { #line 3412 .trainerName = _("SHAWN"), @@ -8452,7 +8452,7 @@ F_TRAINER_FEMALE | }, }, #line 3428 - [TRAINER_FERNANDO_1] = + [DIFFICULTY_NORMAL][TRAINER_FERNANDO_1] = { #line 3429 .trainerName = _("FERNANDO"), @@ -8495,7 +8495,7 @@ F_TRAINER_FEMALE | }, }, #line 3445 - [TRAINER_DALTON_1] = + [DIFFICULTY_NORMAL][TRAINER_DALTON_1] = { #line 3446 .trainerName = _("DALTON"), @@ -8538,7 +8538,7 @@ F_TRAINER_FEMALE | }, }, #line 3462 - [TRAINER_DALTON_2] = + [DIFFICULTY_NORMAL][TRAINER_DALTON_2] = { #line 3463 .trainerName = _("DALTON"), @@ -8592,7 +8592,7 @@ F_TRAINER_FEMALE | }, }, #line 3483 - [TRAINER_DALTON_3] = + [DIFFICULTY_NORMAL][TRAINER_DALTON_3] = { #line 3484 .trainerName = _("DALTON"), @@ -8646,7 +8646,7 @@ F_TRAINER_FEMALE | }, }, #line 3504 - [TRAINER_DALTON_4] = + [DIFFICULTY_NORMAL][TRAINER_DALTON_4] = { #line 3505 .trainerName = _("DALTON"), @@ -8700,7 +8700,7 @@ F_TRAINER_FEMALE | }, }, #line 3525 - [TRAINER_DALTON_5] = + [DIFFICULTY_NORMAL][TRAINER_DALTON_5] = { #line 3526 .trainerName = _("DALTON"), @@ -8754,7 +8754,7 @@ F_TRAINER_FEMALE | }, }, #line 3546 - [TRAINER_COLE] = + [DIFFICULTY_NORMAL][TRAINER_COLE] = { #line 3547 .trainerName = _("COLE"), @@ -8786,7 +8786,7 @@ F_TRAINER_FEMALE | }, }, #line 3559 - [TRAINER_JEFF] = + [DIFFICULTY_NORMAL][TRAINER_JEFF] = { #line 3560 .trainerName = _("JEFF"), @@ -8829,7 +8829,7 @@ F_TRAINER_FEMALE | }, }, #line 3576 - [TRAINER_AXLE] = + [DIFFICULTY_NORMAL][TRAINER_AXLE] = { #line 3577 .trainerName = _("AXLE"), @@ -8861,7 +8861,7 @@ F_TRAINER_FEMALE | }, }, #line 3589 - [TRAINER_JACE] = + [DIFFICULTY_NORMAL][TRAINER_JACE] = { #line 3590 .trainerName = _("JACE"), @@ -8893,7 +8893,7 @@ F_TRAINER_FEMALE | }, }, #line 3602 - [TRAINER_KEEGAN] = + [DIFFICULTY_NORMAL][TRAINER_KEEGAN] = { #line 3603 .trainerName = _("KEEGAN"), @@ -8925,7 +8925,7 @@ F_TRAINER_FEMALE | }, }, #line 3615 - [TRAINER_BERNIE_1] = + [DIFFICULTY_NORMAL][TRAINER_BERNIE_1] = { #line 3616 .trainerName = _("BERNIE"), @@ -8968,7 +8968,7 @@ F_TRAINER_FEMALE | }, }, #line 3632 - [TRAINER_BERNIE_2] = + [DIFFICULTY_NORMAL][TRAINER_BERNIE_2] = { #line 3633 .trainerName = _("BERNIE"), @@ -9011,7 +9011,7 @@ F_TRAINER_FEMALE | }, }, #line 3649 - [TRAINER_BERNIE_3] = + [DIFFICULTY_NORMAL][TRAINER_BERNIE_3] = { #line 3650 .trainerName = _("BERNIE"), @@ -9054,7 +9054,7 @@ F_TRAINER_FEMALE | }, }, #line 3666 - [TRAINER_BERNIE_4] = + [DIFFICULTY_NORMAL][TRAINER_BERNIE_4] = { #line 3667 .trainerName = _("BERNIE"), @@ -9097,7 +9097,7 @@ F_TRAINER_FEMALE | }, }, #line 3683 - [TRAINER_BERNIE_5] = + [DIFFICULTY_NORMAL][TRAINER_BERNIE_5] = { #line 3684 .trainerName = _("BERNIE"), @@ -9140,7 +9140,7 @@ F_TRAINER_FEMALE | }, }, #line 3700 - [TRAINER_DREW] = + [DIFFICULTY_NORMAL][TRAINER_DREW] = { #line 3701 .trainerName = _("DREW"), @@ -9179,7 +9179,7 @@ F_TRAINER_FEMALE | }, }, #line 3717 - [TRAINER_BEAU] = + [DIFFICULTY_NORMAL][TRAINER_BEAU] = { #line 3718 .trainerName = _("BEAU"), @@ -9254,7 +9254,7 @@ F_TRAINER_FEMALE | }, }, #line 3750 - [TRAINER_LARRY] = + [DIFFICULTY_NORMAL][TRAINER_LARRY] = { #line 3751 .trainerName = _("LARRY"), @@ -9286,7 +9286,7 @@ F_TRAINER_FEMALE | }, }, #line 3763 - [TRAINER_SHANE] = + [DIFFICULTY_NORMAL][TRAINER_SHANE] = { #line 3764 .trainerName = _("SHANE"), @@ -9329,7 +9329,7 @@ F_TRAINER_FEMALE | }, }, #line 3780 - [TRAINER_JUSTIN] = + [DIFFICULTY_NORMAL][TRAINER_JUSTIN] = { #line 3781 .trainerName = _("JUSTIN"), @@ -9361,7 +9361,7 @@ F_TRAINER_FEMALE | }, }, #line 3793 - [TRAINER_ETHAN_1] = + [DIFFICULTY_NORMAL][TRAINER_ETHAN_1] = { #line 3794 .trainerName = _("ETHAN"), @@ -9404,7 +9404,7 @@ F_TRAINER_FEMALE | }, }, #line 3810 - [TRAINER_AUTUMN] = + [DIFFICULTY_NORMAL][TRAINER_AUTUMN] = { #line 3811 .trainerName = _("AUTUMN"), @@ -9438,7 +9438,7 @@ F_TRAINER_FEMALE | }, }, #line 3823 - [TRAINER_TRAVIS] = + [DIFFICULTY_NORMAL][TRAINER_TRAVIS] = { #line 3824 .trainerName = _("TRAVIS"), @@ -9470,7 +9470,7 @@ F_TRAINER_FEMALE | }, }, #line 3836 - [TRAINER_ETHAN_2] = + [DIFFICULTY_NORMAL][TRAINER_ETHAN_2] = { #line 3837 .trainerName = _("ETHAN"), @@ -9513,7 +9513,7 @@ F_TRAINER_FEMALE | }, }, #line 3853 - [TRAINER_ETHAN_3] = + [DIFFICULTY_NORMAL][TRAINER_ETHAN_3] = { #line 3854 .trainerName = _("ETHAN"), @@ -9556,7 +9556,7 @@ F_TRAINER_FEMALE | }, }, #line 3870 - [TRAINER_ETHAN_4] = + [DIFFICULTY_NORMAL][TRAINER_ETHAN_4] = { #line 3871 .trainerName = _("ETHAN"), @@ -9610,7 +9610,7 @@ F_TRAINER_FEMALE | }, }, #line 3891 - [TRAINER_ETHAN_5] = + [DIFFICULTY_NORMAL][TRAINER_ETHAN_5] = { #line 3892 .trainerName = _("ETHAN"), @@ -9664,7 +9664,7 @@ F_TRAINER_FEMALE | }, }, #line 3912 - [TRAINER_BRENT] = + [DIFFICULTY_NORMAL][TRAINER_BRENT] = { #line 3913 .trainerName = _("BRENT"), @@ -9696,7 +9696,7 @@ F_TRAINER_FEMALE | }, }, #line 3925 - [TRAINER_DONALD] = + [DIFFICULTY_NORMAL][TRAINER_DONALD] = { #line 3926 .trainerName = _("DONALD"), @@ -9750,7 +9750,7 @@ F_TRAINER_FEMALE | }, }, #line 3946 - [TRAINER_TAYLOR] = + [DIFFICULTY_NORMAL][TRAINER_TAYLOR] = { #line 3947 .trainerName = _("TAYLOR"), @@ -9804,7 +9804,7 @@ F_TRAINER_FEMALE | }, }, #line 3967 - [TRAINER_JEFFREY_1] = + [DIFFICULTY_NORMAL][TRAINER_JEFFREY_1] = { #line 3968 .trainerName = _("JEFFREY"), @@ -9858,7 +9858,7 @@ F_TRAINER_FEMALE | }, }, #line 3988 - [TRAINER_DEREK] = + [DIFFICULTY_NORMAL][TRAINER_DEREK] = { #line 3989 .trainerName = _("DEREK"), @@ -9901,7 +9901,7 @@ F_TRAINER_FEMALE | }, }, #line 4005 - [TRAINER_JEFFREY_2] = + [DIFFICULTY_NORMAL][TRAINER_JEFFREY_2] = { #line 4006 .trainerName = _("JEFFREY"), @@ -9955,7 +9955,7 @@ F_TRAINER_FEMALE | }, }, #line 4026 - [TRAINER_JEFFREY_3] = + [DIFFICULTY_NORMAL][TRAINER_JEFFREY_3] = { #line 4027 .trainerName = _("JEFFREY"), @@ -10009,7 +10009,7 @@ F_TRAINER_FEMALE | }, }, #line 4047 - [TRAINER_JEFFREY_4] = + [DIFFICULTY_NORMAL][TRAINER_JEFFREY_4] = { #line 4048 .trainerName = _("JEFFREY"), @@ -10074,7 +10074,7 @@ F_TRAINER_FEMALE | }, }, #line 4072 - [TRAINER_JEFFREY_5] = + [DIFFICULTY_NORMAL][TRAINER_JEFFREY_5] = { #line 4073 .trainerName = _("JEFFREY"), @@ -10152,7 +10152,7 @@ F_TRAINER_FEMALE | }, }, #line 4101 - [TRAINER_EDWARD] = + [DIFFICULTY_NORMAL][TRAINER_EDWARD] = { #line 4102 .trainerName = _("EDWARD"), @@ -10188,7 +10188,7 @@ F_TRAINER_FEMALE | }, }, #line 4115 - [TRAINER_PRESTON] = + [DIFFICULTY_NORMAL][TRAINER_PRESTON] = { #line 4116 .trainerName = _("PRESTON"), @@ -10220,7 +10220,7 @@ F_TRAINER_FEMALE | }, }, #line 4128 - [TRAINER_VIRGIL] = + [DIFFICULTY_NORMAL][TRAINER_VIRGIL] = { #line 4129 .trainerName = _("VIRGIL"), @@ -10252,7 +10252,7 @@ F_TRAINER_FEMALE | }, }, #line 4141 - [TRAINER_BLAKE] = + [DIFFICULTY_NORMAL][TRAINER_BLAKE] = { #line 4142 .trainerName = _("BLAKE"), @@ -10284,7 +10284,7 @@ F_TRAINER_FEMALE | }, }, #line 4154 - [TRAINER_WILLIAM] = + [DIFFICULTY_NORMAL][TRAINER_WILLIAM] = { #line 4155 .trainerName = _("WILLIAM"), @@ -10338,7 +10338,7 @@ F_TRAINER_FEMALE | }, }, #line 4175 - [TRAINER_JOSHUA] = + [DIFFICULTY_NORMAL][TRAINER_JOSHUA] = { #line 4176 .trainerName = _("JOSHUA"), @@ -10381,7 +10381,7 @@ F_TRAINER_FEMALE | }, }, #line 4192 - [TRAINER_CAMERON_1] = + [DIFFICULTY_NORMAL][TRAINER_CAMERON_1] = { #line 4193 .trainerName = _("CAMERON"), @@ -10413,7 +10413,7 @@ F_TRAINER_FEMALE | }, }, #line 4205 - [TRAINER_CAMERON_2] = + [DIFFICULTY_NORMAL][TRAINER_CAMERON_2] = { #line 4206 .trainerName = _("CAMERON"), @@ -10456,7 +10456,7 @@ F_TRAINER_FEMALE | }, }, #line 4222 - [TRAINER_CAMERON_3] = + [DIFFICULTY_NORMAL][TRAINER_CAMERON_3] = { #line 4223 .trainerName = _("CAMERON"), @@ -10499,7 +10499,7 @@ F_TRAINER_FEMALE | }, }, #line 4239 - [TRAINER_CAMERON_4] = + [DIFFICULTY_NORMAL][TRAINER_CAMERON_4] = { #line 4240 .trainerName = _("CAMERON"), @@ -10542,7 +10542,7 @@ F_TRAINER_FEMALE | }, }, #line 4256 - [TRAINER_CAMERON_5] = + [DIFFICULTY_NORMAL][TRAINER_CAMERON_5] = { #line 4257 .trainerName = _("CAMERON"), @@ -10585,7 +10585,7 @@ F_TRAINER_FEMALE | }, }, #line 4273 - [TRAINER_JACLYN] = + [DIFFICULTY_NORMAL][TRAINER_JACLYN] = { #line 4274 .trainerName = _("JACLYN"), @@ -10623,7 +10623,7 @@ F_TRAINER_FEMALE | }, }, #line 4287 - [TRAINER_HANNAH] = + [DIFFICULTY_NORMAL][TRAINER_HANNAH] = { #line 4288 .trainerName = _("HANNAH"), @@ -10657,7 +10657,7 @@ F_TRAINER_FEMALE | }, }, #line 4300 - [TRAINER_SAMANTHA] = + [DIFFICULTY_NORMAL][TRAINER_SAMANTHA] = { #line 4301 .trainerName = _("SAMANTHA"), @@ -10691,7 +10691,7 @@ F_TRAINER_FEMALE | }, }, #line 4313 - [TRAINER_MAURA] = + [DIFFICULTY_NORMAL][TRAINER_MAURA] = { #line 4314 .trainerName = _("MAURA"), @@ -10725,7 +10725,7 @@ F_TRAINER_FEMALE | }, }, #line 4326 - [TRAINER_KAYLA] = + [DIFFICULTY_NORMAL][TRAINER_KAYLA] = { #line 4327 .trainerName = _("KAYLA"), @@ -10781,7 +10781,7 @@ F_TRAINER_FEMALE | }, }, #line 4347 - [TRAINER_ALEXIS] = + [DIFFICULTY_NORMAL][TRAINER_ALEXIS] = { #line 4348 .trainerName = _("ALEXIS"), @@ -10826,7 +10826,7 @@ F_TRAINER_FEMALE | }, }, #line 4364 - [TRAINER_JACKI_1] = + [DIFFICULTY_NORMAL][TRAINER_JACKI_1] = { #line 4365 .trainerName = _("JACKI"), @@ -10871,7 +10871,7 @@ F_TRAINER_FEMALE | }, }, #line 4381 - [TRAINER_JACKI_2] = + [DIFFICULTY_NORMAL][TRAINER_JACKI_2] = { #line 4382 .trainerName = _("JACKI"), @@ -10916,7 +10916,7 @@ F_TRAINER_FEMALE | }, }, #line 4398 - [TRAINER_JACKI_3] = + [DIFFICULTY_NORMAL][TRAINER_JACKI_3] = { #line 4399 .trainerName = _("JACKI"), @@ -10961,7 +10961,7 @@ F_TRAINER_FEMALE | }, }, #line 4415 - [TRAINER_JACKI_4] = + [DIFFICULTY_NORMAL][TRAINER_JACKI_4] = { #line 4416 .trainerName = _("JACKI"), @@ -11006,7 +11006,7 @@ F_TRAINER_FEMALE | }, }, #line 4432 - [TRAINER_JACKI_5] = + [DIFFICULTY_NORMAL][TRAINER_JACKI_5] = { #line 4433 .trainerName = _("JACKI"), @@ -11051,7 +11051,7 @@ F_TRAINER_FEMALE | }, }, #line 4449 - [TRAINER_WALTER_1] = + [DIFFICULTY_NORMAL][TRAINER_WALTER_1] = { #line 4450 .trainerName = _("WALTER"), @@ -11083,7 +11083,7 @@ F_TRAINER_FEMALE | }, }, #line 4462 - [TRAINER_MICAH] = + [DIFFICULTY_NORMAL][TRAINER_MICAH] = { #line 4463 .trainerName = _("MICAH"), @@ -11126,7 +11126,7 @@ F_TRAINER_FEMALE | }, }, #line 4479 - [TRAINER_THOMAS] = + [DIFFICULTY_NORMAL][TRAINER_THOMAS] = { #line 4480 .trainerName = _("THOMAS"), @@ -11158,7 +11158,7 @@ F_TRAINER_FEMALE | }, }, #line 4492 - [TRAINER_WALTER_2] = + [DIFFICULTY_NORMAL][TRAINER_WALTER_2] = { #line 4493 .trainerName = _("WALTER"), @@ -11190,7 +11190,7 @@ F_TRAINER_FEMALE | }, }, #line 4505 - [TRAINER_WALTER_3] = + [DIFFICULTY_NORMAL][TRAINER_WALTER_3] = { #line 4506 .trainerName = _("WALTER"), @@ -11247,7 +11247,7 @@ F_TRAINER_FEMALE | }, }, #line 4530 - [TRAINER_WALTER_4] = + [DIFFICULTY_NORMAL][TRAINER_WALTER_4] = { #line 4531 .trainerName = _("WALTER"), @@ -11303,7 +11303,7 @@ F_TRAINER_FEMALE | }, }, #line 4554 - [TRAINER_WALTER_5] = + [DIFFICULTY_NORMAL][TRAINER_WALTER_5] = { #line 4555 .trainerName = _("WALTER"), @@ -11378,7 +11378,7 @@ F_TRAINER_FEMALE | }, }, #line 4587 - [TRAINER_SIDNEY] = + [DIFFICULTY_NORMAL][TRAINER_SIDNEY] = { #line 4588 .trainerName = _("SIDNEY"), @@ -11396,7 +11396,6 @@ F_TRAINER_FEMALE | #line 4595 .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_FORCE_SETUP_FIRST_TURN, #line 4596 - .mugshotEnabled = TRUE, .mugshotColor = MUGSHOT_COLOR_PURPLE, .partySize = 5, .party = (const struct TrainerMon[]) @@ -11496,7 +11495,7 @@ F_TRAINER_FEMALE | }, }, #line 4638 - [TRAINER_PHOEBE] = + [DIFFICULTY_NORMAL][TRAINER_PHOEBE] = { #line 4639 .trainerName = _("PHOEBE"), @@ -11516,7 +11515,6 @@ F_TRAINER_FEMALE | #line 4646 .aiFlags = AI_FLAG_BASIC_TRAINER, #line 4647 - .mugshotEnabled = TRUE, .mugshotColor = MUGSHOT_COLOR_GREEN, .partySize = 5, .party = (const struct TrainerMon[]) @@ -11616,7 +11614,7 @@ F_TRAINER_FEMALE | }, }, #line 4689 - [TRAINER_GLACIA] = + [DIFFICULTY_NORMAL][TRAINER_GLACIA] = { #line 4690 .trainerName = _("GLACIA"), @@ -11636,7 +11634,6 @@ F_TRAINER_FEMALE | #line 4697 .aiFlags = AI_FLAG_BASIC_TRAINER, #line 4698 - .mugshotEnabled = TRUE, .mugshotColor = MUGSHOT_COLOR_PINK, .partySize = 5, .party = (const struct TrainerMon[]) @@ -11736,7 +11733,7 @@ F_TRAINER_FEMALE | }, }, #line 4740 - [TRAINER_DRAKE] = + [DIFFICULTY_NORMAL][TRAINER_DRAKE] = { #line 4741 .trainerName = _("DRAKE"), @@ -11754,7 +11751,6 @@ F_TRAINER_FEMALE | #line 4748 .aiFlags = AI_FLAG_BASIC_TRAINER, #line 4749 - .mugshotEnabled = TRUE, .mugshotColor = MUGSHOT_COLOR_BLUE, .partySize = 5, .party = (const struct TrainerMon[]) @@ -11854,7 +11850,7 @@ F_TRAINER_FEMALE | }, }, #line 4791 - [TRAINER_ROXANNE_1] = + [DIFFICULTY_NORMAL][TRAINER_ROXANNE_1] = { #line 4792 .trainerName = _("ROXANNE"), @@ -11935,7 +11931,7 @@ F_TRAINER_FEMALE | }, }, #line 4825 - [TRAINER_BRAWLY_1] = + [DIFFICULTY_NORMAL][TRAINER_BRAWLY_1] = { #line 4826 .trainerName = _("BRAWLY"), @@ -12014,7 +12010,7 @@ F_TRAINER_FEMALE | }, }, #line 4859 - [TRAINER_WATTSON_1] = + [DIFFICULTY_NORMAL][TRAINER_WATTSON_1] = { #line 4860 .trainerName = _("WATTSON"), @@ -12111,7 +12107,7 @@ F_TRAINER_FEMALE | }, }, #line 4901 - [TRAINER_FLANNERY_1] = + [DIFFICULTY_NORMAL][TRAINER_FLANNERY_1] = { #line 4902 .trainerName = _("FLANNERY"), @@ -12210,7 +12206,7 @@ F_TRAINER_FEMALE | }, }, #line 4943 - [TRAINER_NORMAN_1] = + [DIFFICULTY_NORMAL][TRAINER_NORMAN_1] = { #line 4944 .trainerName = _("NORMAN"), @@ -12307,7 +12303,7 @@ F_TRAINER_FEMALE | }, }, #line 4985 - [TRAINER_WINONA_1] = + [DIFFICULTY_NORMAL][TRAINER_WINONA_1] = { #line 4986 .trainerName = _("WINONA"), @@ -12424,7 +12420,7 @@ F_TRAINER_FEMALE | }, }, #line 5035 - [TRAINER_TATE_AND_LIZA_1] = + [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_1] = { #line 5036 .trainerName = _("TATE&LIZA"), @@ -12523,7 +12519,7 @@ F_TRAINER_FEMALE | }, }, #line 5077 - [TRAINER_JUAN_1] = + [DIFFICULTY_NORMAL][TRAINER_JUAN_1] = { #line 5078 .trainerName = _("JUAN"), @@ -12638,7 +12634,7 @@ F_TRAINER_FEMALE | }, }, #line 5127 - [TRAINER_JERRY_1] = + [DIFFICULTY_NORMAL][TRAINER_JERRY_1] = { #line 5128 .trainerName = _("JERRY"), @@ -12670,7 +12666,7 @@ F_TRAINER_FEMALE | }, }, #line 5140 - [TRAINER_TED] = + [DIFFICULTY_NORMAL][TRAINER_TED] = { #line 5141 .trainerName = _("TED"), @@ -12702,7 +12698,7 @@ F_TRAINER_FEMALE | }, }, #line 5153 - [TRAINER_PAUL] = + [DIFFICULTY_NORMAL][TRAINER_PAUL] = { #line 5154 .trainerName = _("PAUL"), @@ -12756,7 +12752,7 @@ F_TRAINER_FEMALE | }, }, #line 5174 - [TRAINER_JERRY_2] = + [DIFFICULTY_NORMAL][TRAINER_JERRY_2] = { #line 5175 .trainerName = _("JERRY"), @@ -12799,7 +12795,7 @@ F_TRAINER_FEMALE | }, }, #line 5191 - [TRAINER_JERRY_3] = + [DIFFICULTY_NORMAL][TRAINER_JERRY_3] = { #line 5192 .trainerName = _("JERRY"), @@ -12842,7 +12838,7 @@ F_TRAINER_FEMALE | }, }, #line 5208 - [TRAINER_JERRY_4] = + [DIFFICULTY_NORMAL][TRAINER_JERRY_4] = { #line 5209 .trainerName = _("JERRY"), @@ -12885,7 +12881,7 @@ F_TRAINER_FEMALE | }, }, #line 5225 - [TRAINER_JERRY_5] = + [DIFFICULTY_NORMAL][TRAINER_JERRY_5] = { #line 5226 .trainerName = _("JERRY"), @@ -12939,7 +12935,7 @@ F_TRAINER_FEMALE | }, }, #line 5246 - [TRAINER_KAREN_1] = + [DIFFICULTY_NORMAL][TRAINER_KAREN_1] = { #line 5247 .trainerName = _("KAREN"), @@ -12973,7 +12969,7 @@ F_TRAINER_FEMALE | }, }, #line 5259 - [TRAINER_GEORGIA] = + [DIFFICULTY_NORMAL][TRAINER_GEORGIA] = { #line 5260 .trainerName = _("GEORGIA"), @@ -13018,7 +13014,7 @@ F_TRAINER_FEMALE | }, }, #line 5276 - [TRAINER_KAREN_2] = + [DIFFICULTY_NORMAL][TRAINER_KAREN_2] = { #line 5277 .trainerName = _("KAREN"), @@ -13063,7 +13059,7 @@ F_TRAINER_FEMALE | }, }, #line 5293 - [TRAINER_KAREN_3] = + [DIFFICULTY_NORMAL][TRAINER_KAREN_3] = { #line 5294 .trainerName = _("KAREN"), @@ -13108,7 +13104,7 @@ F_TRAINER_FEMALE | }, }, #line 5310 - [TRAINER_KAREN_4] = + [DIFFICULTY_NORMAL][TRAINER_KAREN_4] = { #line 5311 .trainerName = _("KAREN"), @@ -13153,7 +13149,7 @@ F_TRAINER_FEMALE | }, }, #line 5327 - [TRAINER_KAREN_5] = + [DIFFICULTY_NORMAL][TRAINER_KAREN_5] = { #line 5328 .trainerName = _("KAREN"), @@ -13198,7 +13194,7 @@ F_TRAINER_FEMALE | }, }, #line 5344 - [TRAINER_KATE_AND_JOY] = + [DIFFICULTY_NORMAL][TRAINER_KATE_AND_JOY] = { #line 5345 .trainerName = _("KATE & JOY"), @@ -13255,7 +13251,7 @@ F_TRAINER_FEMALE | }, }, #line 5369 - [TRAINER_ANNA_AND_MEG_1] = + [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_1] = { #line 5370 .trainerName = _("ANNA & MEG"), @@ -13311,7 +13307,7 @@ F_TRAINER_FEMALE | }, }, #line 5393 - [TRAINER_ANNA_AND_MEG_2] = + [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_2] = { #line 5394 .trainerName = _("ANNA & MEG"), @@ -13367,7 +13363,7 @@ F_TRAINER_FEMALE | }, }, #line 5417 - [TRAINER_ANNA_AND_MEG_3] = + [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_3] = { #line 5418 .trainerName = _("ANNA & MEG"), @@ -13423,7 +13419,7 @@ F_TRAINER_FEMALE | }, }, #line 5441 - [TRAINER_ANNA_AND_MEG_4] = + [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_4] = { #line 5442 .trainerName = _("ANNA & MEG"), @@ -13479,7 +13475,7 @@ F_TRAINER_FEMALE | }, }, #line 5465 - [TRAINER_ANNA_AND_MEG_5] = + [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_5] = { #line 5466 .trainerName = _("ANNA & MEG"), @@ -13535,7 +13531,7 @@ F_TRAINER_FEMALE | }, }, #line 5489 - [TRAINER_VICTOR] = + [DIFFICULTY_NORMAL][TRAINER_VICTOR] = { #line 5490 .trainerName = _("VICTOR"), @@ -13582,7 +13578,7 @@ F_TRAINER_FEMALE | }, }, #line 5506 - [TRAINER_MIGUEL_1] = + [DIFFICULTY_NORMAL][TRAINER_MIGUEL_1] = { #line 5507 .trainerName = _("MIGUEL"), @@ -13616,7 +13612,7 @@ F_TRAINER_FEMALE | }, }, #line 5519 - [TRAINER_COLTON] = + [DIFFICULTY_NORMAL][TRAINER_COLTON] = { #line 5520 .trainerName = _("COLTON"), @@ -13757,7 +13753,7 @@ F_TRAINER_FEMALE | }, }, #line 5576 - [TRAINER_MIGUEL_2] = + [DIFFICULTY_NORMAL][TRAINER_MIGUEL_2] = { #line 5577 .trainerName = _("MIGUEL"), @@ -13791,7 +13787,7 @@ F_TRAINER_FEMALE | }, }, #line 5589 - [TRAINER_MIGUEL_3] = + [DIFFICULTY_NORMAL][TRAINER_MIGUEL_3] = { #line 5590 .trainerName = _("MIGUEL"), @@ -13825,7 +13821,7 @@ F_TRAINER_FEMALE | }, }, #line 5602 - [TRAINER_MIGUEL_4] = + [DIFFICULTY_NORMAL][TRAINER_MIGUEL_4] = { #line 5603 .trainerName = _("MIGUEL"), @@ -13859,7 +13855,7 @@ F_TRAINER_FEMALE | }, }, #line 5615 - [TRAINER_MIGUEL_5] = + [DIFFICULTY_NORMAL][TRAINER_MIGUEL_5] = { #line 5616 .trainerName = _("MIGUEL"), @@ -13893,7 +13889,7 @@ F_TRAINER_FEMALE | }, }, #line 5628 - [TRAINER_VICTORIA] = + [DIFFICULTY_NORMAL][TRAINER_VICTORIA] = { #line 5629 .trainerName = _("VICTORIA"), @@ -13929,7 +13925,7 @@ F_TRAINER_FEMALE | }, }, #line 5641 - [TRAINER_VANESSA] = + [DIFFICULTY_NORMAL][TRAINER_VANESSA] = { #line 5642 .trainerName = _("VANESSA"), @@ -13965,7 +13961,7 @@ F_TRAINER_FEMALE | }, }, #line 5654 - [TRAINER_BETHANY] = + [DIFFICULTY_NORMAL][TRAINER_BETHANY] = { #line 5655 .trainerName = _("BETHANY"), @@ -14027,7 +14023,7 @@ F_TRAINER_FEMALE | }, }, #line 5675 - [TRAINER_ISABEL_1] = + [DIFFICULTY_NORMAL][TRAINER_ISABEL_1] = { #line 5676 .trainerName = _("ISABEL"), @@ -14076,7 +14072,7 @@ F_TRAINER_FEMALE | }, }, #line 5692 - [TRAINER_ISABEL_2] = + [DIFFICULTY_NORMAL][TRAINER_ISABEL_2] = { #line 5693 .trainerName = _("ISABEL"), @@ -14125,7 +14121,7 @@ F_TRAINER_FEMALE | }, }, #line 5709 - [TRAINER_ISABEL_3] = + [DIFFICULTY_NORMAL][TRAINER_ISABEL_3] = { #line 5710 .trainerName = _("ISABEL"), @@ -14174,7 +14170,7 @@ F_TRAINER_FEMALE | }, }, #line 5726 - [TRAINER_ISABEL_4] = + [DIFFICULTY_NORMAL][TRAINER_ISABEL_4] = { #line 5727 .trainerName = _("ISABEL"), @@ -14223,7 +14219,7 @@ F_TRAINER_FEMALE | }, }, #line 5743 - [TRAINER_ISABEL_5] = + [DIFFICULTY_NORMAL][TRAINER_ISABEL_5] = { #line 5744 .trainerName = _("ISABEL"), @@ -14272,7 +14268,7 @@ F_TRAINER_FEMALE | }, }, #line 5760 - [TRAINER_TIMOTHY_1] = + [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_1] = { #line 5761 .trainerName = _("TIMOTHY"), @@ -14304,7 +14300,7 @@ F_TRAINER_FEMALE | }, }, #line 5773 - [TRAINER_TIMOTHY_2] = + [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_2] = { #line 5774 .trainerName = _("TIMOTHY"), @@ -14343,7 +14339,7 @@ F_TRAINER_FEMALE | }, }, #line 5790 - [TRAINER_TIMOTHY_3] = + [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_3] = { #line 5791 .trainerName = _("TIMOTHY"), @@ -14382,7 +14378,7 @@ F_TRAINER_FEMALE | }, }, #line 5807 - [TRAINER_TIMOTHY_4] = + [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_4] = { #line 5808 .trainerName = _("TIMOTHY"), @@ -14421,7 +14417,7 @@ F_TRAINER_FEMALE | }, }, #line 5824 - [TRAINER_TIMOTHY_5] = + [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_5] = { #line 5825 .trainerName = _("TIMOTHY"), @@ -14460,7 +14456,7 @@ F_TRAINER_FEMALE | }, }, #line 5841 - [TRAINER_VICKY] = + [DIFFICULTY_NORMAL][TRAINER_VICKY] = { #line 5842 .trainerName = _("VICKY"), @@ -14501,7 +14497,7 @@ F_TRAINER_FEMALE | }, }, #line 5858 - [TRAINER_SHELBY_1] = + [DIFFICULTY_NORMAL][TRAINER_SHELBY_1] = { #line 5859 .trainerName = _("SHELBY"), @@ -14546,7 +14542,7 @@ F_TRAINER_FEMALE | }, }, #line 5875 - [TRAINER_SHELBY_2] = + [DIFFICULTY_NORMAL][TRAINER_SHELBY_2] = { #line 5876 .trainerName = _("SHELBY"), @@ -14591,7 +14587,7 @@ F_TRAINER_FEMALE | }, }, #line 5892 - [TRAINER_SHELBY_3] = + [DIFFICULTY_NORMAL][TRAINER_SHELBY_3] = { #line 5893 .trainerName = _("SHELBY"), @@ -14636,7 +14632,7 @@ F_TRAINER_FEMALE | }, }, #line 5909 - [TRAINER_SHELBY_4] = + [DIFFICULTY_NORMAL][TRAINER_SHELBY_4] = { #line 5910 .trainerName = _("SHELBY"), @@ -14681,7 +14677,7 @@ F_TRAINER_FEMALE | }, }, #line 5926 - [TRAINER_SHELBY_5] = + [DIFFICULTY_NORMAL][TRAINER_SHELBY_5] = { #line 5927 .trainerName = _("SHELBY"), @@ -14726,7 +14722,7 @@ F_TRAINER_FEMALE | }, }, #line 5943 - [TRAINER_CALVIN_1] = + [DIFFICULTY_NORMAL][TRAINER_CALVIN_1] = { #line 5944 .trainerName = _("CALVIN"), @@ -14758,7 +14754,7 @@ F_TRAINER_FEMALE | }, }, #line 5956 - [TRAINER_BILLY] = + [DIFFICULTY_NORMAL][TRAINER_BILLY] = { #line 5957 .trainerName = _("BILLY"), @@ -14801,7 +14797,7 @@ F_TRAINER_FEMALE | }, }, #line 5973 - [TRAINER_JOSH] = + [DIFFICULTY_NORMAL][TRAINER_JOSH] = { #line 5974 .trainerName = _("JOSH"), @@ -14837,7 +14833,7 @@ F_TRAINER_FEMALE | }, }, #line 5987 - [TRAINER_TOMMY] = + [DIFFICULTY_NORMAL][TRAINER_TOMMY] = { #line 5988 .trainerName = _("TOMMY"), @@ -14880,7 +14876,7 @@ F_TRAINER_FEMALE | }, }, #line 6004 - [TRAINER_JOEY] = + [DIFFICULTY_NORMAL][TRAINER_JOEY] = { #line 6005 .trainerName = _("JOEY"), @@ -14912,7 +14908,7 @@ F_TRAINER_FEMALE | }, }, #line 6017 - [TRAINER_BEN] = + [DIFFICULTY_NORMAL][TRAINER_BEN] = { #line 6018 .trainerName = _("BEN"), @@ -14969,7 +14965,7 @@ F_TRAINER_FEMALE | }, }, #line 6042 - [TRAINER_QUINCY] = + [DIFFICULTY_NORMAL][TRAINER_QUINCY] = { #line 6043 .trainerName = _("QUINCY"), @@ -15028,7 +15024,7 @@ F_TRAINER_FEMALE | }, }, #line 6068 - [TRAINER_KATELYNN] = + [DIFFICULTY_NORMAL][TRAINER_KATELYNN] = { #line 6069 .trainerName = _("KATELYNN"), @@ -15089,7 +15085,7 @@ F_TRAINER_FEMALE | }, }, #line 6094 - [TRAINER_JAYLEN] = + [DIFFICULTY_NORMAL][TRAINER_JAYLEN] = { #line 6095 .trainerName = _("JAYLEN"), @@ -15121,7 +15117,7 @@ F_TRAINER_FEMALE | }, }, #line 6107 - [TRAINER_DILLON] = + [DIFFICULTY_NORMAL][TRAINER_DILLON] = { #line 6108 .trainerName = _("DILLON"), @@ -15153,7 +15149,7 @@ F_TRAINER_FEMALE | }, }, #line 6120 - [TRAINER_CALVIN_2] = + [DIFFICULTY_NORMAL][TRAINER_CALVIN_2] = { #line 6121 .trainerName = _("CALVIN"), @@ -15185,7 +15181,7 @@ F_TRAINER_FEMALE | }, }, #line 6133 - [TRAINER_CALVIN_3] = + [DIFFICULTY_NORMAL][TRAINER_CALVIN_3] = { #line 6134 .trainerName = _("CALVIN"), @@ -15228,7 +15224,7 @@ F_TRAINER_FEMALE | }, }, #line 6150 - [TRAINER_CALVIN_4] = + [DIFFICULTY_NORMAL][TRAINER_CALVIN_4] = { #line 6151 .trainerName = _("CALVIN"), @@ -15282,7 +15278,7 @@ F_TRAINER_FEMALE | }, }, #line 6171 - [TRAINER_CALVIN_5] = + [DIFFICULTY_NORMAL][TRAINER_CALVIN_5] = { #line 6172 .trainerName = _("CALVIN"), @@ -15336,7 +15332,7 @@ F_TRAINER_FEMALE | }, }, #line 6192 - [TRAINER_EDDIE] = + [DIFFICULTY_NORMAL][TRAINER_EDDIE] = { #line 6193 .trainerName = _("EDDIE"), @@ -15379,7 +15375,7 @@ F_TRAINER_FEMALE | }, }, #line 6209 - [TRAINER_ALLEN] = + [DIFFICULTY_NORMAL][TRAINER_ALLEN] = { #line 6210 .trainerName = _("ALLEN"), @@ -15422,7 +15418,7 @@ F_TRAINER_FEMALE | }, }, #line 6226 - [TRAINER_TIMMY] = + [DIFFICULTY_NORMAL][TRAINER_TIMMY] = { #line 6227 .trainerName = _("TIMMY"), @@ -15465,7 +15461,7 @@ F_TRAINER_FEMALE | }, }, #line 6243 - [TRAINER_WALLACE] = + [DIFFICULTY_NORMAL][TRAINER_WALLACE] = { #line 6244 .trainerName = _("WALLACE"), @@ -15483,7 +15479,6 @@ F_TRAINER_FEMALE | #line 6251 .aiFlags = AI_FLAG_BASIC_TRAINER, #line 6252 - .mugshotEnabled = TRUE, .mugshotColor = MUGSHOT_COLOR_YELLOW, .partySize = 6, .party = (const struct TrainerMon[]) @@ -15601,7 +15596,7 @@ F_TRAINER_FEMALE | }, }, #line 6302 - [TRAINER_ANDREW] = + [DIFFICULTY_NORMAL][TRAINER_ANDREW] = { #line 6303 .trainerName = _("ANDREW"), @@ -15655,7 +15650,7 @@ F_TRAINER_FEMALE | }, }, #line 6323 - [TRAINER_IVAN] = + [DIFFICULTY_NORMAL][TRAINER_IVAN] = { #line 6324 .trainerName = _("IVAN"), @@ -15709,7 +15704,7 @@ F_TRAINER_FEMALE | }, }, #line 6344 - [TRAINER_CLAUDE] = + [DIFFICULTY_NORMAL][TRAINER_CLAUDE] = { #line 6345 .trainerName = _("CLAUDE"), @@ -15763,7 +15758,7 @@ F_TRAINER_FEMALE | }, }, #line 6365 - [TRAINER_ELLIOT_1] = + [DIFFICULTY_NORMAL][TRAINER_ELLIOT_1] = { #line 6366 .trainerName = _("ELLIOT"), @@ -15817,7 +15812,7 @@ F_TRAINER_FEMALE | }, }, #line 6386 - [TRAINER_NED] = + [DIFFICULTY_NORMAL][TRAINER_NED] = { #line 6387 .trainerName = _("NED"), @@ -15849,7 +15844,7 @@ F_TRAINER_FEMALE | }, }, #line 6399 - [TRAINER_DALE] = + [DIFFICULTY_NORMAL][TRAINER_DALE] = { #line 6400 .trainerName = _("DALE"), @@ -15914,7 +15909,7 @@ F_TRAINER_FEMALE | }, }, #line 6424 - [TRAINER_NOLAN] = + [DIFFICULTY_NORMAL][TRAINER_NOLAN] = { #line 6425 .trainerName = _("NOLAN"), @@ -15946,7 +15941,7 @@ F_TRAINER_FEMALE | }, }, #line 6437 - [TRAINER_BARNY] = + [DIFFICULTY_NORMAL][TRAINER_BARNY] = { #line 6438 .trainerName = _("BARNY"), @@ -15989,7 +15984,7 @@ F_TRAINER_FEMALE | }, }, #line 6454 - [TRAINER_WADE] = + [DIFFICULTY_NORMAL][TRAINER_WADE] = { #line 6455 .trainerName = _("WADE"), @@ -16021,7 +16016,7 @@ F_TRAINER_FEMALE | }, }, #line 6467 - [TRAINER_CARTER] = + [DIFFICULTY_NORMAL][TRAINER_CARTER] = { #line 6468 .trainerName = _("CARTER"), @@ -16064,7 +16059,7 @@ F_TRAINER_FEMALE | }, }, #line 6484 - [TRAINER_ELLIOT_2] = + [DIFFICULTY_NORMAL][TRAINER_ELLIOT_2] = { #line 6485 .trainerName = _("ELLIOT"), @@ -16118,7 +16113,7 @@ F_TRAINER_FEMALE | }, }, #line 6505 - [TRAINER_ELLIOT_3] = + [DIFFICULTY_NORMAL][TRAINER_ELLIOT_3] = { #line 6506 .trainerName = _("ELLIOT"), @@ -16183,7 +16178,7 @@ F_TRAINER_FEMALE | }, }, #line 6530 - [TRAINER_ELLIOT_4] = + [DIFFICULTY_NORMAL][TRAINER_ELLIOT_4] = { #line 6531 .trainerName = _("ELLIOT"), @@ -16248,7 +16243,7 @@ F_TRAINER_FEMALE | }, }, #line 6555 - [TRAINER_ELLIOT_5] = + [DIFFICULTY_NORMAL][TRAINER_ELLIOT_5] = { #line 6556 .trainerName = _("ELLIOT"), @@ -16313,7 +16308,7 @@ F_TRAINER_FEMALE | }, }, #line 6580 - [TRAINER_RONALD] = + [DIFFICULTY_NORMAL][TRAINER_RONALD] = { #line 6581 .trainerName = _("RONALD"), @@ -16400,7 +16395,7 @@ F_TRAINER_FEMALE | }, }, #line 6613 - [TRAINER_JACOB] = + [DIFFICULTY_NORMAL][TRAINER_JACOB] = { #line 6614 .trainerName = _("JACOB"), @@ -16454,7 +16449,7 @@ F_TRAINER_FEMALE | }, }, #line 6634 - [TRAINER_ANTHONY] = + [DIFFICULTY_NORMAL][TRAINER_ANTHONY] = { #line 6635 .trainerName = _("ANTHONY"), @@ -16497,7 +16492,7 @@ F_TRAINER_FEMALE | }, }, #line 6651 - [TRAINER_BENJAMIN_1] = + [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_1] = { #line 6652 .trainerName = _("BENJAMIN"), @@ -16529,7 +16524,7 @@ F_TRAINER_FEMALE | }, }, #line 6664 - [TRAINER_BENJAMIN_2] = + [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_2] = { #line 6665 .trainerName = _("BENJAMIN"), @@ -16561,7 +16556,7 @@ F_TRAINER_FEMALE | }, }, #line 6677 - [TRAINER_BENJAMIN_3] = + [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_3] = { #line 6678 .trainerName = _("BENJAMIN"), @@ -16593,7 +16588,7 @@ F_TRAINER_FEMALE | }, }, #line 6690 - [TRAINER_BENJAMIN_4] = + [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_4] = { #line 6691 .trainerName = _("BENJAMIN"), @@ -16625,7 +16620,7 @@ F_TRAINER_FEMALE | }, }, #line 6703 - [TRAINER_BENJAMIN_5] = + [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_5] = { #line 6704 .trainerName = _("BENJAMIN"), @@ -16657,7 +16652,7 @@ F_TRAINER_FEMALE | }, }, #line 6716 - [TRAINER_ABIGAIL_1] = + [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_1] = { #line 6717 .trainerName = _("ABIGAIL"), @@ -16691,7 +16686,7 @@ F_TRAINER_FEMALE | }, }, #line 6729 - [TRAINER_JASMINE] = + [DIFFICULTY_NORMAL][TRAINER_JASMINE] = { #line 6730 .trainerName = _("JASMINE"), @@ -16747,7 +16742,7 @@ F_TRAINER_FEMALE | }, }, #line 6750 - [TRAINER_ABIGAIL_2] = + [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_2] = { #line 6751 .trainerName = _("ABIGAIL"), @@ -16781,7 +16776,7 @@ F_TRAINER_FEMALE | }, }, #line 6763 - [TRAINER_ABIGAIL_3] = + [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_3] = { #line 6764 .trainerName = _("ABIGAIL"), @@ -16815,7 +16810,7 @@ F_TRAINER_FEMALE | }, }, #line 6776 - [TRAINER_ABIGAIL_4] = + [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_4] = { #line 6777 .trainerName = _("ABIGAIL"), @@ -16849,7 +16844,7 @@ F_TRAINER_FEMALE | }, }, #line 6789 - [TRAINER_ABIGAIL_5] = + [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_5] = { #line 6790 .trainerName = _("ABIGAIL"), @@ -16883,7 +16878,7 @@ F_TRAINER_FEMALE | }, }, #line 6802 - [TRAINER_DYLAN_1] = + [DIFFICULTY_NORMAL][TRAINER_DYLAN_1] = { #line 6803 .trainerName = _("DYLAN"), @@ -16915,7 +16910,7 @@ F_TRAINER_FEMALE | }, }, #line 6815 - [TRAINER_DYLAN_2] = + [DIFFICULTY_NORMAL][TRAINER_DYLAN_2] = { #line 6816 .trainerName = _("DYLAN"), @@ -16947,7 +16942,7 @@ F_TRAINER_FEMALE | }, }, #line 6828 - [TRAINER_DYLAN_3] = + [DIFFICULTY_NORMAL][TRAINER_DYLAN_3] = { #line 6829 .trainerName = _("DYLAN"), @@ -16979,7 +16974,7 @@ F_TRAINER_FEMALE | }, }, #line 6841 - [TRAINER_DYLAN_4] = + [DIFFICULTY_NORMAL][TRAINER_DYLAN_4] = { #line 6842 .trainerName = _("DYLAN"), @@ -17011,7 +17006,7 @@ F_TRAINER_FEMALE | }, }, #line 6854 - [TRAINER_DYLAN_5] = + [DIFFICULTY_NORMAL][TRAINER_DYLAN_5] = { #line 6855 .trainerName = _("DYLAN"), @@ -17043,7 +17038,7 @@ F_TRAINER_FEMALE | }, }, #line 6867 - [TRAINER_MARIA_1] = + [DIFFICULTY_NORMAL][TRAINER_MARIA_1] = { #line 6868 .trainerName = _("MARIA"), @@ -17077,7 +17072,7 @@ F_TRAINER_FEMALE | }, }, #line 6880 - [TRAINER_MARIA_2] = + [DIFFICULTY_NORMAL][TRAINER_MARIA_2] = { #line 6881 .trainerName = _("MARIA"), @@ -17111,7 +17106,7 @@ F_TRAINER_FEMALE | }, }, #line 6893 - [TRAINER_MARIA_3] = + [DIFFICULTY_NORMAL][TRAINER_MARIA_3] = { #line 6894 .trainerName = _("MARIA"), @@ -17145,7 +17140,7 @@ F_TRAINER_FEMALE | }, }, #line 6906 - [TRAINER_MARIA_4] = + [DIFFICULTY_NORMAL][TRAINER_MARIA_4] = { #line 6907 .trainerName = _("MARIA"), @@ -17179,7 +17174,7 @@ F_TRAINER_FEMALE | }, }, #line 6919 - [TRAINER_MARIA_5] = + [DIFFICULTY_NORMAL][TRAINER_MARIA_5] = { #line 6920 .trainerName = _("MARIA"), @@ -17213,7 +17208,7 @@ F_TRAINER_FEMALE | }, }, #line 6932 - [TRAINER_CAMDEN] = + [DIFFICULTY_NORMAL][TRAINER_CAMDEN] = { #line 6933 .trainerName = _("CAMDEN"), @@ -17256,7 +17251,7 @@ F_TRAINER_FEMALE | }, }, #line 6949 - [TRAINER_DEMETRIUS] = + [DIFFICULTY_NORMAL][TRAINER_DEMETRIUS] = { #line 6950 .trainerName = _("DEMETRIUS"), @@ -17299,7 +17294,7 @@ F_TRAINER_FEMALE | }, }, #line 6966 - [TRAINER_ISAIAH_1] = + [DIFFICULTY_NORMAL][TRAINER_ISAIAH_1] = { #line 6967 .trainerName = _("ISAIAH"), @@ -17331,7 +17326,7 @@ F_TRAINER_FEMALE | }, }, #line 6979 - [TRAINER_PABLO_1] = + [DIFFICULTY_NORMAL][TRAINER_PABLO_1] = { #line 6980 .trainerName = _("PABLO"), @@ -17374,7 +17369,7 @@ F_TRAINER_FEMALE | }, }, #line 6996 - [TRAINER_CHASE] = + [DIFFICULTY_NORMAL][TRAINER_CHASE] = { #line 6997 .trainerName = _("CHASE"), @@ -17417,7 +17412,7 @@ F_TRAINER_FEMALE | }, }, #line 7013 - [TRAINER_ISAIAH_2] = + [DIFFICULTY_NORMAL][TRAINER_ISAIAH_2] = { #line 7014 .trainerName = _("ISAIAH"), @@ -17449,7 +17444,7 @@ F_TRAINER_FEMALE | }, }, #line 7026 - [TRAINER_ISAIAH_3] = + [DIFFICULTY_NORMAL][TRAINER_ISAIAH_3] = { #line 7027 .trainerName = _("ISAIAH"), @@ -17481,7 +17476,7 @@ F_TRAINER_FEMALE | }, }, #line 7039 - [TRAINER_ISAIAH_4] = + [DIFFICULTY_NORMAL][TRAINER_ISAIAH_4] = { #line 7040 .trainerName = _("ISAIAH"), @@ -17513,7 +17508,7 @@ F_TRAINER_FEMALE | }, }, #line 7052 - [TRAINER_ISAIAH_5] = + [DIFFICULTY_NORMAL][TRAINER_ISAIAH_5] = { #line 7053 .trainerName = _("ISAIAH"), @@ -17545,7 +17540,7 @@ F_TRAINER_FEMALE | }, }, #line 7065 - [TRAINER_ISOBEL] = + [DIFFICULTY_NORMAL][TRAINER_ISOBEL] = { #line 7066 .trainerName = _("ISOBEL"), @@ -17579,7 +17574,7 @@ F_TRAINER_FEMALE | }, }, #line 7078 - [TRAINER_DONNY] = + [DIFFICULTY_NORMAL][TRAINER_DONNY] = { #line 7079 .trainerName = _("DONNY"), @@ -17624,7 +17619,7 @@ F_TRAINER_FEMALE | }, }, #line 7095 - [TRAINER_TALIA] = + [DIFFICULTY_NORMAL][TRAINER_TALIA] = { #line 7096 .trainerName = _("TALIA"), @@ -17658,7 +17653,7 @@ F_TRAINER_FEMALE | }, }, #line 7108 - [TRAINER_KATELYN_1] = + [DIFFICULTY_NORMAL][TRAINER_KATELYN_1] = { #line 7109 .trainerName = _("KATELYN"), @@ -17692,7 +17687,7 @@ F_TRAINER_FEMALE | }, }, #line 7121 - [TRAINER_ALLISON] = + [DIFFICULTY_NORMAL][TRAINER_ALLISON] = { #line 7122 .trainerName = _("ALLISON"), @@ -17737,7 +17732,7 @@ F_TRAINER_FEMALE | }, }, #line 7138 - [TRAINER_KATELYN_2] = + [DIFFICULTY_NORMAL][TRAINER_KATELYN_2] = { #line 7139 .trainerName = _("KATELYN"), @@ -17771,7 +17766,7 @@ F_TRAINER_FEMALE | }, }, #line 7151 - [TRAINER_KATELYN_3] = + [DIFFICULTY_NORMAL][TRAINER_KATELYN_3] = { #line 7152 .trainerName = _("KATELYN"), @@ -17805,7 +17800,7 @@ F_TRAINER_FEMALE | }, }, #line 7164 - [TRAINER_KATELYN_4] = + [DIFFICULTY_NORMAL][TRAINER_KATELYN_4] = { #line 7165 .trainerName = _("KATELYN"), @@ -17839,7 +17834,7 @@ F_TRAINER_FEMALE | }, }, #line 7177 - [TRAINER_KATELYN_5] = + [DIFFICULTY_NORMAL][TRAINER_KATELYN_5] = { #line 7178 .trainerName = _("KATELYN"), @@ -17873,7 +17868,7 @@ F_TRAINER_FEMALE | }, }, #line 7190 - [TRAINER_NICOLAS_1] = + [DIFFICULTY_NORMAL][TRAINER_NICOLAS_1] = { #line 7191 .trainerName = _("NICOLAS"), @@ -17916,7 +17911,7 @@ F_TRAINER_FEMALE | }, }, #line 7207 - [TRAINER_NICOLAS_2] = + [DIFFICULTY_NORMAL][TRAINER_NICOLAS_2] = { #line 7208 .trainerName = _("NICOLAS"), @@ -17959,7 +17954,7 @@ F_TRAINER_FEMALE | }, }, #line 7224 - [TRAINER_NICOLAS_3] = + [DIFFICULTY_NORMAL][TRAINER_NICOLAS_3] = { #line 7225 .trainerName = _("NICOLAS"), @@ -18002,7 +17997,7 @@ F_TRAINER_FEMALE | }, }, #line 7241 - [TRAINER_NICOLAS_4] = + [DIFFICULTY_NORMAL][TRAINER_NICOLAS_4] = { #line 7242 .trainerName = _("NICOLAS"), @@ -18056,7 +18051,7 @@ F_TRAINER_FEMALE | }, }, #line 7262 - [TRAINER_NICOLAS_5] = + [DIFFICULTY_NORMAL][TRAINER_NICOLAS_5] = { #line 7263 .trainerName = _("NICOLAS"), @@ -18112,7 +18107,7 @@ F_TRAINER_FEMALE | }, }, #line 7283 - [TRAINER_AARON] = + [DIFFICULTY_NORMAL][TRAINER_AARON] = { #line 7284 .trainerName = _("AARON"), @@ -18151,7 +18146,7 @@ F_TRAINER_FEMALE | }, }, #line 7300 - [TRAINER_PERRY] = + [DIFFICULTY_NORMAL][TRAINER_PERRY] = { #line 7301 .trainerName = _("PERRY"), @@ -18183,7 +18178,7 @@ F_TRAINER_FEMALE | }, }, #line 7313 - [TRAINER_HUGH] = + [DIFFICULTY_NORMAL][TRAINER_HUGH] = { #line 7314 .trainerName = _("HUGH"), @@ -18226,7 +18221,7 @@ F_TRAINER_FEMALE | }, }, #line 7330 - [TRAINER_PHIL] = + [DIFFICULTY_NORMAL][TRAINER_PHIL] = { #line 7331 .trainerName = _("PHIL"), @@ -18258,7 +18253,7 @@ F_TRAINER_FEMALE | }, }, #line 7343 - [TRAINER_JARED] = + [DIFFICULTY_NORMAL][TRAINER_JARED] = { #line 7344 .trainerName = _("JARED"), @@ -18312,7 +18307,7 @@ F_TRAINER_FEMALE | }, }, #line 7364 - [TRAINER_HUMBERTO] = + [DIFFICULTY_NORMAL][TRAINER_HUMBERTO] = { #line 7365 .trainerName = _("HUMBERTO"), @@ -18344,7 +18339,7 @@ F_TRAINER_FEMALE | }, }, #line 7377 - [TRAINER_PRESLEY] = + [DIFFICULTY_NORMAL][TRAINER_PRESLEY] = { #line 7378 .trainerName = _("PRESLEY"), @@ -18387,7 +18382,7 @@ F_TRAINER_FEMALE | }, }, #line 7394 - [TRAINER_EDWARDO] = + [DIFFICULTY_NORMAL][TRAINER_EDWARDO] = { #line 7395 .trainerName = _("EDWARDO"), @@ -18430,7 +18425,7 @@ F_TRAINER_FEMALE | }, }, #line 7411 - [TRAINER_COLIN] = + [DIFFICULTY_NORMAL][TRAINER_COLIN] = { #line 7412 .trainerName = _("COLIN"), @@ -18473,7 +18468,7 @@ F_TRAINER_FEMALE | }, }, #line 7428 - [TRAINER_ROBERT_1] = + [DIFFICULTY_NORMAL][TRAINER_ROBERT_1] = { #line 7429 .trainerName = _("ROBERT"), @@ -18505,7 +18500,7 @@ F_TRAINER_FEMALE | }, }, #line 7441 - [TRAINER_BENNY] = + [DIFFICULTY_NORMAL][TRAINER_BENNY] = { #line 7442 .trainerName = _("BENNY"), @@ -18559,7 +18554,7 @@ F_TRAINER_FEMALE | }, }, #line 7462 - [TRAINER_CHESTER] = + [DIFFICULTY_NORMAL][TRAINER_CHESTER] = { #line 7463 .trainerName = _("CHESTER"), @@ -18602,7 +18597,7 @@ F_TRAINER_FEMALE | }, }, #line 7479 - [TRAINER_ROBERT_2] = + [DIFFICULTY_NORMAL][TRAINER_ROBERT_2] = { #line 7480 .trainerName = _("ROBERT"), @@ -18645,7 +18640,7 @@ F_TRAINER_FEMALE | }, }, #line 7496 - [TRAINER_ROBERT_3] = + [DIFFICULTY_NORMAL][TRAINER_ROBERT_3] = { #line 7497 .trainerName = _("ROBERT"), @@ -18688,7 +18683,7 @@ F_TRAINER_FEMALE | }, }, #line 7513 - [TRAINER_ROBERT_4] = + [DIFFICULTY_NORMAL][TRAINER_ROBERT_4] = { #line 7514 .trainerName = _("ROBERT"), @@ -18731,7 +18726,7 @@ F_TRAINER_FEMALE | }, }, #line 7530 - [TRAINER_ROBERT_5] = + [DIFFICULTY_NORMAL][TRAINER_ROBERT_5] = { #line 7531 .trainerName = _("ROBERT"), @@ -18774,7 +18769,7 @@ F_TRAINER_FEMALE | }, }, #line 7547 - [TRAINER_ALEX] = + [DIFFICULTY_NORMAL][TRAINER_ALEX] = { #line 7548 .trainerName = _("ALEX"), @@ -18817,7 +18812,7 @@ F_TRAINER_FEMALE | }, }, #line 7564 - [TRAINER_BECK] = + [DIFFICULTY_NORMAL][TRAINER_BECK] = { #line 7565 .trainerName = _("BECK"), @@ -18849,7 +18844,7 @@ F_TRAINER_FEMALE | }, }, #line 7577 - [TRAINER_YASU] = + [DIFFICULTY_NORMAL][TRAINER_YASU] = { #line 7578 .trainerName = _("YASU"), @@ -18881,7 +18876,7 @@ F_TRAINER_FEMALE | }, }, #line 7590 - [TRAINER_TAKASHI] = + [DIFFICULTY_NORMAL][TRAINER_TAKASHI] = { #line 7591 .trainerName = _("TAKASHI"), @@ -18924,7 +18919,7 @@ F_TRAINER_FEMALE | }, }, #line 7607 - [TRAINER_DIANNE] = + [DIFFICULTY_NORMAL][TRAINER_DIANNE] = { #line 7608 .trainerName = _("DIANNE"), @@ -18979,7 +18974,7 @@ F_TRAINER_FEMALE | }, }, #line 7628 - [TRAINER_JANI] = + [DIFFICULTY_NORMAL][TRAINER_JANI] = { #line 7629 .trainerName = _("JANI"), @@ -19011,7 +19006,7 @@ F_TRAINER_FEMALE | }, }, #line 7640 - [TRAINER_LAO_1] = + [DIFFICULTY_NORMAL][TRAINER_LAO_1] = { #line 7641 .trainerName = _("LAO"), @@ -19084,7 +19079,7 @@ F_TRAINER_FEMALE | }, }, #line 7672 - [TRAINER_LUNG] = + [DIFFICULTY_NORMAL][TRAINER_LUNG] = { #line 7673 .trainerName = _("LUNG"), @@ -19125,7 +19120,7 @@ F_TRAINER_FEMALE | }, }, #line 7688 - [TRAINER_LAO_2] = + [DIFFICULTY_NORMAL][TRAINER_LAO_2] = { #line 7689 .trainerName = _("LAO"), @@ -19213,7 +19208,7 @@ F_TRAINER_FEMALE | }, }, #line 7725 - [TRAINER_LAO_3] = + [DIFFICULTY_NORMAL][TRAINER_LAO_3] = { #line 7726 .trainerName = _("LAO"), @@ -19301,7 +19296,7 @@ F_TRAINER_FEMALE | }, }, #line 7762 - [TRAINER_LAO_4] = + [DIFFICULTY_NORMAL][TRAINER_LAO_4] = { #line 7763 .trainerName = _("LAO"), @@ -19387,7 +19382,7 @@ F_TRAINER_FEMALE | }, }, #line 7797 - [TRAINER_LAO_5] = + [DIFFICULTY_NORMAL][TRAINER_LAO_5] = { #line 7798 .trainerName = _("LAO"), @@ -19477,7 +19472,7 @@ F_TRAINER_FEMALE | }, }, #line 7834 - [TRAINER_JOCELYN] = + [DIFFICULTY_NORMAL][TRAINER_JOCELYN] = { #line 7835 .trainerName = _("JOCELYN"), @@ -19511,7 +19506,7 @@ F_TRAINER_FEMALE | }, }, #line 7847 - [TRAINER_LAURA] = + [DIFFICULTY_NORMAL][TRAINER_LAURA] = { #line 7848 .trainerName = _("LAURA"), @@ -19545,7 +19540,7 @@ F_TRAINER_FEMALE | }, }, #line 7860 - [TRAINER_CYNDY_1] = + [DIFFICULTY_NORMAL][TRAINER_CYNDY_1] = { #line 7861 .trainerName = _("CYNDY"), @@ -19590,7 +19585,7 @@ F_TRAINER_FEMALE | }, }, #line 7877 - [TRAINER_CORA] = + [DIFFICULTY_NORMAL][TRAINER_CORA] = { #line 7878 .trainerName = _("CORA"), @@ -19624,7 +19619,7 @@ F_TRAINER_FEMALE | }, }, #line 7890 - [TRAINER_PAULA] = + [DIFFICULTY_NORMAL][TRAINER_PAULA] = { #line 7891 .trainerName = _("PAULA"), @@ -19658,7 +19653,7 @@ F_TRAINER_FEMALE | }, }, #line 7903 - [TRAINER_CYNDY_2] = + [DIFFICULTY_NORMAL][TRAINER_CYNDY_2] = { #line 7904 .trainerName = _("CYNDY"), @@ -19703,7 +19698,7 @@ F_TRAINER_FEMALE | }, }, #line 7920 - [TRAINER_CYNDY_3] = + [DIFFICULTY_NORMAL][TRAINER_CYNDY_3] = { #line 7921 .trainerName = _("CYNDY"), @@ -19748,7 +19743,7 @@ F_TRAINER_FEMALE | }, }, #line 7937 - [TRAINER_CYNDY_4] = + [DIFFICULTY_NORMAL][TRAINER_CYNDY_4] = { #line 7938 .trainerName = _("CYNDY"), @@ -19793,7 +19788,7 @@ F_TRAINER_FEMALE | }, }, #line 7954 - [TRAINER_CYNDY_5] = + [DIFFICULTY_NORMAL][TRAINER_CYNDY_5] = { #line 7955 .trainerName = _("CYNDY"), @@ -19838,7 +19833,7 @@ F_TRAINER_FEMALE | }, }, #line 7971 - [TRAINER_MADELINE_1] = + [DIFFICULTY_NORMAL][TRAINER_MADELINE_1] = { #line 7972 .trainerName = _("MADELINE"), @@ -19879,7 +19874,7 @@ F_TRAINER_FEMALE | }, }, #line 7988 - [TRAINER_CLARISSA] = + [DIFFICULTY_NORMAL][TRAINER_CLARISSA] = { #line 7989 .trainerName = _("CLARISSA"), @@ -19924,7 +19919,7 @@ F_TRAINER_FEMALE | }, }, #line 8005 - [TRAINER_ANGELICA] = + [DIFFICULTY_NORMAL][TRAINER_ANGELICA] = { #line 8006 .trainerName = _("ANGELICA"), @@ -19965,7 +19960,7 @@ F_TRAINER_FEMALE | }, }, #line 8022 - [TRAINER_MADELINE_2] = + [DIFFICULTY_NORMAL][TRAINER_MADELINE_2] = { #line 8023 .trainerName = _("MADELINE"), @@ -20006,7 +20001,7 @@ F_TRAINER_FEMALE | }, }, #line 8039 - [TRAINER_MADELINE_3] = + [DIFFICULTY_NORMAL][TRAINER_MADELINE_3] = { #line 8040 .trainerName = _("MADELINE"), @@ -20047,7 +20042,7 @@ F_TRAINER_FEMALE | }, }, #line 8056 - [TRAINER_MADELINE_4] = + [DIFFICULTY_NORMAL][TRAINER_MADELINE_4] = { #line 8057 .trainerName = _("MADELINE"), @@ -20106,7 +20101,7 @@ F_TRAINER_FEMALE | }, }, #line 8081 - [TRAINER_MADELINE_5] = + [DIFFICULTY_NORMAL][TRAINER_MADELINE_5] = { #line 8082 .trainerName = _("MADELINE"), @@ -20165,7 +20160,7 @@ F_TRAINER_FEMALE | }, }, #line 8106 - [TRAINER_BEVERLY] = + [DIFFICULTY_NORMAL][TRAINER_BEVERLY] = { #line 8107 .trainerName = _("BEVERLY"), @@ -20210,7 +20205,7 @@ F_TRAINER_FEMALE | }, }, #line 8123 - [TRAINER_IMANI] = + [DIFFICULTY_NORMAL][TRAINER_IMANI] = { #line 8124 .trainerName = _("IMANI"), @@ -20244,7 +20239,7 @@ F_TRAINER_FEMALE | }, }, #line 8136 - [TRAINER_KYLA] = + [DIFFICULTY_NORMAL][TRAINER_KYLA] = { #line 8137 .trainerName = _("KYLA"), @@ -20278,7 +20273,7 @@ F_TRAINER_FEMALE | }, }, #line 8149 - [TRAINER_DENISE] = + [DIFFICULTY_NORMAL][TRAINER_DENISE] = { #line 8150 .trainerName = _("DENISE"), @@ -20323,7 +20318,7 @@ F_TRAINER_FEMALE | }, }, #line 8166 - [TRAINER_BETH] = + [DIFFICULTY_NORMAL][TRAINER_BETH] = { #line 8167 .trainerName = _("BETH"), @@ -20357,7 +20352,7 @@ F_TRAINER_FEMALE | }, }, #line 8179 - [TRAINER_TARA] = + [DIFFICULTY_NORMAL][TRAINER_TARA] = { #line 8180 .trainerName = _("TARA"), @@ -20402,7 +20397,7 @@ F_TRAINER_FEMALE | }, }, #line 8196 - [TRAINER_MISSY] = + [DIFFICULTY_NORMAL][TRAINER_MISSY] = { #line 8197 .trainerName = _("MISSY"), @@ -20436,7 +20431,7 @@ F_TRAINER_FEMALE | }, }, #line 8209 - [TRAINER_ALICE] = + [DIFFICULTY_NORMAL][TRAINER_ALICE] = { #line 8210 .trainerName = _("ALICE"), @@ -20492,7 +20487,7 @@ F_TRAINER_FEMALE | }, }, #line 8230 - [TRAINER_JENNY_1] = + [DIFFICULTY_NORMAL][TRAINER_JENNY_1] = { #line 8231 .trainerName = _("JENNY"), @@ -20526,7 +20521,7 @@ F_TRAINER_FEMALE | }, }, #line 8243 - [TRAINER_GRACE] = + [DIFFICULTY_NORMAL][TRAINER_GRACE] = { #line 8244 .trainerName = _("GRACE"), @@ -20560,7 +20555,7 @@ F_TRAINER_FEMALE | }, }, #line 8256 - [TRAINER_TANYA] = + [DIFFICULTY_NORMAL][TRAINER_TANYA] = { #line 8257 .trainerName = _("TANYA"), @@ -20594,7 +20589,7 @@ F_TRAINER_FEMALE | }, }, #line 8269 - [TRAINER_SHARON] = + [DIFFICULTY_NORMAL][TRAINER_SHARON] = { #line 8270 .trainerName = _("SHARON"), @@ -20628,7 +20623,7 @@ F_TRAINER_FEMALE | }, }, #line 8282 - [TRAINER_NIKKI] = + [DIFFICULTY_NORMAL][TRAINER_NIKKI] = { #line 8283 .trainerName = _("NIKKI"), @@ -20673,7 +20668,7 @@ F_TRAINER_FEMALE | }, }, #line 8299 - [TRAINER_BRENDA] = + [DIFFICULTY_NORMAL][TRAINER_BRENDA] = { #line 8300 .trainerName = _("BRENDA"), @@ -20707,7 +20702,7 @@ F_TRAINER_FEMALE | }, }, #line 8312 - [TRAINER_KATIE] = + [DIFFICULTY_NORMAL][TRAINER_KATIE] = { #line 8313 .trainerName = _("KATIE"), @@ -20752,7 +20747,7 @@ F_TRAINER_FEMALE | }, }, #line 8329 - [TRAINER_SUSIE] = + [DIFFICULTY_NORMAL][TRAINER_SUSIE] = { #line 8330 .trainerName = _("SUSIE"), @@ -20786,7 +20781,7 @@ F_TRAINER_FEMALE | }, }, #line 8342 - [TRAINER_KARA] = + [DIFFICULTY_NORMAL][TRAINER_KARA] = { #line 8343 .trainerName = _("KARA"), @@ -20820,7 +20815,7 @@ F_TRAINER_FEMALE | }, }, #line 8355 - [TRAINER_DANA] = + [DIFFICULTY_NORMAL][TRAINER_DANA] = { #line 8356 .trainerName = _("DANA"), @@ -20854,7 +20849,7 @@ F_TRAINER_FEMALE | }, }, #line 8368 - [TRAINER_SIENNA] = + [DIFFICULTY_NORMAL][TRAINER_SIENNA] = { #line 8369 .trainerName = _("SIENNA"), @@ -20899,7 +20894,7 @@ F_TRAINER_FEMALE | }, }, #line 8385 - [TRAINER_DEBRA] = + [DIFFICULTY_NORMAL][TRAINER_DEBRA] = { #line 8386 .trainerName = _("DEBRA"), @@ -20933,7 +20928,7 @@ F_TRAINER_FEMALE | }, }, #line 8398 - [TRAINER_LINDA] = + [DIFFICULTY_NORMAL][TRAINER_LINDA] = { #line 8399 .trainerName = _("LINDA"), @@ -20978,7 +20973,7 @@ F_TRAINER_FEMALE | }, }, #line 8415 - [TRAINER_KAYLEE] = + [DIFFICULTY_NORMAL][TRAINER_KAYLEE] = { #line 8416 .trainerName = _("KAYLEE"), @@ -21023,7 +21018,7 @@ F_TRAINER_FEMALE | }, }, #line 8432 - [TRAINER_LAUREL] = + [DIFFICULTY_NORMAL][TRAINER_LAUREL] = { #line 8433 .trainerName = _("LAUREL"), @@ -21068,7 +21063,7 @@ F_TRAINER_FEMALE | }, }, #line 8449 - [TRAINER_CARLEE] = + [DIFFICULTY_NORMAL][TRAINER_CARLEE] = { #line 8450 .trainerName = _("CARLEE"), @@ -21102,7 +21097,7 @@ F_TRAINER_FEMALE | }, }, #line 8462 - [TRAINER_JENNY_2] = + [DIFFICULTY_NORMAL][TRAINER_JENNY_2] = { #line 8463 .trainerName = _("JENNY"), @@ -21136,7 +21131,7 @@ F_TRAINER_FEMALE | }, }, #line 8475 - [TRAINER_JENNY_3] = + [DIFFICULTY_NORMAL][TRAINER_JENNY_3] = { #line 8476 .trainerName = _("JENNY"), @@ -21170,7 +21165,7 @@ F_TRAINER_FEMALE | }, }, #line 8488 - [TRAINER_JENNY_4] = + [DIFFICULTY_NORMAL][TRAINER_JENNY_4] = { #line 8489 .trainerName = _("JENNY"), @@ -21215,7 +21210,7 @@ F_TRAINER_FEMALE | }, }, #line 8505 - [TRAINER_JENNY_5] = + [DIFFICULTY_NORMAL][TRAINER_JENNY_5] = { #line 8506 .trainerName = _("JENNY"), @@ -21271,7 +21266,7 @@ F_TRAINER_FEMALE | }, }, #line 8526 - [TRAINER_HEIDI] = + [DIFFICULTY_NORMAL][TRAINER_HEIDI] = { #line 8527 .trainerName = _("HEIDI"), @@ -21330,7 +21325,7 @@ F_TRAINER_FEMALE | }, }, #line 8551 - [TRAINER_BECKY] = + [DIFFICULTY_NORMAL][TRAINER_BECKY] = { #line 8552 .trainerName = _("BECKY"), @@ -21389,7 +21384,7 @@ F_TRAINER_FEMALE | }, }, #line 8576 - [TRAINER_CAROL] = + [DIFFICULTY_NORMAL][TRAINER_CAROL] = { #line 8577 .trainerName = _("CAROL"), @@ -21434,7 +21429,7 @@ F_TRAINER_FEMALE | }, }, #line 8593 - [TRAINER_NANCY] = + [DIFFICULTY_NORMAL][TRAINER_NANCY] = { #line 8594 .trainerName = _("NANCY"), @@ -21479,7 +21474,7 @@ F_TRAINER_FEMALE | }, }, #line 8610 - [TRAINER_MARTHA] = + [DIFFICULTY_NORMAL][TRAINER_MARTHA] = { #line 8611 .trainerName = _("MARTHA"), @@ -21524,7 +21519,7 @@ F_TRAINER_FEMALE | }, }, #line 8627 - [TRAINER_DIANA_1] = + [DIFFICULTY_NORMAL][TRAINER_DIANA_1] = { #line 8628 .trainerName = _("DIANA"), @@ -21580,7 +21575,7 @@ F_TRAINER_FEMALE | }, }, #line 8648 - [TRAINER_CEDRIC] = + [DIFFICULTY_NORMAL][TRAINER_CEDRIC] = { #line 8649 .trainerName = _("CEDRIC"), @@ -21619,7 +21614,7 @@ F_TRAINER_FEMALE | }, }, #line 8665 - [TRAINER_IRENE] = + [DIFFICULTY_NORMAL][TRAINER_IRENE] = { #line 8666 .trainerName = _("IRENE"), @@ -21664,7 +21659,7 @@ F_TRAINER_FEMALE | }, }, #line 8682 - [TRAINER_DIANA_2] = + [DIFFICULTY_NORMAL][TRAINER_DIANA_2] = { #line 8683 .trainerName = _("DIANA"), @@ -21720,7 +21715,7 @@ F_TRAINER_FEMALE | }, }, #line 8703 - [TRAINER_DIANA_3] = + [DIFFICULTY_NORMAL][TRAINER_DIANA_3] = { #line 8704 .trainerName = _("DIANA"), @@ -21776,7 +21771,7 @@ F_TRAINER_FEMALE | }, }, #line 8724 - [TRAINER_DIANA_4] = + [DIFFICULTY_NORMAL][TRAINER_DIANA_4] = { #line 8725 .trainerName = _("DIANA"), @@ -21832,7 +21827,7 @@ F_TRAINER_FEMALE | }, }, #line 8745 - [TRAINER_DIANA_5] = + [DIFFICULTY_NORMAL][TRAINER_DIANA_5] = { #line 8746 .trainerName = _("DIANA"), @@ -21888,7 +21883,7 @@ F_TRAINER_FEMALE | }, }, #line 8766 - [TRAINER_AMY_AND_LIV_1] = + [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_1] = { #line 8767 .trainerName = _("AMY & LIV"), @@ -21931,7 +21926,7 @@ F_TRAINER_FEMALE | }, }, #line 8783 - [TRAINER_AMY_AND_LIV_2] = + [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_2] = { #line 8784 .trainerName = _("AMY & LIV"), @@ -21974,7 +21969,7 @@ F_TRAINER_FEMALE | }, }, #line 8800 - [TRAINER_GINA_AND_MIA_1] = + [DIFFICULTY_NORMAL][TRAINER_GINA_AND_MIA_1] = { #line 8801 .trainerName = _("GINA & MIA"), @@ -22017,7 +22012,7 @@ F_TRAINER_FEMALE | }, }, #line 8817 - [TRAINER_MIU_AND_YUKI] = + [DIFFICULTY_NORMAL][TRAINER_MIU_AND_YUKI] = { #line 8818 .trainerName = _("MIU & YUKI"), @@ -22060,7 +22055,7 @@ F_TRAINER_FEMALE | }, }, #line 8834 - [TRAINER_AMY_AND_LIV_3] = + [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_3] = { #line 8835 .trainerName = _("AMY & LIV"), @@ -22103,7 +22098,7 @@ F_TRAINER_FEMALE | }, }, #line 8851 - [TRAINER_GINA_AND_MIA_2] = + [DIFFICULTY_NORMAL][TRAINER_GINA_AND_MIA_2] = { #line 8852 .trainerName = _("GINA & MIA"), @@ -22156,7 +22151,7 @@ F_TRAINER_FEMALE | }, }, #line 8872 - [TRAINER_AMY_AND_LIV_4] = + [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_4] = { #line 8873 .trainerName = _("AMY & LIV"), @@ -22199,7 +22194,7 @@ F_TRAINER_FEMALE | }, }, #line 8889 - [TRAINER_AMY_AND_LIV_5] = + [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_5] = { #line 8890 .trainerName = _("AMY & LIV"), @@ -22256,7 +22251,7 @@ F_TRAINER_FEMALE | }, }, #line 8914 - [TRAINER_AMY_AND_LIV_6] = + [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_6] = { #line 8915 .trainerName = _("AMY & LIV"), @@ -22313,7 +22308,7 @@ F_TRAINER_FEMALE | }, }, #line 8939 - [TRAINER_HUEY] = + [DIFFICULTY_NORMAL][TRAINER_HUEY] = { #line 8940 .trainerName = _("HUEY"), @@ -22356,7 +22351,7 @@ F_TRAINER_FEMALE | }, }, #line 8956 - [TRAINER_EDMOND] = + [DIFFICULTY_NORMAL][TRAINER_EDMOND] = { #line 8957 .trainerName = _("EDMOND"), @@ -22388,7 +22383,7 @@ F_TRAINER_FEMALE | }, }, #line 8969 - [TRAINER_ERNEST_1] = + [DIFFICULTY_NORMAL][TRAINER_ERNEST_1] = { #line 8970 .trainerName = _("ERNEST"), @@ -22431,7 +22426,7 @@ F_TRAINER_FEMALE | }, }, #line 8986 - [TRAINER_DWAYNE] = + [DIFFICULTY_NORMAL][TRAINER_DWAYNE] = { #line 8987 .trainerName = _("DWAYNE"), @@ -22485,7 +22480,7 @@ F_TRAINER_FEMALE | }, }, #line 9007 - [TRAINER_PHILLIP] = + [DIFFICULTY_NORMAL][TRAINER_PHILLIP] = { #line 9008 .trainerName = _("PHILLIP"), @@ -22528,7 +22523,7 @@ F_TRAINER_FEMALE | }, }, #line 9024 - [TRAINER_LEONARD] = + [DIFFICULTY_NORMAL][TRAINER_LEONARD] = { #line 9025 .trainerName = _("LEONARD"), @@ -22582,7 +22577,7 @@ F_TRAINER_FEMALE | }, }, #line 9045 - [TRAINER_DUNCAN] = + [DIFFICULTY_NORMAL][TRAINER_DUNCAN] = { #line 9046 .trainerName = _("DUNCAN"), @@ -22625,7 +22620,7 @@ F_TRAINER_FEMALE | }, }, #line 9062 - [TRAINER_ERNEST_2] = + [DIFFICULTY_NORMAL][TRAINER_ERNEST_2] = { #line 9063 .trainerName = _("ERNEST"), @@ -22679,7 +22674,7 @@ F_TRAINER_FEMALE | }, }, #line 9083 - [TRAINER_ERNEST_3] = + [DIFFICULTY_NORMAL][TRAINER_ERNEST_3] = { #line 9084 .trainerName = _("ERNEST"), @@ -22733,7 +22728,7 @@ F_TRAINER_FEMALE | }, }, #line 9104 - [TRAINER_ERNEST_4] = + [DIFFICULTY_NORMAL][TRAINER_ERNEST_4] = { #line 9105 .trainerName = _("ERNEST"), @@ -22787,7 +22782,7 @@ F_TRAINER_FEMALE | }, }, #line 9125 - [TRAINER_ERNEST_5] = + [DIFFICULTY_NORMAL][TRAINER_ERNEST_5] = { #line 9126 .trainerName = _("ERNEST"), @@ -22841,7 +22836,7 @@ F_TRAINER_FEMALE | }, }, #line 9146 - [TRAINER_ELI] = + [DIFFICULTY_NORMAL][TRAINER_ELI] = { #line 9147 .trainerName = _("ELI"), @@ -22873,7 +22868,7 @@ F_TRAINER_FEMALE | }, }, #line 9159 - [TRAINER_ANNIKA] = + [DIFFICULTY_NORMAL][TRAINER_ANNIKA] = { #line 9160 .trainerName = _("ANNIKA"), @@ -22936,7 +22931,7 @@ F_TRAINER_FEMALE | }, }, #line 9184 - [TRAINER_JAZMYN] = + [DIFFICULTY_NORMAL][TRAINER_JAZMYN] = { #line 9185 .trainerName = _("JAZMYN"), @@ -22972,7 +22967,7 @@ F_TRAINER_FEMALE | }, }, #line 9198 - [TRAINER_JONAS] = + [DIFFICULTY_NORMAL][TRAINER_JONAS] = { #line 9199 .trainerName = _("JONAS"), @@ -23011,7 +23006,7 @@ F_TRAINER_FEMALE | }, }, #line 9215 - [TRAINER_KAYLEY] = + [DIFFICULTY_NORMAL][TRAINER_KAYLEY] = { #line 9216 .trainerName = _("KAYLEY"), @@ -23052,7 +23047,7 @@ F_TRAINER_FEMALE | }, }, #line 9232 - [TRAINER_AURON] = + [DIFFICULTY_NORMAL][TRAINER_AURON] = { #line 9233 .trainerName = _("AURON"), @@ -23095,7 +23090,7 @@ F_TRAINER_FEMALE | }, }, #line 9249 - [TRAINER_KELVIN] = + [DIFFICULTY_NORMAL][TRAINER_KELVIN] = { #line 9250 .trainerName = _("KELVIN"), @@ -23138,7 +23133,7 @@ F_TRAINER_FEMALE | }, }, #line 9266 - [TRAINER_MARLEY] = + [DIFFICULTY_NORMAL][TRAINER_MARLEY] = { #line 9267 .trainerName = _("MARLEY"), @@ -23181,7 +23176,7 @@ F_TRAINER_FEMALE | }, }, #line 9284 - [TRAINER_REYNA] = + [DIFFICULTY_NORMAL][TRAINER_REYNA] = { #line 9285 .trainerName = _("REYNA"), @@ -23226,7 +23221,7 @@ F_TRAINER_FEMALE | }, }, #line 9301 - [TRAINER_HUDSON] = + [DIFFICULTY_NORMAL][TRAINER_HUDSON] = { #line 9302 .trainerName = _("HUDSON"), @@ -23258,7 +23253,7 @@ F_TRAINER_FEMALE | }, }, #line 9314 - [TRAINER_CONOR] = + [DIFFICULTY_NORMAL][TRAINER_CONOR] = { #line 9315 .trainerName = _("CONOR"), @@ -23301,7 +23296,7 @@ F_TRAINER_FEMALE | }, }, #line 9331 - [TRAINER_EDWIN_1] = + [DIFFICULTY_NORMAL][TRAINER_EDWIN_1] = { #line 9332 .trainerName = _("EDWIN"), @@ -23344,7 +23339,7 @@ F_TRAINER_FEMALE | }, }, #line 9348 - [TRAINER_HECTOR] = + [DIFFICULTY_NORMAL][TRAINER_HECTOR] = { #line 9349 .trainerName = _("HECTOR"), @@ -23387,7 +23382,7 @@ F_TRAINER_FEMALE | }, }, #line 9365 - [TRAINER_TABITHA_MOSSDEEP] = + [DIFFICULTY_NORMAL][TRAINER_TABITHA_MOSSDEEP] = { #line 9366 .trainerName = _("TABITHA"), @@ -23441,7 +23436,7 @@ F_TRAINER_FEMALE | }, }, #line 9386 - [TRAINER_EDWIN_2] = + [DIFFICULTY_NORMAL][TRAINER_EDWIN_2] = { #line 9387 .trainerName = _("EDWIN"), @@ -23484,7 +23479,7 @@ F_TRAINER_FEMALE | }, }, #line 9403 - [TRAINER_EDWIN_3] = + [DIFFICULTY_NORMAL][TRAINER_EDWIN_3] = { #line 9404 .trainerName = _("EDWIN"), @@ -23527,7 +23522,7 @@ F_TRAINER_FEMALE | }, }, #line 9420 - [TRAINER_EDWIN_4] = + [DIFFICULTY_NORMAL][TRAINER_EDWIN_4] = { #line 9421 .trainerName = _("EDWIN"), @@ -23570,7 +23565,7 @@ F_TRAINER_FEMALE | }, }, #line 9437 - [TRAINER_EDWIN_5] = + [DIFFICULTY_NORMAL][TRAINER_EDWIN_5] = { #line 9438 .trainerName = _("EDWIN"), @@ -23613,7 +23608,7 @@ F_TRAINER_FEMALE | }, }, #line 9454 - [TRAINER_WALLY_VR_1] = + [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_1] = { #line 9455 .trainerName = _("WALLY"), @@ -23726,7 +23721,7 @@ F_TRAINER_FEMALE | }, }, #line 9504 - [TRAINER_BRENDAN_ROUTE_103_MUDKIP] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_103_MUDKIP] = { #line 9505 .trainerName = _("BRENDAN"), @@ -23758,7 +23753,7 @@ F_TRAINER_FEMALE | }, }, #line 9517 - [TRAINER_BRENDAN_ROUTE_110_MUDKIP] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_110_MUDKIP] = { #line 9518 .trainerName = _("BRENDAN"), @@ -23812,7 +23807,7 @@ F_TRAINER_FEMALE | }, }, #line 9538 - [TRAINER_BRENDAN_ROUTE_119_MUDKIP] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_119_MUDKIP] = { #line 9539 .trainerName = _("BRENDAN"), @@ -23866,7 +23861,7 @@ F_TRAINER_FEMALE | }, }, #line 9559 - [TRAINER_BRENDAN_ROUTE_103_TREECKO] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_103_TREECKO] = { #line 9560 .trainerName = _("BRENDAN"), @@ -23898,7 +23893,7 @@ F_TRAINER_FEMALE | }, }, #line 9572 - [TRAINER_BRENDAN_ROUTE_110_TREECKO] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_110_TREECKO] = { #line 9573 .trainerName = _("BRENDAN"), @@ -23952,7 +23947,7 @@ F_TRAINER_FEMALE | }, }, #line 9593 - [TRAINER_BRENDAN_ROUTE_119_TREECKO] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_119_TREECKO] = { #line 9594 .trainerName = _("BRENDAN"), @@ -24006,7 +24001,7 @@ F_TRAINER_FEMALE | }, }, #line 9614 - [TRAINER_BRENDAN_ROUTE_103_TORCHIC] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_103_TORCHIC] = { #line 9615 .trainerName = _("BRENDAN"), @@ -24038,7 +24033,7 @@ F_TRAINER_FEMALE | }, }, #line 9627 - [TRAINER_BRENDAN_ROUTE_110_TORCHIC] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_110_TORCHIC] = { #line 9628 .trainerName = _("BRENDAN"), @@ -24092,7 +24087,7 @@ F_TRAINER_FEMALE | }, }, #line 9648 - [TRAINER_BRENDAN_ROUTE_119_TORCHIC] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_119_TORCHIC] = { #line 9649 .trainerName = _("BRENDAN"), @@ -24146,7 +24141,7 @@ F_TRAINER_FEMALE | }, }, #line 9669 - [TRAINER_MAY_ROUTE_103_MUDKIP] = + [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_103_MUDKIP] = { #line 9670 .trainerName = _("MAY"), @@ -24180,7 +24175,7 @@ F_TRAINER_FEMALE | }, }, #line 9682 - [TRAINER_MAY_ROUTE_110_MUDKIP] = + [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_110_MUDKIP] = { #line 9683 .trainerName = _("MAY"), @@ -24236,7 +24231,7 @@ F_TRAINER_FEMALE | }, }, #line 9703 - [TRAINER_MAY_ROUTE_119_MUDKIP] = + [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_119_MUDKIP] = { #line 9704 .trainerName = _("MAY"), @@ -24292,7 +24287,7 @@ F_TRAINER_FEMALE | }, }, #line 9724 - [TRAINER_MAY_ROUTE_103_TREECKO] = + [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_103_TREECKO] = { #line 9725 .trainerName = _("MAY"), @@ -24326,7 +24321,7 @@ F_TRAINER_FEMALE | }, }, #line 9737 - [TRAINER_MAY_ROUTE_110_TREECKO] = + [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_110_TREECKO] = { #line 9738 .trainerName = _("MAY"), @@ -24382,7 +24377,7 @@ F_TRAINER_FEMALE | }, }, #line 9758 - [TRAINER_MAY_ROUTE_119_TREECKO] = + [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_119_TREECKO] = { #line 9759 .trainerName = _("MAY"), @@ -24438,7 +24433,7 @@ F_TRAINER_FEMALE | }, }, #line 9779 - [TRAINER_MAY_ROUTE_103_TORCHIC] = + [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_103_TORCHIC] = { #line 9780 .trainerName = _("MAY"), @@ -24472,7 +24467,7 @@ F_TRAINER_FEMALE | }, }, #line 9792 - [TRAINER_MAY_ROUTE_110_TORCHIC] = + [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_110_TORCHIC] = { #line 9793 .trainerName = _("MAY"), @@ -24528,7 +24523,7 @@ F_TRAINER_FEMALE | }, }, #line 9813 - [TRAINER_MAY_ROUTE_119_TORCHIC] = + [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_119_TORCHIC] = { #line 9814 .trainerName = _("MAY"), @@ -24584,7 +24579,7 @@ F_TRAINER_FEMALE | }, }, #line 9834 - [TRAINER_ISAAC_1] = + [DIFFICULTY_NORMAL][TRAINER_ISAAC_1] = { #line 9835 .trainerName = _("ISAAC"), @@ -24671,7 +24666,7 @@ F_TRAINER_FEMALE | }, }, #line 9867 - [TRAINER_DAVIS] = + [DIFFICULTY_NORMAL][TRAINER_DAVIS] = { #line 9868 .trainerName = _("DAVIS"), @@ -24703,7 +24698,7 @@ F_TRAINER_FEMALE | }, }, #line 9880 - [TRAINER_MITCHELL] = + [DIFFICULTY_NORMAL][TRAINER_MITCHELL] = { #line 9881 .trainerName = _("MITCHELL"), @@ -24760,7 +24755,7 @@ F_TRAINER_FEMALE | }, }, #line 9905 - [TRAINER_ISAAC_2] = + [DIFFICULTY_NORMAL][TRAINER_ISAAC_2] = { #line 9906 .trainerName = _("ISAAC"), @@ -24847,7 +24842,7 @@ F_TRAINER_FEMALE | }, }, #line 9938 - [TRAINER_ISAAC_3] = + [DIFFICULTY_NORMAL][TRAINER_ISAAC_3] = { #line 9939 .trainerName = _("ISAAC"), @@ -24934,7 +24929,7 @@ F_TRAINER_FEMALE | }, }, #line 9971 - [TRAINER_ISAAC_4] = + [DIFFICULTY_NORMAL][TRAINER_ISAAC_4] = { #line 9972 .trainerName = _("ISAAC"), @@ -25021,7 +25016,7 @@ F_TRAINER_FEMALE | }, }, #line 10004 - [TRAINER_ISAAC_5] = + [DIFFICULTY_NORMAL][TRAINER_ISAAC_5] = { #line 10005 .trainerName = _("ISAAC"), @@ -25108,7 +25103,7 @@ F_TRAINER_FEMALE | }, }, #line 10037 - [TRAINER_LYDIA_1] = + [DIFFICULTY_NORMAL][TRAINER_LYDIA_1] = { #line 10038 .trainerName = _("LYDIA"), @@ -25197,7 +25192,7 @@ F_TRAINER_FEMALE | }, }, #line 10070 - [TRAINER_HALLE] = + [DIFFICULTY_NORMAL][TRAINER_HALLE] = { #line 10071 .trainerName = _("HALLE"), @@ -25244,7 +25239,7 @@ F_TRAINER_FEMALE | }, }, #line 10088 - [TRAINER_GARRISON] = + [DIFFICULTY_NORMAL][TRAINER_GARRISON] = { #line 10089 .trainerName = _("GARRISON"), @@ -25276,7 +25271,7 @@ F_TRAINER_FEMALE | }, }, #line 10101 - [TRAINER_LYDIA_2] = + [DIFFICULTY_NORMAL][TRAINER_LYDIA_2] = { #line 10102 .trainerName = _("LYDIA"), @@ -25365,7 +25360,7 @@ F_TRAINER_FEMALE | }, }, #line 10134 - [TRAINER_LYDIA_3] = + [DIFFICULTY_NORMAL][TRAINER_LYDIA_3] = { #line 10135 .trainerName = _("LYDIA"), @@ -25454,7 +25449,7 @@ F_TRAINER_FEMALE | }, }, #line 10167 - [TRAINER_LYDIA_4] = + [DIFFICULTY_NORMAL][TRAINER_LYDIA_4] = { #line 10168 .trainerName = _("LYDIA"), @@ -25543,7 +25538,7 @@ F_TRAINER_FEMALE | }, }, #line 10200 - [TRAINER_LYDIA_5] = + [DIFFICULTY_NORMAL][TRAINER_LYDIA_5] = { #line 10201 .trainerName = _("LYDIA"), @@ -25632,7 +25627,7 @@ F_TRAINER_FEMALE | }, }, #line 10233 - [TRAINER_JACKSON_1] = + [DIFFICULTY_NORMAL][TRAINER_JACKSON_1] = { #line 10234 .trainerName = _("JACKSON"), @@ -25666,7 +25661,7 @@ F_TRAINER_FEMALE | }, }, #line 10247 - [TRAINER_LORENZO] = + [DIFFICULTY_NORMAL][TRAINER_LORENZO] = { #line 10248 .trainerName = _("LORENZO"), @@ -25722,7 +25717,7 @@ F_TRAINER_FEMALE | }, }, #line 10269 - [TRAINER_SEBASTIAN] = + [DIFFICULTY_NORMAL][TRAINER_SEBASTIAN] = { #line 10270 .trainerName = _("SEBASTIAN"), @@ -25756,7 +25751,7 @@ F_TRAINER_FEMALE | }, }, #line 10283 - [TRAINER_JACKSON_2] = + [DIFFICULTY_NORMAL][TRAINER_JACKSON_2] = { #line 10284 .trainerName = _("JACKSON"), @@ -25790,7 +25785,7 @@ F_TRAINER_FEMALE | }, }, #line 10297 - [TRAINER_JACKSON_3] = + [DIFFICULTY_NORMAL][TRAINER_JACKSON_3] = { #line 10298 .trainerName = _("JACKSON"), @@ -25824,7 +25819,7 @@ F_TRAINER_FEMALE | }, }, #line 10311 - [TRAINER_JACKSON_4] = + [DIFFICULTY_NORMAL][TRAINER_JACKSON_4] = { #line 10312 .trainerName = _("JACKSON"), @@ -25858,7 +25853,7 @@ F_TRAINER_FEMALE | }, }, #line 10325 - [TRAINER_JACKSON_5] = + [DIFFICULTY_NORMAL][TRAINER_JACKSON_5] = { #line 10326 .trainerName = _("JACKSON"), @@ -25903,7 +25898,7 @@ F_TRAINER_FEMALE | }, }, #line 10343 - [TRAINER_CATHERINE_1] = + [DIFFICULTY_NORMAL][TRAINER_CATHERINE_1] = { #line 10344 .trainerName = _("CATHERINE"), @@ -25950,7 +25945,7 @@ F_TRAINER_FEMALE | }, }, #line 10361 - [TRAINER_JENNA] = + [DIFFICULTY_NORMAL][TRAINER_JENNA] = { #line 10362 .trainerName = _("JENNA"), @@ -26008,7 +26003,7 @@ F_TRAINER_FEMALE | }, }, #line 10383 - [TRAINER_SOPHIA] = + [DIFFICULTY_NORMAL][TRAINER_SOPHIA] = { #line 10384 .trainerName = _("SOPHIA"), @@ -26055,7 +26050,7 @@ F_TRAINER_FEMALE | }, }, #line 10401 - [TRAINER_CATHERINE_2] = + [DIFFICULTY_NORMAL][TRAINER_CATHERINE_2] = { #line 10402 .trainerName = _("CATHERINE"), @@ -26102,7 +26097,7 @@ F_TRAINER_FEMALE | }, }, #line 10419 - [TRAINER_CATHERINE_3] = + [DIFFICULTY_NORMAL][TRAINER_CATHERINE_3] = { #line 10420 .trainerName = _("CATHERINE"), @@ -26149,7 +26144,7 @@ F_TRAINER_FEMALE | }, }, #line 10437 - [TRAINER_CATHERINE_4] = + [DIFFICULTY_NORMAL][TRAINER_CATHERINE_4] = { #line 10438 .trainerName = _("CATHERINE"), @@ -26196,7 +26191,7 @@ F_TRAINER_FEMALE | }, }, #line 10455 - [TRAINER_CATHERINE_5] = + [DIFFICULTY_NORMAL][TRAINER_CATHERINE_5] = { #line 10456 .trainerName = _("CATHERINE"), @@ -26243,7 +26238,7 @@ F_TRAINER_FEMALE | }, }, #line 10473 - [TRAINER_JULIO] = + [DIFFICULTY_NORMAL][TRAINER_JULIO] = { #line 10474 .trainerName = _("JULIO"), @@ -26275,7 +26270,7 @@ F_TRAINER_FEMALE | }, }, #line 10486 - [TRAINER_GRUNT_SEAFLOOR_CAVERN_5] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_5] = { #line 10487 .trainerName = _("GRUNT"), @@ -26318,7 +26313,7 @@ F_TRAINER_FEMALE | }, }, #line 10503 - [TRAINER_GRUNT_UNUSED] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_UNUSED] = { #line 10504 .trainerName = _("GRUNT"), @@ -26363,7 +26358,7 @@ F_TRAINER_FEMALE | }, }, #line 10520 - [TRAINER_GRUNT_MT_PYRE_4] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_4] = { #line 10521 .trainerName = _("GRUNT"), @@ -26408,7 +26403,7 @@ F_TRAINER_FEMALE | }, }, #line 10537 - [TRAINER_GRUNT_JAGGED_PASS] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_JAGGED_PASS] = { #line 10538 .trainerName = _("GRUNT"), @@ -26451,7 +26446,7 @@ F_TRAINER_FEMALE | }, }, #line 10554 - [TRAINER_MARC] = + [DIFFICULTY_NORMAL][TRAINER_MARC] = { #line 10555 .trainerName = _("MARC"), @@ -26494,7 +26489,7 @@ F_TRAINER_FEMALE | }, }, #line 10571 - [TRAINER_BRENDEN] = + [DIFFICULTY_NORMAL][TRAINER_BRENDEN] = { #line 10572 .trainerName = _("BRENDEN"), @@ -26526,7 +26521,7 @@ F_TRAINER_FEMALE | }, }, #line 10584 - [TRAINER_LILITH] = + [DIFFICULTY_NORMAL][TRAINER_LILITH] = { #line 10585 .trainerName = _("LILITH"), @@ -26560,7 +26555,7 @@ F_TRAINER_FEMALE | }, }, #line 10597 - [TRAINER_CRISTIAN] = + [DIFFICULTY_NORMAL][TRAINER_CRISTIAN] = { #line 10598 .trainerName = _("CRISTIAN"), @@ -26592,7 +26587,7 @@ F_TRAINER_FEMALE | }, }, #line 10610 - [TRAINER_SYLVIA] = + [DIFFICULTY_NORMAL][TRAINER_SYLVIA] = { #line 10611 .trainerName = _("SYLVIA"), @@ -26626,7 +26621,7 @@ F_TRAINER_FEMALE | }, }, #line 10623 - [TRAINER_LEONARDO] = + [DIFFICULTY_NORMAL][TRAINER_LEONARDO] = { #line 10624 .trainerName = _("LEONARDO"), @@ -26658,7 +26653,7 @@ F_TRAINER_FEMALE | }, }, #line 10636 - [TRAINER_ATHENA] = + [DIFFICULTY_NORMAL][TRAINER_ATHENA] = { #line 10637 .trainerName = _("ATHENA"), @@ -26716,7 +26711,7 @@ F_TRAINER_FEMALE | }, }, #line 10659 - [TRAINER_HARRISON] = + [DIFFICULTY_NORMAL][TRAINER_HARRISON] = { #line 10660 .trainerName = _("HARRISON"), @@ -26748,7 +26743,7 @@ F_TRAINER_FEMALE | }, }, #line 10672 - [TRAINER_GRUNT_MT_CHIMNEY_2] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_CHIMNEY_2] = { #line 10673 .trainerName = _("GRUNT"), @@ -26780,7 +26775,7 @@ F_TRAINER_FEMALE | }, }, #line 10685 - [TRAINER_CLARENCE] = + [DIFFICULTY_NORMAL][TRAINER_CLARENCE] = { #line 10686 .trainerName = _("CLARENCE"), @@ -26812,7 +26807,7 @@ F_TRAINER_FEMALE | }, }, #line 10698 - [TRAINER_TERRY] = + [DIFFICULTY_NORMAL][TRAINER_TERRY] = { #line 10699 .trainerName = _("TERRY"), @@ -26846,7 +26841,7 @@ F_TRAINER_FEMALE | }, }, #line 10711 - [TRAINER_NATE] = + [DIFFICULTY_NORMAL][TRAINER_NATE] = { #line 10712 .trainerName = _("NATE"), @@ -26878,7 +26873,7 @@ F_TRAINER_FEMALE | }, }, #line 10724 - [TRAINER_KATHLEEN] = + [DIFFICULTY_NORMAL][TRAINER_KATHLEEN] = { #line 10725 .trainerName = _("KATHLEEN"), @@ -26912,7 +26907,7 @@ F_TRAINER_FEMALE | }, }, #line 10737 - [TRAINER_CLIFFORD] = + [DIFFICULTY_NORMAL][TRAINER_CLIFFORD] = { #line 10738 .trainerName = _("CLIFFORD"), @@ -26944,7 +26939,7 @@ F_TRAINER_FEMALE | }, }, #line 10750 - [TRAINER_NICHOLAS] = + [DIFFICULTY_NORMAL][TRAINER_NICHOLAS] = { #line 10751 .trainerName = _("NICHOLAS"), @@ -26976,7 +26971,7 @@ F_TRAINER_FEMALE | }, }, #line 10763 - [TRAINER_GRUNT_SPACE_CENTER_3] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_3] = { #line 10764 .trainerName = _("GRUNT"), @@ -27021,7 +27016,7 @@ F_TRAINER_FEMALE | }, }, #line 10780 - [TRAINER_GRUNT_SPACE_CENTER_4] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_4] = { #line 10781 .trainerName = _("GRUNT"), @@ -27053,7 +27048,7 @@ F_TRAINER_FEMALE | }, }, #line 10793 - [TRAINER_GRUNT_SPACE_CENTER_5] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_5] = { #line 10794 .trainerName = _("GRUNT"), @@ -27085,7 +27080,7 @@ F_TRAINER_FEMALE | }, }, #line 10806 - [TRAINER_GRUNT_SPACE_CENTER_6] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_6] = { #line 10807 .trainerName = _("GRUNT"), @@ -27117,7 +27112,7 @@ F_TRAINER_FEMALE | }, }, #line 10819 - [TRAINER_GRUNT_SPACE_CENTER_7] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_7] = { #line 10820 .trainerName = _("GRUNT"), @@ -27149,7 +27144,7 @@ F_TRAINER_FEMALE | }, }, #line 10832 - [TRAINER_MACEY] = + [DIFFICULTY_NORMAL][TRAINER_MACEY] = { #line 10833 .trainerName = _("MACEY"), @@ -27183,7 +27178,7 @@ F_TRAINER_FEMALE | }, }, #line 10845 - [TRAINER_BRENDAN_RUSTBORO_TREECKO] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_RUSTBORO_TREECKO] = { #line 10846 .trainerName = _("BRENDAN"), @@ -27226,7 +27221,7 @@ F_TRAINER_FEMALE | }, }, #line 10862 - [TRAINER_BRENDAN_RUSTBORO_MUDKIP] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_RUSTBORO_MUDKIP] = { #line 10863 .trainerName = _("BRENDAN"), @@ -27269,7 +27264,7 @@ F_TRAINER_FEMALE | }, }, #line 10879 - [TRAINER_PAXTON] = + [DIFFICULTY_NORMAL][TRAINER_PAXTON] = { #line 10880 .trainerName = _("PAXTON"), @@ -27312,7 +27307,7 @@ F_TRAINER_FEMALE | }, }, #line 10896 - [TRAINER_ISABELLA] = + [DIFFICULTY_NORMAL][TRAINER_ISABELLA] = { #line 10897 .trainerName = _("ISABELLA"), @@ -27346,7 +27341,7 @@ F_TRAINER_FEMALE | }, }, #line 10909 - [TRAINER_GRUNT_WEATHER_INST_5] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_5] = { #line 10910 .trainerName = _("GRUNT"), @@ -27391,7 +27386,7 @@ F_TRAINER_FEMALE | }, }, #line 10926 - [TRAINER_TABITHA_MT_CHIMNEY] = + [DIFFICULTY_NORMAL][TRAINER_TABITHA_MT_CHIMNEY] = { #line 10927 .trainerName = _("TABITHA"), @@ -27456,7 +27451,7 @@ F_TRAINER_FEMALE | }, }, #line 10951 - [TRAINER_JONATHAN] = + [DIFFICULTY_NORMAL][TRAINER_JONATHAN] = { #line 10952 .trainerName = _("JONATHAN"), @@ -27501,7 +27496,7 @@ F_TRAINER_FEMALE | }, }, #line 10969 - [TRAINER_BRENDAN_RUSTBORO_TORCHIC] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_RUSTBORO_TORCHIC] = { #line 10970 .trainerName = _("BRENDAN"), @@ -27544,7 +27539,7 @@ F_TRAINER_FEMALE | }, }, #line 10986 - [TRAINER_MAY_RUSTBORO_MUDKIP] = + [DIFFICULTY_NORMAL][TRAINER_MAY_RUSTBORO_MUDKIP] = { #line 10987 .trainerName = _("MAY"), @@ -27589,7 +27584,7 @@ F_TRAINER_FEMALE | }, }, #line 11003 - [TRAINER_MAXIE_MAGMA_HIDEOUT] = + [DIFFICULTY_NORMAL][TRAINER_MAXIE_MAGMA_HIDEOUT] = { #line 11004 .trainerName = _("MAXIE"), @@ -27645,7 +27640,7 @@ F_TRAINER_FEMALE | }, }, #line 11025 - [TRAINER_MAXIE_MT_CHIMNEY] = + [DIFFICULTY_NORMAL][TRAINER_MAXIE_MT_CHIMNEY] = { #line 11026 .trainerName = _("MAXIE"), @@ -27701,7 +27696,7 @@ F_TRAINER_FEMALE | }, }, #line 11047 - [TRAINER_TIANA] = + [DIFFICULTY_NORMAL][TRAINER_TIANA] = { #line 11048 .trainerName = _("TIANA"), @@ -27746,7 +27741,7 @@ F_TRAINER_FEMALE | }, }, #line 11064 - [TRAINER_HALEY_1] = + [DIFFICULTY_NORMAL][TRAINER_HALEY_1] = { #line 11065 .trainerName = _("HALEY"), @@ -27791,7 +27786,7 @@ F_TRAINER_FEMALE | }, }, #line 11081 - [TRAINER_JANICE] = + [DIFFICULTY_NORMAL][TRAINER_JANICE] = { #line 11082 .trainerName = _("JANICE"), @@ -27825,7 +27820,7 @@ F_TRAINER_FEMALE | }, }, #line 11094 - [TRAINER_VIVI] = + [DIFFICULTY_NORMAL][TRAINER_VIVI] = { #line 11095 .trainerName = _("VIVI"), @@ -27881,7 +27876,7 @@ F_TRAINER_FEMALE | }, }, #line 11115 - [TRAINER_HALEY_2] = + [DIFFICULTY_NORMAL][TRAINER_HALEY_2] = { #line 11116 .trainerName = _("HALEY"), @@ -27926,7 +27921,7 @@ F_TRAINER_FEMALE | }, }, #line 11132 - [TRAINER_HALEY_3] = + [DIFFICULTY_NORMAL][TRAINER_HALEY_3] = { #line 11133 .trainerName = _("HALEY"), @@ -27971,7 +27966,7 @@ F_TRAINER_FEMALE | }, }, #line 11149 - [TRAINER_HALEY_4] = + [DIFFICULTY_NORMAL][TRAINER_HALEY_4] = { #line 11150 .trainerName = _("HALEY"), @@ -28016,7 +28011,7 @@ F_TRAINER_FEMALE | }, }, #line 11166 - [TRAINER_HALEY_5] = + [DIFFICULTY_NORMAL][TRAINER_HALEY_5] = { #line 11167 .trainerName = _("HALEY"), @@ -28072,7 +28067,7 @@ F_TRAINER_FEMALE | }, }, #line 11187 - [TRAINER_SALLY] = + [DIFFICULTY_NORMAL][TRAINER_SALLY] = { #line 11188 .trainerName = _("SALLY"), @@ -28106,7 +28101,7 @@ F_TRAINER_FEMALE | }, }, #line 11200 - [TRAINER_ROBIN] = + [DIFFICULTY_NORMAL][TRAINER_ROBIN] = { #line 11201 .trainerName = _("ROBIN"), @@ -28162,7 +28157,7 @@ F_TRAINER_FEMALE | }, }, #line 11221 - [TRAINER_ANDREA] = + [DIFFICULTY_NORMAL][TRAINER_ANDREA] = { #line 11222 .trainerName = _("ANDREA"), @@ -28196,7 +28191,7 @@ F_TRAINER_FEMALE | }, }, #line 11234 - [TRAINER_CRISSY] = + [DIFFICULTY_NORMAL][TRAINER_CRISSY] = { #line 11235 .trainerName = _("CRISSY"), @@ -28241,7 +28236,7 @@ F_TRAINER_FEMALE | }, }, #line 11251 - [TRAINER_RICK] = + [DIFFICULTY_NORMAL][TRAINER_RICK] = { #line 11252 .trainerName = _("RICK"), @@ -28284,7 +28279,7 @@ F_TRAINER_FEMALE | }, }, #line 11268 - [TRAINER_LYLE] = + [DIFFICULTY_NORMAL][TRAINER_LYLE] = { #line 11269 .trainerName = _("LYLE"), @@ -28349,7 +28344,7 @@ F_TRAINER_FEMALE | }, }, #line 11293 - [TRAINER_JOSE] = + [DIFFICULTY_NORMAL][TRAINER_JOSE] = { #line 11294 .trainerName = _("JOSE"), @@ -28392,7 +28387,7 @@ F_TRAINER_FEMALE | }, }, #line 11310 - [TRAINER_DOUG] = + [DIFFICULTY_NORMAL][TRAINER_DOUG] = { #line 11311 .trainerName = _("DOUG"), @@ -28435,7 +28430,7 @@ F_TRAINER_FEMALE | }, }, #line 11327 - [TRAINER_GREG] = + [DIFFICULTY_NORMAL][TRAINER_GREG] = { #line 11328 .trainerName = _("GREG"), @@ -28478,7 +28473,7 @@ F_TRAINER_FEMALE | }, }, #line 11344 - [TRAINER_KENT] = + [DIFFICULTY_NORMAL][TRAINER_KENT] = { #line 11345 .trainerName = _("KENT"), @@ -28510,7 +28505,7 @@ F_TRAINER_FEMALE | }, }, #line 11357 - [TRAINER_JAMES_1] = + [DIFFICULTY_NORMAL][TRAINER_JAMES_1] = { #line 11358 .trainerName = _("JAMES"), @@ -28553,7 +28548,7 @@ F_TRAINER_FEMALE | }, }, #line 11374 - [TRAINER_JAMES_2] = + [DIFFICULTY_NORMAL][TRAINER_JAMES_2] = { #line 11375 .trainerName = _("JAMES"), @@ -28585,7 +28580,7 @@ F_TRAINER_FEMALE | }, }, #line 11387 - [TRAINER_JAMES_3] = + [DIFFICULTY_NORMAL][TRAINER_JAMES_3] = { #line 11388 .trainerName = _("JAMES"), @@ -28628,7 +28623,7 @@ F_TRAINER_FEMALE | }, }, #line 11404 - [TRAINER_JAMES_4] = + [DIFFICULTY_NORMAL][TRAINER_JAMES_4] = { #line 11405 .trainerName = _("JAMES"), @@ -28682,7 +28677,7 @@ F_TRAINER_FEMALE | }, }, #line 11425 - [TRAINER_JAMES_5] = + [DIFFICULTY_NORMAL][TRAINER_JAMES_5] = { #line 11426 .trainerName = _("JAMES"), @@ -28747,7 +28742,7 @@ F_TRAINER_FEMALE | }, }, #line 11450 - [TRAINER_BRICE] = + [DIFFICULTY_NORMAL][TRAINER_BRICE] = { #line 11451 .trainerName = _("BRICE"), @@ -28790,7 +28785,7 @@ F_TRAINER_FEMALE | }, }, #line 11467 - [TRAINER_TRENT_1] = + [DIFFICULTY_NORMAL][TRAINER_TRENT_1] = { #line 11468 .trainerName = _("TRENT"), @@ -28844,7 +28839,7 @@ F_TRAINER_FEMALE | }, }, #line 11488 - [TRAINER_LENNY] = + [DIFFICULTY_NORMAL][TRAINER_LENNY] = { #line 11489 .trainerName = _("LENNY"), @@ -28887,7 +28882,7 @@ F_TRAINER_FEMALE | }, }, #line 11505 - [TRAINER_LUCAS_1] = + [DIFFICULTY_NORMAL][TRAINER_LUCAS_1] = { #line 11506 .trainerName = _("LUCAS"), @@ -28930,7 +28925,7 @@ F_TRAINER_FEMALE | }, }, #line 11522 - [TRAINER_ALAN] = + [DIFFICULTY_NORMAL][TRAINER_ALAN] = { #line 11523 .trainerName = _("ALAN"), @@ -28984,7 +28979,7 @@ F_TRAINER_FEMALE | }, }, #line 11543 - [TRAINER_CLARK] = + [DIFFICULTY_NORMAL][TRAINER_CLARK] = { #line 11544 .trainerName = _("CLARK"), @@ -29016,7 +29011,7 @@ F_TRAINER_FEMALE | }, }, #line 11556 - [TRAINER_ERIC] = + [DIFFICULTY_NORMAL][TRAINER_ERIC] = { #line 11557 .trainerName = _("ERIC"), @@ -29059,7 +29054,7 @@ F_TRAINER_FEMALE | }, }, #line 11573 - [TRAINER_LUCAS_2] = + [DIFFICULTY_NORMAL][TRAINER_LUCAS_2] = { #line 11574 .trainerName = _("LUCAS"), @@ -29096,7 +29091,7 @@ F_TRAINER_FEMALE | }, }, #line 11588 - [TRAINER_MIKE_1] = + [DIFFICULTY_NORMAL][TRAINER_MIKE_1] = { #line 11589 .trainerName = _("MIKE"), @@ -29149,7 +29144,7 @@ F_TRAINER_FEMALE | }, }, #line 11609 - [TRAINER_MIKE_2] = + [DIFFICULTY_NORMAL][TRAINER_MIKE_2] = { #line 11610 .trainerName = _("MIKE"), @@ -29203,7 +29198,7 @@ F_TRAINER_FEMALE | }, }, #line 11630 - [TRAINER_TRENT_2] = + [DIFFICULTY_NORMAL][TRAINER_TRENT_2] = { #line 11631 .trainerName = _("TRENT"), @@ -29268,7 +29263,7 @@ F_TRAINER_FEMALE | }, }, #line 11655 - [TRAINER_TRENT_3] = + [DIFFICULTY_NORMAL][TRAINER_TRENT_3] = { #line 11656 .trainerName = _("TRENT"), @@ -29333,7 +29328,7 @@ F_TRAINER_FEMALE | }, }, #line 11680 - [TRAINER_TRENT_4] = + [DIFFICULTY_NORMAL][TRAINER_TRENT_4] = { #line 11681 .trainerName = _("TRENT"), @@ -29398,7 +29393,7 @@ F_TRAINER_FEMALE | }, }, #line 11705 - [TRAINER_TRENT_5] = + [DIFFICULTY_NORMAL][TRAINER_TRENT_5] = { #line 11706 .trainerName = _("TRENT"), @@ -29463,7 +29458,7 @@ F_TRAINER_FEMALE | }, }, #line 11730 - [TRAINER_DEZ_AND_LUKE] = + [DIFFICULTY_NORMAL][TRAINER_DEZ_AND_LUKE] = { #line 11731 .trainerName = _("DEZ & LUKE"), @@ -29506,7 +29501,7 @@ F_TRAINER_FEMALE | }, }, #line 11747 - [TRAINER_LEA_AND_JED] = + [DIFFICULTY_NORMAL][TRAINER_LEA_AND_JED] = { #line 11748 .trainerName = _("LEA & JED"), @@ -29549,7 +29544,7 @@ F_TRAINER_FEMALE | }, }, #line 11764 - [TRAINER_KIRA_AND_DAN_1] = + [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_1] = { #line 11765 .trainerName = _("KIRA & DAN"), @@ -29592,7 +29587,7 @@ F_TRAINER_FEMALE | }, }, #line 11781 - [TRAINER_KIRA_AND_DAN_2] = + [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_2] = { #line 11782 .trainerName = _("KIRA & DAN"), @@ -29635,7 +29630,7 @@ F_TRAINER_FEMALE | }, }, #line 11798 - [TRAINER_KIRA_AND_DAN_3] = + [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_3] = { #line 11799 .trainerName = _("KIRA & DAN"), @@ -29678,7 +29673,7 @@ F_TRAINER_FEMALE | }, }, #line 11815 - [TRAINER_KIRA_AND_DAN_4] = + [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_4] = { #line 11816 .trainerName = _("KIRA & DAN"), @@ -29721,7 +29716,7 @@ F_TRAINER_FEMALE | }, }, #line 11832 - [TRAINER_KIRA_AND_DAN_5] = + [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_5] = { #line 11833 .trainerName = _("KIRA & DAN"), @@ -29764,7 +29759,7 @@ F_TRAINER_FEMALE | }, }, #line 11849 - [TRAINER_JOHANNA] = + [DIFFICULTY_NORMAL][TRAINER_JOHANNA] = { #line 11850 .trainerName = _("JOHANNA"), @@ -29798,7 +29793,7 @@ F_TRAINER_FEMALE | }, }, #line 11862 - [TRAINER_GERALD] = + [DIFFICULTY_NORMAL][TRAINER_GERALD] = { #line 11863 .trainerName = _("GERALD"), @@ -29839,7 +29834,7 @@ F_TRAINER_FEMALE | }, }, #line 11880 - [TRAINER_VIVIAN] = + [DIFFICULTY_NORMAL][TRAINER_VIVIAN] = { #line 11881 .trainerName = _("VIVIAN"), @@ -29898,7 +29893,7 @@ F_TRAINER_FEMALE | }, }, #line 11905 - [TRAINER_DANIELLE] = + [DIFFICULTY_NORMAL][TRAINER_DANIELLE] = { #line 11906 .trainerName = _("DANIELLE"), @@ -29939,7 +29934,7 @@ F_TRAINER_FEMALE | }, }, #line 11922 - [TRAINER_HIDEO] = + [DIFFICULTY_NORMAL][TRAINER_HIDEO] = { #line 11923 .trainerName = _("HIDEO"), @@ -29996,7 +29991,7 @@ F_TRAINER_FEMALE | }, }, #line 11947 - [TRAINER_KEIGO] = + [DIFFICULTY_NORMAL][TRAINER_KEIGO] = { #line 11948 .trainerName = _("KEIGO"), @@ -30053,7 +30048,7 @@ F_TRAINER_FEMALE | }, }, #line 11972 - [TRAINER_RILEY] = + [DIFFICULTY_NORMAL][TRAINER_RILEY] = { #line 11973 .trainerName = _("RILEY"), @@ -30110,7 +30105,7 @@ F_TRAINER_FEMALE | }, }, #line 11997 - [TRAINER_FLINT] = + [DIFFICULTY_NORMAL][TRAINER_FLINT] = { #line 11998 .trainerName = _("FLINT"), @@ -30153,7 +30148,7 @@ F_TRAINER_FEMALE | }, }, #line 12014 - [TRAINER_ASHLEY] = + [DIFFICULTY_NORMAL][TRAINER_ASHLEY] = { #line 12015 .trainerName = _("ASHLEY"), @@ -30209,7 +30204,7 @@ F_TRAINER_FEMALE | }, }, #line 12035 - [TRAINER_WALLY_MAUVILLE] = + [DIFFICULTY_NORMAL][TRAINER_WALLY_MAUVILLE] = { #line 12036 .trainerName = _("WALLY"), @@ -30241,7 +30236,7 @@ F_TRAINER_FEMALE | }, }, #line 12048 - [TRAINER_WALLY_VR_2] = + [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_2] = { #line 12049 .trainerName = _("WALLY"), @@ -30354,7 +30349,7 @@ F_TRAINER_FEMALE | }, }, #line 12098 - [TRAINER_WALLY_VR_3] = + [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_3] = { #line 12099 .trainerName = _("WALLY"), @@ -30467,7 +30462,7 @@ F_TRAINER_FEMALE | }, }, #line 12148 - [TRAINER_WALLY_VR_4] = + [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_4] = { #line 12149 .trainerName = _("WALLY"), @@ -30580,7 +30575,7 @@ F_TRAINER_FEMALE | }, }, #line 12198 - [TRAINER_WALLY_VR_5] = + [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_5] = { #line 12199 .trainerName = _("WALLY"), @@ -30693,7 +30688,7 @@ F_TRAINER_FEMALE | }, }, #line 12248 - [TRAINER_BRENDAN_LILYCOVE_MUDKIP] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_LILYCOVE_MUDKIP] = { #line 12249 .trainerName = _("BRENDAN"), @@ -30758,7 +30753,7 @@ F_TRAINER_FEMALE | }, }, #line 12273 - [TRAINER_BRENDAN_LILYCOVE_TREECKO] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_LILYCOVE_TREECKO] = { #line 12274 .trainerName = _("BRENDAN"), @@ -30823,7 +30818,7 @@ F_TRAINER_FEMALE | }, }, #line 12298 - [TRAINER_BRENDAN_LILYCOVE_TORCHIC] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_LILYCOVE_TORCHIC] = { #line 12299 .trainerName = _("BRENDAN"), @@ -30888,7 +30883,7 @@ F_TRAINER_FEMALE | }, }, #line 12323 - [TRAINER_MAY_LILYCOVE_MUDKIP] = + [DIFFICULTY_NORMAL][TRAINER_MAY_LILYCOVE_MUDKIP] = { #line 12324 .trainerName = _("MAY"), @@ -30955,7 +30950,7 @@ F_TRAINER_FEMALE | }, }, #line 12348 - [TRAINER_MAY_LILYCOVE_TREECKO] = + [DIFFICULTY_NORMAL][TRAINER_MAY_LILYCOVE_TREECKO] = { #line 12349 .trainerName = _("MAY"), @@ -31022,7 +31017,7 @@ F_TRAINER_FEMALE | }, }, #line 12373 - [TRAINER_MAY_LILYCOVE_TORCHIC] = + [DIFFICULTY_NORMAL][TRAINER_MAY_LILYCOVE_TORCHIC] = { #line 12374 .trainerName = _("MAY"), @@ -31089,7 +31084,7 @@ F_TRAINER_FEMALE | }, }, #line 12398 - [TRAINER_JONAH] = + [DIFFICULTY_NORMAL][TRAINER_JONAH] = { #line 12399 .trainerName = _("JONAH"), @@ -31143,7 +31138,7 @@ F_TRAINER_FEMALE | }, }, #line 12419 - [TRAINER_HENRY] = + [DIFFICULTY_NORMAL][TRAINER_HENRY] = { #line 12420 .trainerName = _("HENRY"), @@ -31186,7 +31181,7 @@ F_TRAINER_FEMALE | }, }, #line 12436 - [TRAINER_ROGER] = + [DIFFICULTY_NORMAL][TRAINER_ROGER] = { #line 12437 .trainerName = _("ROGER"), @@ -31240,7 +31235,7 @@ F_TRAINER_FEMALE | }, }, #line 12457 - [TRAINER_ALEXA] = + [DIFFICULTY_NORMAL][TRAINER_ALEXA] = { #line 12458 .trainerName = _("ALEXA"), @@ -31287,7 +31282,7 @@ F_TRAINER_FEMALE | }, }, #line 12475 - [TRAINER_RUBEN] = + [DIFFICULTY_NORMAL][TRAINER_RUBEN] = { #line 12476 .trainerName = _("RUBEN"), @@ -31332,7 +31327,7 @@ F_TRAINER_FEMALE | }, }, #line 12493 - [TRAINER_KOJI_1] = + [DIFFICULTY_NORMAL][TRAINER_KOJI_1] = { #line 12494 .trainerName = _("KOJI"), @@ -31364,7 +31359,7 @@ F_TRAINER_FEMALE | }, }, #line 12506 - [TRAINER_WAYNE] = + [DIFFICULTY_NORMAL][TRAINER_WAYNE] = { #line 12507 .trainerName = _("WAYNE"), @@ -31418,7 +31413,7 @@ F_TRAINER_FEMALE | }, }, #line 12527 - [TRAINER_AIDAN] = + [DIFFICULTY_NORMAL][TRAINER_AIDAN] = { #line 12528 .trainerName = _("AIDAN"), @@ -31461,7 +31456,7 @@ F_TRAINER_FEMALE | }, }, #line 12544 - [TRAINER_REED] = + [DIFFICULTY_NORMAL][TRAINER_REED] = { #line 12545 .trainerName = _("REED"), @@ -31504,7 +31499,7 @@ F_TRAINER_FEMALE | }, }, #line 12561 - [TRAINER_TISHA] = + [DIFFICULTY_NORMAL][TRAINER_TISHA] = { #line 12562 .trainerName = _("TISHA"), @@ -31538,7 +31533,7 @@ F_TRAINER_FEMALE | }, }, #line 12574 - [TRAINER_TORI_AND_TIA] = + [DIFFICULTY_NORMAL][TRAINER_TORI_AND_TIA] = { #line 12575 .trainerName = _("TORI & TIA"), @@ -31581,7 +31576,7 @@ F_TRAINER_FEMALE | }, }, #line 12591 - [TRAINER_KIM_AND_IRIS] = + [DIFFICULTY_NORMAL][TRAINER_KIM_AND_IRIS] = { #line 12592 .trainerName = _("KIM & IRIS"), @@ -31638,7 +31633,7 @@ F_TRAINER_FEMALE | }, }, #line 12616 - [TRAINER_TYRA_AND_IVY] = + [DIFFICULTY_NORMAL][TRAINER_TYRA_AND_IVY] = { #line 12617 .trainerName = _("TYRA & IVY"), @@ -31695,7 +31690,7 @@ F_TRAINER_FEMALE | }, }, #line 12641 - [TRAINER_MEL_AND_PAUL] = + [DIFFICULTY_NORMAL][TRAINER_MEL_AND_PAUL] = { #line 12642 .trainerName = _("MEL & PAUL"), @@ -31752,7 +31747,7 @@ F_TRAINER_FEMALE | }, }, #line 12666 - [TRAINER_JOHN_AND_JAY_1] = + [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_1] = { #line 12667 .trainerName = _("JOHN & JAY"), @@ -31809,7 +31804,7 @@ F_TRAINER_FEMALE | }, }, #line 12691 - [TRAINER_JOHN_AND_JAY_2] = + [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_2] = { #line 12692 .trainerName = _("JOHN & JAY"), @@ -31866,7 +31861,7 @@ F_TRAINER_FEMALE | }, }, #line 12716 - [TRAINER_JOHN_AND_JAY_3] = + [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_3] = { #line 12717 .trainerName = _("JOHN & JAY"), @@ -31923,7 +31918,7 @@ F_TRAINER_FEMALE | }, }, #line 12741 - [TRAINER_JOHN_AND_JAY_4] = + [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_4] = { #line 12742 .trainerName = _("JOHN & JAY"), @@ -31980,7 +31975,7 @@ F_TRAINER_FEMALE | }, }, #line 12766 - [TRAINER_JOHN_AND_JAY_5] = + [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_5] = { #line 12767 .trainerName = _("JOHN & JAY"), @@ -32037,7 +32032,7 @@ F_TRAINER_FEMALE | }, }, #line 12791 - [TRAINER_RELI_AND_IAN] = + [DIFFICULTY_NORMAL][TRAINER_RELI_AND_IAN] = { #line 12792 .trainerName = _("RELI & IAN"), @@ -32080,7 +32075,7 @@ F_TRAINER_FEMALE | }, }, #line 12808 - [TRAINER_LILA_AND_ROY_1] = + [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_1] = { #line 12809 .trainerName = _("LILA & ROY"), @@ -32123,7 +32118,7 @@ F_TRAINER_FEMALE | }, }, #line 12825 - [TRAINER_LILA_AND_ROY_2] = + [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_2] = { #line 12826 .trainerName = _("LILA & ROY"), @@ -32166,7 +32161,7 @@ F_TRAINER_FEMALE | }, }, #line 12842 - [TRAINER_LILA_AND_ROY_3] = + [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_3] = { #line 12843 .trainerName = _("LILA & ROY"), @@ -32209,7 +32204,7 @@ F_TRAINER_FEMALE | }, }, #line 12859 - [TRAINER_LILA_AND_ROY_4] = + [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_4] = { #line 12860 .trainerName = _("LILA & ROY"), @@ -32252,7 +32247,7 @@ F_TRAINER_FEMALE | }, }, #line 12876 - [TRAINER_LILA_AND_ROY_5] = + [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_5] = { #line 12877 .trainerName = _("LILA & ROY"), @@ -32295,7 +32290,7 @@ F_TRAINER_FEMALE | }, }, #line 12893 - [TRAINER_LISA_AND_RAY] = + [DIFFICULTY_NORMAL][TRAINER_LISA_AND_RAY] = { #line 12894 .trainerName = _("LISA & RAY"), @@ -32338,7 +32333,7 @@ F_TRAINER_FEMALE | }, }, #line 12910 - [TRAINER_CHRIS] = + [DIFFICULTY_NORMAL][TRAINER_CHRIS] = { #line 12911 .trainerName = _("CHRIS"), @@ -32403,7 +32398,7 @@ F_TRAINER_FEMALE | }, }, #line 12935 - [TRAINER_DAWSON] = + [DIFFICULTY_NORMAL][TRAINER_DAWSON] = { #line 12936 .trainerName = _("DAWSON"), @@ -32448,7 +32443,7 @@ F_TRAINER_FEMALE | }, }, #line 12952 - [TRAINER_SARAH] = + [DIFFICULTY_NORMAL][TRAINER_SARAH] = { #line 12953 .trainerName = _("SARAH"), @@ -32497,7 +32492,7 @@ F_TRAINER_FEMALE | }, }, #line 12970 - [TRAINER_DARIAN] = + [DIFFICULTY_NORMAL][TRAINER_DARIAN] = { #line 12971 .trainerName = _("DARIAN"), @@ -32529,7 +32524,7 @@ F_TRAINER_FEMALE | }, }, #line 12983 - [TRAINER_HAILEY] = + [DIFFICULTY_NORMAL][TRAINER_HAILEY] = { #line 12984 .trainerName = _("HAILEY"), @@ -32563,7 +32558,7 @@ F_TRAINER_FEMALE | }, }, #line 12996 - [TRAINER_CHANDLER] = + [DIFFICULTY_NORMAL][TRAINER_CHANDLER] = { #line 12997 .trainerName = _("CHANDLER"), @@ -32606,7 +32601,7 @@ F_TRAINER_FEMALE | }, }, #line 13013 - [TRAINER_KALEB] = + [DIFFICULTY_NORMAL][TRAINER_KALEB] = { #line 13014 .trainerName = _("KALEB"), @@ -32653,7 +32648,7 @@ F_TRAINER_FEMALE | }, }, #line 13030 - [TRAINER_JOSEPH] = + [DIFFICULTY_NORMAL][TRAINER_JOSEPH] = { #line 13031 .trainerName = _("JOSEPH"), @@ -32696,7 +32691,7 @@ F_TRAINER_FEMALE | }, }, #line 13047 - [TRAINER_ALYSSA] = + [DIFFICULTY_NORMAL][TRAINER_ALYSSA] = { #line 13048 .trainerName = _("ALYSSA"), @@ -32730,7 +32725,7 @@ F_TRAINER_FEMALE | }, }, #line 13060 - [TRAINER_MARCOS] = + [DIFFICULTY_NORMAL][TRAINER_MARCOS] = { #line 13061 .trainerName = _("MARCOS"), @@ -32762,7 +32757,7 @@ F_TRAINER_FEMALE | }, }, #line 13073 - [TRAINER_RHETT] = + [DIFFICULTY_NORMAL][TRAINER_RHETT] = { #line 13074 .trainerName = _("RHETT"), @@ -32794,7 +32789,7 @@ F_TRAINER_FEMALE | }, }, #line 13086 - [TRAINER_TYRON] = + [DIFFICULTY_NORMAL][TRAINER_TYRON] = { #line 13087 .trainerName = _("TYRON"), @@ -32826,7 +32821,7 @@ F_TRAINER_FEMALE | }, }, #line 13099 - [TRAINER_CELINA] = + [DIFFICULTY_NORMAL][TRAINER_CELINA] = { #line 13100 .trainerName = _("CELINA"), @@ -32860,7 +32855,7 @@ F_TRAINER_FEMALE | }, }, #line 13112 - [TRAINER_BIANCA] = + [DIFFICULTY_NORMAL][TRAINER_BIANCA] = { #line 13113 .trainerName = _("BIANCA"), @@ -32894,7 +32889,7 @@ F_TRAINER_FEMALE | }, }, #line 13125 - [TRAINER_HAYDEN] = + [DIFFICULTY_NORMAL][TRAINER_HAYDEN] = { #line 13126 .trainerName = _("HAYDEN"), @@ -32926,7 +32921,7 @@ F_TRAINER_FEMALE | }, }, #line 13138 - [TRAINER_SOPHIE] = + [DIFFICULTY_NORMAL][TRAINER_SOPHIE] = { #line 13139 .trainerName = _("SOPHIE"), @@ -32971,7 +32966,7 @@ F_TRAINER_FEMALE | }, }, #line 13155 - [TRAINER_COBY] = + [DIFFICULTY_NORMAL][TRAINER_COBY] = { #line 13156 .trainerName = _("COBY"), @@ -33014,7 +33009,7 @@ F_TRAINER_FEMALE | }, }, #line 13172 - [TRAINER_LAWRENCE] = + [DIFFICULTY_NORMAL][TRAINER_LAWRENCE] = { #line 13173 .trainerName = _("LAWRENCE"), @@ -33057,7 +33052,7 @@ F_TRAINER_FEMALE | }, }, #line 13189 - [TRAINER_WYATT] = + [DIFFICULTY_NORMAL][TRAINER_WYATT] = { #line 13190 .trainerName = _("WYATT"), @@ -33100,7 +33095,7 @@ F_TRAINER_FEMALE | }, }, #line 13206 - [TRAINER_ANGELINA] = + [DIFFICULTY_NORMAL][TRAINER_ANGELINA] = { #line 13207 .trainerName = _("ANGELINA"), @@ -33145,7 +33140,7 @@ F_TRAINER_FEMALE | }, }, #line 13223 - [TRAINER_KAI] = + [DIFFICULTY_NORMAL][TRAINER_KAI] = { #line 13224 .trainerName = _("KAI"), @@ -33177,7 +33172,7 @@ F_TRAINER_FEMALE | }, }, #line 13236 - [TRAINER_CHARLOTTE] = + [DIFFICULTY_NORMAL][TRAINER_CHARLOTTE] = { #line 13237 .trainerName = _("CHARLOTTE"), @@ -33211,7 +33206,7 @@ F_TRAINER_FEMALE | }, }, #line 13249 - [TRAINER_DEANDRE] = + [DIFFICULTY_NORMAL][TRAINER_DEANDRE] = { #line 13250 .trainerName = _("DEANDRE"), @@ -33265,7 +33260,7 @@ F_TRAINER_FEMALE | }, }, #line 13270 - [TRAINER_GRUNT_MAGMA_HIDEOUT_1] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_1] = { #line 13271 .trainerName = _("GRUNT"), @@ -33297,7 +33292,7 @@ F_TRAINER_FEMALE | }, }, #line 13283 - [TRAINER_GRUNT_MAGMA_HIDEOUT_2] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_2] = { #line 13284 .trainerName = _("GRUNT"), @@ -33329,7 +33324,7 @@ F_TRAINER_FEMALE | }, }, #line 13296 - [TRAINER_GRUNT_MAGMA_HIDEOUT_3] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_3] = { #line 13297 .trainerName = _("GRUNT"), @@ -33361,7 +33356,7 @@ F_TRAINER_FEMALE | }, }, #line 13309 - [TRAINER_GRUNT_MAGMA_HIDEOUT_4] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_4] = { #line 13310 .trainerName = _("GRUNT"), @@ -33404,7 +33399,7 @@ F_TRAINER_FEMALE | }, }, #line 13326 - [TRAINER_GRUNT_MAGMA_HIDEOUT_5] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_5] = { #line 13327 .trainerName = _("GRUNT"), @@ -33447,7 +33442,7 @@ F_TRAINER_FEMALE | }, }, #line 13343 - [TRAINER_GRUNT_MAGMA_HIDEOUT_6] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_6] = { #line 13344 .trainerName = _("GRUNT"), @@ -33479,7 +33474,7 @@ F_TRAINER_FEMALE | }, }, #line 13356 - [TRAINER_GRUNT_MAGMA_HIDEOUT_7] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_7] = { #line 13357 .trainerName = _("GRUNT"), @@ -33511,7 +33506,7 @@ F_TRAINER_FEMALE | }, }, #line 13369 - [TRAINER_GRUNT_MAGMA_HIDEOUT_8] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_8] = { #line 13370 .trainerName = _("GRUNT"), @@ -33543,7 +33538,7 @@ F_TRAINER_FEMALE | }, }, #line 13382 - [TRAINER_GRUNT_MAGMA_HIDEOUT_9] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_9] = { #line 13383 .trainerName = _("GRUNT"), @@ -33575,7 +33570,7 @@ F_TRAINER_FEMALE | }, }, #line 13395 - [TRAINER_GRUNT_MAGMA_HIDEOUT_10] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_10] = { #line 13396 .trainerName = _("GRUNT"), @@ -33607,7 +33602,7 @@ F_TRAINER_FEMALE | }, }, #line 13408 - [TRAINER_GRUNT_MAGMA_HIDEOUT_11] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_11] = { #line 13409 .trainerName = _("GRUNT"), @@ -33639,7 +33634,7 @@ F_TRAINER_FEMALE | }, }, #line 13421 - [TRAINER_GRUNT_MAGMA_HIDEOUT_12] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_12] = { #line 13422 .trainerName = _("GRUNT"), @@ -33671,7 +33666,7 @@ F_TRAINER_FEMALE | }, }, #line 13434 - [TRAINER_GRUNT_MAGMA_HIDEOUT_13] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_13] = { #line 13435 .trainerName = _("GRUNT"), @@ -33703,7 +33698,7 @@ F_TRAINER_FEMALE | }, }, #line 13447 - [TRAINER_GRUNT_MAGMA_HIDEOUT_14] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_14] = { #line 13448 .trainerName = _("GRUNT"), @@ -33737,7 +33732,7 @@ F_TRAINER_FEMALE | }, }, #line 13460 - [TRAINER_GRUNT_MAGMA_HIDEOUT_15] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_15] = { #line 13461 .trainerName = _("GRUNT"), @@ -33771,7 +33766,7 @@ F_TRAINER_FEMALE | }, }, #line 13473 - [TRAINER_GRUNT_MAGMA_HIDEOUT_16] = + [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_16] = { #line 13474 .trainerName = _("GRUNT"), @@ -33805,7 +33800,7 @@ F_TRAINER_FEMALE | }, }, #line 13486 - [TRAINER_TABITHA_MAGMA_HIDEOUT] = + [DIFFICULTY_NORMAL][TRAINER_TABITHA_MAGMA_HIDEOUT] = { #line 13487 .trainerName = _("TABITHA"), @@ -33870,7 +33865,7 @@ F_TRAINER_FEMALE | }, }, #line 13511 - [TRAINER_DARCY] = + [DIFFICULTY_NORMAL][TRAINER_DARCY] = { #line 13512 .trainerName = _("DARCY"), @@ -33917,7 +33912,7 @@ F_TRAINER_FEMALE | }, }, #line 13529 - [TRAINER_MAXIE_MOSSDEEP] = + [DIFFICULTY_NORMAL][TRAINER_MAXIE_MOSSDEEP] = { #line 13530 .trainerName = _("MAXIE"), @@ -33971,7 +33966,7 @@ F_TRAINER_FEMALE | }, }, #line 13550 - [TRAINER_PETE] = + [DIFFICULTY_NORMAL][TRAINER_PETE] = { #line 13551 .trainerName = _("PETE"), @@ -34003,7 +33998,7 @@ F_TRAINER_FEMALE | }, }, #line 13563 - [TRAINER_ISABELLE] = + [DIFFICULTY_NORMAL][TRAINER_ISABELLE] = { #line 13564 .trainerName = _("ISABELLE"), @@ -34037,7 +34032,7 @@ F_TRAINER_FEMALE | }, }, #line 13576 - [TRAINER_ANDRES_1] = + [DIFFICULTY_NORMAL][TRAINER_ANDRES_1] = { #line 13577 .trainerName = _("ANDRES"), @@ -34080,7 +34075,7 @@ F_TRAINER_FEMALE | }, }, #line 13593 - [TRAINER_JOSUE] = + [DIFFICULTY_NORMAL][TRAINER_JOSUE] = { #line 13594 .trainerName = _("JOSUE"), @@ -34123,7 +34118,7 @@ F_TRAINER_FEMALE | }, }, #line 13610 - [TRAINER_CAMRON] = + [DIFFICULTY_NORMAL][TRAINER_CAMRON] = { #line 13611 .trainerName = _("CAMRON"), @@ -34155,7 +34150,7 @@ F_TRAINER_FEMALE | }, }, #line 13623 - [TRAINER_CORY_1] = + [DIFFICULTY_NORMAL][TRAINER_CORY_1] = { #line 13624 .trainerName = _("CORY"), @@ -34209,7 +34204,7 @@ F_TRAINER_FEMALE | }, }, #line 13644 - [TRAINER_CAROLINA] = + [DIFFICULTY_NORMAL][TRAINER_CAROLINA] = { #line 13645 .trainerName = _("CAROLINA"), @@ -34267,7 +34262,7 @@ F_TRAINER_FEMALE | }, }, #line 13666 - [TRAINER_ELIJAH] = + [DIFFICULTY_NORMAL][TRAINER_ELIJAH] = { #line 13667 .trainerName = _("ELIJAH"), @@ -34310,7 +34305,7 @@ F_TRAINER_FEMALE | }, }, #line 13683 - [TRAINER_CELIA] = + [DIFFICULTY_NORMAL][TRAINER_CELIA] = { #line 13684 .trainerName = _("CELIA"), @@ -34355,7 +34350,7 @@ F_TRAINER_FEMALE | }, }, #line 13700 - [TRAINER_BRYAN] = + [DIFFICULTY_NORMAL][TRAINER_BRYAN] = { #line 13701 .trainerName = _("BRYAN"), @@ -34398,7 +34393,7 @@ F_TRAINER_FEMALE | }, }, #line 13717 - [TRAINER_BRANDEN] = + [DIFFICULTY_NORMAL][TRAINER_BRANDEN] = { #line 13718 .trainerName = _("BRANDEN"), @@ -34441,7 +34436,7 @@ F_TRAINER_FEMALE | }, }, #line 13734 - [TRAINER_BRYANT] = + [DIFFICULTY_NORMAL][TRAINER_BRYANT] = { #line 13735 .trainerName = _("BRYANT"), @@ -34484,7 +34479,7 @@ F_TRAINER_FEMALE | }, }, #line 13751 - [TRAINER_SHAYLA] = + [DIFFICULTY_NORMAL][TRAINER_SHAYLA] = { #line 13752 .trainerName = _("SHAYLA"), @@ -34529,7 +34524,7 @@ F_TRAINER_FEMALE | }, }, #line 13768 - [TRAINER_KYRA] = + [DIFFICULTY_NORMAL][TRAINER_KYRA] = { #line 13769 .trainerName = _("KYRA"), @@ -34574,7 +34569,7 @@ F_TRAINER_FEMALE | }, }, #line 13785 - [TRAINER_JAIDEN] = + [DIFFICULTY_NORMAL][TRAINER_JAIDEN] = { #line 13786 .trainerName = _("JAIDEN"), @@ -34617,7 +34612,7 @@ F_TRAINER_FEMALE | }, }, #line 13802 - [TRAINER_ALIX] = + [DIFFICULTY_NORMAL][TRAINER_ALIX] = { #line 13803 .trainerName = _("ALIX"), @@ -34662,7 +34657,7 @@ F_TRAINER_FEMALE | }, }, #line 13819 - [TRAINER_HELENE] = + [DIFFICULTY_NORMAL][TRAINER_HELENE] = { #line 13820 .trainerName = _("HELENE"), @@ -34707,7 +34702,7 @@ F_TRAINER_FEMALE | }, }, #line 13836 - [TRAINER_MARLENE] = + [DIFFICULTY_NORMAL][TRAINER_MARLENE] = { #line 13837 .trainerName = _("MARLENE"), @@ -34752,7 +34747,7 @@ F_TRAINER_FEMALE | }, }, #line 13853 - [TRAINER_DEVAN] = + [DIFFICULTY_NORMAL][TRAINER_DEVAN] = { #line 13854 .trainerName = _("DEVAN"), @@ -34795,7 +34790,7 @@ F_TRAINER_FEMALE | }, }, #line 13870 - [TRAINER_JOHNSON] = + [DIFFICULTY_NORMAL][TRAINER_JOHNSON] = { #line 13871 .trainerName = _("JOHNSON"), @@ -34838,7 +34833,7 @@ F_TRAINER_FEMALE | }, }, #line 13887 - [TRAINER_MELINA] = + [DIFFICULTY_NORMAL][TRAINER_MELINA] = { #line 13888 .trainerName = _("MELINA"), @@ -34872,7 +34867,7 @@ F_TRAINER_FEMALE | }, }, #line 13900 - [TRAINER_BRANDI] = + [DIFFICULTY_NORMAL][TRAINER_BRANDI] = { #line 13901 .trainerName = _("BRANDI"), @@ -34906,7 +34901,7 @@ F_TRAINER_FEMALE | }, }, #line 13913 - [TRAINER_AISHA] = + [DIFFICULTY_NORMAL][TRAINER_AISHA] = { #line 13914 .trainerName = _("AISHA"), @@ -34940,7 +34935,7 @@ F_TRAINER_FEMALE | }, }, #line 13926 - [TRAINER_MAKAYLA] = + [DIFFICULTY_NORMAL][TRAINER_MAKAYLA] = { #line 13927 .trainerName = _("MAKAYLA"), @@ -34987,7 +34982,7 @@ F_TRAINER_FEMALE | }, }, #line 13944 - [TRAINER_FABIAN] = + [DIFFICULTY_NORMAL][TRAINER_FABIAN] = { #line 13945 .trainerName = _("FABIAN"), @@ -35019,7 +35014,7 @@ F_TRAINER_FEMALE | }, }, #line 13957 - [TRAINER_DAYTON] = + [DIFFICULTY_NORMAL][TRAINER_DAYTON] = { #line 13958 .trainerName = _("DAYTON"), @@ -35062,7 +35057,7 @@ F_TRAINER_FEMALE | }, }, #line 13974 - [TRAINER_RACHEL] = + [DIFFICULTY_NORMAL][TRAINER_RACHEL] = { #line 13975 .trainerName = _("RACHEL"), @@ -35096,7 +35091,7 @@ F_TRAINER_FEMALE | }, }, #line 13987 - [TRAINER_LEONEL] = + [DIFFICULTY_NORMAL][TRAINER_LEONEL] = { #line 13988 .trainerName = _("LEONEL"), @@ -35136,7 +35131,7 @@ F_TRAINER_FEMALE | }, }, #line 14004 - [TRAINER_CALLIE] = + [DIFFICULTY_NORMAL][TRAINER_CALLIE] = { #line 14005 .trainerName = _("CALLIE"), @@ -35181,7 +35176,7 @@ F_TRAINER_FEMALE | }, }, #line 14021 - [TRAINER_CALE] = + [DIFFICULTY_NORMAL][TRAINER_CALE] = { #line 14022 .trainerName = _("CALE"), @@ -35224,7 +35219,7 @@ F_TRAINER_FEMALE | }, }, #line 14038 - [TRAINER_MYLES] = + [DIFFICULTY_NORMAL][TRAINER_MYLES] = { #line 14039 .trainerName = _("MYLES"), @@ -35311,7 +35306,7 @@ F_TRAINER_FEMALE | }, }, #line 14071 - [TRAINER_PAT] = + [DIFFICULTY_NORMAL][TRAINER_PAT] = { #line 14072 .trainerName = _("PAT"), @@ -35400,7 +35395,7 @@ F_TRAINER_FEMALE | }, }, #line 14104 - [TRAINER_CRISTIN_1] = + [DIFFICULTY_NORMAL][TRAINER_CRISTIN_1] = { #line 14105 .trainerName = _("CRISTIN"), @@ -35447,7 +35442,7 @@ F_TRAINER_FEMALE | }, }, #line 14122 - [TRAINER_MAY_RUSTBORO_TREECKO] = + [DIFFICULTY_NORMAL][TRAINER_MAY_RUSTBORO_TREECKO] = { #line 14123 .trainerName = _("MAY"), @@ -35492,7 +35487,7 @@ F_TRAINER_FEMALE | }, }, #line 14139 - [TRAINER_MAY_RUSTBORO_TORCHIC] = + [DIFFICULTY_NORMAL][TRAINER_MAY_RUSTBORO_TORCHIC] = { #line 14140 .trainerName = _("MAY"), @@ -35537,7 +35532,7 @@ F_TRAINER_FEMALE | }, }, #line 14156 - [TRAINER_ROXANNE_2] = + [DIFFICULTY_NORMAL][TRAINER_ROXANNE_2] = { #line 14157 .trainerName = _("ROXANNE"), @@ -35638,7 +35633,7 @@ F_TRAINER_FEMALE | }, }, #line 14198 - [TRAINER_ROXANNE_3] = + [DIFFICULTY_NORMAL][TRAINER_ROXANNE_3] = { #line 14199 .trainerName = _("ROXANNE"), @@ -35757,7 +35752,7 @@ F_TRAINER_FEMALE | }, }, #line 14248 - [TRAINER_ROXANNE_4] = + [DIFFICULTY_NORMAL][TRAINER_ROXANNE_4] = { #line 14249 .trainerName = _("ROXANNE"), @@ -35876,7 +35871,7 @@ F_TRAINER_FEMALE | }, }, #line 14298 - [TRAINER_ROXANNE_5] = + [DIFFICULTY_NORMAL][TRAINER_ROXANNE_5] = { #line 14299 .trainerName = _("ROXANNE"), @@ -36013,7 +36008,7 @@ F_TRAINER_FEMALE | }, }, #line 14356 - [TRAINER_BRAWLY_2] = + [DIFFICULTY_NORMAL][TRAINER_BRAWLY_2] = { #line 14357 .trainerName = _("BRAWLY"), @@ -36112,7 +36107,7 @@ F_TRAINER_FEMALE | }, }, #line 14398 - [TRAINER_BRAWLY_3] = + [DIFFICULTY_NORMAL][TRAINER_BRAWLY_3] = { #line 14399 .trainerName = _("BRAWLY"), @@ -36211,7 +36206,7 @@ F_TRAINER_FEMALE | }, }, #line 14440 - [TRAINER_BRAWLY_4] = + [DIFFICULTY_NORMAL][TRAINER_BRAWLY_4] = { #line 14441 .trainerName = _("BRAWLY"), @@ -36328,7 +36323,7 @@ F_TRAINER_FEMALE | }, }, #line 14490 - [TRAINER_BRAWLY_5] = + [DIFFICULTY_NORMAL][TRAINER_BRAWLY_5] = { #line 14491 .trainerName = _("BRAWLY"), @@ -36463,7 +36458,7 @@ F_TRAINER_FEMALE | }, }, #line 14548 - [TRAINER_WATTSON_2] = + [DIFFICULTY_NORMAL][TRAINER_WATTSON_2] = { #line 14549 .trainerName = _("WATTSON"), @@ -36562,7 +36557,7 @@ F_TRAINER_FEMALE | }, }, #line 14590 - [TRAINER_WATTSON_3] = + [DIFFICULTY_NORMAL][TRAINER_WATTSON_3] = { #line 14591 .trainerName = _("WATTSON"), @@ -36679,7 +36674,7 @@ F_TRAINER_FEMALE | }, }, #line 14640 - [TRAINER_WATTSON_4] = + [DIFFICULTY_NORMAL][TRAINER_WATTSON_4] = { #line 14641 .trainerName = _("WATTSON"), @@ -36796,7 +36791,7 @@ F_TRAINER_FEMALE | }, }, #line 14690 - [TRAINER_WATTSON_5] = + [DIFFICULTY_NORMAL][TRAINER_WATTSON_5] = { #line 14691 .trainerName = _("WATTSON"), @@ -36931,7 +36926,7 @@ F_TRAINER_FEMALE | }, }, #line 14748 - [TRAINER_FLANNERY_2] = + [DIFFICULTY_NORMAL][TRAINER_FLANNERY_2] = { #line 14749 .trainerName = _("FLANNERY"), @@ -37034,7 +37029,7 @@ F_TRAINER_FEMALE | }, }, #line 14790 - [TRAINER_FLANNERY_3] = + [DIFFICULTY_NORMAL][TRAINER_FLANNERY_3] = { #line 14791 .trainerName = _("FLANNERY"), @@ -37155,7 +37150,7 @@ F_TRAINER_FEMALE | }, }, #line 14840 - [TRAINER_FLANNERY_4] = + [DIFFICULTY_NORMAL][TRAINER_FLANNERY_4] = { #line 14841 .trainerName = _("FLANNERY"), @@ -37294,7 +37289,7 @@ F_TRAINER_FEMALE | }, }, #line 14898 - [TRAINER_FLANNERY_5] = + [DIFFICULTY_NORMAL][TRAINER_FLANNERY_5] = { #line 14899 .trainerName = _("FLANNERY"), @@ -37433,7 +37428,7 @@ F_TRAINER_FEMALE | }, }, #line 14956 - [TRAINER_NORMAN_2] = + [DIFFICULTY_NORMAL][TRAINER_NORMAN_2] = { #line 14957 .trainerName = _("NORMAN"), @@ -37532,7 +37527,7 @@ F_TRAINER_FEMALE | }, }, #line 14998 - [TRAINER_NORMAN_3] = + [DIFFICULTY_NORMAL][TRAINER_NORMAN_3] = { #line 14999 .trainerName = _("NORMAN"), @@ -37649,7 +37644,7 @@ F_TRAINER_FEMALE | }, }, #line 15048 - [TRAINER_NORMAN_4] = + [DIFFICULTY_NORMAL][TRAINER_NORMAN_4] = { #line 15049 .trainerName = _("NORMAN"), @@ -37766,7 +37761,7 @@ F_TRAINER_FEMALE | }, }, #line 15098 - [TRAINER_NORMAN_5] = + [DIFFICULTY_NORMAL][TRAINER_NORMAN_5] = { #line 15099 .trainerName = _("NORMAN"), @@ -37901,7 +37896,7 @@ F_TRAINER_FEMALE | }, }, #line 15156 - [TRAINER_WINONA_2] = + [DIFFICULTY_NORMAL][TRAINER_WINONA_2] = { #line 15157 .trainerName = _("WINONA"), @@ -38020,7 +38015,7 @@ F_TRAINER_FEMALE | }, }, #line 15206 - [TRAINER_WINONA_3] = + [DIFFICULTY_NORMAL][TRAINER_WINONA_3] = { #line 15207 .trainerName = _("WINONA"), @@ -38157,7 +38152,7 @@ F_TRAINER_FEMALE | }, }, #line 15264 - [TRAINER_WINONA_4] = + [DIFFICULTY_NORMAL][TRAINER_WINONA_4] = { #line 15265 .trainerName = _("WINONA"), @@ -38294,7 +38289,7 @@ F_TRAINER_FEMALE | }, }, #line 15322 - [TRAINER_WINONA_5] = + [DIFFICULTY_NORMAL][TRAINER_WINONA_5] = { #line 15323 .trainerName = _("WINONA"), @@ -38431,7 +38426,7 @@ F_TRAINER_FEMALE | }, }, #line 15380 - [TRAINER_TATE_AND_LIZA_2] = + [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_2] = { #line 15381 .trainerName = _("TATE&LIZA"), @@ -38550,7 +38545,7 @@ F_TRAINER_FEMALE | }, }, #line 15430 - [TRAINER_TATE_AND_LIZA_3] = + [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_3] = { #line 15431 .trainerName = _("TATE&LIZA"), @@ -38687,7 +38682,7 @@ F_TRAINER_FEMALE | }, }, #line 15488 - [TRAINER_TATE_AND_LIZA_4] = + [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_4] = { #line 15489 .trainerName = _("TATE&LIZA"), @@ -38824,7 +38819,7 @@ F_TRAINER_FEMALE | }, }, #line 15546 - [TRAINER_TATE_AND_LIZA_5] = + [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_5] = { #line 15547 .trainerName = _("TATE&LIZA"), @@ -38961,7 +38956,7 @@ F_TRAINER_FEMALE | }, }, #line 15604 - [TRAINER_JUAN_2] = + [DIFFICULTY_NORMAL][TRAINER_JUAN_2] = { #line 15605 .trainerName = _("JUAN"), @@ -39078,7 +39073,7 @@ F_TRAINER_FEMALE | }, }, #line 15654 - [TRAINER_JUAN_3] = + [DIFFICULTY_NORMAL][TRAINER_JUAN_3] = { #line 15655 .trainerName = _("JUAN"), @@ -39195,7 +39190,7 @@ F_TRAINER_FEMALE | }, }, #line 15704 - [TRAINER_JUAN_4] = + [DIFFICULTY_NORMAL][TRAINER_JUAN_4] = { #line 15705 .trainerName = _("JUAN"), @@ -39330,7 +39325,7 @@ F_TRAINER_FEMALE | }, }, #line 15762 - [TRAINER_JUAN_5] = + [DIFFICULTY_NORMAL][TRAINER_JUAN_5] = { #line 15763 .trainerName = _("JUAN"), @@ -39465,7 +39460,7 @@ F_TRAINER_FEMALE | }, }, #line 15820 - [TRAINER_ANGELO] = + [DIFFICULTY_NORMAL][TRAINER_ANGELO] = { #line 15821 .trainerName = _("ANGELO"), @@ -39520,7 +39515,7 @@ F_TRAINER_FEMALE | }, }, #line 15843 - [TRAINER_DARIUS] = + [DIFFICULTY_NORMAL][TRAINER_DARIUS] = { #line 15844 .trainerName = _("DARIUS"), @@ -39552,7 +39547,7 @@ F_TRAINER_FEMALE | }, }, #line 15856 - [TRAINER_STEVEN] = + [DIFFICULTY_NORMAL][TRAINER_STEVEN] = { #line 15857 .trainerName = _("STEVEN"), @@ -39685,7 +39680,7 @@ F_TRAINER_FEMALE | }, }, #line 15914 - [TRAINER_ANABEL] = + [DIFFICULTY_NORMAL][TRAINER_ANABEL] = { #line 15915 .trainerName = _("ANABEL"), @@ -39719,7 +39714,7 @@ F_TRAINER_FEMALE | }, }, #line 15927 - [TRAINER_TUCKER] = + [DIFFICULTY_NORMAL][TRAINER_TUCKER] = { #line 15928 .trainerName = _("TUCKER"), @@ -39751,7 +39746,7 @@ F_TRAINER_FEMALE | }, }, #line 15940 - [TRAINER_SPENSER] = + [DIFFICULTY_NORMAL][TRAINER_SPENSER] = { #line 15941 .trainerName = _("SPENSER"), @@ -39783,7 +39778,7 @@ F_TRAINER_FEMALE | }, }, #line 15953 - [TRAINER_GRETA] = + [DIFFICULTY_NORMAL][TRAINER_GRETA] = { #line 15954 .trainerName = _("GRETA"), @@ -39817,7 +39812,7 @@ F_TRAINER_FEMALE | }, }, #line 15966 - [TRAINER_NOLAND] = + [DIFFICULTY_NORMAL][TRAINER_NOLAND] = { #line 15967 .trainerName = _("NOLAND"), @@ -39849,7 +39844,7 @@ F_TRAINER_FEMALE | }, }, #line 15979 - [TRAINER_LUCY] = + [DIFFICULTY_NORMAL][TRAINER_LUCY] = { #line 15980 .trainerName = _("LUCY"), @@ -39883,7 +39878,7 @@ F_TRAINER_FEMALE | }, }, #line 15992 - [TRAINER_BRANDON] = + [DIFFICULTY_NORMAL][TRAINER_BRANDON] = { #line 15993 .trainerName = _("BRANDON"), @@ -39915,7 +39910,7 @@ F_TRAINER_FEMALE | }, }, #line 16005 - [TRAINER_ANDRES_2] = + [DIFFICULTY_NORMAL][TRAINER_ANDRES_2] = { #line 16006 .trainerName = _("ANDRES"), @@ -39958,7 +39953,7 @@ F_TRAINER_FEMALE | }, }, #line 16022 - [TRAINER_ANDRES_3] = + [DIFFICULTY_NORMAL][TRAINER_ANDRES_3] = { #line 16023 .trainerName = _("ANDRES"), @@ -40012,7 +40007,7 @@ F_TRAINER_FEMALE | }, }, #line 16043 - [TRAINER_ANDRES_4] = + [DIFFICULTY_NORMAL][TRAINER_ANDRES_4] = { #line 16044 .trainerName = _("ANDRES"), @@ -40066,7 +40061,7 @@ F_TRAINER_FEMALE | }, }, #line 16064 - [TRAINER_ANDRES_5] = + [DIFFICULTY_NORMAL][TRAINER_ANDRES_5] = { #line 16065 .trainerName = _("ANDRES"), @@ -40120,7 +40115,7 @@ F_TRAINER_FEMALE | }, }, #line 16085 - [TRAINER_CORY_2] = + [DIFFICULTY_NORMAL][TRAINER_CORY_2] = { #line 16086 .trainerName = _("CORY"), @@ -40174,7 +40169,7 @@ F_TRAINER_FEMALE | }, }, #line 16106 - [TRAINER_CORY_3] = + [DIFFICULTY_NORMAL][TRAINER_CORY_3] = { #line 16107 .trainerName = _("CORY"), @@ -40228,7 +40223,7 @@ F_TRAINER_FEMALE | }, }, #line 16127 - [TRAINER_CORY_4] = + [DIFFICULTY_NORMAL][TRAINER_CORY_4] = { #line 16128 .trainerName = _("CORY"), @@ -40282,7 +40277,7 @@ F_TRAINER_FEMALE | }, }, #line 16148 - [TRAINER_CORY_5] = + [DIFFICULTY_NORMAL][TRAINER_CORY_5] = { #line 16149 .trainerName = _("CORY"), @@ -40336,7 +40331,7 @@ F_TRAINER_FEMALE | }, }, #line 16169 - [TRAINER_PABLO_2] = + [DIFFICULTY_NORMAL][TRAINER_PABLO_2] = { #line 16170 .trainerName = _("PABLO"), @@ -40379,7 +40374,7 @@ F_TRAINER_FEMALE | }, }, #line 16186 - [TRAINER_PABLO_3] = + [DIFFICULTY_NORMAL][TRAINER_PABLO_3] = { #line 16187 .trainerName = _("PABLO"), @@ -40433,7 +40428,7 @@ F_TRAINER_FEMALE | }, }, #line 16207 - [TRAINER_PABLO_4] = + [DIFFICULTY_NORMAL][TRAINER_PABLO_4] = { #line 16208 .trainerName = _("PABLO"), @@ -40487,7 +40482,7 @@ F_TRAINER_FEMALE | }, }, #line 16228 - [TRAINER_PABLO_5] = + [DIFFICULTY_NORMAL][TRAINER_PABLO_5] = { #line 16229 .trainerName = _("PABLO"), @@ -40541,7 +40536,7 @@ F_TRAINER_FEMALE | }, }, #line 16249 - [TRAINER_KOJI_2] = + [DIFFICULTY_NORMAL][TRAINER_KOJI_2] = { #line 16250 .trainerName = _("KOJI"), @@ -40584,7 +40579,7 @@ F_TRAINER_FEMALE | }, }, #line 16266 - [TRAINER_KOJI_3] = + [DIFFICULTY_NORMAL][TRAINER_KOJI_3] = { #line 16267 .trainerName = _("KOJI"), @@ -40638,7 +40633,7 @@ F_TRAINER_FEMALE | }, }, #line 16287 - [TRAINER_KOJI_4] = + [DIFFICULTY_NORMAL][TRAINER_KOJI_4] = { #line 16288 .trainerName = _("KOJI"), @@ -40692,7 +40687,7 @@ F_TRAINER_FEMALE | }, }, #line 16308 - [TRAINER_KOJI_5] = + [DIFFICULTY_NORMAL][TRAINER_KOJI_5] = { #line 16309 .trainerName = _("KOJI"), @@ -40746,7 +40741,7 @@ F_TRAINER_FEMALE | }, }, #line 16329 - [TRAINER_CRISTIN_2] = + [DIFFICULTY_NORMAL][TRAINER_CRISTIN_2] = { #line 16330 .trainerName = _("CRISTIN"), @@ -40793,7 +40788,7 @@ F_TRAINER_FEMALE | }, }, #line 16347 - [TRAINER_CRISTIN_3] = + [DIFFICULTY_NORMAL][TRAINER_CRISTIN_3] = { #line 16348 .trainerName = _("CRISTIN"), @@ -40851,7 +40846,7 @@ F_TRAINER_FEMALE | }, }, #line 16369 - [TRAINER_CRISTIN_4] = + [DIFFICULTY_NORMAL][TRAINER_CRISTIN_4] = { #line 16370 .trainerName = _("CRISTIN"), @@ -40909,7 +40904,7 @@ F_TRAINER_FEMALE | }, }, #line 16391 - [TRAINER_CRISTIN_5] = + [DIFFICULTY_NORMAL][TRAINER_CRISTIN_5] = { #line 16392 .trainerName = _("CRISTIN"), @@ -40967,7 +40962,7 @@ F_TRAINER_FEMALE | }, }, #line 16413 - [TRAINER_FERNANDO_2] = + [DIFFICULTY_NORMAL][TRAINER_FERNANDO_2] = { #line 16414 .trainerName = _("FERNANDO"), @@ -41021,7 +41016,7 @@ F_TRAINER_FEMALE | }, }, #line 16434 - [TRAINER_FERNANDO_3] = + [DIFFICULTY_NORMAL][TRAINER_FERNANDO_3] = { #line 16435 .trainerName = _("FERNANDO"), @@ -41075,7 +41070,7 @@ F_TRAINER_FEMALE | }, }, #line 16455 - [TRAINER_FERNANDO_4] = + [DIFFICULTY_NORMAL][TRAINER_FERNANDO_4] = { #line 16456 .trainerName = _("FERNANDO"), @@ -41129,7 +41124,7 @@ F_TRAINER_FEMALE | }, }, #line 16476 - [TRAINER_FERNANDO_5] = + [DIFFICULTY_NORMAL][TRAINER_FERNANDO_5] = { #line 16477 .trainerName = _("FERNANDO"), @@ -41183,7 +41178,7 @@ F_TRAINER_FEMALE | }, }, #line 16497 - [TRAINER_SAWYER_2] = + [DIFFICULTY_NORMAL][TRAINER_SAWYER_2] = { #line 16498 .trainerName = _("SAWYER"), @@ -41226,7 +41221,7 @@ F_TRAINER_FEMALE | }, }, #line 16514 - [TRAINER_SAWYER_3] = + [DIFFICULTY_NORMAL][TRAINER_SAWYER_3] = { #line 16515 .trainerName = _("SAWYER"), @@ -41280,7 +41275,7 @@ F_TRAINER_FEMALE | }, }, #line 16535 - [TRAINER_SAWYER_4] = + [DIFFICULTY_NORMAL][TRAINER_SAWYER_4] = { #line 16536 .trainerName = _("SAWYER"), @@ -41334,7 +41329,7 @@ F_TRAINER_FEMALE | }, }, #line 16556 - [TRAINER_SAWYER_5] = + [DIFFICULTY_NORMAL][TRAINER_SAWYER_5] = { #line 16557 .trainerName = _("SAWYER"), @@ -41388,7 +41383,7 @@ F_TRAINER_FEMALE | }, }, #line 16577 - [TRAINER_GABRIELLE_2] = + [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_2] = { #line 16578 .trainerName = _("GABRIELLE"), @@ -41477,7 +41472,7 @@ F_TRAINER_FEMALE | }, }, #line 16610 - [TRAINER_GABRIELLE_3] = + [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_3] = { #line 16611 .trainerName = _("GABRIELLE"), @@ -41566,7 +41561,7 @@ F_TRAINER_FEMALE | }, }, #line 16643 - [TRAINER_GABRIELLE_4] = + [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_4] = { #line 16644 .trainerName = _("GABRIELLE"), @@ -41655,7 +41650,7 @@ F_TRAINER_FEMALE | }, }, #line 16676 - [TRAINER_GABRIELLE_5] = + [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_5] = { #line 16677 .trainerName = _("GABRIELLE"), @@ -41744,7 +41739,7 @@ F_TRAINER_FEMALE | }, }, #line 16709 - [TRAINER_THALIA_2] = + [DIFFICULTY_NORMAL][TRAINER_THALIA_2] = { #line 16710 .trainerName = _("THALIA"), @@ -41789,7 +41784,7 @@ F_TRAINER_FEMALE | }, }, #line 16726 - [TRAINER_THALIA_3] = + [DIFFICULTY_NORMAL][TRAINER_THALIA_3] = { #line 16727 .trainerName = _("THALIA"), @@ -41845,7 +41840,7 @@ F_TRAINER_FEMALE | }, }, #line 16747 - [TRAINER_THALIA_4] = + [DIFFICULTY_NORMAL][TRAINER_THALIA_4] = { #line 16748 .trainerName = _("THALIA"), @@ -41901,7 +41896,7 @@ F_TRAINER_FEMALE | }, }, #line 16768 - [TRAINER_THALIA_5] = + [DIFFICULTY_NORMAL][TRAINER_THALIA_5] = { #line 16769 .trainerName = _("THALIA"), @@ -41957,7 +41952,7 @@ F_TRAINER_FEMALE | }, }, #line 16789 - [TRAINER_MARIELA] = + [DIFFICULTY_NORMAL][TRAINER_MARIELA] = { #line 16790 .trainerName = _("MARIELA"), @@ -41989,7 +41984,7 @@ F_TRAINER_FEMALE | }, }, #line 16801 - [TRAINER_ALVARO] = + [DIFFICULTY_NORMAL][TRAINER_ALVARO] = { #line 16802 .trainerName = _("ALVARO"), @@ -42030,7 +42025,7 @@ F_TRAINER_FEMALE | }, }, #line 16817 - [TRAINER_EVERETT] = + [DIFFICULTY_NORMAL][TRAINER_EVERETT] = { #line 16818 .trainerName = _("EVERETT"), @@ -42060,7 +42055,7 @@ F_TRAINER_FEMALE | }, }, #line 16829 - [TRAINER_RED] = + [DIFFICULTY_NORMAL][TRAINER_RED] = { #line 16830 .trainerName = _("RED"), @@ -42090,7 +42085,7 @@ F_TRAINER_FEMALE | }, }, #line 16841 - [TRAINER_LEAF] = + [DIFFICULTY_NORMAL][TRAINER_LEAF] = { #line 16842 .trainerName = _("LEAF"), @@ -42122,7 +42117,7 @@ F_TRAINER_FEMALE | }, }, #line 16853 - [TRAINER_BRENDAN_PLACEHOLDER] = + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_PLACEHOLDER] = { #line 16854 .trainerName = _("BRENDAN"), @@ -42152,7 +42147,7 @@ F_TRAINER_FEMALE | }, }, #line 16865 - [TRAINER_MAY_PLACEHOLDER] = + [DIFFICULTY_NORMAL][TRAINER_MAY_PLACEHOLDER] = { #line 16866 .trainerName = _("MAY"), diff --git a/src/data/types_info.h b/src/data/types_info.h index d14012ed5c..ea962b4a44 100644 --- a/src/data/types_info.h +++ b/src/data/types_info.h @@ -40,10 +40,12 @@ const uq4_12_t gTypeEffectivenessTable[NUMBER_OF_MON_TYPES][NUMBER_OF_MON_TYPES] #undef ______ #undef X -// .generic is large enough that the text for TYPE_ELECTRIC will exceed TEXT_BUFF_ARRAY_COUNT. -// In this array there's commented-out data such as references to type-resist berries that would otherwise would go unused. -// However, we figured this information would be useful for users that want to add their own types as a reminder of -// what data would they need to add in order to have their new types be fully fledged like official types. +// Notes regarding custom data: +// - The "generic" field is large enough that the text for TYPE_ELECTRIC will exceed TEXT_BUFF_ARRAY_COUNT. +// - In this array there's commented-out data such as references to type-resist berries that would otherwise would go unused. +// However, we figured this information would be useful for users that want to add their own types as a reminder of +// what data would they need to add in order to have their new types be fully fledged like official types. +// - Changing "isHiddenPowerType" for any type will change the distribution of all Hidden Power types from vanilla. const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = { [TYPE_NONE] = @@ -56,6 +58,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_NormalTMHM, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = TRUE, + .isHiddenPowerType = FALSE, }, [TYPE_NORMAL] = { @@ -69,6 +72,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_NormalTMHM, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = FALSE, //.enhanceItem = ITEM_SILK_SCARF, //.berry = ITEM_CHILAN_BERRY, //.gem = ITEM_NORMAL_GEM, @@ -88,6 +92,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_FightingTMHM, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_BLACK_BELT, //.berry = ITEM_CHOPLE_BERRY, //.gem = ITEM_FIGHTING_GEM, @@ -109,6 +114,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_FlyingTMHM, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_SHARP_BEAK, //.berry = ITEM_COBA_BERRY, //.gem = ITEM_FLYING_GEM, @@ -130,6 +136,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_PoisonTMHM, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_POISON_BARB, //.berry = ITEM_KEBIA_BERRY, //.gem = ITEM_POISON_GEM, @@ -151,6 +158,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_GroundTMHM, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_SOFT_SAND, //.berry = ITEM_SHUCA_BERRY, //.gem = ITEM_GROUND_GEM, @@ -172,6 +180,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_RockTMHM, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_HARD_STONE, //.berry = ITEM_CHARTI_BERRY, //.gem = ITEM_ROCK_GEM, @@ -193,6 +202,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_BugTMHM, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_SILVER_POWDER, //.berry = ITEM_TANGA_BERRY, //.gem = ITEM_BUG_GEM, @@ -214,6 +224,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_GhostTMHM, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_SPELL_TAG, //.berry = ITEM_KASIB_BERRY, //.gem = ITEM_GHOST_GEM, @@ -235,6 +246,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_SteelTMHM, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_METAL_COAT, //.berry = ITEM_BABIRI_BERRY, //.gem = ITEM_STEEL_GEM, @@ -253,6 +265,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .damageCategory = DAMAGE_CATEGORY_SPECIAL, .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = TRUE, + .isHiddenPowerType = FALSE, }, [TYPE_FIRE] = { @@ -266,6 +279,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_FireTMHM, .useSecondTypeIconPalette = TRUE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_CHARCOAL, //.berry = ITEM_OCCA_BERRY, //.gem = ITEM_FIRE_GEM, @@ -287,6 +301,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_WaterTMHM, .useSecondTypeIconPalette = TRUE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_MYSTIC_WATER, //.berry = ITEM_PASSHO_BERRY, //.gem = ITEM_WATER_GEM, @@ -308,6 +323,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_GrassTMHM, .useSecondTypeIconPalette = TRUE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_MIRACLE_SEED, //.berry = ITEM_RINDO_BERRY, //.gem = ITEM_GRASS_GEM, @@ -329,6 +345,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_ElectricTMHM, .useSecondTypeIconPalette = TRUE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_MAGNET, //.berry = ITEM_WACAN_BERRY, //.gem = ITEM_ELECTRIC_GEM, @@ -350,6 +367,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_PsychicTMHM, .useSecondTypeIconPalette = TRUE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_TWISTED_SPOON, //.berry = ITEM_PAYAPA_BERRY, //.gem = ITEM_PSYCHIC_GEM, @@ -371,6 +389,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_IceTMHM, .useSecondTypeIconPalette = TRUE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_NEVER_MELT_ICE, //.berry = ITEM_YACHE_BERRY, //.gem = ITEM_ICE_GEM, @@ -392,6 +411,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_DragonTMHM, .useSecondTypeIconPalette = TRUE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_DRAGON_FANG, //.berry = ITEM_HABAN_BERRY, //.gem = ITEM_DRAGON_GEM, @@ -413,6 +433,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_DarkTMHM, .useSecondTypeIconPalette = TRUE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = TRUE, //.enhanceItem = ITEM_BLACK_GLASSES, //.berry = ITEM_COLBUR_BERRY, //.gem = ITEM_DARK_GEM, @@ -434,6 +455,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_FairyTMHM, .useSecondTypeIconPalette = TRUE, .isSpecialCaseType = FALSE, + .isHiddenPowerType = FALSE, //.enhanceItem = ITEM_FAIRY_FEATHER, //.berry = ITEM_ROSELI_BERRY, //.gem = ITEM_FAIRY_GEM, @@ -454,6 +476,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = .paletteTMHM = gItemIconPalette_NormalTMHM, // failsafe .useSecondTypeIconPalette = FALSE, .isSpecialCaseType = TRUE, + .isHiddenPowerType = FALSE, // .teraShard = ITEM_STELLAR_TERA_SHARD, }, }; diff --git a/src/data/wild_encounters.json.txt b/src/data/wild_encounters.json.txt index bf848249f0..20ac1c7889 100755 --- a/src/data/wild_encounters.json.txt +++ b/src/data/wild_encounters.json.txt @@ -64,8 +64,19 @@ const struct WildPokemon {{ encounter.base_label }}_FishingMons[] = const struct WildPokemonInfo {{ encounter.base_label }}_FishingMonsInfo = { {{encounter.fishing_mons.encounter_rate}}, {{ encounter.base_label }}_FishingMons }; {% endif %} -## endfor +{% if existsIn(encounter, "hidden_mons") %} +const struct WildPokemon {{ encounter.base_label }}_HiddenMons[] = +{ +## for wild_mon in encounter.hidden_mons.mons + { {{ wild_mon.min_level }}, {{ wild_mon.max_level }}, {{ wild_mon.species }} }, +## endfor +}; + +const struct WildPokemonInfo {{ encounter.base_label }}_HiddenMonsInfo = { {{encounter.hidden_mons.encounter_rate}}, {{ encounter.base_label }}_HiddenMons }; +{% endif %} + +## endfor const struct WildPokemonHeader {{ wild_encounter_group.label }}[] = { ## for encounter in wild_encounter_group.encounters @@ -76,6 +87,7 @@ const struct WildPokemonHeader {{ wild_encounter_group.label }}[] = .waterMonsInfo = {% if existsIn(encounter, "water_mons") %}&{{ encounter.base_label }}_WaterMonsInfo{% else %}NULL{% endif %}, .rockSmashMonsInfo = {% if existsIn(encounter, "rock_smash_mons") %}&{{ encounter.base_label }}_RockSmashMonsInfo{% else %}NULL{% endif %}, .fishingMonsInfo = {% if existsIn(encounter, "fishing_mons") %}&{{ encounter.base_label }}_FishingMonsInfo{% else %}NULL{% endif %}, + .hiddenMonsInfo = {% if existsIn(encounter, "hidden_mons") %}&{{ encounter.base_label }}_HiddenMonsInfo{% else %}NULL{% endif %}, }, ## endfor { @@ -85,6 +97,7 @@ const struct WildPokemonHeader {{ wild_encounter_group.label }}[] = .waterMonsInfo = NULL, .rockSmashMonsInfo = NULL, .fishingMonsInfo = NULL, + .hiddenMonsInfo = NULL, }, }; ## endfor diff --git a/src/daycare.c b/src/daycare.c index 49fce40c0a..8d2bf13545 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -34,7 +34,6 @@ static void ClearDaycareMonMail(struct DaycareMail *mail); static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare); static void DaycarePrintMonInfo(u8 windowId, u32 daycareSlotId, u8 y); static u8 ModifyBreedingScoreForOvalCharm(u8 score); -static u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves); static u16 GetEggSpecies(u16 species); // RAM buffers used to assist with BuildEggMoveset() @@ -261,6 +260,13 @@ void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycareMon) TakeMailFromMon(mon); } + u32 newSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_DEPOSIT, 0); + if (newSpecies != GetMonData(mon, MON_DATA_SPECIES)) + { + SetMonData(mon, MON_DATA_SPECIES, &newSpecies); + CalculateMonStats(mon); + } + daycareMon->mon = mon->box; daycareMon->steps = 0; ZeroMonData(mon); @@ -332,8 +338,8 @@ static void ApplyDaycareExperience(struct Pokemon *mon) static u16 TakeSelectedPokemonFromDaycare(struct DaycareMon *daycareMon) { - u16 species; - u16 newSpecies; + u32 species; + u32 newSpecies; u32 experience; struct Pokemon pokemon; @@ -342,7 +348,7 @@ static u16 TakeSelectedPokemonFromDaycare(struct DaycareMon *daycareMon) BoxMonToMon(&daycareMon->mon, &pokemon); newSpecies = GetFormChangeTargetSpecies(&pokemon, FORM_CHANGE_WITHDRAW, 0); - if (newSpecies != SPECIES_NONE) + if (newSpecies != species) { SetMonData(&pokemon, MON_DATA_SPECIES, &newSpecies); CalculateMonStats(&pokemon); @@ -544,14 +550,15 @@ static void _TriggerPendingDaycareEgg(struct DayCare *daycare) { s32 parent; s32 natureTries = 0; + rng_value_t personalityRand; - SeedRng2(gMain.vblankCounter2); + personalityRand = LocalRandomSeed(gMain.vblankCounter2); parent = GetParentToInheritNature(daycare); // don't inherit nature if (parent < 0) { - daycare->offspringPersonality = (Random2() << 16) | ((Random() % 0xfffe) + 1); + daycare->offspringPersonality = (LocalRandom(&personalityRand) << 16) | ((Random() % 0xfffe) + 1); } // inherit nature else @@ -561,7 +568,7 @@ static void _TriggerPendingDaycareEgg(struct DayCare *daycare) do { - personality = (Random2() << 16) | (Random()); + personality = (LocalRandom(&personalityRand) << 16) | (Random()); if (wantedNature == GetNatureFromPersonality(personality) && personality != 0) break; // found a personality with the same nature @@ -752,7 +759,7 @@ static void InheritAbility(struct Pokemon *egg, struct BoxPokemon *father, struc // Counts the number of egg moves a Pokémon learns and stores the moves in // the given array. -static u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves) +u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves) { u16 numEggMoves; u16 species; @@ -1584,4 +1591,3 @@ static u8 ModifyBreedingScoreForOvalCharm(u8 score) return score; } - diff --git a/src/debug.c b/src/debug.c index 9064dbb36c..8a20e6b2b1 100644 --- a/src/debug.c +++ b/src/debug.c @@ -100,6 +100,7 @@ enum UtilDebugMenu DEBUG_UTIL_MENU_ITEM_EXPANSION_VER, DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS, DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS, + DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI, }; enum GivePCBagDebugMenu @@ -158,6 +159,7 @@ enum FlagsVarsDebugMenu 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_GAME_CLEAR, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER, @@ -276,22 +278,12 @@ struct DebugMonData bool8 isShiny:1; u8 nature:5; u8 abilityNum:2; - u8 mon_iv_hp; - u8 mon_iv_atk; - u8 mon_iv_def; - u8 mon_iv_speed; - u8 mon_iv_satk; - u8 mon_iv_sdef; - u16 mon_move_0; - u16 mon_move_1; - u16 mon_move_2; - u16 mon_move_3; - u8 mon_ev_hp; - u8 mon_ev_atk; - u8 mon_ev_def; - u8 mon_ev_speed; - u8 mon_ev_satk; - u8 mon_ev_sdef; + u8 monIVs[NUM_STATS]; + u16 monMoves[MAX_MON_MOVES]; + u8 monEVs[NUM_STATS]; + u8 teraType; + u8 dynamaxLevel:7; + u8 gmaxFactor:1; }; struct DebugMenuListData @@ -377,6 +369,7 @@ static void DebugAction_Util_CheatStart(u8 taskId); static void DebugAction_Util_ExpansionVersion(u8 taskId); static void DebugAction_Util_BerryFunctions(u8 taskId); static void DebugAction_Util_CheckEWRAMCounters(u8 taskId); +static void DebugAction_Util_Steven_Multi(u8 taskId); static void DebugAction_OpenPCBagFillMenu(u8 taskId); static void DebugAction_PCBag_Fill_PCBoxes_Fast(u8 taskId); @@ -412,6 +405,7 @@ static void DebugAction_FlagsVars_SwitchPokeNav(u8 taskId); static void DebugAction_FlagsVars_SwitchMatchCall(u8 taskId); static void DebugAction_FlagsVars_ToggleFlyFlags(u8 taskId); static void DebugAction_FlagsVars_ToggleBadgeFlags(u8 taskId); +static void DebugAction_FlagsVars_ToggleGameClear(u8 taskId); static void DebugAction_FlagsVars_ToggleFrontierPass(u8 taskId); static void DebugAction_FlagsVars_CollisionOnOff(u8 taskId); static void DebugAction_FlagsVars_EncounterOnOff(u8 taskId); @@ -432,6 +426,9 @@ static void DebugAction_Give_Pokemon_SelectLevel(u8 taskId); static void DebugAction_Give_Pokemon_SelectShiny(u8 taskId); static void DebugAction_Give_Pokemon_SelectNature(u8 taskId); static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId); +static void DebugAction_Give_Pokemon_SelectTeraType(u8 taskId); +static void DebugAction_Give_Pokemon_SelectDynamaxLevel(u8 taskId); +static void DebugAction_Give_Pokemon_SelectGigantamaxFactor(u8 taskId); static void DebugAction_Give_Pokemon_SelectIVs(u8 taskId); static void DebugAction_Give_Pokemon_SelectEVs(u8 taskId); static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId); @@ -481,6 +478,7 @@ extern const u8 Debug_CheckROMSpace[]; extern const u8 Debug_BoxFilledMessage[]; extern const u8 Debug_ShowExpansionVersion[]; extern const u8 Debug_EventScript_EWRAMCounters[]; +extern const u8 Debug_EventScript_Steven_Multi[]; extern const u8 Debug_BerryPestsDisabled[]; extern const u8 Debug_BerryWeedsDisabled[]; @@ -498,188 +496,44 @@ 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…{CLEAR_TO 110}{RIGHT_ARROW}"); -static const u8 sDebugText_PCBag[] = _("PC/Bag…{CLEAR_TO 110}{RIGHT_ARROW}"); -static const u8 sDebugText_Party[] = _("Party…{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_Sound[] = _("Sound…{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"); // Util Menu -static const u8 sDebugText_Util_FlyToMap[] = _("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_SaveBlockSpace[] = _("Save Block space…{CLEAR_TO 110}{RIGHT_ARROW}"); -static const u8 sDebugText_Util_ROMSpace[] = _("ROM 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_FontTest[] = _("Font Test…{CLEAR_TO 110}{RIGHT_ARROW}"); -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_Player_Name[] = _("Player name"); -static const u8 sDebugText_Util_Player_Gender[] = _("Toggle gender"); -static const u8 sDebugText_Util_Player_Id[] = _("New Trainer ID"); -static const u8 sDebugText_Util_CheatStart[] = _("Cheat start"); -static const u8 sDebugText_Util_ExpansionVersion[] = _("Expansion Version"); -static const u8 sDebugText_Util_BerryFunctions[] = _("Berry Functions…{CLEAR_TO 110}{RIGHT_ARROW}"); -static const u8 sDebugText_Util_EWRAMCounters[] = _("EWRAM Counters…{CLEAR_TO 110}{RIGHT_ARROW}"); -// PC/Bag Menu -static const u8 sDebugText_PCBag_Fill[] = _("Fill…{CLEAR_TO 110}{RIGHT_ARROW}"); -static const u8 sDebugText_PCBag_Fill_Pc_Fast[] = _("Fill PC Boxes Fast"); -static const u8 sDebugText_PCBag_Fill_Pc_Slow[] = _("Fill PC Boxes Slow (LAG!)"); -static const u8 sDebugText_PCBag_Fill_Pc_Items[] = _("Fill PC Items"); -static const u8 sDebugText_PCBag_Fill_PocketItems[] = _("Fill Pocket Items"); -static const u8 sDebugText_PCBag_Fill_PocketPokeBalls[] = _("Fill Pocket Poké Balls"); -static const u8 sDebugText_PCBag_Fill_PocketTMHM[] = _("Fill Pocket TMHM"); -static const u8 sDebugText_PCBag_Fill_PocketBerries[] = _("Fill Pocket Berries"); -static const u8 sDebugText_PCBag_Fill_PocketKeyItems[] = _("Fill Pocket Key Items"); -static const u8 sDebugText_PCBag_AccessPC[] = _("Access PC"); -static const u8 sDebugText_PCBag_ClearBag[] = _("Clear Bag"); -static const u8 sDebugText_PCBag_ClearBoxes[] = _("Clear Storage Boxes"); -// Party/Boxes Menu -static const u8 sDebugText_Party_MoveReminder[] = _("Move Reminder"); -static const u8 sDebugText_Party_HatchAnEgg[] = _("Hatch an Egg"); -static const u8 sDebugText_Party_HealParty[] = _("Heal party"); -static const u8 sDebugText_Party_InflictStatus1[] = _("Inflict Status1"); -static const u8 sDebugText_Party_CheckEVs[] = _("Check EVs"); -static const u8 sDebugText_Party_CheckIVs[] = _("Check IVs"); -static const u8 sDebugText_Party_ClearParty[] = _("Clear Party"); // 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}National Dex"); -static const u8 sDebugText_FlagsVars_SwitchPokeNav[] = _("Toggle {STR_VAR_1}PokéNav"); -static const u8 sDebugText_FlagsVars_SwitchMatchCall[] = _("Toggle {STR_VAR_1}Match Call"); -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}Trainer See OFF"); -static const u8 sDebugText_FlagsVars_SwitchBagUse[] = _("Toggle {STR_VAR_1}Bag Use 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 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_GivePokemonSimple[] = _("Pokémon (Basic){CLEAR_TO 110}{RIGHT_ARROW}"); -static const u8 sDebugText_Give_GivePokemonComplex[] = _("Pokémon (Complex){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[] = _("Nature ID: {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[] = _("Ability Num: {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_PokemonEVs[] = _("All EVs:{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_IV_HP[] = _("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_IV_Attack[] = _("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_IV_Defense[] = _("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_IV_Speed[] = _("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_IV_SpAttack[] = _("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_IV_SpDefense[] = _("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_EV_HP[] = _("EV 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_EV_Attack[] = _("EV 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_EV_Defense[] = _("EV 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_EV_Speed[] = _("EV 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_EV_SpAttack[] = _("EV 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_EV_SpDefense[] = _("EV 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"); +static const u8 sDebugText_PokemonTeraType[] = _("Tera Type: {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_PokemonDynamaxLevel[] = _("Dmax Lvl:{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_PokemonGmaxFactor[] = _("Gmax Factor:{CLEAR_TO 90}\n {STR_VAR_2}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{CLEAR_TO 90}"); +static const u8 sDebugText_IVs[] = _("IV {STR_VAR_1}:{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_EVs[] = _("EV {STR_VAR_1}:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); // Sound Menu -static const u8 sDebugText_Sound_SFX[] = _("SFX…{CLEAR_TO 110}{RIGHT_ARROW}"); static const u8 sDebugText_Sound_SFX_ID[] = _("SFX ID: {STR_VAR_3} {START_BUTTON} Stop\n{STR_VAR_1} \n{STR_VAR_2}"); -static const u8 sDebugText_Sound_Music[] = _("Music…{CLEAR_TO 110}{RIGHT_ARROW}"); static const u8 sDebugText_Sound_Music_ID[] = _("Music ID: {STR_VAR_3} {START_BUTTON} Stop\n{STR_VAR_1} \n{STR_VAR_2}"); -// Berry Function Menu -static const u8 sDebugText_BerryFunctions_ClearAll[] = _("Clear map trees"); -static const u8 sDebugText_BerryFunctions_Ready[] = _("Ready map trees"); -static const u8 sDebugText_BerryFunctions_NextStage[] = _("Grow map trees"); -static const u8 sDebugText_BerryFunctions_Pests[] = _("Give map trees pests"); -static const u8 sDebugText_BerryFunctions_Weeds[] = _("Give map trees weeds"); -static const u8 sDebugText_Digit_1[] = _("{LEFT_ARROW}+1{RIGHT_ARROW} "); -static const u8 sDebugText_Digit_10[] = _("{LEFT_ARROW}+10{RIGHT_ARROW} "); -static const u8 sDebugText_Digit_100[] = _("{LEFT_ARROW}+100{RIGHT_ARROW} "); -static const u8 sDebugText_Digit_1000[] = _("{LEFT_ARROW}+1000{RIGHT_ARROW} "); -static const u8 sDebugText_Digit_10000[] = _("{LEFT_ARROW}+10000{RIGHT_ARROW} "); -static const u8 sDebugText_Digit_100000[] = _("{LEFT_ARROW}+100000{RIGHT_ARROW} "); -static const u8 sDebugText_Digit_1000000[] = _("{LEFT_ARROW}+1000000{RIGHT_ARROW} "); -static const u8 sDebugText_Digit_10000000[] = _("{LEFT_ARROW}+10000000{RIGHT_ARROW} "); const u8 *const gText_DigitIndicator[] = { - sDebugText_Digit_1, - sDebugText_Digit_10, - sDebugText_Digit_100, - sDebugText_Digit_1000, - sDebugText_Digit_10000, - sDebugText_Digit_100000, - sDebugText_Digit_1000000, - sDebugText_Digit_10000000 + COMPOUND_STRING("{LEFT_ARROW}+1{RIGHT_ARROW} "), + COMPOUND_STRING("{LEFT_ARROW}+10{RIGHT_ARROW} "), + COMPOUND_STRING("{LEFT_ARROW}+100{RIGHT_ARROW} "), + COMPOUND_STRING("{LEFT_ARROW}+1000{RIGHT_ARROW} "), + COMPOUND_STRING("{LEFT_ARROW}+10000{RIGHT_ARROW} "), + COMPOUND_STRING("{LEFT_ARROW}+100000{RIGHT_ARROW} "), + COMPOUND_STRING("{LEFT_ARROW}+1000000{RIGHT_ARROW} "), + COMPOUND_STRING("{LEFT_ARROW}+10000000{RIGHT_ARROW} "), }; static const s32 sPowersOfTen[] = @@ -700,171 +554,173 @@ 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_PCBAG] = {sDebugText_PCBag, DEBUG_MENU_ITEM_PCBAG}, - [DEBUG_MENU_ITEM_PARTY] = {sDebugText_Party, DEBUG_MENU_ITEM_PARTY}, - [DEBUG_MENU_ITEM_GIVE] = {sDebugText_Give, DEBUG_MENU_ITEM_GIVE}, - [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_SOUND] = {sDebugText_Sound, DEBUG_MENU_ITEM_SOUND}, - [DEBUG_MENU_ITEM_CANCEL] = {sDebugText_Cancel, DEBUG_MENU_ITEM_CANCEL}, + [DEBUG_MENU_ITEM_UTILITIES] = {COMPOUND_STRING("Utilities…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_UTILITIES}, + [DEBUG_MENU_ITEM_PCBAG] = {COMPOUND_STRING("PC/Bag…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PCBAG}, + [DEBUG_MENU_ITEM_PARTY] = {COMPOUND_STRING("Party…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PARTY}, + [DEBUG_MENU_ITEM_GIVE] = {COMPOUND_STRING("Give X…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_GIVE}, + [DEBUG_MENU_ITEM_SCRIPTS] = {COMPOUND_STRING("Scripts…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_SCRIPTS}, + [DEBUG_MENU_ITEM_FLAGVAR] = {COMPOUND_STRING("Flags & Vars…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_FLAGVAR}, + //[DEBUG_MENU_ITEM_BATTLE] = {COMPOUND_STRING("Battle Test{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_BATTLE}, + [DEBUG_MENU_ITEM_SOUND] = {COMPOUND_STRING("Sound…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_SOUND}, + [DEBUG_MENU_ITEM_CANCEL] = {COMPOUND_STRING("Cancel"), DEBUG_MENU_ITEM_CANCEL}, }; static const struct ListMenuItem sDebugMenu_Items_Utilities[] = { - [DEBUG_UTIL_MENU_ITEM_FLY] = {sDebugText_Util_FlyToMap, DEBUG_UTIL_MENU_ITEM_FLY}, - [DEBUG_UTIL_MENU_ITEM_WARP] = {sDebugText_Util_WarpToMap, DEBUG_UTIL_MENU_ITEM_WARP}, - [DEBUG_UTIL_MENU_ITEM_SAVEBLOCK] = {sDebugText_Util_SaveBlockSpace, DEBUG_UTIL_MENU_ITEM_SAVEBLOCK}, - [DEBUG_UTIL_MENU_ITEM_ROM_SPACE] = {sDebugText_Util_ROMSpace, DEBUG_UTIL_MENU_ITEM_ROM_SPACE}, - [DEBUG_UTIL_MENU_ITEM_WEATHER] = {sDebugText_Util_Weather, DEBUG_UTIL_MENU_ITEM_WEATHER}, - [DEBUG_UTIL_MENU_ITEM_FONT_TEST] = {sDebugText_Util_FontTest, DEBUG_UTIL_MENU_ITEM_FONT_TEST}, - [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_PLAYER_NAME] = {sDebugText_Util_Player_Name, DEBUG_UTIL_MENU_ITEM_PLAYER_NAME}, - [DEBUG_UTIL_MENU_ITEM_PLAYER_GENDER] = {sDebugText_Util_Player_Gender, DEBUG_UTIL_MENU_ITEM_PLAYER_GENDER}, - [DEBUG_UTIL_MENU_ITEM_PLAYER_ID] = {sDebugText_Util_Player_Id, DEBUG_UTIL_MENU_ITEM_PLAYER_ID}, - [DEBUG_UTIL_MENU_ITEM_CHEAT] = {sDebugText_Util_CheatStart, DEBUG_UTIL_MENU_ITEM_CHEAT}, - [DEBUG_UTIL_MENU_ITEM_EXPANSION_VER] = {sDebugText_Util_ExpansionVersion, DEBUG_UTIL_MENU_ITEM_EXPANSION_VER}, - [DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS] = {sDebugText_Util_BerryFunctions, DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS}, - [DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS] = {sDebugText_Util_EWRAMCounters, DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS}, + [DEBUG_UTIL_MENU_ITEM_FLY] = {COMPOUND_STRING("Fly to map…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_FLY}, + [DEBUG_UTIL_MENU_ITEM_WARP] = {COMPOUND_STRING("Warp to map warp…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WARP}, + [DEBUG_UTIL_MENU_ITEM_SAVEBLOCK] = {COMPOUND_STRING("Save Block space…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_SAVEBLOCK}, + [DEBUG_UTIL_MENU_ITEM_ROM_SPACE] = {COMPOUND_STRING("ROM space…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_ROM_SPACE}, + [DEBUG_UTIL_MENU_ITEM_WEATHER] = {COMPOUND_STRING("Set weather…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WEATHER}, + [DEBUG_UTIL_MENU_ITEM_FONT_TEST] = {COMPOUND_STRING("Font Test…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_FONT_TEST}, + [DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK] = {COMPOUND_STRING("Check wall clock…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK}, + [DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK] = {COMPOUND_STRING("Set wall clock…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK}, + [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = {COMPOUND_STRING("Watch credits…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WATCHCREDITS}, + [DEBUG_UTIL_MENU_ITEM_PLAYER_NAME] = {COMPOUND_STRING("Player name"), DEBUG_UTIL_MENU_ITEM_PLAYER_NAME}, + [DEBUG_UTIL_MENU_ITEM_PLAYER_GENDER] = {COMPOUND_STRING("Toggle gender"), DEBUG_UTIL_MENU_ITEM_PLAYER_GENDER}, + [DEBUG_UTIL_MENU_ITEM_PLAYER_ID] = {COMPOUND_STRING("New Trainer ID"), DEBUG_UTIL_MENU_ITEM_PLAYER_ID}, + [DEBUG_UTIL_MENU_ITEM_CHEAT] = {COMPOUND_STRING("Cheat start"), DEBUG_UTIL_MENU_ITEM_CHEAT}, + [DEBUG_UTIL_MENU_ITEM_EXPANSION_VER] = {COMPOUND_STRING("Expansion Version"), DEBUG_UTIL_MENU_ITEM_EXPANSION_VER}, + [DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS] = {COMPOUND_STRING("Berry Functions…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS}, + [DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS] = {COMPOUND_STRING("EWRAM Counters…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS}, + [DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI] = {COMPOUND_STRING("Steven Multi"), DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI}, }; static const struct ListMenuItem sDebugMenu_Items_PCBag[] = { - [DEBUG_PCBAG_MENU_ITEM_ACCESS_PC] = {sDebugText_PCBag_AccessPC, DEBUG_PCBAG_MENU_ITEM_ACCESS_PC}, - [DEBUG_PCBAG_MENU_ITEM_FILL] = {sDebugText_PCBag_Fill, DEBUG_PCBAG_MENU_ITEM_FILL}, - [DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG] = {sDebugText_PCBag_ClearBag, DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG}, - [DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES] = {sDebugText_PCBag_ClearBoxes, DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES}, + [DEBUG_PCBAG_MENU_ITEM_ACCESS_PC] = {COMPOUND_STRING("Access PC"), DEBUG_PCBAG_MENU_ITEM_ACCESS_PC}, + [DEBUG_PCBAG_MENU_ITEM_FILL] = {COMPOUND_STRING("Fill…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_PCBAG_MENU_ITEM_FILL}, + [DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG] = {COMPOUND_STRING("Clear Bag"), DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG}, + [DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES] = {COMPOUND_STRING("Clear Storage Boxes"), DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES}, }; static const struct ListMenuItem sDebugMenu_Items_PCBag_Fill[] = { - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST] = {sDebugText_PCBag_Fill_Pc_Fast, DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST}, - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW] = {sDebugText_PCBag_Fill_Pc_Slow, DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW}, - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS] = {sDebugText_PCBag_Fill_Pc_Items , DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS] = {sDebugText_PCBag_Fill_PocketItems, DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS] = {sDebugText_PCBag_Fill_PocketPokeBalls, DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM] = {sDebugText_PCBag_Fill_PocketTMHM, DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES] = {sDebugText_PCBag_Fill_PocketBerries, DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS] = {sDebugText_PCBag_Fill_PocketKeyItems, DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS}, + [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST] = {COMPOUND_STRING("Fill PC Boxes Fast"), DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST}, + [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW] = {COMPOUND_STRING("Fill PC Boxes Slow (LAG!)"), DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW}, + [DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS] = {COMPOUND_STRING("Fill PC Items") , DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS}, + [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS] = {COMPOUND_STRING("Fill Pocket Items"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS}, + [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS] = {COMPOUND_STRING("Fill Pocket Poké Balls"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS}, + [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM] = {COMPOUND_STRING("Fill Pocket TMHM"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM}, + [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES] = {COMPOUND_STRING("Fill Pocket Berries"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES}, + [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS] = {COMPOUND_STRING("Fill Pocket Key Items"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS}, }; static const struct ListMenuItem sDebugMenu_Items_Party[] = { - [DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER] = {sDebugText_Party_MoveReminder, DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER}, - [DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG] = {sDebugText_Party_HatchAnEgg, DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG}, - [DEBUG_PARTY_MENU_ITEM_HEAL_PARTY] = {sDebugText_Party_HealParty, DEBUG_PARTY_MENU_ITEM_HEAL_PARTY}, - [DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1] = {sDebugText_Party_InflictStatus1, DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1}, - [DEBUG_PARTY_MENU_ITEM_CHECK_EVS] = {sDebugText_Party_CheckEVs, DEBUG_PARTY_MENU_ITEM_CHECK_EVS}, - [DEBUG_PARTY_MENU_ITEM_CHECK_IVS] = {sDebugText_Party_CheckIVs, DEBUG_PARTY_MENU_ITEM_CHECK_IVS}, - [DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY] = {sDebugText_Party_ClearParty, DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY}, + [DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER] = {COMPOUND_STRING("Move Reminder"), DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER}, + [DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG] = {COMPOUND_STRING("Hatch an Egg"), DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG}, + [DEBUG_PARTY_MENU_ITEM_HEAL_PARTY] = {COMPOUND_STRING("Heal party"), DEBUG_PARTY_MENU_ITEM_HEAL_PARTY}, + [DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1] = {COMPOUND_STRING("Inflict Status1"), DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1}, + [DEBUG_PARTY_MENU_ITEM_CHECK_EVS] = {COMPOUND_STRING("Check EVs"), DEBUG_PARTY_MENU_ITEM_CHECK_EVS}, + [DEBUG_PARTY_MENU_ITEM_CHECK_IVS] = {COMPOUND_STRING("Check IVs"), DEBUG_PARTY_MENU_ITEM_CHECK_IVS}, + [DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY] = {COMPOUND_STRING("Clear Party"), DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY}, }; 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] = {COMPOUND_STRING("Script 1"), DEBUG_UTIL_MENU_ITEM_SCRIPT_1}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_2] = {COMPOUND_STRING("Script 2"), DEBUG_UTIL_MENU_ITEM_SCRIPT_2}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_3] = {COMPOUND_STRING("Script 3"), DEBUG_UTIL_MENU_ITEM_SCRIPT_3}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_4] = {COMPOUND_STRING("Script 4"), DEBUG_UTIL_MENU_ITEM_SCRIPT_4}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_5] = {COMPOUND_STRING("Script 5"), DEBUG_UTIL_MENU_ITEM_SCRIPT_5}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_6] = {COMPOUND_STRING("Script 6"), DEBUG_UTIL_MENU_ITEM_SCRIPT_6}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_7] = {COMPOUND_STRING("Script 7"), DEBUG_UTIL_MENU_ITEM_SCRIPT_7}, + [DEBUG_UTIL_MENU_ITEM_SCRIPT_8] = {COMPOUND_STRING("Script 8"), DEBUG_UTIL_MENU_ITEM_SCRIPT_8}, }; static const struct ListMenuItem sDebugMenu_Items_FlagsVars[] = { - [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_MATCH_CALL] = {sDebugText_FlagsVars_SwitchMatchCall, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL}, - [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_COLLISION] = {sDebugText_FlagsVars_SwitchCollision, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION}, - [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}, + [DEBUG_FLAGVAR_MENU_ITEM_FLAGS] = {COMPOUND_STRING("Set Flag XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_FLAGVAR_MENU_ITEM_FLAGS}, + [DEBUG_FLAGVAR_MENU_ITEM_VARS] = {COMPOUND_STRING("Set Var XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_FLAGVAR_MENU_ITEM_VARS}, + [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL] = {COMPOUND_STRING("Pokédex Flags All"), DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL}, + [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET] = {COMPOUND_STRING("Pokédex Flags Reset"), DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = {COMPOUND_STRING("Toggle {STR_VAR_1}Pokédex"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = {COMPOUND_STRING("Toggle {STR_VAR_1}National Dex"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = {COMPOUND_STRING("Toggle {STR_VAR_1}PokéNav"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL] = {COMPOUND_STRING("Toggle {STR_VAR_1}Match Call"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = {COMPOUND_STRING("Toggle {STR_VAR_1}Running Shoes"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = {COMPOUND_STRING("Toggle {STR_VAR_1}Fly Flags"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = {COMPOUND_STRING("Toggle {STR_VAR_1}All badges"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR] = {COMPOUND_STRING("Toggle {STR_VAR_1}Game clear"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = {COMPOUND_STRING("Toggle {STR_VAR_1}Frontier Pass"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = {COMPOUND_STRING("Toggle {STR_VAR_1}Collision OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = {COMPOUND_STRING("Toggle {STR_VAR_1}Encounter OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = {COMPOUND_STRING("Toggle {STR_VAR_1}Trainer See OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = {COMPOUND_STRING("Toggle {STR_VAR_1}Bag Use OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE}, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = {COMPOUND_STRING("Toggle {STR_VAR_1}Catching OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING}, }; static const struct ListMenuItem sDebugMenu_Items_Battle_0[] = { - [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}, + [DEBUG_BATTLE_0_MENU_ITEM_WILD] = {COMPOUND_STRING("Wild…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_WILD}, + [DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE] = {COMPOUND_STRING("Wild Double…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE}, + [DEBUG_BATTLE_0_MENU_ITEM_SINGLE] = {COMPOUND_STRING("Single…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_SINGLE}, + [DEBUG_BATTLE_0_MENU_ITEM_DOUBLE] = {COMPOUND_STRING("Double…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_DOUBLE}, + [DEBUG_BATTLE_0_MENU_ITEM_MULTI] = {COMPOUND_STRING("Multi…{CLEAR_TO 110}{RIGHT_ARROW}"), 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}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00] = {COMPOUND_STRING("{STR_VAR_1}Check bad move"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01] = {COMPOUND_STRING("{STR_VAR_1}Try to faint"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_02] = {COMPOUND_STRING("{STR_VAR_1}Check viability"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_02}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_03] = {COMPOUND_STRING("{STR_VAR_1}Setup first turn"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_03}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_04] = {COMPOUND_STRING("{STR_VAR_1}Risky"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_04}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_05] = {COMPOUND_STRING("{STR_VAR_1}Prefer strongest move"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_05}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_06] = {COMPOUND_STRING("{STR_VAR_1}Prefer Baton Pass"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_06}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_07] = {COMPOUND_STRING("{STR_VAR_1}Double battle"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_07}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_08] = {COMPOUND_STRING("{STR_VAR_1}HP aware"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_08}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_09] = {COMPOUND_STRING("{STR_VAR_1}Negate Unaware"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_09}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_10] = {COMPOUND_STRING("{STR_VAR_1}Will suicide"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_10}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_11] = {COMPOUND_STRING("{STR_VAR_1}Help partner"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_11}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_12] = {COMPOUND_STRING("{STR_VAR_1}Prefer status moves"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_12}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_13] = {COMPOUND_STRING("{STR_VAR_1}Stall"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_13}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_14] = {COMPOUND_STRING("{STR_VAR_1}Screener"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_14}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_15] = {COMPOUND_STRING("{STR_VAR_1}Smart switching"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_15}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_16] = {COMPOUND_STRING("{STR_VAR_1}Ace pokemon"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_16}, + [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_17] = {COMPOUND_STRING("{STR_VAR_1}Omniscient"), 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}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0] = {COMPOUND_STRING("Grass…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1] = {COMPOUND_STRING("Long grass…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2] = {COMPOUND_STRING("Sand…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3] = {COMPOUND_STRING("Underwater…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4] = {COMPOUND_STRING("Water…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5] = {COMPOUND_STRING("Pond…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6] = {COMPOUND_STRING("Mountain…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7] = {COMPOUND_STRING("Cave…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8] = {COMPOUND_STRING("Building…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8}, + [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9] = {COMPOUND_STRING("Plain…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9}, }; static const struct ListMenuItem sDebugMenu_Items_Give[] = { - [DEBUG_GIVE_MENU_ITEM_ITEM_X] = {sDebugText_Give_GiveItem, DEBUG_GIVE_MENU_ITEM_ITEM_X}, - [DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE] = {sDebugText_Give_GivePokemonSimple, DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE}, - [DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX] = {sDebugText_Give_GivePokemonComplex, DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX}, - [DEBUG_GIVE_MENU_ITEM_MAX_MONEY] = {sDebugText_Give_MaxMoney, DEBUG_GIVE_MENU_ITEM_MAX_MONEY}, - [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_ITEM_X] = {COMPOUND_STRING("Give item XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_GIVE_MENU_ITEM_ITEM_X}, + [DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE] = {COMPOUND_STRING("Pokémon (Basic){CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE}, + [DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX] = {COMPOUND_STRING("Pokémon (Complex){CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX}, + [DEBUG_GIVE_MENU_ITEM_MAX_MONEY] = {COMPOUND_STRING("Max Money"), DEBUG_GIVE_MENU_ITEM_MAX_MONEY}, + [DEBUG_GIVE_MENU_ITEM_MAX_COINS] = {COMPOUND_STRING("Max Coins"), DEBUG_GIVE_MENU_ITEM_MAX_COINS}, + [DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS] = {COMPOUND_STRING("Max Battle Points"), DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS}, + [DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG] = {COMPOUND_STRING("Daycare Egg"), DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG}, }; static const struct ListMenuItem sDebugMenu_Items_Sound[] = { - [DEBUG_SOUND_MENU_ITEM_SE] = {sDebugText_Sound_SFX, DEBUG_SOUND_MENU_ITEM_SE}, - [DEBUG_SOUND_MENU_ITEM_MUS] = {sDebugText_Sound_Music, DEBUG_SOUND_MENU_ITEM_MUS}, + [DEBUG_SOUND_MENU_ITEM_SE] = {COMPOUND_STRING("SFX…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_SOUND_MENU_ITEM_SE}, + [DEBUG_SOUND_MENU_ITEM_MUS] = {COMPOUND_STRING("Music…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_SOUND_MENU_ITEM_MUS}, }; static const struct ListMenuItem sDebugMenu_Items_BerryFunctions[] = { - [DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL] = {sDebugText_BerryFunctions_ClearAll, DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL}, - [DEBUG_BERRY_FUNCTIONS_MENU_READY] = {sDebugText_BerryFunctions_Ready, DEBUG_BERRY_FUNCTIONS_MENU_READY}, - [DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE] = {sDebugText_BerryFunctions_NextStage, DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE}, - [DEBUG_BERRY_FUNCTIONS_MENU_PESTS] = {sDebugText_BerryFunctions_Pests, DEBUG_BERRY_FUNCTIONS_MENU_PESTS}, - [DEBUG_BERRY_FUNCTIONS_MENU_WEEDS] = {sDebugText_BerryFunctions_Weeds, DEBUG_BERRY_FUNCTIONS_MENU_WEEDS}, + [DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL] = {COMPOUND_STRING("Clear map trees"), DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL}, + [DEBUG_BERRY_FUNCTIONS_MENU_READY] = {COMPOUND_STRING("Ready map trees"), DEBUG_BERRY_FUNCTIONS_MENU_READY}, + [DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE] = {COMPOUND_STRING("Grow map trees"), DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE}, + [DEBUG_BERRY_FUNCTIONS_MENU_PESTS] = {COMPOUND_STRING("Give map trees pests"), DEBUG_BERRY_FUNCTIONS_MENU_PESTS}, + [DEBUG_BERRY_FUNCTIONS_MENU_WEEDS] = {COMPOUND_STRING("Give map trees weeds"), DEBUG_BERRY_FUNCTIONS_MENU_WEEDS}, }; // ******************************* @@ -900,6 +756,7 @@ static void (*const sDebugMenu_Actions_Utilities[])(u8) = [DEBUG_UTIL_MENU_ITEM_EXPANSION_VER] = DebugAction_Util_ExpansionVersion, [DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS] = DebugAction_Util_BerryFunctions, [DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS] = DebugAction_Util_CheckEWRAMCounters, + [DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI] = DebugAction_Util_Steven_Multi, }; static void (*const sDebugMenu_Actions_PCBag[])(u8) = @@ -958,6 +815,7 @@ static void (*const sDebugMenu_Actions_Flags[])(u8) = [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_GAME_CLEAR] = DebugAction_FlagsVars_ToggleGameClear, [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = DebugAction_FlagsVars_ToggleFrontierPass, [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = DebugAction_FlagsVars_CollisionOnOff, [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = DebugAction_FlagsVars_EncounterOnOff, @@ -1237,6 +1095,32 @@ static void Debug_DestroyMenu_Full_Script(u8 taskId, const u8 *script) ScriptContext_SetupScript(script); } +static void Debug_HandleInput_Numeric(u8 taskId, s32 min, s32 max, u32 digits) +{ + if (JOY_NEW(DPAD_UP)) + { + gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; + if (gTasks[taskId].tInput > max) + gTasks[taskId].tInput = max; + } + if (JOY_NEW(DPAD_DOWN)) + { + gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; + if (gTasks[taskId].tInput < min) + gTasks[taskId].tInput = min; + } + if (JOY_NEW(DPAD_LEFT)) + { + if (gTasks[taskId].tDigit > 0) + gTasks[taskId].tDigit -= 1; + } + if (JOY_NEW(DPAD_RIGHT)) + { + if (gTasks[taskId].tDigit < digits - 1) + gTasks[taskId].tDigit += 1; + } +} + static void DebugAction_Cancel(u8 taskId) { Debug_DestroyMenu_Full(taskId); @@ -1257,6 +1141,29 @@ static void DebugAction_DestroyExtraWindow(u8 taskId) UnfreezeObjectEvents(); } + +static const u16 sLocationFlags[] = +{ + FLAG_VISITED_LITTLEROOT_TOWN, + FLAG_VISITED_OLDALE_TOWN, + FLAG_VISITED_DEWFORD_TOWN, + FLAG_VISITED_LAVARIDGE_TOWN, + FLAG_VISITED_FALLARBOR_TOWN, + FLAG_VISITED_VERDANTURF_TOWN, + FLAG_VISITED_PACIFIDLOG_TOWN, + FLAG_VISITED_PETALBURG_CITY, + FLAG_VISITED_SLATEPORT_CITY, + FLAG_VISITED_MAUVILLE_CITY, + FLAG_VISITED_RUSTBORO_CITY, + FLAG_VISITED_FORTREE_CITY, + FLAG_VISITED_LILYCOVE_CITY, + FLAG_VISITED_MOSSDEEP_CITY, + FLAG_VISITED_SOOTOPOLIS_CITY, + FLAG_VISITED_EVER_GRANDE_CITY, + FLAG_LANDMARK_POKEMON_LEAGUE, + FLAG_LANDMARK_BATTLE_FRONTIER, +}; + static u8 Debug_CheckToggleFlags(u8 id) { u8 result = FALSE; @@ -1279,34 +1186,29 @@ static u8 Debug_CheckToggleFlags(u8 id) 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); + result = TRUE; + for (u32 i = 0; i < ARRAY_COUNT(sLocationFlags); i++) + { + if (!FlagGet(sLocationFlags[i])) + { + result = FALSE; + break; + } + } 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); + result = TRUE; + for (u32 i = 0; i < ARRAY_COUNT(gBadgeFlags); i++) + { + if (!FlagGet(gBadgeFlags[i])) + { + result = FALSE; + break; + } + } + break; + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR: + result = FlagGet(FLAG_SYS_GAME_CLEAR); break; case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS: result = FlagGet(FLAG_SYS_FRONTIER_PASS); @@ -1498,7 +1400,7 @@ static void DebugTask_HandleMenuInput_Main(u8 taskId) } } -static void DebugTask_HandleMenuInput_Utilities(u8 taskId) +static void DebugTask_HandleMenuInput_General(u8 taskId, const void (*const actions[])(u8), void (*callbackInput)(u8), struct ListMenuTemplate callbackMenuTemplate) { void (*func)(u8); u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); @@ -1506,91 +1408,40 @@ static void DebugTask_HandleMenuInput_Utilities(u8 taskId) if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Utilities[input]) != NULL) + if ((func = actions[input]) != NULL) func(taskId); } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); + Debug_ShowMenu(callbackInput, callbackMenuTemplate); } } +static void DebugTask_HandleMenuInput_Utilities(u8 taskId) +{ + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Utilities, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); +} + static void DebugTask_HandleMenuInput_PCBag(u8 taskId) { - void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_PCBag[input]) != NULL) - func(taskId); - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); - } + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_PCBag, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); } static void DebugTask_HandleMenuInput_PCBag_Fill(u8 taskId) { - void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_PCBag_Fill[input]) != NULL) - func(taskId); - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_PCBag, sDebugMenu_ListTemplate_PCBag); - } + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_PCBag_Fill, DebugTask_HandleMenuInput_PCBag, sDebugMenu_ListTemplate_PCBag); } static void DebugTask_HandleMenuInput_Party(u8 taskId) { - void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Party[input]) != NULL) - func(taskId); - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); - } + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Party, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); } static void DebugTask_HandleMenuInput_Scripts(u8 taskId) { - void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Scripts[input]) != NULL) - func(taskId); - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); - } + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Scripts, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); } static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId) @@ -1787,59 +1638,17 @@ static void Debug_InitializeBattle(u8 taskId) static void DebugTask_HandleMenuInput_Give(u8 taskId) { - void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Give[input]) != NULL) - func(taskId); - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); - } + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Give, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); } static void DebugTask_HandleMenuInput_Sound(u8 taskId) { - void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Sound[input]) != NULL) - func(taskId); - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); - } + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Sound, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); } static void DebugTask_HandleMenuInput_BerryFunctions(u8 taskId) { - void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_BerryFunctions[input]) != NULL) - func(taskId); - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); - } + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_BerryFunctions, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); } // ******************************* @@ -1943,28 +1752,7 @@ static void DebugAction_Util_Warp_SelectMapGroup(u8 taskId) if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > LAST_MAP_GROUP) - gTasks[taskId].tInput = LAST_MAP_GROUP; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 0) - gTasks[taskId].tInput = 0; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < 2) - gTasks[taskId].tDigit += 1; - } + Debug_HandleInput_Numeric(taskId, 0, LAST_MAP_GROUP, 3); ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); ConvertIntToDecimalStringN(gStringVar2, LAST_MAP_GROUP, STR_CONV_MODE_LEADING_ZEROS, 3); @@ -2004,28 +1792,7 @@ static void DebugAction_Util_Warp_SelectMap(u8 taskId) if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > max_value - 1) - gTasks[taskId].tInput = max_value - 1; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 0) - gTasks[taskId].tInput = 0; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < 2) - gTasks[taskId].tDigit += 1; - } + Debug_HandleInput_Numeric(taskId, 0, max_value - 1, 3); ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, (max_value >= 100) ? 3 : 2); ConvertIntToDecimalStringN(gStringVar2, MAP_GROUP_COUNT[gTasks[taskId].tMapGroup] - 1, STR_CONV_MODE_LEADING_ZEROS, (max_value >= 100) ? 3 : 2); @@ -2196,7 +1963,7 @@ static void DebugAction_Util_CheckROMSpace(u8 taskId) ScriptContext_SetupScript(Debug_CheckROMSpace); } -static const u8 sWeatherNames[22][24] = { +static const u8 sWeatherNames[WEATHER_COUNT][24] = { [WEATHER_NONE] = _("NONE"), [WEATHER_SUNNY_CLOUDS] = _("SUNNY CLOUDS"), [WEATHER_SUNNY] = _("SUNNY"), @@ -2249,29 +2016,7 @@ static void DebugAction_Util_Weather_SelectId(u8 taskId) if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); - - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > WEATHER_ROUTE123_CYCLE) - gTasks[taskId].tInput = WEATHER_ROUTE123_CYCLE; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < WEATHER_NONE) - gTasks[taskId].tInput = WEATHER_NONE; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < 2) - gTasks[taskId].tDigit += 1; - } + Debug_HandleInput_Numeric(taskId, WEATHER_NONE, WEATHER_COUNT - 1, 3); StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); @@ -2360,6 +2105,11 @@ static void DebugAction_Util_ExpansionVersion(u8 taskId) ScriptContext_SetupScript(Debug_ShowExpansionVersion); } +static void DebugAction_Util_Steven_Multi(u8 taskId) +{ + Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Steven_Multi); +} + void BufferExpansionVersion(struct ScriptContext *ctx) { static const u8 sText_Released[] = _("\nRelease Build"); @@ -2421,6 +2171,20 @@ static void DebugAction_Util_Script_8(u8 taskId) // ******************************* // Actions Flags and Vars +static void Debug_Display_FlagInfo(u32 flag, u32 digit, u8 windowId) +{ + ConvertIntToDecimalStringN(gStringVar1, flag, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_FLAGS); + ConvertIntToHexStringN(gStringVar2, flag, STR_CONV_MODE_LEFT_ALIGN, 3); + StringExpandPlaceholders(gStringVar1, COMPOUND_STRING("{STR_VAR_1}{CLEAR_TO 90}\n0x{STR_VAR_2}{CLEAR_TO 90}")); + if (FlagGet(flag)) + StringCopyPadded(gStringVar2, sDebugText_True, CHAR_SPACE, 15); + else + StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); + StringCopy(gStringVar3, gText_DigitIndicator[digit]); + StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_Flag); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_FlagsVars_Flags(u8 taskId) { u8 windowId; @@ -2436,16 +2200,7 @@ static void DebugAction_FlagsVars_Flags(u8 taskId) CopyWindowToVram(windowId, COPYWIN_FULL); // 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_FlagsVars_FlagHex); - if (FlagGet(FLAG_TEMP_1)) - StringCopyPadded(gStringVar2, sDebugText_True, CHAR_SPACE, 15); - else - StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); - StringCopy(gStringVar3, gText_DigitIndicator[0]); - StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_Flag); - AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_FlagInfo(FLAG_TEMP_1, 0, windowId); gTasks[taskId].func = DebugAction_FlagsVars_FlagsSelect; gTasks[taskId].tSubWindowId = windowId; @@ -2466,47 +2221,12 @@ static void DebugAction_FlagsVars_FlagsSelect(u8 taskId) return; } - if (JOY_NEW(DPAD_UP)) - { - PlaySE(SE_SELECT); - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput >= FLAGS_COUNT) - gTasks[taskId].tInput = FLAGS_COUNT - 1; - } - if (JOY_NEW(DPAD_DOWN)) - { - PlaySE(SE_SELECT); - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 1) - gTasks[taskId].tInput = 1; - } - if (JOY_NEW(DPAD_LEFT)) - { - PlaySE(SE_SELECT); - gTasks[taskId].tDigit -= 1; - if (gTasks[taskId].tDigit < 0) - gTasks[taskId].tDigit = 0; - } - if (JOY_NEW(DPAD_RIGHT)) - { - PlaySE(SE_SELECT); - gTasks[taskId].tDigit += 1; - if (gTasks[taskId].tDigit > DEBUG_NUMBER_DIGITS_FLAGS - 1) - gTasks[taskId].tDigit = DEBUG_NUMBER_DIGITS_FLAGS - 1; - } + PlaySE(SE_SELECT); + Debug_HandleInput_Numeric(taskId, 1, FLAGS_COUNT - 1, DEBUG_NUMBER_DIGITS_FLAGS); if (JOY_NEW(DPAD_ANY) || JOY_NEW(A_BUTTON)) { - ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_FLAGS); - ConvertIntToHexStringN(gStringVar2, gTasks[taskId].tInput, STR_CONV_MODE_LEFT_ALIGN, 3); - StringExpandPlaceholders(gStringVar1, sDebugText_FlagsVars_FlagHex); - if (FlagGet(gTasks[taskId].tInput) == TRUE) - StringCopyPadded(gStringVar2, sDebugText_True, CHAR_SPACE, 15); - else - StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); - StringCopy(gStringVar3, gText_DigitIndicator[gTasks[taskId].tDigit]); - StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_Flag); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_FlagInfo(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } } @@ -2545,30 +2265,7 @@ static void DebugAction_FlagsVars_Vars(u8 taskId) static void DebugAction_FlagsVars_Select(u8 taskId) { - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > VARS_END) - gTasks[taskId].tInput = VARS_END; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < VARS_START) - gTasks[taskId].tInput = VARS_START; - } - if (JOY_NEW(DPAD_LEFT)) - { - gTasks[taskId].tDigit -= 1; - if (gTasks[taskId].tDigit < 0) - gTasks[taskId].tDigit = 0; - } - if (JOY_NEW(DPAD_RIGHT)) - { - gTasks[taskId].tDigit += 1; - if (gTasks[taskId].tDigit > DEBUG_NUMBER_DIGITS_VARIABLES - 1) - gTasks[taskId].tDigit = DEBUG_NUMBER_DIGITS_VARIABLES - 1; - } + Debug_HandleInput_Numeric(taskId, VARS_START, VARS_END, DEBUG_NUMBER_DIGITS_VARIABLES); if (JOY_NEW(DPAD_ANY)) { @@ -2788,80 +2485,46 @@ static void DebugAction_FlagsVars_RunningShoes(u8 taskId) static void DebugAction_FlagsVars_ToggleFlyFlags(u8 taskId) { - if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER)) + if (FlagGet(sLocationFlags[ARRAY_COUNT(sLocationFlags) - 1])) { 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); + for (u32 i = 0; i < ARRAY_COUNT(sLocationFlags); i++) + FlagClear(sLocationFlags[i]); } 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); + for (u32 i = 0; i < ARRAY_COUNT(sLocationFlags); i++) + FlagSet(sLocationFlags[i]); } } static void DebugAction_FlagsVars_ToggleBadgeFlags(u8 taskId) { - if (FlagGet(FLAG_BADGE08_GET)) + if (FlagGet(gBadgeFlags[ARRAY_COUNT(gBadgeFlags) - 1])) { PlaySE(SE_PC_OFF); - FlagClear(FLAG_BADGE01_GET); - FlagClear(FLAG_BADGE02_GET); - FlagClear(FLAG_BADGE03_GET); - FlagClear(FLAG_BADGE04_GET); - FlagClear(FLAG_BADGE05_GET); - FlagClear(FLAG_BADGE06_GET); - FlagClear(FLAG_BADGE07_GET); - FlagClear(FLAG_BADGE08_GET); + for (u32 i = 0; i < ARRAY_COUNT(gBadgeFlags); i++) + FlagClear(gBadgeFlags[i]); } else { PlaySE(SE_PC_LOGIN); - FlagSet(FLAG_BADGE01_GET); - FlagSet(FLAG_BADGE02_GET); - FlagSet(FLAG_BADGE03_GET); - FlagSet(FLAG_BADGE04_GET); - FlagSet(FLAG_BADGE05_GET); - FlagSet(FLAG_BADGE06_GET); - FlagSet(FLAG_BADGE07_GET); - FlagSet(FLAG_BADGE08_GET); + for (u32 i = 0; i < ARRAY_COUNT(gBadgeFlags); i++) + FlagSet(gBadgeFlags[i]); } } +static void DebugAction_FlagsVars_ToggleGameClear(u8 taskId) +{ + // Sound effect + if (FlagGet(FLAG_SYS_GAME_CLEAR)) + PlaySE(SE_PC_OFF); + else + PlaySE(SE_PC_LOGIN); + FlagToggle(FLAG_SYS_GAME_CLEAR); +} + static void DebugAction_FlagsVars_ToggleFrontierPass(u8 taskId) { // Sound effect @@ -2943,6 +2606,17 @@ static void DebugAction_FlagsVars_CatchingOnOff(u8 taskId) #define tItemId data[5] #define tSpriteId data[6] +static void Debug_Display_ItemInfo(u32 itemId, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + u8* end = CopyItemName(itemId, gStringVar1); + WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + ConvertIntToDecimalStringN(gStringVar3, itemId, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); + StringExpandPlaceholders(gStringVar4, sDebugText_ItemID); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_Give_Item(u8 taskId) { u8 windowId; @@ -2958,13 +2632,7 @@ static void DebugAction_Give_Item(u8 taskId) CopyWindowToVram(windowId, COPYWIN_FULL); // Display initial item - StringCopy(gStringVar2, gText_DigitIndicator[0]); - ConvertIntToDecimalStringN(gStringVar3, 1, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); - u8* end = CopyItemName(1, gStringVar1); - WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_ItemID); - AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_ItemInfo(1, 0, windowId); gTasks[taskId].func = DebugAction_Give_Item_SelectId; gTasks[taskId].tSubWindowId = windowId; @@ -2976,47 +2644,31 @@ static void DebugAction_Give_Item(u8 taskId) gSprites[gTasks[taskId].tSpriteId].oam.priority = 0; } +static void DestroyItemIcon(u8 taskId) +{ + FreeSpriteTilesByTag(ITEM_TAG); + FreeSpritePaletteByTag(ITEM_TAG); + FreeSpriteOamMatrix(&gSprites[gTasks[taskId].tSpriteId]); + DestroySprite(&gSprites[gTasks[taskId].tSpriteId]); +} + +static void Debug_Display_ItemQuantity(u32 quantity, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEM_QUANTITY); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar4, sDebugText_ItemQuantity); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_Give_Item_SelectId(u8 taskId) { if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); - - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput >= ITEMS_COUNT) - gTasks[taskId].tInput = ITEMS_COUNT - 1; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 1) - gTasks[taskId].tInput = 1; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < DEBUG_NUMBER_DIGITS_ITEMS - 1) - gTasks[taskId].tDigit += 1; - } - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - u8* end = CopyItemName(gTasks[taskId].tInput, gStringVar1); - WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(gTasks[taskId].tSubWindowId)); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); - StringExpandPlaceholders(gStringVar4, sDebugText_ItemID); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - - FreeSpriteTilesByTag(ITEM_TAG); //Destroy item icon - FreeSpritePaletteByTag(ITEM_TAG); //Destroy item icon - FreeSpriteOamMatrix(&gSprites[gTasks[taskId].tSpriteId]); //Destroy item icon - DestroySprite(&gSprites[gTasks[taskId].tSpriteId]); //Destroy item icon + Debug_HandleInput_Numeric(taskId, 1, ITEMS_COUNT - 1, DEBUG_NUMBER_DIGITS_ITEMS); + Debug_Display_ItemInfo(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); + DestroyItemIcon(taskId); gTasks[taskId].tSpriteId = AddItemIconSprite(ITEM_TAG, ITEM_TAG, gTasks[taskId].tInput); gSprites[gTasks[taskId].tSpriteId].x2 = DEBUG_NUMBER_ICON_X+10; gSprites[gTasks[taskId].tSpriteId].y2 = DEBUG_NUMBER_ICON_Y+10; @@ -3028,21 +2680,12 @@ static void DebugAction_Give_Item_SelectId(u8 taskId) gTasks[taskId].tItemId = gTasks[taskId].tInput; gTasks[taskId].tInput = 1; gTasks[taskId].tDigit = 0; - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEM_QUANTITY); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_ItemQuantity); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - + Debug_Display_ItemQuantity(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Item_SelectQuantity; } else if (JOY_NEW(B_BUTTON)) { - FreeSpriteTilesByTag(ITEM_TAG); //Destroy item icon - FreeSpritePaletteByTag(ITEM_TAG); //Destroy item icon - FreeSpriteOamMatrix(&gSprites[gTasks[taskId].tSpriteId]); //Destroy item icon - DestroySprite(&gSprites[gTasks[taskId].tSpriteId]); //Destroy item icon + DestroyItemIcon(taskId); PlaySE(SE_SELECT); DebugAction_DestroyExtraWindow(taskId); @@ -3056,43 +2699,13 @@ static void DebugAction_Give_Item_SelectQuantity(u8 taskId) if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); - - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > MAX_BAG_ITEM_CAPACITY) - gTasks[taskId].tInput = MAX_BAG_ITEM_CAPACITY; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 1) - gTasks[taskId].tInput = 1; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < MAX_ITEM_DIGITS) - gTasks[taskId].tDigit += 1; - } - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEM_QUANTITY); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_ItemQuantity); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_HandleInput_Numeric(taskId, 1, MAX_BAG_ITEM_CAPACITY, MAX_ITEM_DIGITS); + Debug_Display_ItemQuantity(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) { - FreeSpriteTilesByTag(ITEM_TAG); //Destroy item icon - FreeSpritePaletteByTag(ITEM_TAG); //Destroy item icon - FreeSpriteOamMatrix(&gSprites[gTasks[taskId].tSpriteId]); //Destroy item icon - DestroySprite(&gSprites[gTasks[taskId].tSpriteId]); //Destroy item icon + DestroyItemIcon(taskId); PlaySE(MUS_LEVEL_UP); AddBagItem(itemId, gTasks[taskId].tInput); @@ -3100,10 +2713,7 @@ static void DebugAction_Give_Item_SelectQuantity(u8 taskId) } else if (JOY_NEW(B_BUTTON)) { - FreeSpriteTilesByTag(ITEM_TAG); //Destroy item icon - FreeSpritePaletteByTag(ITEM_TAG); //Destroy item icon - FreeSpriteOamMatrix(&gSprites[gTasks[taskId].tSpriteId]); //Destroy item icon - DestroySprite(&gSprites[gTasks[taskId].tSpriteId]); //Destroy item icon + DestroyItemIcon(taskId); PlaySE(SE_SELECT); DebugAction_DestroyExtraWindow(taskId); @@ -3121,24 +2731,31 @@ static void ResetMonDataStruct(struct DebugMonData *sDebugMonData) sDebugMonData->isShiny = FALSE; sDebugMonData->nature = 0; sDebugMonData->abilityNum = 0; - sDebugMonData->mon_iv_hp = 0; - sDebugMonData->mon_iv_atk = 0; - sDebugMonData->mon_iv_def = 0; - sDebugMonData->mon_iv_speed = 0; - sDebugMonData->mon_iv_satk = 0; - sDebugMonData->mon_iv_sdef = 0; - sDebugMonData->mon_ev_hp = 0; - sDebugMonData->mon_ev_atk = 0; - sDebugMonData->mon_ev_def = 0; - sDebugMonData->mon_ev_speed = 0; - sDebugMonData->mon_ev_satk = 0; - sDebugMonData->mon_ev_sdef = 0; + sDebugMonData->teraType = TYPE_NONE; + sDebugMonData->dynamaxLevel = 0; + sDebugMonData->gmaxFactor = FALSE; + for (u32 i = 0; i < NUM_STATS; i++) + { + sDebugMonData->monIVs[i] = 0; + sDebugMonData->monEVs[i] = 0; + } } #define tIsComplex data[5] #define tSpriteId data[6] #define tIterator data[7] +static void Debug_Display_SpeciesInfo(u32 species, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + u8 *end = StringCopy(gStringVar1, GetSpeciesName(species)); + WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + ConvertIntToDecimalStringN(gStringVar3, species, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); + StringExpandPlaceholders(gStringVar4, sDebugText_PokemonID); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_Give_PokemonSimple(u8 taskId) { u8 windowId; @@ -3159,13 +2776,7 @@ static void DebugAction_Give_PokemonSimple(u8 taskId) CopyWindowToVram(windowId, COPYWIN_FULL); // Display initial Pokémon - StringCopy(gStringVar2, gText_DigitIndicator[0]); - ConvertIntToDecimalStringN(gStringVar3, sDebugMonData->species, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); - u8 *end = StringCopy(gStringVar1, GetSpeciesName(sDebugMonData->species)); - WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonID); - AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_SpeciesInfo(sDebugMonData->species, 0, windowId); //Set task data gTasks[taskId].func = DebugAction_Give_Pokemon_SelectId; @@ -3200,13 +2811,7 @@ static void DebugAction_Give_PokemonComplex(u8 taskId) CopyWindowToVram(windowId, COPYWIN_FULL); // Display initial Pokémon - StringCopy(gStringVar2, gText_DigitIndicator[0]); - ConvertIntToDecimalStringN(gStringVar3, sDebugMonData->species, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); - u8 *end = StringCopy(gStringVar1, GetSpeciesName(sDebugMonData->species)); - WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonID); - AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_SpeciesInfo(sDebugMonData->species, 0, windowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectId; gTasks[taskId].tSubWindowId = windowId; @@ -3226,38 +2831,8 @@ static void DebugAction_Give_Pokemon_SelectId(u8 taskId) if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); - - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput >= NUM_SPECIES) - gTasks[taskId].tInput = NUM_SPECIES - 1; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 1) - gTasks[taskId].tInput = 1; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < DEBUG_NUMBER_DIGITS_ITEMS - 1) - gTasks[taskId].tDigit += 1; - } - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - u8 *end = StringCopy(gStringVar1, GetSpeciesName(gTasks[taskId].tInput)); //CopyItemName(gTasks[taskId].tInput, gStringVar1); - WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(gTasks[taskId].tSubWindowId)); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonID); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - + Debug_HandleInput_Numeric(taskId, 1, NUM_SPECIES - 1, DEBUG_NUMBER_DIGITS_ITEMS); + Debug_Display_SpeciesInfo(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); FreeAndDestroyMonIconSprite(&gSprites[gTasks[taskId].tSpriteId]); FreeMonIconPalettes(); LoadMonIconPalette(gTasks[taskId].tInput); @@ -3294,29 +2869,7 @@ static void DebugAction_Give_Pokemon_SelectLevel(u8 taskId) if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); - - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > MAX_LEVEL) - gTasks[taskId].tInput = MAX_LEVEL; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 1) - gTasks[taskId].tInput = 1; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < 2) - gTasks[taskId].tDigit += 1; - } + Debug_HandleInput_Numeric(taskId, 1, MAX_LEVEL, 3); StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); @@ -3411,8 +2964,8 @@ static void DebugAction_Give_Pokemon_SelectNature(u8 taskId) if (JOY_NEW(DPAD_UP)) { gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > NUM_NATURES-1) - gTasks[taskId].tInput = NUM_NATURES-1; + if (gTasks[taskId].tInput > NUM_NATURES - 1) + gTasks[taskId].tInput = NUM_NATURES - 1; } if (JOY_NEW(DPAD_DOWN)) { @@ -3501,9 +3054,139 @@ static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_IV_HP); + StringCopy(gStringVar1, gTypesInfo[0].name); + StringExpandPlaceholders(gStringVar4, sDebugText_PokemonTeraType); AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + gTasks[taskId].func = DebugAction_Give_Pokemon_SelectTeraType; + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + Free(sDebugMonData); + DebugAction_DestroyExtraWindow(taskId); + } +} + +static void DebugAction_Give_Pokemon_SelectTeraType(u8 taskId) +{ + if (JOY_NEW(DPAD_ANY)) + { + PlaySE(SE_SELECT); + + if (JOY_NEW(DPAD_UP)) + { + gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; + if (gTasks[taskId].tInput > NUMBER_OF_MON_TYPES - 1) + gTasks[taskId].tInput = NUMBER_OF_MON_TYPES - 1; + } + if (JOY_NEW(DPAD_DOWN)) + { + gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; + if (gTasks[taskId].tInput < 0) + gTasks[taskId].tInput = 0; + } + + StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); + ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); + StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); + StringCopy(gStringVar1, gTypesInfo[gTasks[taskId].tInput].name); + StringExpandPlaceholders(gStringVar4, sDebugText_PokemonTeraType); + AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + } + + if (JOY_NEW(A_BUTTON)) + { + sDebugMonData->teraType = gTasks[taskId].tInput; + gTasks[taskId].tInput = 0; + gTasks[taskId].tDigit = 0; + + StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar4, sDebugText_PokemonDynamaxLevel); + AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + + gTasks[taskId].func = DebugAction_Give_Pokemon_SelectDynamaxLevel; + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + Free(sDebugMonData); + DebugAction_DestroyExtraWindow(taskId); + } +} + +static void DebugAction_Give_Pokemon_SelectDynamaxLevel(u8 taskId) +{ + if (JOY_NEW(DPAD_ANY)) + { + PlaySE(SE_SELECT); + Debug_HandleInput_Numeric(taskId, 0, MAX_DYNAMAX_LEVEL, 2); + + StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar4, sDebugText_PokemonDynamaxLevel); + AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + } + + if (JOY_NEW(A_BUTTON)) + { + sDebugMonData->dynamaxLevel = gTasks[taskId].tInput; + gTasks[taskId].tInput = 0; + gTasks[taskId].tDigit = 0; + + ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 0); + StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); + StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar4, sDebugText_PokemonGmaxFactor); + AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + + gTasks[taskId].func = DebugAction_Give_Pokemon_SelectGigantamaxFactor; + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + Free(sDebugMonData); + FreeMonIconPalettes(); + FreeAndDestroyMonIconSprite(&gSprites[gTasks[taskId].tSpriteId]); + DebugAction_DestroyExtraWindow(taskId); + } +} + +static void Debug_Display_StatInfo(const u8* text, u32 stat, u32 value, u32 digit, u8 windowId) +{ + StringCopy(gStringVar1, gStatNamesTable[stat]); + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + ConvertIntToDecimalStringN(gStringVar3, value, STR_CONV_MODE_LEADING_ZEROS, 2); + StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar4, text); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + +static void DebugAction_Give_Pokemon_SelectGigantamaxFactor(u8 taskId) +{ + static const u8 *txtStr; + + if (JOY_NEW(DPAD_ANY)) + { + PlaySE(SE_SELECT); + gTasks[taskId].tInput ^= JOY_NEW(DPAD_UP | DPAD_DOWN) > 0; + txtStr = (gTasks[taskId].tInput == TRUE) ? sDebugText_True : sDebugText_False; + StringCopyPadded(gStringVar2, txtStr, CHAR_SPACE, 15); + ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 0); + StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar4, sDebugText_PokemonGmaxFactor); + AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + } + + if (JOY_NEW(A_BUTTON)) + { + sDebugMonData->gmaxFactor = gTasks[taskId].tInput; + gTasks[taskId].tInput = 0; + gTasks[taskId].tDigit = 0; + Debug_Display_StatInfo(sDebugText_IVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectIVs; } else if (JOY_NEW(B_BUTTON)) @@ -3519,81 +3202,15 @@ static void DebugAction_Give_Pokemon_SelectIVs(u8 taskId) if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); - - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > MAX_PER_STAT_IVS) - gTasks[taskId].tInput = MAX_PER_STAT_IVS; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 0) - gTasks[taskId].tInput = 0; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < 2) - gTasks[taskId].tDigit += 1; - } - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - switch (gTasks[taskId].tIterator) - { - case STAT_HP: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_HP); - break; - case STAT_ATK: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_Attack); - break; - case STAT_DEF: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_Defense); - break; - case STAT_SPEED: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_Speed); - break; - case STAT_SPATK: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_SpAttack); - break; - case STAT_SPDEF: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_SpDefense); - break; - } - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_HandleInput_Numeric(taskId, 0, MAX_PER_STAT_IVS, 3); + Debug_Display_StatInfo(sDebugText_IVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } //If A or B button if (JOY_NEW(A_BUTTON)) { - switch (gTasks[taskId].tIterator) - { - case STAT_HP: - sDebugMonData->mon_iv_hp = gTasks[taskId].tInput; - break; - case STAT_ATK: - sDebugMonData->mon_iv_atk = gTasks[taskId].tInput; - break; - case STAT_DEF: - sDebugMonData->mon_iv_def = gTasks[taskId].tInput; - break; - case STAT_SPEED: - sDebugMonData->mon_iv_speed = gTasks[taskId].tInput; - break; - case STAT_SPATK: - sDebugMonData->mon_iv_satk = gTasks[taskId].tInput; - break; - case STAT_SPDEF: - sDebugMonData->mon_iv_sdef = gTasks[taskId].tInput; - break; - } + // Set IVs for stat + sDebugMonData->monIVs[gTasks[taskId].tIterator] = gTasks[taskId].tInput; //Check if all IVs set if (gTasks[taskId].tIterator != NUM_STATS - 1) @@ -3602,32 +3219,7 @@ static void DebugAction_Give_Pokemon_SelectIVs(u8 taskId) gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - switch (gTasks[taskId].tIterator) - { - case STAT_HP: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_HP); - break; - case STAT_ATK: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_Attack); - break; - case STAT_DEF: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_Defense); - break; - case STAT_SPEED: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_Speed); - break; - case STAT_SPATK: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_SpAttack); - break; - case STAT_SPDEF: - StringExpandPlaceholders(gStringVar4, sDebugText_IV_SpDefense); - break; - } - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - + Debug_Display_StatInfo(sDebugText_IVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectIVs; } else @@ -3636,11 +3228,7 @@ static void DebugAction_Give_Pokemon_SelectIVs(u8 taskId) gTasks[taskId].tDigit = 0; gTasks[taskId].tIterator = 0; - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_EV_HP); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectEVs; } } @@ -3654,12 +3242,30 @@ static void DebugAction_Give_Pokemon_SelectIVs(u8 taskId) static u32 GetDebugPokemonTotalEV(void) { - return (sDebugMonData->mon_ev_hp - + sDebugMonData->mon_ev_atk - + sDebugMonData->mon_ev_def - + sDebugMonData->mon_ev_speed - + sDebugMonData->mon_ev_satk - + sDebugMonData->mon_ev_sdef); + u32 totalEVs = 0; + for (u32 i = 0; i < NUM_STATS; i++) + totalEVs += sDebugMonData->monEVs[i]; + return totalEVs; +} + +static void Debug_Display_MoveInfo(u32 moveId, u32 iteration, u32 digit, u8 windowId) +{ + // Doesn't expand placeholdes so a 4th dynamic value can be shown. + u8 *end = StringCopy(gStringVar1, GetMoveName(moveId)); + WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + StringCopy(gStringVar4, COMPOUND_STRING("Move ")); + ConvertIntToDecimalStringN(gStringVar3, iteration, STR_CONV_MODE_LEADING_ZEROS, 1); + StringAppend(gStringVar4, gStringVar3); + StringAppend(gStringVar4, COMPOUND_STRING(": ")); + ConvertIntToDecimalStringN(gStringVar3, moveId, STR_CONV_MODE_LEADING_ZEROS, 3); + StringAppend(gStringVar4, gStringVar3); + StringAppend(gStringVar4, COMPOUND_STRING("{CLEAR_TO 90}\n")); + StringAppend(gStringVar4, gStringVar1); + StringAppend(gStringVar4, COMPOUND_STRING("{CLEAR_TO 90}\n{CLEAR_TO 90}\n")); + StringAppend(gStringVar4, gText_DigitIndicator[digit]); + StringAppend(gStringVar4, COMPOUND_STRING("{CLEAR_TO 90}")); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } static void DebugAction_Give_Pokemon_SelectEVs(u8 taskId) @@ -3669,81 +3275,15 @@ static void DebugAction_Give_Pokemon_SelectEVs(u8 taskId) if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); - - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > MAX_PER_STAT_EVS) - gTasks[taskId].tInput = MAX_PER_STAT_EVS; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 0) - gTasks[taskId].tInput = 0; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < 3) - gTasks[taskId].tDigit += 1; - } - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - switch (gTasks[taskId].tIterator) - { - case STAT_HP: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_HP); - break; - case STAT_ATK: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_Attack); - break; - case STAT_DEF: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_Defense); - break; - case STAT_SPEED: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_Speed); - break; - case STAT_SPATK: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_SpAttack); - break; - case STAT_SPDEF: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_SpDefense); - break; - } - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_HandleInput_Numeric(taskId, 0, MAX_PER_STAT_EVS, 4); + Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } //If A or B button if (JOY_NEW(A_BUTTON)) { - switch (gTasks[taskId].tIterator) - { - case STAT_HP: - sDebugMonData->mon_ev_hp = gTasks[taskId].tInput; - break; - case STAT_ATK: - sDebugMonData->mon_ev_atk = gTasks[taskId].tInput; - break; - case STAT_DEF: - sDebugMonData->mon_ev_def = gTasks[taskId].tInput; - break; - case STAT_SPEED: - sDebugMonData->mon_ev_speed = gTasks[taskId].tInput; - break; - case STAT_SPATK: - sDebugMonData->mon_ev_satk = gTasks[taskId].tInput; - break; - case STAT_SPDEF: - sDebugMonData->mon_ev_sdef = gTasks[taskId].tInput; - break; - } + // Set EVs for stat + sDebugMonData->monEVs[gTasks[taskId].tIterator] = gTasks[taskId].tInput; //Check if all EVs set if (gTasks[taskId].tIterator != NUM_STATS - 1) @@ -3751,33 +3291,7 @@ static void DebugAction_Give_Pokemon_SelectEVs(u8 taskId) gTasks[taskId].tIterator++; gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - switch (gTasks[taskId].tIterator) - { - case STAT_HP: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_HP); - break; - case STAT_ATK: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_Attack); - break; - case STAT_DEF: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_Defense); - break; - case STAT_SPEED: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_Speed); - break; - case STAT_SPATK: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_SpAttack); - break; - case STAT_SPDEF: - StringExpandPlaceholders(gStringVar4, sDebugText_EV_SpDefense); - break; - } - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - + Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectEVs; } else @@ -3788,32 +3302,18 @@ static void DebugAction_Give_Pokemon_SelectEVs(u8 taskId) if (totalEV > MAX_TOTAL_EVS) { - sDebugMonData->mon_ev_hp = 0; - sDebugMonData->mon_ev_atk = 0; - sDebugMonData->mon_ev_def = 0; - sDebugMonData->mon_ev_speed = 0; - sDebugMonData->mon_ev_satk = 0; - sDebugMonData->mon_ev_sdef = 0; + for (u32 i = 0; i < NUM_STATS; i++) + { + sDebugMonData->monEVs[i] = 0; + } PlaySE(SE_FAILURE); - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_EV_HP); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - + Debug_Display_StatInfo(sDebugText_EVs, gTasks[taskId].tIterator, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectEVs; } else { - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - u8 *end = StringCopy(gStringVar1, GetMoveName(gTasks[taskId].tInput)); - WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(gTasks[taskId].tSubWindowId)); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonMove_0); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - + Debug_Display_MoveInfo(gTasks[taskId].tInput, gTasks[taskId].tIterator, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_Move; } } @@ -3831,75 +3331,19 @@ static void DebugAction_Give_Pokemon_Move(u8 taskId) if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); + Debug_HandleInput_Numeric(taskId, 0, MOVES_COUNT - 1, 4); - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput >= MOVES_COUNT) - gTasks[taskId].tInput = MOVES_COUNT - 1; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 0) - gTasks[taskId].tInput = 0; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < 3) - gTasks[taskId].tDigit += 1; - } - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - u8 *end = StringCopy(gStringVar1, GetMoveName(gTasks[taskId].tInput)); - WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(gTasks[taskId].tSubWindowId)); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); - switch (gTasks[taskId].tIterator) - { - case 0: - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonMove_0); - break; - case 1: - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonMove_1); - break; - case 2: - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonMove_2); - break; - case 3: - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonMove_3); - break; - } - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_MoveInfo(gTasks[taskId].tInput, gTasks[taskId].tIterator, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) { + // Set current value + sDebugMonData->monMoves[gTasks[taskId].tIterator] = gTasks[taskId].tInput; + // If MOVE_NONE selected, stop asking for additional moves if (gTasks[taskId].tInput == MOVE_NONE) - gTasks[taskId].tIterator = 4; - - //Set current value - switch (gTasks[taskId].tIterator) - { - case 0: - sDebugMonData->mon_move_0 = gTasks[taskId].tInput; - break; - case 1: - sDebugMonData->mon_move_1 = gTasks[taskId].tInput; - break; - case 2: - sDebugMonData->mon_move_2 = gTasks[taskId].tInput; - break; - case 3: - sDebugMonData->mon_move_3 = gTasks[taskId].tInput; - break; - } + gTasks[taskId].tIterator = MAX_MON_MOVES; //If NOT last move or selected MOVE_NONE ask for next move, else make mon if (gTasks[taskId].tIterator < MAX_MON_MOVES - 1) @@ -3908,28 +3352,7 @@ static void DebugAction_Give_Pokemon_Move(u8 taskId) gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - u8 *end = StringCopy(gStringVar1, GetMoveName(gTasks[taskId].tInput)); - WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(gTasks[taskId].tSubWindowId)); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); - switch (gTasks[taskId].tIterator) - { - case 0: - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonMove_0); - break; - case 1: - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonMove_1); - break; - case 2: - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonMove_2); - break; - case 3: - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonMove_3); - break; - } - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - + Debug_Display_MoveInfo(gTasks[taskId].tInput, gTasks[taskId].tIterator, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_Move; } else @@ -3955,46 +3378,53 @@ static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId) //https://githu int sentToPc; struct Pokemon mon; u8 i; - u16 moves[4]; - u8 IVs[6]; + u16 moves[MAX_MON_MOVES]; + u8 IVs[NUM_STATS]; u8 iv_val; - u8 EVs[6]; + u8 EVs[NUM_STATS]; u8 ev_val; u16 species = sDebugMonData->species; u8 level = sDebugMonData->level; bool8 isShiny = sDebugMonData->isShiny; u8 nature = sDebugMonData->nature; u8 abilityNum = sDebugMonData->abilityNum; - moves[0] = sDebugMonData->mon_move_0; - moves[1] = sDebugMonData->mon_move_1; - moves[2] = sDebugMonData->mon_move_2; - moves[3] = sDebugMonData->mon_move_3; - IVs[0] = sDebugMonData->mon_iv_hp; - IVs[1] = sDebugMonData->mon_iv_atk; - IVs[2] = sDebugMonData->mon_iv_def; - IVs[3] = sDebugMonData->mon_iv_speed; - IVs[4] = sDebugMonData->mon_iv_satk; - IVs[5] = sDebugMonData->mon_iv_sdef; - EVs[0] = sDebugMonData->mon_ev_hp; - EVs[1] = sDebugMonData->mon_ev_atk; - EVs[2] = sDebugMonData->mon_ev_def; - EVs[3] = sDebugMonData->mon_ev_speed; - EVs[4] = sDebugMonData->mon_ev_satk; - EVs[5] = sDebugMonData->mon_ev_sdef; + u32 teraType = sDebugMonData->teraType; + u32 dmaxLevel = sDebugMonData->dynamaxLevel; + u32 gmaxFactor = sDebugMonData->gmaxFactor; + for (u32 i = 0; i < MAX_MON_MOVES; i++) + { + moves[i] = sDebugMonData->monMoves[i]; + } + for (u32 i = 0; i < NUM_STATS; i++) + { + EVs[i] = sDebugMonData->monEVs[i]; + IVs[i] = sDebugMonData->monIVs[i]; + } //Nature if (nature == NUM_NATURES || nature == 0xFF) nature = Random() % NUM_NATURES; - CreateMonWithNature(&mon, species, level, 32, nature); + CreateMonWithNature(&mon, species, level, USE_RANDOM_IVS, nature); //Shininess SetMonData(&mon, MON_DATA_IS_SHINY, &isShiny); + // Gigantamax factor + SetMonData(&mon, MON_DATA_GIGANTAMAX_FACTOR, &gmaxFactor); + + // Dynamax Level + SetMonData(&mon, MON_DATA_DYNAMAX_LEVEL, &dmaxLevel); + + // tera type + if (teraType >= NUMBER_OF_MON_TYPES) + teraType = TYPE_NONE; + SetMonData(&mon, MON_DATA_TERA_TYPE, &teraType); + //IVs for (i = 0; i < NUM_STATS; i++) { iv_val = IVs[i]; - if (iv_val != 32 && iv_val != 0xFF) + if (iv_val != USE_RANDOM_IVS && iv_val != 0xFF) SetMonData(&mon, MON_DATA_HP_IV + i, &iv_val); } @@ -4016,11 +3446,11 @@ static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId) //https://githu } //Ability - if (abilityNum == 0xFF || GetAbilityBySpecies(species, abilityNum) == 0) + if (abilityNum == 0xFF || GetAbilityBySpecies(species, abilityNum) == ABILITY_NONE) { do { - abilityNum = Random() % 3; // includes hidden abilities - } while (GetAbilityBySpecies(species, abilityNum) == 0); + abilityNum = Random() % NUM_ABILITY_SLOTS; // includes hidden abilities + } while (GetAbilityBySpecies(species, abilityNum) == ABILITY_NONE); } SetMonData(&mon, MON_DATA_ABILITY_NUM, &abilityNum); @@ -4038,7 +3468,9 @@ static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId) //https://githu } if (i >= PARTY_SIZE) + { sentToPc = CopyMonToPC(&mon); + } else { sentToPc = MON_GIVEN_TO_PARTY; @@ -4296,31 +3728,10 @@ static void DebugAction_Sound_SE_SelectId(u8 taskId) { if (JOY_NEW(DPAD_ANY)) { - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > END_SE) - gTasks[taskId].tInput = END_SE; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < 1) - gTasks[taskId].tInput = 1; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < DEBUG_NUMBER_DIGITS_ITEMS - 1) - gTasks[taskId].tDigit += 1; - } + Debug_HandleInput_Numeric(taskId, 1, END_SE, DEBUG_NUMBER_DIGITS_ITEMS); StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - StringCopyPadded(gStringVar1, sSENames[gTasks[taskId].tInput-1], CHAR_SPACE, 35); + StringCopyPadded(gStringVar1, sSENames[gTasks[taskId].tInput - 1], CHAR_SPACE, 35); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); StringExpandPlaceholders(gStringVar4, sDebugText_Sound_SFX_ID); AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); @@ -4378,31 +3789,10 @@ static void DebugAction_Sound_MUS_SelectId(u8 taskId) { if (JOY_NEW(DPAD_ANY)) { - if (JOY_NEW(DPAD_UP)) - { - gTasks[taskId].tInput += sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput > END_MUS) - gTasks[taskId].tInput = END_MUS; - } - if (JOY_NEW(DPAD_DOWN)) - { - gTasks[taskId].tInput -= sPowersOfTen[gTasks[taskId].tDigit]; - if (gTasks[taskId].tInput < START_MUS) - gTasks[taskId].tInput = START_MUS; - } - if (JOY_NEW(DPAD_LEFT)) - { - if (gTasks[taskId].tDigit > 0) - gTasks[taskId].tDigit -= 1; - } - if (JOY_NEW(DPAD_RIGHT)) - { - if (gTasks[taskId].tDigit < DEBUG_NUMBER_DIGITS_ITEMS - 1) - gTasks[taskId].tDigit += 1; - } + Debug_HandleInput_Numeric(taskId, START_MUS, END_MUS, DEBUG_NUMBER_DIGITS_ITEMS); StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - StringCopyPadded(gStringVar1, sBGMNames[gTasks[taskId].tInput-START_MUS], CHAR_SPACE, 35); + StringCopyPadded(gStringVar1, sBGMNames[gTasks[taskId].tInput - START_MUS], CHAR_SPACE, 35); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); StringExpandPlaceholders(gStringVar4, sDebugText_Sound_Music_ID); AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); diff --git a/src/decompress.c b/src/decompress.c index 284bce48d3..8c2f335614 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -5,8 +5,7 @@ #include "pokemon.h" #include "pokemon_sprite_visualizer.h" #include "text.h" - -EWRAM_DATA ALIGNED(4) u8 gDecompressionBuffer[0x4000] = {0}; +#include "menu.h" void LZDecompressWram(const u32 *src, void *dest) { @@ -40,66 +39,69 @@ u32 IsLZ77Data(const void *ptr, u32 minSize, u32 maxSize) return 0; } -u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src) +static inline u32 DoLoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src, void *buffer) { struct SpriteSheet dest; - LZ77UnCompWram(src->data, gDecompressionBuffer); - dest.data = gDecompressionBuffer; + dest.data = buffer; dest.size = src->size; dest.tag = src->tag; return LoadSpriteSheet(&dest); } +u32 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src) +{ + void *buffer = malloc_and_decompress(src->data, NULL); + u32 ret = DoLoadCompressedSpriteSheet(src, buffer); + Free(buffer); + + return ret; +} + +u32 LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) +{ + LZDecompressWram(src->data, buffer); + return DoLoadCompressedSpriteSheet(src, buffer); +} + // This can be used for either compressed or uncompressed sprite sheets -u16 LoadCompressedSpriteSheetByTemplate(const struct SpriteTemplate *template, s32 offset) +u32 LoadCompressedSpriteSheetByTemplate(const struct SpriteTemplate *template, s32 offset) { struct SpriteTemplate myTemplate; struct SpriteFrameImage myImage; u32 size; // Check for LZ77 header and read uncompressed size, or fallback if not compressed (zero size) - if ((size = IsLZ77Data(template->images->data, TILE_SIZE_4BPP, sizeof(gDecompressionBuffer))) == 0) + if ((size = IsLZ77Data(template->images->data, TILE_SIZE_4BPP, MAX_DECOMPRESSION_BUFFER_SIZE)) == 0) return LoadSpriteSheetByTemplate(template, 0, offset); - LZ77UnCompWram(template->images->data, gDecompressionBuffer); - myImage.data = gDecompressionBuffer; + void *buffer = malloc_and_decompress(template->images->data, NULL); + myImage.data = buffer; myImage.size = size + offset; myTemplate.images = &myImage; myTemplate.tileTag = template->tileTag; - return LoadSpriteSheetByTemplate(&myTemplate, 0, offset); + u32 ret = LoadSpriteSheetByTemplate(&myTemplate, 0, offset); + Free(buffer); + return ret; } -void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) +u32 LoadCompressedSpritePalette(const struct CompressedSpritePalette *src) { - struct SpriteSheet dest; + return LoadCompressedSpritePaletteWithTag(src->data, src->tag); +} + +u32 LoadCompressedSpritePaletteWithTag(const u32 *pal, u16 tag) +{ + u32 index; + struct SpritePalette dest; + void *buffer = malloc_and_decompress(pal, NULL); - LZ77UnCompWram(src->data, buffer); dest.data = buffer; - dest.size = src->size; - dest.tag = src->tag; - LoadSpriteSheet(&dest); -} - -void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src) -{ - struct SpritePalette dest; - - LZ77UnCompWram(src->data, gDecompressionBuffer); - dest.data = (void *) gDecompressionBuffer; - dest.tag = src->tag; - LoadSpritePalette(&dest); -} - -void LoadCompressedSpritePaletteWithTag(const u32 *pal, u16 tag) -{ - struct SpritePalette dest; - - LZ77UnCompWram(pal, gDecompressionBuffer); - dest.data = (void *) gDecompressionBuffer; dest.tag = tag; - LoadSpritePalette(&dest); + index = LoadSpritePalette(&dest); + Free(buffer); + return index; } void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *src, void *buffer) diff --git a/src/decoration.c b/src/decoration.c index d450ad7dfb..2b8973c815 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -113,7 +113,6 @@ EWRAM_DATA static u16 sDecorationsCursorPos = 0; EWRAM_DATA static u16 sDecorationsScrollOffset = 0; EWRAM_DATA u8 gCurDecorationIndex = 0; EWRAM_DATA static u8 sCurDecorationCategory = DECORCAT_DESK; -EWRAM_DATA static u32 UNUSED sFiller[2] = {}; EWRAM_DATA static struct DecorationPCContext sDecorationContext = {}; EWRAM_DATA static u8 sDecorMenuWindowIds[WINDOW_COUNT] = {}; EWRAM_DATA static struct DecorationItemsMenu *sDecorationItemsMenu = NULL; diff --git a/src/dexnav.c b/src/dexnav.c new file mode 100644 index 0000000000..55e328bf83 --- /dev/null +++ b/src/dexnav.c @@ -0,0 +1,2689 @@ +#include "global.h" +#include "battle_main.h" +#include "battle_setup.h" +#include "bg.h" +#include "data.h" +#include "daycare.h" +#include "decompress.h" +#include "dexnav.h" +#include "event_data.h" +#include "event_object_movement.h" +#include "event_scripts.h" +#include "field_effect.h" +#include "field_effect_helpers.h" +#include "field_message_box.h" +#include "field_player_avatar.h" +#include "field_screen_effect.h" +#include "fieldmap.h" +#include "gpu_regs.h" +#include "graphics.h" +#include "item.h" +#include "international_string_util.h" +#include "m4a.h" +#include "map_name_popup.h" +#include "main.h" +#include "malloc.h" +#include "menu.h" +#include "menu_helpers.h" +#include "metatile_behavior.h" +#include "move.h" +#include "overworld.h" +#include "palette.h" +#include "party_menu.h" +#include "pokedex.h" +#include "pokemon.h" +#include "pokemon_icon.h" +#include "pokemon_summary_screen.h" +#include "random.h" +#include "region_map.h" +#include "scanline_effect.h" +#include "script.h" +#include "script_pokemon_util.h" +#include "sound.h" +#include "sprite.h" +#include "start_menu.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "text_window.h" +#include "wild_encounter.h" +#include "window.h" +#include "constants/map_types.h" +#include "constants/species.h" +#include "constants/maps.h" +#include "constants/field_effects.h" +#include "constants/items.h" +#include "constants/songs.h" +#include "constants/abilities.h" +#include "constants/rgb.h" +#include "constants/region_map_sections.h" +#include "gba/m4a_internal.h" + +#if DEXNAV_ENABLED +STATIC_ASSERT(DN_FLAG_SEARCHING != 0, DNFlagSearching_Must_Not_Be_Zero); +STATIC_ASSERT(DN_FLAG_DETECTOR_MODE != 0, DNFlagDetectorMode_Must_Not_Be_Zero); +STATIC_ASSERT(DN_VAR_SPECIES != 0, DNVarSpecies_Must_Not_Be_Zero); +STATIC_ASSERT(DN_VAR_STEP_COUNTER != 0, DNVarStepCounter_Must_Not_Be_Zero); +#endif + +// Defines +enum WindowIds +{ + WINDOW_INFO, + WINDOW_REGISTERED, + WINDOW_COUNT, +}; + +enum Statuses +{ + STATUS_INVALID_SEARCH, + STATUS_CHOOSE_MON, + STATUS_LOCKED, + STATUS_NO_DATA, + STATUS_INCORRECT_AREA, +}; + +struct DexNavSearch +{ + u16 species; + u16 moves[MAX_MON_MOVES]; + u16 heldItem; + u8 abilityNum; + u8 potential; + u8 searchLevel; + u8 monLevel; + u8 proximity; + u8 environment; + s16 tileX; + s16 tileY; + u8 fldEffSpriteId; + u8 fldEffId; + u8 movementCount; + u8 windowId; + u8 iconSpriteId; + u8 eyeSpriteId; + u8 itemSpriteId; + u8 starSpriteIds[3]; + u8 ownedIconSpriteId; + u8 exclamationSpriteId; + u8 hiddenSearch:1; + u8 isHiddenMon:1; + u8 unk:6; + u16 palBuffer[16]; +}; + +struct DexNavGUI +{ + MainCallback savedCallback; + u8 state; + u8 cursorSpriteId; + u16 landSpecies[LAND_WILD_COUNT]; + u16 waterSpecies[WATER_WILD_COUNT]; + u16 hiddenSpecies[HIDDEN_WILD_COUNT]; + u8 cursorRow; + u8 cursorCol; + u8 environment; + u8 potential; + u8 typeIconSpriteIds[2]; + u8 starSpriteIds[3]; +}; + +// RAM + +EWRAM_DATA static struct DexNavSearch *sDexNavSearchDataPtr = NULL; +EWRAM_DATA static struct DexNavGUI *sDexNavUiDataPtr = NULL; +EWRAM_DATA static u8 *sBg1TilemapBuffer = NULL; +EWRAM_DATA bool8 gDexNavBattle = FALSE; + +//// Function Declarations +//GUI +static void Task_DexNavWaitFadeIn(u8 taskId); +static void Task_DexNavMain(u8 taskId); +static void PrintCurrentSpeciesInfo(void); +// SEARCH +static bool8 TryStartHiddenMonFieldEffect(u8 environment, u8 xSize, u8 ySize, bool8 smallScan); +static void DexNavGenerateMoveset(u16 species, u8 searchLevel, u8 encounterLevel, u16* moveDst); +static u16 DexNavGenerateHeldItem(u16 species, u8 searchLevel); +static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel); +static u8 DexNavGeneratePotential(u8 searchLevel); +static u8 DexNavTryGenerateMonLevel(u16 species, u8 environment); +static u8 GetEncounterLevelFromMapData(u16 species, u8 environment); +static void CreateDexNavWildMon(u16 species, u8 potential, u8 level, u8 abilityNum, u16 item, u16* moves); +static u8 GetPlayerDistance(s16 x, s16 y); +static u8 DexNavPickTile(u8 environment, u8 xSize, u8 ySize, bool8 smallScan); +static void DexNavProximityUpdate(void); +static void DexNavDrawIcons(void); +static void DexNavUpdateSearchWindow(u8 proximity, u8 searchLevel); +static void Task_DexNavSearch(u8 taskId); +static void EndDexNavSearchSetupScript(const u8 *script, u8 taskId); +// HIDDEN MONS +static void DexNavDrawHiddenIcons(void); +static void DrawHiddenSearchWindow(u8 width); + +//// Const Data +// gui image data +static const u32 sDexNavGuiTiles[] = INCBIN_U32("graphics/dexnav/gui_tiles.4bpp.lz"); +static const u32 sDexNavGuiTilemap[] = INCBIN_U32("graphics/dexnav/gui_tilemap.bin.lz"); +static const u32 sDexNavGuiPal[] = INCBIN_U32("graphics/dexnav/gui.gbapal"); + +static const u32 sSelectionCursorGfx[] = INCBIN_U32("graphics/dexnav/cursor.4bpp.lz"); +static const u16 sSelectionCursorPal[] = INCBIN_U16("graphics/dexnav/cursor.gbapal"); +static const u32 sCapturedAllMonsTiles[] = INCBIN_U32("graphics/dexnav/captured_all.4bpp.lz"); //uses selection cursor pal + +static const u32 sNoDataGfx[] = INCBIN_U32("graphics/dexnav/no_data.4bpp.lz"); + +// searching image data +static const u32 sPotentialStarGfx[] = INCBIN_U32("graphics/dexnav/star.4bpp.lz"); +static const u32 sHiddenSearchIconGfx[] = INCBIN_U32("graphics/dexnav/hidden_search.4bpp.lz"); +static const u32 sOwnedIconGfx[] = INCBIN_U32("graphics/dexnav/owned_icon.4bpp.lz"); +static const u32 sHiddenMonIconGfx[] = INCBIN_U32("graphics/dexnav/hidden.4bpp.lz"); + +// strings +static const u8 sText_DexNav_NoInfo[] = _("--------"); +static const u8 sText_DexNav_CaptureToSee[] = _("Capture first!"); +static const u8 sText_DexNav_PressRToRegister[] = _("R TO REGISTER!"); +static const u8 sText_DexNav_SearchForRegisteredSpecies[] = _("Search {STR_VAR_1}"); +static const u8 sText_DexNav_NotFoundHere[] = _("This Pokémon cannot be found here!"); +static const u8 sText_ThreeQmarks[] = _("???"); +static const u8 sText_SearchLevel[] = _("SEARCH {LV}. {STR_VAR_1}"); +static const u8 sText_MonLevel[] = _("{LV}. {STR_VAR_1}"); +static const u8 sText_EggMove[] = _("MOVE: {STR_VAR_1}"); +static const u8 sText_HeldItem[] = _("{STR_VAR_1}"); +static const u8 sText_StartExit[] = _("{START_BUTTON} EXIT"); +static const u8 sText_DexNavChain[] = _("{NO} {STR_VAR_1}"); +static const u8 sText_DexNavChainLong[] = _("{NO}{STR_VAR_1}"); + +static const u8 sText_ArrowLeft[] = _("{LEFT_ARROW}"); +static const u8 sText_ArrowRight[] = _("{RIGHT_ARROW}"); +static const u8 sText_ArrowUp[] = _("{UP_ARROW}"); +static const u8 sText_ArrowDown[] = _("{DOWN_ARROW}"); + +static const struct WindowTemplate sDexNavGuiWindowTemplates[] = +{ + [WINDOW_INFO] = + { + .bg = 0, + .tilemapLeft = 21, + .tilemapTop = 5, + .width = 9, + .height = 15, + .paletteNum = 15, + .baseBlock = 1, + }, + [WINDOW_REGISTERED] = + { + .bg = 0, + .tilemapLeft = 4, + .tilemapTop = 0, + .width = 26, + .height = 2, + .paletteNum = 15, + .baseBlock = 200, + }, + DUMMY_WIN_TEMPLATE +}; + +//gui font +static const u8 sFontColor_Black[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; +static const u8 sFontColor_White[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}; +//search window font +static const u8 sSearchFontColor[3] = {0, 15, 13}; + +static const struct OamData sNoDataIconOam = +{ + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .shape = SPRITE_SHAPE(32x32), + .size = SPRITE_SIZE(32x32), + .priority = 1, +}; + +static const struct OamData sHeldItemOam = +{ + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .priority = 0, + .paletteNum = 13, +}; + +static const struct OamData sCapturedAllOam = +{ + .y = 0, + .affineMode = 1, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = SPRITE_SHAPE(8x8), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(8x8), + .tileNum = 0, + .priority = 0, //Highest + .paletteNum = 12, + .affineParam = 0, +}; + +static const struct OamData sSearchIconOam = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x32), + .tileNum = 0, + .priority = 0, // above BG layers + .paletteNum = 13, + .affineParam = 0 +}; + +static const struct OamData sSelectionCursorOam = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x32), + .tileNum = 0, + .priority = 0, // above BG layers + .paletteNum = 12, + .affineParam = 0 +}; + +static const struct OamData sSightOam = +{ + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .priority = 0, +}; +static const union AnimCmd sAnimCmdSight0[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; +static const union AnimCmd sAnimCmdSight1[] = +{ + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; +static const union AnimCmd sAnimCmdSight2[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; +static const union AnimCmd *const sAnimCmdTable_Sight[] = +{ + sAnimCmdSight0, + sAnimCmdSight1, + sAnimCmdSight2, +}; + +// gui sprite templates +static const struct SpriteTemplate sNoDataIconTemplate = +{ + .tileTag = ICON_GFX_TAG, + .paletteTag = ICON_PAL_TAG, + .oam = &sNoDataIconOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate sCaptureAllMonsSpriteTemplate = +{ + .tileTag = CAPTURED_ALL_TAG, + .paletteTag = 0xFFFF, + .oam = &sCapturedAllOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate sSelectionCursorSpriteTemplate = +{ + .tileTag = SELECTION_CURSOR_TAG, + .paletteTag = 0xFFFF, + .oam = &sSelectionCursorOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +// search window sprite templates +static const struct SpriteTemplate sHeldItemTemplate = +{ + .tileTag = HELD_ITEM_TAG, + .paletteTag = 0xFFFF, + .oam = &sHeldItemOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate sPotentialStarTemplate = +{ + .tileTag = LIT_STAR_TILE_TAG, + .paletteTag = 0xFFFF, //held item pal + .oam = &sHeldItemOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate sSearchIconSpriteTemplate = +{ + .tileTag = HIDDEN_SEARCH_TAG, + .paletteTag = 0xFFFF, //held item pal + .oam = &sSearchIconOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate sOwnedIconTemplate = +{ + .tileTag = OWNED_ICON_TAG, + .paletteTag = 0xFFFF, //held item pal + .oam = &sHeldItemOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate sHiddenMonIconTemplate = +{ + .tileTag = HIDDEN_MON_ICON_TAG, + .paletteTag = 0xFFFF, //held item pal + .oam = &sHeldItemOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +// gui sprite sheets +static const struct CompressedSpriteSheet sNoDataIconSpriteSheet = {sNoDataGfx, (32 * 32) / 2, ICON_GFX_TAG}; +static const struct CompressedSpriteSheet sCapturedAllPokemonSpriteSheet = {sCapturedAllMonsTiles, (8 * 8) / 2, CAPTURED_ALL_TAG}; +// search sprite sheets +static const struct CompressedSpriteSheet sPotentialStarSpriteSheet = {sPotentialStarGfx, (8 * 8) / 2, LIT_STAR_TILE_TAG}; +static const struct CompressedSpriteSheet sOwnedIconSpriteSheet = {sOwnedIconGfx, (8 * 8) / 2, OWNED_ICON_TAG}; +static const struct CompressedSpriteSheet sHiddenMonIconSpriteSheet = {sHiddenMonIconGfx, (8 * 8) / 2, HIDDEN_MON_ICON_TAG}; + +//// functions +/////////////////////// +//// DEXNAV SEARCH //// +/////////////////////// +static s16 GetSearchWindowY(void) +{ + return (GetWindowAttribute(sDexNavSearchDataPtr->windowId, WINDOW_TILEMAP_TOP) * 8); +} + +#define SPECIES_ICON_X 28 +static void DrawDexNavSearchMonIcon(u16 species, u8 *dst, bool8 owned) +{ + u8 spriteId; + + LoadMonIconPalette(species); + spriteId = CreateMonIcon(species, SpriteCB_MonIcon, SPECIES_ICON_X - 6, GetSearchWindowY() + 8, 0, 0xFFFFFFFF); + gSprites[spriteId].oam.priority = 0; + *dst = spriteId; + + if (owned) + sDexNavSearchDataPtr->ownedIconSpriteId = CreateSprite(&sOwnedIconTemplate, SPECIES_ICON_X + 6, GetSearchWindowY() + 4, 0); +} + +static void AddSearchWindow(u8 width) +{ + struct WindowTemplate template; + u16 y = 16; + + if (sDexNavSearchDataPtr->tileY > (gSaveBlock1Ptr->pos.y + 7)) + y = 1; //draw at top if chosen tile is below + + LoadDexNavWindowGfx(sDexNavSearchDataPtr->windowId, 0x1d5, 14 * 16); + + SetWindowTemplateFields(&template, 0, 1, y, width, 3, 14, 8); + + sDexNavSearchDataPtr->windowId = AddWindow(&template); + FillWindowPixelBuffer(sDexNavSearchDataPtr->windowId, PIXEL_FILL(1)); + PutWindowTilemap(sDexNavSearchDataPtr->windowId); + CopyWindowToVram(sDexNavSearchDataPtr->windowId, 3); + + DrawStdFrameWithCustomTileAndPalette(sDexNavSearchDataPtr->windowId, TRUE, 0x214, 14); +} + +#define WINDOW_COL_0 (SPECIES_ICON_X + 4) +#define WINDOW_COL_1 (WINDOW_COL_0 + (GetFontAttribute(sDexNavSearchDataPtr->windowId, FONTATTR_MAX_LETTER_WIDTH) * (POKEMON_NAME_LENGTH))) +#define WINDOW_MOVE_NAME_X (WINDOW_COL_1 + (GetFontAttribute(sDexNavSearchDataPtr->windowId, FONTATTR_MAX_LETTER_WIDTH) * 6)) +#define SEARCH_ARROW_X (WINDOW_MOVE_NAME_X + 90) +#define SEARCH_ARROW_Y 0 + +static void AddSearchWindowText(u16 species, u8 proximity, u8 searchLevel, bool8 hidden) +{ + u8 windowId = sDexNavSearchDataPtr->windowId; + + //species name - always present + if (hidden) + { + StringCopy(gStringVar4, sText_ThreeQmarks); + AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, WINDOW_COL_0, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + return; + } + else + { + StringCopy(gStringVar1, GetSpeciesName(species)); + AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, WINDOW_COL_0, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar1); + } + + //level - always present + ConvertIntToDecimalStringN(gStringVar1, sDexNavSearchDataPtr->monLevel, STR_CONV_MODE_LEFT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, sText_MonLevel); + AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, WINDOW_COL_1, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + + if (proximity <= SNEAKING_PROXIMITY) + { + PlaySE(SE_POKENAV_ON); + // move + if (searchLevel > 1 && sDexNavSearchDataPtr->moves[0]) + { + StringCopy(gStringVar1, GetMoveName(sDexNavSearchDataPtr->moves[0])); + StringExpandPlaceholders(gStringVar4, sText_EggMove); + AddTextPrinterParameterized3(windowId, 0, WINDOW_MOVE_NAME_X, 0, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + } + + if (searchLevel > 2) + { + // ability name + StringCopy(gStringVar1, gAbilitiesInfo[GetAbilityBySpecies(species, sDexNavSearchDataPtr->abilityNum)].name); + AddTextPrinterParameterized3(windowId, 0, WINDOW_COL_1 + 16, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar1); + + // item name + if (sDexNavSearchDataPtr->heldItem) + { + CopyItemName(sDexNavSearchDataPtr->heldItem, gStringVar1); + StringExpandPlaceholders(gStringVar4, sText_HeldItem); + AddTextPrinterParameterized3(windowId, 0, WINDOW_COL_0, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + } + } + } + + //chain level - always present + ConvertIntToDecimalStringN(gStringVar1, gSaveBlock3Ptr->dexNavChain, STR_CONV_MODE_LEFT_ALIGN, 3); + if (gSaveBlock3Ptr->dexNavChain > 99) + StringExpandPlaceholders(gStringVar4, sText_DexNavChainLong); + else + StringExpandPlaceholders(gStringVar4, sText_DexNavChain); + AddTextPrinterParameterized3(windowId, 0, SEARCH_ARROW_X - 16, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + + CopyWindowToVram(sDexNavSearchDataPtr->windowId, 2); +} + +#define SEARCH_WINDOW_WIDTH 28 + +static void DrawSearchWindow(u16 species, u8 potential, bool8 hidden) +{ + u8 searchLevel = sDexNavSearchDataPtr->searchLevel; + + AddSearchWindow(SEARCH_WINDOW_WIDTH); + AddSearchWindowText(species, sDexNavSearchDataPtr->proximity, searchLevel, hidden); +} + +#undef SEARCH_WINDOW_WIDTH + +static void RemoveDexNavWindowAndGfx(void) +{ + u32 i; + + // try remove sprites + if (sDexNavSearchDataPtr->iconSpriteId != MAX_SPRITES) + DestroySprite(&gSprites[sDexNavSearchDataPtr->iconSpriteId]); + if (sDexNavSearchDataPtr->itemSpriteId != MAX_SPRITES) + DestroySprite(&gSprites[sDexNavSearchDataPtr->itemSpriteId]); + if (sDexNavSearchDataPtr->eyeSpriteId != MAX_SPRITES) + DestroySprite(&gSprites[sDexNavSearchDataPtr->eyeSpriteId]); + if (sDexNavSearchDataPtr->ownedIconSpriteId != MAX_SPRITES) + DestroySprite(&gSprites[sDexNavSearchDataPtr->ownedIconSpriteId]); + if (sDexNavSearchDataPtr->exclamationSpriteId != MAX_SPRITES) + DestroySprite(&gSprites[sDexNavSearchDataPtr->exclamationSpriteId]); + + for (i = 0; i < NELEMS(sDexNavSearchDataPtr->starSpriteIds); i++) + { + if (sDexNavSearchDataPtr->starSpriteIds[i] != MAX_SPRITES) + DestroySprite(&gSprites[sDexNavSearchDataPtr->starSpriteIds[i]]); + } + + FreeSpriteTilesByTag(HELD_ITEM_TAG); + FreeSpriteTilesByTag(OWNED_ICON_TAG); + FreeSpriteTilesByTag(HIDDEN_SEARCH_TAG); + FreeSpriteTilesByTag(HIDDEN_MON_ICON_TAG); + FreeSpriteTilesByTag(LIT_STAR_TILE_TAG); + FreeSpritePaletteByTag(HELD_ITEM_TAG); + SafeFreeMonIconPalette(sDexNavSearchDataPtr->species); + + // remove window + ClearStdWindowAndFrameToTransparent(sDexNavSearchDataPtr->windowId, FALSE); + CopyWindowToVram(sDexNavSearchDataPtr->windowId, 3); + RemoveWindow(sDexNavSearchDataPtr->windowId); +} + + +////////////////////// +////DEXNAV SEARCH///// +////////////////////// +static u8 GetPlayerDistance(s16 x, s16 y) +{ + u16 deltaX = abs(x - (gSaveBlock1Ptr->pos.x + 7)); + u16 deltaY = abs(y - (gSaveBlock1Ptr->pos.y + 7)); + return deltaX + deltaY; +} + +static void DexNavProximityUpdate(void) +{ + sDexNavSearchDataPtr->proximity = GetPlayerDistance(sDexNavSearchDataPtr->tileX, sDexNavSearchDataPtr->tileY); +} + +//Pick a specific tile based on environment +static bool8 DexNavPickTile(u8 environment, u8 areaX, u8 areaY, bool8 smallScan) +{ + // area of map to cover starting from camera position {-7, -7} + s16 topX = gSaveBlock1Ptr->pos.x - SCANSTART_X + (smallScan * 5); + s16 topY = gSaveBlock1Ptr->pos.y - SCANSTART_Y + (smallScan * 5); + s16 botX = topX + areaX; + s16 botY = topY + areaY; + u8 i; + bool8 nextIter; + u8 scale = 0; + u8 weight = 0; + u8 currMapType = GetCurrentMapType(); + u8 tileBehaviour; + u8 tileBuffer = 2; + u8 *xPos = AllocZeroed((botX - topX) * (botY - topY) * sizeof(u8)); + u8 *yPos = AllocZeroed((botX - topX) * (botY - topY) * sizeof(u8)); + u32 iter = 0; + bool32 ret = FALSE; + + // loop through every tile in area and evaluate + while (topY < botY) + { + while (topX < botX) + { + tileBehaviour = MapGridGetMetatileBehaviorAt(topX, topY); + //Check for objects + nextIter = FALSE; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) + tileBuffer = SNEAKING_PROXIMITY + 3; + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) + tileBuffer = SNEAKING_PROXIMITY + 1; + + if (GetPlayerDistance(topX, topY) <= tileBuffer) + { + // tile too close to player + topX++; + continue; + } + + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) + { + if (gObjectEvents[i].currentCoords.x == topX && gObjectEvents[i].currentCoords.y == topY) + { + // cannot be on a tile where an object exists + nextIter = TRUE; + break; + } + } + + if (nextIter) + { + topX++; + continue; + } + + weight = 0; // initiliaze weight + switch (environment) + { + case ENCOUNTER_TYPE_LAND: + if (MetatileBehavior_IsLandWildEncounter(tileBehaviour)) + { + if (currMapType == MAP_TYPE_UNDERGROUND) + { + // inside (cave) + if (IsElevationMismatchAt(gObjectEvents[gPlayerAvatar.spriteId].currentElevation, topX, topY)) + break; //occurs at same z coord + + scale = 440 - (smallScan * 200) - (GetPlayerDistance(topX, topY) / 2) - (2 * (topX + topY)); + weight = ((Random() % scale) < 1) && !MapGridGetCollisionAt(topX, topY); + } + else + { + // outdoors: grass + scale = 100 - (GetPlayerDistance(topX, topY) * 2); + weight = (Random() % scale <= 5) && !MapGridGetCollisionAt(topX, topY); + } + } + break; + case ENCOUNTER_TYPE_WATER: + if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehaviour)) + { + u8 scale = 320 - (smallScan * 200) - (GetPlayerDistance(topX, topY) / 2); + if (IsElevationMismatchAt(gObjectEvents[gPlayerAvatar.spriteId].currentElevation, topX, topY)) + break; + + weight = (Random() % scale <= 1) && !MapGridGetCollisionAt(topX, topY); + } + break; + default: + break; + } + + if (weight > 0) + { + xPos[iter] = topX; + yPos[iter] = topY; + iter++; + } + + topX++; + } + + topY++; + topX = gSaveBlock1Ptr->pos.x - SCANSTART_X + (smallScan * 5); + } + + if (iter > 0) + { + i = Random() % iter; + sDexNavSearchDataPtr->tileX = xPos[i]; + sDexNavSearchDataPtr->tileY = yPos[i]; + ret = TRUE; + } + + Free(xPos); + Free(yPos); + + return ret; +} + + +static bool8 TryStartHiddenMonFieldEffect(u8 environment, u8 xSize, u8 ySize, bool8 smallScan) +{ + u8 currMapType = GetCurrentMapType(); + u8 fldEffId = 0; + + if (DexNavPickTile(environment, xSize, ySize, smallScan)) + { + u8 metatileBehaviour = MapGridGetMetatileBehaviorAt(sDexNavSearchDataPtr->tileX, sDexNavSearchDataPtr->tileY); + + switch (environment) + { + case ENCOUNTER_TYPE_LAND: + if (currMapType == MAP_TYPE_UNDERGROUND) + { + fldEffId = FLDEFF_CAVE_DUST; + } + else if (IsMapTypeIndoors(currMapType)) + { + if (MetatileBehavior_IsTallGrass(metatileBehaviour)) //Grass in cave + fldEffId = FLDEFF_SHAKING_GRASS; + else if (MetatileBehavior_IsLongGrass(metatileBehaviour)) //Really tall grass + fldEffId = FLDEFF_SHAKING_LONG_GRASS; + else if (MetatileBehavior_IsSandOrDeepSand(metatileBehaviour)) + fldEffId = FLDEFF_SAND_HOLE; + else + fldEffId = FLDEFF_CAVE_DUST; + } + else //outdoor, underwater + { + if (MetatileBehavior_IsTallGrass(metatileBehaviour)) //Regular grass + fldEffId = FLDEFF_SHAKING_GRASS; + else if (MetatileBehavior_IsLongGrass(metatileBehaviour)) //Really tall grass + fldEffId = FLDEFF_SHAKING_LONG_GRASS; + else if (MetatileBehavior_IsSandOrDeepSand(metatileBehaviour)) //Desert Sand + fldEffId = FLDEFF_SAND_HOLE; + else if (MetatileBehavior_IsMountain(metatileBehaviour)) //Rough Terrain + fldEffId = FLDEFF_CAVE_DUST; + else + fldEffId = FLDEFF_BERRY_TREE_GROWTH_SPARKLE; //default + } + break; + case ENCOUNTER_TYPE_WATER: + fldEffId = FLDEFF_WATER_SURFACING; + break; + default: + return FALSE; + } + + if (fldEffId != 0) + { + gFieldEffectArguments[0] = sDexNavSearchDataPtr->tileX; + gFieldEffectArguments[1] = sDexNavSearchDataPtr->tileY; + gFieldEffectArguments[2] = 0xFF; // subpriority + gFieldEffectArguments[3] = 2; //priority + sDexNavSearchDataPtr->fldEffSpriteId = FieldEffectStart(fldEffId); + if (sDexNavSearchDataPtr->fldEffSpriteId == MAX_SPRITES) + return FALSE; + + sDexNavSearchDataPtr->fldEffId = fldEffId; + return TRUE; + } + } + + return FALSE; +} + +static void DrawDexNavSearchHeldItem(u8* dst) +{ + *dst = CreateSprite(&sHeldItemTemplate, SPECIES_ICON_X + 6, GetSearchWindowY() + 18, 0); + if (*dst != MAX_SPRITES) + gSprites[*dst].invisible = TRUE; +} + +static void LoadSearchIconData(void) +{ + // palettes clash with mon icon, so must load manually + LoadSpriteSheet(&gSpriteSheet_HeldItem); + LoadPalette(gHeldItemPalette, 0x100 + (16 * sHeldItemOam.paletteNum), 32); + LoadCompressedSpriteSheetUsingHeap(&sPotentialStarSpriteSheet); + //LoadCompressedSpriteSheetUsingHeap(&sSightSpriteSheet); //eye replaced with arrow + LoadCompressedSpriteSheetUsingHeap(&sOwnedIconSpriteSheet); + LoadCompressedSpriteSheetUsingHeap(&sHiddenMonIconSpriteSheet); +} + +static u8 GetSearchLevel(u16 dexNum) +{ + u8 searchLevel; +#if USE_DEXNAV_SEARCH_LEVELS == TRUE + searchLevel = gSaveBlock3Ptr->dexNavSearchLevels[dexNum]; +#else + searchLevel = 0; +#endif + return searchLevel; +} + +#define tProximity data[0] +#define tFrameCount data[1] +#define tSpecies data[2] +#define tEnvironment data[3] +#define tRevealed data[4] + +static void Task_SetUpDexNavSearch(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + u16 species = sDexNavSearchDataPtr->species; + u8 searchLevel = GetSearchLevel(SpeciesToNationalPokedexNum(species)); + + // init sprites + sDexNavSearchDataPtr->iconSpriteId = MAX_SPRITES; + sDexNavSearchDataPtr->itemSpriteId = MAX_SPRITES; + sDexNavSearchDataPtr->eyeSpriteId = MAX_SPRITES; + sDexNavSearchDataPtr->starSpriteIds[0] = MAX_SPRITES; + sDexNavSearchDataPtr->starSpriteIds[1] = MAX_SPRITES; + sDexNavSearchDataPtr->starSpriteIds[2] = MAX_SPRITES; + sDexNavSearchDataPtr->ownedIconSpriteId = MAX_SPRITES; + sDexNavSearchDataPtr->exclamationSpriteId = MAX_SPRITES; + sDexNavSearchDataPtr->searchLevel = searchLevel; + + DexNavGenerateMoveset(species, searchLevel, sDexNavSearchDataPtr->monLevel, &sDexNavSearchDataPtr->moves[0]); + sDexNavSearchDataPtr->heldItem = DexNavGenerateHeldItem(species, searchLevel); + sDexNavSearchDataPtr->abilityNum = DexNavGetAbilityNum(species, searchLevel); + sDexNavSearchDataPtr->potential = DexNavGeneratePotential(searchLevel); + DexNavProximityUpdate(); + + LoadSearchIconData(); + if (sDexNavSearchDataPtr->hiddenSearch) + { + DexNavDrawHiddenIcons(); + } + else + { + DexNavDrawIcons(); + DexNavUpdateSearchWindow(sDexNavSearchDataPtr->proximity, searchLevel); + } + + FlagSet(DN_FLAG_SEARCHING); + gPlayerAvatar.creeping = TRUE; //initialize as true in case mon appears beside you + task->tProximity = gSprites[gPlayerAvatar.spriteId].x; + task->tFrameCount = 0; + task->func = Task_DexNavSearch; + IncrementGameStat(GAME_STAT_DEXNAV_SCANNED); +} + +static void DexNavSearchBail(u8 taskId, const u8 *script) +{ + TRY_FREE_AND_SET_NULL(sDexNavSearchDataPtr); + FreeMonIconPalettes(); + ScriptContext_SetupScript(script); + DestroyTask(taskId); +} + +static void Task_InitDexNavSearch(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u16 species = task->tSpecies; + u8 environment = task->tEnvironment; + + sDexNavSearchDataPtr = AllocZeroed(sizeof(struct DexNavSearch)); + if (sDexNavSearchDataPtr == NULL) + { + DexNavSearchBail(taskId, EventScript_NotFoundNearby); + return; + } + + // assign non-objects to struct + sDexNavSearchDataPtr->species = species; + sDexNavSearchDataPtr->environment = environment; //updated in DexNavTryGenerateMonLevel if hidden mon + sDexNavSearchDataPtr->isHiddenMon = (environment == ENCOUNTER_TYPE_HIDDEN) ? TRUE : FALSE; + sDexNavSearchDataPtr->monLevel = DexNavTryGenerateMonLevel(species, environment); + + if (GetFlashLevel() > 0) + { + DexNavSearchBail(taskId, EventScript_TooDark); + return; + } + + if (sDexNavSearchDataPtr->monLevel == MON_LEVEL_NONEXISTENT || !TryStartHiddenMonFieldEffect(sDexNavSearchDataPtr->environment, 12, 12, FALSE)) + { + DexNavSearchBail(taskId, EventScript_NotFoundNearby); + return; + } + + sDexNavSearchDataPtr->hiddenSearch = FALSE; + task->tRevealed = TRUE; //search window revealed + task->func = Task_SetUpDexNavSearch; +} + +static void DexNavDrawPotentialStars(u8 potential, u8* dst) +{ + u8 spriteId; + u32 i; + + for (i = 0; i < NELEMS(sDexNavSearchDataPtr->starSpriteIds); i++) + { + spriteId = MAX_SPRITES; + if (potential > i) + spriteId = CreateSprite(&sPotentialStarTemplate, SPECIES_ICON_X - 20, GetSearchWindowY() + 4 + (i * 8), 0); + + dst[i] = spriteId; + if (spriteId != MAX_SPRITES) + gSprites[spriteId].invisible = TRUE; + } +} + +static void DexNavUpdateDirectionArrow(void) +{ + u16 tileX = sDexNavSearchDataPtr->tileX; + u16 tileY = sDexNavSearchDataPtr->tileY; + u16 playerX = gSaveBlock1Ptr->pos.x + 7; + u16 playerY = gSaveBlock1Ptr->pos.y + 7; + u16 deltaX = abs(tileX - playerX); + u16 deltaY = abs(tileY - playerY); + const u8 *str; + u8 windowId = sDexNavSearchDataPtr->windowId; + + FillWindowPixelRect(windowId, PIXEL_FILL(1), SEARCH_ARROW_X, SEARCH_ARROW_Y, 12, 12); + if (deltaX <= 1 && deltaY <= 1) + { + str = gText_EmptyString2; + } + else if (deltaX > deltaY) + { + if (playerX > tileX) + str = sText_ArrowLeft; //player to right + else + str = sText_ArrowRight; //player to left + } + else //greater Y diff + { + if (playerY > tileY) + str = sText_ArrowUp; //player below + else + str = sText_ArrowDown; //player above + } + + AddTextPrinterParameterized3(windowId, 1, SEARCH_ARROW_X, SEARCH_ARROW_Y, sSearchFontColor, TEXT_SKIP_DRAW, str); + CopyWindowToVram(windowId, 2); +} + +static void DexNavDrawIcons(void) +{ + u16 species = sDexNavSearchDataPtr->species; + + DrawSearchWindow(species, sDexNavSearchDataPtr->potential, FALSE); + DrawDexNavSearchMonIcon(species, &sDexNavSearchDataPtr->iconSpriteId, GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)); + DrawDexNavSearchHeldItem(&sDexNavSearchDataPtr->itemSpriteId); + DexNavDrawPotentialStars(sDexNavSearchDataPtr->potential, &sDexNavSearchDataPtr->starSpriteIds[0]); + DexNavUpdateDirectionArrow(); +} + +///////////////////// +//// SEARCH TASK //// +///////////////////// +bool8 TryStartDexNavSearch(void) +{ + u8 taskId; + u16 val = VarGet(DN_VAR_SPECIES); + + if (FlagGet(DN_FLAG_SEARCHING) || (val & DEXNAV_MASK_SPECIES) == SPECIES_NONE) + return FALSE; + + HideMapNamePopUpWindow(); + ChangeBgY_ScreenOff(0, 0, 0); + taskId = CreateTask(Task_InitDexNavSearch, 0); + gTasks[taskId].tSpecies = val & DEXNAV_MASK_SPECIES; + gTasks[taskId].tEnvironment = val >> 14; + PlaySE(SE_DEX_SEARCH); + return FALSE; //we dont actually want to enable the script context +} + +void EndDexNavSearch(u8 taskId) +{ + FlagClear(DN_FLAG_SEARCHING); + DestroyTask(taskId); + RemoveDexNavWindowAndGfx(); + FieldEffectStop(&gSprites[sDexNavSearchDataPtr->fldEffSpriteId], sDexNavSearchDataPtr->fldEffId); + Free(sDexNavSearchDataPtr); +} + +static void EndDexNavSearchSetupScript(const u8 *script, u8 taskId) +{ + gSaveBlock3Ptr->dexNavChain = 0; //reset chain + EndDexNavSearch(taskId); + ScriptContext_SetupScript(script); +} + +static u8 GetMovementProximityBySearchLevel(void) +{ + if (sDexNavSearchDataPtr->searchLevel < 20) + return 2; + else if (sDexNavSearchDataPtr->searchLevel < 50) + return 3; + else + return 4; +} + +static void Task_RevealHiddenMon(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u16 species = sDexNavSearchDataPtr->species; + + // remove owned icon if it exists + if (sDexNavSearchDataPtr->ownedIconSpriteId != MAX_SPRITES) + { + DestroySprite(&gSprites[sDexNavSearchDataPtr->ownedIconSpriteId]); + sDexNavSearchDataPtr->ownedIconSpriteId = MAX_SPRITES; + } + + // remove exclamation if it exists + if (sDexNavSearchDataPtr->exclamationSpriteId != MAX_SPRITES) + { + DestroySprite(&gSprites[sDexNavSearchDataPtr->exclamationSpriteId]); + sDexNavSearchDataPtr->exclamationSpriteId = MAX_SPRITES; + } + + + if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_SEEN)) + { + u8 index; + + //if not seen, hide name and whiteout mon + DrawSearchWindow(species, sDexNavSearchDataPtr->potential, TRUE); + DrawDexNavSearchMonIcon(species, &sDexNavSearchDataPtr->iconSpriteId, FALSE); + // whiteout icon + index = IndexOfSpritePaletteTag(gSprites[sDexNavSearchDataPtr->iconSpriteId].template->paletteTag); + CpuCopy16(&gPlttBufferUnfaded[0x100 + index * 16], sDexNavSearchDataPtr->palBuffer, 32); + TintPalette_CustomTone(sDexNavSearchDataPtr->palBuffer, 16, 510, 510, 510); + LoadPalette(sDexNavSearchDataPtr->palBuffer, 0x100 + index * 16, 32); + } + else + { + DrawSearchWindow(species, sDexNavSearchDataPtr->potential, FALSE); + DrawDexNavSearchMonIcon(species, &sDexNavSearchDataPtr->iconSpriteId, GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)); + } + + DexNavUpdateDirectionArrow(); + task->func = Task_DexNavSearch; + task->tFrameCount = 0; //restart search clock +} + +static void Task_DexNavSearch(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (sDexNavSearchDataPtr->proximity > MAX_PROXIMITY) + { // out of range + if (sDexNavSearchDataPtr->hiddenSearch && !task->tRevealed) + EndDexNavSearch(taskId); + else + EndDexNavSearchSetupScript(EventScript_LostSignal, taskId); + return; + } + + if (sDexNavSearchDataPtr->proximity <= CREEPING_PROXIMITY && !gPlayerAvatar.creeping && task->tFrameCount > 60) + { //should be creeping but player walks normally + if (sDexNavSearchDataPtr->hiddenSearch && !task->tRevealed) + EndDexNavSearch(taskId); + else + EndDexNavSearchSetupScript(EventScript_MovedTooFast, taskId); + return; + } + + if (sDexNavSearchDataPtr->proximity <= SNEAKING_PROXIMITY && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH | PLAYER_AVATAR_FLAG_BIKE)) + { // running/biking too close + //always do event script, even if player hasn't revealed a hidden mon. It's assumed they would be creeping towards it + EndDexNavSearchSetupScript(EventScript_MovedTooFast, taskId); + return; + } + + if (ArePlayerFieldControlsLocked() == TRUE) + { // check if script just executed + EndDexNavSearch(taskId); + return; + } + + if (gTasks[taskId].tFrameCount > DEXNAV_TIMEOUT * 60) + { // player took too long + if (sDexNavSearchDataPtr->hiddenSearch && !task->tRevealed) + EndDexNavSearch(taskId); + else + EndDexNavSearchSetupScript(EventScript_PokemonGotAway, taskId); + return; + } + + if (sDexNavSearchDataPtr->proximity < 1) + { + gDexNavBattle = TRUE; + CreateDexNavWildMon(sDexNavSearchDataPtr->species, sDexNavSearchDataPtr->potential, sDexNavSearchDataPtr->monLevel, + sDexNavSearchDataPtr->abilityNum, sDexNavSearchDataPtr->heldItem, sDexNavSearchDataPtr->moves); + + FlagClear(DN_FLAG_SEARCHING); + ScriptContext_SetupScript(EventScript_StartDexNavBattle); + Free(sDexNavSearchDataPtr); + DestroyTask(taskId); + return; + } + + if (sDexNavSearchDataPtr->hiddenSearch && !task->tRevealed && + (JOY_NEW(R_BUTTON) || (sDexNavSearchDataPtr->proximity < CREEPING_PROXIMITY))) + { + PlaySE(SE_DEX_SEARCH); + ClearStdWindowAndFrameToTransparent(sDexNavSearchDataPtr->windowId, FALSE); + CopyWindowToVram(sDexNavSearchDataPtr->windowId, 3); + RemoveWindow(sDexNavSearchDataPtr->windowId); + DestroySprite(&gSprites[sDexNavSearchDataPtr->iconSpriteId]); + task->tRevealed = TRUE; //regular dexnav search + //sDexNavSearchDataPtr->hiddenSearch = FALSE; //now its a regular dexnav search + task->func = Task_RevealHiddenMon; + return; + } + + //Caves and water the pokemon moves around + if ((sDexNavSearchDataPtr->environment == ENCOUNTER_TYPE_WATER || GetCurrentMapType() == MAP_TYPE_UNDERGROUND) + && sDexNavSearchDataPtr->proximity < GetMovementProximityBySearchLevel() && sDexNavSearchDataPtr->movementCount < 2 + && task->tRevealed) + { + FieldEffectStop(&gSprites[sDexNavSearchDataPtr->fldEffSpriteId], sDexNavSearchDataPtr->fldEffId); + + if (!TryStartHiddenMonFieldEffect(sDexNavSearchDataPtr->environment, 10, 10, TRUE)) + { + EndDexNavSearchSetupScript(EventScript_PokemonGotAway, taskId); + return; + } + + sDexNavSearchDataPtr->movementCount++; + } + + DexNavProximityUpdate(); + if (task->tProximity != sDexNavSearchDataPtr->proximity) + { + //player has moved + if (task->tRevealed) //update search window info only if hidden mon has been revealed (always true for search mode) + DexNavUpdateSearchWindow(sDexNavSearchDataPtr->proximity, sDexNavSearchDataPtr->searchLevel); + + task->tProximity = sDexNavSearchDataPtr->proximity; + } + + task->tFrameCount++; +} + +static void DexNavUpdateSearchWindow(u8 proximity, u8 searchLevel) +{ + bool8 hideName = FALSE; + + if (sDexNavSearchDataPtr->hiddenSearch && !GetSetPokedexFlag(SpeciesToNationalPokedexNum(sDexNavSearchDataPtr->species), FLAG_GET_SEEN)) + hideName = TRUE; //if a detector mode hidden search and player hasn't seen the mon, hide info + + FillWindowPixelBuffer(sDexNavSearchDataPtr->windowId, PIXEL_FILL(1)); //clear window + AddSearchWindowText(sDexNavSearchDataPtr->species, proximity, searchLevel, hideName); + + DexNavUpdateDirectionArrow(); + + //init hidden sprites + if (sDexNavSearchDataPtr->itemSpriteId != MAX_SPRITES) + gSprites[sDexNavSearchDataPtr->itemSpriteId].invisible = TRUE; + if (sDexNavSearchDataPtr->starSpriteIds[0] != MAX_SPRITES) + gSprites[sDexNavSearchDataPtr->starSpriteIds[0]].invisible = TRUE; + if (sDexNavSearchDataPtr->starSpriteIds[1] != MAX_SPRITES) + gSprites[sDexNavSearchDataPtr->starSpriteIds[1]].invisible = TRUE; + if (sDexNavSearchDataPtr->starSpriteIds[2] != MAX_SPRITES) + gSprites[sDexNavSearchDataPtr->starSpriteIds[2]].invisible = TRUE; + + if (proximity <= SNEAKING_PROXIMITY) + { + if (searchLevel > 2 && sDexNavSearchDataPtr->heldItem) + { + // toggle item view + if (sDexNavSearchDataPtr->itemSpriteId != MAX_SPRITES) + gSprites[sDexNavSearchDataPtr->itemSpriteId].invisible = FALSE; + } + + if (searchLevel > 4) + { + if (sDexNavSearchDataPtr->starSpriteIds[0] != MAX_SPRITES) + gSprites[sDexNavSearchDataPtr->starSpriteIds[0]].invisible = FALSE; + + if (sDexNavSearchDataPtr->starSpriteIds[1] != MAX_SPRITES) + gSprites[sDexNavSearchDataPtr->starSpriteIds[1]].invisible = FALSE; + + if (sDexNavSearchDataPtr->starSpriteIds[2] != MAX_SPRITES) + gSprites[sDexNavSearchDataPtr->starSpriteIds[2]].invisible = FALSE; + } + } +} + +////////////////////////////// +//// DEXNAV MON GENERATOR //// +////////////////////////////// +static void CreateDexNavWildMon(u16 species, u8 potential, u8 level, u8 abilityNum, u16 item, u16* moves) +{ + struct Pokemon* mon = &gEnemyParty[0]; + u8 iv[3] = {NUM_STATS}; + u8 i; + u8 perfectIv = 31; + + CreateWildMon(species, level); // shiny rate bonus handled in CreateBoxMon + + // Pick random, unique IVs to set to 31. The number of perfect IVs that are assigned is equal to the potential + iv[0] = Random() % NUM_STATS; // choose 1st perfect stat + do { + iv[1] = Random() % NUM_STATS; + iv[2] = Random() % NUM_STATS; + } while ((iv[1] == iv[0]) // unique 2nd perfect stat + || (iv[2] == iv[0] || iv[2] == iv[1])); // unique 3rd perfect stat + + if (potential > 2 && iv[2] != NUM_STATS) + SetMonData(mon, MON_DATA_HP_IV + iv[2], &perfectIv); + if (potential > 1 && iv[1] != NUM_STATS) + SetMonData(mon, MON_DATA_HP_IV + iv[1], &perfectIv); + if (potential > 0 && iv[0] != NUM_STATS) + SetMonData(mon, MON_DATA_HP_IV + iv[0], &perfectIv); + + //Set ability + SetMonData(mon, MON_DATA_ABILITY_NUM, &abilityNum); + + // Set Held Item + if (item) + SetMonData(mon, MON_DATA_HELD_ITEM, &item); + + //Set moves + for (i = 0; i < MAX_MON_MOVES; i++) + SetMonMoveSlot(mon, moves[i], i); + + CalculateMonStats(mon); +} + +// gets a random level of the species based on map data. +//if it was a hidden encounter, updates the environment it is to be found from the wildheader encounterRate +static u8 DexNavTryGenerateMonLevel(u16 species, u8 environment) +{ + u8 levelBase = GetEncounterLevelFromMapData(species, environment); + u8 levelBonus = gSaveBlock3Ptr->dexNavChain / 5; + + if (levelBase == MON_LEVEL_NONEXISTENT) + return MON_LEVEL_NONEXISTENT; //species not found in the area + + if (Random() % 100 < 4) + levelBonus += 10; //4% chance of having a +10 level + + if (levelBase + levelBonus > MAX_LEVEL) + return MAX_LEVEL; + else + return levelBase + levelBonus; +} + +static void DexNavGenerateMoveset(u16 species, u8 searchLevel, u8 encounterLevel, u16* moveDst) +{ + bool8 genMove = FALSE; + u16 randVal = Random() % 100; + u16 i; + u16 eggMoveBuffer[EGG_MOVES_ARRAY_COUNT]; + + // see if first move slot should be an egg move + if (searchLevel < 5) + { + if (SEARCHLEVEL0_MOVECHANCE != 0 && randVal < SEARCHLEVEL0_MOVECHANCE) + genMove = TRUE; + } + else if (searchLevel < 10) + { + if (SEARCHLEVEL5_MOVECHANCE != 0 && randVal < SEARCHLEVEL5_MOVECHANCE) + genMove = TRUE; + } + else if (searchLevel < 25) + { + if (SEARCHLEVEL10_MOVECHANCE != 0 && randVal < SEARCHLEVEL10_MOVECHANCE) + genMove = TRUE; + } + else if (searchLevel < 50) + { + if (SEARCHLEVEL25_MOVECHANCE != 0 && randVal < SEARCHLEVEL25_MOVECHANCE) + genMove = TRUE; + } + else if (searchLevel < 100) + { + if (SEARCHLEVEL50_MOVECHANCE != 0 && randVal < SEARCHLEVEL50_MOVECHANCE) + genMove = TRUE; + } + else + { + if (SEARCHLEVEL100_MOVECHANCE != 0 && randVal < SEARCHLEVEL100_MOVECHANCE) + genMove = TRUE; + } + + // Generate a wild mon just to get the initial moveset (later overwritten by CreateDexNavWildMon) + CreateWildMon(species, encounterLevel); + + // Store generated mon moves into Dex Nav Struct + for (i = 0; i < MAX_MON_MOVES; i++) + moveDst[i] = GetMonData(&gEnemyParty[0], MON_DATA_MOVE1 + i, NULL); + + // set first move slot to a random egg move if search level is good enough + if (genMove) + { + u8 numEggMoves = GetEggMoves(&gEnemyParty[0], eggMoveBuffer); + if (numEggMoves != 0) + moveDst[0] = eggMoveBuffer[Random() % numEggMoves]; + } +} + +static u16 DexNavGenerateHeldItem(u16 species, u8 searchLevel) +{ + u16 randVal = Random() % 100; + u8 searchLevelInfluence = searchLevel >> 1; + u16 item1 = gSpeciesInfo[species].itemCommon; + u16 item2 = gSpeciesInfo[species].itemRare; + + // if both are the same, 100% to hold + if (item1 == item2) + return item1; + + // if no items can be held, then yeah...no items + if (item2 == ITEM_NONE && item1 == ITEM_NONE) + return ITEM_NONE; + + // if only one entry, 50% chance + if (item2 == ITEM_NONE && item1 != ITEM_NONE) + return (randVal < 50) ? item1 : ITEM_NONE; + + // if both are distinct item1 = 50% + srclvl/2; item2 = 5% + srchlvl/2 + if (randVal < (50 + searchLevelInfluence + 5 + searchLevel)) + return (randVal > 5 + searchLevelInfluence) ? item1 : item2; + else + return ITEM_NONE; + + return ITEM_NONE; +} + +static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel) +{ + bool8 genAbility = FALSE; + u16 randVal = Random() % 100; + u8 abilityNum = 0; + + if (searchLevel < 5) + { + #if (SEARCHLEVEL0_ABILITYCHANCE != 0) + if (randVal < SEARCHLEVEL0_ABILITYCHANCE) + genAbility = TRUE; + #endif + } + else if (searchLevel < 10) + { + #if (SEARCHLEVEL5_ABILITYCHANCE != 0) + if (randVal < SEARCHLEVEL5_ABILITYCHANCE) + genAbility = TRUE; + #endif + } + else if (searchLevel < 25) + { + #if (SEARCHLEVEL10_ABILITYCHANCE != 0) + if (randVal < SEARCHLEVEL10_ABILITYCHANCE) + genAbility = TRUE; + #endif + } + else if (searchLevel < 50) + { + #if (SEARCHLEVEL25_ABILITYCHANCE != 0) + if (randVal < SEARCHLEVEL25_ABILITYCHANCE) + genAbility = TRUE; + #endif + } + else if (searchLevel < 100) + { + #if (SEARCHLEVEL50_ABILITYCHANCE != 0) + if (randVal < SEARCHLEVEL50_ABILITYCHANCE) + genAbility = TRUE; + #endif + } + else + { + #if (SEARCHLEVEL100_ABILITYCHANCE != 0) + if (randVal < SEARCHLEVEL100_ABILITYCHANCE) + genAbility = TRUE; + #endif + } + + if (genAbility + && gSpeciesInfo[species].abilities[2] != ABILITY_NONE + && GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) + { + //Only give hidden ability if Pokemon has been caught before + abilityNum = 2; + } + else + { + //Pick a normal ability of that Pokemon + if (gSpeciesInfo[species].abilities[1] != ABILITY_NONE) + abilityNum = Random() & 1; + else + abilityNum = 0; + } + + return abilityNum; +} + +static u8 DexNavGeneratePotential(u8 searchLevel) +{ + u8 genChance = 0; + int randVal = Random() % 100; + + if (searchLevel < 5) + { + genChance = SEARCHLEVEL0_ONESTAR + SEARCHLEVEL0_TWOSTAR + SEARCHLEVEL0_THREESTAR; + if (randVal < genChance) + { + // figure out which star it is + if (randVal < SEARCHLEVEL0_ONESTAR) + return 1; + else if (randVal < (SEARCHLEVEL0_ONESTAR + SEARCHLEVEL0_TWOSTAR)) + return 2; + else + return 3; + } + } + else if (searchLevel < 10) + { + genChance = SEARCHLEVEL5_ONESTAR + SEARCHLEVEL5_TWOSTAR + SEARCHLEVEL5_THREESTAR; + if (randVal < genChance) + { + // figure out which star it is + if (randVal < SEARCHLEVEL5_ONESTAR) + return 1; + else if (randVal < (SEARCHLEVEL5_ONESTAR + SEARCHLEVEL5_TWOSTAR)) + return 2; + else + return 3; + } + } + else if (searchLevel < 25) + { + genChance = SEARCHLEVEL10_ONESTAR + SEARCHLEVEL10_TWOSTAR + SEARCHLEVEL10_THREESTAR; + if (randVal < genChance) + { + // figure out which star it is + if (randVal < SEARCHLEVEL10_ONESTAR) + return 1; + else if (randVal < (SEARCHLEVEL10_ONESTAR + SEARCHLEVEL10_TWOSTAR)) + return 2; + else + return 3; + } + } + else if (searchLevel < 50) + { + genChance = SEARCHLEVEL25_ONESTAR + SEARCHLEVEL25_TWOSTAR + SEARCHLEVEL25_THREESTAR; + if (randVal < genChance) + { + // figure out which star it is + if (randVal < SEARCHLEVEL25_ONESTAR) + return 1; + else if (randVal < (SEARCHLEVEL25_ONESTAR + SEARCHLEVEL25_TWOSTAR)) + return 2; + else + return 3; + } + } + else if (searchLevel < 100) + { + genChance = SEARCHLEVEL50_ONESTAR + SEARCHLEVEL50_TWOSTAR + SEARCHLEVEL50_THREESTAR; + if (randVal < genChance) + { + // figure out which star it is + if (randVal < SEARCHLEVEL50_ONESTAR) + return 1; + else if (randVal < (SEARCHLEVEL50_ONESTAR + SEARCHLEVEL50_TWOSTAR)) + return 2; + else + return 3; + } + } + else + { + genChance = SEARCHLEVEL100_ONESTAR + SEARCHLEVEL100_TWOSTAR + SEARCHLEVEL100_THREESTAR; + if (randVal < genChance) + { + // figure out which star it is + if (randVal < SEARCHLEVEL100_ONESTAR) + return 1; + else if (randVal < (SEARCHLEVEL100_ONESTAR + SEARCHLEVEL100_TWOSTAR)) + return 2; + else + return 3; + } + } + + return 0; // No potential +} + +static u8 GetEncounterLevelFromMapData(u16 species, u8 environment) +{ + u16 headerId = GetCurrentMapWildMonHeaderId(); + const struct WildPokemonInfo *landMonsInfo = gWildMonHeaders[headerId].landMonsInfo; + const struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo; + const struct WildPokemonInfo *hiddenMonsInfo = gWildMonHeaders[headerId].hiddenMonsInfo; + u8 min = 100; + u8 max = 0; + u8 i; + + switch (environment) + { + case ENCOUNTER_TYPE_LAND: // grass + if (landMonsInfo == NULL) + return MON_LEVEL_NONEXISTENT; //Hidden pokemon should only appear on walkable tiles or surf tiles + + for (i = 0; i < LAND_WILD_COUNT; i++) + { + if (landMonsInfo->wildPokemon[i].species == species) + { + min = (min < landMonsInfo->wildPokemon[i].minLevel) ? min : landMonsInfo->wildPokemon[i].minLevel; + max = (max > landMonsInfo->wildPokemon[i].maxLevel) ? max : landMonsInfo->wildPokemon[i].maxLevel; + } + } + break; + case ENCOUNTER_TYPE_WATER: //water + if (waterMonsInfo == NULL) + return MON_LEVEL_NONEXISTENT; //Hidden pokemon should only appear on walkable tiles or surf tiles + + for (i = 0; i < WATER_WILD_COUNT; i++) + { + if (waterMonsInfo->wildPokemon[i].species == species) + { + min = (min < waterMonsInfo->wildPokemon[i].minLevel) ? min : waterMonsInfo->wildPokemon[i].minLevel; + max = (max > waterMonsInfo->wildPokemon[i].maxLevel) ? max : waterMonsInfo->wildPokemon[i].maxLevel; + } + } + break; + case ENCOUNTER_TYPE_HIDDEN: + if (hiddenMonsInfo == NULL) + return MON_LEVEL_NONEXISTENT; + + for (i = 0; i < HIDDEN_WILD_COUNT; i++) + { + if (hiddenMonsInfo->wildPokemon[i].species == species) + { + min = (min < hiddenMonsInfo->wildPokemon[i].minLevel) ? min : hiddenMonsInfo->wildPokemon[i].minLevel; + max = (max > hiddenMonsInfo->wildPokemon[i].maxLevel) ? max : hiddenMonsInfo->wildPokemon[i].maxLevel; + } + } + + // use encounter rate to signify is hidden pokemon are on land or in water + if (hiddenMonsInfo->encounterRate == 1) + sDexNavSearchDataPtr->environment = ENCOUNTER_TYPE_WATER; + else + sDexNavSearchDataPtr->environment = ENCOUNTER_TYPE_LAND; + break; + default: + return MON_LEVEL_NONEXISTENT; + } + + if (max == 0) + return MON_LEVEL_NONEXISTENT; + + return RandomUniform(RNG_DEXNAV_ENCOUNTER_LEVEL, min, max); +} + + +/////////// +/// GUI /// +/////////// +static const struct BgTemplate sDexNavMenuBgTemplates[2] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 31, + .priority = 0 + }, + { + .bg = 1, + .charBaseIndex = 3, + .mapBaseIndex = 30, + .priority = 1 + } +}; + +static void DexNav_VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void DexNav_MainCB(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + DoScheduledBgTilemapCopiesToVram(); + UpdatePaletteFade(); +} + +static bool8 DexNav_InitBgs(void) +{ + ResetVramOamAndBgCntRegs(); + ResetAllBgsCoordinates(); + sBg1TilemapBuffer = Alloc(0x800); + if (sBg1TilemapBuffer == NULL) + return FALSE; + + memset(sBg1TilemapBuffer, 0, 0x800); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sDexNavMenuBgTemplates, NELEMS(sDexNavMenuBgTemplates)); + SetBgTilemapBuffer(1, sBg1TilemapBuffer); + ScheduleBgCopyTilemapToVram(1); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + SetGpuReg(REG_OFFSET_BLDCNT , 0); + ShowBg(0); + ShowBg(1); + return TRUE; +} + +static bool8 DexNav_LoadGraphics(void) +{ + switch (sDexNavUiDataPtr->state) + { + case 0: + ResetTempTileDataBuffers(); + DecompressAndCopyTileDataToVram(1, sDexNavGuiTiles, 0, 0, 0); + sDexNavUiDataPtr->state++; + break; + case 1: + if (FreeTempTileDataBuffersIfPossible() != TRUE) + { + LZDecompressWram(sDexNavGuiTilemap, sBg1TilemapBuffer); + sDexNavUiDataPtr->state++; + } + break; + case 2: + LoadPalette(sDexNavGuiPal, 0, 32); + sDexNavUiDataPtr->state++; + break; + default: + sDexNavUiDataPtr->state = 0; + return TRUE; + } + + return FALSE; +} + +static void UpdateCursorPosition(void) +{ + u16 x, y; + + switch (sDexNavUiDataPtr->cursorRow) + { + case ROW_WATER: + x = ROW_WATER_ICON_X + (24 * sDexNavUiDataPtr->cursorCol); + y = ROW_WATER_ICON_Y; + sDexNavUiDataPtr->environment = ENCOUNTER_TYPE_WATER; + break; + case ROW_LAND_TOP: //land 1 + x = ROW_LAND_ICON_X + (24 * sDexNavUiDataPtr->cursorCol); + y = ROW_LAND_TOP_ICON_Y; + sDexNavUiDataPtr->environment = ENCOUNTER_TYPE_LAND; + break; + case ROW_LAND_BOT: //land 2 + x = ROW_LAND_ICON_X + (24 * sDexNavUiDataPtr->cursorCol); + y = ROW_LAND_BOT_ICON_Y; + sDexNavUiDataPtr->environment = ENCOUNTER_TYPE_LAND; + break; + case ROW_HIDDEN: + x = ROW_HIDDEN_ICON_X + (24 * sDexNavUiDataPtr->cursorCol); + y = ROW_HIDDEN_ICON_Y; + sDexNavUiDataPtr->environment = ENCOUNTER_TYPE_HIDDEN; + break; + default: + return; + } + + gSprites[sDexNavUiDataPtr->cursorSpriteId].x = x; + gSprites[sDexNavUiDataPtr->cursorSpriteId].y = y; + + PrintCurrentSpeciesInfo(); +} + +static void CreateSelectionCursor(void) +{ + u8 spriteId; + struct CompressedSpriteSheet spriteSheet; + + spriteSheet.data = sSelectionCursorGfx; + spriteSheet.size = 0x200; + spriteSheet.tag = SELECTION_CURSOR_TAG; + LoadCompressedSpriteSheet(&spriteSheet); + + LoadPalette(sSelectionCursorPal, (16 * sSelectionCursorOam.paletteNum) + 0x100, 32); + + spriteId = CreateSprite(&sSelectionCursorSpriteTemplate, 12, 32, 0); + //gSprites[spriteId].data[1] = -1; + + sDexNavUiDataPtr->cursorSpriteId = spriteId; + UpdateCursorPosition(); +} + +static void CreateNoDataIcon(s16 x, s16 y) +{ + CreateSprite(&sNoDataIconTemplate, x, y, 0); +} + +static bool8 CapturedAllLandMons(u16 headerId) +{ + u16 i, species; + int count = 0; + const struct WildPokemonInfo* landMonsInfo = gWildMonHeaders[headerId].landMonsInfo; + + if (landMonsInfo != NULL) + { + for (i = 0; i < LAND_WILD_COUNT; ++i) + { + species = landMonsInfo->wildPokemon[i].species; + if (species != SPECIES_NONE) + { + if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) + break; + + count++; + } + } + + if (i >= LAND_WILD_COUNT && count > 0) //All land mons caught + return TRUE; + } + else + { + return TRUE; //technically, no mon data means you caught them all + } + + return FALSE; +} + +//Checks if all Pokemon that can be encountered while surfing have been capture +static bool8 CapturedAllWaterMons(u16 headerId) +{ + u32 i; + u16 species; + u8 count = 0; + const struct WildPokemonInfo* waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo; + + if (waterMonsInfo != NULL) + { + for (i = 0; i < WATER_WILD_COUNT; ++i) + { + species = waterMonsInfo->wildPokemon[i].species; + if (species != SPECIES_NONE) + { + count++; + if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) + break; + } + } + + if (i >= WATER_WILD_COUNT && count > 0) + return TRUE; + } + else + { + return TRUE; //technically, no mon data means you caught them all + } + + return FALSE; +} + +static bool8 CapturedAllHiddenMons(u16 headerId) +{ + u32 i; + u16 species; + u8 count = 0; + const struct WildPokemonInfo* hiddenMonsInfo = gWildMonHeaders[headerId].hiddenMonsInfo; + + if (hiddenMonsInfo != NULL) + { + for (i = 0; i < HIDDEN_WILD_COUNT; ++i) + { + species = hiddenMonsInfo->wildPokemon[i].species; + if (species != SPECIES_NONE) + { + count++; + if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) + break; + } + } + + if (i >= HIDDEN_WILD_COUNT && count > 0) + return TRUE; + } + else + { + return TRUE; //technically, no mon data means you caught them all + } + + return FALSE; +} + +static void DexNavLoadCapturedAllSymbols(void) +{ + u16 headerId = GetCurrentMapWildMonHeaderId(); + + LoadCompressedSpriteSheetUsingHeap(&sCapturedAllPokemonSpriteSheet); + + if (CapturedAllLandMons(headerId)) + CreateSprite(&sCaptureAllMonsSpriteTemplate, 152, 58, 0); + + if (CapturedAllWaterMons(headerId)) + CreateSprite(&sCaptureAllMonsSpriteTemplate, 139, 17, 0); + + if (CapturedAllHiddenMons(headerId)) + CreateSprite(&sCaptureAllMonsSpriteTemplate, 114, 123, 0); +} + +//#define WIN_DETAILS_TILE 0x3a3 +static void DexNav_InitWindows(void) +{ + InitWindows(sDexNavGuiWindowTemplates); + DeactivateAllTextPrinters(); + ScheduleBgCopyTilemapToVram(0); +} + +static void DexNavGuiFreeResources(void) +{ + Free(sDexNavUiDataPtr); + Free(sBg1TilemapBuffer); + FreeAllWindowBuffers(); +} + +static void CB1_InitDexNavSearch(void) +{ + u8 taskId; + + if (!gPaletteFade.active && !ArePlayerFieldControlsLocked() && gMain.callback2 == CB2_Overworld) + { + SetMainCallback1(CB1_Overworld); + taskId = CreateTask(Task_InitDexNavSearch, 0); + gTasks[taskId].tSpecies = gSpecialVar_0x8000; + gTasks[taskId].tEnvironment = gSpecialVar_0x8001; + } +} + +static void CB1_DexNavSearchCallback(void) +{ + CB1_InitDexNavSearch(); +} + +static void Task_DexNavExitAndSearch(u8 taskId) +{ + DexNavGuiFreeResources(); + DestroyTask(taskId); + SetMainCallback1(CB1_DexNavSearchCallback); + SetMainCallback2(CB2_ReturnToField); +} + +static void Task_DexNavFadeAndExit(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(sDexNavUiDataPtr->savedCallback); + DexNavGuiFreeResources(); + DestroyTask(taskId); + } +} + +static void DexNavFadeAndExit(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + CreateTask(Task_DexNavFadeAndExit, 0); + SetVBlankCallback(DexNav_VBlankCB); + SetMainCallback2(DexNav_MainCB); +} + +static bool8 SpeciesInArray(u16 species, u8 section) +{ + u32 i; + u16 dexNum = SpeciesToNationalPokedexNum(species); + + switch (section) + { + case 0: //land + for (i = 0; i < LAND_WILD_COUNT; i++) + { + if (SpeciesToNationalPokedexNum(sDexNavUiDataPtr->landSpecies[i]) == dexNum) + return TRUE; + } + break; + case 1: //water + for (i = 0; i < WATER_WILD_COUNT; i++) + { + if (SpeciesToNationalPokedexNum(sDexNavUiDataPtr->waterSpecies[i]) == dexNum) + return TRUE; + } + break; + case 2: //hidden + for (i = 0; i < HIDDEN_WILD_COUNT; i++) + { + if (SpeciesToNationalPokedexNum(sDexNavUiDataPtr->hiddenSpecies[i]) == dexNum) + return TRUE; + } + break; + default: + break; + } + + return FALSE; +} + +// get unique wild encounters on current map +static void DexNavLoadEncounterData(void) +{ + u8 grassIndex = 0; + u8 waterIndex = 0; + u8 hiddenIndex = 0; + u16 species; + u32 i; + u16 headerId = GetCurrentMapWildMonHeaderId(); + const struct WildPokemonInfo* landMonsInfo = gWildMonHeaders[headerId].landMonsInfo; + const struct WildPokemonInfo* waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo; + const struct WildPokemonInfo* hiddenMonsInfo = gWildMonHeaders[headerId].hiddenMonsInfo; + + // nop struct data + memset(sDexNavUiDataPtr->landSpecies, 0, sizeof(sDexNavUiDataPtr->landSpecies)); + memset(sDexNavUiDataPtr->waterSpecies, 0, sizeof(sDexNavUiDataPtr->waterSpecies)); + memset(sDexNavUiDataPtr->hiddenSpecies, 0, sizeof(sDexNavUiDataPtr->hiddenSpecies)); + + // land mons + if (landMonsInfo != NULL && landMonsInfo->encounterRate != 0) + { + for (i = 0; i < LAND_WILD_COUNT; i++) + { + species = landMonsInfo->wildPokemon[i].species; + if (species != SPECIES_NONE && !SpeciesInArray(species, 0)) + sDexNavUiDataPtr->landSpecies[grassIndex++] = landMonsInfo->wildPokemon[i].species; + } + } + + // water mons + if (waterMonsInfo != NULL && waterMonsInfo->encounterRate != 0) + { + for (i = 0; i < WATER_WILD_COUNT; i++) + { + species = waterMonsInfo->wildPokemon[i].species; + if (species != SPECIES_NONE && !SpeciesInArray(species, 1)) + sDexNavUiDataPtr->waterSpecies[waterIndex++] = waterMonsInfo->wildPokemon[i].species; + } + } + + // hidden mons + if (hiddenMonsInfo != NULL) // no encounter rate check since 0 means land, 1 means water encounters + { + for (i = 0; i < HIDDEN_WILD_COUNT; i++) + { + species = hiddenMonsInfo->wildPokemon[i].species; + if (species != SPECIES_NONE && !SpeciesInArray(species, 2)) + sDexNavUiDataPtr->hiddenSpecies[hiddenIndex++] = hiddenMonsInfo->wildPokemon[i].species; + } + } +} + +static void TryDrawIconInSlot(u16 species, s16 x, s16 y) +{ + if (species == SPECIES_NONE || species > NUM_SPECIES) + CreateNoDataIcon(x, y); //'X' in slot + else if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_SEEN)) + CreateMonIcon(SPECIES_NONE, SpriteCB_MonIcon, x, y, 0, 0xFFFFFFFF); //question mark + else + CreateMonIcon(species, SpriteCB_MonIcon, x, y, 0, 0xFFFFFFFF); +} + +static void DrawSpeciesIcons(void) +{ + s16 x, y; + u32 i; + u16 species; + + LoadCompressedSpriteSheetUsingHeap(&sNoDataIconSpriteSheet); + for (i = 0; i < LAND_WILD_COUNT; i++) + { + species = sDexNavUiDataPtr->landSpecies[i]; + x = ROW_LAND_ICON_X + (24 * (i % COL_LAND_COUNT)); + y = ROW_LAND_TOP_ICON_Y + (i > COL_LAND_MAX ? 28 : 0); + TryDrawIconInSlot(species, x, y); + } + + for (i = 0; i < WATER_WILD_COUNT; i++) + { + species = sDexNavUiDataPtr->waterSpecies[i]; + x = ROW_WATER_ICON_X + 24 * i; + y = ROW_WATER_ICON_Y; + TryDrawIconInSlot(species, x, y); + } + + for (i = 0; i < HIDDEN_WILD_COUNT; i++) + { + species = sDexNavUiDataPtr->hiddenSpecies[i]; + x = ROW_HIDDEN_ICON_X + 24 * i; + y = ROW_HIDDEN_ICON_Y; + if (FlagGet(DN_FLAG_DETECTOR_MODE)) + TryDrawIconInSlot(species, x, y); + else if (species == SPECIES_NONE || species > NUM_SPECIES) + CreateNoDataIcon(x, y); + else + CreateMonIcon(SPECIES_NONE, SpriteCB_MonIcon, x, y, 0, 0xFFFFFFFF); //question mark if detector mode inactive + } +} + +static u16 DexNavGetSpecies(void) +{ + u16 species; + + switch (sDexNavUiDataPtr->cursorRow) + { + case ROW_WATER: + species = sDexNavUiDataPtr->waterSpecies[sDexNavUiDataPtr->cursorCol]; + break; + case ROW_LAND_TOP: + species = sDexNavUiDataPtr->landSpecies[sDexNavUiDataPtr->cursorCol]; + break; + case ROW_LAND_BOT: + species = sDexNavUiDataPtr->landSpecies[sDexNavUiDataPtr->cursorCol + COL_LAND_COUNT]; + break; + case ROW_HIDDEN: + if (!FlagGet(DN_FLAG_DETECTOR_MODE)) + species = SPECIES_NONE; + else + species = sDexNavUiDataPtr->hiddenSpecies[sDexNavUiDataPtr->cursorCol]; + break; + default: + return SPECIES_NONE; + } + + if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_SEEN)) + return SPECIES_NONE; + + return species; +} + +static void SetSpriteInvisibility(u8 spriteArrayId, bool8 invisible) +{ + gSprites[sDexNavUiDataPtr->typeIconSpriteIds[spriteArrayId]].invisible = invisible; +} + +// different from pokemon_summary_screen +#define TYPE_ICON_PAL_NUM_0 13 +#define TYPE_ICON_PAL_NUM_1 14 +#define TYPE_ICON_PAL_NUM_2 15 +static const u8 sMoveTypeToOamPaletteNum[NUMBER_OF_MON_TYPES] = +{ + [TYPE_NORMAL] = TYPE_ICON_PAL_NUM_0, + [TYPE_FIGHTING] = TYPE_ICON_PAL_NUM_0, + [TYPE_FLYING] = TYPE_ICON_PAL_NUM_1, + [TYPE_POISON] = TYPE_ICON_PAL_NUM_1, + [TYPE_GROUND] = TYPE_ICON_PAL_NUM_0, + [TYPE_ROCK] = TYPE_ICON_PAL_NUM_0, + [TYPE_BUG] = TYPE_ICON_PAL_NUM_2, + [TYPE_GHOST] = TYPE_ICON_PAL_NUM_1, + [TYPE_STEEL] = TYPE_ICON_PAL_NUM_0, + [TYPE_MYSTERY] = TYPE_ICON_PAL_NUM_2, + [TYPE_FIRE] = TYPE_ICON_PAL_NUM_0, + [TYPE_WATER] = TYPE_ICON_PAL_NUM_1, + [TYPE_GRASS] = TYPE_ICON_PAL_NUM_2, + [TYPE_ELECTRIC] = TYPE_ICON_PAL_NUM_0, + [TYPE_PSYCHIC] = TYPE_ICON_PAL_NUM_1, + [TYPE_ICE] = TYPE_ICON_PAL_NUM_1, + [TYPE_DRAGON] = TYPE_ICON_PAL_NUM_2, + [TYPE_DARK] = TYPE_ICON_PAL_NUM_0, + [TYPE_FAIRY] = TYPE_ICON_PAL_NUM_1, +}; +static void SetTypeIconPosAndPal(u8 typeId, u8 x, u8 y, u8 spriteArrayId) +{ + struct Sprite *sprite; + + sprite = &gSprites[sDexNavUiDataPtr->typeIconSpriteIds[spriteArrayId]]; + StartSpriteAnim(sprite, typeId); + sprite->oam.paletteNum = sMoveTypeToOamPaletteNum[typeId]; + sprite->x = x + 16; + sprite->y = y + 8; + SetSpriteInvisibility(spriteArrayId, FALSE); +} + +static void PrintCurrentSpeciesInfo(void) +{ + u16 species = DexNavGetSpecies(); + u16 dexNum = SpeciesToNationalPokedexNum(species); + u8 type1, type2; + + if (!GetSetPokedexFlag(dexNum, FLAG_GET_SEEN)) + species = SPECIES_NONE; + + // clear windows + FillWindowPixelBuffer(WINDOW_INFO, PIXEL_FILL(TEXT_COLOR_TRANSPARENT)); + + //species name + if (species == SPECIES_NONE) + AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SPECIES_INFO_Y, sFontColor_Black, 0, sText_DexNav_NoInfo); + else + AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SPECIES_INFO_Y, sFontColor_Black, 0, GetSpeciesName(species)); + + //type icon(s) + type1 = gSpeciesInfo[species].types[0]; + type2 = gSpeciesInfo[species].types[1]; + if (species == SPECIES_NONE) + type1 = type2 = TYPE_MYSTERY; + + if (type1 == type2) + { + SetTypeIconPosAndPal(type1, 186, 69, 0); + SetSpriteInvisibility(1, TRUE); + } + else + { + SetTypeIconPosAndPal(type1, 168, 69, 0); + SetTypeIconPosAndPal(type2, 168 + 33, 69, 1); + } + + //search level + if (species == SPECIES_NONE) + { + AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SEARCH_LEVEL_Y, sFontColor_Black, 0, sText_DexNav_NoInfo); + } + else + { + ConvertIntToDecimalStringN(gStringVar4, GetSearchLevel(dexNum), 0, 4); + AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SEARCH_LEVEL_Y, sFontColor_Black, 0, gStringVar4); + } + + //hidden ability + if (species == SPECIES_NONE) + { + AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, sText_DexNav_NoInfo); + } + else if (GetSetPokedexFlag(dexNum, FLAG_GET_CAUGHT)) + { + if (gSpeciesInfo[species].abilities[2] != ABILITY_NONE) + AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, gAbilitiesInfo[gSpeciesInfo[species].abilities[2]].name); + else + AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, gText_None); + } + else + { + AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, sText_DexNav_CaptureToSee); + } + + //current chain + ConvertIntToDecimalStringN(gStringVar1, gSaveBlock3Ptr->dexNavChain, STR_CONV_MODE_LEFT_ALIGN, 3); + AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, CHAIN_BONUS_Y, sFontColor_Black, 0, gStringVar1); + + CopyWindowToVram(WINDOW_INFO, 3); + PutWindowTilemap(WINDOW_INFO); +} + +static void PrintMapName(void) +{ + GetMapName(gStringVar3, GetCurrentRegionMapSectionId(), 0); + AddTextPrinterParameterized3(WINDOW_REGISTERED, 1, 108 + + GetStringRightAlignXOffset(1, gStringVar3, MAP_NAME_LENGTH * GetFontAttribute(1, FONTATTR_MAX_LETTER_WIDTH)), + 0, sFontColor_White, 0, gStringVar3); + CopyWindowToVram(WINDOW_REGISTERED, 3); +} + +static void PrintSearchableSpecies(u16 species) +{ + FillWindowPixelBuffer(WINDOW_REGISTERED, PIXEL_FILL(TEXT_COLOR_TRANSPARENT)); + PutWindowTilemap(WINDOW_REGISTERED); + if (species == SPECIES_NONE) + { + AddTextPrinterParameterized3(WINDOW_REGISTERED, 1, 0, 0, sFontColor_White, TEXT_SKIP_DRAW, sText_DexNav_PressRToRegister); + } + else + { + StringCopy(gStringVar1, GetSpeciesName(species)); + StringExpandPlaceholders(gStringVar4, sText_DexNav_SearchForRegisteredSpecies); + AddTextPrinterParameterized3(WINDOW_REGISTERED, 1, 0, 0, sFontColor_White, TEXT_SKIP_DRAW, gStringVar4); + } + + PrintMapName(); +} + +static void CreateTypeIconSprites(void) +{ + u8 i; + + LoadCompressedSpriteSheet(&gSpriteSheet_MoveTypes); + LoadCompressedPalette(gMoveTypes_Pal, 0x1D0, 0x60); + for (i = 0; i < 2; i++) + { + if (sDexNavUiDataPtr->typeIconSpriteIds[i] == 0xFF) + sDexNavUiDataPtr->typeIconSpriteIds[i] = CreateSprite(&gSpriteTemplate_MoveTypes, 10, 10, 2); + + SetSpriteInvisibility(i, TRUE); + } +} + +static bool8 DexNav_DoGfxSetup(void) +{ + u8 taskId; + + switch (gMain.state) + { + case 0: + SetVBlankHBlankCallbacksToNull(); + ClearScheduledBgCopiesToVram(); + gMain.state++; + break; + case 1: + ScanlineEffect_Stop(); + gMain.state++; + break; + case 2: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 3: + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + gMain.state++; + break; + case 4: + if (DexNav_InitBgs()) + { + sDexNavUiDataPtr->state = 0; + gMain.state++; + } + else + { + DexNavFadeAndExit(); + return TRUE; + } + break; + case 5: + if (DexNav_LoadGraphics() == TRUE) + gMain.state++; + break; + case 6: + DexNav_InitWindows(); + sDexNavUiDataPtr->cursorRow = ROW_LAND_TOP; + sDexNavUiDataPtr->cursorCol = 0; + sDexNavUiDataPtr->environment = ENCOUNTER_TYPE_LAND; + gMain.state++; + break; + case 7: + PrintSearchableSpecies(VarGet(DN_VAR_SPECIES) & DEXNAV_MASK_SPECIES); + DexNavLoadEncounterData(); + gMain.state++; + break; + case 8: + taskId = CreateTask(Task_DexNavWaitFadeIn, 0); + gTasks[taskId].tSpecies = 0; + gTasks[taskId].tEnvironment = sDexNavUiDataPtr->environment; + gMain.state++; + break; + case 9: + sDexNavUiDataPtr->typeIconSpriteIds[0] = 0xFF; + sDexNavUiDataPtr->typeIconSpriteIds[1] = 0xFF; + CreateTypeIconSprites(); + gMain.state++; + break; + case 10: + LoadMonIconPalettes(); + DrawSpeciesIcons(); + CreateSelectionCursor(); + DexNavLoadCapturedAllSymbols(); + gMain.state++; + break; + case 11: + BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + gMain.state++; + break; + case 12: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gMain.state++; + break; + default: + SetVBlankCallback(DexNav_VBlankCB); + SetMainCallback2(DexNav_MainCB); + return TRUE; + } + + return FALSE; +} + +static void DexNav_RunSetup(void) +{ + while (!DexNav_DoGfxSetup()) {} +} + +// Entry point for the dexnav GUI +static void DexNavGuiInit(MainCallback callback) +{ + if ((sDexNavUiDataPtr = AllocZeroed(sizeof(struct DexNavGUI))) == NULL) + { + SetMainCallback2(callback); + return; + } + + sDexNavUiDataPtr->state = 0; + sDexNavUiDataPtr->savedCallback = callback; + SetMainCallback2(DexNav_RunSetup); +} + +void Task_OpenDexNavFromStartMenu(u8 taskId) +{ + if (DEXNAV_ENABLED == FALSE) + { // must have it enabled to enter + DebugPrintfLevel(MGBA_LOG_ERROR, "DexNav was opened when DEXNAV_ENABLED config was disabled! Check include/config/dexnav.h"); + DestroyTask(taskId); + } + else if (!gPaletteFade.active) + { + CleanupOverworldWindowsAndTilemaps(); + DexNavGuiInit(CB2_ReturnToFieldWithOpenMenu); + DestroyTask(taskId); + } +} + +static void Task_DexNavWaitFadeIn(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_DexNavMain; +} + +static void Task_DexNavMain(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u16 species; + + if (IsSEPlaying()) + return; + + if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_POKENAV_OFF); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + task->func = Task_DexNavFadeAndExit; + } + else if (JOY_NEW(DPAD_UP)) + { + if (sDexNavUiDataPtr->cursorRow == ROW_WATER) + { + sDexNavUiDataPtr->cursorRow = ROW_HIDDEN; + if (sDexNavUiDataPtr->cursorCol >= COL_HIDDEN_COUNT) + sDexNavUiDataPtr->cursorCol = COL_HIDDEN_MAX; + } + else + { + if (sDexNavUiDataPtr->cursorRow == ROW_LAND_TOP && sDexNavUiDataPtr->cursorCol == COL_LAND_MAX) + sDexNavUiDataPtr->cursorCol = COL_WATER_MAX; + + sDexNavUiDataPtr->cursorRow--; + } + + PlaySE(SE_RG_BAG_CURSOR); + UpdateCursorPosition(); + } + else if (JOY_NEW(DPAD_DOWN)) + { + if (sDexNavUiDataPtr->cursorRow == ROW_HIDDEN) + { + sDexNavUiDataPtr->cursorRow = ROW_WATER; + } + else if (sDexNavUiDataPtr->cursorRow == ROW_LAND_BOT) + { + if (sDexNavUiDataPtr->cursorCol >= COL_HIDDEN_COUNT) + sDexNavUiDataPtr->cursorCol = COL_HIDDEN_MAX; + + sDexNavUiDataPtr->cursorRow++; + } + else + { + sDexNavUiDataPtr->cursorRow++; + } + + PlaySE(SE_RG_BAG_CURSOR); + UpdateCursorPosition(); + } + else if (JOY_NEW(DPAD_LEFT)) + { + if (sDexNavUiDataPtr->cursorCol == 0) + { + switch (sDexNavUiDataPtr->cursorRow) + { + case ROW_WATER: + sDexNavUiDataPtr->cursorCol = COL_WATER_MAX; + break; + case ROW_HIDDEN: + sDexNavUiDataPtr->cursorCol = COL_HIDDEN_MAX; + break; + default: + sDexNavUiDataPtr->cursorCol = COL_LAND_MAX; + break; + } + } + else + { + sDexNavUiDataPtr->cursorCol--; + } + + PlaySE(SE_RG_BAG_CURSOR); + UpdateCursorPosition(); + } + else if (JOY_NEW(DPAD_RIGHT)) + { + switch (sDexNavUiDataPtr->cursorRow) + { + case ROW_WATER: + if (sDexNavUiDataPtr->cursorCol == COL_WATER_MAX) + sDexNavUiDataPtr->cursorCol = 0; + else + sDexNavUiDataPtr->cursorCol++; + break; + case ROW_HIDDEN: + if (sDexNavUiDataPtr->cursorCol == COL_HIDDEN_MAX) + sDexNavUiDataPtr->cursorCol = 0; + else + sDexNavUiDataPtr->cursorCol++; + break; + default: + if (sDexNavUiDataPtr->cursorCol == COL_LAND_MAX) + sDexNavUiDataPtr->cursorCol = 0; + else + sDexNavUiDataPtr->cursorCol++; + break; + } + + PlaySE(SE_RG_BAG_CURSOR); + UpdateCursorPosition(); + } + else if (JOY_NEW(R_BUTTON)) + { + // check selection is valid. Play sound if invalid + species = DexNavGetSpecies(); + + if (species != SPECIES_NONE) + { + PrintSearchableSpecies(species); + //PlaySE(SE_DEX_SEARCH); + PlayCry_Script(species, 0); + + // create value to store in a var + VarSet(DN_VAR_SPECIES, ((sDexNavUiDataPtr->environment << 14) | species)); + } + else + { + PlaySE(SE_FAILURE); + } + } + else if (JOY_NEW(A_BUTTON)) + { + species = DexNavGetSpecies(); + if (species == SPECIES_NONE) + { + PlaySE(SE_FAILURE); + } + else + { + gSpecialVar_0x8000 = species; + gSpecialVar_0x8001 = sDexNavUiDataPtr->environment; + gSpecialVar_0x8002 = (sDexNavUiDataPtr->cursorRow == ROW_HIDDEN) ? TRUE : FALSE; + PlaySE(SE_DEX_SEARCH); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + task->func = Task_DexNavExitAndSearch; + } + } +} + +///////////////////////// +//// HIDDEN POKEMON ///// +///////////////////////// +bool8 TryFindHiddenPokemon(void) +{ + u16 *stepPtr = GetVarPointer(DN_VAR_STEP_COUNTER); + + if (DEXNAV_ENABLED == 0 + || !FlagGet(DN_FLAG_DETECTOR_MODE) + || FlagGet(DN_FLAG_SEARCHING) + || GetFlashLevel() > 0) + { + if (stepPtr != NULL) + (*stepPtr) = 0; + return FALSE; + } + + (*stepPtr)++; + (*stepPtr) %= HIDDEN_MON_STEP_COUNT; + if ((*stepPtr) == 0 && (Random() % 100 < HIDDEN_MON_SEARCH_RATE)) + { + // hidden pokemon + u16 headerId = GetCurrentMapWildMonHeaderId(); + u8 index; + u16 species; + u8 environment; + u8 taskId; + const struct WildPokemonInfo* hiddenMonsInfo = gWildMonHeaders[headerId].hiddenMonsInfo; + bool8 isHiddenMon = FALSE; + + // while you can still technically find hidden pokemon if there are not hidden-only pokemon on a map, + // this prevents any potential lagging on maps you dont want hidden pokemon to appear on + if (hiddenMonsInfo == NULL) + return FALSE; + + // encounter rate signifies surfing (1) or land mons (0)! + // again, for simplicity + switch (hiddenMonsInfo->encounterRate) + { + case 0: // land + // there are surely better ways to do this, but this allows greatest flexibility + if (Random() % 100 < HIDDEN_MON_PROBABILTY) + { + index = ChooseHiddenMonIndex(); + if (index == 0xFF) + return FALSE;//no hidden info + species = hiddenMonsInfo->wildPokemon[index].species; + isHiddenMon = TRUE; + environment = ENCOUNTER_TYPE_HIDDEN; + } + else + { + species = gWildMonHeaders[headerId].landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; + environment = ENCOUNTER_TYPE_LAND; + } + break; + case 1: // water + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + { + if (Random() % 100 < HIDDEN_MON_PROBABILTY) + { + index = ChooseHiddenMonIndex(); + if (index == 0xFF) + return FALSE;//no hidden info + species = hiddenMonsInfo->wildPokemon[index].species; + isHiddenMon = TRUE; + environment = ENCOUNTER_TYPE_HIDDEN; + } + else + { + species = gWildMonHeaders[headerId].waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; + environment = ENCOUNTER_TYPE_WATER; + + } + } + else + { + // not surfing -> cant find hidden water mons + return FALSE; + } + break; + default: + return FALSE; + } + + if (species == SPECIES_NONE) + return FALSE; + + sDexNavSearchDataPtr = AllocZeroed(sizeof(struct DexNavSearch)); + + // init search data + sDexNavSearchDataPtr->isHiddenMon = isHiddenMon; + sDexNavSearchDataPtr->species = species; + sDexNavSearchDataPtr->hiddenSearch = TRUE; + sDexNavSearchDataPtr->environment = environment; // updated in DexNavTryGenerateMonLevel if hidden mon + sDexNavSearchDataPtr->monLevel = DexNavTryGenerateMonLevel(species, environment); + if (sDexNavSearchDataPtr->monLevel == MON_LEVEL_NONEXISTENT) + { + Free(sDexNavSearchDataPtr); + return FALSE; + } + + // find tile for hidden mon and start effect if possible + if (!TryStartHiddenMonFieldEffect(sDexNavSearchDataPtr->environment, 8, 8, TRUE)) + return FALSE; + + // exclamation mark over player + gFieldEffectArguments[0] = gSaveBlock1Ptr->pos.x; + gFieldEffectArguments[1] = gSaveBlock1Ptr->pos.y; + gFieldEffectArguments[2] = gSprites[gPlayerAvatar.spriteId].subpriority - 1; + gFieldEffectArguments[3] = 2; + ObjectEventGetLocalIdAndMap(&gObjectEvents[gPlayerAvatar.objectEventId], &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON); + + PlayCry_Script(species, 0); + taskId = CreateTask(Task_SetUpDexNavSearch, 0); + gTasks[taskId].tSpecies = sDexNavSearchDataPtr->species; + gTasks[taskId].tEnvironment = sDexNavSearchDataPtr->environment; + gTasks[taskId].tRevealed = FALSE; + HideMapNamePopUpWindow(); + ChangeBgY_ScreenOff(0, 0, 0); + return FALSE; // we dont actually want to enable the script context or the game will freeze + } + + return FALSE; +} + +static void DrawSearchIcon(void) +{ + struct CompressedSpriteSheet spriteSheet; + + spriteSheet.data = sHiddenSearchIconGfx; + spriteSheet.size = 0x200; + spriteSheet.tag = SELECTION_CURSOR_TAG; + LoadCompressedSpriteSheet(&spriteSheet); + sDexNavSearchDataPtr->iconSpriteId = CreateSprite(&sSearchIconSpriteTemplate, 18, GetSearchWindowY() + 12, 0); +} + +// the initial hidden icon window ONLY shows search icon, ??? instead of name, and the search level (and pokeball icon if owned) +// if the player presses R or moves close enough, the full search window will be created +// this way, if the player is not interested in hidden pokemon it will not be too intrusive +static void DrawHiddenSearchWindow(u8 width) +{ + AddSearchWindow(width); + AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, SPECIES_ICON_X + 4, 0, sSearchFontColor, TEXT_SKIP_DRAW, sText_ThreeQmarks); + + ConvertIntToDecimalStringN(gStringVar1, sDexNavSearchDataPtr->searchLevel, STR_CONV_MODE_LEFT_ALIGN, 2); + StringExpandPlaceholders(gStringVar4, sText_SearchLevel); + AddTextPrinterParameterized3(sDexNavSearchDataPtr->windowId, 0, SPECIES_ICON_X + 4, 12, sSearchFontColor, TEXT_SKIP_DRAW, gStringVar4); + CopyWindowToVram(sDexNavSearchDataPtr->windowId, 2); +} + +static void DexNavDrawHiddenIcons(void) +{ + u16 species = sDexNavSearchDataPtr->species; + + DrawHiddenSearchWindow(12); + DrawSearchIcon(); + + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) + sDexNavSearchDataPtr->ownedIconSpriteId = CreateSprite(&sOwnedIconTemplate, SPECIES_ICON_X + 6, GetSearchWindowY() + 2, 0); + + if (sDexNavSearchDataPtr->isHiddenMon) + sDexNavSearchDataPtr->exclamationSpriteId = CreateSprite(&sHiddenMonIconTemplate, SPECIES_ICON_X + 34, GetSearchWindowY() + 8, 0); +} + +///////////////////////// +//// GENERAL UTILITY //// +///////////////////////// +u32 CalculateDexNavShinyRolls(void) +{ + u32 chainBonus, rndBonus; + u8 chain = gSaveBlock3Ptr->dexNavChain; + + chainBonus = (chain >= 100) ? 10 : (chain >= 50) ? 5 : 0; + rndBonus = (Random() % 100 < 4) ? 4 : 0; + return chainBonus + rndBonus; +} + +void TryIncrementSpeciesSearchLevel(u16 dexNum) +{ +#if USE_DEXNAV_SEARCH_LEVELS == TRUE + if (gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER && gSaveBlock3Ptr->dexNavSearchLevels[dexNum] < 255) + gSaveBlock3Ptr->dexNavSearchLevels[dexNum]++; +#endif +} + +void ResetDexNavSearch(void) +{ + gSaveBlock3Ptr->dexNavChain = 0; //reset dex nav chaining on new map + VarSet(DN_VAR_STEP_COUNTER, 0); //reset hidden pokemon step counter + if (FlagGet(DN_FLAG_SEARCHING)) + EndDexNavSearch(FindTaskIdByFunc(Task_DexNavSearch)); //moving to new map ends dexnav search +} + +void IncrementDexNavChain(void) +{ + if (gSaveBlock3Ptr->dexNavChain < DEXNAV_CHAIN_MAX) + gSaveBlock3Ptr->dexNavChain++; +} diff --git a/src/difficulty.c b/src/difficulty.c new file mode 100644 index 0000000000..470c7fb3fd --- /dev/null +++ b/src/difficulty.c @@ -0,0 +1,105 @@ +#include "global.h" +#include "data.h" +#include "event_data.h" +#include "script.h" +#include "constants/battle.h" + +enum DifficultyLevel GetCurrentDifficultyLevel(void) +{ + if (!B_VAR_DIFFICULTY) + return DIFFICULTY_NORMAL; + + return VarGet(B_VAR_DIFFICULTY); +} + +void SetCurrentDifficultyLevel(enum DifficultyLevel desiredDifficulty) +{ + if (!B_VAR_DIFFICULTY) + return; + + if (desiredDifficulty > DIFFICULTY_MAX) + desiredDifficulty = DIFFICULTY_MAX; + + VarSet(B_VAR_DIFFICULTY, desiredDifficulty); +} + +enum DifficultyLevel GetBattlePartnerDifficultyLevel(u16 partnerId) +{ + enum DifficultyLevel difficulty = GetCurrentDifficultyLevel(); + + if (partnerId > TRAINER_PARTNER(PARTNER_NONE)) + partnerId -= TRAINER_PARTNER(PARTNER_NONE); + + if (difficulty == DIFFICULTY_NORMAL) + return DIFFICULTY_NORMAL; + + if (gBattlePartners[difficulty][partnerId].party == NULL) + return DIFFICULTY_NORMAL; + + return difficulty; +} + +enum DifficultyLevel GetTrainerDifficultyLevel(u16 trainerId) +{ + enum DifficultyLevel difficulty = GetCurrentDifficultyLevel(); + + if (difficulty == DIFFICULTY_NORMAL) + return DIFFICULTY_NORMAL; + + if (gTrainers[difficulty][trainerId].party == NULL) + return DIFFICULTY_NORMAL; + + return difficulty; +} + +void Script_IncreaseDifficulty(void) +{ + enum DifficultyLevel currentDifficulty; + + if (!B_VAR_DIFFICULTY) + return; + + currentDifficulty = GetCurrentDifficultyLevel(); + + if (currentDifficulty++ > DIFFICULTY_MAX) + return; + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(B_VAR_DIFFICULTY); + + SetCurrentDifficultyLevel(currentDifficulty); +} + +void Script_DecreaseDifficulty(void) +{ + enum DifficultyLevel currentDifficulty; + + if (!B_VAR_DIFFICULTY) + return; + + currentDifficulty = GetCurrentDifficultyLevel(); + + if (!currentDifficulty) + return; + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(B_VAR_DIFFICULTY); + + SetCurrentDifficultyLevel(--currentDifficulty); +} + +void Script_GetDifficulty(void) +{ + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = GetCurrentDifficultyLevel(); +} + +void Script_SetDifficulty(struct ScriptContext *ctx) +{ + enum DifficultyLevel desiredDifficulty = ScriptReadByte(ctx); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(B_VAR_DIFFICULTY); + + SetCurrentDifficultyLevel(desiredDifficulty); +} diff --git a/src/digit_obj_util.c b/src/digit_obj_util.c index f66dc80cb7..f9e3ed1c01 100644 --- a/src/digit_obj_util.c +++ b/src/digit_obj_util.c @@ -239,9 +239,9 @@ static void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool3 static void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign) { u32 pow10 = objWork->pow10; - static int oamId; - static int curDigit; - static int firstDigit; + int oamId; + int curDigit; + int firstDigit; oamId = objWork->firstOamId; curDigit = 0; diff --git a/src/easy_chat.c b/src/easy_chat.c index 457abf3929..0de7abad25 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -17,6 +17,7 @@ #include "main.h" #include "mystery_gift.h" #include "menu.h" +#include "move.h" #include "overworld.h" #include "palette.h" #include "pokedex.h" diff --git a/src/ereader_screen.c b/src/ereader_screen.c old mode 100755 new mode 100644 index 556acf8e3c..2e5bbe1176 --- a/src/ereader_screen.c +++ b/src/ereader_screen.c @@ -18,17 +18,10 @@ struct EReaderTaskData { u16 timer; - u16 unused1; - u16 unused2; - u16 unused3; u8 state; u8 textState; - u8 unused4; - u8 unused5; - u8 unused6; - u8 unused7; u8 status; - u8 *unusedBuffer; + u8 *buffer; }; struct EReaderData @@ -40,9 +33,6 @@ struct EReaderData static void Task_EReader(u8); -// This belongs in COMMON somewhere between party_menu and ereader_screen, but it's unused so it's unclear where. -COMMON_DATA UNUSED u8 gUnknownSpace[64] = {0}; - COMMON_DATA struct EReaderData gEReaderData = {0}; extern const u8 gMultiBootProgram_EReader_Start[]; @@ -101,7 +91,6 @@ static u8 EReader_Transfer(struct EReaderData *eReader) static void OpenEReaderLink(void) { - memset(gDecompressionBuffer, 0, 0x2000); gLinkType = LINKTYPE_EREADER_EM; OpenLink(); SetSuppressLinkErrorMessage(TRUE); @@ -254,16 +243,9 @@ void CreateEReaderTask(void) data = (struct EReaderTaskData *)gTasks[taskId].data; data->state = 0; data->textState = 0; - data->unused4 = 0; - data->unused5 = 0; - data->unused6 = 0; - data->unused7 = 0; data->timer = 0; - data->unused1 = 0; - data->unused2 = 0; - data->unused3 = 0; data->status = 0; - data->unusedBuffer = AllocZeroed(CLIENT_MAX_MSG_SIZE); + data->buffer = AllocZeroed(0x2000); } static void ResetTimer(u16 *timer) @@ -474,7 +456,7 @@ static void Task_EReader(u8 taskId) } break; case ER_STATE_VALIDATE_CARD: - data->status = ValidateTrainerHillData((struct EReaderTrainerHillSet *)gDecompressionBuffer); + data->status = ValidateTrainerHillData((struct EReaderTrainerHillSet *)data->buffer); SetCloseLinkCallbackAndType(data->status); data->state = ER_STATE_WAIT_DISCONNECT; break; @@ -488,7 +470,7 @@ static void Task_EReader(u8 taskId) } break; case ER_STATE_SAVE: - if (TryWriteTrainerHill((struct EReaderTrainerHillSet *)&gDecompressionBuffer)) + if (TryWriteTrainerHill((struct EReaderTrainerHillSet *)data->buffer)) { MG_AddMessageTextPrinter(gJPText_ConnectionComplete); ResetTimer(&data->timer); @@ -528,7 +510,7 @@ static void Task_EReader(u8 taskId) data->state = ER_STATE_START; break; case ER_STATE_END: - Free(data->unusedBuffer); + Free(data->buffer); DestroyTask(taskId); SetMainCallback2(MainCB_FreeAllBuffersAndReturnToInitTitleScreen); break; diff --git a/src/event_data.c b/src/event_data.c index 33cb02027b..a8a05598a5 100644 --- a/src/event_data.c +++ b/src/event_data.c @@ -27,8 +27,27 @@ EWRAM_DATA u16 gSpecialVar_MonBoxPos = 0; EWRAM_DATA u16 gSpecialVar_Unused_0x8014 = 0; EWRAM_DATA static u8 sSpecialFlags[SPECIAL_FLAGS_SIZE] = {0}; +#if TESTING +#define TEST_FLAGS_SIZE 1 +#define TEST_VARS_SIZE 8 +EWRAM_DATA static u8 sTestFlags[TEST_FLAGS_SIZE] = {0}; +EWRAM_DATA static u16 sTestVars[TEST_VARS_SIZE] = {0}; +#endif // TESTING + extern u16 *const gSpecialVars[]; +const u16 gBadgeFlags[NUM_BADGES] = +{ + FLAG_BADGE01_GET, + FLAG_BADGE02_GET, + FLAG_BADGE03_GET, + FLAG_BADGE04_GET, + FLAG_BADGE05_GET, + FLAG_BADGE06_GET, + FLAG_BADGE07_GET, + FLAG_BADGE08_GET, +}; + void InitEventData(void) { memset(gSaveBlock1Ptr->flags, 0, sizeof(gSaveBlock1Ptr->flags)); @@ -167,6 +186,10 @@ u16 *GetVarPointer(u16 id) return NULL; else if (id < SPECIAL_VARS_START) return &gSaveBlock1Ptr->vars[id - VARS_START]; +#if TESTING + else if (id >= TESTING_VARS_START) + return &sTestVars[id - TESTING_VARS_START]; +#endif // TESTING else return gSpecialVars[id - SPECIAL_VARS_START]; } @@ -207,6 +230,10 @@ u8 *GetFlagPointer(u16 id) return NULL; else if (id < SPECIAL_FLAGS_START) return &gSaveBlock1Ptr->flags[id / 8]; +#if TESTING + else if (id >= TESTING_FLAGS_START) + return &sTestFlags[(id - TESTING_FLAGS_START) / 8]; +#endif // TESTING else return &sSpecialFlags[(id - SPECIAL_FLAGS_START) / 8]; } diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 36b8ea69e7..bb546e1fa9 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -25,6 +25,7 @@ #include "metatile_behavior.h" #include "overworld.h" #include "palette.h" +#include "party_menu.h" #include "pokemon.h" #include "pokeball.h" #include "random.h" @@ -200,7 +201,6 @@ static bool8 GetFollowerInfo(u32 *species, bool32 *shiny, bool32 *female); static u32 LoadDynamicFollowerPalette(u32 species, bool32 shiny, bool32 female); static const struct ObjectEventGraphicsInfo *SpeciesToGraphicsInfo(u32 species, bool32 shiny, bool32 female); static bool8 NpcTakeStep(struct Sprite *); -static bool8 IsElevationMismatchAt(u8, s16, s16); static bool8 AreElevationsCompatible(u8, u8); static void CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(u16 graphicsId, u16 movementType, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables); @@ -2026,11 +2026,16 @@ static u32 LoadDynamicFollowerPalette(u32 species, bool32 shiny, bool32 female) // Check if pal data must be decompressed if (IsLZ77Data(spritePalette.data, PLTT_SIZE_4BPP, PLTT_SIZE_4BPP)) { - // IsLZ77Data guarantees word-alignment, so casting this is safe - LZ77UnCompWram((u32*)spritePalette.data, gDecompressionBuffer); - spritePalette.data = (void*)gDecompressionBuffer; + struct CompressedSpritePalette compSpritePalette; + + compSpritePalette.data = (const void *) spritePalette.data; + compSpritePalette.tag = spritePalette.tag; + paletteNum = LoadCompressedSpritePalette(&compSpritePalette); + } + else + { + paletteNum = LoadSpritePalette(&spritePalette); } - paletteNum = LoadSpritePalette(&spritePalette); } else #endif //OW_POKEMON_OBJECT_EVENTS == TRUE && OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE @@ -2119,21 +2124,24 @@ static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) } } -static u16 GetOverworldCastformSpecies(void) +u16 GetOverworldWeatherSpecies(u16 species) { - switch (GetCurrentWeather()) + u32 i; + u32 weather = GetCurrentWeather(); + const struct FormChange *formChanges = GetSpeciesFormChanges(species); + + for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) { - case WEATHER_SUNNY_CLOUDS: - case WEATHER_DROUGHT: - return SPECIES_CASTFORM_SUNNY; - case WEATHER_RAIN: - case WEATHER_RAIN_THUNDERSTORM: - case WEATHER_DOWNPOUR: - return SPECIES_CASTFORM_RAINY; - case WEATHER_SNOW: - return SPECIES_CASTFORM_SNOWY; + // Unlike other form change checks, we don't do the "species != formChanges[i].targetSpecies" check + if (formChanges[i].method == FORM_CHANGE_OVERWORLD_WEATHER) + { + if (formChanges[i].param1 == weather) + return formChanges[i].targetSpecies; + else if (formChanges[i].param1 == WEATHER_NONE) // Set the default form for weather not defined in form change table + species = formChanges[i].targetSpecies; + } } - return SPECIES_CASTFORM_NORMAL; + return species; } static bool8 GetMonInfo(struct Pokemon *mon, u32 *species, bool32 *shiny, bool32 *female) @@ -2153,8 +2161,8 @@ static bool8 GetMonInfo(struct Pokemon *mon, u32 *species, bool32 *shiny, bool32 case SPECIES_UNOWN: *species = GetUnownSpecies(mon); break; - case SPECIES_CASTFORM: // form is based on overworld weather - *species = GetOverworldCastformSpecies(); + default: + *species = GetOverworldWeatherSpecies(*species); break; } return TRUE; @@ -2180,6 +2188,7 @@ void UpdateFollowingPokemon(void) // 3. flag is set if (OW_POKEMON_OBJECT_EVENTS == FALSE || OW_FOLLOWERS_ENABLED == FALSE + || FlagGet(B_FLAG_FOLLOWERS_DISABLED) || !GetFollowerInfo(&species, &shiny, &female) || SpeciesToGraphicsInfo(species, shiny, female) == NULL || (gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, shiny, female)->oam->size > ST_OAM_SIZE_2) @@ -5291,14 +5300,20 @@ static bool32 EndFollowerTransformEffect(struct ObjectEvent *objectEvent, struct static bool32 TryStartFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u32 multi; - if (GET_BASE_SPECIES_ID(OW_SPECIES(objectEvent)) == SPECIES_CASTFORM - && OW_SPECIES(objectEvent) != (multi = GetOverworldCastformSpecies())) + struct Pokemon *mon; + u32 ability; + if (DoesSpeciesHaveFormChangeMethod(OW_SPECIES(objectEvent), FORM_CHANGE_OVERWORLD_WEATHER) + && OW_SPECIES(objectEvent) != (multi = GetOverworldWeatherSpecies(OW_SPECIES(objectEvent)))) { sprite->data[7] = TRANSFORM_TYPE_WEATHER << 8; + PlaySE(SE_M_MINIMIZE); return TRUE; } - else if ((Random() & 0xFFFF) < 18 && GetLocalWildMon(FALSE) - && (OW_SPECIES(objectEvent) == SPECIES_MEW || OW_SPECIES(objectEvent) == SPECIES_DITTO)) + + if (OW_FOLLOWERS_COPY_WILD_PKMN + && (MonKnowsMove(mon = GetFirstLiveMon(), MOVE_TRANSFORM) + || (ability = GetMonAbility(mon)) == ABILITY_IMPOSTER || ability == ABILITY_ILLUSION) + && (Random() & 0xFFFF) < 18 && GetLocalWildMon(FALSE)) { sprite->data[7] = TRANSFORM_TYPE_RANDOM_WILD << 8; PlaySE(SE_M_MINIMIZE); @@ -5332,7 +5347,7 @@ static bool8 UpdateFollowerTransformEffect(struct ObjectEvent *objectEvent, stru break; case TRANSFORM_TYPE_WEATHER: multi = objectEvent->graphicsId; - objectEvent->graphicsId = GetOverworldCastformSpecies(); + objectEvent->graphicsId = GetOverworldWeatherSpecies(OW_SPECIES(objectEvent)); if (!objectEvent->graphicsId) { objectEvent->graphicsId = multi; @@ -5952,9 +5967,15 @@ u8 GetDirectionToFace(s16 x, s16 y, s16 targetX, s16 targetY) // Uses the above, but script accessible, and uses localIds void GetDirectionToFaceScript(struct ScriptContext *ctx) { - u16 *var = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); u8 sourceId = GetObjectEventIdByLocalId(ScriptReadByte(ctx)); u8 targetId = GetObjectEventIdByLocalId(ScriptReadByte(ctx)); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + + u16 *var = GetVarPointer(varId); + if (var == NULL) return; if (sourceId >= OBJECT_EVENTS_COUNT || targetId >= OBJECT_EVENTS_COUNT) @@ -5970,7 +5991,12 @@ void GetDirectionToFaceScript(struct ScriptContext *ctx) // Intended to be called before the field effect itself void IsFollowerFieldMoveUser(struct ScriptContext *ctx) { - u16 *var = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + + u16 *var = GetVarPointer(varId); u16 userIndex = gFieldEffectArguments[0]; // field move user index struct Pokemon *follower = GetFirstLiveMon(); struct ObjectEvent *obj = GetFollowerObject(); @@ -9562,7 +9588,7 @@ static void SetObjectEventSpriteOamTableForLongGrass(struct ObjectEvent *objEven sprite->subspriteTableNum = 5; } -static bool8 IsElevationMismatchAt(u8 elevation, s16 x, s16 y) +bool8 IsElevationMismatchAt(u8 elevation, s16 x, s16 y) { u8 mapElevation; @@ -10978,6 +11004,13 @@ void GetDaycareGraphics(struct ScriptContext *ctx) bool32 shiny; bool32 female; s32 i; + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varGfx[0]); + Script_RequestWriteVar(varGfx[1]); + Script_RequestWriteVar(varForm[0]); + Script_RequestWriteVar(varForm[1]); + for (i = 0; i < 2; i++) { GetMonInfo((struct Pokemon *) &gSaveBlock1Ptr->daycare.mons[i].mon, &specGfx, &shiny, &female); diff --git a/src/fake_rtc.c b/src/fake_rtc.c index f3f3b74c39..4dbf7837ba 100644 --- a/src/fake_rtc.c +++ b/src/fake_rtc.c @@ -5,6 +5,7 @@ #include "rtc.h" #include "fake_rtc.h" #include "event_data.h" +#include "script.h" struct Time *FakeRtc_GetCurrentTime(void) { @@ -90,15 +91,21 @@ STATIC_ASSERT((OW_FLAG_PAUSE_TIME == 0 || OW_USE_FAKE_RTC == TRUE), FakeRtcMustB void Script_PauseFakeRtc(void) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + FlagSet(OW_FLAG_PAUSE_TIME); } void Script_ResumeFakeRtc(void) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + FlagClear(OW_FLAG_PAUSE_TIME); } void Script_ToggleFakeRtc(void) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + FlagToggle(OW_FLAG_PAUSE_TIME); } diff --git a/src/field_camera.c b/src/field_camera.c index e76ba3d855..89f73ccbec 100644 --- a/src/field_camera.c +++ b/src/field_camera.c @@ -12,7 +12,7 @@ #include "sprite.h" #include "text.h" -EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE; +//EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE; // Old EWRAM variable that was never set to anything other than false struct FieldCameraOffset { @@ -464,6 +464,11 @@ void UpdateCameraPanning(void) static void CameraPanningCB_PanAhead(void) { + InstallCameraPanAheadCallback(); + // Old code kept for archival purposes + // The else condition could never run since gUnusedBikeCameraAheadPanback was never set to TRUE + // So the behavior should not change + /* u8 var; if (gUnusedBikeCameraAheadPanback == FALSE) @@ -504,4 +509,5 @@ static void CameraPanningCB_PanAhead(void) sVerticalCameraPan -= 2; } } + */ } diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 05da7d2041..a9be5b55a0 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -4,6 +4,7 @@ #include "coord_event_weather.h" #include "daycare.h" #include "debug.h" +#include "dexnav.h" #include "faraway_island.h" #include "event_data.h" #include "event_object_movement.h" @@ -91,7 +92,7 @@ void FieldClearPlayerInput(struct FieldInput *input) input->heldDirection2 = FALSE; input->tookStep = FALSE; input->pressedBButton = FALSE; - input->input_field_1_0 = FALSE; + input->pressedRButton = FALSE; input->input_field_1_1 = FALSE; input->input_field_1_2 = FALSE; input->input_field_1_3 = FALSE; @@ -116,6 +117,8 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) input->pressedAButton = TRUE; if (newKeys & B_BUTTON) input->pressedBButton = TRUE; + if (newKeys & R_BUTTON && !FlagGet(DN_FLAG_SEARCHING)) + input->pressedRButton = TRUE; } if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT)) @@ -222,8 +225,15 @@ int ProcessPlayerFieldInput(struct FieldInput *input) ShowStartMenu(); return TRUE; } + + if (input->tookStep && TryFindHiddenPokemon()) + return TRUE; + if (input->pressedSelectButton && UseRegisteredKeyItemOnField() == TRUE) return TRUE; + + if (input->pressedRButton && TryStartDexNavSearch()) + return TRUE; if(input->input_field_1_2 && DEBUG_OVERWORLD_MENU && !DEBUG_OVERWORLD_IN_MENU) { @@ -265,7 +275,7 @@ static u16 GetPlayerCurMetatileBehavior(int runningState) static bool8 TryStartInteractionScript(struct MapPosition *position, u16 metatileBehavior, u8 direction) { const u8 *script = GetInteractionScript(position, metatileBehavior, direction); - if (script == NULL) + if (script == NULL || Script_HasNoEffect(script)) return FALSE; // Don't play interaction sound for certain scripts. @@ -580,7 +590,12 @@ static bool8 TryStartCoordEventScript(struct MapPosition *position) if (script == NULL) return FALSE; - ScriptContext_SetupScript(script); + + struct ScriptContext ctx; + if (!RunScriptImmediatelyUntilEffect(SCREFF_V1 | SCREFF_HARDWARE, script, &ctx)) + return FALSE; + + ScriptContext_ContinueScript(&ctx); return TRUE; } diff --git a/src/field_effect.c b/src/field_effect.c index 501a249ee4..3d6e6e67cb 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1,6 +1,7 @@ #include "global.h" #include "data.h" #include "decompress.h" +#include "event_data.h" #include "event_object_movement.h" #include "field_camera.h" #include "field_control_avatar.h" @@ -13,6 +14,7 @@ #include "fldeff.h" #include "gpu_regs.h" #include "main.h" +#include "malloc.h" #include "mirage_tower.h" #include "menu.h" #include "metatile_behavior.h" @@ -28,9 +30,10 @@ #include "trainer_pokemon_sprites.h" #include "trig.h" #include "util.h" -#include "constants/field_effects.h" #include "constants/event_objects.h" #include "constants/event_object_movement.h" +#include "constants/field_effects.h" +#include "constants/flags.h" #include "constants/metatile_behaviors.h" #include "constants/rgb.h" #include "constants/songs.h" @@ -39,6 +42,7 @@ #define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} EWRAM_DATA s32 gFieldEffectArguments[8] = {0}; +EWRAM_DATA bool8 gSkipShowMonAnim = FALSE; // Static type declarations @@ -894,8 +898,20 @@ bool8 FieldEffectActiveListContains(u8 id) u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer) { struct SpriteTemplate spriteTemplate; + bool32 alloced = FALSE; + + // Allocate memory for buffer + if (buffer == NULL) + { + buffer = Alloc(TRAINER_PIC_SIZE + PLTT_SIZEOF(16)); + alloced = TRUE; + } + LoadCompressedSpritePaletteOverrideBuffer(&gTrainerSprites[trainerSpriteID].palette, buffer); LoadCompressedSpriteSheetOverrideBuffer(&gTrainerSprites[trainerSpriteID].frontPic, buffer); + if (alloced) + Free(buffer); + spriteTemplate.tileTag = gTrainerSprites[trainerSpriteID].frontPic.tag; spriteTemplate.paletteTag = gTrainerSprites[trainerSpriteID].palette.tag; spriteTemplate.oam = &sOam_64x64; @@ -3231,7 +3247,8 @@ static void FlyOutFieldEffect_ShowMon(struct Task *task) { task->tState++; gFieldEffectArguments[0] = task->tMonId; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + if (!gSkipShowMonAnim) + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); } } @@ -3480,6 +3497,7 @@ static void StartFlyBirdReturnToBall(u8 spriteId) u8 FldEff_FlyIn(void) { CreateTask(Task_FlyIn, 254); + gSkipShowMonAnim = FALSE; // Clears this variable so flying via the party menu keeps the show mon animation return 0; } @@ -3932,6 +3950,21 @@ static void Task_MoveDeoxysRock(u8 taskId) } } +u8 FldEff_CaveDust(void) +{ + u8 spriteId; + + SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_CAVE_DUST], gFieldEffectArguments[0], gFieldEffectArguments[1], 0xFF); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].coordOffsetEnabled = TRUE; + gSprites[spriteId].data[0] = 22; + } + + return spriteId; +} + #undef tState #undef tSpriteId #undef tTargetX diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 1991892a50..c17803d0f2 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -1015,7 +1015,7 @@ void UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite) #undef sPrevX #undef sPrevY -u32 FldEff_UnusedGrass(void) +u32 FldEff_ShakingGrass(void) { u8 spriteId; @@ -1026,12 +1026,13 @@ u32 FldEff_UnusedGrass(void) struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->sWaitFldEff = FLDEFF_UNUSED_GRASS; + sprite->sWaitFldEff = FLDEFF_SHAKING_GRASS; } - return 0; + + return spriteId; } -u32 FldEff_UnusedGrass2(void) +u32 FldEff_ShakingGrass2(void) { u8 spriteId; @@ -1042,9 +1043,10 @@ u32 FldEff_UnusedGrass2(void) struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->sWaitFldEff = FLDEFF_UNUSED_GRASS_2; + sprite->sWaitFldEff = FLDEFF_SHAKING_LONG_GRASS; } - return 0; + + return spriteId; } u32 FldEff_UnusedSand(void) @@ -1058,9 +1060,9 @@ u32 FldEff_UnusedSand(void) struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->sWaitFldEff = FLDEFF_UNUSED_SAND; + sprite->sWaitFldEff = FLDEFF_SAND_HOLE; } - return 0; + return spriteId; } u32 FldEff_WaterSurfacing(void) @@ -1076,7 +1078,8 @@ u32 FldEff_WaterSurfacing(void) sprite->oam.priority = gFieldEffectArguments[3]; sprite->sWaitFldEff = FLDEFF_WATER_SURFACING; } - return 0; + + return spriteId; } // Sprite data for FLDEFF_ASH @@ -1474,7 +1477,7 @@ u32 FldEff_BerryTreeGrowthSparkle(void) UpdateSpritePaletteByTemplate(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPARKLE], sprite); sprite->sWaitFldEff = FLDEFF_BERRY_TREE_GROWTH_SPARKLE; } - return 0; + return spriteId; } // Sprite data for FLDEFF_TREE_DISGUISE / FLDEFF_MOUNTAIN_DISGUISE / FLDEFF_SAND_DISGUISE @@ -1602,7 +1605,7 @@ u32 FldEff_Sparkle(void) gSprites[spriteId].oam.priority = gFieldEffectArguments[2]; gSprites[spriteId].coordOffsetEnabled = TRUE; } - return 0; + return spriteId; } void UpdateSparkleFieldEffect(struct Sprite *sprite) @@ -1866,27 +1869,3 @@ static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 elevatio } } -// Unused, duplicates of data in event_object_movement.c -static const s8 sFigure8XOffsets[FIGURE_8_LENGTH] = { - 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 2, 2, 1, 2, - 2, 1, 2, 2, 1, 2, 1, 1, - 2, 1, 1, 2, 1, 1, 2, 1, - 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 1, 0, 1, 1, 0, - 1, 0, 1, 0, 1, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, -}; - -static const s8 sFigure8YOffsets[FIGURE_8_LENGTH] = { - 0, 0, 1, 0, 0, 1, 0, 0, - 1, 0, 1, 1, 0, 1, 1, 0, - 1, 1, 0, 1, 1, 0, 1, 1, - 0, 0, 1, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, -1, 0, 0, - -1, 0, -1, -1, 0, -1, -1, 0, - -1, -1, -1, -1, -1, -1, -1, -2, -}; diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index ebf61bdaa3..e9cd3149f7 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -665,11 +665,20 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) return; } } - + + gPlayerAvatar.creeping = FALSE; if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) { - // same speed as running - PlayerWalkFast(direction); + if (FlagGet(DN_FLAG_SEARCHING) && (heldKeys & A_BUTTON)) + { + gPlayerAvatar.creeping = TRUE; + PlayerWalkSlow(direction); + } + else + { + // speed 2 is fast, same speed as running + PlayerWalkFast(direction); + } return; } @@ -684,6 +693,11 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH; return; } + else if (FlagGet(DN_FLAG_SEARCHING) && (heldKeys & A_BUTTON)) + { + gPlayerAvatar.creeping = TRUE; + PlayerWalkSlow(direction); + } else { if (ObjectMovingOnRockStairs(&gObjectEvents[gPlayerAvatar.objectEventId], direction)) @@ -1222,6 +1236,8 @@ u8 player_get_pos_including_state_based_drift(s16 *x, s16 *y) u8 GetPlayerFacingDirection(void) { + Script_RequestEffects(SCREFF_V1); + return gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; } diff --git a/src/field_region_map.c b/src/field_region_map.c index 73fc14582b..966d2d1327 100644 --- a/src/field_region_map.c +++ b/src/field_region_map.c @@ -1,17 +1,22 @@ #include "global.h" #include "bg.h" +#include "event_data.h" +#include "field_effect.h" #include "gpu_regs.h" #include "international_string_util.h" #include "main.h" #include "malloc.h" #include "menu.h" +#include "overworld.h" #include "palette.h" #include "region_map.h" +#include "sound.h" #include "strings.h" #include "text.h" #include "text_window.h" #include "window.h" #include "constants/rgb.h" +#include "constants/songs.h" /* * This is the type of map shown when interacting with the metatiles for @@ -44,7 +49,8 @@ static void MCB2_InitRegionMapRegisters(void); static void VBCB_FieldUpdateRegionMap(void); static void MCB2_FieldUpdateRegionMap(void); static void FieldUpdateRegionMap(void); -static void PrintRegionMapSecName(void); +static void PrintRegionMapSecName(); +static void PrintTitleWindowText(); static const struct BgTemplate sFieldRegionMapBgTemplates[] = { { @@ -139,8 +145,6 @@ static void MCB2_FieldUpdateRegionMap(void) static void FieldUpdateRegionMap(void) { - u8 offset; - switch (sFieldRegionMapHandler->state) { case 0: @@ -151,8 +155,8 @@ static void FieldUpdateRegionMap(void) break; case 1: DrawStdFrameWithCustomTileAndPalette(WIN_TITLE, FALSE, 0x27, 0xd); - offset = GetStringCenterAlignXOffset(FONT_NORMAL, gText_Hoenn, 0x38); - AddTextPrinterParameterized(WIN_TITLE, FONT_NORMAL, gText_Hoenn, offset, 1, 0, NULL); + FillWindowPixelBuffer(WIN_TITLE, PIXEL_FILL(1)); + PrintTitleWindowText(); ScheduleBgCopyTilemapToVram(0); DrawStdFrameWithCustomTileAndPalette(WIN_MAPSEC_NAME, FALSE, 0x27, 0xd); PrintRegionMapSecName(); @@ -176,11 +180,21 @@ static void FieldUpdateRegionMap(void) { case MAP_INPUT_MOVE_END: PrintRegionMapSecName(); + PrintTitleWindowText(); break; case MAP_INPUT_A_BUTTON: case MAP_INPUT_B_BUTTON: sFieldRegionMapHandler->state++; break; + case MAP_INPUT_R_BUTTON: + if (sFieldRegionMapHandler->regionMap.mapSecType == MAPSECTYPE_CITY_CANFLY + && FlagGet(OW_FLAG_POKE_RIDER) && Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) + { + PlaySE(SE_SELECT); + SetFlyDestination(&sFieldRegionMapHandler->regionMap); + gSkipShowMonAnim = TRUE; + ReturnToFieldFromFlyMapSelect(); + } } break; case 5: @@ -213,3 +227,24 @@ static void PrintRegionMapSecName(void) CopyWindowToVram(WIN_MAPSEC_NAME, COPYWIN_FULL); } } + +static void PrintTitleWindowText(void) +{ + static const u8 FlyPromptText[] = _("{R_BUTTON} FLY"); + u32 hoennOffset = GetStringCenterAlignXOffset(FONT_NORMAL, gText_Hoenn, 0x38); + u32 flyOffset = GetStringCenterAlignXOffset(FONT_NORMAL, FlyPromptText, 0x38); + + FillWindowPixelBuffer(WIN_TITLE, PIXEL_FILL(1)); + + if (sFieldRegionMapHandler->regionMap.mapSecType == MAPSECTYPE_CITY_CANFLY + && FlagGet(OW_FLAG_POKE_RIDER) && Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) + { + AddTextPrinterParameterized(WIN_TITLE, FONT_NORMAL, FlyPromptText, flyOffset, 1, 0, NULL); + ScheduleBgCopyTilemapToVram(WIN_TITLE); + } + else + { + AddTextPrinterParameterized(WIN_TITLE, FONT_NORMAL, gText_Hoenn, hoennOffset, 1, 0, NULL); + CopyWindowToVram(WIN_TITLE, COPYWIN_FULL); + } +} diff --git a/src/field_specials.c b/src/field_specials.c index 7e05fb6cc5..30b121acd0 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -70,6 +70,7 @@ #include "constants/metatile_labels.h" #include "palette.h" #include "battle_util.h" +#include "naming_screen.h" #define TAG_ITEM_ICON 5500 @@ -148,6 +149,15 @@ static void BufferFanClubTrainerName_(struct LinkBattleRecords *, u8, u8); static void BufferFanClubTrainerName_(u8 whichLinkTrainer, u8 whichNPCTrainer); #endif //FREE_LINK_BATTLE_RECORDS +static const u8 sText_BigGuy[] = _("Big guy"); +static const u8 sText_BigGirl[] = _("Big girl"); +static const u8 sText_Son[] = _("son"); +static const u8 sText_Daughter[] = _("daughter"); +static const u8 sText_99TimesPlus[] = _("99 times +"); +static const u8 sText_1MinutePlus[] = _("1 minute +"); +static const u8 sText_SpaceSeconds[] = _(" seconds"); +static const u8 sText_SpaceTimes[] = _(" time(s)"); + void Special_ShowDiploma(void) { SetMainCallback2(CB2_ShowDiploma); @@ -191,11 +201,11 @@ static void DetermineCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) if (numBikeCollisions < 100) { ConvertIntToDecimalStringN(gStringVar1, numBikeCollisions, STR_CONV_MODE_LEFT_ALIGN, 2); - StringAppend(gStringVar1, gText_SpaceTimes); + StringAppend(gStringVar1, sText_SpaceTimes); } else { - StringCopy(gStringVar1, gText_99TimesPlus); + StringCopy(gStringVar1, sText_99TimesPlus); } if (numFrames < 3600) @@ -203,11 +213,11 @@ static void DetermineCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) ConvertIntToDecimalStringN(gStringVar2, numFrames / 60, STR_CONV_MODE_RIGHT_ALIGN, 2); gStringVar2[2] = CHAR_DEC_SEPARATOR; ConvertIntToDecimalStringN(&gStringVar2[3], ((numFrames % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2); - StringAppend(gStringVar2, gText_SpaceSeconds); + StringAppend(gStringVar2, sText_SpaceSeconds); } else { - StringCopy(gStringVar2, gText_1MinutePlus); + StringCopy(gStringVar2, sText_1MinutePlus); } result = 0; @@ -916,17 +926,17 @@ u8 GetPlayerTrainerIdOnesDigit(void) void GetPlayerBigGuyGirlString(void) { if (gSaveBlock2Ptr->playerGender == MALE) - StringCopy(gStringVar1, gText_BigGuy); + StringCopy(gStringVar1, sText_BigGuy); else - StringCopy(gStringVar1, gText_BigGirl); + StringCopy(gStringVar1, sText_BigGirl); } void GetRivalSonDaughterString(void) { if (gSaveBlock2Ptr->playerGender == MALE) - StringCopy(gStringVar1, gText_Daughter); + StringCopy(gStringVar1, sText_Daughter); else - StringCopy(gStringVar1, gText_Son); + StringCopy(gStringVar1, sText_Son); } u8 GetBattleOutcome(void) @@ -2421,89 +2431,89 @@ static const u8 *const sScrollableMultichoiceOptions[][MAX_SCROLL_MULTI_LENGTH] }, [SCROLL_MULTI_GLASS_WORKSHOP_VENDOR] = { - gText_BlueFlute, - gText_YellowFlute, - gText_RedFlute, - gText_WhiteFlute, - gText_BlackFlute, - gText_PrettyChair, - gText_PrettyDesk, + COMPOUND_STRING("BLUE FLUTE"), + COMPOUND_STRING("YELLOW FLUTE"), + COMPOUND_STRING("RED FLUTE"), + COMPOUND_STRING("WHITE FLUTE"), + COMPOUND_STRING("BLACK FLUTE"), + COMPOUND_STRING("PRETTY CHAIR"), + COMPOUND_STRING("PRETTY DESK"), gText_Exit }, [SCROLL_MULTI_POKEMON_FAN_CLUB_RATER] = { - gText_0Pts, - gText_10Pts, - gText_20Pts, - gText_30Pts, - gText_40Pts, - gText_50Pts, - gText_60Pts, - gText_70Pts, - gText_80Pts, - gText_90Pts, - gText_100Pts, - gText_QuestionMark + COMPOUND_STRING("0 pts"), + COMPOUND_STRING("10 pts"), + COMPOUND_STRING("20 pts"), + COMPOUND_STRING("30 pts"), + COMPOUND_STRING("40 pts"), + COMPOUND_STRING("50 pts"), + COMPOUND_STRING("60 pts"), + COMPOUND_STRING("70 pts"), + COMPOUND_STRING("80 pts"), + COMPOUND_STRING("90 pts"), + COMPOUND_STRING("100 pts"), + COMPOUND_STRING("?") }, [SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1] = { - gText_KissPoster16BP, - gText_KissCushion32BP, - gText_SmoochumDoll32BP, - gText_TogepiDoll48BP, - gText_MeowthDoll48BP, - gText_ClefairyDoll48BP, - gText_DittoDoll48BP, - gText_CyndaquilDoll80BP, - gText_ChikoritaDoll80BP, - gText_TotodileDoll80BP, + COMPOUND_STRING("KISS POSTER{CLEAR_TO 0x5E}16BP"), + COMPOUND_STRING("KISS CUSHION{CLEAR_TO 0x5E}32BP"), + COMPOUND_STRING("SMOOCHUM DOLL{CLEAR_TO 0x5E}32BP"), + COMPOUND_STRING("TOGEPI DOLL{CLEAR_TO 0x5E}48BP"), + COMPOUND_STRING("MEOWTH DOLL{CLEAR_TO 0x5E}48BP"), + COMPOUND_STRING("CLEFAIRY DOLL{CLEAR_TO 0x5E}48BP"), + COMPOUND_STRING("DITTO DOLL{CLEAR_TO 0x5E}48BP"), + COMPOUND_STRING("CYNDAQUIL DOLL{CLEAR_TO 0x5E}80BP"), + COMPOUND_STRING("CHIKORITA DOLL{CLEAR_TO 0x5E}80BP"), + COMPOUND_STRING("TOTODILE DOLL{CLEAR_TO 0x5E}80BP"), gText_Exit }, [SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2] = { - gText_LaprasDoll128BP, - gText_SnorlaxDoll128BP, - gText_VenusaurDoll256BP, - gText_CharizardDoll256BP, - gText_BlastoiseDoll256BP, + COMPOUND_STRING("LAPRAS DOLL{CLEAR_TO 0x58}128BP"), + COMPOUND_STRING("SNORLAX DOLL{CLEAR_TO 0x58}128BP"), + COMPOUND_STRING("VENUSAUR DOLL{CLEAR_TO 0x58}256BP"), + COMPOUND_STRING("CHARIZARD DOLL{CLEAR_TO 0x58}256BP"), + COMPOUND_STRING("BLASTOISE DOLL{CLEAR_TO 0x58}256BP"), gText_Exit }, [SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR] = { - gText_Protein1BP, - gText_Calcium1BP, - gText_Iron1BP, - gText_Zinc1BP, - gText_Carbos1BP, - gText_HpUp1BP, + COMPOUND_STRING("PROTEIN{CLEAR_TO 0x64}1BP"), + COMPOUND_STRING("CALCIUM{CLEAR_TO 0x64}1BP"), + COMPOUND_STRING("IRON{CLEAR_TO 0x64}1BP"), + COMPOUND_STRING("ZINC{CLEAR_TO 0x64}1BP"), + COMPOUND_STRING("CARBOS{CLEAR_TO 0x64}1BP"), + COMPOUND_STRING("HP UP{CLEAR_TO 0x64}1BP"), gText_Exit }, [SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR] = { - gText_Leftovers48BP, - gText_WhiteHerb48BP, - gText_QuickClaw48BP, - gText_MentalHerb48BP, - gText_BrightPowder64BP, - gText_ChoiceBand64BP, - gText_KingsRock64BP, - gText_FocusBand64BP, - gText_ScopeLens64BP, + COMPOUND_STRING("LEFTOVERS{CLEAR_TO 0x5E}48BP"), + COMPOUND_STRING("WHITE HERB{CLEAR_TO 0x5E}48BP"), + COMPOUND_STRING("QUICK CLAW{CLEAR_TO 0x5E}48BP"), + COMPOUND_STRING("MENTAL HERB{CLEAR_TO 0x5E}48BP"), + COMPOUND_STRING("BRIGHTPOWDER{CLEAR_TO 0x5E}64BP"), + COMPOUND_STRING("CHOICE BAND{CLEAR_TO 0x5E}64BP"), + COMPOUND_STRING("KING'S ROCK{CLEAR_TO 0x5E}64BP"), + COMPOUND_STRING("FOCUS BAND{CLEAR_TO 0x5E}64BP"), + COMPOUND_STRING("SCOPE LENS{CLEAR_TO 0x5E}64BP"), gText_Exit }, [SCROLL_MULTI_BERRY_POWDER_VENDOR] = { - gText_EnergyPowder50, - gText_EnergyRoot80, - gText_HealPowder50, - gText_RevivalHerb300, - gText_Protein1000, - gText_Iron1000, - gText_Carbos1000, - gText_Calcium1000, - gText_Zinc1000, - gText_HPUp1000, - gText_PPUp3000, + COMPOUND_STRING("ENERGYPOWDER{CLEAR_TO 114}{FONT_SMALL}50"), + COMPOUND_STRING("ENERGY ROOT{CLEAR_TO 114}{FONT_SMALL}80"), + COMPOUND_STRING("HEAL POWDER{CLEAR_TO 114}{FONT_SMALL}50"), + COMPOUND_STRING("REVIVAL HERB{CLEAR_TO 108}{FONT_SMALL}300"), + COMPOUND_STRING("PROTEIN{CLEAR_TO 99}{FONT_SMALL}1,000"), + COMPOUND_STRING("IRON{CLEAR_TO 99}{FONT_SMALL}1,000"), + COMPOUND_STRING("CARBOS{CLEAR_TO 99}{FONT_SMALL}1,000"), + COMPOUND_STRING("CALCIUM{CLEAR_TO 99}{FONT_SMALL}1,000"), + COMPOUND_STRING("ZINC{CLEAR_TO 99}{FONT_SMALL}1,000"), + COMPOUND_STRING("HP UP{CLEAR_TO 99}{FONT_SMALL}1,000"), + COMPOUND_STRING("PP UP{CLEAR_TO 99}{FONT_SMALL}3,000"), gText_Exit }, [SCROLL_MULTI_BF_RECEPTIONIST] = @@ -2521,30 +2531,30 @@ static const u8 *const sScrollableMultichoiceOptions[][MAX_SCROLL_MULTI_LENGTH] }, [SCROLL_MULTI_BF_MOVE_TUTOR_1] = { - gText_Softboiled16BP, - gText_SeismicToss24BP, - gText_DreamEater24BP, - gText_MegaPunch24BP, - gText_MegaKick48BP, - gText_BodySlam48BP, - gText_RockSlide48BP, - gText_Counter48BP, - gText_ThunderWave48BP, - gText_SwordsDance48BP, + COMPOUND_STRING("SOFTBOILED{CLEAR_TO 0x4E}16BP"), + COMPOUND_STRING("SEISMIC TOSS{CLEAR_TO 0x4E}24BP"), + COMPOUND_STRING("DREAM EATER{CLEAR_TO 0x4E}24BP"), + COMPOUND_STRING("MEGA PUNCH{CLEAR_TO 0x4E}24BP"), + COMPOUND_STRING("MEGA KICK{CLEAR_TO 0x4E}48BP"), + COMPOUND_STRING("BODY SLAM{CLEAR_TO 0x4E}48BP"), + COMPOUND_STRING("ROCK SLIDE{CLEAR_TO 0x4E}48BP"), + COMPOUND_STRING("COUNTER{CLEAR_TO 0x4E}48BP"), + COMPOUND_STRING("THUNDER WAVE{CLEAR_TO 0x4E}48BP"), + COMPOUND_STRING("SWORDS DANCE{CLEAR_TO 0x4E}48BP"), gText_Exit }, [SCROLL_MULTI_BF_MOVE_TUTOR_2] = { - gText_DefenseCurl16BP, - gText_Snore24BP, - gText_MudSlap24BP, - gText_Swift24BP, - gText_IcyWind24BP, - gText_Endure48BP, - gText_PsychUp48BP, - gText_IcePunch48BP, - gText_ThunderPunch48BP, - gText_FirePunch48BP, + COMPOUND_STRING("DEFENSE CURL{CLEAR_TO 0x4E}16BP"), + COMPOUND_STRING("SNORE{CLEAR_TO 0x4E}24BP"), + COMPOUND_STRING("MUD-SLAP{CLEAR_TO 0x4E}24BP"), + COMPOUND_STRING("SWIFT{CLEAR_TO 0x4E}24BP"), + COMPOUND_STRING("ICY WIND{CLEAR_TO 0x4E}24BP"), + COMPOUND_STRING("ENDURE{CLEAR_TO 0x4E}48BP"), + COMPOUND_STRING("PSYCH UP{CLEAR_TO 0x4E}48BP"), + COMPOUND_STRING("ICE PUNCH{CLEAR_TO 0x4E}48BP"), + COMPOUND_STRING("THUNDERPUNCH{CLEAR_TO 0x4E}48BP"), + COMPOUND_STRING("FIRE PUNCH{CLEAR_TO 0x4E}48BP"), gText_Exit }, [SCROLL_MULTI_SS_TIDAL_DESTINATION] = @@ -4335,3 +4345,17 @@ void UseBlankMessageToCancelPokemonPic(void) AddTextPrinterParameterized(0, FONT_NORMAL, &t, 0, 1, 0, NULL); ScriptMenu_HidePokemonPic(); } + +void EnterCode(void) +{ + DoNamingScreen(NAMING_SCREEN_CODE, gStringVar2, 0, 0, 0, CB2_ReturnToFieldContinueScript); +} + +void GetCodeFeedback(void) +{ + static const u8 sText_SampleCode[] = _("SampleCode"); + if (!StringCompare(gStringVar2, sText_SampleCode)) + gSpecialVar_Result = 1; + else + gSpecialVar_Result = 0; +} diff --git a/src/field_weather.c b/src/field_weather.c index 7d3c4caf4f..ae69289d8a 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -246,11 +246,28 @@ void SetNextWeather(u8 weather) gWeatherPtr->finishStep = 0; } +static void UpdateWeatherForms(void) +{ + s32 i; + for (i = 0; i < PARTY_SIZE; i++) + { + struct Pokemon *mon = &gPlayerParty[i]; + u16 species = GetMonData(mon, MON_DATA_SPECIES); + u16 targetSpecies = GetOverworldWeatherSpecies(species); + if (species != targetSpecies) + { + SetMonData(mon, MON_DATA_SPECIES, &targetSpecies); + CalculateMonStats(mon); + } + } +} + void SetCurrentAndNextWeather(u8 weather) { PlayRainStoppingSoundEffect(); gWeatherPtr->currWeather = weather; gWeatherPtr->nextWeather = weather; + UpdateWeatherForms(); } void SetCurrentAndNextWeatherNoDelay(u8 weather) @@ -260,6 +277,7 @@ void SetCurrentAndNextWeatherNoDelay(u8 weather) gWeatherPtr->nextWeather = weather; // Overrides the normal delay during screen fading. gWeatherPtr->readyForInit = TRUE; + UpdateWeatherForms(); } static void Task_WeatherInit(u8 taskId) @@ -287,6 +305,7 @@ static void Task_WeatherMain(u8 taskId) gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; gWeatherPtr->currWeather = gWeatherPtr->nextWeather; gWeatherPtr->weatherChangeComplete = TRUE; + UpdateWeatherForms(); } } else diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index cf31e862c3..234c9c56d3 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -15,7 +15,6 @@ #include "gpu_regs.h" EWRAM_DATA static u8 sCurrentAbnormalWeather = 0; -EWRAM_DATA static u16 sUnusedWeatherRelated = 0; const u16 gCloudsWeatherPalette[] = INCBIN_U16("graphics/weather/cloud.gbapal"); const u16 gSandstormWeatherPalette[] = INCBIN_U16("graphics/weather/sandstorm.gbapal"); @@ -2407,12 +2406,6 @@ static void UpdateBubbleSprite(struct Sprite *sprite) //------------------------------------------------------------------------------ -static void UNUSED UnusedSetCurrentAbnormalWeather(u32 weather, u32 unknown) -{ - sCurrentAbnormalWeather = weather; - sUnusedWeatherRelated = unknown; -} - #define tState data[0] #define tWeatherA data[1] #define tWeatherB data[2] diff --git a/src/fieldmap.c b/src/fieldmap.c index 34a654861a..84e3c564fc 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -30,7 +30,6 @@ EWRAM_DATA 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}; -EWRAM_DATA static u32 UNUSED sFiller = 0; // without this, the next file won't align properly COMMON_DATA struct BackupMapLayout gBackupMapLayout = {0}; diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index a5b2740458..1be00baebc 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -7,6 +7,7 @@ #include "field_screen_effect.h" #include "field_weather.h" #include "fldeff.h" +#include "malloc.h" #include "mirage_tower.h" #include "palette.h" #include "party_menu.h" @@ -15,6 +16,7 @@ #include "sprite.h" #include "task.h" #include "wild_encounter.h" +#include "util.h" #include "constants/field_effects.h" #include "constants/rgb.h" #include "constants/songs.h" @@ -47,20 +49,40 @@ bool8 FldEff_SweetScent(void) return FALSE; } +#define tPalBuffer1 data[1] +#define tPalBuffer2 data[2] + void StartSweetScentFieldEffect(void) { - u8 taskId; + void *palBuffer; + u32 taskId; u32 palettes = ~(1 << (gSprites[GetPlayerAvatarSpriteId()].oam.paletteNum + 16) | (1 << 13) | (1 << 14) | (1 << 15)); PlaySE(SE_M_SWEET_SCENT); - CpuFastCopy(gPlttBufferUnfaded, gDecompressionBuffer, PLTT_SIZE); + palBuffer = Alloc(PLTT_SIZE); + CpuFastCopy(gPlttBufferUnfaded, palBuffer, PLTT_SIZE); CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(palettes, 4, 0, 8, RGB_RED); taskId = CreateTask(TrySweetScentEncounter, 0); gTasks[taskId].data[0] = 0; + StoreWordInTwoHalfwords((u16 *)&gTasks[taskId].tPalBuffer1, (u32) palBuffer); FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT); } +static void *GetPalBufferPtr(u32 taskId) +{ + u32 palBuffer; + + LoadWordFromTwoHalfwords((u16 *)&gTasks[taskId].tPalBuffer1, &palBuffer); + return (void *) palBuffer; +} + +static void FreeDestroyTask(u32 taskId) +{ + Free(GetPalBufferPtr(taskId)); + DestroyTask(taskId); +} + static void TrySweetScentEncounter(u8 taskId) { if (!gPaletteFade.active) @@ -72,7 +94,7 @@ static void TrySweetScentEncounter(u8 taskId) gTasks[taskId].data[0] = 0; if (SweetScentWildEncounter() == TRUE) { - DestroyTask(taskId); + FreeDestroyTask(taskId); } else { @@ -92,9 +114,12 @@ static void FailSweetScentEncounter(u8 taskId) { if (!gPaletteFade.active) { - CpuFastCopy(gDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE); + CpuFastCopy(GetPalBufferPtr(taskId), gPlttBufferUnfaded, PLTT_SIZE); SetWeatherPalStateIdle(); ScriptContext_SetupScript(EventScript_FailSweetScent); - DestroyTask(taskId); + FreeDestroyTask(taskId); } } + +#undef tPalBuffer1 +#undef tPalBuffer2 diff --git a/src/frontier_util.c b/src/frontier_util.c index 4424676644..ab6dc867fd 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -1849,7 +1849,7 @@ void ResetFrontierTrainerIds(void) static void IsTrainerFrontierBrain(void) { - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) gSpecialVar_Result = TRUE; else gSpecialVar_Result = FALSE; @@ -1900,7 +1900,7 @@ static void GiveBattlePoints(void) challengeNum = ARRAY_COUNT(sBattlePointAwards[0][0]) - 1; points = sBattlePointAwards[facility][battleMode][challengeNum]; - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) points += 10; gSaveBlock2Ptr->frontier.battlePoints += points; ConvertIntToDecimalStringN(gStringVar1, points, STR_CONV_MODE_LEFT_ALIGN, 2); @@ -1910,7 +1910,7 @@ static void GiveBattlePoints(void) points = gSaveBlock2Ptr->frontier.cardBattlePoints; points += sBattlePointAwards[facility][battleMode][challengeNum]; IncrementDailyBattlePoints(sBattlePointAwards[facility][battleMode][challengeNum]); - if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_FRONTIER_BRAIN) { points += 10; IncrementDailyBattlePoints(10); @@ -2182,10 +2182,10 @@ static void BufferFrontierTrainerName(void) switch (gSpecialVar_0x8005) { case 0: - GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); + GetFrontierTrainerName(gStringVar1, TRAINER_BATTLE_PARAM.opponentA); break; case 1: - GetFrontierTrainerName(gStringVar2, gTrainerBattleOpponent_A); + GetFrontierTrainerName(gStringVar2, TRAINER_BATTLE_PARAM.opponentA); break; } } @@ -2543,7 +2543,7 @@ void CreateFrontierBrainPokemon(void) for (j = 0; j < MAX_MON_MOVES; j++) { SetMonMoveSlot(&gEnemyParty[monPartyId], sFrontierBrainsMons[facility][symbol][i].moves[j], j); - if (gMovesInfo[sFrontierBrainsMons[facility][symbol][i].moves[j]].effect == EFFECT_FRUSTRATION) + if (GetMoveEffect(sFrontierBrainsMons[facility][symbol][i].moves[j]) == EFFECT_FRUSTRATION) friendship = 0; } SetMonData(&gEnemyParty[monPartyId], MON_DATA_FRIENDSHIP, &friendship); @@ -2564,7 +2564,7 @@ u16 GetFrontierBrainMonSpecies(u8 monId) void SetFrontierBrainObjEventGfx(u8 facility) { - gTrainerBattleOpponent_A = TRAINER_FRONTIER_BRAIN; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_FRONTIER_BRAIN; VarSet(VAR_OBJ_GFX_ID_0, gFrontierBrainInfo[facility].objEventGfx); } diff --git a/src/graphics.c b/src/graphics.c index 5aafa8ae45..b8c95be297 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1287,6 +1287,12 @@ const u32 gBattleAnimSpritePal_Meteor[] = INCBIN_U32("graphics/battle_anims/spri const u32 gBattleAnimSpriteGfx_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.4bpp.lz"); const u32 gBattleAnimSpritePal_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.4bpp.lz"); +const u32 gBattleAnimSpritePal_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_SaltParticle[] = INCBIN_U32("graphics/battle_anims/sprites/salt_particle.4bpp.lz"); +const u32 gBattleAnimSpritePal_SaltParticle[] = INCBIN_U32("graphics/battle_anims/sprites/salt_particle.gbapal.lz"); + const u32 gBattleAnimUnusedPal_Unknown2[] = INCBIN_U32("graphics/battle_anims/unused/unknown_2.gbapal.lz"); #include "data/graphics/trainers.h" @@ -1683,7 +1689,11 @@ const u32 gMoveTypes_Pal[] = INCBIN_U32("graphics/types/move_types.gbapal.lz"); const u32 gSummaryMoveSelect_Gfx[] = INCBIN_U32("graphics/summary_screen/move_select.4bpp.lz"); const u32 gSummaryMoveSelect_Pal[] = INCBIN_U32("graphics/summary_screen/move_select.gbapal.lz"); +#if P_SUMMARY_SCREEN_IV_EV_TILESET +const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/iv_ev_tiles.4bpp.lz"); +#else const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/tiles.4bpp.lz"); +#endif // P_SUMMARY_SCREEN_IV_EV_TILESET const u32 gSummaryScreen_Pal[] = INCBIN_U32("graphics/summary_screen/tiles.gbapal.lz"); const u32 gSummaryPage_Info_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info.bin.lz"); const u32 gSummaryPage_Skills_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_skills.bin.lz"); diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 1c3b00f2ef..1a8906d975 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -38,21 +38,6 @@ #define HALL_OF_FAME_MAX_TEAMS 30 #define TAG_CONFETTI 1001 -struct HallofFameMon -{ - u32 tid; - u32 personality; - u16 isShiny:1; - u16 species:15; - u8 lvl; - u8 nickname[POKEMON_NAME_LENGTH]; -}; - -struct HallofFameTeam -{ - struct HallofFameMon mon[PARTY_SIZE]; -}; - STATIC_ASSERT(sizeof(struct HallofFameTeam) * HALL_OF_FAME_MAX_TEAMS <= SECTOR_DATA_SIZE * NUM_HOF_SECTORS, HallOfFameFreeSpace); struct HofGfx @@ -66,6 +51,7 @@ struct HofGfx static EWRAM_DATA u32 sHofFadePalettes = 0; static EWRAM_DATA struct HallofFameTeam *sHofMonPtr = NULL; static EWRAM_DATA struct HofGfx *sHofGfxPtr = NULL; +EWRAM_DATA struct HallofFameTeam *gHoFSaveBuffer = NULL; static void ClearVramOamPltt_LoadHofPal(void); static void LoadHofGfx(void); @@ -416,13 +402,19 @@ static bool8 InitHallOfFameScreen(void) #define tPlayerSpriteID data[4] #define tMonSpriteId(i) data[i + 5] +static void AllocateHoFTeams(void) +{ + sHofMonPtr = AllocZeroed(sizeof(*sHofMonPtr)); + gHoFSaveBuffer = Alloc(SECTOR_SIZE * NUM_HOF_SECTORS); +} + void CB2_DoHallOfFameScreen(void) { if (!InitHallOfFameScreen()) { u8 taskId = CreateTask(Task_Hof_InitMonData, 0); gTasks[taskId].tDontSaveData = FALSE; - sHofMonPtr = AllocZeroed(sizeof(*sHofMonPtr)); + AllocateHoFTeams(); } } @@ -432,7 +424,7 @@ void CB2_DoHallOfFameScreenDontSaveData(void) { u8 taskId = CreateTask(Task_Hof_InitMonData, 0); gTasks[taskId].tDontSaveData = TRUE; - sHofMonPtr = AllocZeroed(sizeof(*sHofMonPtr)); + AllocateHoFTeams(); } } @@ -486,16 +478,16 @@ static void Task_Hof_InitMonData(u8 taskId) static void Task_Hof_InitTeamSaveData(u8 taskId) { u16 i; - struct HallofFameTeam *lastSavedTeam = (struct HallofFameTeam *)(gDecompressionBuffer); + struct HallofFameTeam *lastSavedTeam = gHoFSaveBuffer; if (!gHasHallOfFameRecords) { - memset(gDecompressionBuffer, 0, SECTOR_SIZE * NUM_HOF_SECTORS); + memset(gHoFSaveBuffer, 0, SECTOR_SIZE * NUM_HOF_SECTORS); } else { if (LoadGameSave(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK) - memset(gDecompressionBuffer, 0, SECTOR_SIZE * NUM_HOF_SECTORS); + memset(gHoFSaveBuffer, 0, SECTOR_SIZE * NUM_HOF_SECTORS); } for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, lastSavedTeam++) @@ -505,8 +497,8 @@ static void Task_Hof_InitTeamSaveData(u8 taskId) } if (i >= HALL_OF_FAME_MAX_TEAMS) { - struct HallofFameTeam *afterTeam = (struct HallofFameTeam *)(gDecompressionBuffer); - struct HallofFameTeam *beforeTeam = (struct HallofFameTeam *)(gDecompressionBuffer); + struct HallofFameTeam *afterTeam = gHoFSaveBuffer; + struct HallofFameTeam *beforeTeam = gHoFSaveBuffer; afterTeam++; for (i = 0; i < HALL_OF_FAME_MAX_TEAMS - 1; i++, beforeTeam++, afterTeam++) { @@ -522,6 +514,13 @@ static void Task_Hof_InitTeamSaveData(u8 taskId) gTasks[taskId].func = Task_Hof_TrySaveData; } +static void FreeAllHoFMem(void) +{ + TRY_FREE_AND_SET_NULL(sHofGfxPtr); + TRY_FREE_AND_SET_NULL(sHofMonPtr); + TRY_FREE_AND_SET_NULL(gHoFSaveBuffer); +} + static void Task_Hof_TrySaveData(u8 taskId) { gGameContinueCallback = CB2_DoHallOfFameScreenDontSaveData; @@ -531,8 +530,7 @@ static void Task_Hof_TrySaveData(u8 taskId) UnsetBgTilemapBuffer(3); FreeAllWindowBuffers(); - TRY_FREE_AND_SET_NULL(sHofGfxPtr); - TRY_FREE_AND_SET_NULL(sHofMonPtr); + FreeAllHoFMem(); DestroyTask(taskId); } @@ -772,10 +770,7 @@ static void Task_Hof_HandleExit(u8 taskId) UnsetBgTilemapBuffer(3); ResetBgsAndClearDma3BusyFlags(0); DestroyTask(taskId); - - TRY_FREE_AND_SET_NULL(sHofGfxPtr); - TRY_FREE_AND_SET_NULL(sHofMonPtr); - + FreeAllHoFMem(); StartCredits(); } } @@ -807,6 +802,7 @@ void CB2_DoHallOfFamePC(void) SetVBlankCallback(NULL); ClearVramOamPltt_LoadHofPal(); sHofGfxPtr = AllocZeroed(sizeof(*sHofGfxPtr)); + AllocateHoFTeams(); gMain.state = 1; break; case 1: @@ -823,7 +819,7 @@ void CB2_DoHallOfFamePC(void) case 3: if (!LoadHofBgs()) { - struct HallofFameTeam *fameTeam = (struct HallofFameTeam *)(gDecompressionBuffer); + struct HallofFameTeam *fameTeam = gHoFSaveBuffer; fameTeam->mon[0] = sDummyFameMon; ComputerScreenOpenEffect(0, 0, 0); SetVBlankCallback(VBlankCB_HallOfFame); @@ -852,7 +848,6 @@ void CB2_DoHallOfFamePC(void) gTasks[taskId].tMonSpriteId(i) = SPRITE_NONE; } - sHofMonPtr = AllocZeroed(SECTOR_SIZE * NUM_HOF_SECTORS); SetMainCallback2(CB2_HallOfFame); } break; @@ -871,8 +866,7 @@ static void Task_HofPC_CopySaveData(u8 taskId) u16 i; struct HallofFameTeam *savedTeams; - CpuCopy16(gDecompressionBuffer, sHofMonPtr, SECTOR_SIZE * NUM_HOF_SECTORS); - savedTeams = sHofMonPtr; + savedTeams = gHoFSaveBuffer; for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, savedTeams++) { if (savedTeams->mon[0].species == SPECIES_NONE) @@ -892,7 +886,7 @@ static void Task_HofPC_CopySaveData(u8 taskId) static void Task_HofPC_DrawSpritesPrintText(u8 taskId) { - struct HallofFameTeam *savedTeams = sHofMonPtr; + struct HallofFameTeam *savedTeams = gHoFSaveBuffer; struct HallofFameMon* currMon; u16 i; @@ -958,7 +952,7 @@ static void Task_HofPC_DrawSpritesPrintText(u8 taskId) static void Task_HofPC_PrintMonInfo(u8 taskId) { - struct HallofFameTeam *savedTeams = sHofMonPtr; + struct HallofFameTeam *savedTeams = gHoFSaveBuffer; struct HallofFameMon* currMon; u16 i; u16 currMonID; @@ -1047,7 +1041,7 @@ static void Task_HofPC_HandlePaletteOnExit(u8 taskId) struct HallofFameTeam *fameTeam; CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); - fameTeam = (struct HallofFameTeam *)(gDecompressionBuffer); + fameTeam = gHoFSaveBuffer; fameTeam->mon[0] = sDummyFameMon; ComputerScreenCloseEffect(0, 0, 0); gTasks[taskId].func = Task_HofPC_HandleExit; @@ -1057,7 +1051,7 @@ static void Task_HofPC_HandleExit(u8 taskId) { if (!IsComputerScreenCloseEffectActive()) { - u8 i; + s32 i; for (i = 0; i < PARTY_SIZE; i++) { @@ -1079,8 +1073,7 @@ static void Task_HofPC_HandleExit(u8 taskId) ResetBgsAndClearDma3BusyFlags(0); DestroyTask(taskId); - TRY_FREE_AND_SET_NULL(sHofGfxPtr); - TRY_FREE_AND_SET_NULL(sHofMonPtr); + FreeAllHoFMem(); ReturnFromHallOfFamePC(); } diff --git a/src/intro.c b/src/intro.c index d5106f537e..88cb1f820e 100644 --- a/src/intro.c +++ b/src/intro.c @@ -176,7 +176,6 @@ enum { #define TIMER_START_LEGENDARIES 43 static EWRAM_DATA u16 sIntroCharacterGender = 0; -static EWRAM_DATA u16 UNUSED sUnusedVar = 0; static EWRAM_DATA u16 sFlygonYOffset = 0; COMMON_DATA u32 gIntroFrameCounter = 0; diff --git a/src/item_icon.c b/src/item_icon.c index 14a812b7fa..03b56918be 100644 --- a/src/item_icon.c +++ b/src/item_icon.c @@ -1,12 +1,13 @@ #include "global.h" +#include "battle_main.h" #include "decompress.h" #include "graphics.h" +#include "item.h" #include "item_icon.h" #include "malloc.h" +#include "move.h" #include "sprite.h" #include "constants/items.h" -#include "item.h" -#include "battle_main.h" // EWRAM vars EWRAM_DATA u8 *gItemIconDecompressionBuffer = NULL; @@ -182,7 +183,7 @@ const void *GetItemIconPalette(u16 itemId) if (itemId >= ITEMS_COUNT) return gItemsInfo[0].iconPalette; if (itemId >= ITEM_TM01 && itemId < ITEM_HM01 + NUM_HIDDEN_MACHINES) - return gTypesInfo[gMovesInfo[gItemsInfo[itemId].secondaryId].type].paletteTMHM; + return gTypesInfo[GetMoveType(gItemsInfo[itemId].secondaryId)].paletteTMHM; return gItemsInfo[itemId].iconPalette; } diff --git a/src/item_menu.c b/src/item_menu.c index eae1c17eab..ff5d569f96 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -212,6 +212,12 @@ static void ConfirmSell(u8); static void CancelSell(u8); static void Task_FadeAndCloseBagMenuIfMulch(u8 taskId); +static const u8 sText_Var1CantBeHeldHere[] = _("The {STR_VAR_1} can't be held\nhere."); +static const u8 sText_DepositHowManyVar1[] = _("Deposit how many\n{STR_VAR_1}?"); +static const u8 sText_DepositedVar2Var1s[] = _("Deposited {STR_VAR_2}\n{STR_VAR_1}."); +static const u8 sText_NoRoomForItems[] = _("There's no room to\nstore items."); +static const u8 sText_CantStoreImportantItems[] = _("Important items\ncan't be stored in\nthe PC!"); + static const struct BgTemplate sBgTemplates_ItemMenu[] = { { @@ -266,20 +272,20 @@ static const struct ListMenuTemplate sItemListMenu = }; static const struct MenuAction sItemMenuActions[] = { - [ACTION_USE] = {gMenuText_Use, {ItemMenu_UseOutOfBattle}}, - [ACTION_TOSS] = {gMenuText_Toss, {ItemMenu_Toss}}, - [ACTION_REGISTER] = {gMenuText_Register, {ItemMenu_Register}}, - [ACTION_GIVE] = {gMenuText_Give, {ItemMenu_Give}}, - [ACTION_CANCEL] = {gText_Cancel2, {ItemMenu_Cancel}}, - [ACTION_BATTLE_USE] = {gMenuText_Use, {ItemMenu_UseInBattle}}, - [ACTION_CHECK] = {gMenuText_Check, {ItemMenu_UseOutOfBattle}}, - [ACTION_WALK] = {gMenuText_Walk, {ItemMenu_UseOutOfBattle}}, - [ACTION_DESELECT] = {gMenuText_Deselect, {ItemMenu_Register}}, - [ACTION_CHECK_TAG] = {gMenuText_CheckTag, {ItemMenu_CheckTag}}, - [ACTION_CONFIRM] = {gMenuText_Confirm, {Task_FadeAndCloseBagMenu}}, - [ACTION_SHOW] = {gMenuText_Show, {ItemMenu_Show}}, - [ACTION_GIVE_FAVOR_LADY] = {gMenuText_Give2, {ItemMenu_GiveFavorLady}}, - [ACTION_CONFIRM_QUIZ_LADY] = {gMenuText_Confirm, {ItemMenu_ConfirmQuizLady}}, + [ACTION_USE] = {gMenuText_Use, {ItemMenu_UseOutOfBattle}}, + [ACTION_TOSS] = {gMenuText_Toss, {ItemMenu_Toss}}, + [ACTION_REGISTER] = {gMenuText_Register, {ItemMenu_Register}}, + [ACTION_GIVE] = {gMenuText_Give, {ItemMenu_Give}}, + [ACTION_CANCEL] = {gText_Cancel2, {ItemMenu_Cancel}}, + [ACTION_BATTLE_USE] = {gMenuText_Use, {ItemMenu_UseInBattle}}, + [ACTION_CHECK] = {COMPOUND_STRING("CHECK"), {ItemMenu_UseOutOfBattle}}, + [ACTION_WALK] = {COMPOUND_STRING("WALK"), {ItemMenu_UseOutOfBattle}}, + [ACTION_DESELECT] = {COMPOUND_STRING("DESELECT"), {ItemMenu_Register}}, + [ACTION_CHECK_TAG] = {COMPOUND_STRING("CHECK TAG"), {ItemMenu_CheckTag}}, + [ACTION_CONFIRM] = {gMenuText_Confirm, {Task_FadeAndCloseBagMenu}}, + [ACTION_SHOW] = {COMPOUND_STRING("SHOW"), {ItemMenu_Show}}, + [ACTION_GIVE_FAVOR_LADY] = {gMenuText_Give2, {ItemMenu_GiveFavorLady}}, + [ACTION_CONFIRM_QUIZ_LADY] = {gMenuText_Confirm, {ItemMenu_ConfirmQuizLady}}, [ACTION_DUMMY] = {gText_EmptyString2, {NULL}} }; @@ -2038,7 +2044,7 @@ static void Task_ItemContext_GiveToParty(u8 taskId) else if (!IsHoldingItemAllowed(gSpecialVar_ItemId)) { CopyItemName(gSpecialVar_ItemId, gStringVar1); - StringExpandPlaceholders(gStringVar4, gText_Var1CantBeHeldHere); + StringExpandPlaceholders(gStringVar4, sText_Var1CantBeHeldHere); DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, HandleErrorMessage); } else if (gBagPosition.pocket != KEYITEMS_POCKET && !ItemId_GetImportance(gSpecialVar_ItemId)) @@ -2236,7 +2242,7 @@ static void Task_ItemContext_Deposit(u8 taskId) { u8 *end = CopyItemNameHandlePlural(gSpecialVar_ItemId, gStringVar1, 2); WrapFontIdToFit(gStringVar1, end, FONT_NORMAL, WindowWidthPx(WIN_DESCRIPTION) - 10 - 6); - StringExpandPlaceholders(gStringVar4, gText_DepositHowManyVar1); + StringExpandPlaceholders(gStringVar4, sText_DepositHowManyVar1); FillWindowPixelBuffer(WIN_DESCRIPTION, PIXEL_FILL(0)); BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, gStringVar4, 3, 1, 0, 0, 0, COLORID_NORMAL); AddItemQuantityWindow(ITEMWIN_QUANTITY); @@ -2276,7 +2282,7 @@ static void TryDepositItem(u8 taskId) if (ItemId_GetImportance(gSpecialVar_ItemId)) { // Can't deposit important items - BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, gText_CantStoreImportantItems, 3, 1, 0, 0, 0, COLORID_NORMAL); + BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, sText_CantStoreImportantItems, 3, 1, 0, 0, 0, COLORID_NORMAL); gTasks[taskId].func = WaitDepositErrorMessage; } else if (AddPCItem(gSpecialVar_ItemId, tItemCount) == TRUE) @@ -2285,14 +2291,14 @@ static void TryDepositItem(u8 taskId) u8 *end = CopyItemNameHandlePlural(gSpecialVar_ItemId, gStringVar1, tItemCount); WrapFontIdToFit(gStringVar1, end, FONT_NORMAL, WindowWidthPx(WIN_DESCRIPTION) - 10 - 6); ConvertIntToDecimalStringN(gStringVar2, tItemCount, STR_CONV_MODE_LEFT_ALIGN, MAX_ITEM_DIGITS); - StringExpandPlaceholders(gStringVar4, gText_DepositedVar2Var1s); + StringExpandPlaceholders(gStringVar4, sText_DepositedVar2Var1s); BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, gStringVar4, 3, 1, 0, 0, 0, COLORID_NORMAL); gTasks[taskId].func = Task_RemoveItemFromBag; } else { // No room to deposit - BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, gText_NoRoomForItems, 3, 1, 0, 0, 0, COLORID_NORMAL); + BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, sText_NoRoomForItems, 3, 1, 0, 0, 0, COLORID_NORMAL); gTasks[taskId].func = WaitDepositErrorMessage; } } @@ -2598,34 +2604,36 @@ static void PrintTMHMMoveData(u16 itemId) else { moveId = ItemIdToBattleMoveId(itemId); - BlitMenuInfoIcon(WIN_TMHM_INFO, gMovesInfo[moveId].type + 1, 0, 0); + BlitMenuInfoIcon(WIN_TMHM_INFO, GetMoveType(moveId) + 1, 0, 0); // Print TMHM power - if (gMovesInfo[moveId].power <= 1) + u32 power = GetMovePower(moveId); + if (power <= 1) { text = gText_ThreeDashes; } else { - ConvertIntToDecimalStringN(gStringVar1, gMovesInfo[moveId].power, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, power, STR_CONV_MODE_RIGHT_ALIGN, 3); text = gStringVar1; } BagMenu_Print(WIN_TMHM_INFO, FONT_NORMAL, text, 7, 12, 0, 0, TEXT_SKIP_DRAW, COLORID_TMHM_INFO); + u32 accuracy = GetMoveAccuracy(moveId); // Print TMHM accuracy - if (gMovesInfo[moveId].accuracy == 0) + if (accuracy == 0) { text = gText_ThreeDashes; } else { - ConvertIntToDecimalStringN(gStringVar1, gMovesInfo[moveId].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); text = gStringVar1; } BagMenu_Print(WIN_TMHM_INFO, FONT_NORMAL, text, 7, 24, 0, 0, TEXT_SKIP_DRAW, COLORID_TMHM_INFO); // Print TMHM pp - ConvertIntToDecimalStringN(gStringVar1, gMovesInfo[moveId].pp, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, GetMovePP(moveId), STR_CONV_MODE_RIGHT_ALIGN, 3); BagMenu_Print(WIN_TMHM_INFO, FONT_NORMAL, gStringVar1, 7, 36, 0, 0, TEXT_SKIP_DRAW, COLORID_TMHM_INFO); CopyWindowToVram(WIN_TMHM_INFO, COPYWIN_GFX); diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c index 4e6339ba30..29cdb224bb 100644 --- a/src/item_menu_icons.c +++ b/src/item_menu_icons.c @@ -6,9 +6,12 @@ #include "item_menu.h" #include "item_icon.h" #include "item_menu_icons.h" +#include "malloc.h" #include "menu_helpers.h" +#include "menu.h" #include "sprite.h" #include "window.h" +#include "util.h" #include "constants/items.h" enum { @@ -269,18 +272,13 @@ static const union AnimCmd *const sBerryPicSpriteAnimTable[] = sAnim_BerryPic }; -static const struct SpriteFrameImage sBerryPicSpriteImageTable[] = -{ - {&gDecompressionBuffer[0], 0x800}, -}; - static const struct SpriteTemplate sBerryPicSpriteTemplate = { .tileTag = TAG_NONE, .paletteTag = TAG_BERRY_PIC_PAL, .oam = &sBerryPicOamData, .anims = sBerryPicSpriteAnimTable, - .images = sBerryPicSpriteImageTable, + .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; @@ -319,7 +317,7 @@ static const struct SpriteTemplate sBerryPicRotatingSpriteTemplate = .paletteTag = TAG_BERRY_PIC_PAL, .oam = &sBerryPicRotatingOamData, .anims = sBerryPicSpriteAnimTable, - .images = sBerryPicSpriteImageTable, + .images = NULL, .affineAnims = sBerryPicRotatingAnimCmds, .callback = SpriteCallbackDummy, }; @@ -640,47 +638,83 @@ static void ArrangeBerryGfx(void *src, void *dest) } } -static void LoadBerryGfx(u8 berryId) +#define BERRY_SPRITE_SIZE ((64*64)/2) // 0x800 + +struct BerryDynamicGfx +{ + ALIGNED(4) u8 gfx[BERRY_SPRITE_SIZE]; + struct SpriteFrameImage images[1]; +}; + +static struct BerryDynamicGfx *LoadBerryGfx(u8 berryId) { struct CompressedSpritePalette pal; - if (berryId == ITEM_TO_BERRY(ITEM_ENIGMA_BERRY_E_READER) - 1 && IsEnigmaBerryValid()) - { - // unknown empty if statement - } - pal.data = sBerryPicTable[berryId].pal; - pal.tag = TAG_BERRY_PIC_PAL; + pal.tag = TAG_BERRY_PIC_PAL + berryId; LoadCompressedSpritePalette(&pal); - LZDecompressWram(sBerryPicTable[berryId].tiles, &gDecompressionBuffer[0x1000]); - ArrangeBerryGfx(&gDecompressionBuffer[0x1000], &gDecompressionBuffer[0]); + struct BerryDynamicGfx *gfxAlloced = Alloc(sizeof(struct BerryDynamicGfx)); + void *buffer = malloc_and_decompress(sBerryPicTable[berryId].tiles, NULL); + ArrangeBerryGfx(buffer, gfxAlloced->gfx); + Free(buffer); + + return gfxAlloced; } -u8 CreateBerryTagSprite(u8 id, s16 x, s16 y) +static u32 CreateBerrySprite(const struct SpriteTemplate *sprTemplate, u32 berryId, s32 x, s32 y) { - LoadBerryGfx(id); - return CreateSprite(&sBerryPicSpriteTemplate, x, y, 0); + u32 spriteId; + struct BerryDynamicGfx *dynamicGfx = LoadBerryGfx(berryId); + struct SpriteTemplate newSprTemplate = *sprTemplate; + + newSprTemplate.paletteTag += berryId; + newSprTemplate.images = dynamicGfx->images; + + dynamicGfx->images[0].data = dynamicGfx->gfx; + dynamicGfx->images[0].size = BERRY_SPRITE_SIZE; + dynamicGfx->images[0].relativeFrames = FALSE; + + spriteId = CreateSprite(&newSprTemplate, x, y, 0); + StoreWordInTwoHalfwords((u16 *) &gSprites[spriteId].data[BERRY_ICON_GFX_PTR_DATA_ID], (u32) dynamicGfx); + return spriteId; } -void FreeBerryTagSpritePalette(void) +u32 CreateBerryTagSprite(u32 id, s32 x, s32 y) { - FreeSpritePaletteByTag(TAG_BERRY_PIC_PAL); + return CreateBerrySprite(&sBerryPicSpriteTemplate, id, x, y); } // For throwing berries into the Berry Blender -u8 CreateSpinningBerrySprite(u8 berryId, u8 x, u8 y, bool8 startAffine) +u32 CreateSpinningBerrySprite(u32 berryId, s32 x, s32 y, bool32 startAffine) { - u8 spriteId; - - FreeSpritePaletteByTag(TAG_BERRY_PIC_PAL); - LoadBerryGfx(berryId); - spriteId = CreateSprite(&sBerryPicRotatingSpriteTemplate, x, y, 0); - if (startAffine == TRUE) + u32 spriteId = CreateBerrySprite(&sBerryPicRotatingSpriteTemplate, berryId, x, y); + if (startAffine) StartSpriteAffineAnim(&gSprites[spriteId], 1); return spriteId; } +void DestroyBerryIconSprite(u32 spriteId, u32 berryId, bool32 freePal) +{ + DestroyBerryIconSpritePtr(&gSprites[spriteId], berryId, freePal); +} + +void DestroyBerryIconSpritePtr(struct Sprite *sprite, u32 berryId, bool32 freePal) +{ + u32 gfxBuffer; + + LoadWordFromTwoHalfwords((u16 *) &sprite->data[BERRY_ICON_GFX_PTR_DATA_ID], &gfxBuffer); + Free((void *)gfxBuffer); + DestroySprite(sprite); + if (freePal) + FreeBerryIconSpritePalette(berryId); +} + +void FreeBerryIconSpritePalette(u32 berryId) +{ + FreeSpritePaletteByTag(TAG_BERRY_PIC_PAL + berryId); +} + u8 CreateBerryFlavorCircleSprite(s16 x) { return CreateSprite(&sBerryCheckCircleSpriteTemplate, x, 116, 0); diff --git a/src/item_use.c b/src/item_use.c index e7acde9ffa..c609614292 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -80,6 +80,21 @@ static void CB2_OpenPokeblockFromBag(void); static void ItemUseOnFieldCB_Honey(u8 taskId); static bool32 IsValidLocationForVsSeeker(void); +static const u8 sText_CantDismountBike[] = _("You can't dismount your BIKE here.{PAUSE_UNTIL_PRESS}"); +static const u8 sText_ItemFinderNearby[] = _("Huh?\nThe ITEMFINDER's responding!\pThere's an item buried around here!{PAUSE_UNTIL_PRESS}"); +static const u8 sText_ItemFinderOnTop[] = _("Oh!\nThe ITEMFINDER's shaking wildly!{PAUSE_UNTIL_PRESS}"); +static const u8 sText_ItemFinderNothing[] = _("… … … …Nope!\nThere's no response.{PAUSE_UNTIL_PRESS}"); +static const u8 sText_CoinCase[] = _("Your COINS:\n{STR_VAR_1}{PAUSE_UNTIL_PRESS}"); +static const u8 sText_PowderQty[] = _("POWDER QTY: {STR_VAR_1}{PAUSE_UNTIL_PRESS}"); +static const u8 sText_BootedUpTM[] = _("Booted up a TM."); +static const u8 sText_BootedUpHM[] = _("Booted up an HM."); +static const u8 sText_TMHMContainedVar1[] = _("It contained\n{STR_VAR_1}.\pTeach {STR_VAR_1}\nto a POKéMON?"); +static const u8 sText_UsedVar2WildLured[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be lured.{PAUSE_UNTIL_PRESS}"); +static const u8 sText_UsedVar2WildRepelled[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be repelled.{PAUSE_UNTIL_PRESS}"); +static const u8 sText_PlayedPokeFluteCatchy[] = _("Played the POKé FLUTE.\pNow, that's a catchy tune!{PAUSE_UNTIL_PRESS}"); +static const u8 sText_PlayedPokeFlute[] = _("Played the POKé FLUTE."); +static const u8 sText_PokeFluteAwakenedMon[] = _("The POKé FLUTE awakened sleeping\nPOKéMON.{PAUSE_UNTIL_PRESS}"); + // EWRAM variables EWRAM_DATA static void(*sItemUseOnFieldCB)(u8 taskId) = NULL; @@ -172,7 +187,7 @@ void DisplayDadsAdviceCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKey static void DisplayCannotDismountBikeMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField) { - DisplayCannotUseItemMessage(taskId, isUsingRegisteredKeyItemOnField, gText_CantDismountBike); + DisplayCannotUseItemMessage(taskId, isUsingRegisteredKeyItemOnField, sText_CantDismountBike); } static void Task_CloseCantUseKeyItemMessage(u8 taskId) @@ -332,7 +347,7 @@ static void ItemUseOnFieldCB_Itemfinder(u8 taskId) if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) gTasks[taskId].func = Task_UseItemfinder; else - DisplayItemMessageOnField(taskId, gText_ItemFinderNothing, Task_CloseItemfinderMessage); + DisplayItemMessageOnField(taskId, sText_ItemFinderNothing, Task_CloseItemfinderMessage); } // Define itemfinder task data @@ -625,7 +640,7 @@ static void PlayerFaceHiddenItem(u8 direction) static void Task_HiddenItemNearby(u8 taskId) { if (ObjectEventCheckHeldMovementStatus(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]) == TRUE) - DisplayItemMessageOnField(taskId, gText_ItemFinderNearby, Task_CloseItemfinderMessage); + DisplayItemMessageOnField(taskId, sText_ItemFinderNearby, Task_CloseItemfinderMessage); } static void Task_StandingOnHiddenItem(u8 taskId) @@ -642,7 +657,7 @@ static void Task_StandingOnHiddenItem(u8 taskId) tCounter++; if (tCounter == 4) - DisplayItemMessageOnField(taskId, gText_ItemFinderOnTop, Task_CloseItemfinderMessage); + DisplayItemMessageOnField(taskId, sText_ItemFinderOnTop, Task_CloseItemfinderMessage); } } @@ -703,7 +718,7 @@ static void Task_AccessPokemonBoxLink(u8 taskId) void ItemUseOutOfBattle_CoinCase(u8 taskId) { ConvertIntToDecimalStringN(gStringVar1, GetCoins(), STR_CONV_MODE_LEFT_ALIGN, 4); - StringExpandPlaceholders(gStringVar4, gText_CoinCase); + StringExpandPlaceholders(gStringVar4, sText_CoinCase); if (!gTasks[taskId].tUsingRegisteredKeyItem) { @@ -718,7 +733,7 @@ void ItemUseOutOfBattle_CoinCase(u8 taskId) void ItemUseOutOfBattle_PowderJar(u8 taskId) { ConvertIntToDecimalStringN(gStringVar1, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 5); - StringExpandPlaceholders(gStringVar4, gText_PowderQty); + StringExpandPlaceholders(gStringVar4, sText_PowderQty); if (!gTasks[taskId].tUsingRegisteredKeyItem) { @@ -868,9 +883,9 @@ void ItemUseOutOfBattle_DynamaxCandy(u8 taskId) void ItemUseOutOfBattle_TMHM(u8 taskId) { if (gSpecialVar_ItemId >= ITEM_HM01) - DisplayItemMessage(taskId, FONT_NORMAL, gText_BootedUpHM, BootUpSoundTMHM); // HM + DisplayItemMessage(taskId, FONT_NORMAL, sText_BootedUpHM, BootUpSoundTMHM); // HM else - DisplayItemMessage(taskId, FONT_NORMAL, gText_BootedUpTM, BootUpSoundTMHM); // TM + DisplayItemMessage(taskId, FONT_NORMAL, sText_BootedUpTM, BootUpSoundTMHM); // TM } static void BootUpSoundTMHM(u8 taskId) @@ -884,7 +899,7 @@ static void Task_ShowTMHMContainedMessage(u8 taskId) if (JOY_NEW(A_BUTTON | B_BUTTON)) { StringCopy(gStringVar1, GetMoveName(ItemIdToBattleMoveId(gSpecialVar_ItemId))); - StringExpandPlaceholders(gStringVar4, gText_TMHMContainedVar1); + StringExpandPlaceholders(gStringVar4, sText_TMHMContainedVar1); DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, UseTMHMYesNo); } } @@ -1025,13 +1040,13 @@ void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId) { FlagSet(FLAG_SYS_ENC_UP_ITEM); FlagClear(FLAG_SYS_ENC_DOWN_ITEM); - StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildLured); + StringExpandPlaceholders(gStringVar4, sText_UsedVar2WildLured); } else { FlagSet(FLAG_SYS_ENC_DOWN_ITEM); FlagClear(FLAG_SYS_ENC_UP_ITEM); - StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildRepelled); + StringExpandPlaceholders(gStringVar4, sText_UsedVar2WildRepelled); } gTasks[taskId].data[8] = 0; gTasks[taskId].func = Task_UsedBlackWhiteFlute; @@ -1531,9 +1546,9 @@ static void Task_DisplayPokeFluteMessage(u8 taskId) if (WaitFanfare(FALSE)) { if (gTasks[taskId].data[3] == 0) - DisplayItemMessage(taskId, FONT_NORMAL, gText_PokeFluteAwakenedMon, CloseItemMessage); + DisplayItemMessage(taskId, FONT_NORMAL, sText_PokeFluteAwakenedMon, CloseItemMessage); else - DisplayItemMessageOnField(taskId, gText_PokeFluteAwakenedMon, Task_CloseCantUseKeyItemMessage); + DisplayItemMessageOnField(taskId, sText_PokeFluteAwakenedMon, Task_CloseCantUseKeyItemMessage); } } @@ -1557,16 +1572,16 @@ void ItemUseOutOfBattle_PokeFlute(u8 taskId) if (wokeSomeoneUp) { if (gTasks[taskId].data[3] == 0) - DisplayItemMessage(taskId, FONT_NORMAL, gText_PlayedPokeFlute, Task_PlayPokeFlute); + DisplayItemMessage(taskId, FONT_NORMAL, sText_PlayedPokeFlute, Task_PlayPokeFlute); else - DisplayItemMessageOnField(taskId, gText_PlayedPokeFlute, Task_PlayPokeFlute); + DisplayItemMessageOnField(taskId, sText_PlayedPokeFlute, Task_PlayPokeFlute); } else { if (gTasks[taskId].data[3] == 0) - DisplayItemMessage(taskId, FONT_NORMAL, gText_PlayedPokeFluteCatchy, CloseItemMessage); + DisplayItemMessage(taskId, FONT_NORMAL, sText_PlayedPokeFluteCatchy, CloseItemMessage); else - DisplayItemMessageOnField(taskId, gText_PlayedPokeFluteCatchy, Task_CloseCantUseKeyItemMessage); + DisplayItemMessageOnField(taskId, sText_PlayedPokeFluteCatchy, Task_CloseCantUseKeyItemMessage); } } diff --git a/src/link.c b/src/link.c index ef928e8d62..fe633c58d7 100644 --- a/src/link.c +++ b/src/link.c @@ -55,10 +55,7 @@ struct LinkTestBGInfo static struct BlockTransfer sBlockSend; static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS]; static u32 sBlockSendDelayCounter; -static bool32 sDummy1; // Never read -static bool8 sDummy2; // Never assigned, read in unused function static u32 sPlayerDataExchangeStatus; -static bool32 sDummy3; // Never read static u8 sLinkTestLastBlockSendPos; static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; static u8 sNumVBlanksWithoutSerialIntr; @@ -73,15 +70,11 @@ COMMON_DATA u32 gLinkDebugSeed = 0; COMMON_DATA struct LinkPlayerBlock gLocalLinkPlayerBlock = {0}; COMMON_DATA bool8 gLinkErrorOccurred = 0; COMMON_DATA u32 gLinkDebugFlags = 0; -COMMON_DATA u32 gLinkFiller1 = 0; COMMON_DATA bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS] = {0}; COMMON_DATA u8 gBlockReceivedStatus[MAX_LINK_PLAYERS] = {0}; -COMMON_DATA u32 gLinkFiller2 = 0; COMMON_DATA u16 gLinkHeldKeys = 0; COMMON_DATA u16 ALIGNED(4) gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH] = {0}; COMMON_DATA u32 gLinkStatus = 0; -COMMON_DATA bool8 gLinkDummy1 = 0; // Never read -COMMON_DATA bool8 gLinkDummy2 = 0; // Never read COMMON_DATA bool8 gReadyToExitStandby[MAX_LINK_PLAYERS] = {0}; COMMON_DATA bool8 gReadyToCloseLink[MAX_LINK_PLAYERS] = {0}; COMMON_DATA u16 gReadyCloseLinkType = 0; // Never read @@ -96,9 +89,6 @@ COMMON_DATA void (*gLinkCallback)(void) = NULL; COMMON_DATA u8 gShouldAdvanceLinkState = 0; COMMON_DATA u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS] = {0}; COMMON_DATA u8 gBlockRequestType = 0; -COMMON_DATA u32 gLinkFiller3 = 0; -COMMON_DATA u32 gLinkFiller4 = 0; -COMMON_DATA u32 gLinkFiller5 = 0; COMMON_DATA u8 gLastSendQueueCount = 0; COMMON_DATA struct Link gLink = {0}; COMMON_DATA u8 gLastRecvQueueCount = 0; @@ -310,7 +300,6 @@ static void UNUSED LinkTestScreen(void) AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); - sDummy3 = FALSE; InitLocalLinkPlayer(); CreateTask(Task_PrintTestData, 0); SetMainCallback2(CB2_LinkTest); @@ -378,9 +367,6 @@ void OpenLink(void) gSuppressLinkErrorMessage = FALSE; ResetBlockReceivedFlags(); ResetBlockSend(); - sDummy1 = FALSE; - gLinkDummy2 = FALSE; - gLinkDummy1 = FALSE; gReadyCloseLinkType = 0; CreateTask(Task_TriggerHandshake, 2); } @@ -552,10 +538,8 @@ static void ProcessRecvCmds(u8 unused) gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; case LINKCMD_DUMMY_1: - gLinkDummy2 = TRUE; break; case LINKCMD_DUMMY_2: - gLinkDummy2 = TRUE; break; case LINKCMD_INIT_BLOCK: { @@ -571,18 +555,11 @@ static void ProcessRecvCmds(u8 unused) { if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE) { - u16 *buffer; - u16 j; - - buffer = (u16 *)gDecompressionBuffer; - for (j = 0; j < CMD_LENGTH - 1; j++) - { - buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1]; - } + // Too large block was sent. } else { - u16 j; + u32 j; for (j = 0; j < CMD_LENGTH - 1; j++) { @@ -1376,11 +1353,6 @@ bool8 IsLinkMaster(void) return EXTRACT_MASTER(gLinkStatus); } -static u8 UNUSED GetDummy2(void) -{ - return sDummy2; -} - void SetCloseLinkCallbackAndType(u16 type) { if (gWirelessCommType == TRUE) @@ -1392,7 +1364,6 @@ void SetCloseLinkCallbackAndType(u16 type) if (gLinkCallback == NULL) { gLinkCallback = LinkCB_ReadyCloseLink; - gLinkDummy1 = FALSE; gReadyCloseLinkType = type; } } @@ -1413,7 +1384,6 @@ void SetCloseLinkCallback(void) else { gLinkCallback = LinkCB_ReadyCloseLink; - gLinkDummy1 = FALSE; gReadyCloseLinkType = 0; } } @@ -1449,7 +1419,6 @@ static void LinkCB_WaitCloseLink(void) gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; - gLinkDummy1 = TRUE; } } @@ -1469,7 +1438,6 @@ void SetCloseLinkCallbackHandleJP(void) else { gLinkCallback = LinkCB_ReadyCloseLinkWithJP; - gLinkDummy1 = FALSE; gReadyCloseLinkType = 0; } } @@ -1511,7 +1479,6 @@ static void LinkCB_WaitCloseLinkWithJP(void) gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; - gLinkDummy1 = TRUE; } } @@ -1525,8 +1492,6 @@ void SetLinkStandbyCallback(void) { if (gLinkCallback == NULL) gLinkCallback = LinkCB_Standby; - - gLinkDummy1 = FALSE; } } diff --git a/src/m4a.c b/src/m4a.c index e90e9b06f0..493577cc23 100644 --- a/src/m4a.c +++ b/src/m4a.c @@ -6,8 +6,6 @@ extern const u8 gCgb3Vol[]; #define BSS_CODE __attribute__((section(".bss.code"))) -BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0}; - COMMON_DATA struct SoundInfo gSoundInfo = {0}; COMMON_DATA struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES] = {0}; COMMON_DATA struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES] = {0}; @@ -72,8 +70,6 @@ void m4aSoundInit(void) { s32 i; - CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); - SoundInit(&gSoundInfo); MPlayExtender(gCgbChans); m4aSoundMode(SOUND_MODE_DA_BIT_8 diff --git a/src/m4a_1.s b/src/m4a_1.s index 20f9197a8d..4c0c8f7f89 100644 --- a/src/m4a_1.s +++ b/src/m4a_1.s @@ -52,11 +52,11 @@ SoundMain_3: cmp r3, 0 beq SoundMain_4 ldr r0, [r0, o_SoundInfo_musicPlayerHead] - bl _081DD25E + bl call_r3 ldr r0, [sp, 0x18] SoundMain_4: ldr r3, [r0, o_SoundInfo_CgbSound] - bl _081DD25E + bl call_r3 ldr r0, [sp, 0x18] ldr r3, [r0, o_SoundInfo_pcmSamplesPerVBlank] mov r8, r3 @@ -73,18 +73,19 @@ SoundMain_4: SoundMain_5: str r5, [sp, 0x8] ldr r6, lt_PCM_DMA_BUF_SIZE - ldr r3, lt_SoundMainRAM_Buffer + ldr r3, lt_SoundMainRAM bx r3 .align 2, 0 lt_SOUND_INFO_PTR: .word SOUND_INFO_PTR lt_ID_NUMBER: .word ID_NUMBER -lt_SoundMainRAM_Buffer: .word SoundMainRAM_Buffer + 1 +lt_SoundMainRAM: .word SoundMainRAM + 1 lt_REG_VCOUNT: .word REG_VCOUNT lt_o_SoundInfo_pcmBuffer: .word o_SoundInfo_pcmBuffer lt_PCM_DMA_BUF_SIZE: .word PCM_DMA_BUF_SIZE thumb_func_end SoundMain + .section .iwram.code thumb_func_start SoundMainRAM SoundMainRAM: ldrb r3, [r0, o_SoundInfo_reverb] @@ -708,6 +709,7 @@ _081DD594: .pool arm_func_end SoundMainRAM_Unk2 + .text thumb_func_start SoundMainBTM SoundMainBTM: mov r12, r4 diff --git a/src/main.c b/src/main.c index 29f02c20e4..c2758ee227 100644 --- a/src/main.c +++ b/src/main.c @@ -69,7 +69,6 @@ COMMON_DATA u16 gKeyRepeatContinueDelay = 0; COMMON_DATA bool8 gSoftResetDisabled = 0; COMMON_DATA IntrFunc gIntrTable[INTR_COUNT] = {0}; COMMON_DATA u8 gLinkVSyncDisabled = 0; -COMMON_DATA u32 IntrMain_Buffer[0x200] = {0}; COMMON_DATA s8 gPcmDmaCounter = 0; COMMON_DATA void *gAgbMainLoop_sp = NULL; @@ -94,7 +93,9 @@ void AgbMain() { *(vu16 *)BG_PLTT = RGB_WHITE; // Set the backdrop to white on startup InitGpuRegManager(); - REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; + REG_WAITCNT = WAITCNT_PREFETCH_ENABLE + | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3 + | WAITCNT_WS1_S_1 | WAITCNT_WS1_N_3; InitKeys(); InitIntrHandlers(); m4aSoundInit(); @@ -316,9 +317,7 @@ void InitIntrHandlers(void) for (i = 0; i < INTR_COUNT; i++) gIntrTable[i] = gIntrTableTemplate[i]; - DmaCopy32(3, IntrMain, IntrMain_Buffer, sizeof(IntrMain_Buffer)); - - INTR_VECTOR = IntrMain_Buffer; + INTR_VECTOR = IntrMain; SetVBlankCallback(NULL); SetHBlankCallback(NULL); diff --git a/src/main_menu.c b/src/main_menu.c index bae80e543a..c8132c6df8 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -1915,12 +1915,12 @@ static void AddBirchSpeechObjects(u8 taskId) gSprites[lotadSpriteId].oam.priority = 0; gSprites[lotadSpriteId].invisible = TRUE; gTasks[taskId].tLotadSpriteId = lotadSpriteId; - brendanSpriteId = CreateTrainerSprite(FacilityClassToPicIndex(FACILITY_CLASS_BRENDAN), 120, 60, 0, &gDecompressionBuffer[0]); + brendanSpriteId = CreateTrainerSprite(FacilityClassToPicIndex(FACILITY_CLASS_BRENDAN), 120, 60, 0, NULL); gSprites[brendanSpriteId].callback = SpriteCB_Null; gSprites[brendanSpriteId].invisible = TRUE; gSprites[brendanSpriteId].oam.priority = 0; gTasks[taskId].tBrendanSpriteId = brendanSpriteId; - maySpriteId = CreateTrainerSprite(FacilityClassToPicIndex(FACILITY_CLASS_MAY), 120, 60, 0, &gDecompressionBuffer[TRAINER_PIC_SIZE]); + maySpriteId = CreateTrainerSprite(FacilityClassToPicIndex(FACILITY_CLASS_MAY), 120, 60, 0, NULL); gSprites[maySpriteId].callback = SpriteCB_Null; gSprites[maySpriteId].invisible = TRUE; gSprites[maySpriteId].oam.priority = 0; diff --git a/src/match_call.c b/src/match_call.c index 662dd209a4..ea2ab8ed46 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -1839,25 +1839,13 @@ static void PopulateBattleFrontierStreak(int matchCallId, u8 *destStr) ConvertIntToDecimalStringN(destStr, sBattleFrontierStreakInfo.streak, STR_CONV_MODE_LEFT_ALIGN, i); } -static const u16 sBadgeFlags[NUM_BADGES] = -{ - FLAG_BADGE01_GET, - FLAG_BADGE02_GET, - FLAG_BADGE03_GET, - FLAG_BADGE04_GET, - FLAG_BADGE05_GET, - FLAG_BADGE06_GET, - FLAG_BADGE07_GET, - FLAG_BADGE08_GET, -}; - static int GetNumOwnedBadges(void) { u32 i; for (i = 0; i < NUM_BADGES; i++) { - if (!FlagGet(sBadgeFlags[i])) + if (!FlagGet(gBadgeFlags[i])) break; } diff --git a/src/menu.c b/src/menu.c index d9b331a8b2..a6d6a38926 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1943,7 +1943,12 @@ void task_free_buf_after_copying_tile_data_to_vram(u8 taskId) void *malloc_and_decompress(const void *src, u32 *size) { + u32 sizeLocal; // If size is passed as NULL, because we don't care about knowing the size void *ptr; + + if (size == NULL) + size = &sizeLocal; + u8 *sizeAsBytes = (u8 *)size; u8 *srcAsBytes = (u8 *)src; diff --git a/src/menu_specialized.c b/src/menu_specialized.c index 693e9f12bc..7b6d94b5f2 100644 --- a/src/menu_specialized.c +++ b/src/menu_specialized.c @@ -10,6 +10,7 @@ #include "international_string_util.h" #include "menu.h" #include "menu_specialized.h" +#include "move.h" #include "move_relearner.h" #include "palette.h" #include "player_pc.h" @@ -752,7 +753,6 @@ u8 LoadMoveRelearnerMovesList(const struct ListMenuItem *items, u16 numChoices) static void MoveRelearnerLoadBattleMoveDescription(u32 chosenMove) { s32 x; - const struct MoveInfo *move; u8 buffer[32]; const u8 *str; @@ -780,49 +780,41 @@ static void MoveRelearnerLoadBattleMoveDescription(u32 chosenMove) CopyWindowToVram(RELEARNERWIN_DESC_BATTLE, COPYWIN_GFX); return; } - move = &gMovesInfo[chosenMove]; - str = gTypesInfo[move->type].name; + str = gTypesInfo[GetMoveType(chosenMove)].name; AddTextPrinterParameterized(RELEARNERWIN_DESC_BATTLE, FONT_NORMAL, str, 4, 25, TEXT_SKIP_DRAW, NULL); x = 4 + GetStringWidth(FONT_NORMAL, gText_MoveRelearnerPP, 0); - ConvertIntToDecimalStringN(buffer, move->pp, STR_CONV_MODE_LEFT_ALIGN, 2); + ConvertIntToDecimalStringN(buffer, GetMovePP(chosenMove), STR_CONV_MODE_LEFT_ALIGN, 2); AddTextPrinterParameterized(RELEARNERWIN_DESC_BATTLE, FONT_NORMAL, buffer, x, 41, TEXT_SKIP_DRAW, NULL); - if (move->power < 2) + if (GetMovePower(chosenMove) < 2) { str = gText_ThreeDashes; } else { - ConvertIntToDecimalStringN(buffer, move->power, STR_CONV_MODE_LEFT_ALIGN, 3); + ConvertIntToDecimalStringN(buffer, GetMovePower(chosenMove), STR_CONV_MODE_LEFT_ALIGN, 3); str = buffer; } AddTextPrinterParameterized(RELEARNERWIN_DESC_BATTLE, FONT_NORMAL, str, 106, 25, TEXT_SKIP_DRAW, NULL); - if (move->accuracy == 0) + if (GetMoveAccuracy(chosenMove) == 0) { str = gText_ThreeDashes; } else { - ConvertIntToDecimalStringN(buffer, move->accuracy, STR_CONV_MODE_LEFT_ALIGN, 3); + ConvertIntToDecimalStringN(buffer, GetMoveAccuracy(chosenMove), STR_CONV_MODE_LEFT_ALIGN, 3); str = buffer; } AddTextPrinterParameterized(RELEARNERWIN_DESC_BATTLE, FONT_NORMAL, str, 106, 41, TEXT_SKIP_DRAW, NULL); - - if (move->effect != EFFECT_PLACEHOLDER) - str = gMovesInfo[chosenMove].description; - else - str = gNotDoneYetDescription; - - AddTextPrinterParameterized(RELEARNERWIN_DESC_BATTLE, FONT_NARROW, str, 0, 65, 0, NULL); + AddTextPrinterParameterized(RELEARNERWIN_DESC_BATTLE, FONT_NARROW, GetMoveDescription(chosenMove), 0, 65, 0, NULL); } static void MoveRelearnerMenuLoadContestMoveDescription(u32 chosenMove) { s32 x; const u8 *str; - const struct MoveInfo *move; MoveRelearnerShowHideHearts(chosenMove); FillWindowPixelBuffer(RELEARNERWIN_DESC_CONTEST, PIXEL_FILL(1)); @@ -844,11 +836,10 @@ static void MoveRelearnerMenuLoadContestMoveDescription(u32 chosenMove) return; } - move = &gMovesInfo[chosenMove]; - str = gContestMoveTypeTextPointers[move->contestCategory]; + str = gContestMoveTypeTextPointers[GetMoveContestCategory(chosenMove)]; AddTextPrinterParameterized(RELEARNERWIN_DESC_CONTEST, FONT_NORMAL, str, 4, 25, TEXT_SKIP_DRAW, NULL); - str = gContestEffectDescriptionPointers[move->contestEffect]; + str = gContestEffectDescriptionPointers[GetMoveContestEffect(chosenMove)]; AddTextPrinterParameterized(RELEARNERWIN_DESC_CONTEST, FONT_NARROW, str, 0, 65, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(RELEARNERWIN_DESC_CONTEST, COPYWIN_GFX); diff --git a/src/move.c b/src/move.c new file mode 100644 index 0000000000..c77742c30e --- /dev/null +++ b/src/move.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "battle.h" +#include "main.h" +#include "move.h" + +#include "data/moves_info.h" diff --git a/src/move_relearner.c b/src/move_relearner.c index d38dcedcf2..7d3b61213c 100644 --- a/src/move_relearner.c +++ b/src/move_relearner.c @@ -967,7 +967,7 @@ void MoveRelearnerShowHideHearts(s32 moveId) } else { - numHearts = (u8)(gContestEffects[gMovesInfo[moveId].contestEffect].appeal / 10); + numHearts = (u8)(gContestEffects[GetMoveContestEffect(moveId)].appeal / 10); if (numHearts == 0xFF) numHearts = 0; @@ -981,7 +981,7 @@ void MoveRelearnerShowHideHearts(s32 moveId) gSprites[sMoveRelearnerStruct->heartSpriteIds[i]].invisible = FALSE; } - numHearts = (u8)(gContestEffects[gMovesInfo[moveId].contestEffect].jam / 10); + numHearts = (u8)(gContestEffects[GetMoveContestEffect(moveId)].jam / 10); if (numHearts == 0xFF) numHearts = 0; diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c index 79cab2b050..82a9cf1831 100644 --- a/src/mystery_event_menu.c +++ b/src/mystery_event_menu.c @@ -28,8 +28,6 @@ enum { static void CB2_MysteryEventMenu(void); static void PrintMysteryMenuText(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed); -static EWRAM_DATA u8 sUnused = 0; // set but unused - static const struct BgTemplate sBgTemplates[] = { { @@ -257,10 +255,14 @@ static void CB2_MysteryEventMenu(void) case 11: if (gReceivedRemoteLinkPlayers == 0) { + // No clue what is going on here, and from where gDecompressionBuffer gets actually populated with mystery event script. + /* u16 status = RunMysteryEventScript(gDecompressionBuffer); CpuFill32(0, gDecompressionBuffer, 0x7D4); + if (!GetEventLoadMessage(gStringVar4, status)) TrySavingData(SAVE_NORMAL); + */ gMain.state++; } break; @@ -270,10 +272,7 @@ static void CB2_MysteryEventMenu(void) break; case 13: if (!IsTextPrinterActive(WIN_MSG)) - { gMain.state++; - sUnused = 0; - } break; case 14: if (JOY_NEW(A_BUTTON)) diff --git a/src/mystery_gift_client.c b/src/mystery_gift_client.c index 62ab85b43d..3663df43d5 100644 --- a/src/mystery_gift_client.c +++ b/src/mystery_gift_client.c @@ -238,7 +238,7 @@ static u32 Client_Run(struct MysteryGiftClient * client) #endif //FREE_BATTLE_TOWER_E_READER break; case CLI_RUN_BUFFER_SCRIPT: - memcpy(gDecompressionBuffer, client->recvBuffer, MG_LINK_BUFFER_SIZE); + memcpy(client->bufferScript, client->recvBuffer, MG_LINK_BUFFER_SIZE); client->funcId = FUNC_RUN_BUFFER; client->funcState = 0; break; @@ -279,7 +279,7 @@ static u32 Client_RunMysteryEventScript(struct MysteryGiftClient * client) static u32 Client_RunBufferScript(struct MysteryGiftClient * client) { // exec arbitrary code - u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)gDecompressionBuffer; + u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)client->bufferScript; if (func(&client->param, gSaveBlock2Ptr, gSaveBlock1Ptr) == 1) { client->funcId = FUNC_RUN; diff --git a/src/naming_screen.c b/src/naming_screen.c index 118d91cfb4..e1307aa658 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -672,18 +672,8 @@ static bool8 MainState_PressedOKButton(void) SetInputState(INPUT_STATE_DISABLED); SetCursorFlashing(FALSE); TryStartButtonFlash(BUTTON_COUNT, FALSE, TRUE); - if (sNamingScreen->templateNum == NAMING_SCREEN_CAUGHT_MON - && CalculatePlayerPartyCount() >= PARTY_SIZE) - { - DisplaySentToPCMessage(); - sNamingScreen->state = STATE_WAIT_SENT_TO_PC_MESSAGE; - return FALSE; - } - else - { - sNamingScreen->state = STATE_FADE_OUT; - return TRUE; - } + sNamingScreen->state = STATE_FADE_OUT; + return TRUE; } static bool8 MainState_FadeOut(void) @@ -699,7 +689,11 @@ static bool8 MainState_Exit(void) { if (sNamingScreen->templateNum == NAMING_SCREEN_PLAYER) SeedRngAndSetTrainerId(); - SetMainCallback2(sNamingScreen->returnCallback); + if (sNamingScreen->templateNum == NAMING_SCREEN_CAUGHT_MON + && CalculatePlayerPartyCount() < PARTY_SIZE) + SetMainCallback2(BattleMainCB2); + else + SetMainCallback2(sNamingScreen->returnCallback); DestroyTask(FindTaskIdByFunc(Task_NamingScreen)); FreeAllWindowBuffers(); FREE_AND_SET_NULL(sNamingScreen); @@ -707,7 +701,7 @@ static bool8 MainState_Exit(void) return FALSE; } -static void DisplaySentToPCMessage(void) +static UNUSED void DisplaySentToPCMessage(void) { u8 stringToDisplay = 0; @@ -1373,6 +1367,7 @@ static void NamingScreen_CreatePlayerIcon(void); static void NamingScreen_CreatePCIcon(void); static void NamingScreen_CreateMonIcon(void); static void NamingScreen_CreateWaldaDadIcon(void); +static void NamingScreen_CreateCodeIcon(void); static void (*const sIconFunctions[])(void) = { @@ -1381,6 +1376,7 @@ static void (*const sIconFunctions[])(void) = NamingScreen_CreatePCIcon, NamingScreen_CreateMonIcon, NamingScreen_CreateWaldaDadIcon, + NamingScreen_CreateCodeIcon, }; static void CreateInputTargetIcon(void) @@ -1431,6 +1427,13 @@ static void NamingScreen_CreateWaldaDadIcon(void) StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_SOUTH); } +static void NamingScreen_CreateCodeIcon(void) +{ + u8 spriteId; + spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_MYSTERY_GIFT_MAN, SpriteCallbackDummy, 56, 37, 0); + gSprites[spriteId].oam.priority = 3; +} + //-------------------------------------------------- // Keyboard handling //-------------------------------------------------- @@ -1744,6 +1747,7 @@ static void (*const sDrawTextEntryBoxFuncs[])(void) = [NAMING_SCREEN_CAUGHT_MON] = DrawMonTextEntryBox, [NAMING_SCREEN_NICKNAME] = DrawMonTextEntryBox, [NAMING_SCREEN_WALDA] = DrawNormalTextEntryBox, + [NAMING_SCREEN_CODE] = DrawNormalTextEntryBox, }; static void DrawTextEntryBox(void) @@ -2146,6 +2150,18 @@ static const struct NamingScreenTemplate sWaldaWordsScreenTemplate = .title = gText_TellHimTheWords, }; +static const u8 sText_EnterCode[] = _("Enter code:"); +static const struct NamingScreenTemplate sCodeScreenTemplate = +{ + .copyExistingString = FALSE, + .maxChars = CODE_NAME_LENGTH, + .iconFunction = 5, + .addGenderIcon = FALSE, + .initialPage = KBPAGE_LETTERS_UPPER, + .unused = 35, + .title = sText_EnterCode, +}; + static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = { [NAMING_SCREEN_PLAYER] = &sPlayerNamingScreenTemplate, @@ -2153,6 +2169,7 @@ static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = [NAMING_SCREEN_CAUGHT_MON] = &sMonNamingScreenTemplate, [NAMING_SCREEN_NICKNAME] = &sMonNamingScreenTemplate, [NAMING_SCREEN_WALDA] = &sWaldaWordsScreenTemplate, + [NAMING_SCREEN_CODE] = &sCodeScreenTemplate, }; static const struct OamData sOam_8x8 = diff --git a/src/new_game.c b/src/new_game.c index 4bce5a5b96..bdc020f9df 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -44,7 +44,9 @@ #include "berry_powder.h" #include "mystery_gift.h" #include "union_room_chat.h" +#include "constants/map_groups.h" #include "constants/items.h" +#include "difficulty.h" extern const u8 EventScript_ResetAllMapFlags[]; @@ -52,6 +54,7 @@ static void ClearFrontierRecord(void); static void WarpToTruck(void); static void ResetMiniGamesRecords(void); static void ResetItemFlags(void); +static void ResetDexNav(void); EWRAM_DATA bool8 gDifferentSaveFile = FALSE; EWRAM_DATA bool8 gEnableContestDebugging = FALSE; @@ -205,7 +208,9 @@ void NewGameInitData(void) WipeTrainerNameRecords(); ResetTrainerHillResults(); ResetContestLinkResults(); + SetCurrentDifficultyLevel(DIFFICULTY_NORMAL); ResetItemFlags(); + ResetDexNav(); } static void ResetMiniGamesRecords(void) @@ -222,3 +227,11 @@ static void ResetItemFlags(void) memset(&gSaveBlock3Ptr->itemFlags, 0, sizeof(gSaveBlock3Ptr->itemFlags)); #endif } + +static void ResetDexNav(void) +{ +#if USE_DEXNAV_SEARCH_LEVELS == TRUE + memset(gSaveBlock3Ptr->dexNavSearchLevels, 0, sizeof(gSaveBlock3Ptr->dexNavSearchLevels)); +#endif + gSaveBlock3Ptr->dexNavChain = 0; +} diff --git a/src/overworld.c b/src/overworld.c index 6bfb49fce9..3dcb26de87 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -6,6 +6,7 @@ #include "bg.h" #include "cable_club.h" #include "clock.h" +#include "dexnav.h" #include "event_data.h" #include "event_object_movement.h" #include "event_scripts.h" @@ -72,6 +73,8 @@ #include "constants/trainer_hill.h" #include "constants/weather.h" +STATIC_ASSERT((B_FLAG_FOLLOWERS_DISABLED == 0 || OW_FOLLOWERS_ENABLED), FollowersFlagAssignedWithoutEnablingThem); + struct CableClubPlayer { u8 playerId; @@ -838,6 +841,7 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) LoadObjEventTemplatesFromHeader(); TrySetMapSaveWarpStatus(); ClearTempFieldEventData(); + ResetDexNavSearch(); ResetCyclingRoadChallengeData(); RestartWildEncounterImmunitySteps(); #if FREE_MATCH_CALL == FALSE @@ -902,6 +906,7 @@ static void LoadMapFromWarp(bool32 a1) CheckLeftFriendsSecretBase(); TrySetMapSaveWarpStatus(); ClearTempFieldEventData(); + ResetDexNavSearch(); ResetCyclingRoadChallengeData(); RestartWildEncounterImmunitySteps(); #if FREE_MATCH_CALL == FALSE @@ -3383,6 +3388,9 @@ static u8 ReformatItemDescription(u16 item, u8 *dest) void ScriptShowItemDescription(struct ScriptContext *ctx) { u8 headerType = ScriptReadByte(ctx); + + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + struct WindowTemplate template; u16 item = gSpecialVar_0x8006; u8 textY; @@ -3422,6 +3430,8 @@ void ScriptShowItemDescription(struct ScriptContext *ctx) void ScriptHideItemDescription(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + DestroyItemIconSprite(); if (!GetSetItemObtained(gSpecialVar_0x8006, FLAG_GET_ITEM_OBTAINED)) diff --git a/src/palette.c b/src/palette.c index 2526479ca8..f9a074d41e 100644 --- a/src/palette.c +++ b/src/palette.c @@ -2,6 +2,8 @@ #include "palette.h" #include "util.h" #include "decompress.h" +#include "malloc.h" +#include "menu.h" #include "gpu_regs.h" #include "task.h" #include "constants/rgb.h" @@ -40,9 +42,9 @@ static const u8 sRoundedDownGrayscaleMap[] = { void LoadCompressedPalette(const u32 *src, u32 offset, u32 size) { - LZDecompressWram(src, gDecompressionBuffer); - CpuCopy16(gDecompressionBuffer, &gPlttBufferUnfaded[offset], size); - CpuCopy16(gDecompressionBuffer, &gPlttBufferFaded[offset], size); + void *buffer = malloc_and_decompress(src, NULL); + LoadPalette(buffer, offset, size); + Free(buffer); } void LoadPalette(const void *src, u32 offset, u32 size) diff --git a/src/party_menu.c b/src/party_menu.c index 064a0eec16..5e79d74d45 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -174,6 +174,14 @@ enum { #define MENU_DIR_RIGHT 2 #define MENU_DIR_LEFT -2 +#define HM_MOVES_END 0xFFFF + +static const u16 sHMMoves[] = +{ + MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, + MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, HM_MOVES_END +}; + enum { CAN_LEARN_MOVE, CANNOT_LEARN_MOVE, @@ -320,6 +328,7 @@ static void HandleChooseMonSelection(u8, s8 *); static u16 PartyMenuButtonHandler(s8 *); static s8 *GetCurrentPartySlotPtr(void); static bool8 IsSelectedMonNotEgg(u8 *); +static bool8 DoesSelectedMonKnowHM(u8 *); static void PartyMenuRemoveWindow(u8 *); static void CB2_SetUpExitToBattleScreen(void); static void Task_ClosePartyMenuAfterText(u8); @@ -551,6 +560,9 @@ static void InitPartyMenu(u8 menuType, u8 layout, u8 partyAction, bool8 keepCurs else if (gPartyMenu.slotId > PARTY_SIZE - 1 || GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES) == SPECIES_NONE) gPartyMenu.slotId = 0; + if (gPlayerPartyCount == 0) + gPartyMenu.slotId = PARTY_SIZE + 1; // Cancel + gTextFlags.autoScroll = 0; CalculatePlayerPartyCount(); SetMainCallback2(CB2_InitPartyMenu); @@ -982,7 +994,7 @@ static void RenderPartyMenuBox(u8 slot) PutWindowTilemap(sPartyMenuBoxes[slot].windowId); ScheduleBgCopyTilemapToVram(2); } - else + else if (gPlayerPartyCount != 0) { if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) == SPECIES_NONE) { @@ -1521,6 +1533,30 @@ static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr) } break; } + case PARTY_ACTION_SEND_MON_TO_BOX: + { + u8 partyId = GetPartyIdFromBattleSlot((u8)*slotPtr); + if (partyId == 0 || ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && partyId == 2) + || ((gBattleTypeFlags & BATTLE_TYPE_MULTI) && partyId >= (PARTY_SIZE / 2))) + { + // Can't select if mon is currently on the field, or doesn't belong to you + PlaySE(SE_FAILURE); + } + else if (DoesSelectedMonKnowHM((u8 *)slotPtr)) + { + PlaySE(SE_FAILURE); + DisplayPartyMenuMessage(gText_CannotSendMonToBoxHM, FALSE); + ScheduleBgCopyTilemapToVram(2); + gTasks[taskId].func = Task_ReturnToChooseMonAfterText; + } + else + { + PlaySE(SE_SELECT); + gSelectedMonPartyId = partyId; + Task_ClosePartyMenu(taskId); + } + break; + } default: case PARTY_ACTION_ABILITY_PREVENTS: case PARTY_ACTION_SWITCHING: @@ -1541,6 +1577,25 @@ static bool8 IsSelectedMonNotEgg(u8 *slotPtr) return TRUE; } +static bool8 DoesSelectedMonKnowHM(u8 *slotPtr) +{ + if (B_CATCH_SWAP_CHECK_HMS == FALSE) + return FALSE; + + for (u32 i = 0; i < MAX_MON_MOVES; i++) + { + u32 j = 0; + u16 move = GetMonData(&gPlayerParty[*slotPtr], MON_DATA_MOVE1 + i); + + while (sHMMoves[j] != HM_MOVES_END) + { + if (sHMMoves[j++] == move) + return TRUE; + } + } + return FALSE; +} + static void HandleChooseMonCancel(u8 taskId, s8 *slotPtr) { switch (gPartyMenu.action) @@ -1558,6 +1613,11 @@ static void HandleChooseMonCancel(u8 taskId, s8 *slotPtr) PlaySE(SE_SELECT); CancelParticipationPrompt(taskId); break; + case PARTY_ACTION_SEND_MON_TO_BOX: + PlaySE(SE_SELECT); + gSelectedMonPartyId = PARTY_SIZE + 1; + Task_ClosePartyMenu(taskId); + break; default: PlaySE(SE_SELECT); if (DisplayCancelChooseMonYesNo(taskId) != TRUE) @@ -1656,7 +1716,7 @@ static u16 PartyMenuButtonHandler(s8 *slotPtr) if (JOY_NEW(START_BUTTON)) return START_BUTTON; - if (movementDir) + if (movementDir && gPlayerPartyCount != 0) { UpdateCurrentPartySelection(slotPtr, movementDir); return 0; @@ -1921,7 +1981,10 @@ static void Task_ReturnToChooseMonAfterText(u8 taskId) } else { - DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); + if (gPartyMenu.action == PARTY_ACTION_SEND_MON_TO_BOX) + DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON_FOR_BOX); + else + DisplayPartyMenuStdMessage(PARTY_MSG_CHOOSE_MON); gTasks[taskId].func = Task_HandleChooseMonInput; } } @@ -2667,6 +2730,9 @@ void DisplayPartyMenuStdMessage(u32 stringId) stringId = PARTY_MSG_CHOOSE_MON_AND_CONFIRM; else if (!ShouldUseChooseMonText()) stringId = PARTY_MSG_CHOOSE_MON_OR_CANCEL; + + if (gPlayerPartyCount == 0) + stringId = PARTY_MSG_NO_POKEMON; } DrawStdFrameWithCustomTileAndPalette(*windowPtr, FALSE, 0x4F, 13); StringExpandPlaceholders(gStringVar4, sActionStringTable[stringId]); @@ -2735,7 +2801,7 @@ static u8 DisplaySelectionWindow(u8 windowType) const u8 *text; u8 fontColorsId = (sPartyMenuInternal->actions[i] >= MENU_FIELD_MOVES) ? 4 : 3; if (sPartyMenuInternal->actions[i] >= MENU_FIELD_MOVES) - text = gMovesInfo[sFieldMoves[sPartyMenuInternal->actions[i] - MENU_FIELD_MOVES]].name; + text = GetMoveName(sFieldMoves[sPartyMenuInternal->actions[i] - MENU_FIELD_MOVES]); else text = sCursorOptions[sPartyMenuInternal->actions[i]].text; @@ -4259,7 +4325,7 @@ static void ShowOrHideHeldItemSprite(u16 item, struct PartyMenuBox *menuBox) void LoadHeldItemIcons(void) { - LoadSpriteSheet(&sSpriteSheet_HeldItem); + LoadSpriteSheet(&gSpriteSheet_HeldItem); LoadSpritePalette(&sSpritePalette_HeldItem); } @@ -4659,8 +4725,7 @@ void ItemUseCB_Medicine(u8 taskId, TaskFunc task) if (!IsItemFlute(item)) { PlaySE(SE_USE_ITEM); - if (gPartyMenu.action != PARTY_ACTION_REUSABLE_ITEM) - RemoveBagItem(item, 1); + RemoveBagItem(item, 1); } else { @@ -6442,9 +6507,10 @@ static void Task_TryItemUseFormChange(u8 taskId) bool32 TryItemUseFormChange(u8 taskId, TaskFunc task) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; - u16 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_ITEM_USE, gSpecialVar_ItemId); + u32 currentSpecies = GetMonData(mon, MON_DATA_SPECIES); + u32 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_ITEM_USE, gSpecialVar_ItemId); - if (targetSpecies != SPECIES_NONE) + if (targetSpecies != currentSpecies) { gPartyMenuUseExitCallback = TRUE; SetWordTaskArg(taskId, tNextFunc, (u32)task); @@ -6490,12 +6556,13 @@ void ItemUseCB_RotomCatalog(u8 taskId, TaskFunc task) bool32 TryMultichoiceFormChange(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; + u32 currentSpecies = GetMonData(mon, MON_DATA_SPECIES); u32 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_ITEM_USE_MULTICHOICE, gSpecialVar_ItemId); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); - if (targetSpecies != SPECIES_NONE) + if (targetSpecies != currentSpecies) { gPartyMenuUseExitCallback = TRUE; SetWordTaskArg(taskId, tNextFunc, (u32)Task_ClosePartyMenuAfterText); @@ -6582,8 +6649,9 @@ static void CursorCb_ChangeAbility(u8 taskId) void TryItemHoldFormChange(struct Pokemon *mon) { - u16 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_ITEM_HOLD, 0); - if (targetSpecies != SPECIES_NONE) + u32 currentSpecies = GetMonData(mon, MON_DATA_SPECIES); + u32 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_ITEM_HOLD, 0); + if (targetSpecies != currentSpecies) { PlayCry_NormalNoDucking(targetSpecies, 0, CRY_VOLUME_RS, CRY_VOLUME_RS); SetMonData(mon, MON_DATA_SPECIES, &targetSpecies); @@ -7115,7 +7183,11 @@ static u8 GetPartyLayoutFromBattleType(void) void OpenPartyMenuInBattle(u8 partyAction) { - InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_SetUpReshowBattleScreenAfterMenu); + if (partyAction == PARTY_ACTION_SEND_MON_TO_BOX) + InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, PARTY_MSG_CHOOSE_MON_FOR_BOX, Task_HandleChooseMonInput, ReshowBlankBattleScreenAfterMenu); + else + InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_SetUpReshowBattleScreenAfterMenu); + ReshowBattleScreenDummy(); UpdatePartyToBattleOrder(); } diff --git a/src/player_pc.c b/src/player_pc.c index 49fa60f60a..352a7a11f8 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -181,20 +181,30 @@ static EWRAM_DATA u8 sTopMenuNumOptions = 0; EWRAM_DATA struct PlayerPCItemPageStruct gPlayerPCItemPageInfo = {}; static EWRAM_DATA struct ItemStorageMenu *sItemStorageMenu = NULL; +static const u8 sText_WithdrawItem[] = _("WITHDRAW ITEM"); +static const u8 sText_DepositItem[] = _("DEPOSIT ITEM"); +static const u8 sText_TossItem[] = _("TOSS ITEM"); +static const u8 sText_Mailbox[] = _("MAILBOX"); + +static const u8 sText_WithdrawHowManyItems[] = _("Withdraw how many\n{STR_VAR_1}?"); +static const u8 sText_WithdrawXItems[] = _("Withdrew {STR_VAR_2}\n{STR_VAR_1}."); +static const u8 sText_NoRoomInBag[] = _("There is no more\nroom in the BAG."); +static const u8 sText_TooImportantToToss[] = _("That's much too\nimportant to toss\nout!"); + static const u8 *const sItemStorage_OptionDescriptions[] = { - [MENU_WITHDRAW] = gText_TakeOutItemsFromPC, - [MENU_DEPOSIT] = gText_StoreItemsInPC, - [MENU_TOSS] = gText_ThrowAwayItemsInPC, + [MENU_WITHDRAW] = COMPOUND_STRING("Take out items from the PC."), + [MENU_DEPOSIT] = COMPOUND_STRING("Store items in the PC."), + [MENU_TOSS] = COMPOUND_STRING("Throw away items stored in the PC."), [MENU_EXIT] = gText_GoBackPrevMenu, }; static const struct MenuAction sPlayerPCMenuActions[] = { - [MENU_ITEMSTORAGE] = { gText_ItemStorage, {PlayerPC_ItemStorage} }, - [MENU_MAILBOX] = { gText_Mailbox, {PlayerPC_Mailbox} }, - [MENU_DECORATION] = { gText_Decoration, {PlayerPC_Decoration} }, - [MENU_TURNOFF] = { gText_TurnOff, {PlayerPC_TurnOff} } + [MENU_ITEMSTORAGE] = { COMPOUND_STRING("ITEM STORAGE"), {PlayerPC_ItemStorage} }, + [MENU_MAILBOX] = { sText_Mailbox, {PlayerPC_Mailbox} }, + [MENU_DECORATION] = { COMPOUND_STRING("DECORATION"), {PlayerPC_Decoration} }, + [MENU_TURNOFF] = { COMPOUND_STRING("TURN OFF"), {PlayerPC_TurnOff} } }; static const u8 sBedroomPC_OptionOrder[] = @@ -216,9 +226,9 @@ static const u8 sPlayerPC_OptionOrder[] = static const struct MenuAction sItemStorage_MenuActions[] = { - [MENU_WITHDRAW] = { gText_WithdrawItem, {ItemStorage_Withdraw} }, - [MENU_DEPOSIT] = { gText_DepositItem, {ItemStorage_Deposit} }, - [MENU_TOSS] = { gText_TossItem, {ItemStorage_Toss} }, + [MENU_WITHDRAW] = { sText_WithdrawItem, {ItemStorage_Withdraw} }, + [MENU_DEPOSIT] = { sText_DepositItem, {ItemStorage_Deposit} }, + [MENU_TOSS] = { sText_TossItem, {ItemStorage_Toss} }, [MENU_EXIT] = { gText_Cancel, {ItemStorage_Exit} } }; @@ -230,10 +240,10 @@ static const u16 sNewGamePCItems[][2] = const struct MenuAction gMailboxMailOptions[] = { - { gText_Read, {Mailbox_DoMailRead} }, - { gText_MoveToBag, {Mailbox_MoveToBag} }, - { gText_Give2, {Mailbox_Give} }, - { gText_Cancel2, {Mailbox_Cancel} } + { COMPOUND_STRING("READ"), {Mailbox_DoMailRead} }, + { COMPOUND_STRING("MOVE TO BAG"), {Mailbox_MoveToBag} }, + { COMPOUND_STRING("GIVE"), {Mailbox_Give} }, + { gText_Cancel2, {Mailbox_Cancel} } }; static const struct WindowTemplate sWindowTemplates_MainMenus[] = @@ -697,7 +707,7 @@ static void Mailbox_DrawMailboxMenu(u8 taskId) { u8 windowId = MailboxMenu_AddWindow(MAILBOXWIN_TITLE); MailboxMenu_AddWindow(MAILBOXWIN_LIST); - AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_Mailbox, GetStringCenterAlignXOffset(FONT_NORMAL, gText_Mailbox, 0x40), 1, 0, NULL); + AddTextPrinterParameterized(windowId, FONT_NORMAL, sText_Mailbox, GetStringCenterAlignXOffset(FONT_NORMAL, sText_Mailbox, 0x40), 1, 0, NULL); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].tListTaskId = MailboxMenu_CreateList(&gPlayerPCItemPageInfo); MailboxMenu_AddScrollArrows(&gPlayerPCItemPageInfo); @@ -1147,9 +1157,9 @@ static void ItemStorage_CreateListMenu(u8 taskId) for (i = 0; i <= ITEMPC_WIN_LIST_END; i++) ItemStorage_AddWindow(i); toss = tInTossMenu; - text = gText_TossItem; + text = sText_TossItem; if (!toss) - text = gText_WithdrawItem; + text = sText_WithdrawItem; x = GetStringCenterAlignXOffset(FONT_NORMAL, text, 104); AddTextPrinterParameterized(sItemStorageMenu->windowIds[ITEMPC_WIN_TITLE], FONT_NORMAL, text, x, 1, 0, NULL); CopyWindowToVram(sItemStorageMenu->windowIds[ITEMPC_WIN_ICON], COPYWIN_GFX); @@ -1172,10 +1182,10 @@ static const u8 *ItemStorage_GetMessage(u16 itemId) string = gText_GoBackPrevMenu; break; case MSG_HOW_MANY_TO_WITHDRAW: - string = gText_WithdrawHowManyItems; + string = sText_WithdrawHowManyItems; break; case MSG_WITHDREW_ITEM: - string = gText_WithdrawXItems; + string = sText_WithdrawXItems; break; case MSG_HOW_MANY_TO_TOSS: string = gText_TossHowManyVar1s; @@ -1184,10 +1194,10 @@ static const u8 *ItemStorage_GetMessage(u16 itemId) string = gText_ThrewAwayVar2Var1s; break; case MSG_NO_MORE_ROOM: - string = gText_NoRoomInBag; + string = sText_NoRoomInBag; break; case MSG_TOO_IMPORTANT: - string = gText_TooImportantToToss; + string = sText_TooImportantToToss; break; case MSG_OKAY_TO_THROW_AWAY: string = gText_ConfirmTossItems; diff --git a/src/pokeball.c b/src/pokeball.c index 2b168cd7e3..6db184b496 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -993,16 +993,11 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) u16 wantedCryCase; u8 taskId; + mon = GetPartyBattlerData(battlerId); if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - { - mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; pan = 25; - } else - { - mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; pan = -25; - } if ((battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) && IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive) diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c old mode 100755 new mode 100644 index a3bbafa926..dd45335afb --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -718,11 +718,11 @@ static void ResetPokedexAreaMapBg(void) static void CreateAreaMarkerSprites(void) { u8 spriteId; - static s16 x; - static s16 y; - static s16 i; - static s16 mapSecId; - static s16 numSprites; + s16 x; + s16 y; + s16 i; + s16 mapSecId; + s16 numSprites; LoadSpriteSheet(&sAreaMarkerSpriteSheet); LoadSpritePalette(&sAreaMarkerSpritePalette); diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index dee91d5c3e..3c14080614 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -5182,12 +5182,12 @@ static void PrintStatsScreen_Moves_Top(u8 taskId) //Draw move type icon if (gTasks[taskId].data[5] == 0) { - SetTypeIconPosAndPal(gMovesInfo[move].type, moves_x + 146, moves_y + 17, 0); + SetTypeIconPosAndPal(GetMoveType(move), moves_x + 146, moves_y + 17, 0); SetSpriteInvisibility(1, TRUE); } else { - SetTypeIconPosAndPal(NUMBER_OF_MON_TYPES + gMovesInfo[move].contestCategory, moves_x + 146, moves_y + 17, 1); + SetTypeIconPosAndPal(NUMBER_OF_MON_TYPES + GetMoveContestCategory(move), moves_x + 146, moves_y + 17, 1); SetSpriteInvisibility(0, TRUE); } @@ -5243,12 +5243,12 @@ static void PrintStatsScreen_Moves_Description(u8 taskId) //Move description if (gTasks[taskId].data[5] == 0) { - StringCopy(gStringVar4, gMovesInfo[move].description); + StringCopy(gStringVar4, GetMoveDescription(move)); PrintStatsScreenTextSmall(WIN_STATS_MOVES_DESCRIPTION, gStringVar4, moves_x, moves_y); } else { - StringCopy(gStringVar4, gContestEffectDescriptionPointers[gMovesInfo[move].contestEffect]); + StringCopy(gStringVar4, gContestEffectDescriptionPointers[GetMoveContestEffect(move)]); PrintStatsScreenTextSmall(WIN_STATS_MOVES_DESCRIPTION, gStringVar4, moves_x, moves_y); } } @@ -5287,26 +5287,28 @@ static void PrintStatsScreen_Moves_Bottom(u8 taskId) if (gTasks[taskId].data[5] == 0) { //Power - if (gMovesInfo[move].power < 2) + u32 power = GetMovePower(move); + if (power < 2) StringCopy(gStringVar1, gText_ThreeDashes); else - ConvertIntToDecimalStringN(gStringVar1, gMovesInfo[move].power, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, power, STR_CONV_MODE_RIGHT_ALIGN, 3); PrintStatsScreenTextSmall(WIN_STATS_MOVES_BOTTOM, gStringVar1, moves_x + 45, moves_y); //Physical/Special/Status Category DestroyCategoryIcon(); ShowCategoryIcon(GetBattleMoveCategory(move)); //Accuracy - if (gMovesInfo[move].accuracy == 0) + u32 accuracy = GetMoveAccuracy(move); + if (accuracy == 0) StringCopy(gStringVar1, gText_ThreeDashes); else - ConvertIntToDecimalStringN(gStringVar1, gMovesInfo[move].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); PrintStatsScreenTextSmall(WIN_STATS_MOVES_BOTTOM, gStringVar1, moves_x + 114, moves_y); } else //Appeal + Jam { DestroyCategoryIcon(); //Appeal - contest_effectValue = gContestEffects[gMovesInfo[move].contestEffect].appeal; + contest_effectValue = gContestEffects[GetMoveContestEffect(move)].appeal; if (contest_effectValue != 0xFF) contest_appeal = contest_effectValue / 10; ConvertIntToDecimalStringN(gStringVar1, contest_appeal, STR_CONV_MODE_RIGHT_ALIGN, 1); @@ -5315,7 +5317,7 @@ static void PrintStatsScreen_Moves_Bottom(u8 taskId) PrintStatsScreenTextSmall(WIN_STATS_MOVES_BOTTOM, gStringVar2, moves_x + 45, moves_y); //Jam - contest_effectValue = gContestEffects[gMovesInfo[move].contestEffect].jam; + contest_effectValue = gContestEffects[GetMoveContestEffect(move)].jam; if (contest_effectValue != 0xFF) contest_jam = contest_effectValue / 10; ConvertIntToDecimalStringN(gStringVar1, contest_jam, STR_CONV_MODE_RIGHT_ALIGN, 1); diff --git a/src/pokemon.c b/src/pokemon.c index 6066a5c149..6bec95c307 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -12,6 +12,7 @@ #include "battle_tower.h" #include "battle_z_move.h" #include "data.h" +#include "dexnav.h" #include "event_data.h" #include "event_object_movement.h" #include "evolution_scene.h" @@ -48,6 +49,7 @@ #include "constants/battle_move_effects.h" #include "constants/battle_script_commands.h" #include "constants/battle_partner.h" +#include "constants/battle_string_ids.h" #include "constants/cries.h" #include "constants/event_objects.h" #include "constants/form_change_types.h" @@ -89,7 +91,6 @@ EWRAM_DATA static struct MonSpritesGfxManager *sMonSpritesGfxManagers[MON_SPR_GF EWRAM_DATA static u8 sTriedEvolving = 0; EWRAM_DATA u16 gFollowerSteps = 0; -#include "data/moves_info.h" #include "data/abilities.h" // Used in an unreferenced function in RS. @@ -380,7 +381,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_ATK, .backAnim = 0, .pokeBlockAnim = {ANIM_HARDY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlHardy, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(61, 7, 61, 7), //32% support >= 50% HP, 32% support < 50% HP .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -392,7 +393,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_DEF, .backAnim = 2, .pokeBlockAnim = {ANIM_LONELY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlLonely, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighAttackLow, .battlePalacePercents = PALACE_STYLE(20, 25, 84, 8), //55%, 8% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -404,7 +405,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPEED, .backAnim = 0, .pokeBlockAnim = {ANIM_BRAVE, AFFINE_TURN_UP}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlBrave, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighDefenseLow, .battlePalacePercents = PALACE_STYLE(70, 15, 32, 60), //15%, 8% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -416,7 +417,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPATK, .backAnim = 0, .pokeBlockAnim = {ANIM_ADAMANT, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAdamant, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(38, 31, 70, 15), //31%, 15% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -428,7 +429,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPDEF, .backAnim = 0, .pokeBlockAnim = {ANIM_NAUGHTY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlNaughty, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighAttackLow, .battlePalacePercents = PALACE_STYLE(20, 70, 70, 22), //10%, 8% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -440,7 +441,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_ATK, .backAnim = 1, .pokeBlockAnim = {ANIM_BOLD, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlBold, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighDefenseLow, .battlePalacePercents = PALACE_STYLE(30, 20, 32, 58), //50%, 10% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -452,7 +453,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_DEF, .backAnim = 1, .pokeBlockAnim = {ANIM_DOCILE, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(56, 22, 56, 22), //22%, 22% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_RANDOM, @@ -464,7 +465,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPEED, .backAnim = 1, .pokeBlockAnim = {ANIM_RELAXED, AFFINE_TURN_UP_AND_DOWN}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlRelaxed, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighAttackLow, .battlePalacePercents = PALACE_STYLE(25, 15, 75, 15), //60%, 10% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -476,7 +477,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPATK, .backAnim = 0, .pokeBlockAnim = {ANIM_IMPISH, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlImpish, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighDefenseLow, .battlePalacePercents = PALACE_STYLE(69, 6, 28, 55), //25%, 17% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -488,7 +489,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPDEF, .backAnim = 1, .pokeBlockAnim = {ANIM_LAX, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlLax, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow, .battlePalacePercents = PALACE_STYLE(35, 10, 29, 6), //55%, 65% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -500,7 +501,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_ATK, .backAnim = 2, .pokeBlockAnim = {ANIM_TIMID, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlTimid, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighSupportLow, .battlePalacePercents = PALACE_STYLE(62, 10, 30, 20), //28%, 50% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -512,7 +513,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_DEF, .backAnim = 0, .pokeBlockAnim = {ANIM_HASTY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlHasty, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(58, 37, 88, 6), //5%, 6% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -524,7 +525,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPEED, .backAnim = 1, .pokeBlockAnim = {ANIM_SERIOUS, AFFINE_TURN_DOWN}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSerious, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow, .battlePalacePercents = PALACE_STYLE(34, 11, 29, 11), //55%, 60% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -536,7 +537,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPATK, .backAnim = 0, .pokeBlockAnim = {ANIM_JOLLY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlJolly, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighDefenseLow, .battlePalacePercents = PALACE_STYLE(35, 5, 35, 60), //60%, 5% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -548,7 +549,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPDEF, .backAnim = 0, .pokeBlockAnim = {ANIM_NAIVE, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(56, 22, 56, 22), //22%, 22% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_RANDOM, @@ -560,7 +561,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_ATK, .backAnim = 2, .pokeBlockAnim = {ANIM_MODEST, AFFINE_TURN_DOWN_SLOW}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlModest, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow, .battlePalacePercents = PALACE_STYLE(35, 45, 34, 60), //20%, 6% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -572,7 +573,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_DEF, .backAnim = 2, .pokeBlockAnim = {ANIM_MILD, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlMild, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighSupportLow, .battlePalacePercents = PALACE_STYLE(44, 50, 34, 6), //6%, 60% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -584,7 +585,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPEED, .backAnim = 2, .pokeBlockAnim = {ANIM_QUIET, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(56, 22, 56, 22), //22%, 22% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -596,7 +597,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPATK, .backAnim = 2, .pokeBlockAnim = {ANIM_BASHFUL, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlBashful, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow, .battlePalacePercents = PALACE_STYLE(30, 58, 30, 58), //12%, 12% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -608,7 +609,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPDEF, .backAnim = 1, .pokeBlockAnim = {ANIM_RASH, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlRash, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow, .battlePalacePercents = PALACE_STYLE(30, 13, 27, 6), //57%, 67% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -620,7 +621,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_ATK, .backAnim = 1, .pokeBlockAnim = {ANIM_CALM, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlCalm, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow, .battlePalacePercents = PALACE_STYLE(40, 50, 25, 62), //10%, 13% .battlePalaceFlavorText = B_MSG_GETTING_IN_POS, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -632,7 +633,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_DEF, .backAnim = 2, .pokeBlockAnim = {ANIM_GENTLE, AFFINE_TURN_DOWN_SLIGHT}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlGentle, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighAttackLow, .battlePalacePercents = PALACE_STYLE(18, 70, 90, 5), //12%, 5% .battlePalaceFlavorText = B_MSG_GLINT_IN_EYE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -644,7 +645,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPEED, .backAnim = 1, .pokeBlockAnim = {ANIM_SASSY, AFFINE_TURN_UP_HIGH}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlSassy, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighSupportLow, .battlePalacePercents = PALACE_STYLE(88, 6, 22, 20), //6%, 58% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -656,7 +657,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPATK, .backAnim = 2, .pokeBlockAnim = {ANIM_CAREFUL, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlCareful, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDefenseHighSupportLow, .battlePalacePercents = PALACE_STYLE(42, 50, 42, 5), //8%, 53% .battlePalaceFlavorText = B_MSG_GROWL_DEEPLY, .battlePalaceSmokescreen = PALACE_TARGET_WEAKER, @@ -668,7 +669,7 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = .statDown = STAT_SPDEF, .backAnim = 1, .pokeBlockAnim = {ANIM_QUIRKY, AFFINE_NONE}, - .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky, + .natureGirlMessage = BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow, .battlePalacePercents = PALACE_STYLE(56, 22, 56, 22), //22%, 22% .battlePalaceFlavorText = B_MSG_EAGER_FOR_MORE, .battlePalaceSmokescreen = PALACE_TARGET_STRONGER, @@ -676,7 +677,6 @@ const struct NatureInfo gNaturesInfo[NUM_NATURES] = }; #include "data/graphics/pokemon.h" -#include "data/pokemon_graphics/front_pic_anims.h" #include "data/pokemon/trainer_class_lookups.h" #include "data/pokemon/experience_tables.h" @@ -1163,6 +1163,8 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, totalRerolls += 1; if (I_FISHING_CHAIN && gIsFishingEncounter) totalRerolls += CalculateChainFishingShinyRolls(); + if (gDexNavBattle) + totalRerolls += CalculateDexNavShinyRolls(); while (GET_SHINY_VALUE(value, personality) >= SHINY_ODDS && totalRerolls > 0) { @@ -1869,8 +1871,9 @@ u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL); if (existingMove == MOVE_NONE) { + u32 pp = GetMovePP(move); SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &move); - SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gMovesInfo[move].pp); + SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp); return move; } if (existingMove == move) @@ -1888,7 +1891,7 @@ u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) if (mon->moves[i] == MOVE_NONE) { mon->moves[i] = move; - mon->pp[i] = gMovesInfo[move].pp; + mon->pp[i] = GetMovePP(move); return move; } } @@ -1899,7 +1902,8 @@ u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot) { SetMonData(mon, MON_DATA_MOVE1 + slot, &move); - SetMonData(mon, MON_DATA_PP1 + slot, &gMovesInfo[move].pp); + u32 pp = GetMovePP(move); + SetMonData(mon, MON_DATA_PP1 + slot, &pp); } static void SetMonMoveSlot_KeepPP(struct Pokemon *mon, u16 move, u8 slot) @@ -1916,7 +1920,7 @@ static void SetMonMoveSlot_KeepPP(struct Pokemon *mon, u16 move, u8 slot) void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot) { mon->moves[slot] = move; - mon->pp[slot] = gMovesInfo[move].pp; + mon->pp[slot] = GetMovePP(move); } void GiveMonInitialMoveset(struct Pokemon *mon) @@ -1970,7 +1974,8 @@ void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) //Credit: AsparagusEdua for (i = 0; i < MAX_MON_MOVES; i++) { SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &moves[i]); - SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gMovesInfo[moves[i]].pp); + u32 pp = GetMovePP(moves[i]); + SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp); } } @@ -2023,7 +2028,7 @@ void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); ppBonuses >>= 2; moves[MAX_MON_MOVES - 1] = move; - pp[MAX_MON_MOVES - 1] = gMovesInfo[move].pp; + pp[MAX_MON_MOVES - 1] = GetMovePP(move); for (i = 0; i < MAX_MON_MOVES; i++) { @@ -2050,7 +2055,7 @@ void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) ppBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, NULL); ppBonuses >>= 2; moves[MAX_MON_MOVES - 1] = move; - pp[MAX_MON_MOVES - 1] = gMovesInfo[move].pp; + pp[MAX_MON_MOVES - 1] = GetMovePP(move); for (i = 0; i < MAX_MON_MOVES; i++) { @@ -2063,8 +2068,9 @@ void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) u8 CountAliveMonsInBattle(u8 caseId, u32 battler) { - s32 i; - u8 retVal = 0; + u32 i; + u32 battlerSide; + u32 retVal = 0; switch (caseId) { @@ -2075,10 +2081,18 @@ u8 CountAliveMonsInBattle(u8 caseId, u32 battler) retVal++; } break; - case BATTLE_ALIVE_SIDE: + case BATTLE_ALIVE_EXCEPT_BATTLER_SIDE: for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - if (GetBattlerSide(i) == GetBattlerSide(battler) && !(gAbsentBattlerFlags & (1u << i))) + if (i != battler && i != BATTLE_PARTNER(battler) && !(gAbsentBattlerFlags & (1u << i))) + retVal++; + } + break; + case BATTLE_ALIVE_SIDE: + battlerSide = GetBattlerSide(battler); + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (GetBattlerSide(i) == battlerSide && !(gAbsentBattlerFlags & (1u << i))) retVal++; } break; @@ -2208,7 +2222,7 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerPicId, u8 battlerPosition gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; else gMultiuseSpriteTemplate = gBattlerSpriteTemplates[battlerPosition]; - gMultiuseSpriteTemplate.anims = sAnims_Trainer; + gMultiuseSpriteTemplate.anims = gAnims_Trainer; } } @@ -2220,7 +2234,7 @@ void SetMultiuseSpriteTemplateToTrainerFront(u16 trainerPicId, u8 battlerPositio gMultiuseSpriteTemplate = gBattlerSpriteTemplates[battlerPosition]; gMultiuseSpriteTemplate.paletteTag = trainerPicId; - gMultiuseSpriteTemplate.anims = sAnims_Trainer; + gMultiuseSpriteTemplate.anims = gAnims_Trainer; } static void EncryptBoxMon(struct BoxPokemon *boxMon) @@ -3062,20 +3076,14 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) SET8(substruct3->metLocation); break; case MON_DATA_MET_LEVEL: - { - u8 metLevel = *data; - substruct3->metLevel = metLevel; + SET8(substruct3->metLevel); break; - } case MON_DATA_MET_GAME: SET8(substruct3->metGame); break; case MON_DATA_POKEBALL: - { - u8 pokeball = *data; - substruct0->pokeball = pokeball; + SET8(substruct0->pokeball); break; - } case MON_DATA_OT_GENDER: SET8(substruct3->otGender); break; @@ -3163,7 +3171,8 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; case MON_DATA_IVS: { - u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); + u32 ivs; + SET32(ivs); substruct3->hpIV = ivs & MAX_IV_MASK; substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK; substruct3->defenseIV = (ivs >> 10) & MAX_IV_MASK; @@ -3200,12 +3209,8 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) SET8(substruct3->gigantamaxFactor); break; case MON_DATA_TERA_TYPE: - { - u32 teraType; - SET8(teraType); - substruct0->teraType = teraType; + SET8(substruct0->teraType); break; - } case MON_DATA_EVOLUTION_TRACKER: { union EvolutionTracker evoTracker; @@ -3504,7 +3509,8 @@ void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord) for (j = 0; j < MAX_MON_MOVES; j++) { SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * MAX_MON_MOVES + j]); - SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gMovesInfo[gBattleResources->secretBase->party.moves[i * MAX_MON_MOVES + j]].pp); + u32 pp = GetMovePP(gBattleResources->secretBase->party.moves[i * MAX_MON_MOVES + j]); + SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &pp); } } } @@ -3629,7 +3635,7 @@ const struct FormChange *GetSpeciesFormChanges(u16 species) u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex) { - u8 basePP = gMovesInfo[move].pp; + u8 basePP = GetMovePP(move); return basePP + ((basePP * 20 * ((gPPUpGetMask[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100); } @@ -4007,12 +4013,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) { dataUnsigned += itemEffect[itemEffectParam]; - moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) - { - moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2); - } SetMonData(mon, MON_DATA_PP1 + temp2, &dataUnsigned); retVal = FALSE; } @@ -4028,12 +4030,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { dataUnsigned += itemEffect[itemEffectParam++]; - moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) - { - moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); - } SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); retVal = FALSE; } @@ -4200,7 +4198,24 @@ bool8 HealStatusConditions(struct Pokemon *mon, u32 healMask, u8 battlerId) status &= ~healMask; SetMonData(mon, MON_DATA_STATUS, &status); if (gMain.inBattle && battlerId != MAX_BATTLERS_COUNT) + { gBattleMons[battlerId].status1 &= ~healMask; + if((healMask & STATUS1_SLEEP)) + { + u32 i = 0; + u32 battlerSide = GetBattlerSide(battlerId); + struct Pokemon *party = GetSideParty(battlerSide); + + for (i = 0; i < PARTY_SIZE; i++) + { + if (&party[i] == mon) + { + TryDeactivateSleepClause(battlerSide, i); + break; + } + } + } + } return FALSE; } else @@ -4412,7 +4427,7 @@ u32 GetGMaxTargetSpecies(u32 species) { const struct FormChange *formChanges = GetSpeciesFormChanges(species); u32 i; - for (i = 0; formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) + for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) { if (formChanges[i].method == FORM_CHANGE_BATTLE_GIGANTAMAX) return formChanges[i].targetSpecies; @@ -4595,7 +4610,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 { for (j = 0; j < MAX_MON_MOVES; j++) { - if (gMovesInfo[GetMonData(mon, MON_DATA_MOVE1 + j, NULL)].type == evolutions[i].param) + if (GetMoveType(GetMonData(mon, MON_DATA_MOVE1 + j, NULL)) == evolutions[i].param) { targetSpecies = evolutions[i].targetSpecies; break; @@ -5113,12 +5128,15 @@ s32 GetBattlerMultiplayerId(u16 id) u8 GetTrainerEncounterMusicId(u16 trainerOpponentId) { + u32 sanitizedTrainerId = SanitizeTrainerId(trainerOpponentId); + enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + if (InBattlePyramid()) return GetTrainerEncounterMusicIdInBattlePyramid(trainerOpponentId); else if (InTrainerHillChallenge()) return GetTrainerEncounterMusicIdInTrainerHill(trainerOpponentId); else - return gTrainers[SanitizeTrainerId(trainerOpponentId)].encounterMusic_gender & (F_TRAINER_FEMALE - 1); + return gTrainers[difficulty][sanitizedTrainerId].encounterMusic_gender & (F_TRAINER_FEMALE - 1); } u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex) @@ -5166,7 +5184,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) { u8 friendshipLevel = 0; s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - u32 opponentTrainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + u32 opponentTrainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (friendship > 99) friendshipLevel++; @@ -5733,11 +5751,11 @@ u16 GetBattleBGM(void) u8 trainerClass; if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - trainerClass = GetFrontierOpponentClass(gTrainerBattleOpponent_A); + trainerClass = GetFrontierOpponentClass(TRAINER_BATTLE_PARAM.opponentA); else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) trainerClass = TRAINER_CLASS_EXPERT; else - trainerClass = GetTrainerClassFromId(gTrainerBattleOpponent_A); + trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); switch (trainerClass) { @@ -5756,7 +5774,7 @@ u16 GetBattleBGM(void) case TRAINER_CLASS_RIVAL: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) return MUS_VS_RIVAL; - if (!StringCompare(GetTrainerNameFromId(gTrainerBattleOpponent_A), gText_BattleWallyName)) + if (!StringCompare(GetTrainerNameFromId(TRAINER_BATTLE_PARAM.opponentA), gText_BattleWallyName)) return MUS_VS_TRAINER; return MUS_VS_RIVAL; case TRAINER_CLASS_ELITE_FOUR: @@ -6489,17 +6507,18 @@ u8 GetFormIdFromFormSpeciesId(u16 formSpeciesId) return targetFormId; } -u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg) +// Returns the current species if no form change is possible +u32 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg) { return GetFormChangeTargetSpeciesBoxMon(&mon->box, method, arg); } -// Returns SPECIES_NONE if no form change is possible -u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 arg) +// Returns the current species if no form change is possible +u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 arg) { u32 i; - u16 targetSpecies = SPECIES_NONE; - u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + u32 targetSpecies = species; const struct FormChange *formChanges = GetSpeciesFormChanges(species); u16 heldItem; u32 ability; @@ -6564,6 +6583,7 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 targetSpecies = formChanges[i].targetSpecies; break; case FORM_CHANGE_WITHDRAW: + case FORM_CHANGE_DEPOSIT: case FORM_CHANGE_FAINT: case FORM_CHANGE_DAYS_PASSED: targetSpecies = formChanges[i].targetSpecies; @@ -6599,7 +6619,7 @@ void TrySetDayLimitToFormChange(struct Pokemon *mon) u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); const struct FormChange *formChanges = GetSpeciesFormChanges(species); - for (i = 0; formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) + for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) { if (formChanges[i].method == FORM_CHANGE_DAYS_PASSED && species != formChanges[i].targetSpecies) { @@ -6614,13 +6634,10 @@ bool32 DoesSpeciesHaveFormChangeMethod(u16 species, u16 method) u32 i; const struct FormChange *formChanges = GetSpeciesFormChanges(species); - if (formChanges != NULL) + for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) { - for (i = 0; formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) - { - if (method == formChanges[i].method && species != formChanges[i].targetSpecies) - return TRUE; - } + if (method == formChanges[i].method && species != formChanges[i].targetSpecies) + return TRUE; } return FALSE; @@ -6642,7 +6659,8 @@ u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove) } while(learnset[sLearningMoveTableID].move != LEVEL_UP_MOVE_END) { - while (learnset[sLearningMoveTableID].level == 0 || learnset[sLearningMoveTableID].level == level) + while ((learnset[sLearningMoveTableID].level == 0 || learnset[sLearningMoveTableID].level == level) + && !(P_EVOLUTION_LEVEL_1_LEARN >= GEN_8 && learnset[sLearningMoveTableID].level == 1)) { gMoveToLearn = learnset[sLearningMoveTableID].move; sLearningMoveTableID++; @@ -6721,18 +6739,18 @@ bool32 SpeciesHasGenderDifferences(u16 species) bool32 TryFormChange(u32 monId, u32 side, u16 method) { struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; - u16 targetSpecies; if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG, 0) == SPECIES_NONE || GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG, 0) == SPECIES_EGG) return FALSE; - targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0); + u32 currentSpecies = GetMonData(&party[monId], MON_DATA_SPECIES); + u32 targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0); - if (targetSpecies == SPECIES_NONE && gBattleStruct != NULL) + if (targetSpecies == currentSpecies && gBattleStruct != NULL && gBattleStruct->changedSpecies[side][monId] != SPECIES_NONE) targetSpecies = gBattleStruct->changedSpecies[side][monId]; - if (targetSpecies != SPECIES_NONE) + if (targetSpecies != currentSpecies) { TryToSetBattleFormChangeMoves(&party[monId], method); SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies); @@ -6915,30 +6933,16 @@ u16 GetSpeciesPreEvolution(u16 species) return SPECIES_NONE; } -const u8 *GetMoveName(u16 moveId) -{ - return gMovesInfo[moveId].name; -} - -const u8 *GetMoveAnimationScript(u16 moveId) -{ - if (gMovesInfo[moveId].battleAnimScript == NULL) - { - DebugPrintfLevel(MGBA_LOG_WARN, "No animation for moveId=%u", moveId); - return gMovesInfo[MOVE_NONE].battleAnimScript; - } - return gMovesInfo[moveId].battleAnimScript; -} - void UpdateDaysPassedSinceFormChange(u16 days) { u32 i; for (i = 0; i < PARTY_SIZE; i++) { struct Pokemon *mon = &gPlayerParty[i]; + u32 currentSpecies = GetMonData(mon, MON_DATA_SPECIES); u8 daysSinceFormChange; - if (!GetMonData(mon, MON_DATA_SPECIES, 0)) + if (currentSpecies == SPECIES_NONE) continue; daysSinceFormChange = GetMonData(mon, MON_DATA_DAYS_SINCE_FORM_CHANGE, 0); @@ -6954,9 +6958,9 @@ void UpdateDaysPassedSinceFormChange(u16 days) if (daysSinceFormChange == 0) { - u16 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_DAYS_PASSED, 0); + u32 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_DAYS_PASSED, 0); - if (targetSpecies != SPECIES_NONE) + if (targetSpecies != currentSpecies) { SetMonData(mon, MON_DATA_SPECIES, &targetSpecies); CalculateMonStats(mon); @@ -6970,7 +6974,7 @@ u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) u32 moveType = GetDynamicMoveType(mon, move, battler, NULL); if (moveType != TYPE_NONE) return moveType; - return gMovesInfo[move].type; + return GetMoveType(move); } uq4_12_t GetDynamaxLevelHPMultiplier(u32 dynamaxLevel, bool32 inverseMultiplier) @@ -7024,7 +7028,7 @@ u32 GetRegionalFormByRegion(u32 species, u32 region) { if (firstFoundSpecies == 0) firstFoundSpecies = formTable[formId]; - + if (IsSpeciesRegionalFormFromRegion(formTable[formId], region)) return formTable[formId]; } diff --git a/src/pokemon_sprite_visualizer.c b/src/pokemon_sprite_visualizer.c index f798b08b97..11588f673d 100644 --- a/src/pokemon_sprite_visualizer.c +++ b/src/pokemon_sprite_visualizer.c @@ -743,10 +743,11 @@ static void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bo { const u32 *lzPaletteData = GetMonSpritePalFromSpecies(species, isShiny, isFemale); u16 paletteOffset = OBJ_PLTT_ID(battlerId); + void *buffer = malloc_and_decompress(lzPaletteData, NULL); - LZDecompressWram(lzPaletteData, gDecompressionBuffer); - LoadPalette(gDecompressionBuffer, paletteOffset, PLTT_SIZE_4BPP); - LoadPalette(gDecompressionBuffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP); + LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP); + LoadPalette(buffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP); + Free(buffer); } static void SetConstSpriteValues(struct PokemonSpriteVisualizer *data) diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index e34c4d8e37..9714293931 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -371,35 +371,15 @@ struct StorageMenu int textId; }; -struct UnkUtilData -{ - const u8 *src; - u8 *dest; - u16 size; - u16 unk; - u16 height; - void (*func)(struct UnkUtilData *data); -}; - -struct UnkUtil -{ - struct UnkUtilData *data; - u8 numActive; - u8 max; -}; - struct ChooseBoxMenu { struct Sprite *menuSprite; struct Sprite *menuSideSprites[4]; - u32 unused1[3]; struct Sprite *arrowSprites[2]; - u8 unused2[0x214]; bool32 loadedPalette; u16 tileTag; u16 paletteTag; u8 curBox; - u8 unused3; u8 subpriority; }; @@ -420,12 +400,8 @@ struct PokemonStorageSystemData u8 screenChangeType; bool8 isReopening; u8 taskId; - struct UnkUtil unkUtil; - struct UnkUtilData unkUtilData[8]; u16 partyMenuTilemapBuffer[0x108]; - u16 partyMenuUnused1; // Never read u16 partyMenuY; - u8 partyMenuUnused2; // Unused u8 partyMenuMoveTimer; u8 showPartyMenuState; bool8 closeBoxFlashing; @@ -436,18 +412,8 @@ struct PokemonStorageSystemData s16 scrollSpeed; u16 scrollTimer; u8 wallpaperOffset; - u8 scrollUnused1; // Never read - u8 scrollToBoxIdUnused; // Never read - u16 scrollUnused2; // Never read - s16 scrollDirectionUnused; // Never read. - u16 scrollUnused3; // Never read - u16 scrollUnused4; // Never read - u16 scrollUnused5; // Never read - u16 scrollUnused6; // Never read - u8 filler1[22]; - u8 boxTitleTiles[1024]; + u8 ALIGNED(2) boxTitleTiles[1024]; u8 boxTitleCycleId; - u8 wallpaperLoadState; // Written to, but never read. u8 wallpaperLoadBoxId; s8 wallpaperLoadDir; u16 boxTitlePal[16]; @@ -457,8 +423,6 @@ struct PokemonStorageSystemData struct Sprite *nextBoxTitleSprites[2]; struct Sprite *arrowSprites[2]; u32 wallpaperPalBits; - u8 filler2[80]; // Unused - u16 unkUnused1; // Never read. s16 wallpaperSetId; s16 wallpaperId; u16 wallpaperTilemap[360]; @@ -486,12 +450,10 @@ struct PokemonStorageSystemData u8 iconScrollCurColumn; s8 iconScrollDirection; // Unnecessary duplicate of scrollDirection u8 iconScrollState; - u8 iconScrollToBoxId; // Unused duplicate of scrollToBoxId struct WindowTemplate menuWindow; struct StorageMenu menuItems[7]; u8 menuItemsCount; u8 menuWidth; - u8 menuUnusedField; // Never read. u16 menuWindowId; struct Sprite *cursorSprite; struct Sprite *cursorShadowSprite; @@ -559,7 +521,6 @@ struct PokemonStorageSystemData struct ItemIcon itemIcons[MAX_ITEM_ICONS]; u16 movingItemId; u16 itemInfoWindowOffset; - u8 unkUnused2; // Unused u16 displayMonPalOffset; u16 *displayMonTilePtr; struct Sprite *displayMonSprite; @@ -589,6 +550,7 @@ EWRAM_DATA static u8 sMovingMonOrigBoxId = 0; EWRAM_DATA static u8 sMovingMonOrigBoxPos = 0; EWRAM_DATA static bool8 sAutoActionOn = 0; EWRAM_DATA static bool8 sJustOpenedBag = 0; +EWRAM_DATA static bool8 sRefreshDisplayMonGfx = FALSE; // Main tasks static void Task_InitPokeStorage(u8); @@ -882,14 +844,8 @@ static void TilemapUtil_Update(u8); static void TilemapUtil_DrawPrev(u8); static void TilemapUtil_Draw(u8); -// Unknown utility -static void UnkUtil_Init(struct UnkUtil *, struct UnkUtilData *, u32); -static void UnkUtil_Run(void); -static void UnkUtil_CpuRun(struct UnkUtilData *); -static void UnkUtil_DmaRun(struct UnkUtilData *); - // Form changing -void SetMonFormPSS(struct BoxPokemon *boxMon); +void SetMonFormPSS(struct BoxPokemon *boxMon, u32 method); void UpdateSpeciesSpritePSS(struct BoxPokemon *boxmon); static const u8 gText_JustOnePkmn[] = _("There is just one POKéMON with you."); @@ -2002,7 +1958,6 @@ static void VBlankCB_PokeStorage(void) { LoadOam(); ProcessSpriteCopyRequests(); - UnkUtil_Run(); TransferPlttBuffer(); if (sStorage != NULL) { @@ -2079,7 +2034,6 @@ static void ResetForPokeStorage(void) FreeAllSpritePalettes(); ClearDma3Requests(); gReservedSpriteTileCount = 0x280; - UnkUtil_Init(&sStorage->unkUtil, sStorage->unkUtilData, ARRAY_COUNT(sStorage->unkUtilData)); gKeyRepeatStartDelay = 20; ClearScheduledBgCopiesToVram(); TilemapUtil_Init(TILEMAPID_COUNT); @@ -3820,12 +3774,14 @@ static void GiveChosenBagItem(void) { struct Pokemon *mon = &gPlayerParty[pos]; SetMonData(&gPlayerParty[pos], MON_DATA_HELD_ITEM, &itemId); - SetMonFormPSS(&mon->box); + SetMonFormPSS(&mon->box, FORM_CHANGE_ITEM_HOLD); + UpdateSpeciesSpritePSS(&mon->box); } else { SetCurrentBoxMonData(pos, MON_DATA_HELD_ITEM, &itemId); - SetMonFormPSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][pos]); + SetMonFormPSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][pos], FORM_CHANGE_ITEM_HOLD); + UpdateSpeciesSpritePSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][pos]); } RemoveBagItem(itemId, 1); @@ -4116,7 +4072,6 @@ static void InitSupplementalTilemaps(void) static void SetUpShowPartyMenu(void) { - sStorage->partyMenuUnused1 = 20; sStorage->partyMenuY = 2; sStorage->partyMenuMoveTimer = 0; CreatePartyMonsSprites(FALSE); @@ -4127,7 +4082,6 @@ static bool8 ShowPartyMenu(void) if (sStorage->partyMenuMoveTimer == 20) return FALSE; - sStorage->partyMenuUnused1--; sStorage->partyMenuY++; TilemapUtil_Move(TILEMAPID_PARTY_MENU, 3, 1); TilemapUtil_Update(TILEMAPID_PARTY_MENU); @@ -4146,7 +4100,6 @@ static bool8 ShowPartyMenu(void) static void SetUpHidePartyMenu(void) { - sStorage->partyMenuUnused1 = 0; sStorage->partyMenuY = 22; sStorage->partyMenuMoveTimer = 0; if (sStorage->boxOption == OPTION_MOVE_ITEMS) @@ -4157,7 +4110,6 @@ static bool8 HidePartyMenu(void) { if (sStorage->partyMenuMoveTimer != 20) { - sStorage->partyMenuUnused1++; sStorage->partyMenuY--; TilemapUtil_Move(TILEMAPID_PARTY_MENU, 3, -1); TilemapUtil_Update(TILEMAPID_PARTY_MENU); @@ -4465,7 +4417,6 @@ static void InitMonIconFields(void) sStorage->boxMonsSprites[i] = NULL; sStorage->movingMonSprite = NULL; - sStorage->unkUnused1 = 0; } static u8 GetMonIconPriorityByCursorPos(void) @@ -4686,7 +4637,6 @@ static u8 CreateBoxMonIconsInColumn(u8 column, u16 distance, s16 speed) static void InitBoxMonIconScroll(u8 boxId, s8 direction) { sStorage->iconScrollState = 0; - sStorage->iconScrollToBoxId = boxId; sStorage->iconScrollDirection = direction; sStorage->iconScrollDistance = 32; sStorage->iconScrollSpeed = -(6 * direction); @@ -5318,16 +5268,8 @@ static void SetUpScrollToBox(u8 boxId) s8 direction = DetermineBoxScrollDirection(boxId); sStorage->scrollSpeed = (direction > 0) ? 6 : -6; - sStorage->scrollUnused1 = (direction > 0) ? 1 : 2; sStorage->scrollTimer = 32; - sStorage->scrollToBoxIdUnused = boxId; - sStorage->scrollUnused2 = (direction <= 0) ? 5 : 0; - sStorage->scrollDirectionUnused = direction; - sStorage->scrollUnused3 = (direction > 0) ? 264 : 56; - sStorage->scrollUnused4 = (direction <= 0) ? 5 : 0; - sStorage->scrollUnused5 = 0; - sStorage->scrollUnused6 = 2; sStorage->scrollToBoxId = boxId; sStorage->scrollDirection = direction; sStorage->scrollState = 0; @@ -5437,7 +5379,6 @@ static void LoadWallpaperGfx(u8 boxId, s8 direction) void *iconGfx; u32 tilesSize, iconSize; - sStorage->wallpaperLoadState = 0; sStorage->wallpaperLoadBoxId = boxId; sStorage->wallpaperLoadDir = direction; if (sStorage->wallpaperLoadDir != 0) @@ -6408,11 +6349,14 @@ static void PlaceMon(void) case CURSOR_AREA_IN_PARTY: SetPlacedMonData(TOTAL_BOXES_COUNT, sCursorPosition); SetPlacedMonSprite(TOTAL_BOXES_COUNT, sCursorPosition); + struct Pokemon *mon = &gPlayerParty[sCursorPosition]; + UpdateSpeciesSpritePSS(&mon->box); break; case CURSOR_AREA_IN_BOX: boxId = StorageGetCurrentBox(); SetPlacedMonData(boxId, sCursorPosition); SetPlacedMonSprite(boxId, sCursorPosition); + UpdateSpeciesSpritePSS(&gPokemonStoragePtr->boxes[boxId][sCursorPosition]); break; default: return; @@ -6452,12 +6396,15 @@ static void SetPlacedMonData(u8 boxId, u8 position) if (boxId == TOTAL_BOXES_COUNT) { gPlayerParty[position] = sStorage->movingMon; - if (&gPlayerParty[position] == GetFirstLiveMon()) + struct Pokemon *mon = &gPlayerParty[position]; + if (mon == GetFirstLiveMon()) gFollowerSteps = 0; + SetMonFormPSS(&mon->box, FORM_CHANGE_WITHDRAW); } else { SetBoxMonAt(boxId, position, &sStorage->movingMon.box); + SetMonFormPSS(&gPokemonStoragePtr->boxes[boxId][position], FORM_CHANGE_DEPOSIT); } } @@ -6962,13 +6909,13 @@ static void ReshowDisplayMon(void) TryRefreshDisplayMon(); } -void SetMonFormPSS(struct BoxPokemon *boxMon) +void SetMonFormPSS(struct BoxPokemon *boxMon, u32 method) { - u16 targetSpecies = GetFormChangeTargetSpeciesBoxMon(boxMon, FORM_CHANGE_ITEM_HOLD, 0); - if (targetSpecies != SPECIES_NONE) + u16 targetSpecies = GetFormChangeTargetSpeciesBoxMon(boxMon, method, 0); + if (targetSpecies != GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL)) { SetBoxMonData(boxMon, MON_DATA_SPECIES, &targetSpecies); - UpdateSpeciesSpritePSS(boxMon); + sRefreshDisplayMonGfx = TRUE; } } @@ -8133,7 +8080,6 @@ static void AddMenu(void) PrintMenuTable(sStorage->menuWindowId, sStorage->menuItemsCount, (void *)sStorage->menuItems); InitMenuInUpperLeftCornerNormal(sStorage->menuWindowId, sStorage->menuItemsCount, 0); ScheduleBgCopyTilemapToVram(0); - sStorage->menuUnusedField = 0; } // Called after AddMenu to determine whether or not the handler callback should @@ -8948,14 +8894,16 @@ static void TakeItemFromMon(u8 cursorArea, u8 cursorPos) { SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &itemId); SetBoxMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND); - SetMonFormPSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos]); + SetMonFormPSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos], FORM_CHANGE_ITEM_HOLD); + UpdateSpeciesSpritePSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos]); } else { struct Pokemon *mon = &gPlayerParty[cursorPos]; SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &itemId); SetPartyMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND); - SetMonFormPSS(&mon->box); + SetMonFormPSS(&mon->box, FORM_CHANGE_ITEM_HOLD); + UpdateSpeciesSpritePSS(&mon->box); } sStorage->movingItemId = sStorage->displayMonItemId; @@ -8990,7 +8938,8 @@ static void SwapItemsWithMon(u8 cursorArea, u8 cursorPos) itemId = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM); SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sStorage->movingItemId); sStorage->movingItemId = itemId; - SetMonFormPSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos]); + SetMonFormPSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos], FORM_CHANGE_ITEM_HOLD); + UpdateSpeciesSpritePSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos]); } else { @@ -8998,7 +8947,8 @@ static void SwapItemsWithMon(u8 cursorArea, u8 cursorPos) itemId = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM); SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sStorage->movingItemId); sStorage->movingItemId = itemId; - SetMonFormPSS(&mon->box); + SetMonFormPSS(&mon->box, FORM_CHANGE_ITEM_HOLD); + UpdateSpeciesSpritePSS(&mon->box); } id = GetItemIconIdxByPosition(CURSOR_AREA_IN_HAND, 0); @@ -9020,14 +8970,16 @@ static void GiveItemToMon(u8 cursorArea, u8 cursorPos) { SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sStorage->movingItemId); SetBoxMonIconObjMode(cursorPos, ST_OAM_OBJ_NORMAL); - SetMonFormPSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos]); + SetMonFormPSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos], FORM_CHANGE_ITEM_HOLD); + UpdateSpeciesSpritePSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos]); } else { struct Pokemon *mon = &gPlayerParty[cursorPos]; SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sStorage->movingItemId); SetPartyMonIconObjMode(cursorPos, ST_OAM_OBJ_NORMAL); - SetMonFormPSS(&mon->box); + SetMonFormPSS(&mon->box, FORM_CHANGE_ITEM_HOLD); + UpdateSpeciesSpritePSS(&mon->box); } } @@ -9047,14 +8999,16 @@ static void MoveItemFromMonToBag(u8 cursorArea, u8 cursorPos) { SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &itemId); SetBoxMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND); - SetMonFormPSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos]); + SetMonFormPSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos], FORM_CHANGE_ITEM_HOLD); + UpdateSpeciesSpritePSS(&gPokemonStoragePtr->boxes[StorageGetCurrentBox()][cursorPos]); } else { struct Pokemon *mon = &gPlayerParty[cursorPos]; SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &itemId); SetPartyMonIconObjMode(cursorPos, ST_OAM_OBJ_BLEND); - SetMonFormPSS(&mon->box); + SetMonFormPSS(&mon->box, FORM_CHANGE_ITEM_HOLD); + UpdateSpeciesSpritePSS(&mon->box); } } @@ -10103,88 +10057,6 @@ static void TilemapUtil_Draw(u8 id) // so UnkUtil_Run performs no actions. //------------------------------------------------------------------------------ - -EWRAM_DATA static struct UnkUtil *sUnkUtil = NULL; - -static void UnkUtil_Init(struct UnkUtil *util, struct UnkUtilData *data, u32 max) -{ - sUnkUtil = util; - util->data = data; - util->max = max; - util->numActive = 0; -} - -static void UnkUtil_Run(void) -{ - u16 i; - if (sUnkUtil->numActive) - { - for (i = 0; i < sUnkUtil->numActive; i++) - { - struct UnkUtilData *data = &sUnkUtil->data[i]; - data->func(data); - } - sUnkUtil->numActive = 0; - } -} - -static bool8 UNUSED UnkUtil_CpuAdd(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height, u16 unkArg) -{ - struct UnkUtilData *data; - - if (sUnkUtil->numActive >= sUnkUtil->max) - return FALSE; - - data = &sUnkUtil->data[sUnkUtil->numActive++]; - data->size = width * 2; - data->dest = dest + 2 * (dTop * 32 + dLeft); - data->src = src + 2 * (sTop * unkArg + sLeft); - data->height = height; - data->unk = unkArg; - data->func = UnkUtil_CpuRun; - return TRUE; -} - -// Functionally unused -static void UnkUtil_CpuRun(struct UnkUtilData *data) -{ - u16 i; - - for (i = 0; i < data->height; i++) - { - CpuCopy16(data->src, data->dest, data->size); - data->dest += 64; - data->src += data->unk * 2; - } -} - -static bool8 UNUSED UnkUtil_DmaAdd(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height) -{ - struct UnkUtilData *data; - - if (sUnkUtil->numActive >= sUnkUtil->max) - return FALSE; - - data = &sUnkUtil->data[sUnkUtil->numActive++]; - data->size = width * 2; - data->dest = dest + (dTop * 32 + dLeft) * 2; - data->height = height; - data->func = UnkUtil_DmaRun; - return TRUE; -} - -// Functionally unused -static void UnkUtil_DmaRun(struct UnkUtilData *data) -{ - u16 i; - - for (i = 0; i < data->height; i++) - { - Dma3FillLarge16_(0, data->dest, data->size); - data->dest += 64; - } -} - void UpdateSpeciesSpritePSS(struct BoxPokemon *boxMon) { u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES); @@ -10196,8 +10068,12 @@ void UpdateSpeciesSpritePSS(struct BoxPokemon *boxMon) sStorage->displayMonPalette = GetMonSpritePalFromSpeciesAndPersonality(species, isShiny, pid); if (!sJustOpenedBag) { - LoadDisplayMonGfx(species, pid); - StartDisplayMonMosaicEffect(); + if (sRefreshDisplayMonGfx) + { + LoadDisplayMonGfx(species, pid); + StartDisplayMonMosaicEffect(); + sRefreshDisplayMonGfx = FALSE; + } // Recreate icon sprite if (sInPartyMenu) @@ -10207,9 +10083,10 @@ void UpdateSpeciesSpritePSS(struct BoxPokemon *boxMon) } else { - DestroyBoxMonIcon(sStorage->boxMonsSprites[sCursorPosition]); + DestroyBoxMonIconAtPosition(sCursorPosition); CreateBoxMonIconAtPos(sCursorPosition); - SetBoxMonIconObjMode(sCursorPosition, GetBoxMonData(boxMon, MON_DATA_HELD_ITEM) == ITEM_NONE); + if (sStorage->boxOption == OPTION_MOVE_ITEMS) + SetBoxMonIconObjMode(sCursorPosition, (GetBoxMonData(boxMon, MON_DATA_HELD_ITEM) == ITEM_NONE ? ST_OAM_OBJ_NORMAL : ST_OAM_OBJ_BLEND)); } } sJustOpenedBag = FALSE; diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 4cfc17c707..3636d2f0ae 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -59,9 +59,9 @@ #define PSS_LABEL_WINDOW_CONTEST_MOVES_TITLE 3 // Button control text (upper right) -#define PSS_LABEL_WINDOW_PROMPT_CANCEL 4 // Also handles the "rename" prompt if P_SUMMARY_SCREEN_RENAME is true -#define PSS_LABEL_WINDOW_PROMPT_INFO 5 -#define PSS_LABEL_WINDOW_PROMPT_SWITCH 6 +#define PSS_LABEL_WINDOW_PROMPT_UTILITY 4 // Handles "Switch", "Info", and "Cancel" prompts. Also handles the "Rename" and "IVs"/"EVs"/"STATS" prompts if P_SUMMARY_SCREEN_RENAME and P_SUMMARY_SCREEN_IV_EV_INFO are true, respectively +#define PSS_LABEL_WINDOW_PROMPT_INFO 5 // unused +#define PSS_LABEL_WINDOW_PROMPT_SWITCH 6 // unused #define PSS_LABEL_WINDOW_UNUSED1 7 // Info screen @@ -169,6 +169,7 @@ static EWRAM_DATA struct PokemonSummaryScreenData } summary; u16 bgTilemapBuffers[PSS_PAGE_COUNT][2][0x400]; u8 mode; + u8 skillsPageMode; bool8 isBoxMon; u8 curMonIndex; u8 maxMonIndex; @@ -317,9 +318,22 @@ static void KeepMoveSelectorVisible(u8); static void SummaryScreen_DestroyAnimDelayTask(void); static bool32 ShouldShowMoveRelearner(void); static bool32 ShouldShowRename(void); -static void ShowCancelOrRenamePrompt(void); +static bool32 ShouldShowIvEvPrompt(void); +static void BufferLeftColumnIvEvStats(void); static void CB2_ReturnToSummaryScreenFromNamingScreen(void); static void CB2_PssChangePokemonNickname(void); +static void ShowUtilityPrompt(s16 mode); +static void ShowMonSkillsInfo(u8 taskId, s16 mode); +static void WriteToStatsTilemapBuffer(u32 length, u32 block, u32 statsCoordX, u32 statsCoordY); +void ExtractMonSkillStatsData(struct Pokemon *mon, struct PokeSummary *sum); +void ExtractMonSkillIvData(struct Pokemon *mon, struct PokeSummary *sum); +void ExtractMonSkillEvData(struct Pokemon *mon, struct PokeSummary *sum); +static void PrintTextOnWindow(u8 windowId, const u8 *string, u8 x, u8 y, u8 lineSpacing, u8 colorId); +static void PrintTextOnWindowWithFont(u8 windowId, const u8 *string, u8 x, u8 y, u8 lineSpacing, u8 colorId, u32 fontId); +static const u8 *GetLetterGrade(u32 stat); +static u8 AddWindowFromTemplateList(const struct WindowTemplate *template, u8 templateId); +static u8 IncrementSkillsStatsMode(u8 mode); +static void ClearStatLabel(u32 length, u32 statsCoordX, u32 statsCoordY); static const struct BgTemplate sBgTemplates[] = { @@ -427,7 +441,7 @@ static const struct WindowTemplate sSummaryTemplate[] = .paletteNum = 6, .baseBlock = 67, }, - [PSS_LABEL_WINDOW_PROMPT_CANCEL] = { + [PSS_LABEL_WINDOW_PROMPT_UTILITY] = { .bg = 0, .tilemapLeft = 22, .tilemapTop = 0, @@ -731,6 +745,7 @@ static void (*const sTextPrinterTasks[])(u8 taskId) = static const u8 sMemoNatureTextColor[] = _("{COLOR LIGHT_RED}{SHADOW GREEN}"); static const u8 sMemoMiscTextColor[] = _("{COLOR WHITE}{SHADOW DARK_GRAY}"); // This is also affected by palettes, apparently static const u8 sStatsLeftColumnLayout[] = _("{DYNAMIC 0}/{DYNAMIC 1}\n{DYNAMIC 2}\n{DYNAMIC 3}"); +static const u8 sStatsLeftIVEVColumnLayout[] = _("{DYNAMIC 0}\n{DYNAMIC 1}\n{DYNAMIC 2}"); static const u8 sStatsRightColumnLayout[] = _("{DYNAMIC 0}\n{DYNAMIC 1}\n{DYNAMIC 2}"); static const u8 sMovesPPLayout[] = _("{PP}{DYNAMIC 0}/{DYNAMIC 1}"); @@ -1504,30 +1519,7 @@ static bool8 ExtractMonDataToSummaryStruct(struct Pokemon *mon) sum->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); break; case 2: - if (sMonSummaryScreen->monList.mons == gPlayerParty || sMonSummaryScreen->mode == SUMMARY_MODE_BOX || sMonSummaryScreen->handleDeoxys == TRUE) - { - sum->nature = GetNature(mon); - sum->mintNature = GetMonData(mon, MON_DATA_HIDDEN_NATURE); - sum->currentHP = GetMonData(mon, MON_DATA_HP); - sum->maxHP = GetMonData(mon, MON_DATA_MAX_HP); - sum->atk = GetMonData(mon, MON_DATA_ATK); - sum->def = GetMonData(mon, MON_DATA_DEF); - sum->spatk = GetMonData(mon, MON_DATA_SPATK); - sum->spdef = GetMonData(mon, MON_DATA_SPDEF); - sum->speed = GetMonData(mon, MON_DATA_SPEED); - } - else - { - sum->nature = GetNature(mon); - sum->mintNature = GetMonData(mon, MON_DATA_HIDDEN_NATURE); - sum->currentHP = GetMonData(mon, MON_DATA_HP); - sum->maxHP = GetMonData(mon, MON_DATA_MAX_HP); - sum->atk = GetMonData(mon, MON_DATA_ATK2); - sum->def = GetMonData(mon, MON_DATA_DEF2); - sum->spatk = GetMonData(mon, MON_DATA_SPATK2); - sum->spdef = GetMonData(mon, MON_DATA_SPDEF2); - sum->speed = GetMonData(mon, MON_DATA_SPEED2); - } + ExtractMonSkillStatsData(mon, sum); break; case 3: GetMonData(mon, MON_DATA_OT_NAME, sum->OTName); @@ -1640,6 +1632,58 @@ static void CloseSummaryScreen(u8 taskId) } } +// Update skills page tilemap +static void ChangeStatLabel(s16 mode) +{ + if (!P_SUMMARY_SCREEN_IV_EV_TILESET) + return; + + u32 statsBlock = 169; + u32 ivsBlock = 221; + u32 evsBlock = 218; + + u32 statsCoordX = 44; + u32 statsCoordY = 102; + + u32 statsLength = 3; + u32 ivEvLength = 2; + + ClearStatLabel(statsLength, statsCoordX, statsCoordY); + + switch (mode) + { + case SUMMARY_SKILLS_MODE_STATS: + WriteToStatsTilemapBuffer(statsLength, statsBlock, statsCoordX, statsCoordY); + break; + case SUMMARY_SKILLS_MODE_IVS: + WriteToStatsTilemapBuffer(ivEvLength, ivsBlock, statsCoordX, statsCoordY); + break; + case SUMMARY_SKILLS_MODE_EVS: + WriteToStatsTilemapBuffer(ivEvLength, evsBlock, statsCoordX, statsCoordY); + break; + } + CopyBgTilemapBufferToVram(1); +} + +static void WriteToStatsTilemapBuffer(u32 length, u32 block, u32 statsCoordX, u32 statsCoordY) +{ + u32 i; + + for (i = 0; i <= length; i++) + FillBgTilemapBufferRect(1, block + i, statsCoordX + i, statsCoordY, 1, 1, 2); +} + +static void ClearStatLabel(u32 length, u32 statsCoordX, u32 statsCoordY) +{ + u32 blankStatsBlock = 1241; + + u32 i; + u32 blankOffset = 3; + + for (i = 0; i <= length; i++) + FillBgTilemapBufferRect(1, blankStatsBlock, statsCoordX + blankOffset + i, statsCoordY, 1, 1, 2); +} + static void Task_HandleInput(u8 taskId) { if (MenuHelpers_ShouldWaitForLinkRecv() != TRUE && !gPaletteFade.active) @@ -1676,12 +1720,21 @@ static void Task_HandleInput(u8 taskId) PlaySE(SE_SELECT); BeginCloseSummaryScreen(taskId); } - else // Contest or Battle Moves + else if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES + || sMonSummaryScreen->currPageIndex == PSS_PAGE_CONTEST_MOVES) { PlaySE(SE_SELECT); SwitchToMoveSelection(taskId); } } + if (sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS) + { + if (ShouldShowIvEvPrompt()) + { + ShowMonSkillsInfo(taskId, IncrementSkillsStatsMode(sMonSummaryScreen->skillsPageMode)); + PlaySE(SE_SELECT); + } + } } else if (JOY_NEW(B_BUTTON)) { @@ -1710,6 +1763,125 @@ static void Task_HandleInput(u8 taskId) } } +static u8 IncrementSkillsStatsMode(u8 mode) +{ + switch (mode) + { + case SUMMARY_SKILLS_MODE_STATS: + if (P_SUMMARY_SCREEN_EV_ONLY) + { + sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_EVS; + return SUMMARY_SKILLS_MODE_EVS; + } + else + { + sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_IVS; + return SUMMARY_SKILLS_MODE_IVS; + } + + case SUMMARY_SKILLS_MODE_IVS: + if (P_SUMMARY_SCREEN_IV_ONLY) + { + sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_STATS; + return SUMMARY_SKILLS_MODE_STATS; + } + else + { + sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_EVS; + return SUMMARY_SKILLS_MODE_EVS; + } + case SUMMARY_SKILLS_MODE_EVS: + default: + sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_STATS; + return SUMMARY_SKILLS_MODE_STATS; + } + +} + +static void ShowMonSkillsInfo(u8 taskId, s16 mode) +{ + struct PokeSummary *sum = &sMonSummaryScreen->summary; + struct Pokemon *mon = &sMonSummaryScreen->currentMon; + + FillWindowPixelBuffer(sMonSummaryScreen->windowIds[PSS_DATA_WINDOW_SKILLS_STATS_LEFT], 0); + FillWindowPixelBuffer(sMonSummaryScreen->windowIds[PSS_DATA_WINDOW_SKILLS_STATS_RIGHT], 0); + + if (sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS) + { + ChangeStatLabel(mode); + ShowUtilityPrompt(mode); + } + + if (mode == SUMMARY_SKILLS_MODE_STATS) + { + ExtractMonSkillStatsData(mon, sum); + BufferLeftColumnStats(); + } + else if (mode == SUMMARY_SKILLS_MODE_IVS) + { + ExtractMonSkillIvData(mon, sum); + BufferLeftColumnIvEvStats(); + } + else if (mode == SUMMARY_SKILLS_MODE_EVS) + { + ExtractMonSkillEvData(mon, sum); + BufferLeftColumnIvEvStats(); + } + + PrintLeftColumnStats(); + BufferRightColumnStats(); + PrintRightColumnStats(); + gTasks[taskId].func = Task_HandleInput; +} + +void ExtractMonSkillStatsData(struct Pokemon *mon, struct PokeSummary *sum) +{ + if (sMonSummaryScreen->monList.mons == gPlayerParty || sMonSummaryScreen->mode == SUMMARY_MODE_BOX || sMonSummaryScreen->handleDeoxys == TRUE) + { + sum->nature = GetNature(mon); + sum->mintNature = GetMonData(mon, MON_DATA_HIDDEN_NATURE); + sum->currentHP = GetMonData(mon, MON_DATA_HP); + sum->maxHP = GetMonData(mon, MON_DATA_MAX_HP); + sum->atk = GetMonData(mon, MON_DATA_ATK); + sum->def = GetMonData(mon, MON_DATA_DEF); + sum->spatk = GetMonData(mon, MON_DATA_SPATK); + sum->spdef = GetMonData(mon, MON_DATA_SPDEF); + sum->speed = GetMonData(mon, MON_DATA_SPEED); + } + else + { + sum->nature = GetNature(mon); + sum->mintNature = GetMonData(mon, MON_DATA_HIDDEN_NATURE); + sum->currentHP = GetMonData(mon, MON_DATA_HP); + sum->maxHP = GetMonData(mon, MON_DATA_MAX_HP); + sum->atk = GetMonData(mon, MON_DATA_ATK2); + sum->def = GetMonData(mon, MON_DATA_DEF2); + sum->spatk = GetMonData(mon, MON_DATA_SPATK2); + sum->spdef = GetMonData(mon, MON_DATA_SPDEF2); + sum->speed = GetMonData(mon, MON_DATA_SPEED2); + } +} + +void ExtractMonSkillIvData(struct Pokemon *mon, struct PokeSummary *sum) +{ + sum->currentHP = GetMonData(mon, MON_DATA_HP_IV); + sum->atk = GetMonData(mon, MON_DATA_ATK_IV); + sum->def = GetMonData(mon, MON_DATA_DEF_IV); + sum->spatk = GetMonData(mon, MON_DATA_SPATK_IV); + sum->spdef = GetMonData(mon, MON_DATA_SPDEF_IV); + sum->speed = GetMonData(mon, MON_DATA_SPEED_IV); +} + +void ExtractMonSkillEvData(struct Pokemon *mon, struct PokeSummary *sum) +{ + sum->currentHP = GetMonData(mon, MON_DATA_HP_EV); + sum->atk = GetMonData(mon, MON_DATA_ATK_EV); + sum->def = GetMonData(mon, MON_DATA_DEF_EV); + sum->spatk = GetMonData(mon, MON_DATA_SPATK_EV); + sum->spdef = GetMonData(mon, MON_DATA_SPDEF_EV); + sum->speed = GetMonData(mon, MON_DATA_SPEED_EV); +} + static void ChangeSummaryPokemon(u8 taskId, s8 delta) { s8 monId; @@ -1781,6 +1953,13 @@ static void Task_ChangeSummaryMon(u8 taskId) sMonSummaryScreen->switchCounter = 0; break; case 4: + if (P_SUMMARY_SCREEN_RENAME && sMonSummaryScreen->currPageIndex == PSS_PAGE_INFO) + ShowUtilityPrompt(SUMMARY_MODE_NORMAL); + if (ShouldShowIvEvPrompt() && sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS) + { + sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_STATS; + ChangeStatLabel(SUMMARY_SKILLS_MODE_STATS); + } if (ExtractMonDataToSummaryStruct(&sMonSummaryScreen->currentMon) == FALSE) { return; @@ -1826,12 +2005,6 @@ static void Task_ChangeSummaryMon(u8 taskId) case 11: PrintPageSpecificText(sMonSummaryScreen->currPageIndex); LimitEggSummaryPageDisplay(); - if (P_SUMMARY_SCREEN_RENAME && sMonSummaryScreen->currPageIndex == PSS_PAGE_INFO) - { - FillWindowPixelBuffer(PSS_LABEL_WINDOW_PROMPT_CANCEL, PIXEL_FILL(0)); - ShowCancelOrRenamePrompt(); - PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_CANCEL); - } break; case 12: gSprites[sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_MON]].data[2] = 0; @@ -1934,6 +2107,24 @@ static void ChangePage(u8 taskId, s8 delta) SetTaskFuncWithFollowupFunc(taskId, PssScrollLeft, gTasks[taskId].func); CreateTextPrinterTask(sMonSummaryScreen->currPageIndex); HidePageSpecificSprites(); + + if (sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS + || (sMonSummaryScreen->currPageIndex + delta) == PSS_PAGE_SKILLS) + { + struct Pokemon *mon = &sMonSummaryScreen->currentMon; + + if (sMonSummaryScreen->skillsPageMode != SUMMARY_SKILLS_MODE_STATS) + sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_STATS; + + ShowUtilityPrompt(sMonSummaryScreen->skillsPageMode); + ExtractMonSkillStatsData(mon, summary); + BufferLeftColumnStats(); + BufferRightColumnStats(); + } + else + { + ShowUtilityPrompt(SUMMARY_MODE_NORMAL); + } } static void PssScrollRight(u8 taskId) // Scroll right @@ -1982,6 +2173,9 @@ static void PssScrollRightEnd(u8 taskId) // display right static void PssScrollLeft(u8 taskId) // Scroll left { s16 *data = gTasks[taskId].data; + // to fix a specific lag in writing to the stat label + if (sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS) + ChangeStatLabel(SUMMARY_SKILLS_MODE_STATS); if (data[0] == 0) { if (sMonSummaryScreen->bgDisplayOrder == 0) @@ -2045,13 +2239,19 @@ static void SwitchToMoveSelection(u8 taskId) ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_SKILLS_STATUS); HandlePowerAccTilemap(9, -3); HandleAppealJamTilemap(9, -3, move); + if (!sMonSummaryScreen->lockMovesFlag) { - ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_INFO); if (ShouldShowMoveRelearner()) ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); - PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_SWITCH); + + ShowUtilityPrompt(SUMMARY_MODE_SELECT_MOVE); } + else + { + ShowUtilityPrompt(SUMMARY_MODE_NORMAL); + } + TilemapFiveMovesDisplay(sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_BATTLE_MOVES][0], 3, FALSE); TilemapFiveMovesDisplay(sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_CONTEST_MOVES][0], 1, FALSE); PrintMoveDetails(move); @@ -2083,14 +2283,16 @@ static void Task_HandleInput_MoveSelect(u8 taskId) else if (JOY_NEW(A_BUTTON)) { if (sMonSummaryScreen->lockMovesFlag == TRUE - || (sMonSummaryScreen->newMove == MOVE_NONE && sMonSummaryScreen->firstMoveIndex == MAX_MON_MOVES)) + || (sMonSummaryScreen->newMove == MOVE_NONE && sMonSummaryScreen->firstMoveIndex == MAX_MON_MOVES)) { PlaySE(SE_SELECT); + ShowUtilityPrompt(SUMMARY_MODE_NORMAL); CloseMoveSelectMode(taskId); } else if (HasMoreThanOneMove() == TRUE) { PlaySE(SE_SELECT); + ShowUtilityPrompt(SUMMARY_MODE_SELECT_MOVE); SwitchToMovePositionSwitchMode(taskId); } else @@ -2178,10 +2380,10 @@ static void ChangeSelectedMove(s16 *taskData, s8 direction, u8 *moveIndexPtr) static void CloseMoveSelectMode(u8 taskId) { DestroyMoveSelectorSprites(SPRITE_ARR_ID_MOVE_SELECTOR1); - ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_SWITCH); - PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_INFO); if (ShouldShowMoveRelearner()) PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); + + ShowUtilityPrompt(SUMMARY_MODE_NORMAL); PrintMoveDetails(0); TilemapFiveMovesDisplay(sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_BATTLE_MOVES][0], 3, TRUE); TilemapFiveMovesDisplay(sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_CONTEST_MOVES][0], 1, TRUE); @@ -2836,7 +3038,7 @@ static void DrawContestMoveHearts(u16 move) if (move != MOVE_NONE) { // Draw appeal hearts - u8 effectValue = gContestEffects[gMovesInfo[move].contestEffect].appeal; + u8 effectValue = gContestEffects[GetMoveContestEffect(move)].appeal; if (effectValue != 0xFF) effectValue /= 10; @@ -2849,7 +3051,7 @@ static void DrawContestMoveHearts(u16 move) } // Draw jam hearts - effectValue = gContestEffects[gMovesInfo[move].contestEffect].jam; + effectValue = gContestEffects[GetMoveContestEffect(move)].jam; if (effectValue != 0xFF) effectValue /= 10; @@ -2999,8 +3201,6 @@ static void PrintAOrBButtonIcon(u8 windowId, bool8 bButton, u32 x) static void PrintPageNamesAndStats(void) { - int stringXPos; - int iconXPos; int statsXPos; PrintTextOnWindow(PSS_LABEL_WINDOW_POKEMON_INFO_TITLE, gText_PkmnInfo, 2, 1, 0, 1); @@ -3008,21 +3208,7 @@ static void PrintPageNamesAndStats(void) PrintTextOnWindow(PSS_LABEL_WINDOW_BATTLE_MOVES_TITLE, gText_BattleMoves, 2, 1, 0, 1); PrintTextOnWindow(PSS_LABEL_WINDOW_CONTEST_MOVES_TITLE, gText_ContestMoves, 2, 1, 0, 1); - ShowCancelOrRenamePrompt(); - - stringXPos = GetStringRightAlignXOffset(FONT_NORMAL, gText_Info, 62); - iconXPos = stringXPos - 16; - if (iconXPos < 0) - iconXPos = 0; - PrintAOrBButtonIcon(PSS_LABEL_WINDOW_PROMPT_INFO, FALSE, iconXPos); - PrintTextOnWindow(PSS_LABEL_WINDOW_PROMPT_INFO, gText_Info, stringXPos, 1, 0, 0); - - stringXPos = GetStringRightAlignXOffset(FONT_NORMAL, gText_Switch, 62); - iconXPos = stringXPos - 16; - if (iconXPos < 0) - iconXPos = 0; - PrintAOrBButtonIcon(PSS_LABEL_WINDOW_PROMPT_SWITCH, FALSE, iconXPos); - PrintTextOnWindow(PSS_LABEL_WINDOW_PROMPT_SWITCH, gText_Switch, stringXPos, 1, 0, 0); + ShowUtilityPrompt(SUMMARY_MODE_NORMAL); PrintTextOnWindow(PSS_LABEL_WINDOW_POKEMON_INFO_RENTAL, gText_RentalPkmn, 0, 1, 0, 1); PrintTextOnWindow(PSS_LABEL_WINDOW_POKEMON_INFO_TYPE, gText_TypeSlash, 0, 1, 0, 0); @@ -3061,7 +3247,7 @@ static void PutPageWindowTilemaps(u8 page) { case PSS_PAGE_INFO: PutWindowTilemap(PSS_LABEL_WINDOW_POKEMON_INFO_TITLE); - PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_CANCEL); + PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_UTILITY); if (InBattleFactory() == TRUE || InSlateportBattleTent() == TRUE) PutWindowTilemap(PSS_LABEL_WINDOW_POKEMON_INFO_RENTAL); PutWindowTilemap(PSS_LABEL_WINDOW_POKEMON_INFO_TYPE); @@ -3071,9 +3257,12 @@ static void PutPageWindowTilemaps(u8 page) PutWindowTilemap(PSS_LABEL_WINDOW_POKEMON_SKILLS_STATS_LEFT); PutWindowTilemap(PSS_LABEL_WINDOW_POKEMON_SKILLS_STATS_RIGHT); PutWindowTilemap(PSS_LABEL_WINDOW_POKEMON_SKILLS_EXP); + if (ShouldShowIvEvPrompt()) + PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_UTILITY); break; case PSS_PAGE_BATTLE_MOVES: PutWindowTilemap(PSS_LABEL_WINDOW_BATTLE_MOVES_TITLE); + PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_UTILITY); if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES) @@ -3081,13 +3270,13 @@ static void PutPageWindowTilemaps(u8 page) } else { - PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_INFO); if (ShouldShowMoveRelearner()) PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); } break; case PSS_PAGE_CONTEST_MOVES: PutWindowTilemap(PSS_LABEL_WINDOW_CONTEST_MOVES_TITLE); + PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_UTILITY); if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES) @@ -3095,7 +3284,6 @@ static void PutPageWindowTilemaps(u8 page) } else { - PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_INFO); if (ShouldShowMoveRelearner()) PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); } @@ -3115,7 +3303,7 @@ static void ClearPageWindowTilemaps(u8 page) switch (page) { case PSS_PAGE_INFO: - ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_CANCEL); + ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_UTILITY); if (InBattleFactory() == TRUE || InSlateportBattleTent() == TRUE) ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_INFO_RENTAL); ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_INFO_TYPE); @@ -3124,6 +3312,8 @@ static void ClearPageWindowTilemaps(u8 page) ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_SKILLS_STATS_LEFT); ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_SKILLS_STATS_RIGHT); ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_SKILLS_EXP); + if (ShouldShowIvEvPrompt()) + ClearPageWindowTilemaps(PSS_LABEL_WINDOW_PROMPT_UTILITY); break; case PSS_PAGE_BATTLE_MOVES: if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) @@ -3136,7 +3326,6 @@ static void ClearPageWindowTilemaps(u8 page) } else { - ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_INFO); if (ShouldShowMoveRelearner()) ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); } @@ -3149,7 +3338,6 @@ static void ClearPageWindowTilemaps(u8 page) } else { - ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_INFO); if (ShouldShowMoveRelearner()) ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); } @@ -3477,6 +3665,8 @@ static void PrintSkillsPageText(void) { PrintHeldItemName(); PrintRibbonCount(); + if(ShouldShowIvEvPrompt()) + ShowUtilityPrompt(SUMMARY_SKILLS_MODE_STATS); BufferLeftColumnStats(); PrintLeftColumnStats(); BufferRightColumnStats(); @@ -3497,21 +3687,24 @@ static void Task_PrintSkillsPage(u8 taskId) PrintRibbonCount(); break; case 3: - BufferLeftColumnStats(); + ChangeStatLabel(SUMMARY_SKILLS_MODE_STATS); break; case 4: - PrintLeftColumnStats(); + BufferLeftColumnStats(); break; case 5: - BufferRightColumnStats(); + PrintLeftColumnStats(); break; case 6: - PrintRightColumnStats(); + BufferRightColumnStats(); break; case 7: - PrintExpPointsNextLevel(); + PrintRightColumnStats(); break; case 8: + PrintExpPointsNextLevel(); + break; + case 9: DestroyTask(taskId); return; } @@ -3581,10 +3774,38 @@ static void BufferStat(u8 *dst, u8 statIndex, u32 stat, u32 strId, u32 n) else txtPtr = StringCopy(dst, sTextNatureNeutral); - ConvertIntToDecimalStringN(txtPtr, stat, STR_CONV_MODE_RIGHT_ALIGN, n); + if (!P_SUMMARY_SCREEN_IV_EV_VALUES + && sMonSummaryScreen->skillsPageMode == SUMMARY_SKILLS_MODE_IVS) + StringAppend(dst, GetLetterGrade(stat)); + else + ConvertIntToDecimalStringN(txtPtr, stat, STR_CONV_MODE_RIGHT_ALIGN, n); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(strId, dst); } +static const u8 *GetLetterGrade(u32 stat) +{ + static const u8 gText_GradeF[] = _("F"); + static const u8 gText_GradeD[] = _("D"); + static const u8 gText_GradeC[] = _("C"); + static const u8 gText_GradeB[] = _("B"); + static const u8 gText_GradeA[] = _("A"); + static const u8 gText_GradeS[] = _("S"); + + if (stat > 0 && stat <= 15) + return gText_GradeD; + else if (stat > 15 && stat <= 25) + return gText_GradeC; + else if (stat > 26 && stat <= 29) + return gText_GradeB; + else if (stat == 30) + return gText_GradeA; + else if (stat == 31) + return gText_GradeS; + else + return gText_GradeF; +} + static void BufferLeftColumnStats(void) { u8 *currentHPString = Alloc(20); @@ -3593,10 +3814,12 @@ static void BufferLeftColumnStats(void) u8 *defenseString = Alloc(20); DynamicPlaceholderTextUtil_Reset(); - BufferStat(currentHPString, 0, sMonSummaryScreen->summary.currentHP, 0, 3); - BufferStat(maxHPString, 0, sMonSummaryScreen->summary.maxHP, 1, 3); + + BufferStat(currentHPString, STAT_HP, sMonSummaryScreen->summary.currentHP, 0, 3); + BufferStat(maxHPString, STAT_HP, sMonSummaryScreen->summary.maxHP, 1, 3); BufferStat(attackString, STAT_ATK, sMonSummaryScreen->summary.atk, 2, 7); BufferStat(defenseString, STAT_DEF, sMonSummaryScreen->summary.def, 3, 7); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, sStatsLeftColumnLayout); Free(currentHPString); @@ -3605,23 +3828,58 @@ static void BufferLeftColumnStats(void) Free(defenseString); } +static void BufferLeftColumnIvEvStats(void) +{ + u8 *hpIvEvString = Alloc(20); + u8 *attackIvEvString = Alloc(20); + u8 *defenseIvEvString = Alloc(20); + + DynamicPlaceholderTextUtil_Reset(); + + BufferStat(hpIvEvString, STAT_HP, sMonSummaryScreen->summary.currentHP, 0, 7); + BufferStat(attackIvEvString, STAT_ATK, sMonSummaryScreen->summary.atk, 1, 7); + BufferStat(defenseIvEvString, STAT_DEF, sMonSummaryScreen->summary.def, 2, 7); + + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, sStatsLeftIVEVColumnLayout); + + Free(hpIvEvString); + Free(attackIvEvString); + Free(defenseIvEvString); +} + static void PrintLeftColumnStats(void) { - PrintTextOnWindow(AddWindowFromTemplateList(sPageSkillsTemplate, PSS_DATA_WINDOW_SKILLS_STATS_LEFT), gStringVar4, 4, 1, 0, 0); + int x; + + if (sMonSummaryScreen->skillsPageMode == SUMMARY_SKILLS_MODE_IVS && !P_SUMMARY_SCREEN_IV_EV_VALUES) + x = GetStringRightAlignXOffset(FONT_NORMAL, gStringVar4, 46); + else + x = 4; + + PrintTextOnWindow(AddWindowFromTemplateList(sPageSkillsTemplate, PSS_DATA_WINDOW_SKILLS_STATS_LEFT), gStringVar4, x, 1, 0, 0); } static void BufferRightColumnStats(void) { DynamicPlaceholderTextUtil_Reset(); + BufferStat(gStringVar1, STAT_SPATK, sMonSummaryScreen->summary.spatk, 0, 3); BufferStat(gStringVar2, STAT_SPDEF, sMonSummaryScreen->summary.spdef, 1, 3); BufferStat(gStringVar3, STAT_SPEED, sMonSummaryScreen->summary.speed, 2, 3); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, sStatsRightColumnLayout); } static void PrintRightColumnStats(void) { - PrintTextOnWindow(AddWindowFromTemplateList(sPageSkillsTemplate, PSS_DATA_WINDOW_SKILLS_STATS_RIGHT), gStringVar4, 2, 1, 0, 0); + int x; + + if (sMonSummaryScreen->skillsPageMode == SUMMARY_SKILLS_MODE_IVS && !P_SUMMARY_SCREEN_IV_EV_VALUES) + x = GetStringRightAlignXOffset(FONT_NORMAL, gStringVar4, 20); + else + x = 2; + + PrintTextOnWindow(AddWindowFromTemplateList(sPageSkillsTemplate, PSS_DATA_WINDOW_SKILLS_STATS_RIGHT), gStringVar4, x, 1, 0, 0); } static void PrintExpPointsNextLevel(void) @@ -3651,7 +3909,6 @@ static void PrintBattleMoves(void) PrintMoveNameAndPP(1); PrintMoveNameAndPP(2); PrintMoveNameAndPP(3); - if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { PrintNewMoveDetailsOrCancelText(); @@ -3750,29 +4007,31 @@ static void PrintMoveNameAndPP(u8 moveIndex) static void PrintMovePowerAndAccuracy(u16 moveIndex) { const u8 *text; - if (moveIndex != 0) + if (moveIndex != MOVE_NONE) { FillWindowPixelRect(PSS_LABEL_WINDOW_MOVES_POWER_ACC, PIXEL_FILL(0), 53, 0, 19, 32); - if (gMovesInfo[moveIndex].power < 2) + u32 power = GetMovePower(moveIndex); + if (power < 2) { text = gText_ThreeDashes; } else { - ConvertIntToDecimalStringN(gStringVar1, gMovesInfo[moveIndex].power, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, power, STR_CONV_MODE_RIGHT_ALIGN, 3); text = gStringVar1; } PrintTextOnWindow(PSS_LABEL_WINDOW_MOVES_POWER_ACC, text, 53, 1, 0, 0); - if (gMovesInfo[moveIndex].accuracy == 0) + u32 accuracy = GetMoveAccuracy(moveIndex); + if (accuracy == 0) { text = gText_ThreeDashes; } else { - ConvertIntToDecimalStringN(gStringVar1, gMovesInfo[moveIndex].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); text = gStringVar1; } @@ -3842,32 +4101,26 @@ static void PrintContestMoveDescription(u8 moveSlot) if (move != MOVE_NONE) { u8 windowId = AddWindowFromTemplateList(sPageMovesTemplate, PSS_DATA_WINDOW_MOVE_DESCRIPTION); - PrintTextOnWindow(windowId, gContestEffectDescriptionPointers[gMovesInfo[move].contestEffect], 6, 1, 0, 0); + PrintTextOnWindow(windowId, gContestEffectDescriptionPointers[GetMoveContestEffect(move)], 6, 1, 0, 0); } } static void PrintMoveDetails(u16 move) { u8 windowId = AddWindowFromTemplateList(sPageMovesTemplate, PSS_DATA_WINDOW_MOVE_DESCRIPTION); - u8 moveEffect; FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); if (move != MOVE_NONE) { if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES) { - moveEffect = gMovesInfo[move].effect; if (B_SHOW_CATEGORY_ICON == TRUE) ShowCategoryIcon(GetBattleMoveCategory(move)); PrintMovePowerAndAccuracy(move); - - if (moveEffect != EFFECT_PLACEHOLDER) - PrintTextOnWindow(windowId, gMovesInfo[move].description, 6, 1, 0, 0); - else - PrintTextOnWindow(windowId, gNotDoneYetDescription, 6, 1, 0, 0); + PrintTextOnWindow(windowId, GetMoveDescription(move), 6, 1, 0, 0); } else { - PrintTextOnWindow(windowId, gContestEffectDescriptionPointers[gMovesInfo[move].contestEffect], 6, 1, 0, 0); + PrintTextOnWindow(windowId, gContestEffectDescriptionPointers[GetMoveContestEffect(move)], 6, 1, 0, 0); } PutWindowTilemap(windowId); } @@ -3897,7 +4150,7 @@ static void PrintNewMoveDetailsOrCancelText(void) else PrintTextOnWindowToFit(windowId1, GetMoveName(move), 0, 65, 0, 5); - ConvertIntToDecimalStringN(gStringVar1, gMovesInfo[move].pp, STR_CONV_MODE_RIGHT_ALIGN, 2); + ConvertIntToDecimalStringN(gStringVar1, GetMovePP(move), STR_CONV_MODE_RIGHT_ALIGN, 2); DynamicPlaceholderTextUtil_Reset(); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); @@ -4051,7 +4304,7 @@ static void SetMoveTypeIcons(void) { if (summary->moves[i] != MOVE_NONE) { - type = gMovesInfo[summary->moves[i]].type; + type = GetMoveType(summary->moves[i]); if (P_SHOW_DYNAMIC_TYPES) type = CheckDynamicMoveType(mon, summary->moves[i], 0); SetTypeSpritePosAndPal(type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); @@ -4070,7 +4323,7 @@ static void SetContestMoveTypeIcons(void) for (i = 0; i < MAX_MON_MOVES; i++) { if (summary->moves[i] != MOVE_NONE) - SetTypeSpritePosAndPal(NUMBER_OF_MON_TYPES + gMovesInfo[summary->moves[i]].contestCategory, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); + SetTypeSpritePosAndPal(NUMBER_OF_MON_TYPES + GetMoveContestCategory(summary->moves[i]), 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); else SetSpriteInvisibility(i + SPRITE_ARR_ID_TYPE, TRUE); } @@ -4078,7 +4331,7 @@ static void SetContestMoveTypeIcons(void) static void SetNewMoveTypeIcon(void) { - u32 type = gMovesInfo[sMonSummaryScreen->newMove].type; + u32 type = GetMoveType(sMonSummaryScreen->newMove); struct Pokemon *mon = &sMonSummaryScreen->currentMon; if (P_SHOW_DYNAMIC_TYPES) @@ -4096,7 +4349,7 @@ static void SetNewMoveTypeIcon(void) } else { - SetTypeSpritePosAndPal(NUMBER_OF_MON_TYPES + gMovesInfo[sMonSummaryScreen->newMove].contestCategory, 85, 96, SPRITE_ARR_ID_TYPE + 4); + SetTypeSpritePosAndPal(NUMBER_OF_MON_TYPES + GetMoveContestCategory(sMonSummaryScreen->newMove), 85, 96, SPRITE_ARR_ID_TYPE + 4); } } } @@ -4389,6 +4642,7 @@ static inline bool32 ShouldShowMoveRelearner(void) { return (P_SUMMARY_SCREEN_MOVE_RELEARNER && !sMonSummaryScreen->lockMovesFlag + && !sMonSummaryScreen->isBoxMon && sMonSummaryScreen->mode != SUMMARY_MODE_BOX && sMonSummaryScreen->mode != SUMMARY_MODE_BOX_CURSOR && sMonSummaryScreen->relearnableMovesNum > 0 @@ -4401,6 +4655,7 @@ static inline bool32 ShouldShowRename(void) return (P_SUMMARY_SCREEN_RENAME && !sMonSummaryScreen->lockMovesFlag && !sMonSummaryScreen->summary.isEgg + && !sMonSummaryScreen->isBoxMon && sMonSummaryScreen->mode != SUMMARY_MODE_BOX && sMonSummaryScreen->mode != SUMMARY_MODE_BOX_CURSOR && !InBattleFactory() @@ -4408,17 +4663,84 @@ static inline bool32 ShouldShowRename(void) && GetPlayerIDAsU32() == sMonSummaryScreen->summary.OTID); } -static void ShowCancelOrRenamePrompt(void) +static inline bool32 ShouldShowIvEvPrompt(void) { - const u8 *promptText = ShouldShowRename() ? gText_Rename : gText_Cancel2; + if (P_SUMMARY_SCREEN_IV_EV_BOX_ONLY) + { + return (P_SUMMARY_SCREEN_IV_EV_INFO || FlagGet(P_FLAG_SUMMARY_SCREEN_IV_EV_INFO)) + && (sMonSummaryScreen->mode == SUMMARY_MODE_BOX|| sMonSummaryScreen->mode == SUMMARY_MODE_BOX_CURSOR); + } + else if (!P_SUMMARY_SCREEN_IV_EV_BOX_ONLY) + { + return (P_SUMMARY_SCREEN_IV_EV_INFO || FlagGet(P_FLAG_SUMMARY_SCREEN_IV_EV_INFO)); + } + return FALSE; +} + +static inline void ShowUtilityPrompt(s16 mode) +{ + const u8* promptText = NULL; + const u8* gText_SkillPageIvs = COMPOUND_STRING("IVs"); + const u8* gText_SkillPageEvs = COMPOUND_STRING("EVs"); + const u8* gText_SkillPageStats = COMPOUND_STRING("STATS"); + + if (sMonSummaryScreen->currPageIndex == PSS_PAGE_INFO) + { + if (ShouldShowRename()) + promptText = gText_Rename; + else + promptText = gText_Cancel2; + } + else if (sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS) + { + if (ShouldShowIvEvPrompt()) + { + if (mode == SUMMARY_SKILLS_MODE_STATS) + { + if (P_SUMMARY_SCREEN_EV_ONLY) + promptText = gText_SkillPageEvs; + else + promptText = gText_SkillPageIvs; + } + else if (mode == SUMMARY_SKILLS_MODE_IVS) + { + if (P_SUMMARY_SCREEN_IV_ONLY) + promptText = gText_SkillPageStats; + else + promptText = gText_SkillPageEvs; + } + else if (mode == SUMMARY_SKILLS_MODE_EVS) + { + promptText = gText_SkillPageStats; + } + } + } + else if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES + || sMonSummaryScreen->currPageIndex == PSS_PAGE_CONTEST_MOVES) + { + if (mode == SUMMARY_MODE_SELECT_MOVE && !sMonSummaryScreen->lockMovesFlag) + promptText = gText_Switch; + else + promptText = gText_Info; + } + + if (promptText == NULL) + { + ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_UTILITY); + FillWindowPixelBuffer(PSS_LABEL_WINDOW_PROMPT_UTILITY, PIXEL_FILL(0)); + return; + } + + FillWindowPixelBuffer(PSS_LABEL_WINDOW_PROMPT_UTILITY, PIXEL_FILL(0)); + PutWindowTilemap(PSS_LABEL_WINDOW_PROMPT_UTILITY); int stringXPos = GetStringRightAlignXOffset(FONT_NORMAL, promptText, 62); int iconXPos = stringXPos - 16; if (iconXPos < 0) iconXPos = 0; - PrintAOrBButtonIcon(PSS_LABEL_WINDOW_PROMPT_CANCEL, FALSE, iconXPos); - PrintTextOnWindow(PSS_LABEL_WINDOW_PROMPT_CANCEL, promptText, stringXPos, 1, 0, 0); + PrintAOrBButtonIcon(PSS_LABEL_WINDOW_PROMPT_UTILITY, FALSE, iconXPos); + PrintTextOnWindow(PSS_LABEL_WINDOW_PROMPT_UTILITY, promptText, stringXPos, 1, 0, 0); } static void CB2_ReturnToSummaryScreenFromNamingScreen(void) diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c index dfd656833d..d2765b6706 100644 --- a/src/pokenav_main_menu.c +++ b/src/pokenav_main_menu.c @@ -17,14 +17,15 @@ struct Pokenav_MainMenu { void (*loopTask)(u32); u32 (*isLoopTaskActiveFunc)(void); - u32 unused; u32 currentTaskId; u32 helpBarWindowId; u32 palettes; struct Sprite *spinningPokenav; struct Sprite *leftHeaderSprites[2]; struct Sprite *submenuLeftHeaderSprites[2]; - u8 tilemapBuffer[BG_SCREEN_SIZE]; + ALIGNED(4) u8 tilemapBuffer[BG_SCREEN_SIZE]; + ALIGNED(4) u8 leftHeaderMenuBuffer[0x1000]; + ALIGNED(4) u8 leftHeaderSubMenuBuffer[0x1000]; }; // This struct uses a 32bit tag, and doesn't have a size field. @@ -86,18 +87,20 @@ static const struct WindowTemplate sHelpBarWindowTemplate[] = static const u8 *const sHelpBarTexts[HELPBAR_COUNT] = { - [HELPBAR_NONE] = COMPOUND_STRING("{CLEAR 0x80}"), - [HELPBAR_MAP_ZOOMED_OUT] = COMPOUND_STRING("{A_BUTTON}ZOOM {B_BUTTON}CANCEL"), - [HELPBAR_MAP_ZOOMED_IN] = COMPOUND_STRING("{A_BUTTON}FULL {B_BUTTON}CANCEL"), - [HELPBAR_CONDITION_MON_LIST] = COMPOUND_STRING("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"), - [HELPBAR_CONDITION_MON_STATUS] = COMPOUND_STRING("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"), - [HELPBAR_CONDITION_MARKINGS] = COMPOUND_STRING("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"), - [HELPBAR_MC_TRAINER_LIST] = COMPOUND_STRING("{A_BUTTON}MENU {B_BUTTON}CANCEL"), - [HELPBAR_MC_CALL_MENU] = COMPOUND_STRING("{A_BUTTON}OK {B_BUTTON}CANCEL"), - [HELPBAR_MC_CHECK_PAGE] = COMPOUND_STRING("{B_BUTTON}CANCEL"), - [HELPBAR_RIBBONS_MON_LIST] = COMPOUND_STRING("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL"), - [HELPBAR_RIBBONS_LIST] = COMPOUND_STRING("{A_BUTTON}CHECK {B_BUTTON}CANCEL"), - [HELPBAR_RIBBONS_CHECK] = COMPOUND_STRING("{B_BUTTON}CANCEL"), + [HELPBAR_NONE] = COMPOUND_STRING("{CLEAR 0x80}"), + [HELPBAR_MAP_ZOOMED_OUT] = COMPOUND_STRING("{A_BUTTON}ZOOM {B_BUTTON}CANCEL"), + [HELPBAR_MAP_ZOOMED_IN] = COMPOUND_STRING("{A_BUTTON}FULL {B_BUTTON}CANCEL"), + [HELPBAR_MAP_ZOOMED_OUT_CANFLY] = COMPOUND_STRING("{A_BUTTON}ZOOM {B_BUTTON}CANCEL {R_BUTTON}FLY"), + [HELPBAR_MAP_ZOOMED_IN_CANFLY] = COMPOUND_STRING("{A_BUTTON}FULL {B_BUTTON}CANCEL {R_BUTTON}FLY"), + [HELPBAR_CONDITION_MON_LIST] = COMPOUND_STRING("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"), + [HELPBAR_CONDITION_MON_STATUS] = COMPOUND_STRING("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"), + [HELPBAR_CONDITION_MARKINGS] = COMPOUND_STRING("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"), + [HELPBAR_MC_TRAINER_LIST] = COMPOUND_STRING("{A_BUTTON}MENU {B_BUTTON}CANCEL"), + [HELPBAR_MC_CALL_MENU] = COMPOUND_STRING("{A_BUTTON}OK {B_BUTTON}CANCEL"), + [HELPBAR_MC_CHECK_PAGE] = COMPOUND_STRING("{B_BUTTON}CANCEL"), + [HELPBAR_RIBBONS_MON_LIST] = COMPOUND_STRING("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL"), + [HELPBAR_RIBBONS_LIST] = COMPOUND_STRING("{A_BUTTON}CHECK {B_BUTTON}CANCEL"), + [HELPBAR_RIBBONS_CHECK] = COMPOUND_STRING("{B_BUTTON}CANCEL"), }; static const u8 sHelpBarTextColors[3] = @@ -376,13 +379,11 @@ void SetActiveMenuLoopTasks(void *createLoopTask, void *isLoopTaskActive) // Fix struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); menu->loopTask = createLoopTask; menu->isLoopTaskActiveFunc = isLoopTaskActive; - menu->unused = 0; } void RunMainMenuLoopedTask(u32 state) { struct Pokenav_MainMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); - menu->unused = 0; menu->loopTask(state); } @@ -684,8 +685,8 @@ static void LoadLeftHeaderGfxForMenu(u32 menuGfxId) tag = sMenuLeftHeaderSpriteSheets[menuGfxId].tag; size = GetDecompressedDataSize(sMenuLeftHeaderSpriteSheets[menuGfxId].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], OBJ_PLTT_ID(IndexOfSpritePaletteTag(1)), PLTT_SIZE_4BPP); - LZ77UnCompWram(sMenuLeftHeaderSpriteSheets[menuGfxId].data, gDecompressionBuffer); - RequestDma3Copy(gDecompressionBuffer, (void *)OBJ_VRAM0 + (GetSpriteTileStartByTag(2) * 32), size, 1); + LZDecompressWram(sMenuLeftHeaderSpriteSheets[menuGfxId].data, menu->leftHeaderMenuBuffer); + RequestDma3Copy(menu->leftHeaderMenuBuffer, (void *)OBJ_VRAM0 + (GetSpriteTileStartByTag(2) * 32), size, 1); menu->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sMenuLeftHeaderSpriteSheets[menuGfxId].size; if (menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_OUT || menuGfxId == POKENAV_GFX_MAP_MENU_ZOOMED_IN) @@ -696,16 +697,18 @@ static void LoadLeftHeaderGfxForMenu(u32 menuGfxId) static void LoadLeftHeaderGfxForSubMenu(u32 menuGfxId) { + struct Pokenav_MainMenu *menu; u32 size, tag; if (menuGfxId >= POKENAV_GFX_MENUS_END - POKENAV_GFX_SUBMENUS_START) return; + menu = GetSubstructPtr(POKENAV_SUBSTRUCT_MAIN_MENU); tag = sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].tag; size = GetDecompressedDataSize(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], OBJ_PLTT_ID(IndexOfSpritePaletteTag(2)), PLTT_SIZE_4BPP); - LZ77UnCompWram(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data, &gDecompressionBuffer[0x1000]); - RequestDma3Copy(&gDecompressionBuffer[0x1000], (void *)OBJ_VRAM0 + 0x800 + (GetSpriteTileStartByTag(2) * 32), size, 1); + LZDecompressWram(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data, menu->leftHeaderSubMenuBuffer); + RequestDma3Copy(menu->leftHeaderSubMenuBuffer, (void *)OBJ_VRAM0 + 0x800 + (GetSpriteTileStartByTag(2) * 32), size, 1); } void ShowLeftHeaderGfx(u32 menuGfxId, bool32 isMain, bool32 isOnRightSide) diff --git a/src/pokenav_region_map.c b/src/pokenav_region_map.c index f81ff42966..b17689aad8 100755 --- a/src/pokenav_region_map.c +++ b/src/pokenav_region_map.c @@ -2,8 +2,11 @@ #include "bg.h" #include "decompress.h" #include "landmark.h" +#include "event_data.h" +#include "field_effect.h" #include "main.h" #include "menu.h" +#include "overworld.h" #include "palette.h" #include "pokenav.h" #include "region_map.h" @@ -73,6 +76,7 @@ static u32 LoopedTask_UpdateInfoAfterCursorMove(s32); static u32 LoopedTask_RegionMapZoomOut(s32); static u32 LoopedTask_RegionMapZoomIn(s32); static u32 LoopedTask_ExitRegionMap(s32); +static u32 LoopedTask_TreatAsPokeNavFlyMap(s32); extern const u16 gRegionMapCityZoomTiles_Pal[]; extern const u32 gRegionMapCityZoomText_Gfx[]; @@ -119,7 +123,8 @@ static const LoopedTask sRegionMapLoopTaskFuncs[] = [POKENAV_MAP_FUNC_CURSOR_MOVED] = LoopedTask_UpdateInfoAfterCursorMove, [POKENAV_MAP_FUNC_ZOOM_OUT] = LoopedTask_RegionMapZoomOut, [POKENAV_MAP_FUNC_ZOOM_IN] = LoopedTask_RegionMapZoomIn, - [POKENAV_MAP_FUNC_EXIT] = LoopedTask_ExitRegionMap + [POKENAV_MAP_FUNC_EXIT] = LoopedTask_ExitRegionMap, + [POKENAV_MAP_FUNC_FLY] = LoopedTask_TreatAsPokeNavFlyMap, }; static const struct CompressedSpriteSheet sCityZoomTextSpriteSheet[1] = @@ -204,6 +209,8 @@ u32 GetRegionMapCallback(void) static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *state) { + struct RegionMap* regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP); + switch (DoRegionMapInputCallback()) { case MAP_INPUT_MOVE_END: @@ -215,6 +222,10 @@ static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *state) case MAP_INPUT_B_BUTTON: state->callback = GetExitRegionMapMenuId; return POKENAV_MAP_FUNC_EXIT; + case MAP_INPUT_R_BUTTON: + if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && FlagGet(OW_FLAG_POKE_RIDER) + && Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) + return POKENAV_MAP_FUNC_FLY; } return POKENAV_MAP_FUNC_NONE; @@ -365,6 +376,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState) else menuGfxId = POKENAV_GFX_MAP_MENU_ZOOMED_IN; + UpdateRegionMapHelpBarText(); LoadLeftHeaderGfxForIndex(menuGfxId); ShowLeftHeaderGfx(menuGfxId, TRUE, TRUE); PokenavFadeScreen(POKENAV_FADE_FROM_BLACK); @@ -385,6 +397,7 @@ static u32 LoopedTask_UpdateInfoAfterCursorMove(s32 taskState) { case 0: UpdateMapSecInfoWindow(state); + UpdateRegionMapHelpBarText(); return LT_INC_AND_PAUSE; case 1: if (IsDma3ManagerBusyWithBgCopy_(state)) @@ -408,7 +421,7 @@ static u32 LoopedTask_RegionMapZoomOut(s32 taskState) if (UpdateRegionMapZoom() || IsChangeBgYForZoomActive()) return LT_PAUSE; - PrintHelpBarText(HELPBAR_MAP_ZOOMED_OUT); + UpdateRegionMapHelpBarText(); return LT_INC_AND_PAUSE; case 2: if (WaitForHelpBar()) @@ -441,7 +454,7 @@ static u32 LoopedTask_RegionMapZoomIn(s32 taskState) if (UpdateRegionMapZoom() || IsChangeBgYForZoomActive()) return LT_PAUSE; - PrintHelpBarText(HELPBAR_MAP_ZOOMED_IN); + UpdateRegionMapHelpBarText(); return LT_INC_AND_PAUSE; case 3: if (WaitForHelpBar()) @@ -482,6 +495,23 @@ static u32 LoopedTask_ExitRegionMap(s32 taskState) return LT_FINISH; } +static u32 LoopedTask_TreatAsPokeNavFlyMap(s32 taskState) +{ + switch (taskState) + { + case 0: + PlaySE(SE_SELECT); + struct RegionMap* regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP); + SetFlyDestination(regionMap); + gSkipShowMonAnim = TRUE; + ReturnToFieldFromFlyMapSelect(); + + return LT_FINISH; + } + + return LT_FINISH; +} + static void LoadCityZoomViewGfx(void) { int i; @@ -740,3 +770,24 @@ static void SetCityZoomTextInvisibility(bool32 invisible) for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++) state->cityZoomTextSprites[i]->invisible = invisible; } + +void UpdateRegionMapHelpBarText(void) +{ + struct RegionMap* regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP); + + if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && FlagGet(OW_FLAG_POKE_RIDER) + && Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) + { + if (IsRegionMapZoomed()) + PrintHelpBarText(HELPBAR_MAP_ZOOMED_IN_CANFLY); + else + PrintHelpBarText(HELPBAR_MAP_ZOOMED_OUT_CANFLY); + } + else + { + if (IsRegionMapZoomed()) + PrintHelpBarText(HELPBAR_MAP_ZOOMED_IN); + else + PrintHelpBarText(HELPBAR_MAP_ZOOMED_OUT); + } +} diff --git a/src/record_mixing.c b/src/record_mixing.c index 7d78119f86..1ff36d1fe8 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -770,14 +770,12 @@ static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *records, size bool8 canHoldItem[MAX_LINK_PLAYERS][DAYCARE_MON_COUNT]; u8 idxs[MAX_LINK_PLAYERS][2]; u8 numDaycareCanHold; - u16 oldSeed; bool32 anyRS; + rng_value_t localRngState = LocalRandomSeed(gLinkPlayers[0].trainerId); // Seed RNG to the first player's trainer id so that // every player has the same random swap occur // (see the other use of Random2 in this function) - oldSeed = Random2(); - SeedRng2(gLinkPlayers[0].trainerId); linkPlayerCount = GetLinkPlayerCount(); for (i = 0; i < MAX_LINK_PLAYERS; i++) { @@ -907,7 +905,7 @@ static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *records, size itemId2 = GetDaycareMailItemId(&mixMail->mail[1]); if ((!itemId1 && !itemId2) || (itemId1 && itemId2)) - idxs[j][DAYCARE_SLOT] = Random2() % 2; + idxs[j][DAYCARE_SLOT] = LocalRandom32(&localRngState) % 2; else if (itemId1 && !itemId2) idxs[j][DAYCARE_SLOT] = 0; else if (!itemId1 && itemId2) @@ -958,7 +956,6 @@ static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *records, size mixMail = (void *)records + multiplayerId * recordSize; memcpy(&gSaveBlock1Ptr->daycare.mons[0].mail, &mixMail->mail[0], sizeof(struct DaycareMail)); memcpy(&gSaveBlock1Ptr->daycare.mons[1].mail, &mixMail->mail[1], sizeof(struct DaycareMail)); - SeedRng(oldSeed); } diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 5e1ff63bbe..0b385c017c 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -349,8 +349,8 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->battleFlags = sBattleFlags; } - battleSave->opponentA = gTrainerBattleOpponent_A; - battleSave->opponentB = gTrainerBattleOpponent_B; + battleSave->opponentA = TRAINER_BATTLE_PARAM.opponentA; + battleSave->opponentB = TRAINER_BATTLE_PARAM.opponentB; battleSave->partnerId = gPartnerTrainerId; battleSave->multiplayerId = gRecordedBattleMultiplayerId; battleSave->lvlMode = gSaveBlock2Ptr->frontier.lvlMode; @@ -360,41 +360,41 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->textSpeed = gSaveBlock2Ptr->optionsTextSpeed; battleSave->AI_scripts = sAI_Scripts; - if (gTrainerBattleOpponent_A >= TRAINER_RECORD_MIXING_FRIEND && gTrainerBattleOpponent_A < TRAINER_RECORD_MIXING_APPRENTICE) + if (TRAINER_BATTLE_PARAM.opponentA >= TRAINER_RECORD_MIXING_FRIEND && TRAINER_BATTLE_PARAM.opponentA < TRAINER_RECORD_MIXING_APPRENTICE) { for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) - battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].name[i]; - battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].facilityClass; + battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_FRIEND].name[i]; + battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_FRIEND].facilityClass; if (sBattleOutcome == B_OUTCOME_WON) { for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].speechLost[i]; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_FRIEND].speechLost[i]; } else { for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].speechWon[i]; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_FRIEND].speechWon[i]; } - battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].language; + battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_FRIEND].language; } - else if (gTrainerBattleOpponent_B >= TRAINER_RECORD_MIXING_FRIEND && gTrainerBattleOpponent_B < TRAINER_RECORD_MIXING_APPRENTICE) + else if (TRAINER_BATTLE_PARAM.opponentB >= TRAINER_RECORD_MIXING_FRIEND && TRAINER_BATTLE_PARAM.opponentB < TRAINER_RECORD_MIXING_APPRENTICE) { for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) - battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].name[i]; - battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].facilityClass; + battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_FRIEND].name[i]; + battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_FRIEND].facilityClass; if (sBattleOutcome == B_OUTCOME_WON) { for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].speechLost[i]; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_FRIEND].speechLost[i]; } else { for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].speechWon[i]; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_FRIEND].speechWon[i]; } - battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].language; + battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_FRIEND].language; } else if (gPartnerTrainerId >= TRAINER_RECORD_MIXING_FRIEND && gPartnerTrainerId < TRAINER_RECORD_MIXING_APPRENTICE) { @@ -405,19 +405,19 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[gPartnerTrainerId - TRAINER_RECORD_MIXING_FRIEND].language; } - if (gTrainerBattleOpponent_A >= TRAINER_RECORD_MIXING_APPRENTICE) + if (TRAINER_BATTLE_PARAM.opponentA >= TRAINER_RECORD_MIXING_APPRENTICE) { - battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_APPRENTICE].id; + battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_APPRENTICE].id; for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_APPRENTICE].speechWon[i]; - battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_APPRENTICE].language; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_APPRENTICE].speechWon[i]; + battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentA - TRAINER_RECORD_MIXING_APPRENTICE].language; } - else if (gTrainerBattleOpponent_B >= TRAINER_RECORD_MIXING_APPRENTICE) + else if (TRAINER_BATTLE_PARAM.opponentB >= TRAINER_RECORD_MIXING_APPRENTICE) { - battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_APPRENTICE].id; + battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_APPRENTICE].id; for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) - battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_APPRENTICE].speechWon[i]; - battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_APPRENTICE].language; + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_APPRENTICE].speechWon[i]; + battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[TRAINER_BATTLE_PARAM.opponentB - TRAINER_RECORD_MIXING_APPRENTICE].language; } else if (gPartnerTrainerId >= TRAINER_RECORD_MIXING_APPRENTICE) { @@ -472,8 +472,8 @@ static void CB2_RecordedBattleEnd(void) gSaveBlock2Ptr->frontier.lvlMode = sLvlMode; gBattleOutcome = 0; gBattleTypeFlags = 0; - gTrainerBattleOpponent_A = 0; - gTrainerBattleOpponent_B = 0; + TRAINER_BATTLE_PARAM.opponentA = 0; + TRAINER_BATTLE_PARAM.opponentB = 0; gPartnerTrainerId = 0; RecordedBattle_RestoreSavedParties(); @@ -530,8 +530,8 @@ void SetVariablesForRecordedBattle(struct RecordedBattleSave *src) gRecordedBattleRngSeed = src->rngSeed; gBattleTypeFlags = src->battleFlags | BATTLE_TYPE_RECORDED; - gTrainerBattleOpponent_A = src->opponentA; - gTrainerBattleOpponent_B = src->opponentB; + TRAINER_BATTLE_PARAM.opponentA = src->opponentA; + TRAINER_BATTLE_PARAM.opponentB = src->opponentB; gPartnerTrainerId = src->partnerId; gRecordedBattleMultiplayerId = src->multiplayerId; sLvlMode = gSaveBlock2Ptr->frontier.lvlMode; @@ -778,7 +778,7 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, &ppBonusSet); } - gChosenMoveByBattler[battlerId] = gBattleMons[battlerId].moves[*(gBattleStruct->chosenMovePositions + battlerId)]; + gChosenMoveByBattler[battlerId] = gBattleMons[battlerId].moves[gBattleStruct->chosenMovePositions[battlerId]]; } } } diff --git a/src/region_map.c b/src/region_map.c index 92771c8220..aba1162f5b 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -680,6 +680,10 @@ static u8 ProcessRegionMapInput_Full(void) { input = MAP_INPUT_B_BUTTON; } + else if (JOY_NEW(R_BUTTON)) + { + input = MAP_INPUT_R_BUTTON; + } if (input == MAP_INPUT_MOVE_START) { sRegionMap->cursorMovementFrameCounter = 4; @@ -759,6 +763,10 @@ static u8 ProcessRegionMapInput_Zoomed(void) { input = MAP_INPUT_B_BUTTON; } + else if (JOY_NEW(R_BUTTON)) + { + input = MAP_INPUT_R_BUTTON; + } if (input == MAP_INPUT_MOVE_START) { sRegionMap->inputCallback = MoveRegionMapCursor_Zoomed; @@ -1992,27 +2000,9 @@ static void CB_ExitFlyMap(void) FreeRegionMapIconResources(); if (sFlyMap->choseFlyLocation) { - switch (sFlyMap->regionMap.mapSecId) - { - case MAPSEC_SOUTHERN_ISLAND: - SetWarpDestinationToHealLocation(HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR); - break; - case MAPSEC_BATTLE_FRONTIER: - SetWarpDestinationToHealLocation(HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST); - break; - case MAPSEC_LITTLEROOT_TOWN: - SetWarpDestinationToHealLocation(gSaveBlock2Ptr->playerGender == MALE ? HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE : HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE); - break; - case MAPSEC_EVER_GRANDE_CITY: - SetWarpDestinationToHealLocation(FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && sFlyMap->regionMap.posWithinMapSec == 0 ? HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE : HEAL_LOCATION_EVER_GRANDE_CITY); - break; - default: - if (sMapHealLocations[sFlyMap->regionMap.mapSecId][2] != HEAL_LOCATION_NONE) - SetWarpDestinationToHealLocation(sMapHealLocations[sFlyMap->regionMap.mapSecId][2]); - else - SetWarpDestinationToMapWarp(sMapHealLocations[sFlyMap->regionMap.mapSecId][0], sMapHealLocations[sFlyMap->regionMap.mapSecId][1], WARP_ID_NONE); - break; - } + struct RegionMap* tempRegionMap = &sFlyMap->regionMap; + + SetFlyDestination(tempRegionMap); ReturnToFieldFromFlyMapSelect(); } else @@ -2025,3 +2015,33 @@ static void CB_ExitFlyMap(void) break; } } + +u32 FilterFlyDestination(struct RegionMap* regionMap) +{ + switch (regionMap->mapSecId) + { + case MAPSEC_SOUTHERN_ISLAND: + return HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR; + case MAPSEC_BATTLE_FRONTIER: + return HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST; + case MAPSEC_LITTLEROOT_TOWN: + return (gSaveBlock2Ptr->playerGender == MALE ? HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE : HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE); + case MAPSEC_EVER_GRANDE_CITY: + return (FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && regionMap->posWithinMapSec == 0 ? HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE : HEAL_LOCATION_EVER_GRANDE_CITY); + default: + if (sMapHealLocations[regionMap->mapSecId][2] != HEAL_LOCATION_NONE) + return sMapHealLocations[regionMap->mapSecId][2]; + else + return WARP_ID_NONE; + } +} + +void SetFlyDestination(struct RegionMap* regionMap) +{ + u32 flyDestination = FilterFlyDestination(regionMap); + + if (flyDestination != WARP_ID_NONE) + SetWarpDestinationToHealLocation(flyDestination); + else + SetWarpDestinationToMapWarp(sMapHealLocations[regionMap->mapSecId][0], sMapHealLocations[regionMap->mapSecId][1], WARP_ID_NONE); +} diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 87f639194c..ba6f615595 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -18,9 +18,11 @@ // this file's functions static void CB2_ReshowBattleScreenAfterMenu(void); +static void CB2_ReshowBlankBattleScreenAfterMenu(void); static bool8 LoadBattlerSpriteGfx(u32 battler); static void CreateHealthboxSprite(u32 battler); static void ClearBattleBgCntBaseBlocks(void); +static void CreateCaughtMonSprite(void); void ReshowBattleScreenDummy(void) { @@ -168,6 +170,89 @@ static void CB2_ReshowBattleScreenAfterMenu(void) gBattleScripting.reshowMainState++; } +void ReshowBlankBattleScreenAfterMenu(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + SetGpuReg(REG_OFFSET_MOSAIC, 0); + gBattleScripting.reshowMainState = 0; + gBattleScripting.reshowHelperState = 0; + SetMainCallback2(CB2_ReshowBlankBattleScreenAfterMenu); +} + +static void CB2_ReshowBlankBattleScreenAfterMenu(void) +{ + switch (gBattleScripting.reshowMainState) + { + case 0: + ScanlineEffect_Clear(); + BattleInitBgsAndWindows(); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); + SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + ResetPaletteFade(); + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 255; + gBattle_BG3_Y = 0; + break; + case 1: + CpuFastFill(0, (void *)(VRAM), VRAM_SIZE); + break; + case 2: + LoadBattleTextboxAndBackground(); + break; + case 3: + ResetSpriteData(); + break; + case 4: + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = MAX_BATTLERS_COUNT; + break; + case 5: + ClearSpritesHealthboxAnimData(); + break; + case 6: + if (!LoadBattlerSpriteGfx(0)) + gBattleScripting.reshowMainState--; + break; + case 7: + if (!LoadBattlerSpriteGfx(1)) + gBattleScripting.reshowMainState--; + break; + case 8: + if (!LoadBattlerSpriteGfx(2)) + gBattleScripting.reshowMainState--; + break; + case 9: + if (!LoadBattlerSpriteGfx(3)) + gBattleScripting.reshowMainState--; + break; + case 10: + if (gBattleScripting.monCaught) + CreateCaughtMonSprite(); // displays the caught mon for the switch into party feature + break; + default: + SetVBlankCallback(VBlankCB_Battle); + ClearBattleBgCntBaseBlocks(); + BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1); + gPaletteFade.bufferTransferDisabled = 0; + SetMainCallback2(BattleMainCB2); + FillAroundBattleWindows(); + break; + } + + gBattleScripting.reshowMainState++; +} + static void ClearBattleBgCntBaseBlocks(void) { vBgCnt *regBgcnt1, *regBgcnt2; @@ -311,3 +396,17 @@ static void CreateHealthboxSprite(u32 battler) } } } + +static void CreateCaughtMonSprite(void) +{ + SetMultiuseSpriteTemplateToPokemon(GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES), GetBattlerPosition(gBattlerTarget)); + gBattlerSpriteIds[gBattlerTarget] = CreateSprite(&gMultiuseSpriteTemplate, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, GetBattlerSpriteSubpriority(gBattlerTarget)); + gSprites[gBattlerSpriteIds[gBattlerTarget]].oam.paletteNum = gBattlerTarget; + gSprites[gBattlerSpriteIds[gBattlerTarget]].callback = SpriteCallbackDummy; + gSprites[gBattlerSpriteIds[gBattlerTarget]].data[0] = gBattlerTarget; + gSprites[gBattlerSpriteIds[gBattlerTarget]].data[2] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES); + + StartSpriteAnim(&gSprites[gBattlerSpriteIds[gBattlerTarget]], 0); + + gSprites[gBattlerSpriteIds[gBattlerTarget]].invisible = FALSE; +} diff --git a/src/rom_header_gf.c b/src/rom_header_gf.c index 1074a86bf8..c55535003c 100644 --- a/src/rom_header_gf.c +++ b/src/rom_header_gf.c @@ -1,10 +1,11 @@ #include "global.h" -#include "data.h" -#include "pokemon_icon.h" -#include "decoration.h" #include "battle_main.h" +#include "data.h" +#include "decoration.h" #include "item.h" +#include "move.h" #include "pokeball.h" +#include "pokemon_icon.h" // The purpose of this struct is for outside applications to be // able to access parts of the ROM or its save file, like a public API. diff --git a/src/roulette.c b/src/roulette.c index f4e6012a8d..c72b1b7876 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -3521,17 +3521,10 @@ static void CreateGridSprites(void) { u8 i, j; u8 spriteId; - struct SpriteSheet s; - LZ77UnCompWram(sSpriteSheet_Headers.data, gDecompressionBuffer); - s.data = gDecompressionBuffer; - s.size = sSpriteSheet_Headers.size; - s.tag = sSpriteSheet_Headers.tag; - LoadSpriteSheet(&s); - LZ77UnCompWram(sSpriteSheet_GridIcons.data, gDecompressionBuffer); - s.data = gDecompressionBuffer; - s.size = sSpriteSheet_GridIcons.size; - s.tag = sSpriteSheet_GridIcons.tag; - LoadSpriteSheet(&s); + + LoadCompressedSpriteSheet(&sSpriteSheet_Headers); + LoadCompressedSpriteSheet(&sSpriteSheet_GridIcons); + for (i = 0; i < NUM_BOARD_COLORS; i++) { u8 y = i * 24; @@ -3656,13 +3649,8 @@ static void CreateWheelIconSprites(void) { u8 i, j; u16 angle; - struct SpriteSheet s; - LZ77UnCompWram(sSpriteSheet_WheelIcons.data, gDecompressionBuffer); - s.data = gDecompressionBuffer; - s.size = sSpriteSheet_WheelIcons.size; - s.tag = sSpriteSheet_WheelIcons.tag; - LoadSpriteSheet(&s); + LoadCompressedSpriteSheet(&sSpriteSheet_WheelIcons); angle = 15; for (i = 0; i < NUM_BOARD_COLORS; i++) @@ -3702,12 +3690,7 @@ static void CreateInterfaceSprites(void) u8 i; for (i = 0; i < ARRAY_COUNT(sSpriteSheets_Interface) - 1; i++) { - struct SpriteSheet s; - LZ77UnCompWram(sSpriteSheets_Interface[i].data, gDecompressionBuffer); - s.data = gDecompressionBuffer; - s.size = sSpriteSheets_Interface[i].size; - s.tag = sSpriteSheets_Interface[i].tag; - LoadSpriteSheet(&s); + LoadCompressedSpriteSheet(&sSpriteSheets_Interface[i]); } sRoulette->spriteIds[SPR_CREDIT] = CreateSprite(&sSpriteTemplate_Credit, 208, 16, 4); gSprites[sRoulette->spriteIds[SPR_CREDIT]].animPaused = TRUE; @@ -3850,12 +3833,9 @@ static void SpriteCB_GridSquare(struct Sprite *sprite) static void CreateWheelCenterSprite(void) { u8 spriteId; - struct SpriteSheet s; - LZ77UnCompWram(sSpriteSheet_WheelCenter.data, gDecompressionBuffer); - s.data = gDecompressionBuffer; - s.size = sSpriteSheet_WheelCenter.size; - s.tag = sSpriteSheet_WheelCenter.tag; - LoadSpriteSheet(&s); + + LoadCompressedSpriteSheet(&sSpriteSheet_WheelCenter); + // This sprite id isn't saved because it doesn't need to be referenced again // but by virtue of creation order it's SPR_WHEEL_CENTER spriteId = CreateSprite(&sSpriteTemplate_WheelCenter, 116, 80, 81); diff --git a/src/save.c b/src/save.c index 7d7d1e4292..65e496b0d0 100644 --- a/src/save.c +++ b/src/save.c @@ -7,6 +7,7 @@ #include "decompress.h" #include "load_save.h" #include "overworld.h" +#include "hall_of_fame.h" #include "pokemon_storage_system.h" #include "main.h" #include "trainer_hill.h" @@ -716,7 +717,6 @@ u8 HandleSavingData(u8 saveType) { u8 i; u32 *backupVar = gTrainerHillVBlankCounter; - u8 *tempAddr; gTrainerHillVBlankCounter = NULL; UpdateSaveAddresses(); @@ -737,9 +737,12 @@ u8 HandleSavingData(u8 saveType) WriteSaveSectorOrSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations); // Save the Hall of Fame - tempAddr = gDecompressionBuffer; - HandleWriteSectorNBytes(SECTOR_ID_HOF_1, tempAddr, SECTOR_DATA_SIZE); - HandleWriteSectorNBytes(SECTOR_ID_HOF_2, tempAddr + SECTOR_DATA_SIZE, SECTOR_DATA_SIZE); + if (gHoFSaveBuffer != NULL) + { + u8 *tempAddr = (void *) gHoFSaveBuffer; + HandleWriteSectorNBytes(SECTOR_ID_HOF_1, tempAddr, SECTOR_DATA_SIZE); + HandleWriteSectorNBytes(SECTOR_ID_HOF_2, tempAddr + SECTOR_DATA_SIZE, SECTOR_DATA_SIZE); + } break; case SAVE_NORMAL: default: @@ -897,9 +900,17 @@ u8 LoadGameSave(u8 saveType) gGameContinueCallback = 0; break; case SAVE_HALL_OF_FAME: - status = TryLoadSaveSector(SECTOR_ID_HOF_1, gDecompressionBuffer, SECTOR_DATA_SIZE); - if (status == SAVE_STATUS_OK) - status = TryLoadSaveSector(SECTOR_ID_HOF_2, &gDecompressionBuffer[SECTOR_DATA_SIZE], SECTOR_DATA_SIZE); + if (gHoFSaveBuffer != NULL) + { + u8 *hofData = (u8 *) gHoFSaveBuffer; + status = TryLoadSaveSector(SECTOR_ID_HOF_1, hofData, SECTOR_DATA_SIZE); + if (status == SAVE_STATUS_OK) + status = TryLoadSaveSector(SECTOR_ID_HOF_2, &hofData[SECTOR_DATA_SIZE], SECTOR_DATA_SIZE); + } + else + { + status = SAVE_STATUS_ERROR; + } break; } diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c index 9bd981facc..08cc1aaeb9 100644 --- a/src/save_failed_screen.c +++ b/src/save_failed_screen.c @@ -1,6 +1,7 @@ #include "global.h" #include "text.h" #include "main.h" +#include "malloc.h" #include "palette.h" #include "graphics.h" #include "gpu_regs.h" @@ -171,6 +172,15 @@ static void VBlankCB(void) TransferPlttBuffer(); } +struct SaveFailedBuffers +{ + ALIGNED(4) u8 tilemapBuffer[BG_SCREEN_SIZE]; + ALIGNED(4) u8 window1TileData[0x200]; + ALIGNED(4) u8 window2TileData[0x200]; +}; + +static EWRAM_DATA struct SaveFailedBuffers *sSaveFailedBuffers = NULL; + static void CB2_SaveFailedScreen(void) { switch (gMain.state) @@ -178,6 +188,7 @@ static void CB2_SaveFailedScreen(void) case 0: default: SetVBlankCallback(NULL); + sSaveFailedBuffers = Alloc(sizeof(*sSaveFailedBuffers)); SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG3CNT, 0); SetGpuReg(REG_OFFSET_BG2CNT, 0); @@ -200,14 +211,14 @@ static void CB2_SaveFailedScreen(void) LZ77UnCompVram(sSaveFailedClockGfx, (void *)(OBJ_VRAM0 + 0x20)); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); - SetBgTilemapBuffer(0, (void *)&gDecompressionBuffer[0x2000]); - CpuFill32(0, &gDecompressionBuffer[0x2000], 0x800); + SetBgTilemapBuffer(0, sSaveFailedBuffers->tilemapBuffer); + CpuFill32(0, sSaveFailedBuffers->tilemapBuffer, BG_SCREEN_SIZE); LoadBgTiles(0, gTextWindowFrame1_Gfx, 0x120, 0x214); InitWindows(sDummyWindowTemplate); sWindowIds[TEXT_WIN_ID] = AddWindowWithoutTileMap(sWindowTemplate_Text); - SetWindowAttribute(sWindowIds[TEXT_WIN_ID], 7, (u32)&gDecompressionBuffer[0x2800]); + SetWindowAttribute(sWindowIds[TEXT_WIN_ID], 7, (u32)&sSaveFailedBuffers->window1TileData); sWindowIds[CLOCK_WIN_ID] = AddWindowWithoutTileMap(sWindowTemplate_Clock); - SetWindowAttribute(sWindowIds[CLOCK_WIN_ID], 7, (u32)&gDecompressionBuffer[0x3D00]); + SetWindowAttribute(sWindowIds[CLOCK_WIN_ID], 7, (u32)&sSaveFailedBuffers->window2TileData); DeactivateAllTextPrinters(); ResetSpriteData(); ResetTasks(); @@ -318,6 +329,7 @@ static void CB2_ReturnToTitleScreen(void) { if (!UpdatePaletteFade()) { + TRY_FREE_AND_SET_NULL(sSaveFailedBuffers); if (gGameContinueCallback == NULL) // no callback exists, so do a soft reset. { DoSoftReset(); diff --git a/src/scanline_effect.c b/src/scanline_effect.c index 684c89546a..ce9bf190ab 100644 --- a/src/scanline_effect.c +++ b/src/scanline_effect.c @@ -38,8 +38,6 @@ void ScanlineEffect_Clear(void) gScanlineEffect.dmaControl = 0; gScanlineEffect.srcBuffer = 0; gScanlineEffect.state = 0; - gScanlineEffect.unused16 = 0; - gScanlineEffect.unused17 = 0; gScanlineEffect.waveTaskId = TASK_NONE; } @@ -65,8 +63,6 @@ void ScanlineEffect_SetParams(struct ScanlineEffectParams params) gScanlineEffect.dmaControl = params.dmaControl; gScanlineEffect.dmaDest = params.dmaDest; gScanlineEffect.state = params.initState; - gScanlineEffect.unused16 = params.unused9; - gScanlineEffect.unused17 = params.unused9; } void ScanlineEffect_InitHBlankDmaTransfer(void) diff --git a/src/scrcmd.c b/src/scrcmd.c index 9b4d00143a..f988bff6ea 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -29,6 +29,7 @@ #include "main.h" #include "menu.h" #include "money.h" +#include "move.h" #include "mystery_event_script.h" #include "palette.h" #include "party_menu.h" @@ -100,16 +101,22 @@ static u8 *const sScriptStringVars[] = bool8 ScrCmd_nop(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + return FALSE; } bool8 ScrCmd_nop1(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + return FALSE; } bool8 ScrCmd_end(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + FlagClear(FLAG_SAFE_FOLLOWER_MOVEMENT); StopScript(ctx); return FALSE; @@ -119,6 +126,9 @@ bool8 ScrCmd_gotonative(struct ScriptContext *ctx) { bool8 (*addr)(void) = (bool8 (*)(void))ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + Script_CheckEffectInstrumentedGotoNative(addr); + SetupNativeScript(ctx, addr); return TRUE; } @@ -127,15 +137,24 @@ bool8 ScrCmd_special(struct ScriptContext *ctx) { u16 index = ScriptReadHalfword(ctx); + Script_RequestEffects(SCREFF_V1); + Script_CheckEffectInstrumentedSpecial(index); + gSpecials[index](); return FALSE; } bool8 ScrCmd_specialvar(struct ScriptContext *ctx) { - u16 *var = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); + u16 index = ScriptReadHalfword(ctx); + u16 *ptr = GetVarPointer(varId); - *var = gSpecials[ScriptReadHalfword(ctx)](); + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + Script_CheckEffectInstrumentedSpecial(index); + + *ptr = gSpecials[index](); return FALSE; } @@ -143,12 +162,17 @@ bool8 ScrCmd_callnative(struct ScriptContext *ctx) { NativeFunc func = (NativeFunc)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + Script_CheckEffectInstrumentedCallNative(func); + func(ctx); return FALSE; } bool8 ScrCmd_waitstate(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + ScriptContext_Stop(); return TRUE; } @@ -157,12 +181,16 @@ bool8 ScrCmd_goto(struct ScriptContext *ctx) { const u8 *ptr = (const u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + ScriptJump(ctx, ptr); return FALSE; } bool8 ScrCmd_return(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + ScriptReturn(ctx); return FALSE; } @@ -171,6 +199,8 @@ bool8 ScrCmd_call(struct ScriptContext *ctx) { const u8 *ptr = (const u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + ScriptCall(ctx, ptr); return FALSE; } @@ -180,6 +210,8 @@ bool8 ScrCmd_goto_if(struct ScriptContext *ctx) u8 condition = ScriptReadByte(ctx); const u8 *ptr = (const u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptJump(ctx, ptr); return FALSE; @@ -190,6 +222,8 @@ bool8 ScrCmd_call_if(struct ScriptContext *ctx) u8 condition = ScriptReadByte(ctx); const u8 *ptr = (const u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptCall(ctx, ptr); return FALSE; @@ -200,6 +234,8 @@ bool8 ScrCmd_setvaddress(struct ScriptContext *ctx) u32 addr1 = (u32)ctx->scriptPtr - 1; u32 addr2 = ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + sAddressOffset = addr2 - addr1; return FALSE; } @@ -208,6 +244,8 @@ bool8 ScrCmd_vgoto(struct ScriptContext *ctx) { u32 addr = ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + ScriptJump(ctx, (u8 *)(addr - sAddressOffset)); return FALSE; } @@ -216,6 +254,8 @@ bool8 ScrCmd_vcall(struct ScriptContext *ctx) { u32 addr = ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + ScriptCall(ctx, (u8 *)(addr - sAddressOffset)); return FALSE; } @@ -225,6 +265,8 @@ bool8 ScrCmd_vgoto_if(struct ScriptContext *ctx) u8 condition = ScriptReadByte(ctx); const u8 *ptr = (const u8 *)(ScriptReadWord(ctx) - sAddressOffset); + Script_RequestEffects(SCREFF_V1); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptJump(ctx, ptr); return FALSE; @@ -235,6 +277,8 @@ bool8 ScrCmd_vcall_if(struct ScriptContext *ctx) u8 condition = ScriptReadByte(ctx); const u8 *ptr = (const u8 *)(ScriptReadWord(ctx) - sAddressOffset); + Script_RequestEffects(SCREFF_V1); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptCall(ctx, ptr); return FALSE; @@ -245,6 +289,8 @@ bool8 ScrCmd_gotostd(struct ScriptContext *ctx) u8 index = ScriptReadByte(ctx); const u8 **ptr = &gStdScripts[index]; + Script_RequestEffects(SCREFF_V1); + if (ptr < gStdScripts_End) ScriptJump(ctx, *ptr); return FALSE; @@ -255,6 +301,8 @@ bool8 ScrCmd_callstd(struct ScriptContext *ctx) u8 index = ScriptReadByte(ctx); const u8 **ptr = &gStdScripts[index]; + Script_RequestEffects(SCREFF_V1); + if (ptr < gStdScripts_End) ScriptCall(ctx, *ptr); return FALSE; @@ -265,6 +313,8 @@ bool8 ScrCmd_gotostd_if(struct ScriptContext *ctx) u8 condition = ScriptReadByte(ctx); u8 index = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) { const u8 **ptr = &gStdScripts[index]; @@ -279,6 +329,8 @@ bool8 ScrCmd_callstd_if(struct ScriptContext *ctx) u8 condition = ScriptReadByte(ctx); u8 index = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) { const u8 **ptr = &gStdScripts[index]; @@ -290,12 +342,16 @@ bool8 ScrCmd_callstd_if(struct ScriptContext *ctx) bool8 ScrCmd_returnram(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + ScriptJump(ctx, gRamScriptRetAddr); return FALSE; } bool8 ScrCmd_endram(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + FlagClear(FLAG_SAFE_FOLLOWER_MOVEMENT); ClearRamScript(); StopScript(ctx); @@ -306,6 +362,8 @@ bool8 ScrCmd_setmysteryeventstatus(struct ScriptContext *ctx) { u8 status = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + SetMysteryEventScriptStatus(status); return FALSE; } @@ -314,6 +372,8 @@ bool8 ScrCmd_loadword(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + ctx->data[index] = ScriptReadWord(ctx); return FALSE; } @@ -322,6 +382,8 @@ bool8 ScrCmd_loadbytefromptr(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + ctx->data[index] = *(const u8 *)ScriptReadWord(ctx); return FALSE; } @@ -330,6 +392,9 @@ bool8 ScrCmd_setptr(struct ScriptContext *ctx) { u8 value = ScriptReadByte(ctx); + // TODO: Check if 'ptr' is within a save block? + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + *(u8 *)ScriptReadWord(ctx) = value; return FALSE; } @@ -338,6 +403,8 @@ bool8 ScrCmd_loadbyte(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + ctx->data[index] = ScriptReadByte(ctx); return FALSE; } @@ -346,6 +413,9 @@ bool8 ScrCmd_setptrbyte(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + // TODO: Check if 'ptr' is within a save block? + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + *(u8 *)ScriptReadWord(ctx) = ctx->data[index]; return FALSE; } @@ -355,6 +425,8 @@ bool8 ScrCmd_copylocal(struct ScriptContext *ctx) u8 destIndex = ScriptReadByte(ctx); u8 srcIndex = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + ctx->data[destIndex] = ctx->data[srcIndex]; return FALSE; } @@ -362,27 +434,46 @@ bool8 ScrCmd_copylocal(struct ScriptContext *ctx) bool8 ScrCmd_copybyte(struct ScriptContext *ctx) { u8 *ptr = (u8 *)ScriptReadWord(ctx); + + // TODO: Check if 'ptr' is within a save block? + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + *ptr = *(const u8 *)ScriptReadWord(ctx); return FALSE; } bool8 ScrCmd_setvar(struct ScriptContext *ctx) { - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); + u16 *ptr = GetVarPointer(varId); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + *ptr = ScriptReadHalfword(ctx); return FALSE; } bool8 ScrCmd_copyvar(struct ScriptContext *ctx) { - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); + u16 *ptr = GetVarPointer(varId); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + *ptr = *GetVarPointer(ScriptReadHalfword(ctx)); return FALSE; } bool8 ScrCmd_setorcopyvar(struct ScriptContext *ctx) { - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); + u16 *ptr = GetVarPointer(varId); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + *ptr = VarGet(ScriptReadHalfword(ctx)); return FALSE; } @@ -401,6 +492,8 @@ bool8 ScrCmd_compare_local_to_local(struct ScriptContext *ctx) const u8 value1 = ctx->data[ScriptReadByte(ctx)]; const u8 value2 = ctx->data[ScriptReadByte(ctx)]; + Script_RequestEffects(SCREFF_V1); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -410,6 +503,8 @@ bool8 ScrCmd_compare_local_to_value(struct ScriptContext *ctx) const u8 value1 = ctx->data[ScriptReadByte(ctx)]; const u8 value2 = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -419,6 +514,8 @@ bool8 ScrCmd_compare_local_to_ptr(struct ScriptContext *ctx) const u8 value1 = ctx->data[ScriptReadByte(ctx)]; const u8 value2 = *(const u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -428,6 +525,8 @@ bool8 ScrCmd_compare_ptr_to_local(struct ScriptContext *ctx) const u8 value1 = *(const u8 *)ScriptReadWord(ctx); const u8 value2 = ctx->data[ScriptReadByte(ctx)]; + Script_RequestEffects(SCREFF_V1); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -437,6 +536,8 @@ bool8 ScrCmd_compare_ptr_to_value(struct ScriptContext *ctx) const u8 value1 = *(const u8 *)ScriptReadWord(ctx); const u8 value2 = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -446,6 +547,8 @@ bool8 ScrCmd_compare_ptr_to_ptr(struct ScriptContext *ctx) const u8 value1 = *(const u8 *)ScriptReadWord(ctx); const u8 value2 = *(const u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -455,6 +558,8 @@ bool8 ScrCmd_compare_var_to_value(struct ScriptContext *ctx) const u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); const u16 value2 = ScriptReadHalfword(ctx); + Script_RequestEffects(SCREFF_V1); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -464,6 +569,8 @@ bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx) const u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); const u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + ctx->comparisonResult = Compare(*ptr1, *ptr2); return FALSE; } @@ -473,14 +580,24 @@ bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx) // in the contest scripts to `subvar VAR_*, 1`, else contests will break. bool8 ScrCmd_addvar(struct ScriptContext *ctx) { - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); + u16 *ptr = GetVarPointer(varId); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + *ptr += ScriptReadHalfword(ctx); return FALSE; } bool8 ScrCmd_subvar(struct ScriptContext *ctx) { - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); + u16 *ptr = GetVarPointer(varId); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + *ptr -= VarGet(ScriptReadHalfword(ctx)); return FALSE; } @@ -489,6 +606,8 @@ bool8 ScrCmd_random(struct ScriptContext *ctx) { u16 max = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = Random() % max; return FALSE; } @@ -498,6 +617,8 @@ bool8 ScrCmd_additem(struct ScriptContext *ctx) u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + gSpecialVar_Result = AddBagItem(itemId, quantity); return FALSE; } @@ -507,6 +628,8 @@ bool8 ScrCmd_removeitem(struct ScriptContext *ctx) u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + gSpecialVar_Result = RemoveBagItem(itemId, quantity); return FALSE; } @@ -516,6 +639,8 @@ bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx) u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = CheckBagHasSpace(itemId, quantity); return FALSE; } @@ -525,6 +650,8 @@ bool8 ScrCmd_checkitem(struct ScriptContext *ctx) u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = CheckBagHasItem(itemId, quantity); return FALSE; } @@ -533,6 +660,8 @@ bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = GetPocketByItemId(itemId); return FALSE; } @@ -542,6 +671,8 @@ bool8 ScrCmd_addpcitem(struct ScriptContext *ctx) u16 itemId = VarGet(ScriptReadHalfword(ctx)); u16 quantity = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + gSpecialVar_Result = AddPCItem(itemId, quantity); return FALSE; } @@ -551,6 +682,8 @@ bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx) u16 itemId = VarGet(ScriptReadHalfword(ctx)); u16 quantity = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = CheckPCHasItem(itemId, quantity); return FALSE; } @@ -559,6 +692,8 @@ bool8 ScrCmd_adddecoration(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + gSpecialVar_Result = DecorationAdd(decorId); return FALSE; } @@ -567,6 +702,8 @@ bool8 ScrCmd_removedecoration(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + gSpecialVar_Result = DecorationRemove(decorId); return FALSE; } @@ -575,6 +712,8 @@ bool8 ScrCmd_checkdecorspace(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = DecorationCheckSpace(decorId); return FALSE; } @@ -583,44 +722,68 @@ bool8 ScrCmd_checkdecor(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = CheckHasDecoration(decorId); return FALSE; } bool8 ScrCmd_setflag(struct ScriptContext *ctx) { - FlagSet(ScriptReadHalfword(ctx)); + u32 flagId = ScriptReadHalfword(ctx); + + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + + FlagSet(flagId); return FALSE; } bool8 ScrCmd_clearflag(struct ScriptContext *ctx) { - FlagClear(ScriptReadHalfword(ctx)); + u32 flagId = ScriptReadHalfword(ctx); + + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + + FlagClear(flagId); return FALSE; } bool8 ScrCmd_checkflag(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + ctx->comparisonResult = FlagGet(ScriptReadHalfword(ctx)); return FALSE; } bool8 ScrCmd_incrementgamestat(struct ScriptContext *ctx) { - IncrementGameStat(ScriptReadByte(ctx)); + u32 statId = ScriptReadByte(ctx); + + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + + IncrementGameStat(statId); return FALSE; } bool8 ScrCmd_animateflash(struct ScriptContext *ctx) { - AnimateFlash(ScriptReadByte(ctx)); + u32 level = ScriptReadByte(ctx); + + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + + AnimateFlash(level); ScriptContext_Stop(); return TRUE; } bool8 ScrCmd_setflashlevel(struct ScriptContext *ctx) { - SetFlashLevel(VarGet(ScriptReadHalfword(ctx))); + u32 level = VarGet(ScriptReadHalfword(ctx)); + + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + + SetFlashLevel(level); return FALSE; } @@ -634,7 +797,11 @@ static bool8 IsPaletteNotActive(void) bool8 ScrCmd_fadescreen(struct ScriptContext *ctx) { - FadeScreen(ScriptReadByte(ctx), 0); + u32 mode = ScriptReadByte(ctx); + + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + + FadeScreen(mode, 0); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } @@ -644,27 +811,41 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx) u8 mode = ScriptReadByte(ctx); u8 speed = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + FadeScreen(mode, speed); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } +static EWRAM_DATA u32 *sPalBuffer = NULL; + bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) { u8 mode = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + switch (mode) { case FADE_TO_BLACK: case FADE_TO_WHITE: default: - CpuCopy32(gPlttBufferUnfaded, gDecompressionBuffer, PLTT_SIZE); - FadeScreen(mode, 0); + if (sPalBuffer == NULL) + { + sPalBuffer = Alloc(PLTT_SIZE); + CpuCopy32(gPlttBufferUnfaded, sPalBuffer, PLTT_SIZE); + FadeScreen(mode, 0); + } break; case FADE_FROM_BLACK: case FADE_FROM_WHITE: - CpuCopy32(gDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE); - FadeScreen(mode, 0); + if (sPalBuffer != NULL) + { + CpuCopy32(sPalBuffer, gPlttBufferUnfaded, PLTT_SIZE); + FadeScreen(mode, 0); + FREE_AND_SET_NULL(sPalBuffer); + } break; } @@ -682,7 +863,11 @@ static bool8 RunPauseTimer(void) bool8 ScrCmd_delay(struct ScriptContext *ctx) { - sPauseCounter = ScriptReadHalfword(ctx); + u32 frames = ScriptReadHalfword(ctx); + + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + + sPauseCounter = frames; SetupNativeScript(ctx, RunPauseTimer); return TRUE; } @@ -692,18 +877,24 @@ bool8 ScrCmd_initclock(struct ScriptContext *ctx) u8 hour = VarGet(ScriptReadHalfword(ctx)); u8 minute = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + RtcInitLocalTimeOffset(hour, minute); return FALSE; } bool8 ScrCmd_dotimebasedevents(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + DoTimeBasedEvents(); return FALSE; } bool8 ScrCmd_gettime(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + RtcCalcLocalTime(); gSpecialVar_0x8000 = gLocalTime.hours; gSpecialVar_0x8001 = gLocalTime.minutes; @@ -715,25 +906,35 @@ bool8 ScrCmd_setweather(struct ScriptContext *ctx) { u16 weather = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + SetSavedWeather(weather); return FALSE; } bool8 ScrCmd_resetweather(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + SetSavedWeatherFromCurrMapHeader(); return FALSE; } bool8 ScrCmd_doweather(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + DoCurrentWeather(); return FALSE; } bool8 ScrCmd_setstepcallback(struct ScriptContext *ctx) { - ActivatePerStepCallback(ScriptReadByte(ctx)); + u32 callbackId = ScriptReadByte(ctx); + + Script_RequestEffects(SCREFF_V1); + + ActivatePerStepCallback(callbackId); return FALSE; } @@ -741,6 +942,8 @@ bool8 ScrCmd_setmaplayoutindex(struct ScriptContext *ctx) { u16 value = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + SetCurrentMapLayout(value); return FALSE; } @@ -753,6 +956,8 @@ bool8 ScrCmd_warp(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); DoWarp(); ResetInitialPlayerAvatarState(); @@ -767,6 +972,8 @@ bool8 ScrCmd_warpsilent(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); DoDiveWarp(); ResetInitialPlayerAvatarState(); @@ -781,6 +988,8 @@ bool8 ScrCmd_warpdoor(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); DoDoorWarp(); ResetInitialPlayerAvatarState(); @@ -794,6 +1003,8 @@ bool8 ScrCmd_warphole(struct ScriptContext *ctx) s16 x; s16 y; + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + PlayerGetDestCoords(&x, &y); if (mapGroup == MAP_GROUP(UNDEFINED) && mapNum == MAP_NUM(UNDEFINED)) SetWarpDestinationToFixedHoleWarp(x - MAP_OFFSET, y - MAP_OFFSET); @@ -813,6 +1024,8 @@ bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); DoTeleportTileWarp(); ResetInitialPlayerAvatarState(); @@ -827,6 +1040,8 @@ bool8 ScrCmd_warpmossdeepgym(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); DoMossdeepGymWarp(); ResetInitialPlayerAvatarState(); @@ -841,6 +1056,8 @@ bool8 ScrCmd_setwarp(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); return FALSE; } @@ -853,6 +1070,8 @@ bool8 ScrCmd_setdynamicwarp(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + SetDynamicWarpWithCoords(0, mapGroup, mapNum, warpId, x, y); return FALSE; } @@ -865,6 +1084,8 @@ bool8 ScrCmd_setdivewarp(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + SetFixedDiveWarp(mapGroup, mapNum, warpId, x, y); return FALSE; } @@ -877,6 +1098,8 @@ bool8 ScrCmd_setholewarp(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + SetFixedHoleWarp(mapGroup, mapNum, warpId, x, y); return FALSE; } @@ -889,14 +1112,22 @@ bool8 ScrCmd_setescapewarp(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + SetEscapeWarp(mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx) { - u16 *pX = GetVarPointer(ScriptReadHalfword(ctx)); - u16 *pY = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varIdX = ScriptReadHalfword(ctx); + u32 varIdY = ScriptReadHalfword(ctx); + u16 *pX = GetVarPointer(varIdX); + u16 *pY = GetVarPointer(varIdY); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varIdX); + Script_RequestWriteVar(varIdY); *pX = gSaveBlock1Ptr->pos.x; *pY = gSaveBlock1Ptr->pos.y; @@ -905,13 +1136,19 @@ bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx) bool8 ScrCmd_getpartysize(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = CalculatePlayerPartyCount(); return FALSE; } bool8 ScrCmd_playse(struct ScriptContext *ctx) { - PlaySE(ScriptReadHalfword(ctx)); + u32 songId = ScriptReadHalfword(ctx); + + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + + PlaySE(songId); return FALSE; } @@ -925,13 +1162,19 @@ static bool8 WaitForSoundEffectFinish(void) bool8 ScrCmd_waitse(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + SetupNativeScript(ctx, WaitForSoundEffectFinish); return TRUE; } bool8 ScrCmd_playfanfare(struct ScriptContext *ctx) { - PlayFanfare(ScriptReadHalfword(ctx)); + u32 songId = ScriptReadHalfword(ctx); + + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + + PlayFanfare(songId); return FALSE; } @@ -942,6 +1185,8 @@ static bool8 WaitForFanfareFinish(void) bool8 ScrCmd_waitfanfare(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + SetupNativeScript(ctx, WaitForFanfareFinish); return TRUE; } @@ -951,6 +1196,8 @@ bool8 ScrCmd_playbgm(struct ScriptContext *ctx) u16 songId = ScriptReadHalfword(ctx); bool8 save = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + if (save == TRUE) Overworld_SetSavedMusic(songId); PlayNewMapMusic(songId); @@ -959,18 +1206,24 @@ bool8 ScrCmd_playbgm(struct ScriptContext *ctx) bool8 ScrCmd_savebgm(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + Overworld_SetSavedMusic(ScriptReadHalfword(ctx)); return FALSE; } bool8 ScrCmd_fadedefaultbgm(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + Overworld_ChangeMusicToDefault(); return FALSE; } bool8 ScrCmd_fadenewbgm(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + Overworld_ChangeMusicTo(ScriptReadHalfword(ctx)); return FALSE; } @@ -979,6 +1232,8 @@ bool8 ScrCmd_fadeoutbgm(struct ScriptContext *ctx) { u8 speed = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + if (speed != 0) FadeOutBGMTemporarily(4 * speed); else @@ -991,6 +1246,8 @@ bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx) { u8 speed = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + if (speed != 0) FadeInBGM(4 * speed); else @@ -1019,6 +1276,8 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx) const u8 *movementScript = (const u8 *)ScriptReadWord(ctx); struct ObjectEvent *objEvent; + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + // When applying script movements to follower, it may have frozen animation that must be cleared if ((localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen) || ((objEvent = &gObjectEvents[GetObjectEventIdByLocalId(localId)]) && IS_OW_MON_OBJ(objEvent))) @@ -1046,6 +1305,8 @@ bool8 ScrCmd_applymovementat(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + gObjectEvents[GetObjectEventIdByLocalId(localId)].directionOverwrite = DIR_NONE; ScriptMovement_StartObjectMovementScript(localId, mapNum, mapGroup, movementScript); sMovingNpcId = localId; @@ -1070,6 +1331,8 @@ bool8 ScrCmd_waitmovement(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (localId != 0) sMovingNpcId = localId; sMovingNpcMapGroup = gSaveBlock1Ptr->location.mapGroup; @@ -1084,6 +1347,8 @@ bool8 ScrCmd_waitmovementat(struct ScriptContext *ctx) u8 mapGroup; u8 mapNum; + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (localId != 0) sMovingNpcId = localId; mapGroup = ScriptReadByte(ctx); @@ -1098,6 +1363,8 @@ bool8 ScrCmd_removeobject(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + RemoveObjectEventByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); return FALSE; } @@ -1108,6 +1375,8 @@ bool8 ScrCmd_removeobjectat(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + RemoveObjectEventByLocalIdAndMap(objectId, mapNum, mapGroup); return FALSE; } @@ -1116,6 +1385,8 @@ bool8 ScrCmd_addobject(struct ScriptContext *ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + TrySpawnObjectEvent(objectId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); return FALSE; } @@ -1126,6 +1397,8 @@ bool8 ScrCmd_addobjectat(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + TrySpawnObjectEvent(objectId, mapNum, mapGroup); return FALSE; } @@ -1136,6 +1409,8 @@ bool8 ScrCmd_setobjectxy(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + TryMoveObjectEventToMapCoords(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, x, y); return FALSE; } @@ -1146,6 +1421,8 @@ bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + SetObjEventTemplateCoords(localId, x, y); return FALSE; } @@ -1154,6 +1431,8 @@ bool8 ScrCmd_copyobjectxytoperm(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + TryOverrideObjectEventTemplateCoords(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); return FALSE; } @@ -1164,6 +1443,8 @@ bool8 ScrCmd_showobjectat(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + SetObjectInvisibility(localId, mapNum, mapGroup, FALSE); return FALSE; } @@ -1174,6 +1455,8 @@ bool8 ScrCmd_hideobjectat(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + SetObjectInvisibility(localId, mapNum, mapGroup, TRUE); return FALSE; } @@ -1185,6 +1468,8 @@ bool8 ScrCmd_setobjectsubpriority(struct ScriptContext *ctx) u8 mapNum = ScriptReadByte(ctx); u8 priority = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + SetObjectSubpriority(localId, mapNum, mapGroup, priority + 83); return FALSE; } @@ -1195,12 +1480,16 @@ bool8 ScrCmd_resetobjectsubpriority(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + ResetObjectSubpriority(localId, mapNum, mapGroup); return FALSE; } bool8 ScrCmd_faceplayer(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (gObjectEvents[gSelectedObjectEvent].active) ObjectEventFaceOppositeDirection(&gObjectEvents[gSelectedObjectEvent], GetPlayerFacingDirection()); return FALSE; @@ -1211,6 +1500,8 @@ bool8 ScrCmd_turnobject(struct ScriptContext *ctx) u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 direction = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + ObjectEventTurnByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, direction); return FALSE; } @@ -1220,6 +1511,8 @@ bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx) u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 movementType = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + SetObjEventTemplateMovementType(localId, movementType); return FALSE; } @@ -1233,6 +1526,8 @@ bool8 ScrCmd_createvobject(struct ScriptContext *ctx) u8 elevation = ScriptReadByte(ctx); u8 direction = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + CreateVirtualObject(graphicsId, virtualObjId, x, y, elevation, direction); return FALSE; } @@ -1242,6 +1537,8 @@ bool8 ScrCmd_turnvobject(struct ScriptContext *ctx) u8 virtualObjId = ScriptReadByte(ctx); u8 direction = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + TurnVirtualObject(virtualObjId, direction); return FALSE; } @@ -1250,6 +1547,8 @@ bool8 ScrCmd_turnvobject(struct ScriptContext *ctx) // The player is frozen after waiting for their current movement to finish. bool8 ScrCmd_lockall(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (IsOverworldLinkActive()) { return FALSE; @@ -1269,6 +1568,8 @@ bool8 ScrCmd_lockall(struct ScriptContext *ctx) // The player and selected object are frozen after waiting for their current movement to finish. bool8 ScrCmd_lock(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (IsOverworldLinkActive()) { return FALSE; @@ -1297,6 +1598,8 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx) bool8 ScrCmd_releaseall(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + u8 playerObjectId; struct ObjectEvent *followerObject = GetFollowerObject(); // Release follower from movement iff it exists and is in the shadowing state @@ -1314,6 +1617,8 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx) bool8 ScrCmd_release(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + u8 playerObjectId; struct ObjectEvent *followerObject = GetFollowerObject(); // Release follower from movement iff it exists and is in the shadowing state @@ -1335,6 +1640,8 @@ bool8 ScrCmd_message(struct ScriptContext *ctx) { const u8 *msg = (const u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (msg == NULL) msg = (const u8 *)ctx->data[0]; ShowFieldMessage(msg); @@ -1345,6 +1652,8 @@ bool8 ScrCmd_pokenavcall(struct ScriptContext *ctx) { const u8 *msg = (const u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (msg == NULL) msg = (const u8 *)ctx->data[0]; ShowPokenavFieldMessage(msg); @@ -1355,6 +1664,8 @@ bool8 ScrCmd_messageautoscroll(struct ScriptContext *ctx) { const u8 *msg = (const u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (msg == NULL) msg = (const u8 *)ctx->data[0]; gTextFlags.autoScroll = TRUE; @@ -1368,6 +1679,8 @@ bool8 ScrCmd_messageinstant(struct ScriptContext *ctx) { const u8 *msg = (const u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (msg == NULL) msg = (const u8 *)ctx->data[0]; LoadMessageBoxAndBorderGfx(); @@ -1378,12 +1691,16 @@ bool8 ScrCmd_messageinstant(struct ScriptContext *ctx) bool8 ScrCmd_waitmessage(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + SetupNativeScript(ctx, IsFieldMessageBoxHidden); return TRUE; } bool8 ScrCmd_closemessage(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + HideFieldMessageBox(); return FALSE; } @@ -1399,6 +1716,8 @@ static bool8 WaitForAorBPress(void) bool8 ScrCmd_waitbuttonpress(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + SetupNativeScript(ctx, WaitForAorBPress); return TRUE; } @@ -1408,6 +1727,8 @@ bool8 ScrCmd_yesnobox(struct ScriptContext *ctx) u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (ScriptMenu_YesNo(left, top) == TRUE) { ScriptContext_Stop(); @@ -1454,6 +1775,8 @@ bool8 ScrCmd_dynmultichoice(struct ScriptContext *ctx) u32 argc = ScriptReadByte(ctx); struct ListMenuItem *items; + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (argc == 0) return FALSE; @@ -1503,9 +1826,12 @@ bool8 ScrCmd_dynmultichoice(struct ScriptContext *ctx) bool8 ScrCmd_dynmultipush(struct ScriptContext *ctx) { - u8 *nameBuffer = Alloc(100); const u8 *name = (const u8*) ScriptReadWord(ctx); u32 id = VarGet(ScriptReadHalfword(ctx)); + + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + + u8 *nameBuffer = Alloc(100); struct ListMenuItem item; StringExpandPlaceholders(nameBuffer, name); item.name = nameBuffer; @@ -1521,6 +1847,8 @@ bool8 ScrCmd_multichoice(struct ScriptContext *ctx) u8 multichoiceId = ScriptReadByte(ctx); bool8 ignoreBPress = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (ScriptMenu_Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) { ScriptContext_Stop(); @@ -1540,6 +1868,8 @@ bool8 ScrCmd_multichoicedefault(struct ScriptContext *ctx) u8 defaultChoice = ScriptReadByte(ctx); bool8 ignoreBPress = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (ScriptMenu_MultichoiceWithDefault(left, top, multichoiceId, ignoreBPress, defaultChoice) == TRUE) { ScriptContext_Stop(); @@ -1570,6 +1900,8 @@ bool8 ScrCmd_multichoicegrid(struct ScriptContext *ctx) u8 numColumns = ScriptReadByte(ctx); bool8 ignoreBPress = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (ScriptMenu_MultichoiceGrid(left, top, multichoiceId, ignoreBPress, numColumns) == TRUE) { ScriptContext_Stop(); @@ -1613,12 +1945,16 @@ bool8 ScrCmd_showmonpic(struct ScriptContext *ctx) u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + ScriptMenu_ShowPokemonPic(species, x, y); return FALSE; } bool8 ScrCmd_hidemonpic(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + // The hide function returns a pointer to a function // that returns true once the pic is hidden bool8 (*func)(void) = ScriptMenu_HidePokemonPic(); @@ -1633,6 +1969,8 @@ bool8 ScrCmd_showcontestpainting(struct ScriptContext *ctx) { u8 contestWinnerId = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + // Artist's painting is temporary and already has its data loaded if (contestWinnerId != CONTEST_WINNER_ARTIST) SetContestWinnerForPainting(contestWinnerId); @@ -1645,6 +1983,9 @@ bool8 ScrCmd_showcontestpainting(struct ScriptContext *ctx) bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) { u8 *ptr = (u8 *)ScriptReadWord(ctx); + + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + struct WindowTemplate winTemplate; s32 i; u8 width, height; @@ -1698,6 +2039,8 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) bool8 ScrCmd_closebraillemessage(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + CloseBrailleWindow(); return FALSE; } @@ -1706,6 +2049,8 @@ bool8 ScrCmd_vmessage(struct ScriptContext *ctx) { u32 msg = ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + ShowFieldMessage((u8 *)(msg - sAddressOffset)); return FALSE; } @@ -1715,6 +2060,8 @@ bool8 ScrCmd_bufferspeciesname(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 species = VarGet(ScriptReadHalfword(ctx)) & OBJ_EVENT_MON_SPECIES_MASK; // ignore possible shiny / form bits + Script_RequestEffects(SCREFF_V1); + StringCopy(sScriptStringVars[stringVarIndex], GetSpeciesName(species)); return FALSE; } @@ -1723,6 +2070,8 @@ bool8 ScrCmd_bufferleadmonspeciesname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + u8 *dest = sScriptStringVars[stringVarIndex]; u8 partyIndex = GetLeadMonIndex(); u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); @@ -1734,6 +2083,8 @@ void BufferFirstLiveMonNickname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + GetMonData(GetFirstLiveMon(), MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]); StringGet_Nickname(sScriptStringVars[stringVarIndex]); } @@ -1743,6 +2094,8 @@ bool8 ScrCmd_bufferpartymonnick(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]); StringGet_Nickname(sScriptStringVars[stringVarIndex]); return FALSE; @@ -1753,6 +2106,8 @@ bool8 ScrCmd_bufferitemname(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 itemId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + CopyItemName(itemId, sScriptStringVars[stringVarIndex]); return FALSE; } @@ -1763,6 +2118,8 @@ bool8 ScrCmd_bufferitemnameplural(struct ScriptContext *ctx) u16 itemId = VarGet(ScriptReadHalfword(ctx)); u16 quantity = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + CopyItemNameHandlePlural(itemId, sScriptStringVars[stringVarIndex], quantity); return FALSE; } @@ -1772,6 +2129,8 @@ bool8 ScrCmd_bufferdecorationname(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 decorId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + StringCopy(sScriptStringVars[stringVarIndex], gDecorations[decorId].name); return FALSE; } @@ -1781,6 +2140,8 @@ bool8 ScrCmd_buffermovename(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 moveId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + StringCopy(sScriptStringVars[stringVarIndex], GetMoveName(moveId)); return FALSE; } @@ -1791,6 +2152,8 @@ bool8 ScrCmd_buffernumberstring(struct ScriptContext *ctx) u16 num = VarGet(ScriptReadHalfword(ctx)); u8 numDigits = CountDigits(num); + Script_RequestEffects(SCREFF_V1); + ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], num, STR_CONV_MODE_LEFT_ALIGN, numDigits); return FALSE; } @@ -1800,6 +2163,8 @@ bool8 ScrCmd_bufferstdstring(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 index = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + StringCopy(sScriptStringVars[stringVarIndex], gStdStrings[index]); return FALSE; } @@ -1809,6 +2174,8 @@ bool8 ScrCmd_buffercontestname(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 category = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + BufferContestName(sScriptStringVars[stringVarIndex], category); return FALSE; } @@ -1818,6 +2185,8 @@ bool8 ScrCmd_bufferstring(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); const u8 *text = (u8 *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + StringCopy(sScriptStringVars[stringVarIndex], text); return FALSE; } @@ -1826,6 +2195,8 @@ bool8 ScrCmd_vbuffermessage(struct ScriptContext *ctx) { const u8 *ptr = (u8 *)(ScriptReadWord(ctx) - sAddressOffset); + Script_RequestEffects(SCREFF_V1); + StringExpandPlaceholders(gStringVar4, ptr); return FALSE; } @@ -1835,6 +2206,8 @@ bool8 ScrCmd_vbufferstring(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u32 addr = ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1); + const u8 *src = (u8 *)(addr - sAddressOffset); u8 *dest = sScriptStringVars[stringVarIndex]; StringCopy(dest, src); @@ -1846,6 +2219,8 @@ bool8 ScrCmd_bufferboxname(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 boxId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + StringCopy(sScriptStringVars[stringVarIndex], GetBoxNamePtr(boxId)); return FALSE; } @@ -1854,6 +2229,8 @@ bool8 ScrCmd_giveegg(struct ScriptContext *ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + gSpecialVar_Result = ScriptGiveEgg(species); return FALSE; } @@ -1864,6 +2241,8 @@ bool8 ScrCmd_setmonmove(struct ScriptContext *ctx) u8 slot = ScriptReadByte(ctx); u16 move = ScriptReadHalfword(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + ScriptSetMonMoveSlot(partyIndex, move, slot); return FALSE; } @@ -1873,6 +2252,8 @@ bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx) u8 i; u16 moveId = ScriptReadHalfword(ctx); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = PARTY_SIZE; for (i = 0; i < PARTY_SIZE; i++) { @@ -1895,7 +2276,11 @@ bool8 ScrCmd_addmoney(struct ScriptContext *ctx) u8 ignore = ScriptReadByte(ctx); if (!ignore) + { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + AddMoney(&gSaveBlock1Ptr->money, amount); + } return FALSE; } @@ -1905,7 +2290,11 @@ bool8 ScrCmd_removemoney(struct ScriptContext *ctx) u8 ignore = ScriptReadByte(ctx); if (!ignore) + { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + RemoveMoney(&gSaveBlock1Ptr->money, amount); + } return FALSE; } @@ -1915,7 +2304,11 @@ bool8 ScrCmd_checkmoney(struct ScriptContext *ctx) u8 ignore = ScriptReadByte(ctx); if (!ignore) + { + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = IsEnoughMoney(&gSaveBlock1Ptr->money, amount); + } return FALSE; } @@ -1926,12 +2319,18 @@ bool8 ScrCmd_showmoneybox(struct ScriptContext *ctx) u8 ignore = ScriptReadByte(ctx); if (!ignore) + { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + DrawMoneyBox(GetMoney(&gSaveBlock1Ptr->money), x, y); + } return FALSE; } bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + /*u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx);*/ @@ -1946,7 +2345,11 @@ bool8 ScrCmd_updatemoneybox(struct ScriptContext *ctx) u8 ignore = ScriptReadByte(ctx); if (!ignore) + { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + ChangeAmountInMoneyBox(GetMoney(&gSaveBlock1Ptr->money)); + } return FALSE; } @@ -1955,6 +2358,8 @@ bool8 ScrCmd_showcoinsbox(struct ScriptContext *ctx) u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + ShowCoinsWindow(GetCoins(), x, y); return FALSE; } @@ -1964,6 +2369,8 @@ bool8 ScrCmd_hidecoinsbox(struct ScriptContext *ctx) u8 UNUSED x = ScriptReadByte(ctx); u8 UNUSED y = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + HideCoinsWindow(); return FALSE; } @@ -1973,30 +2380,41 @@ bool8 ScrCmd_updatecoinsbox(struct ScriptContext *ctx) u8 UNUSED x = ScriptReadByte(ctx); u8 UNUSED y = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + PrintCoinsString(GetCoins()); return FALSE; } bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_TRAINERBATTLE); + + TrainerBattleLoadArgs(ctx->scriptPtr); ctx->scriptPtr = BattleSetup_ConfigureTrainerBattle(ctx->scriptPtr); return FALSE; } bool8 ScrCmd_dotrainerbattle(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + BattleSetup_StartTrainerBattle(); return TRUE; } bool8 ScrCmd_gotopostbattlescript(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle(); return FALSE; } bool8 ScrCmd_gotobeatenscript(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript(); return FALSE; } @@ -2005,6 +2423,8 @@ bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + ctx->comparisonResult = HasTrainerBeenFought(index); return FALSE; } @@ -2013,6 +2433,8 @@ bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + SetTrainerFlag(index); return FALSE; } @@ -2021,6 +2443,8 @@ bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + ClearTrainerFlag(index); return FALSE; } @@ -2034,6 +2458,8 @@ bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx) u8 level2 = ScriptReadByte(ctx); u16 item2 = ScriptReadHalfword(ctx); + Script_RequestEffects(SCREFF_V1); + if(species2 == SPECIES_NONE) { CreateScriptedWildMon(species, level, item); @@ -2050,6 +2476,8 @@ bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx) bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (sIsScriptedWildDouble == FALSE) BattleSetup_StartScriptedWildBattle(); else @@ -2064,6 +2492,8 @@ bool8 ScrCmd_pokemart(struct ScriptContext *ctx) { const void *ptr = (void *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + CreatePokemartMenu(ptr); ScriptContext_Stop(); return TRUE; @@ -2073,6 +2503,8 @@ bool8 ScrCmd_pokemartdecoration(struct ScriptContext *ctx) { const void *ptr = (void *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + CreateDecorationShop1Menu(ptr); ScriptContext_Stop(); return TRUE; @@ -2083,6 +2515,8 @@ bool8 ScrCmd_pokemartdecoration2(struct ScriptContext *ctx) { const void *ptr = (void *)ScriptReadWord(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + CreateDecorationShop2Menu(ptr); ScriptContext_Stop(); return TRUE; @@ -2092,6 +2526,8 @@ bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx) { u8 machineId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + PlaySlotMachine(machineId, CB2_ReturnToFieldContinueScriptPlayMapMusic); ScriptContext_Stop(); return TRUE; @@ -2103,6 +2539,8 @@ bool8 ScrCmd_setberrytree(struct ScriptContext *ctx) u8 berry = ScriptReadByte(ctx); u8 growthStage = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + if (berry == 0) PlantBerryTree(treeId, berry, growthStage, FALSE); else @@ -2114,12 +2552,16 @@ bool8 ScrCmd_getpokenewsactive(struct ScriptContext *ctx) { u16 newsKind = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = IsPokeNewsActive(newsKind); return FALSE; } bool8 ScrCmd_choosecontestmon(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + ChooseContestMon(); ScriptContext_Stop(); return TRUE; @@ -2128,6 +2570,8 @@ bool8 ScrCmd_choosecontestmon(struct ScriptContext *ctx) bool8 ScrCmd_startcontest(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + StartContest(); ScriptContext_Stop(); return TRUE; @@ -2135,6 +2579,8 @@ bool8 ScrCmd_startcontest(struct ScriptContext *ctx) bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + ShowContestResults(); ScriptContext_Stop(); return TRUE; @@ -2142,6 +2588,8 @@ bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx) bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + ContestLinkTransfer(gSpecialVar_ContestCategory); ScriptContext_Stop(); return TRUE; @@ -2151,6 +2599,8 @@ bool8 ScrCmd_dofieldeffect(struct ScriptContext *ctx) { u16 effectId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + sFieldEffectScriptId = effectId; FieldEffectStart(sFieldEffectScriptId); return FALSE; @@ -2160,6 +2610,8 @@ bool8 ScrCmd_setfieldeffectargument(struct ScriptContext *ctx) { u8 argNum = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1); + gFieldEffectArguments[argNum] = (s16)VarGet(ScriptReadHalfword(ctx)); return FALSE; } @@ -2174,7 +2626,11 @@ static bool8 WaitForFieldEffectFinish(void) bool8 ScrCmd_waitfieldeffect(struct ScriptContext *ctx) { - sFieldEffectScriptId = VarGet(ScriptReadHalfword(ctx)); + u32 scriptId = VarGet(ScriptReadHalfword(ctx)); + + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + + sFieldEffectScriptId = scriptId; SetupNativeScript(ctx, WaitForFieldEffectFinish); return TRUE; } @@ -2183,12 +2639,16 @@ bool8 ScrCmd_setrespawn(struct ScriptContext *ctx) { u16 healLocationId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + SetLastHealLocationWarp(healLocationId); return FALSE; } bool8 ScrCmd_checkplayergender(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = gSaveBlock2Ptr->playerGender; return FALSE; } @@ -2198,17 +2658,23 @@ bool8 ScrCmd_playmoncry(struct ScriptContext *ctx) u16 species = VarGet(ScriptReadHalfword(ctx)); u16 mode = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + PlayCry_Script(species, mode); return FALSE; } void PlayFirstMonCry(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + PlayCry_Script(GetMonData(GetFirstLiveMon(), MON_DATA_SPECIES), CRY_MODE_NORMAL); } bool8 ScrCmd_waitmoncry(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + SetupNativeScript(ctx, IsCryFinished); return TRUE; } @@ -2220,6 +2686,8 @@ bool8 ScrCmd_setmetatile(struct ScriptContext *ctx) u16 metatileId = VarGet(ScriptReadHalfword(ctx)); bool16 isImpassable = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + x += MAP_OFFSET; y += MAP_OFFSET; if (!isImpassable) @@ -2234,6 +2702,8 @@ bool8 ScrCmd_opendoor(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + x += MAP_OFFSET; y += MAP_OFFSET; PlaySE(GetDoorSoundEffect(x, y)); @@ -2246,6 +2716,8 @@ bool8 ScrCmd_closedoor(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + x += MAP_OFFSET; y += MAP_OFFSET; FieldAnimateDoorClose(x, y); @@ -2262,6 +2734,8 @@ static bool8 IsDoorAnimationStopped(void) bool8 ScrCmd_waitdooranim(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + SetupNativeScript(ctx, IsDoorAnimationStopped); return TRUE; } @@ -2271,6 +2745,8 @@ bool8 ScrCmd_setdooropen(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + x += MAP_OFFSET; y += MAP_OFFSET; FieldSetDoorOpened(x, y); @@ -2282,6 +2758,8 @@ bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + x += MAP_OFFSET; y += MAP_OFFSET; FieldSetDoorClosed(x, y); @@ -2310,7 +2788,12 @@ bool8 ScrCmd_showelevmenu(struct ScriptContext *ctx) bool8 ScrCmd_checkcoins(struct ScriptContext *ctx) { - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); + u16 *ptr = GetVarPointer(varId); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + *ptr = GetCoins(); return FALSE; } @@ -2319,6 +2802,8 @@ bool8 ScrCmd_addcoins(struct ScriptContext *ctx) { u16 coins = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + if (AddCoins(coins) == TRUE) gSpecialVar_Result = FALSE; else @@ -2330,6 +2815,8 @@ bool8 ScrCmd_removecoins(struct ScriptContext *ctx) { u16 coins = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + if (RemoveCoins(coins) == TRUE) gSpecialVar_Result = FALSE; else @@ -2341,12 +2828,16 @@ bool8 ScrCmd_moverotatingtileobjects(struct ScriptContext *ctx) { u16 puzzleNumber = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + sMovingNpcId = MoveRotatingTileObjects(puzzleNumber); return FALSE; } bool8 ScrCmd_turnrotatingtileobjects(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + TurnRotatingTileObjects(); return FALSE; } @@ -2355,24 +2846,32 @@ bool8 ScrCmd_initrotatingtilepuzzle(struct ScriptContext *ctx) { u16 isTrickHouse = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + InitRotatingTilePuzzle(isTrickHouse); return FALSE; } bool8 ScrCmd_freerotatingtilepuzzle(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + FreeRotatingTilePuzzle(); return FALSE; } bool8 ScrCmd_selectapproachingtrainer(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + gSelectedObjectEvent = GetCurrentApproachingTrainerObjectEventId(); return FALSE; } bool8 ScrCmd_lockfortrainer(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + if (IsOverworldLinkActive()) { return FALSE; @@ -2394,6 +2893,8 @@ bool8 ScrCmd_setmodernfatefulencounter(struct ScriptContext *ctx) bool8 isModernFatefulEncounter = TRUE; u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + SetMonData(&gPlayerParty[partyIndex], MON_DATA_MODERN_FATEFUL_ENCOUNTER, &isModernFatefulEncounter); return FALSE; } @@ -2402,6 +2903,8 @@ bool8 ScrCmd_checkmodernfatefulencounter(struct ScriptContext *ctx) { u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MODERN_FATEFUL_ENCOUNTER, NULL); return FALSE; } @@ -2412,6 +2915,8 @@ bool8 ScrCmd_trywondercardscript(struct ScriptContext *ctx) if (script) { + Script_RequestEffects(SCREFF_V1); + gRamScriptRetAddr = ctx->scriptPtr; ScriptJump(ctx, script); } @@ -2428,6 +2933,8 @@ bool8 ScrCmd_warpspinenter(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); SetSpinStartFacingDir(GetPlayerFacingDirection()); DoSpinEnterWarp(); @@ -2440,6 +2947,8 @@ bool8 ScrCmd_setmonmetlocation(struct ScriptContext *ctx) u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); u8 location = ScriptReadByte(ctx); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + if (partyIndex < PARTY_SIZE) SetMonData(&gPlayerParty[partyIndex], MON_DATA_MET_LOCATION, &location); return FALSE; @@ -2456,6 +2965,8 @@ bool8 ScrCmd_buffertrainerclassname(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 trainerClassId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + StringCopy(sScriptStringVars[stringVarIndex], GetTrainerClassNameFromId(trainerClassId)); return FALSE; } @@ -2465,6 +2976,8 @@ bool8 ScrCmd_buffertrainername(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 trainerClassId = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + StringCopy(sScriptStringVars[stringVarIndex], GetTrainerNameFromId(trainerClassId)); return FALSE; } @@ -2482,6 +2995,8 @@ bool8 ScrCmd_warpwhitefade(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); DoWhiteFadeWarp(); ResetInitialPlayerAvatarState(); @@ -2490,12 +3005,17 @@ bool8 ScrCmd_warpwhitefade(struct ScriptContext *ctx) void ScriptSetDoubleBattleFlag(struct ScriptContext *ctx) { + Script_RequestEffects(SCREFF_V1); + sIsScriptedWildDouble = TRUE; } bool8 ScrCmd_removeallitem(struct ScriptContext *ctx) { u32 itemId = VarGet(ScriptReadHalfword(ctx)); + + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + u32 count = CountTotalItemQuantityInBag(itemId); gSpecialVar_Result = count; RemoveBagItem(itemId, count); @@ -2507,8 +3027,15 @@ bool8 ScrCmd_getobjectxy(struct ScriptContext *ctx) { u32 localId = VarGet(ScriptReadHalfword(ctx)); u32 useTemplate = VarGet(ScriptReadHalfword(ctx)); - u16 *pX = GetVarPointer(ScriptReadHalfword(ctx)); - u16 *pY = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varIdX = ScriptReadHalfword(ctx); + u32 varIdY = ScriptReadHalfword(ctx); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varIdX); + Script_RequestWriteVar(varIdY); + + u16 *pX = GetVarPointer(varIdX); + u16 *pY = GetVarPointer(varIdY); GetObjectPosition(pX, pY, localId, useTemplate); return FALSE; @@ -2518,7 +3045,12 @@ bool8 ScrCmd_checkobjectat(struct ScriptContext *ctx) { u32 x = VarGet(ScriptReadHalfword(ctx)) + 7; u32 y = VarGet(ScriptReadHalfword(ctx)) + 7; - u16 *varPointer = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + + u16 *varPointer = GetVarPointer(varId); *varPointer = CheckObjectAtXY(x, y); @@ -2528,7 +3060,13 @@ bool8 ScrCmd_checkobjectat(struct ScriptContext *ctx) bool8 Scrcmd_getsetpokedexflag(struct ScriptContext *ctx) { u32 speciesId = SpeciesToNationalPokedexNum(VarGet(ScriptReadHalfword(ctx))); - bool32 desiredFlag = VarGet(ScriptReadHalfword(ctx)); + u32 desiredFlag = VarGet(ScriptReadHalfword(ctx)); + + if (desiredFlag == FLAG_SET_CAUGHT || desiredFlag == FLAG_SET_SEEN) + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + else + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = GetSetPokedexFlag(speciesId, desiredFlag); if (desiredFlag == FLAG_SET_CAUGHT) @@ -2540,6 +3078,9 @@ bool8 Scrcmd_getsetpokedexflag(struct ScriptContext *ctx) bool8 Scrcmd_checkspecies(struct ScriptContext *ctx) { u32 givenSpecies = VarGet(ScriptReadHalfword(ctx)); + + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = CheckPartyHasSpecies(givenSpecies); return FALSE; @@ -2548,6 +3089,9 @@ bool8 Scrcmd_checkspecies(struct ScriptContext *ctx) bool8 Scrcmd_checkspecies_choose(struct ScriptContext *ctx) { u32 givenSpecies = VarGet(ScriptReadHalfword(ctx)); + + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES) == givenSpecies); return FALSE; @@ -2556,7 +3100,12 @@ bool8 Scrcmd_checkspecies_choose(struct ScriptContext *ctx) bool8 Scrcmd_getobjectfacingdirection(struct ScriptContext *ctx) { u32 objectId = VarGet(ScriptReadHalfword(ctx)); - u16 *varPointer = GetVarPointer(ScriptReadHalfword(ctx)); + u32 varId = ScriptReadHalfword(ctx); + + Script_RequestEffects(SCREFF_V1); + Script_RequestWriteVar(varId); + + u16 *varPointer = GetVarPointer(varId); *varPointer = gObjectEvents[GetObjectEventIdByLocalId(objectId)].facingDirection; @@ -2584,3 +3133,10 @@ bool8 ScrFunc_hidefollower(struct ScriptContext *ctx) // execute next script command with no delay return TRUE; } + +void Script_EndTrainerCanSeeIf(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + if (ctx->breakOnTrainerBattle && sScriptConditionTable[condition][ctx->comparisonResult] == 1) + StopScript(ctx); +} diff --git a/src/script.c b/src/script.c index acdaf3f241..3f0a005406 100644 --- a/src/script.c +++ b/src/script.c @@ -2,6 +2,8 @@ #include "script.h" #include "event_data.h" #include "mystery_gift.h" +#include "random.h" +#include "trainer_see.h" #include "util.h" #include "constants/event_objects.h" #include "constants/flags.h" @@ -51,6 +53,8 @@ void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTable for (i = 0; i < (int)ARRAY_COUNT(ctx->stack); i++) ctx->stack[i] = NULL; + + ctx->breakOnTrainerBattle = FALSE; } u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) @@ -261,6 +265,14 @@ void ScriptContext_SetupScript(const u8 *ptr) sGlobalScriptContextStatus = CONTEXT_RUNNING; } +// Moves a script from a local context to the global context and enables it. +void ScriptContext_ContinueScript(struct ScriptContext *ctx) +{ + sGlobalScriptContext = *ctx; + LockPlayerFieldControls(); + sGlobalScriptContextStatus = CONTEXT_RUNNING; +} + // Puts the script into waiting mode; usually called from a wait* script command. void ScriptContext_Stop(void) { @@ -284,7 +296,7 @@ void RunScriptImmediately(const u8 *ptr) while (RunScriptCommand(&sImmediateScriptContext) == TRUE); } -u8 *MapHeaderGetScriptTable(u8 tag) +const u8 *MapHeaderGetScriptTable(u8 tag) { const u8 *mapScripts = gMapHeader.mapScripts; @@ -306,14 +318,14 @@ u8 *MapHeaderGetScriptTable(u8 tag) void MapHeaderRunScriptType(u8 tag) { - u8 *ptr = MapHeaderGetScriptTable(tag); + const u8 *ptr = MapHeaderGetScriptTable(tag); if (ptr) RunScriptImmediately(ptr); } -u8 *MapHeaderCheckScriptTable(u8 tag) +const u8 *MapHeaderCheckScriptTable(u8 tag) { - u8 *ptr = MapHeaderGetScriptTable(tag); + const u8 *ptr = MapHeaderGetScriptTable(tag); if (!ptr) return NULL; @@ -335,7 +347,12 @@ u8 *MapHeaderCheckScriptTable(u8 tag) // Run map script if vars are equal if (VarGet(varIndex1) == VarGet(varIndex2)) - return T2_READ_PTR(ptr); + { + const u8 *mapScript = T2_READ_PTR(ptr); + if (!Script_HasNoEffect(mapScript)) + return mapScript; + } + ptr += 4; } } @@ -367,7 +384,7 @@ void RunOnDiveWarpMapScript(void) bool8 TryRunOnFrameMapScript(void) { - u8 *ptr = MapHeaderCheckScriptTable(MAP_SCRIPT_ON_FRAME_TABLE); + const u8 *ptr = MapHeaderCheckScriptTable(MAP_SCRIPT_ON_FRAME_TABLE); if (!ptr) return FALSE; @@ -378,7 +395,7 @@ bool8 TryRunOnFrameMapScript(void) void TryRunOnWarpIntoMapScript(void) { - u8 *ptr = MapHeaderCheckScriptTable(MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE); + const u8 *ptr = MapHeaderCheckScriptTable(MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE); if (ptr) RunScriptImmediately(ptr); } @@ -507,3 +524,116 @@ void InitRamScript_NoObjectEvent(u8 *script, u16 scriptSize) InitRamScript(script, scriptSize, MAP_GROUP(UNDEFINED), MAP_NUM(UNDEFINED), NO_OBJECT); #endif //FREE_MYSTERY_EVENT_BUFFERS } + +bool8 LoadTrainerObjectScript(void) +{ + sGlobalScriptContext.scriptPtr = gApproachingTrainers[gNoOfApproachingTrainers - 1].trainerScriptPtr; + return TRUE; +} + +struct ScriptEffectContext { + u32 breakOn; + intptr_t breakTo[5]; + const u8 *nextCmd; +}; + +struct ScriptEffectContext *gScriptEffectContext = NULL; + +static bool32 Script_IsEffectInstrumentedCommand(ScrCmdFunc func) +{ + // In ROM mirror 1. + return (((uintptr_t)func) & 0xE000000) == 0xA000000; +} + +/* 'setjmp' and 'longjmp' cause link errors, so we use + * '__builtin_setjmp' and '__builtin_longjmp' instead. + * See https://gcc.gnu.org/onlinedocs/gcc/Nonlocal-Gotos.html */ +static bool32 RunScriptImmediatelyUntilEffect_InternalLoop(struct ScriptContext *ctx) +{ + if (__builtin_setjmp(gScriptEffectContext->breakTo) == 0) + { + while (TRUE) + { + u32 cmdCode; + ScrCmdFunc *func; + + gScriptEffectContext->nextCmd = ctx->scriptPtr; + + if (!ctx->scriptPtr) + return FALSE; + + cmdCode = *ctx->scriptPtr; + ctx->scriptPtr++; + func = &ctx->cmdTable[cmdCode]; + + // Invalid script command. + if (func >= ctx->cmdTableEnd) + return TRUE; + + if (!Script_IsEffectInstrumentedCommand(*func)) + return TRUE; + + // Command which waits for a frame. + if ((*func)(ctx)) + { + gScriptEffectContext->nextCmd = ctx->scriptPtr; + return TRUE; + } + } + } + else + { + return TRUE; + } +} + +void Script_GotoBreak_Internal(void) +{ + __builtin_longjmp(gScriptEffectContext->breakTo, 1); +} + +bool32 RunScriptImmediatelyUntilEffect_Internal(u32 effects, const u8 *ptr, struct ScriptContext *ctx) +{ + bool32 result; + struct ScriptEffectContext seCtx; + seCtx.breakOn = effects & 0x7FFFFFFF; + + if (ctx == NULL) + ctx = &sImmediateScriptContext; + + InitScriptContext(ctx, gScriptCmdTable, gScriptCmdTableEnd); + if (effects & SCREFF_TRAINERBATTLE) + ctx->breakOnTrainerBattle = TRUE; + SetupBytecodeScript(ctx, ptr); + + rng_value_t rngValue = gRngValue; + gScriptEffectContext = &seCtx; + result = RunScriptImmediatelyUntilEffect_InternalLoop(ctx); + gScriptEffectContext = NULL; + gRngValue = rngValue; + + if (result) + ctx->scriptPtr = seCtx.nextCmd; + + return result; +} + +bool32 Script_HasNoEffect(const u8 *ptr) +{ + return !RunScriptImmediatelyUntilEffect(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE, ptr, NULL); +} + +void Script_RequestEffects_Internal(u32 effects) +{ + if (gScriptEffectContext->breakOn & effects) + __builtin_longjmp(gScriptEffectContext->breakTo, 1); +} + +void Script_RequestWriteVar_Internal(u32 varId) +{ + if (varId == 0) + return; + if (SPECIAL_VARS_START <= varId && varId <= SPECIAL_VARS_END) + return; + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); +} diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index fc248435a9..77ce6411db 100644 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -240,6 +240,9 @@ void CanHyperTrain(struct ScriptContext *ctx) { u32 stat = ScriptReadByte(ctx); u32 partyIndex = VarGet(ScriptReadHalfword(ctx)); + + Script_RequestEffects(SCREFF_V1); + if (stat < NUM_STATS && partyIndex < PARTY_SIZE && !GetMonData(&gPlayerParty[partyIndex], MON_DATA_HYPER_TRAINED_HP + stat) @@ -257,6 +260,9 @@ void HyperTrain(struct ScriptContext *ctx) { u32 stat = ScriptReadByte(ctx); u32 partyIndex = VarGet(ScriptReadHalfword(ctx)); + + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + if (stat < NUM_STATS && partyIndex < PARTY_SIZE) { bool32 data = TRUE; @@ -268,6 +274,9 @@ void HyperTrain(struct ScriptContext *ctx) void HasGigantamaxFactor(struct ScriptContext *ctx) { u32 partyIndex = VarGet(ScriptReadHalfword(ctx)); + + Script_RequestEffects(SCREFF_V1); + if (partyIndex < PARTY_SIZE) gSpecialVar_Result = GetMonData(&gPlayerParty[partyIndex], MON_DATA_GIGANTAMAX_FACTOR); else @@ -278,6 +287,8 @@ void ToggleGigantamaxFactor(struct ScriptContext *ctx) { u32 partyIndex = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + gSpecialVar_Result = FALSE; if (partyIndex < PARTY_SIZE) @@ -298,6 +309,8 @@ void CheckTeraType(struct ScriptContext *ctx) { u32 partyIndex = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1); + gSpecialVar_Result = TYPE_NONE; if (partyIndex < PARTY_SIZE) @@ -309,6 +322,8 @@ void SetTeraType(struct ScriptContext *ctx) u32 type = ScriptReadByte(ctx); u32 partyIndex = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + if (type < NUMBER_OF_MON_TYPES && partyIndex < PARTY_SIZE) SetMonData(&gPlayerParty[partyIndex], MON_DATA_TERA_TYPE, &type); } @@ -317,7 +332,7 @@ void SetTeraType(struct ScriptContext *ctx) * if side/slot are assigned, it will create the mon at the assigned party location * if slot == PARTY_SIZE, it will give the mon to first available party or storage slot */ -static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, u16 item, enum PokeBall ball, u8 nature, u8 abilityNum, u8 gender, u8 *evs, u8 *ivs, u16 *moves, bool8 isShiny, bool8 ggMaxFactor, u8 teraType) +static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, u16 item, enum PokeBall ball, u8 nature, u8 abilityNum, u8 gender, u8 *evs, u8 *ivs, u16 *moves, bool8 isShiny, bool8 gmaxFactor, u8 teraType, u8 dmaxLevel) { u16 nationalDexNum; int sentToPc; @@ -352,7 +367,10 @@ static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, u SetMonData(&mon, MON_DATA_IS_SHINY, &isShiny); // gigantamax factor - SetMonData(&mon, MON_DATA_GIGANTAMAX_FACTOR, &ggMaxFactor); + SetMonData(&mon, MON_DATA_GIGANTAMAX_FACTOR, &gmaxFactor); + + // Dynamax Level + SetMonData(&mon, MON_DATA_DYNAMAX_LEVEL, &dmaxLevel); // tera type if (teraType >= NUMBER_OF_MON_TYPES) @@ -461,7 +479,7 @@ u32 ScriptGiveMon(u16 species, u8 level, u16 item) MAX_PER_STAT_IVS + 1, MAX_PER_STAT_IVS + 1, MAX_PER_STAT_IVS + 1}; // ScriptGiveMonParameterized won't touch the stats' IV. u16 moves[MAX_MON_MOVES] = {MOVE_NONE, MOVE_NONE, MOVE_NONE, MOVE_NONE}; - return ScriptGiveMonParameterized(0, PARTY_SIZE, species, level, item, ITEM_POKE_BALL, NUM_NATURES, NUM_ABILITY_PERSONALITY, MON_GENDERLESS, evs, ivs, moves, FALSE, FALSE, NUMBER_OF_MON_TYPES); + return ScriptGiveMonParameterized(0, PARTY_SIZE, species, level, item, ITEM_POKE_BALL, NUM_NATURES, NUM_ABILITY_PERSONALITY, MON_GENDERLESS, evs, ivs, moves, FALSE, FALSE, NUMBER_OF_MON_TYPES, 0); } #define PARSE_FLAG(n, default_) (flags & (1 << (n))) ? VarGet(ScriptReadHalfword(ctx)) : (default_) @@ -535,14 +553,20 @@ void ScrCmd_createmon(struct ScriptContext *ctx) u16 move3 = PARSE_FLAG(19, MOVE_NONE); u16 move4 = PARSE_FLAG(20, MOVE_NONE); bool8 isShiny = PARSE_FLAG(21, FALSE); - bool8 ggMaxFactor = PARSE_FLAG(22, FALSE); + bool8 gmaxFactor = PARSE_FLAG(22, FALSE); u8 teraType = PARSE_FLAG(23, NUMBER_OF_MON_TYPES); + u8 dmaxLevel = PARSE_FLAG(24, 0); u8 evs[NUM_STATS] = {hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv}; u8 ivs[NUM_STATS] = {hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv}; u16 moves[MAX_MON_MOVES] = {move1, move2, move3, move4}; - gSpecialVar_Result = ScriptGiveMonParameterized(side, slot, species, level, item, ball, nature, abilityNum, gender, evs, ivs, moves, isShiny, ggMaxFactor, teraType); + if (side == 0) + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + else + Script_RequestEffects(SCREFF_V1); + + gSpecialVar_Result = ScriptGiveMonParameterized(side, slot, species, level, item, ball, nature, abilityNum, gender, evs, ivs, moves, isShiny, gmaxFactor, teraType, dmaxLevel); } #undef PARSE_FLAG @@ -580,6 +604,8 @@ void Script_SetStatus1(struct ScriptContext *ctx) u32 status1 = VarGet(ScriptReadHalfword(ctx)); u32 slot = VarGet(ScriptReadHalfword(ctx)); + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + if (slot >= PARTY_SIZE) { u16 species; diff --git a/src/secret_base.c b/src/secret_base.c index 7e0c1ae107..d4dc43c5bd 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -1163,7 +1163,7 @@ const u8 *GetSecretBaseTrainerLoseText(void) void PrepSecretBaseBattleFlags(void) { TryGainNewFanFromCounter(FANCOUNTER_BATTLED_AT_BASE); - gTrainerBattleOpponent_A = TRAINER_SECRET_BASE; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_SECRET_BASE; gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_SECRET_BASE; } diff --git a/src/shop.c b/src/shop.c index d73e4ecd13..72d4f1685b 100644 --- a/src/shop.c +++ b/src/shop.c @@ -21,6 +21,7 @@ #include "menu.h" #include "menu_helpers.h" #include "money.h" +#include "move.h" #include "overworld.h" #include "palette.h" #include "party_menu.h" diff --git a/src/sound.c b/src/sound.c index db59e7e73c..9a67f2c21b 100644 --- a/src/sound.c +++ b/src/sound.c @@ -8,6 +8,7 @@ #include "constants/cries.h" #include "constants/songs.h" #include "task.h" +#include "test_runner.h" struct Fanfare { @@ -237,6 +238,13 @@ bool8 IsFanfareTaskInactive(void) static void Task_Fanfare(u8 taskId) { + if (gTestRunnerHeadless) + { + DestroyTask(taskId); + sFanfareCounter = 0; + return; + } + if (sFanfareCounter) { sFanfareCounter--; diff --git a/src/sprite.c b/src/sprite.c index 2e021f5cbf..eb458cb616 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -1567,9 +1567,9 @@ void FreeAllSpritePalettes(void) sSpritePaletteTags[i] = TAG_NONE; } -u8 LoadSpritePalette(const struct SpritePalette *palette) +u32 LoadSpritePalette(const struct SpritePalette *palette) { - u8 index = IndexOfSpritePaletteTag(palette->tag); + u32 index = IndexOfSpritePaletteTag(palette->tag); if (index != 0xFF) return index; @@ -1601,9 +1601,9 @@ void DoLoadSpritePalette(const u16 *src, u16 paletteOffset) LoadPalette(src, OBJ_PLTT_OFFSET + paletteOffset, PLTT_SIZE_4BPP); } -u8 AllocSpritePalette(u16 tag) +u32 AllocSpritePalette(u16 tag) { - u8 index = IndexOfSpritePaletteTag(TAG_NONE); + u32 index = IndexOfSpritePaletteTag(TAG_NONE); if (index == 0xFF) { return 0xFF; @@ -1615,7 +1615,7 @@ u8 AllocSpritePalette(u16 tag) } } -u8 IndexOfSpritePaletteTag(u16 tag) +u32 IndexOfSpritePaletteTag(u16 tag) { u32 i; for (i = gReservedSpritePaletteCount; i < 16; i++) diff --git a/src/start_menu.c b/src/start_menu.c index 0c364bb07d..72a420e90e 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -44,6 +44,8 @@ #include "trainer_card.h" #include "window.h" #include "union_room.h" +#include "dexnav.h" +#include "wild_encounter.h" #include "constants/battle_frontier.h" #include "constants/rgb.h" #include "constants/songs.h" @@ -65,6 +67,7 @@ enum MENU_ACTION_RETIRE_FRONTIER, MENU_ACTION_PYRAMID_BAG, MENU_ACTION_DEBUG, + MENU_ACTION_DEXNAV, }; // Save status @@ -106,6 +109,7 @@ static bool8 StartMenuLinkModePlayerNameCallback(void); static bool8 StartMenuBattlePyramidRetireCallback(void); static bool8 StartMenuBattlePyramidBagCallback(void); static bool8 StartMenuDebugCallback(void); +static bool8 StartMenuDexNavCallback(void); // Menu callbacks static bool8 SaveStartCallback(void); @@ -200,6 +204,7 @@ static const struct MenuAction sStartMenuItems[] = [MENU_ACTION_RETIRE_FRONTIER] = {gText_MenuRetire, {.u8_void = StartMenuBattlePyramidRetireCallback}}, [MENU_ACTION_PYRAMID_BAG] = {gText_MenuBag, {.u8_void = StartMenuBattlePyramidBagCallback}}, [MENU_ACTION_DEBUG] = {sText_MenuDebug, {.u8_void = StartMenuDebugCallback}}, + [MENU_ACTION_DEXNAV] = {gText_MenuDexNav, {.u8_void = StartMenuDexNavCallback}}, }; static const struct BgTemplate sBgTemplates_LinkBattleSave[] = @@ -326,20 +331,18 @@ static void AddStartMenuAction(u8 action) static void BuildNormalStartMenu(void) { if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) - { AddStartMenuAction(MENU_ACTION_POKEDEX); - } + + if (DN_FLAG_DEXNAV_GET != 0 && FlagGet(DN_FLAG_DEXNAV_GET)) + AddStartMenuAction(MENU_ACTION_DEXNAV); + if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE) - { AddStartMenuAction(MENU_ACTION_POKEMON); - } AddStartMenuAction(MENU_ACTION_BAG); if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE) - { AddStartMenuAction(MENU_ACTION_POKENAV); - } AddStartMenuAction(MENU_ACTION_PLAYER); AddStartMenuAction(MENU_ACTION_SAVE); @@ -638,6 +641,9 @@ static bool8 HandleStartMenuInput(void) if (GetNationalPokedexCount(FLAG_GET_SEEN) == 0) return FALSE; } + if (sCurrentStartMenuActions[sStartMenuCursorPos] == MENU_ACTION_DEXNAV + && MapHasNoEncounterData()) + return FALSE; gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func.u8_void; @@ -663,7 +669,7 @@ static bool8 HandleStartMenuInput(void) return FALSE; } -static bool8 StartMenuPokedexCallback(void) +bool8 StartMenuPokedexCallback(void) { if (!gPaletteFade.active) { @@ -1485,3 +1491,17 @@ void AppendToList(u8 *list, u8 *pos, u8 newEntry) list[*pos] = newEntry; (*pos)++; } + +static bool8 StartMenuDexNavCallback(void) +{ + CreateTask(Task_OpenDexNavFromStartMenu, 0); + return TRUE; +} + +void Script_ForceSaveGame(struct ScriptContext *ctx) +{ + SaveGame(); + ShowSaveInfoWindow(); + gMenuCallback = SaveCallback; + sSaveDialogCallback = SaveSavingMessageCallback; +} diff --git a/src/strings.c b/src/strings.c index b886ac639f..c112db4616 100644 --- a/src/strings.c +++ b/src/strings.c @@ -126,21 +126,11 @@ const u8 gMenuText_Use[] = _("USE"); const u8 gMenuText_Toss[] = _("TOSS"); const u8 gMenuText_Register[] = _("REGISTER"); const u8 gMenuText_Give[] = _("GIVE"); -const u8 gMenuText_CheckTag[] = _("CHECK TAG"); const u8 gMenuText_Confirm[] = _("CONFIRM"); -const u8 gMenuText_Walk[] = _("WALK"); const u8 gText_Cancel[] = _("CANCEL"); const u8 gText_Cancel2[] = _("CANCEL"); -const u8 gMenuText_Show[] = _("SHOW"); const u8 gText_EmptyString2[] = _(""); -const u8 gText_Cancel7[] = _("CANCEL"); // Unused -const u8 gText_Item[] = _("ITEM"); -const u8 gText_Mail[] = _("MAIL"); -const u8 gText_Take[] = _("TAKE"); -const u8 gText_Store[] = _("STORE"); -const u8 gMenuText_Check[] = _("CHECK"); const u8 gText_None[] = _("NONE"); -const u8 gMenuText_Deselect[] = _("DESELECT"); const u8 gText_FiveMarks[] = _("?????"); const u8 gText_Slash[] = _("/"); const u8 gText_OneDash[] = _("-"); @@ -166,39 +156,19 @@ const u8 gText_CantWriteMail[] = _("You can't write\nMAIL here."); const u8 gText_NoPokemon[] = _("There is no\nPOKéMON."); const u8 gText_MoveVar1Where[] = _("Move the\n{STR_VAR_1}\nwhere?"); const u8 gText_Var1CantBeHeld[] = _("The {STR_VAR_1} can't be held."); -const u8 gText_Var1CantBeHeldHere[] = _("The {STR_VAR_1} can't be held\nhere."); -const u8 gText_DepositHowManyVar1[] = _("Deposit how many\n{STR_VAR_1}?"); -const u8 gText_DepositedVar2Var1s[] = _("Deposited {STR_VAR_2}\n{STR_VAR_1}."); -const u8 gText_NoRoomForItems[] = _("There's no room to\nstore items."); -const u8 gText_CantStoreImportantItems[] = _("Important items\ncan't be stored in\nthe PC!"); -const u8 gText_TooImportantToToss[] = _("That's much too\nimportant to toss\nout!"); const u8 gText_TossHowManyVar1s[] = _("Toss out how many\n{STR_VAR_1}?"); const u8 gText_ThrewAwayVar2Var1s[] = _("Threw away {STR_VAR_2}\n{STR_VAR_1}."); const u8 gText_ConfirmTossItems[] = _("Is it okay to\nthrow away {STR_VAR_2}\n{STR_VAR_1}?"); const u8 gText_DadsAdvice[] = _("DAD's advice…\n{PLAYER}, there's a time and place for\leverything!{PAUSE_UNTIL_PRESS}"); -const u8 gText_CantDismountBike[] = _("You can't dismount your BIKE here.{PAUSE_UNTIL_PRESS}"); -const u8 gText_ItemFinderNearby[] = _("Huh?\nThe ITEMFINDER's responding!\pThere's an item buried around here!{PAUSE_UNTIL_PRESS}"); -const u8 gText_ItemFinderOnTop[] = _("Oh!\nThe ITEMFINDER's shaking wildly!{PAUSE_UNTIL_PRESS}"); -const u8 gText_ItemFinderNothing[] = _("… … … …Nope!\nThere's no response.{PAUSE_UNTIL_PRESS}"); -const u8 gText_CoinCase[] = _("Your COINS:\n{STR_VAR_1}{PAUSE_UNTIL_PRESS}"); -const u8 gText_BootedUpTM[] = _("Booted up a TM."); -const u8 gText_BootedUpHM[] = _("Booted up an HM."); -const u8 gText_TMHMContainedVar1[] = _("It contained\n{STR_VAR_1}.\pTeach {STR_VAR_1}\nto a POKéMON?"); const u8 gText_PlayerUsedVar2[] = _("{PLAYER} used the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); const u8 gText_RepelEffectsLingered[] = _("But the effects of a REPEL\nlingered from earlier.{PAUSE_UNTIL_PRESS}"); const u8 gText_LureEffectsLingered[] = _("But the effects of a Lure\nlingered from earlier.{PAUSE_UNTIL_PRESS}"); -const u8 gText_UsedVar2WildLured[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be lured.{PAUSE_UNTIL_PRESS}"); -const u8 gText_UsedVar2WildRepelled[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be repelled.{PAUSE_UNTIL_PRESS}"); const u8 gText_BoxFull[] = _("The BOX is full.{PAUSE_UNTIL_PRESS}"); -const u8 gText_PowderQty[] = _("POWDER QTY: {STR_VAR_1}{PAUSE_UNTIL_PRESS}"); const u8 gText_TheField[] = _("the field"); const u8 gText_TheBattle[] = _("the battle"); const u8 gText_ThePokemonList[] = _("the POKéMON LIST"); const u8 gText_TheShop[] = _("the shop"); const u8 gText_ThePC[] = _("the PC"); -const u8 gText_PlayedPokeFluteCatchy[] = _("Played the POKé FLUTE.\pNow, that's a catchy tune!{PAUSE_UNTIL_PRESS}"); -const u8 gText_PlayedPokeFlute[] = _("Played the POKé FLUTE."); -const u8 gText_PokeFluteAwakenedMon[] = _("The POKé FLUTE awakened sleeping\nPOKéMON.{PAUSE_UNTIL_PRESS}"); const u8 *const gBagMenu_ReturnToStrings[] = { @@ -266,16 +236,6 @@ const u8 gText_HowManyToSell[] = _("{STR_VAR_2}?\nHow many would you like to sel const u8 gText_ICanPayVar1[] = _("I can pay ¥{STR_VAR_1}.\nWould that be okay?"); const u8 gText_TurnedOverVar1ForVar2[] = _("Turned over the {STR_VAR_2}\nand received ¥{STR_VAR_1}."); const u8 gText_PokedollarVar1[] = _("¥{STR_VAR_1}"); -const u8 gText_Shift[] = _("SHIFT"); -const u8 gText_SendOut[] = _("SEND OUT"); -const u8 gText_Switch2[] = _("SWITCH"); -const u8 gText_Summary5[] = _("SUMMARY"); -const u8 gText_Moves[] = _("MOVES"); // Unused -const u8 gText_Enter[] = _("ENTER"); -const u8 gText_NoEntry[] = _("NO ENTRY"); -const u8 gText_Take2[] = _("TAKE"); -const u8 gText_Read2[] = _("READ"); -const u8 gText_Trade4[] = _("TRADE"); const u8 gText_HP3[] = _("HP"); const u8 gText_SpAtk3[] = _("SP. ATK"); const u8 gText_SpDef3[] = _("SP. DEF"); @@ -359,6 +319,7 @@ const u8 gText_CurrentIsTooFast[] = _("The current is much too fast!"); const u8 gText_DoWhatWithMail[] = _("Do what with the MAIL?"); const u8 gText_ChoosePokemonCancel[] = _("Choose POKéMON or CANCEL."); const u8 gText_ChoosePokemonConfirm[] = _("Choose POKéMON and confirm."); +const u8 gText_SendWhichMonToPC[] = _("Send which POKéMON to the PC?"); const u8 gText_EnjoyCycling[] = _("Let's enjoy cycling!"); const u8 gText_InUseAlready_PM[] = _("This is in use already."); const u8 gText_AlreadyHoldingOne[] = _("{STR_VAR_1} is already holding\none {STR_VAR_2}."); @@ -483,23 +444,7 @@ const u8 gText_Tristan[] = _("TRISTAN"); const u8 gText_Philip[] = _("PHILIP"); const u8 gText_Dennis[] = _("DENNIS"); const u8 gText_Roberto[] = _("ROBERTO"); -const u8 gText_TurnOff[] = _("TURN OFF"); -const u8 gText_Decoration[] = _("DECORATION"); -const u8 gText_ItemStorage[] = _("ITEM STORAGE"); -const u8 gText_Mailbox[] = _("MAILBOX"); -const u8 gText_DepositItem[] = _("DEPOSIT ITEM"); -const u8 gText_WithdrawItem[] = _("WITHDRAW ITEM"); -const u8 gText_TossItem[] = _("TOSS ITEM"); -const u8 gText_StoreItemsInPC[] = _("Store items in the PC."); -const u8 gText_TakeOutItemsFromPC[] = _("Take out items from the PC."); -const u8 gText_ThrowAwayItemsInPC[] = _("Throw away items stored in the PC."); const u8 gText_NoItems[] = _("There are no items.{PAUSE_UNTIL_PRESS}"); -const u8 gText_NoRoomInBag[] = _("There is no more\nroom in the BAG."); -const u8 gText_WithdrawHowManyItems[] = _("Withdraw how many\n{STR_VAR_1}?"); -const u8 gText_WithdrawXItems[] = _("Withdrew {STR_VAR_2}\n{STR_VAR_1}."); -const u8 gText_Read[] = _("READ"); -const u8 gText_MoveToBag[] = _("MOVE TO BAG"); -const u8 gText_Give2[] = _("GIVE"); const u8 gText_NoMailHere[] = _("There's no MAIL here.{PAUSE_UNTIL_PRESS}"); const u8 gText_WhatToDoWithVar1sMail[] = _("What would you like to do with\n{STR_VAR_1}'s MAIL?"); const u8 gText_MessageWillBeLost[] = _("The message will be lost.\nIs that okay?"); @@ -513,17 +458,7 @@ const u8 gText_Brawly[] = _("BRAWLY"); const u8 gText_Winona[] = _("WINONA"); const u8 gText_Phoebe[] = _("PHOEBE"); const u8 gText_Glacia[] = _("GLACIA"); -const u8 gText_Petalburg[] = _("PETALBURG"); -const u8 gText_Slateport[] = _("SLATEPORT"); -const u8 gText_Littleroot[] = _("LITTLEROOT"); // Unused. Given the context, Briney may at one point have been able to sail the player here -const u8 gText_Lilycove[] = _("LILYCOVE"); // Unused. Given the context, Briney may at one point have been able to sail the player here -const u8 gText_Dewford[] = _("DEWFORD"); -const u8 gText_Enter2[] = _("ENTER"); const u8 gText_Info2[] = _("INFO"); -const u8 gText_WhatsAContest[] = _("What's a CONTEST?"); -const u8 gText_TypesOfContests[] = _("Types of CONTESTS"); -const u8 gText_Ranks[] = _("Ranks"); -const u8 gText_Judging[] = _("Judging"); //unused const u8 gText_CoolnessContest[] = _("COOLNESS CONTEST"); const u8 gText_BeautyContest[] = _("BEAUTY CONTEST"); const u8 gText_CutenessContest[] = _("CUTENESS CONTEST"); @@ -531,71 +466,17 @@ const u8 gText_SmartnessContest[] = _("SMARTNESS CONTEST"); const u8 gText_ToughnessContest[] = _("TOUGHNESS CONTEST"); const u8 gText_Decoration2[] = _("DECORATION"); const u8 gText_PackUp[] = _("PACK UP"); -const u8 gText_Count[] = _("COUNT"); //unused const u8 gText_Registry[] = _("REGISTRY"); const u8 gText_Information[] = _("INFORMATION"); -const u8 gText_Mach[] = _("MACH"); -const u8 gText_Acro[] = _("ACRO"); -const u8 gText_Psn[] = _("PSN"); -const u8 gText_Par[] = _("PAR"); -const u8 gText_Slp[] = _("SLP"); -const u8 gText_Brn[] = _("BRN"); -const u8 gText_Frz[] = _("FRZ"); -const u8 gText_Toxic[] = _("TOXIC"); // Unused -const u8 gText_Ok3[] = _("OK"); // Unused -const u8 gText_Quit[] = _("QUIT"); // Unused -const u8 gText_SawIt[] = _("Saw it"); -const u8 gText_NotYet[] = _("Not yet"); const u8 gText_Yes[] = _("YES"); const u8 gText_No[] = _("NO"); -const u8 gText_Info4[] = _("INFO"); // Unused -const u8 gText_SingleBattle[] = _("SINGLE BATTLE"); -const u8 gText_DoubleBattle[] = _("DOUBLE BATTLE"); -const u8 gText_MultiBattle[] = _("MULTI BATTLE"); -const u8 gText_MrBriney[] = _("MR. BRINEY"); // Unused -const u8 gText_Challenge[] = _("CHALLENGE"); -const u8 gText_Info3[] = _("INFO"); const u8 gText_Lv50[] = _("LV. 50"); const u8 gText_OpenLevel[] = _("OPEN LEVEL"); -const u8 gText_FreshWaterAndPrice[] = _("FRESH WATER{CLEAR_TO 0x48}¥200"); -const u8 gText_SodaPopAndPrice[] = _("SODA POP{CLEAR_TO 0x48}¥300"); -const u8 gText_LemonadeAndPrice[] = _("LEMONADE{CLEAR_TO 0x48}¥350"); -const u8 gText_HowToRide[] = _("HOW TO RIDE"); -const u8 gText_HowToTurn[] = _("HOW TO TURN"); -const u8 gText_SandySlopes[] = _("SANDY SLOPES"); -const u8 gText_Wheelies[] = _("WHEELIES"); -const u8 gText_BunnyHops[] = _("BUNNY-HOPS"); -const u8 gText_Jump[] = _("JUMP"); -const u8 gText_Satisfied[] = _("Satisfied"); -const u8 gText_Dissatisfied[] = _("Dissatisfied"); -const u8 gText_DeepSeaTooth[] = _("DEEPSEATOOTH"); -const u8 gText_DeepSeaScale[] = _("DEEPSEASCALE"); -const u8 gText_BlueFlute2[] = _("BLUE FLUTE"); -const u8 gText_YellowFlute2[] = _("YELLOW FLUTE"); -const u8 gText_RedFlute2[] = _("RED FLUTE"); -const u8 gText_WhiteFlute2[] = _("WHITE FLUTE"); -const u8 gText_BlackFlute2[] = _("BLACK FLUTE"); -const u8 gText_GlassChair[] = _("GLASS CHAIR"); -const u8 gText_GlassDesk[] = _("GLASS DESK"); -const u8 gText_TreeckoDollAndPrice[] = _("TREECKO DOLL 1,000 COINS"); -const u8 gText_TorchicDollAndPrice[] = _("TORCHIC DOLL 1,000 COINS"); -const u8 gText_MudkipDollAndPrice[] = _("MUDKIP DOLL 1,000 COINS"); -const u8 gText_50CoinsAndPrice[] = _(" 50 COINS ¥1,000"); -const u8 gText_500CoinsAndPrice[] = _("500 COINS ¥10,000"); -const u8 gText_Excellent2[] = _("Excellent"); -const u8 gText_NotSoGood[] = _("Not so good"); const u8 gText_RedShard[] = _("RED SHARD"); const u8 gText_YellowShard[] = _("YELLOW SHARD"); const u8 gText_BlueShard[] = _("BLUE SHARD"); const u8 gText_GreenShard[] = _("GREEN SHARD"); const u8 gText_BattleFrontier[] = _("BATTLE FRONTIER"); -const u8 gText_Right[] = _("Right"); -const u8 gText_Left[] = _("Left"); -const u8 gText_TM32AndPrice[] = _("TM32{CLEAR_TO 0x48}1,500 COINS"); -const u8 gText_TM29AndPrice[] = _("TM29{CLEAR_TO 0x48}3,500 COINS"); -const u8 gText_TM35AndPrice[] = _("TM35{CLEAR_TO 0x48}4,000 COINS"); -const u8 gText_TM24AndPrice[] = _("TM24{CLEAR_TO 0x48}4,000 COINS"); -const u8 gText_TM13AndPrice[] = _("TM13{CLEAR_TO 0x48}4,000 COINS"); const u8 gText_Cool[] = _("COOL"); const u8 gText_Beauty[] = _("BEAUTY"); const u8 gText_Cute[] = _("CUTE"); @@ -623,21 +504,10 @@ const u8 gText_LogOff[] = _("LOG OFF"); const u8 gText_Opponent[] = _("OPPONENT"); const u8 gText_Tourney_Tree[] = _("TOURNEY TREE"); const u8 gText_ReadyToStart[] = _("READY TO START"); -const u8 gText_NormalRank[] = _("NORMAL RANK"); -const u8 gText_SuperRank[] = _("SUPER RANK"); -const u8 gText_HyperRank[] = _("HYPER RANK"); -const u8 gText_MasterRank[] = _("MASTER RANK"); const u8 gText_Single2[] = _("SINGLE"); const u8 gText_Double2[] = _("DOUBLE"); const u8 gText_Multi[] = _("MULTI"); const u8 gText_MultiLink[] = _("MULTI-LINK"); -const u8 gText_BattleBag[] = _("BATTLE BAG"); -const u8 gText_HeldItem[] = _("HELD ITEM"); -const u8 gText_LinkContest[] = _("LINK CONTEST"); -const u8 gText_AboutE_Mode[] = _("ABOUT E-MODE"); -const u8 gText_AboutG_Mode[] = _("ABOUT G-MODE"); -const u8 gText_E_Mode[] = _("E-MODE"); -const u8 gText_G_Mode[] = _("G-MODE"); const u8 gText_MenuOptionPokedex[] = _("POKéDEX"); const u8 gText_MenuOptionPokemon[] = _("POKéMON"); const u8 gText_MenuOptionBag[] = _("BAG"); @@ -646,22 +516,10 @@ const u8 gText_Blank[] = _(""); const u8 gText_MenuOptionSave[] = _("SAVE"); const u8 gText_MenuOptionOption[] = _("OPTION"); const u8 gText_MenuOptionExit[] = _("EXIT"); -const u8 gText_5BP[] = _(" 5BP"); -const u8 gText_10BP[] = _("10BP"); -const u8 gText_15BP[] = _("15BP"); -const u8 gText_RedTent[] = _("RED TENT"); -const u8 gText_BlueTent[] = _("BLUE TENT"); const u8 gText_SouthernIsland[] = _("SOUTHERN ISLAND"); const u8 gText_BirthIsland[] = _("BIRTH ISLAND"); const u8 gText_FarawayIsland[] = _("FARAWAY ISLAND"); const u8 gText_NavelRock[] = _("NAVEL ROCK"); -const u8 gText_ClawFossil[] = _("CLAW FOSSIL"); -const u8 gText_RootFossil[] = _("ROOT FOSSIL"); -const u8 gText_No4[] = _("NO"); -const u8 gText_IllBattleNow[] = _("I'll battle now!"); -const u8 gText_IWon[] = _("I won!"); -const u8 gText_ILost[] = _("I lost!"); -const u8 gText_IWontTell[] = _("I won't tell."); const u8 gText_NormalTagMatch[] = _("NORMAL TAG MATCH"); const u8 gText_VarietyTagMatch[] = _("VARIETY TAG MATCH"); const u8 gText_UniqueTagMatch[] = _("UNIQUE TAG MATCH"); @@ -670,69 +528,25 @@ const u8 gText_TradeCenter[] = _("TRADE CENTER"); const u8 gText_Colosseum[] = _("COLOSSEUM"); const u8 gText_RecordCorner[] = _("RECORD CORNER"); const u8 gText_BerryCrush3[] = _("BERRY CRUSH"); -const u8 gText_EmptyLinkService[] = _(""); // Maybe Spin Trade? -const u8 gText_PokemonJump[] = _("POKéMON JUMP"); -const u8 gText_DodrioBerryPicking[] = _("DODRIO BERRY-PICKING"); -const u8 gText_BecomeLeader[] = _("BECOME LEADER"); -const u8 gText_JoinGroup[] = _("JOIN GROUP"); -const u8 gText_TwoStyles[] = _("TWO STYLES"); -const u8 gText_Lv50_3[] = _("LV. 50"); -const u8 gText_OpenLevel2[] = _("OPEN LEVEL"); -const u8 gText_MonTypeAndNo[] = _("{PKMN} TYPE & NO."); -const u8 gText_HoldItems[] = _("HOLD ITEMS"); -const u8 gText_Symbols2[] = _("SYMBOLS"); -const u8 gText_Record3[] = _("RECORD"); -const u8 gText_BattlePts[] = _("BATTLE PTS"); -const u8 gText_TowerInfo[] = _("TOWER INFO"); -const u8 gText_BattleMon[] = _("BATTLE {PKMN}"); -const u8 gText_BattleSalon[] = _("BATTLE SALON"); -const u8 gText_MultiLink2[] = _("MULTI-LINK"); const u8 gText_BattleRules[] = _("BATTLE RULES"); const u8 gText_JudgeMind[] = _("JUDGE: MIND"); const u8 gText_JudgeSkill[] = _("JUDGE: SKILL"); const u8 gText_JudgeBody[] = _("JUDGE: BODY"); -const u8 gText_Matchup[] = _("MATCHUP"); -const u8 gText_TourneyTree[] = _("TOURNEY TREE"); -const u8 gText_DoubleKO[] = _("DOUBLE KO"); const u8 gText_BasicRules[] = _("BASIC RULES"); const u8 gText_SwapPartners[] = _("SWAP: PARTNER"); const u8 gText_SwapNumber[] = _("SWAP: NUMBER"); const u8 gText_SwapNotes[] = _("SWAP: NOTES"); -const u8 gText_OpenLevel3[] = _("OPEN LEVEL"); const u8 gText_BattleBasics[] = _("BATTLE BASICS"); const u8 gText_PokemonNature[] = _("POKéMON NATURE"); const u8 gText_PokemonMoves[] = _("POKéMON MOVES"); const u8 gText_Underpowered[] = _("UNDERPOWERED"); const u8 gText_WhenInDanger[] = _("WHEN IN DANGER"); -const u8 gText_PyramidPokemon[] = _("PYRAMID: POKéMON"); -const u8 gText_PyramidTrainers[] = _("PYRAMID: TRAINERS"); -const u8 gText_PyramidMaze[] = _("PYRAMID: MAZE"); -const u8 gText_BattleBag2[] = _("BATTLE BAG"); -const u8 gText_PokenavAndBag[] = _("POKéNAV AND BAG"); -const u8 gText_HeldItems[] = _("HELD ITEMS"); -const u8 gText_PokemonOrder[] = _("POKéMON ORDER"); const u8 gText_BattlePokemon[] = _("BATTLE POKéMON"); const u8 gText_BattleTrainers[] = _("BATTLE TRAINERS"); const u8 gText_GoOn[] = _("GO ON"); const u8 gText_Record2[] = _("RECORD"); const u8 gText_Rest[] = _("REST"); const u8 gText_Retire[] = _("RETIRE"); -const u8 gText_99TimesPlus[] = _("99 times +"); -const u8 gText_1MinutePlus[] = _("1 minute +"); -const u8 gText_SpaceSeconds[] = _(" seconds"); -const u8 gText_SpaceTimes[] = _(" time(s)"); -const u8 gText_Dot[] = _("."); // Unused -const u8 gText_BigGuy[] = _("Big guy"); -const u8 gText_BigGirl[] = _("Big girl"); -const u8 gText_Son[] = _("son"); -const u8 gText_Daughter[] = _("daughter"); -const u8 gText_BlueFlute[] = _("BLUE FLUTE"); -const u8 gText_YellowFlute[] = _("YELLOW FLUTE"); -const u8 gText_RedFlute[] = _("RED FLUTE"); -const u8 gText_WhiteFlute[] = _("WHITE FLUTE"); -const u8 gText_BlackFlute[] = _("BLACK FLUTE"); -const u8 gText_PrettyChair[] = _("PRETTY CHAIR"); -const u8 gText_PrettyDesk[] = _("PRETTY DESK"); const u8 gText_1F[] = _("1F"); const u8 gText_2F[] = _("2F"); const u8 gText_3F[] = _("3F"); @@ -751,25 +565,10 @@ const u8 gText_B4F[] = _("B4F"); const u8 gText_Rooftop[] = _("ROOFTOP"); const u8 gText_ElevatorNowOn[] = _("Now on:"); const u8 gText_BP[] = _("BP"); -const u8 gText_EnergyPowder50[] = _("ENERGYPOWDER{CLEAR_TO 114}{FONT_SMALL}50"); -const u8 gText_EnergyRoot80[] = _("ENERGY ROOT{CLEAR_TO 114}{FONT_SMALL}80"); -const u8 gText_HealPowder50[] = _("HEAL POWDER{CLEAR_TO 114}{FONT_SMALL}50"); -const u8 gText_RevivalHerb300[] = _("REVIVAL HERB{CLEAR_TO 108}{FONT_SMALL}300"); -const u8 gText_Protein1000[] = _("PROTEIN{CLEAR_TO 99}{FONT_SMALL}1,000"); -const u8 gText_Iron1000[] = _("IRON{CLEAR_TO 99}{FONT_SMALL}1,000"); -const u8 gText_Carbos1000[] = _("CARBOS{CLEAR_TO 99}{FONT_SMALL}1,000"); -const u8 gText_Calcium1000[] = _("CALCIUM{CLEAR_TO 99}{FONT_SMALL}1,000"); -const u8 gText_Zinc1000[] = _("ZINC{CLEAR_TO 99}{FONT_SMALL}1,000"); -const u8 gText_HPUp1000[] = _("HP UP{CLEAR_TO 99}{FONT_SMALL}1,000"); -const u8 gText_PPUp3000[] = _("PP UP{CLEAR_TO 99}{FONT_SMALL}3,000"); const u8 gText_RankingHall[] = _("RANKING HALL"); const u8 gText_ExchangeService[] = _("EXCHANGE SERVICE"); const u8 gText_LilycoveCity[] = _("LILYCOVE CITY"); const u8 gText_SlateportCity[] = _("SLATEPORT CITY"); -const u8 gText_CaveOfOrigin[] = _("CAVE OF ORIGIN"); -const u8 gText_MtPyre[] = _("MT. PYRE"); -const u8 gText_SkyPillar[] = _("SKY PILLAR"); -const u8 gText_DontRemember[] = _("Don't remember"); const u8 gText_Exit[] = _("EXIT"); const u8 gText_YourPartysFull[] = _("Your party's full!{PAUSE_UNTIL_PRESS}"); const u8 gText_NatureSlash[] = _("NATURE/"); @@ -909,68 +708,6 @@ const u8 gText_Jackpot[] = _("jackpot"); const u8 gText_First[] = _("first"); const u8 gText_Second[] = _("second"); const u8 gText_Third[] = _("third"); -const u8 gText_0Pts[] = _("0 pts"); -const u8 gText_10Pts[] = _("10 pts"); -const u8 gText_20Pts[] = _("20 pts"); -const u8 gText_30Pts[] = _("30 pts"); -const u8 gText_40Pts[] = _("40 pts"); -const u8 gText_50Pts[] = _("50 pts"); -const u8 gText_60Pts[] = _("60 pts"); -const u8 gText_70Pts[] = _("70 pts"); -const u8 gText_80Pts[] = _("80 pts"); -const u8 gText_90Pts[] = _("90 pts"); -const u8 gText_100Pts[] = _("100 pts"); -const u8 gText_QuestionMark[] = _("?"); -const u8 gText_KissPoster16BP[] = _("KISS POSTER{CLEAR_TO 0x5E}16BP"); -const u8 gText_KissCushion32BP[] = _("KISS CUSHION{CLEAR_TO 0x5E}32BP"); -const u8 gText_SmoochumDoll32BP[] = _("SMOOCHUM DOLL{CLEAR_TO 0x5E}32BP"); -const u8 gText_TogepiDoll48BP[] = _("TOGEPI DOLL{CLEAR_TO 0x5E}48BP"); -const u8 gText_MeowthDoll48BP[] = _("MEOWTH DOLL{CLEAR_TO 0x5E}48BP"); -const u8 gText_ClefairyDoll48BP[] = _("CLEFAIRY DOLL{CLEAR_TO 0x5E}48BP"); -const u8 gText_DittoDoll48BP[] = _("DITTO DOLL{CLEAR_TO 0x5E}48BP"); -const u8 gText_CyndaquilDoll80BP[] = _("CYNDAQUIL DOLL{CLEAR_TO 0x5E}80BP"); -const u8 gText_ChikoritaDoll80BP[] = _("CHIKORITA DOLL{CLEAR_TO 0x5E}80BP"); -const u8 gText_TotodileDoll80BP[] = _("TOTODILE DOLL{CLEAR_TO 0x5E}80BP"); -const u8 gText_LaprasDoll128BP[] = _("LAPRAS DOLL{CLEAR_TO 0x58}128BP"); -const u8 gText_SnorlaxDoll128BP[] = _("SNORLAX DOLL{CLEAR_TO 0x58}128BP"); -const u8 gText_VenusaurDoll256BP[] = _("VENUSAUR DOLL{CLEAR_TO 0x58}256BP"); -const u8 gText_CharizardDoll256BP[] = _("CHARIZARD DOLL{CLEAR_TO 0x58}256BP"); -const u8 gText_BlastoiseDoll256BP[] = _("BLASTOISE DOLL{CLEAR_TO 0x58}256BP"); -const u8 gText_Protein1BP[] = _("PROTEIN{CLEAR_TO 0x64}1BP"); -const u8 gText_Calcium1BP[] = _("CALCIUM{CLEAR_TO 0x64}1BP"); -const u8 gText_Iron1BP[] = _("IRON{CLEAR_TO 0x64}1BP"); -const u8 gText_Zinc1BP[] = _("ZINC{CLEAR_TO 0x64}1BP"); -const u8 gText_Carbos1BP[] = _("CARBOS{CLEAR_TO 0x64}1BP"); -const u8 gText_HpUp1BP[] = _("HP UP{CLEAR_TO 0x64}1BP"); -const u8 gText_Leftovers48BP[] = _("LEFTOVERS{CLEAR_TO 0x5E}48BP"); -const u8 gText_WhiteHerb48BP[] = _("WHITE HERB{CLEAR_TO 0x5E}48BP"); -const u8 gText_QuickClaw48BP[] = _("QUICK CLAW{CLEAR_TO 0x5E}48BP"); -const u8 gText_MentalHerb48BP[] = _("MENTAL HERB{CLEAR_TO 0x5E}48BP"); -const u8 gText_BrightPowder64BP[] = _("BRIGHTPOWDER{CLEAR_TO 0x5E}64BP"); -const u8 gText_ChoiceBand64BP[] = _("CHOICE BAND{CLEAR_TO 0x5E}64BP"); -const u8 gText_KingsRock64BP[] = _("KING'S ROCK{CLEAR_TO 0x5E}64BP"); -const u8 gText_FocusBand64BP[] = _("FOCUS BAND{CLEAR_TO 0x5E}64BP"); -const u8 gText_ScopeLens64BP[] = _("SCOPE LENS{CLEAR_TO 0x5E}64BP"); -const u8 gText_Softboiled16BP[] = _("SOFTBOILED{CLEAR_TO 0x4E}16BP"); -const u8 gText_SeismicToss24BP[] = _("SEISMIC TOSS{CLEAR_TO 0x4E}24BP"); -const u8 gText_DreamEater24BP[] = _("DREAM EATER{CLEAR_TO 0x4E}24BP"); -const u8 gText_MegaPunch24BP[] = _("MEGA PUNCH{CLEAR_TO 0x4E}24BP"); -const u8 gText_MegaKick48BP[] = _("MEGA KICK{CLEAR_TO 0x4E}48BP"); -const u8 gText_BodySlam48BP[] = _("BODY SLAM{CLEAR_TO 0x4E}48BP"); -const u8 gText_RockSlide48BP[] = _("ROCK SLIDE{CLEAR_TO 0x4E}48BP"); -const u8 gText_Counter48BP[] = _("COUNTER{CLEAR_TO 0x4E}48BP"); -const u8 gText_ThunderWave48BP[] = _("THUNDER WAVE{CLEAR_TO 0x4E}48BP"); -const u8 gText_SwordsDance48BP[] = _("SWORDS DANCE{CLEAR_TO 0x4E}48BP"); -const u8 gText_DefenseCurl16BP[] = _("DEFENSE CURL{CLEAR_TO 0x4E}16BP"); -const u8 gText_Snore24BP[] = _("SNORE{CLEAR_TO 0x4E}24BP"); -const u8 gText_MudSlap24BP[] = _("MUD-SLAP{CLEAR_TO 0x4E}24BP"); -const u8 gText_Swift24BP[] = _("SWIFT{CLEAR_TO 0x4E}24BP"); -const u8 gText_IcyWind24BP[] = _("ICY WIND{CLEAR_TO 0x4E}24BP"); -const u8 gText_Endure48BP[] = _("ENDURE{CLEAR_TO 0x4E}48BP"); -const u8 gText_PsychUp48BP[] = _("PSYCH UP{CLEAR_TO 0x4E}48BP"); -const u8 gText_IcePunch48BP[] = _("ICE PUNCH{CLEAR_TO 0x4E}48BP"); -const u8 gText_ThunderPunch48BP[] = _("THUNDERPUNCH{CLEAR_TO 0x4E}48BP"); -const u8 gText_FirePunch48BP[] = _("FIRE PUNCH{CLEAR_TO 0x4E}48BP"); #if OW_POISON_DAMAGE < GEN_4 const u8 gText_PkmnFainted_FldPsn[] = _("{STR_VAR_1} fainted…\p\n"); #else @@ -1193,9 +930,6 @@ const u8 gJPText_ConnectionComplete[] = _("つうしん しゅうりょう!" const u8 gJPText_NewTrainerHasComeToHoenn[] = _("あらたな トレーナーが\nホウエンに やってきた!"); const u8 gJPText_PleaseWaitAMoment[] = _("しばらく おまちください"); const u8 gJPText_WriteErrorUnableToSaveData[] = _("かきこみ エラー です\nデータが ほぞん できませんでした"); -const u8 gText_Red[] = _("RED"); -const u8 gText_Blue[] = _("BLUE"); -const u8 gText_3Dashes[] = _("---"); // Unused const u8 gText_SingleBattleRoomResults[] = _("{PLAYER}'s Single Battle Room Results"); const u8 gText_DoubleBattleRoomResults[] = _("{PLAYER}'s Double Battle Room Results"); const u8 gText_MultiBattleRoomResults[] = _("{PLAYER}'s Multi Battle Room Results"); @@ -1290,6 +1024,7 @@ const u8 gText_MenuOption[] = _("OPTION"); const u8 gText_MenuExit[] = _("EXIT"); const u8 gText_MenuRetire[] = _("RETIRE"); const u8 gText_MenuRest[] = _("REST"); +const u8 gText_MenuDexNav[] = _("DEXNAV"); const u8 gText_SafariBallStock[] = _("SAFARI BALLS\nStock: {STR_VAR_1}"); const u8 gText_BattlePyramidFloor[] = _("Battle Pyramid\n{STR_VAR_1}"); const u8 gText_Floor1[] = _("Floor 1"); @@ -1497,14 +1232,6 @@ const u8 gText_TrainerHill1F[] = _("1F"); const u8 gText_TrainerHill2F[] = _("2F"); const u8 gText_TrainerHill3F[] = _("3F"); const u8 gText_TrainerHill4F[] = _("4F"); -const u8 gText_LightBulb[] = _("Light bulb"); -const u8 gText_MicrowaveOven[] = _("Microwave oven"); -const u8 gText_WashingMachine[] = _("Washing machine"); -const u8 gText_Refrigerator[] = _("Refrigerator"); -const u8 gText_ElectricFan[] = _("Electric fan"); -const u8 gText_LawnMower[] = _("Lawn mower"); -const u8 gText_ChangeForm[] = _("Change form"); -const u8 gText_ChangeAbility[] = _("Change Ability"); const u8 gText_TeachWhichMoveToPkmn[] = _("Teach which move to\n{STR_VAR_1}?"); const u8 gText_MoveRelearnerTeachMoveConfirm[] = _("Teach {STR_VAR_2}?"); const u8 gText_MoveRelearnerPkmnLearnedMove[] = _("{STR_VAR_1} learned\n{STR_VAR_2}!"); @@ -1563,9 +1290,8 @@ const u8 gText_Berries[] = _("BERRIES"); const u8 gText_ExpShareOn[] = _("The Exp. Share has been turned on.{PAUSE_UNTIL_PRESS}"); const u8 gText_ExpShareOff[] = _("The Exp. Share has been turned off.{PAUSE_UNTIL_PRESS}"); const u8 gText_BasePointsResetToZero[] = _("{STR_VAR_1}'s base points\nwere all reset to zero!{PAUSE_UNTIL_PRESS}"); -const u8 gText_Fertilize[] = _("FERTILIZE"); -const u8 gText_PlantBerry[] = _("PLANT BERRY"); const u8 gText_AM[] = _("AM"); const u8 gText_PM[] = _("PM"); const u8 gText_Relearn[] = _("{START_BUTTON} RELEARN"); // future note: don't decap this, because it mimics the summary screen BG graphics which will not get decapped const u8 gText_Rename[] = _("RENAME"); +const u8 gText_CannotSendMonToBoxHM[] = _("Cannot send that mon to the box,\nbecause it knows a HM move.{PAUSE_UNTIL_PRESS}"); diff --git a/src/text_window.c b/src/text_window.c index efd087977e..a1bae0d123 100644 --- a/src/text_window.c +++ b/src/text_window.c @@ -82,6 +82,9 @@ static const struct TilesPal sWindowFrames[WINDOW_FRAMES_COUNT] = {sTextWindowFrame20_Gfx, sTextWindowFrame20_Pal} }; +static const u16 sTextWindowDexNavFrame[] = INCBIN_U16("graphics/text_window/dexnav_pal.gbapal"); +static const struct TilesPal sDexNavWindowFrame = {gTextWindowFrame1_Gfx, sTextWindowDexNavFrame}; + // code const struct TilesPal *GetWindowFrameTilesPal(u8 id) { @@ -202,3 +205,9 @@ void LoadUserWindowBorderGfxOnBg(u8 bg, u16 destOffset, u8 palOffset) LoadBgTiles(bg, sWindowFrames[gSaveBlock2Ptr->optionsWindowFrameType].tiles, 0x120, destOffset); LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, palOffset, PLTT_SIZE_4BPP); } + +void LoadDexNavWindowGfx(u8 windowId, u16 destOffset, u8 palOffset) +{ + LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), sDexNavWindowFrame.tiles, 0x120, destOffset); + LoadPalette(sDexNavWindowFrame.pal, palOffset, 32); +} diff --git a/src/trade.c b/src/trade.c index 04b1977c17..8ba22eac97 100644 --- a/src/trade.c +++ b/src/trade.c @@ -2959,17 +2959,11 @@ static void TradeAnimInit_LoadGfx(void) SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE)); SetBgTilemapBuffer(3, Alloc(BG_SCREEN_SIZE)); DeactivateAllTextPrinters(); - // Doing the graphics load... + // Doing the graphics load. DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0); - LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer); - CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0); + DecompressAndCopyToBgTilemapBuffer(0, gBattleTextboxTilemap, BG_SCREEN_SIZE, 0); LoadCompressedPalette(gBattleTextboxPalette, BG_PLTT_ID(0), PLTT_SIZE_4BPP); InitWindows(sTradeSequenceWindowTemplates); - // ... and doing the same load again - DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0); - LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer); - CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0); - LoadCompressedPalette(gBattleTextboxPalette, BG_PLTT_ID(0), PLTT_SIZE_4BPP); } static void CB2_InitInGameTrade(void) diff --git a/src/trainer_hill.c b/src/trainer_hill.c index c89803ffb2..ce2b894bf0 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -212,6 +212,14 @@ static const struct TrainerHillChallenge *const sChallengeData[NUM_TRAINER_HILL_ [HILL_MODE_EXPERT] = &sChallenge_Expert, }; +static const struct TrainerHillFloor *const sFloorData[NUM_TRAINER_HILL_MODES] = +{ + [HILL_MODE_NORMAL] = &sFloors_Normal[0], + [HILL_MODE_VARIETY] = &sFloors_Variety[0], + [HILL_MODE_UNIQUE] = &sFloors_Unique[0], + [HILL_MODE_EXPERT] = &sFloors_Expert[0], +}; + // Unused. static const u8 *const sFloorStrings[] = { @@ -357,20 +365,14 @@ void FreeTrainerHillBattleStruct(void) static void SetUpDataStruct(void) { #if FREE_TRAINER_HILL == FALSE - if (sHillData == NULL) - { - sHillData = AllocZeroed(sizeof(*sHillData)); - sHillData->floorId = gMapHeader.mapLayoutId - LAYOUT_TRAINER_HILL_1F; + if (sHillData != NULL) return; - // This copy depends on the floor data for each challenge being directly after the - // challenge header data, and for the field 'floors' in sHillData to come directly - // after the field 'challenge'. - // e.g. for HILL_MODE_NORMAL, it will copy sChallenge_Normal to sHillData->challenge and - // it will copy sFloors_Normal to sHillData->floors - CpuCopy32(sChallengeData[gSaveBlock1Ptr->trainerHill.mode], &sHillData->challenge, sizeof(sHillData->challenge) + sizeof(sHillData->floors)); - TrainerHillDummy(); - } -#endif //FREE_TRAINER_HILL + sHillData = AllocZeroed(sizeof(*sHillData)); + sHillData->floorId = gMapHeader.mapLayoutId - LAYOUT_TRAINER_HILL_1F; + + CpuCopy32(sChallengeData[gSaveBlock1Ptr->trainerHill.mode], &sHillData->challenge, sizeof(sHillData->challenge)); + CpuCopy32(sFloorData[gSaveBlock1Ptr->trainerHill.mode], &sHillData->floors, sizeof(sHillData->floors)); +#endif // FREE_TRAINER_HILL } static void FreeDataStruct(void) @@ -862,7 +864,7 @@ void SetHillTrainerFlag(void) for (i = 0; i < HILL_TRAINERS_PER_FLOOR; i++) { - if (gSaveBlock2Ptr->frontier.trainerIds[i] == gTrainerBattleOpponent_A) + if (gSaveBlock2Ptr->frontier.trainerIds[i] == TRAINER_BATTLE_PARAM.opponentA) { gSaveBlock2Ptr->frontier.trainerFlags |= 1u << (trainerIndexStart + i); break; @@ -873,7 +875,7 @@ void SetHillTrainerFlag(void) { for (i = 0; i < HILL_TRAINERS_PER_FLOOR; i++) { - if (gSaveBlock2Ptr->frontier.trainerIds[i] == gTrainerBattleOpponent_B) + if (gSaveBlock2Ptr->frontier.trainerIds[i] == TRAINER_BATTLE_PARAM.opponentB) { gSaveBlock2Ptr->frontier.trainerFlags |= 1u << (trainerIndexStart + i); break; @@ -920,14 +922,14 @@ static void CreateNPCTrainerHillParty(u16 trainerId, u8 firstMonId) void FillHillTrainerParty(void) { ZeroEnemyPartyMons(); - CreateNPCTrainerHillParty(gTrainerBattleOpponent_A, 0); + CreateNPCTrainerHillParty(TRAINER_BATTLE_PARAM.opponentA, 0); } void FillHillTrainersParties(void) { ZeroEnemyPartyMons(); - CreateNPCTrainerHillParty(gTrainerBattleOpponent_A, 0); - CreateNPCTrainerHillParty(gTrainerBattleOpponent_B, PARTY_SIZE / 2); + CreateNPCTrainerHillParty(TRAINER_BATTLE_PARAM.opponentA, 0); + CreateNPCTrainerHillParty(TRAINER_BATTLE_PARAM.opponentB, PARTY_SIZE / 2); } // This function is unused, but my best guess is diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index 675c7643c8..bd3a7f3e06 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -116,7 +116,7 @@ static void AssignSpriteAnimsTable(bool8 isTrainer) if (!isTrainer) sCreatingSpriteTemplate.anims = gAnims_MonPic; else - sCreatingSpriteTemplate.anims = sAnims_Trainer; + sCreatingSpriteTemplate.anims = gAnims_Trainer; } static u16 CreatePicSprite(u16 species, bool8 isShiny, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 isTrainer) diff --git a/src/trainer_pools.c b/src/trainer_pools.c new file mode 100644 index 0000000000..a2db4d81f5 --- /dev/null +++ b/src/trainer_pools.c @@ -0,0 +1,391 @@ +#include "global.h" +#include "data.h" +#include "malloc.h" +#include "pokemon.h" +#include "random.h" +#include "trainer_pools.h" +#include "constants/battle.h" +#include "constants/items.h" + +#include "data/battle_pool_rules.h" + +static void HasRequiredTag(const struct Trainer *trainer, u8* poolIndexArray, struct PoolRules *rules, u32 *arrayIndex, bool32 *foundRequiredTag, u32 currIndex) +{ + // Start from index 2, since lead and ace has special handling + for (u32 currTag = 2; currTag < POOL_NUM_TAGS; currTag++) + { + if (rules->tagRequired[currTag] + && trainer->party[poolIndexArray[currIndex]].tags & (1u << currTag)) + { + *arrayIndex = currIndex; + *foundRequiredTag = TRUE; + break; + } + } +} + +static u32 DefaultLeadPickFunction(const struct Trainer *trainer, u8 *poolIndexArray, u32 partyIndex, u32 monsCount, u32 battleTypeFlags, struct PoolRules *rules) +{ + u32 arrayIndex = 0; + u32 monIndex = POOL_SLOT_DISABLED; + // monIndex is set to 255 if nothing has been chosen yet, this gives an upper limit on pool size of 255 + if ((partyIndex == 0) + || (partyIndex == 1 && (battleTypeFlags & BATTLE_TYPE_DOUBLE))) + { + // Find required + lead tags + bool32 foundRequiredTag = FALSE; + u32 firstLeadIndex = POOL_SLOT_DISABLED; + for (u32 currIndex = 0; currIndex < trainer->poolSize; currIndex++) + { + if ((poolIndexArray[currIndex] != POOL_SLOT_DISABLED) + && (trainer->party[poolIndexArray[currIndex]].tags & (1u << POOL_TAG_LEAD))) + { + if (firstLeadIndex == POOL_SLOT_DISABLED) + firstLeadIndex = currIndex; + // Start from index 2, since lead and ace has special handling + HasRequiredTag(trainer, poolIndexArray, rules, &arrayIndex, &foundRequiredTag, currIndex); + } + if (foundRequiredTag) + break; + } + // If a combination of required + lead wasn't found, apply the first found lead + if (foundRequiredTag) + { + monIndex = poolIndexArray[arrayIndex]; + poolIndexArray[arrayIndex] = POOL_SLOT_DISABLED; + } + else if (firstLeadIndex != POOL_SLOT_DISABLED) + { + monIndex = poolIndexArray[firstLeadIndex]; + poolIndexArray[firstLeadIndex] = POOL_SLOT_DISABLED; + } + } + return monIndex; +} + +static u32 DefaultAcePickFunction(const struct Trainer *trainer, u8 *poolIndexArray, u32 partyIndex, u32 monsCount, u32 battleTypeFlags, struct PoolRules *rules) +{ + u32 arrayIndex = 0; + u32 monIndex = POOL_SLOT_DISABLED; + // monIndex is set to 255 if nothing has been chosen yet, this gives an upper limit on pool size of 255 + if (((partyIndex == monsCount - 1) || (partyIndex == monsCount - 2 && battleTypeFlags & BATTLE_TYPE_DOUBLE)) + && (rules->tagMaxMembers[1] == POOL_MEMBER_COUNT_UNLIMITED || rules->tagMaxMembers[1] >= 1)) + { + // Find required + ace tags + bool32 foundRequiredTag = FALSE; + u32 firstAceIndex = POOL_SLOT_DISABLED; + for (u32 currIndex = 0; currIndex < trainer->poolSize; currIndex++) + { + if ((poolIndexArray[currIndex] != POOL_SLOT_DISABLED) + && (trainer->party[poolIndexArray[currIndex]].tags & (1u << POOL_TAG_ACE))) + { + if (firstAceIndex == POOL_SLOT_DISABLED) + firstAceIndex = currIndex; + HasRequiredTag(trainer, poolIndexArray, rules, &arrayIndex, &foundRequiredTag, currIndex); + } + if (foundRequiredTag) + break; + } + // If a combination of required + ace wasn't found, apply the first found lead + if (foundRequiredTag) + { + monIndex = poolIndexArray[arrayIndex]; + poolIndexArray[arrayIndex] = POOL_SLOT_DISABLED; + } + else if (firstAceIndex != POOL_SLOT_DISABLED) + { + monIndex = poolIndexArray[firstAceIndex]; + poolIndexArray[firstAceIndex] = POOL_SLOT_DISABLED; + } + } + return monIndex; +} + +static u32 DefaultOtherPickFunction(const struct Trainer *trainer, u8 *poolIndexArray, u32 partyIndex, u32 monsCount, u32 battleTypeFlags, struct PoolRules *rules) +{ + u32 arrayIndex = 0; + u32 monIndex = POOL_SLOT_DISABLED; + // monIndex is set to 255 if nothing has been chosen yet, this gives an upper limit on pool size of 255 + // Find required tag + bool32 foundRequiredTag = FALSE; + u32 firstUnpickedIndex = POOL_SLOT_DISABLED; + for (u32 currIndex = 0; currIndex < trainer->poolSize; currIndex++) + { + if (poolIndexArray[currIndex] != POOL_SLOT_DISABLED + && !(trainer->party[poolIndexArray[currIndex]].tags & (1u << POOL_TAG_LEAD)) + && !(trainer->party[poolIndexArray[currIndex]].tags & (1u << POOL_TAG_ACE))) + { + if (firstUnpickedIndex == POOL_SLOT_DISABLED) + firstUnpickedIndex = currIndex; + HasRequiredTag(trainer, poolIndexArray, rules, &arrayIndex, &foundRequiredTag, currIndex); + } + if (foundRequiredTag) + break; + } + // If a combination of required + ace wasn't found, apply the first found lead + if (foundRequiredTag) + { + monIndex = poolIndexArray[arrayIndex]; + poolIndexArray[arrayIndex] = POOL_SLOT_DISABLED; + } + else if (firstUnpickedIndex != POOL_SLOT_DISABLED) + { + monIndex = poolIndexArray[firstUnpickedIndex]; + poolIndexArray[firstUnpickedIndex] = POOL_SLOT_DISABLED; + } + return monIndex; +} + +static u32 PickLowest(const struct Trainer *trainer, u8 *poolIndexArray, u32 partyIndex, u32 monsCount, u32 battleTypeFlags, struct PoolRules *rules) +{ + u32 monIndex = POOL_SLOT_DISABLED; + u32 lowestIndex = POOL_SLOT_DISABLED; + for (u32 i = 0; i < trainer->poolSize; i++) + { + if (poolIndexArray[i] < monIndex) + { + lowestIndex = i; + monIndex = poolIndexArray[i]; + } + } + if (lowestIndex == POOL_SLOT_DISABLED) + return POOL_SLOT_DISABLED; + poolIndexArray[lowestIndex] = POOL_SLOT_DISABLED; + return monIndex; +} + +static u32 PickMonFromPool(const struct Trainer *trainer, u8 *poolIndexArray, u32 partyIndex, u32 monsCount, u32 battleTypeFlags, struct PoolRules *rules, struct PickFunctions pickFunctions) +{ + u32 monIndex = POOL_SLOT_DISABLED; + // Pick Lead + if (monIndex == POOL_SLOT_DISABLED) + monIndex = pickFunctions.LeadFunction(trainer, poolIndexArray, partyIndex, monsCount, battleTypeFlags, rules); + // Pick Ace + if (monIndex == POOL_SLOT_DISABLED) + monIndex = pickFunctions.AceFunction(trainer, poolIndexArray, partyIndex, monsCount, battleTypeFlags, rules); + // If no mon has been found yet continue looking + if (monIndex == POOL_SLOT_DISABLED) + monIndex = pickFunctions.OtherFunction(trainer, poolIndexArray, partyIndex, monsCount, battleTypeFlags, rules); + u32 chosenTags = trainer->party[monIndex].tags; + u16 chosenSpecies = trainer->party[monIndex].species; + u16 chosenItem = trainer->party[monIndex].heldItem; + u16 chosenNatDex = gSpeciesInfo[chosenSpecies].natDexNum; + // If tag was required, change pool rule to account for the required tag already being picked + u32 tagsToEliminate = 0; + for (u32 currTag = 0; currTag < POOL_NUM_TAGS; currTag++) + { + if (chosenTags & (1u << currTag) + && rules->tagMaxMembers[currTag] != POOL_MEMBER_COUNT_UNLIMITED) + { + if (rules->tagMaxMembers[currTag] == 1) + rules->tagMaxMembers[currTag] = POOL_MEMBER_COUNT_NONE; + else + rules->tagMaxMembers[currTag]--; + } + if (chosenTags & (1u << currTag)) + rules->tagRequired[currTag] = FALSE; + if (rules->tagMaxMembers[currTag] == POOL_MEMBER_COUNT_NONE) + tagsToEliminate |= 1u << currTag; + } + // If species clause, remove picked species from pool + // If item clause, remove all mons with same held item from pool + // If matching a tag that's been exhausted, remove from pool + for (u32 currIndex = 0; currIndex < trainer->poolSize; currIndex++) + { + if (poolIndexArray[currIndex] != POOL_SLOT_DISABLED) + { + u32 currentTags = trainer->party[poolIndexArray[currIndex]].tags; + u16 currentSpecies = trainer->party[poolIndexArray[currIndex]].species; + u16 currentItem = trainer->party[poolIndexArray[currIndex]].heldItem; + u16 currentNatDex = gSpeciesInfo[currentSpecies].natDexNum; + if (currentTags & tagsToEliminate) + { + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + } + if (rules->speciesClause && chosenSpecies == currentSpecies) + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + if (!rules->excludeForms && chosenNatDex == currentNatDex) + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + if (rules->itemClause && currentItem != ITEM_NONE) + { + if (rules->itemClauseExclusions) + { + bool32 isExcluded = FALSE; + for (u32 i = 0; i < ARRAY_COUNT(poolItemClauseExclusions); i++) + { + if (chosenItem == poolItemClauseExclusions[i]) + { + isExcluded = TRUE; + break; + } + } + if (!isExcluded) + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + } + else if (chosenItem == currentItem) + { + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + } + } + } + } + return monIndex; +} + +static u32 GetPoolSeed(const struct Trainer *trainer) +{ + u32 seed; + if (B_POOL_SETTING_USE_FIXED_SEED) + seed = B_POOL_SETTING_FIXED_SEED; + else + seed = gSaveBlock2Ptr->playerTrainerId[0] + (gSaveBlock2Ptr->playerTrainerId[1] << 8) + (gSaveBlock2Ptr->playerTrainerId[2] << 16) + (gSaveBlock2Ptr->playerTrainerId[3] << 24); + seed ^= (u32)trainer; + return seed; +} + +static void RandomizePoolIndices(const struct Trainer *trainer, u8 *poolIndexArray) +{ + // Basically the modern (Durstenfield's) Fisher-Yates shuffle + // Reducing the amount of calls to random needed by only using as many bits as needed per shuffle + u32 poolSize = trainer->poolSize; + for (u32 i = 0; i < poolSize; i++) + poolIndexArray[i] = i; + u32 rnd; + rng_value_t localRngState; + if (B_POOL_SETTING_CONSISTENT_RNG) + { + u32 seed = GetPoolSeed(trainer); + localRngState = LocalRandomSeed(seed); + // Replace the LocalRandom with LocalRandom32 when implemented + rnd = LocalRandom32(&localRngState); + } + else + { + rnd = Random32(); + } + u32 usedBits = 0; + for (u32 i = 0; i < poolSize - 1; i++) + { + u32 numBits = 1; + if (poolSize - i > 127) + numBits = 8; + else if (poolSize - i > 63) + numBits = 7; + else if (poolSize - i > 31) + numBits = 6; + else if (poolSize - i > 15) + numBits = 5; + else if (poolSize - i > 7) + numBits = 4; + else if (poolSize - i > 3) + numBits = 3; + else if (poolSize - i > 1) + numBits = 2; + if (usedBits + numBits > 32) + { + if (B_POOL_SETTING_CONSISTENT_RNG) + rnd = LocalRandom32(&localRngState); + else + rnd = Random32(); + usedBits = 0; + } + u32 currIndex = (rnd & ((1u << numBits) - 1)) % (poolSize - i); + rnd = rnd >> numBits; + usedBits += numBits; + u32 tempValue = poolIndexArray[poolSize - 1 - i]; + poolIndexArray[poolSize - 1 - i] = poolIndexArray[currIndex]; + poolIndexArray[currIndex] = tempValue; + } +} + +static struct PickFunctions GetPickFunctions(const struct Trainer *trainer) +{ + struct PickFunctions pickFunctions; + switch (trainer->poolPickIndex) + { + // Repeats, but better to have the safety + case POOL_PICK_DEFAULT: + pickFunctions.LeadFunction = &DefaultLeadPickFunction; + pickFunctions.AceFunction = &DefaultAcePickFunction; + pickFunctions.OtherFunction = &DefaultOtherPickFunction; + break; + case POOL_PICK_LOWEST: + pickFunctions.LeadFunction = &PickLowest; + pickFunctions.AceFunction = &PickLowest; + pickFunctions.OtherFunction = &PickLowest; + break; + default: + pickFunctions.LeadFunction = &DefaultLeadPickFunction; + pickFunctions.AceFunction = &DefaultAcePickFunction; + pickFunctions.OtherFunction = &DefaultOtherPickFunction; + break; + } + return pickFunctions; +} + +static void TestPrune(const struct Trainer *trainer, u8 *poolIndexArray, const struct PoolRules *rules) +{ + // Test function to demonstrate pruning + for (u32 i = 0; i < trainer->poolSize; i++) + if (trainer->party[poolIndexArray[i]].species == SPECIES_WOBBUFFET) + poolIndexArray[i] = POOL_SLOT_DISABLED; +} + +static void RandomTagPrune(const struct Trainer *trainer, u8 *poolIndexArray, const struct PoolRules *rules) +{ + u32 tagToUse = trainer->party[poolIndexArray[0]].tags; + for (u32 i = 0; i < trainer->poolSize; i++) + if (!(trainer->party[poolIndexArray[i]].tags & tagToUse)) + poolIndexArray[i] = POOL_SLOT_DISABLED; +} + +static void PrunePool(const struct Trainer *trainer, u8 *poolIndexArray, const struct PoolRules *rules) +{ + // Use defined pruning functions go here + switch (trainer->poolPruneIndex) + { + case POOL_PRUNE_NONE: + break; + case POOL_PRUNE_TEST: + TestPrune(trainer, poolIndexArray, rules); + break; + case POOL_PRUNE_RANDOM_TAG: + RandomTagPrune(trainer, poolIndexArray, rules); + break; + default: + break; + } +} + +void DoTrainerPartyPool(const struct Trainer *trainer, u32 *monIndices, u8 monsCount, u32 battleTypeFlags) +{ + bool32 usingPool = FALSE; + struct PoolRules rules = defaultPoolRules; + if (trainer->poolSize != 0) + { + usingPool = TRUE; + rules = gPoolRulesetsList[trainer->poolRuleIndex]; + u8 *poolIndexArray = Alloc(trainer->poolSize); + RandomizePoolIndices(trainer, poolIndexArray); + + struct PickFunctions pickFunctions = GetPickFunctions(trainer); + + PrunePool(trainer, poolIndexArray, &rules); + + for (u32 i = 0; i < monsCount; i++) + { + monIndices[i] = PickMonFromPool(trainer, poolIndexArray, i, monsCount, battleTypeFlags, &rules, pickFunctions); + // If the slot doesn't have a proper value, the pool creation failed, fall back to normal mon pick process + if (monIndices[i] == POOL_SLOT_DISABLED) + { + usingPool = FALSE; + break; + } + } + Free(poolIndexArray); + } + + if (!usingPool) + for (u32 i = 0; i < monsCount; i++) + monIndices[i] = i; +} diff --git a/src/trainer_see.c b/src/trainer_see.c index 2582637aa1..07eb46efdd 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -2,6 +2,7 @@ #include "battle_setup.h" #include "event_data.h" #include "event_object_movement.h" +#include "event_scripts.h" #include "field_effect.h" #include "field_player_avatar.h" #include "pokemon.h" @@ -375,6 +376,16 @@ bool8 CheckForTrainersWantingBattle(void) continue; numTrainers = CheckTrainer(i); + if (numTrainers == 0xFF) // non-trainerbatle script + { + u32 objectEventId = gApproachingTrainers[gNoOfApproachingTrainers - 1].objectEventId; + gSelectedObjectEvent = objectEventId; + gSpecialVar_LastTalked = gObjectEvents[objectEventId].localId; + ScriptContext_SetupScript(EventScript_ObjectApproachPlayer); + LockPlayerFieldControls(); + return TRUE; + } + if (numTrainers == 2) break; @@ -417,14 +428,33 @@ bool8 CheckForTrainersWantingBattle(void) static u8 CheckTrainer(u8 objectEventId) { - const u8 *scriptPtr; + const u8 *scriptPtr, *trainerBattlePtr; u8 numTrainers = 1; - u8 approachDistance; + + u8 approachDistance = GetTrainerApproachDistance(&gObjectEvents[objectEventId]); + if (approachDistance == 0) + return 0; if (InTrainerHill() == TRUE) - scriptPtr = GetTrainerHillTrainerScript(); + { + trainerBattlePtr = scriptPtr = GetTrainerHillTrainerScript(); + } else - scriptPtr = GetObjectEventScriptPointerByObjectEventId(objectEventId); + { + trainerBattlePtr = scriptPtr = GetObjectEventScriptPointerByObjectEventId(objectEventId); + struct ScriptContext ctx; + if (RunScriptImmediatelyUntilEffect(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE | SCREFF_TRAINERBATTLE, scriptPtr, &ctx)) + { + if (*ctx.scriptPtr == 0x5c) // trainerbattle + trainerBattlePtr = ctx.scriptPtr; + else + trainerBattlePtr = NULL; + } + else + { + return 0; // no effect + } + } if (InBattlePyramid()) { @@ -436,36 +466,37 @@ static u8 CheckTrainer(u8 objectEventId) if (GetHillTrainerFlag(objectEventId)) return 0; } - else + else if (trainerBattlePtr) { - if (GetTrainerFlagFromScriptPointer(scriptPtr)) + if (GetTrainerFlagFromScriptPointer(trainerBattlePtr)) return 0; } - - approachDistance = GetTrainerApproachDistance(&gObjectEvents[objectEventId]); - - if (approachDistance != 0) + else { - if (scriptPtr[1] == TRAINER_BATTLE_DOUBLE - || scriptPtr[1] == TRAINER_BATTLE_REMATCH_DOUBLE - || scriptPtr[1] == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE) + numTrainers = 0xFF; + } + + if (trainerBattlePtr) + { + TrainerBattleParameter *temp = (TrainerBattleParameter *)(trainerBattlePtr + 1); + if (temp->params.mode == TRAINER_BATTLE_DOUBLE + || temp->params.mode == TRAINER_BATTLE_REMATCH_DOUBLE + || temp->params.mode == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE) { if (GetMonsStateToDoubles_2() != PLAYER_HAS_TWO_USABLE_MONS) return 0; numTrainers = 2; } - - gApproachingTrainers[gNoOfApproachingTrainers].objectEventId = objectEventId; - gApproachingTrainers[gNoOfApproachingTrainers].trainerScriptPtr = scriptPtr; - gApproachingTrainers[gNoOfApproachingTrainers].radius = approachDistance; - InitTrainerApproachTask(&gObjectEvents[objectEventId], approachDistance - 1); - gNoOfApproachingTrainers++; - - return numTrainers; } - return 0; + gApproachingTrainers[gNoOfApproachingTrainers].objectEventId = objectEventId; + gApproachingTrainers[gNoOfApproachingTrainers].trainerScriptPtr = scriptPtr; + gApproachingTrainers[gNoOfApproachingTrainers].radius = approachDistance; + InitTrainerApproachTask(&gObjectEvents[objectEventId], approachDistance - 1); + gNoOfApproachingTrainers++; + + return numTrainers; } static u8 GetTrainerApproachDistance(struct ObjectEvent *trainerObj) diff --git a/src/trainer_slide.c b/src/trainer_slide.c new file mode 100644 index 0000000000..209f47f0c3 --- /dev/null +++ b/src/trainer_slide.c @@ -0,0 +1,413 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_controllers.h" +#include "battle_message.h" +#include "battle_setup.h" +#include "battle_tower.h" +#include "battle_z_move.h" +#include "data.h" +#include "event_data.h" +#include "frontier_util.h" +#include "graphics.h" +#include "international_string_util.h" +#include "item.h" +#include "link.h" +#include "menu.h" +#include "palette.h" +#include "recorded_battle.h" +#include "string_util.h" +#include "strings.h" +#include "test_runner.h" +#include "text.h" +#include "trainer_hill.h" +#include "window.h" +#include "line_break.h" +#include "constants/abilities.h" +#include "constants/battle_dome.h" +#include "constants/battle_string_ids.h" +#include "constants/frontier_util.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/opponents.h" +#include "constants/species.h" +#include "constants/trainers.h" +#include "constants/trainer_hill.h" +#include "constants/weather.h" +#include "trainer_slide.h" +#include "battle_message.h" + +static u32 BattlerHPPercentage(u32 battler, u32 operation, u32 threshold); +static u32 GetEnemyMonCount(u32 firstId, u32 lastId, bool32 onlyAlive); +static bool32 DoesTrainerHaveSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId); +static bool32 ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(enum TrainerSlideType slideId); +static bool32 ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(enum TrainerSlideType slideId); +static bool32 ShouldRunTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 battler, enum TrainerSlideType slideId); +static bool32 ShouldRunTrainerSlidePlayerLandsFirstSTABMove(u32 firstId, u32 lastId, enum TrainerSlideType slideId); +static bool32 ShouldRunTrainerSlidePlayerLandsFirstDown(u32 firstId, u32 lastId); +static bool32 ShouldRunTrainerSlideEnemyMonUnaffected(u32 firstId, u32 lastId, enum TrainerSlideType slideId); +static bool32 ShouldRunTrainerSlideLastSwitchIn(u32 battler); +static bool32 ShouldRunTrainerSlideLastHalfHP(u32 firstId, u32 lastId, u32 battler); +static bool32 ShouldRunTrainerSlideLastLowHp(u32 firstId, u32 lastId, u32 battler); +static void SetTrainerSlideParamters(u32 battler, u32* firstId, u32* lastId, u32* trainerId, u32* retValue); +static bool32 IsSlideInitalizedOrPlayed(enum TrainerSlideType slideId); + +static const u8* const sTrainerSlides[DIFFICULTY_COUNT][TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = +{ + [DIFFICULTY_NORMAL] = + { + }, +}; + +static const u8* const sFrontierTrainerSlides[DIFFICULTY_COUNT][FRONTIER_TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = +{ + [DIFFICULTY_NORMAL] = + { + }, +}; + +static const u8* const sTestTrainerSlides[DIFFICULTY_COUNT][TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = +{ +#include "../test/battle/trainer_slides.h" +}; + +static u32 BattlerHPPercentage(u32 battler, u32 operation, u32 threshold) +{ + switch (operation) + { + case LESS_THAN: + return gBattleMons[battler].hp < (gBattleMons[battler].maxHP / threshold); + case EQUAL: + return gBattleMons[battler].hp == (gBattleMons[battler].maxHP / threshold); + case GREATER_THAN: + return gBattleMons[battler].hp > (gBattleMons[battler].maxHP / threshold); + case LESS_THAN_OR_EQUAL: + return gBattleMons[battler].hp <= (gBattleMons[battler].maxHP / threshold); + case GREATER_THAN_OR_EQUAL: + return gBattleMons[battler].hp >= (gBattleMons[battler].maxHP / threshold); + case NOT_EQUAL: + default: + return gBattleMons[battler].hp != (gBattleMons[battler].maxHP / threshold); + } +} + +static u32 GetEnemyMonCount(u32 firstId, u32 lastId, bool32 onlyAlive) +{ + u32 i, count = 0; + + for (i = firstId; i < lastId; i++) + { + u32 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG, NULL); + if (species != SPECIES_NONE + && species != SPECIES_EGG + && (!onlyAlive || GetMonData(&gEnemyParty[i], MON_DATA_HP, NULL))) + count++; + } + + return count; +} + +static const u8* const *GetTrainerSlideArray(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId) +{ + if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) + return sFrontierTrainerSlides[difficulty][trainerId]; + else if (TESTING) + return sTestTrainerSlides[difficulty][trainerId]; + else + return sTrainerSlides[difficulty][trainerId]; +} + +static bool32 DoesTrainerHaveSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId) +{ + const u8* const *trainerSlides = GetTrainerSlideArray(difficulty, trainerId, slideId); + const u8* const *trainerSlidesNormal = GetTrainerSlideArray(DIFFICULTY_NORMAL, trainerId, slideId); + + if (trainerSlides[slideId] == NULL) + return (trainerSlidesNormal[slideId] != NULL); + else + return TRUE; +} + +void SetTrainerSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId) +{ + const u8* const *trainerSlides = GetTrainerSlideArray(difficulty, trainerId, slideId); + const u8* const *trainerSlidesNormal = GetTrainerSlideArray(DIFFICULTY_NORMAL, trainerId, slideId); + + if (trainerSlides[slideId] != NULL) + gBattleStruct->trainerSlideMsg = trainerSlides[slideId]; + else + gBattleStruct->trainerSlideMsg = trainerSlidesNormal[slideId]; +} + +static bool32 ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(enum TrainerSlideType slideId) +{ + return IsTrainerSlideInitialized(slideId); +} + +static bool32 ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(enum TrainerSlideType slideId) +{ + return IsTrainerSlideInitialized(slideId); +} + +static bool32 ShouldRunTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 battler, enum TrainerSlideType slideId) +{ + if (!IsTrainerSlideInitialized(slideId)) + return FALSE; + + if (!IsBattlerAlive(battler)) + return FALSE; + + return TRUE; +} + +static bool32 ShouldRunTrainerSlidePlayerLandsFirstSTABMove(u32 firstId, u32 lastId, enum TrainerSlideType slideId) +{ + if (!IsTrainerSlideInitialized(slideId)) + return FALSE; + + if (GetEnemyMonCount(firstId, lastId, TRUE) != GetEnemyMonCount(firstId, lastId, FALSE)) + return FALSE; + + return TRUE; +} + +static bool32 ShouldRunTrainerSlidePlayerLandsFirstDown(u32 firstId, u32 lastId) +{ + return ((GetEnemyMonCount(firstId, lastId, TRUE) == (GetEnemyMonCount(firstId, lastId, FALSE) - 1))); +} + +static bool32 ShouldRunTrainerSlideEnemyMonUnaffected(u32 firstId, u32 lastId, enum TrainerSlideType slideId) +{ + if (!IsTrainerSlideInitialized(slideId)) + return FALSE; + + return (GetEnemyMonCount(firstId, lastId, TRUE) == GetEnemyMonCount(firstId, lastId, FALSE)); +} + +static bool32 ShouldRunTrainerSlideLastSwitchIn(u32 battler) +{ + return !CanBattlerSwitch(battler); +} + +static bool32 ShouldRunTrainerSlideLastHalfHP(u32 firstId, u32 lastId, u32 battler) +{ + if (GetEnemyMonCount(firstId, lastId, TRUE) != 1) + return FALSE; + + if (BattlerHPPercentage(battler, GREATER_THAN, 2)) + return FALSE; + + return (BattlerHPPercentage(battler, GREATER_THAN, 4)); +} + +static bool32 ShouldRunTrainerSlideLastLowHp(u32 firstId, u32 lastId, u32 battler) +{ + if (GetEnemyMonCount(firstId, lastId, TRUE) != 1) + return FALSE; + + return (BattlerHPPercentage(battler, LESS_THAN_OR_EQUAL, 4)); +} + +static void SetTrainerSlideParamters(u32 battler, u32* firstId, u32* lastId, u32* trainerId, u32* retValue) +{ + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { + if (gBattlerPartyIndexes[battler] >= MULTI_PARTY_SIZE) + { + *firstId = MULTI_PARTY_SIZE; + *lastId = PARTY_SIZE; + *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentB); + *retValue = TRAINER_SLIDE_TARGET_TRAINER_B; + } + else + { + *firstId = 0; + *lastId = MULTI_PARTY_SIZE; + *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); + } + } + else + { + *firstId = 0; + *lastId = PARTY_SIZE; + *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); + } +} + +enum TrainerSlideTargets ShouldDoTrainerSlide(u32 battler, enum TrainerSlideType slideId) +{ + u32 firstId, lastId, trainerId; + u32 retValue = TRAINER_SLIDE_TARGET_TRAINER_A; + bool32 shouldRun = FALSE; + + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) || GetBattlerSide(battler) != B_SIDE_OPPONENT) + return TRAINER_SLIDE_TARGET_NONE; + + SetTrainerSlideParamters(battler, &firstId, &lastId, &trainerId, &retValue); + enum DifficultyLevel difficulty = GetCurrentDifficultyLevel(); + + gBattleScripting.battler = battler; + + if (IsTrainerSlidePlayed(slideId)) + return TRAINER_SLIDE_TARGET_NONE; + + if (!DoesTrainerHaveSlideMessage(difficulty,trainerId,slideId)) + return TRAINER_SLIDE_TARGET_NONE; + + switch (slideId) + { + case TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT: + shouldRun = ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(slideId); + break; + case TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT: + shouldRun = ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(slideId); + break; + case TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT: + shouldRun = ShouldRunTrainerSlidePlayerLandsFirstSuperEffectiveHit(battler, slideId); + break; + case TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE: + shouldRun = ShouldRunTrainerSlidePlayerLandsFirstSTABMove(firstId, lastId, slideId); + break; + case TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN: + shouldRun = ShouldRunTrainerSlidePlayerLandsFirstDown(firstId, lastId); + break; + case TRAINER_SLIDE_ENEMY_MON_UNAFFECTED: + shouldRun = ShouldRunTrainerSlideEnemyMonUnaffected(firstId, lastId, slideId); + break; + case TRAINER_SLIDE_LAST_SWITCHIN: + shouldRun = ShouldRunTrainerSlideLastSwitchIn(battler); + break; + case TRAINER_SLIDE_LAST_HALF_HP: + shouldRun = ShouldRunTrainerSlideLastHalfHP(firstId, lastId, battler); + break; + case TRAINER_SLIDE_LAST_LOW_HP: + shouldRun = ShouldRunTrainerSlideLastLowHp(firstId, lastId, battler); + break; + case TRAINER_SLIDE_BEFORE_FIRST_TURN: + case TRAINER_SLIDE_MEGA_EVOLUTION: + case TRAINER_SLIDE_Z_MOVE: + case TRAINER_SLIDE_DYNAMAX: + shouldRun = TRUE; + break; + default: + return TRAINER_SLIDE_TARGET_NONE; + } + + if (shouldRun == FALSE) + return TRAINER_SLIDE_TARGET_NONE; + + MarkTrainerSlideAsPlayed(slideId); + SetTrainerSlideMessage(difficulty,trainerId,slideId); + return retValue; +} + +static bool32 IsSlideInitalizedOrPlayed(enum TrainerSlideType slideId) +{ + if (IsTrainerSlideInitialized(slideId)) + return TRUE; + + if (IsTrainerSlidePlayed(slideId)) + return TRUE; + + return FALSE; +} + +void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 moveType) +{ + enum TrainerSlideType slideId = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; + + if (IsSlideInitalizedOrPlayed(slideId)) + return; + + if ((GetBattlerSide(battlerDef) == B_SIDE_PLAYER)) + return; + + if (IS_BATTLER_OF_TYPE(battlerAtk, moveType) == FALSE) + return; + + InitalizeTrainerSlide(slideId); +} + +void TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(u32 target) +{ + enum TrainerSlideType slideId = TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT; + + if (IsSlideInitalizedOrPlayed(slideId)) + return; + + if (GetBattlerSide(target) == B_SIDE_PLAYER) + return; + + InitalizeTrainerSlide(slideId); +} + +void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target) +{ + enum TrainerSlideType slideId = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; + + if (IsSlideInitalizedOrPlayed(slideId)) + return; + + if (GetBattlerSide(target) == B_SIDE_OPPONENT) + return; + + InitalizeTrainerSlide(slideId); +} + +void TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 target) +{ + enum TrainerSlideType slideId = TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT; + + if (IsSlideInitalizedOrPlayed(slideId)) + return; + + if (GetBattlerSide(target) == B_SIDE_PLAYER) + return; + + InitalizeTrainerSlide(slideId); +} + +void TryInitializeTrainerSlideEnemyMonUnaffected(u32 target) +{ + enum TrainerSlideType slideId = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; + + if (IsSlideInitalizedOrPlayed(slideId)) + return; + + if (GetBattlerSide(target) != B_SIDE_OPPONENT) + return; + + InitalizeTrainerSlide(slideId); +} + +bool32 IsTrainerSlideInitialized(enum TrainerSlideType slideId) +{ + u32 arrayIndex = slideId / TRAINER_SLIDES_PER_ARRAY; + u32 bitPosition = slideId % TRAINER_SLIDES_PER_ARRAY; + + return (gBattleStruct->slideMessageStatus.messageInitalized[arrayIndex] & (1 << bitPosition)) != 0; +} + +bool32 IsTrainerSlidePlayed(enum TrainerSlideType slideId) +{ + u32 arrayIndex = slideId / TRAINER_SLIDES_PER_ARRAY; + u32 bitPosition = slideId % TRAINER_SLIDES_PER_ARRAY; + + return (gBattleStruct->slideMessageStatus.messagePlayed[arrayIndex] & (1 << bitPosition)) != 0; +} + +void InitalizeTrainerSlide(enum TrainerSlideType slideId) +{ + u32 arrayIndex = slideId / TRAINER_SLIDES_PER_ARRAY; + u32 bitPosition = slideId % TRAINER_SLIDES_PER_ARRAY; + + gBattleStruct->slideMessageStatus.messageInitalized[arrayIndex] |= (1 << bitPosition); +} + +void MarkTrainerSlideAsPlayed(enum TrainerSlideType slideId) +{ + u32 arrayIndex = slideId / TRAINER_SLIDES_PER_ARRAY; + u32 bitPosition = slideId % TRAINER_SLIDES_PER_ARRAY; + + gBattleStruct->slideMessageStatus.messagePlayed[arrayIndex] |= (1 << bitPosition); +} diff --git a/src/union_room.c b/src/union_room.c index ac4c61035a..3337cdec93 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -2464,18 +2464,19 @@ static void ScheduleFieldMessageAndExit(const u8 *src) StringExpandPlaceholders(gStringVar4, src); } +#define PLAYER_LIST_BUFFER_SIZE (MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer)) + +// Note: This probably could be alloced instead, but I'm not familiar enough with the union room system. +static EWRAM_DATA ALIGNED(4) u8 sPlayerListBuffer[PLAYER_LIST_BUFFER_SIZE]; + static void CopyPlayerListToBuffer(struct WirelessLink_URoom *uroom) { - memcpy(&gDecompressionBuffer[sizeof(gDecompressionBuffer) - (MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer))], - uroom->playerList, - MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer)); + memcpy(sPlayerListBuffer, uroom->playerList, PLAYER_LIST_BUFFER_SIZE); } static void CopyPlayerListFromBuffer(struct WirelessLink_URoom *uroom) { - memcpy(uroom->playerList, - &gDecompressionBuffer[sizeof(gDecompressionBuffer) - (MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer))], - MAX_UNION_ROOM_LEADERS * sizeof(struct RfuPlayer)); + memcpy(uroom->playerList, sPlayerListBuffer, PLAYER_LIST_BUFFER_SIZE); } static void Task_RunUnionRoom(u8 taskId) diff --git a/src/union_room_battle.c b/src/union_room_battle.c index 4d5f7d8278..2bcbaef19c 100644 --- a/src/union_room_battle.c +++ b/src/union_room_battle.c @@ -69,7 +69,7 @@ static void CB2_SetUpPartiesAndStartBattle(void) } IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES); CalculatePlayerPartyCount(); - gTrainerBattleOpponent_A = TRAINER_UNION_ROOM; + TRAINER_BATTLE_PARAM.opponentA = TRAINER_UNION_ROOM; SetMainCallback2(CB2_InitBattle); } diff --git a/src/vs_seeker.c b/src/vs_seeker.c index 771c01dc72..15829c3bd5 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -513,7 +513,7 @@ void ClearRematchMovementByTrainerId(void) struct ObjectEventTemplate *objectEventTemplates = gSaveBlock1Ptr->objectEventTemplates; struct ObjectEvent *objectEvent; - int vsSeekerDataIdx = TrainerIdToRematchTableId(gRematchTable, gTrainerBattleOpponent_A); + int vsSeekerDataIdx = TrainerIdToRematchTableId(gRematchTable, TRAINER_BATTLE_PARAM.opponentA); if (!I_VS_SEEKER_CHARGING) return; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 033eec56da..bd00e58fcd 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -186,7 +186,7 @@ static void FeebasSeedRng(u16 seed) } // LAND_WILD_COUNT -static u8 ChooseWildMonIndex_Land(void) +u8 ChooseWildMonIndex_Land(void) { u8 wildMonIndex = 0; bool8 swap = FALSE; @@ -227,7 +227,7 @@ static u8 ChooseWildMonIndex_Land(void) } // ROCK_WILD_COUNT / WATER_WILD_COUNT -static u8 ChooseWildMonIndex_WaterRock(void) +u8 ChooseWildMonIndex_WaterRock(void) { u8 wildMonIndex = 0; bool8 swap = FALSE; @@ -354,7 +354,7 @@ static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon, u8 wildMonIn } } -static u16 GetCurrentMapWildMonHeaderId(void) +u16 GetCurrentMapWildMonHeaderId(void) { u16 i; @@ -417,7 +417,7 @@ u8 PickWildMonNature(void) return Random() % NUM_NATURES; } -static void CreateWildMon(u16 species, u8 level) +void CreateWildMon(u16 species, u8 level) { bool32 checkCuteCharm = TRUE; @@ -1134,3 +1134,24 @@ bool8 StandardWildEncounter_Debug(void) DoStandardWildBattle_Debug(); return TRUE; } + +u8 ChooseHiddenMonIndex(void) +{ + #ifdef ENCOUNTER_CHANCE_HIDDEN_MONS_TOTAL + u8 rand = Random() % ENCOUNTER_CHANCE_HIDDEN_MONS_TOTAL; + + if (rand < ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_0) + return 0; + else if (rand >= ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_1) + return 1; + else + return 2; + #else + return 0xFF; + #endif +} + +bool32 MapHasNoEncounterData(void) +{ + return (GetCurrentMapWildMonHeaderId() == HEADER_NONE); +} diff --git a/test/battle/ability/aerilate.c b/test/battle/ability/aerilate.c index 4386034a59..efd6776d9b 100644 --- a/test/battle/ability/aerilate.c +++ b/test/battle/ability/aerilate.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); } SINGLE_BATTLE_TEST("Aerilate turns a Normal-type move into Flying-type move") diff --git a/test/battle/ability/anger_point.c b/test/battle/ability/anger_point.c index b803b40f3f..7e8be8cb33 100644 --- a/test/battle/ability/anger_point.c +++ b/test/battle/ability/anger_point.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Anger Point raises Attack stage to maximum after receiving a critical hit") { GIVEN { - ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit); + ASSUME(MoveAlwaysCrits(MOVE_FROST_BREATH)); PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); } OPPONENT(SPECIES_SNORUNT); } WHEN { @@ -23,8 +23,8 @@ SINGLE_BATTLE_TEST("Anger Point raises Attack stage to maximum after receiving a SINGLE_BATTLE_TEST("Anger Point does not trigger when already at maximum Attack stage") { GIVEN { - ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit); - ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM); + ASSUME(MoveAlwaysCrits(MOVE_FROST_BREATH)); + ASSUME(GetMoveEffect(MOVE_BELLY_DRUM) == EFFECT_BELLY_DRUM); PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); Speed(2); } OPPONENT(SPECIES_SNORUNT) { Speed(1); } } WHEN { @@ -50,8 +50,8 @@ TO_DO_BATTLE_TEST("Anger Point triggers when a substitute takes the hit (Gen4)") SINGLE_BATTLE_TEST("Anger Point does not trigger when a substitute takes the hit (Gen5+)") { GIVEN { - ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit); - ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE); + ASSUME(MoveAlwaysCrits(MOVE_FROST_BREATH)); + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); Speed(2); } OPPONENT(SPECIES_SNORUNT) { Speed(1); } } WHEN { diff --git a/test/battle/ability/anger_shell.c b/test/battle/ability/anger_shell.c index cf28fad28c..0dde568ca0 100644 --- a/test/battle/ability/anger_shell.c +++ b/test/battle/ability/anger_shell.c @@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Anger Shell activates only if the target had more than 50% o PARAMETRIZE { hp = 254; activates = TRUE; } GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); PLAYER(SPECIES_KLAWF) { Ability(ABILITY_ANGER_SHELL); MaxHP(maxHp); HP(hp); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Anger Shell lowers Def/Sp.Def by 1 and raises Atk/Sp.Atk/Spd { u16 maxHp = 500; GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); PLAYER(SPECIES_KLAWF) { Ability(ABILITY_ANGER_SHELL); MaxHP(maxHp); HP(maxHp / 2 + 1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -73,7 +73,7 @@ SINGLE_BATTLE_TEST("Anger Shell activates after all hits from a multi-hit move") u32 j; u16 maxHp = 500; GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_SLAP].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KLAWF) { Ability(ABILITY_ANGER_SHELL); MaxHP(maxHp); HP(maxHp / 2 + 1); } OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } // Always hits 5 times. } WHEN { diff --git a/test/battle/ability/aroma_veil.c b/test/battle/ability/aroma_veil.c index 4965fec217..08dedfae6e 100644 --- a/test/battle/ability/aroma_veil.c +++ b/test/battle/ability/aroma_veil.c @@ -7,8 +7,8 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Taunt") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_TAUNT].effect == EFFECT_TAUNT); - ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT); + ASSUME(GetMoveCategory(MOVE_HARDEN) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -28,8 +28,8 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Torment") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_TORMENT].effect == EFFECT_TORMENT); - ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_TORMENT) == EFFECT_TORMENT); + ASSUME(GetMoveCategory(MOVE_HARDEN) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -51,8 +51,8 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Encore") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_ENCORE].effect == EFFECT_ENCORE); - ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + ASSUME(GetMoveCategory(MOVE_HARDEN) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -74,8 +74,8 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Disable") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_DISABLE].effect == EFFECT_DISABLE); - ASSUME(gMovesInfo[MOVE_HARDEN].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_DISABLE) == EFFECT_DISABLE); + ASSUME(GetMoveCategory(MOVE_HARDEN) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -94,7 +94,7 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Disable") DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Cursed Body") { GIVEN { - ASSUME(gMovesInfo[MOVE_PECK].makesContact); + ASSUME(MoveMakesContact(MOVE_PECK)); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_JELLICENT) { Ability(ABILITY_CURSED_BODY); } @@ -118,8 +118,8 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Heal Block") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_HEAL_BLOCK].effect == EFFECT_HEAL_BLOCK); - ASSUME(gMovesInfo[MOVE_RECOVER].effect == EFFECT_RESTORE_HP); + ASSUME(GetMoveEffect(MOVE_HEAL_BLOCK) == EFFECT_HEAL_BLOCK); + ASSUME(GetMoveEffect(MOVE_RECOVER) == EFFECT_RESTORE_HP); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); HP(1); } PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -139,7 +139,7 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Infatuation") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_ATTRACT].effect == EFFECT_ATTRACT); + ASSUME(GetMoveEffect(MOVE_ATTRACT) == EFFECT_ATTRACT); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -156,7 +156,7 @@ DOUBLE_BATTLE_TEST("Aroma Veil protects the Pokémon's side from Infatuation") DOUBLE_BATTLE_TEST("Aroma Veil does not protect the Pokémon's side from Imprison") { GIVEN { - ASSUME(gMovesInfo[MOVE_IMPRISON].effect == EFFECT_IMPRISON); + ASSUME(GetMoveEffect(MOVE_IMPRISON) == EFFECT_IMPRISON); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) {Moves(MOVE_IMPRISON, MOVE_CELEBRATE); } @@ -180,7 +180,7 @@ DOUBLE_BATTLE_TEST("Aroma Veil prevents Psychic Noise's effect") PARAMETRIZE { moveTarget = playerLeft; } PARAMETRIZE { moveTarget = playerRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_PSYCHIC_NOISE].additionalEffects[0].moveEffect == MOVE_EFFECT_PSYCHIC_NOISE); + ASSUME(GetMoveAdditionalEffectById(MOVE_PSYCHIC_NOISE, 0)->moveEffect == MOVE_EFFECT_PSYCHIC_NOISE); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/battle_bond.c b/test/battle/ability/battle_bond.c index ef2b2753b3..f480367798 100644 --- a/test/battle/ability/battle_bond.c +++ b/test/battle/ability/battle_bond.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(!IS_MOVE_STATUS(MOVE_WATER_GUN)); + ASSUME(!IsBattleMoveStatus(MOVE_WATER_GUN)); } SINGLE_BATTLE_TEST("Battle Bond does not transform species other than Greninja") diff --git a/test/battle/ability/beads_of_ruin.c b/test/battle/ability/beads_of_ruin.c index bbc71f6c2b..63b07d7c8a 100644 --- a/test/battle/ability/beads_of_ruin.c +++ b/test/battle/ability/beads_of_ruin.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_WATER_GUN].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_ROLE_PLAY].effect == EFFECT_ROLE_PLAY); + ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveEffect(MOVE_ROLE_PLAY) == EFFECT_ROLE_PLAY); } SINGLE_BATTLE_TEST("Beads of Ruin reduces Sp. Def if opposing mon's ability doesn't match") @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Beads of Ruin reduces Sp. Def if opposing mon's ability does SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET) { HP(1);} PLAYER(SPECIES_CHI_YU); OPPONENT(SPECIES_WOBBUFFET); @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battler SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { HP(1);} diff --git a/test/battle/ability/berserk.c b/test/battle/ability/berserk.c index 7d7f905170..c96bb260f8 100644 --- a/test/battle/ability/berserk.c +++ b/test/battle/ability/berserk.c @@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Berserk activates only if the target had more than 50% of it PARAMETRIZE { hp = 254; activates = TRUE; } GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); MaxHP(maxHp); HP(hp); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Berserk raises Sp.Atk by 1") { u16 maxHp = 500; GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); MaxHP(maxHp); HP(maxHp / 2 + 1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -57,7 +57,7 @@ SINGLE_BATTLE_TEST("Berserk activates after all hits from a multi-hit move") u32 j; u16 maxHp = 500; GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_SLAP].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT); PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); MaxHP(maxHp); HP(maxHp / 2 + 1); } OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } // Always hits 5 times. } WHEN { diff --git a/test/battle/ability/big_pecks.c b/test/battle/ability/big_pecks.c index e8449fdf1a..44bb008a1d 100644 --- a/test/battle/ability/big_pecks.c +++ b/test/battle/ability/big_pecks.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Big Pecks prevents Defense stage reduction from moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } } WHEN { @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Big Pecks prevents Defense stage reduction from moves") SINGLE_BATTLE_TEST("Big Pecks is ignored by Mold Breaker") { GIVEN { - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } } WHEN { @@ -56,8 +56,8 @@ SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Defense stage reduction from moves SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Topsy-Turvy") { GIVEN { - ASSUME(gMovesInfo[MOVE_HARDEN].effect == EFFECT_DEFENSE_UP); - ASSUME(gMovesInfo[MOVE_TOPSY_TURVY].effect == EFFECT_TOPSY_TURVY); + ASSUME(GetMoveEffect(MOVE_HARDEN) == EFFECT_DEFENSE_UP); + ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } } WHEN { @@ -75,9 +75,9 @@ SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Topsy-Turvy") SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Spectral Thief from resetting positive Defense stage changes") { GIVEN { - ASSUME(gMovesInfo[MOVE_HARDEN].effect == EFFECT_DEFENSE_UP); - ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); - ASSUME(gMovesInfo[MOVE_SOAK].effect == EFFECT_SOAK); + ASSUME(GetMoveEffect(MOVE_HARDEN) == EFFECT_DEFENSE_UP); + ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); + ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } } WHEN { @@ -96,8 +96,8 @@ SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Spectral Thief from resetting posi SINGLE_BATTLE_TEST("Big Pecks doesn't prevent receiving negative Defense stage changes from Baton Pass") { GIVEN { - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); - ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } diff --git a/test/battle/ability/blaze.c b/test/battle/ability/blaze.c index a21d133359..c68c7466a1 100644 --- a/test/battle/ability/blaze.c +++ b/test/battle/ability/blaze.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Blaze boosts Fire-type moves in a pinch", s16 damage) PARAMETRIZE { hp = 99; } PARAMETRIZE { hp = 33; } GIVEN { - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); MaxHP(99); HP(hp); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/clear_body.c b/test/battle/ability/clear_body.c index cb4b21aefe..fd2317a545 100644 --- a/test/battle/ability/clear_body.c +++ b/test/battle/ability/clear_body.c @@ -58,13 +58,13 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent stat st } GIVEN { - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); - ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN); - ASSUME(gMovesInfo[MOVE_FAKE_TEARS].effect == EFFECT_SPECIAL_DEFENSE_DOWN_2); - ASSUME(gMovesInfo[MOVE_SCARY_FACE].effect == EFFECT_SPEED_DOWN_2); - ASSUME(gMovesInfo[MOVE_SWEET_SCENT].effect == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN)); - ASSUME(gMovesInfo[MOVE_SAND_ATTACK].effect == EFFECT_ACCURACY_DOWN); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_CONFIDE) == EFFECT_SPECIAL_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_FAKE_TEARS) == EFFECT_SPECIAL_DEFENSE_DOWN_2); + ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2); + ASSUME(GetMoveEffect(MOVE_SWEET_SCENT) == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN)); + ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN); PLAYER(SPECIES_WOBBUFFET) OPPONENT(species) { Ability(ability); } } WHEN { @@ -91,7 +91,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent Sticky PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } GIVEN { - ASSUME(gMovesInfo[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB); + ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); PLAYER(SPECIES_WOBBUFFET) OPPONENT(SPECIES_WOBBUFFET) OPPONENT(species) { Ability(ability); } @@ -166,13 +166,13 @@ SINGLE_BATTLE_TEST("Mold Breaker, Teravolt, and Turboblaze ignore Clear Body and } GIVEN { - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); - ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN); - ASSUME(gMovesInfo[MOVE_FAKE_TEARS].effect == EFFECT_SPECIAL_DEFENSE_DOWN_2); - ASSUME(gMovesInfo[MOVE_SCARY_FACE].effect == EFFECT_SPEED_DOWN_2); - ASSUME(gMovesInfo[MOVE_SWEET_SCENT].effect == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN)); - ASSUME(gMovesInfo[MOVE_SAND_ATTACK].effect == EFFECT_ACCURACY_DOWN); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_CONFIDE) == EFFECT_SPECIAL_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_FAKE_TEARS) == EFFECT_SPECIAL_DEFENSE_DOWN_2); + ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2); + ASSUME(GetMoveEffect(MOVE_SWEET_SCENT) == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN)); + ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN); PLAYER(SPECIES_WOBBUFFET) { Ability(breakerAbility); } OPPONENT(species) { Ability(ability); } } WHEN { @@ -284,7 +284,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent A PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; burned = FALSE; } PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; burned = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) OPPONENT(species) { Ability(ability); if (burned) Status1(STATUS1_BURN); } } WHEN { @@ -306,8 +306,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent r PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } GIVEN { - ASSUME(gMovesInfo[MOVE_SCARY_FACE].effect == EFFECT_SPEED_DOWN_2); - ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(SPECIES_WOBBUFFET) { Speed(3); } OPPONENT(species) { Speed(6); Ability(ability); } @@ -336,9 +336,9 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent T PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TOPSY_TURVY].effect == EFFECT_TOPSY_TURVY); - ASSUME(gMovesInfo[MOVE_SCARY_FACE].effect == EFFECT_SPEED_DOWN_2); - ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY); + ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(SPECIES_WOBBUFFET) { Speed(3); } OPPONENT(species) { Speed(6); Ability(ability); } @@ -377,8 +377,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } GIVEN { - ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); - ASSUME(gMovesInfo[MOVE_AGILITY].effect == EFFECT_SPEED_UP_2); + ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); + ASSUME(GetMoveEffect(MOVE_AGILITY) == EFFECT_SPEED_UP_2); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(species) { Speed(5); Ability(ability); } } WHEN { diff --git a/test/battle/ability/cloud_nine.c b/test/battle/ability/cloud_nine.c index fb87b7f2ba..613ea86e0a 100644 --- a/test/battle/ability/cloud_nine.c +++ b/test/battle/ability/cloud_nine.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but witho PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { - ASSUME(gMovesInfo[MOVE_SANDSTORM].effect == EFFECT_SANDSTORM); + ASSUME(GetMoveEffect(MOVE_SANDSTORM) == EFFECT_SANDSTORM); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/commander.c b/test/battle/ability/commander.c index 7eca97dacf..2220fb9ec2 100644 --- a/test/battle/ability/commander.c +++ b/test/battle/ability/commander.c @@ -175,7 +175,7 @@ DOUBLE_BATTLE_TEST("Commander prevents Red Card from working while Commander is DOUBLE_BATTLE_TEST("Commander Tatsugiri is not damaged by a double target move if Dondozo faints") { GIVEN { - ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(SPECIES_DONDOZO) { HP(1); }; PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } PLAYER(SPECIES_WYNAUT); @@ -187,9 +187,9 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri is not damaged by a double target move i ABILITY_POPUP(playerRight, ABILITY_COMMANDER); MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); HP_BAR(playerLeft); - MESSAGE("Dondozo fainted!"); - NOT HP_BAR(playerRight); HP_BAR(opponentRight); + NOT HP_BAR(playerRight); + MESSAGE("Dondozo fainted!"); } } @@ -308,7 +308,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri is still affected by Haze while controll DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Left Slot)") { GIVEN { - ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } PLAYER(SPECIES_DONDOZO); @@ -323,15 +323,15 @@ DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Left Slot)") MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentLeft); HP_BAR(playerLeft); - MESSAGE("The opposing Wobbuffet's attack missed!"); HP_BAR(opponentRight); + MESSAGE("The opposing Wobbuffet's attack missed!"); } } DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Right Slot)") { GIVEN { - ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_DONDOZO); @@ -380,7 +380,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri does not attack if Dondozo faints the sa DOUBLE_BATTLE_TEST("Commander Tatsugiri does not get hit by Dragon Darts when a commanded Dondozo faints") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_DARTS].effect == EFFECT_DRAGON_DARTS); + ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_DONDOZO) { HP(1); } PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } @@ -402,7 +402,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri does not get hit by Dragon Darts when co PARAMETRIZE { targetPlayerRight = TRUE; } PARAMETRIZE { targetPlayerRight = FALSE; } GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_DARTS].effect == EFFECT_DRAGON_DARTS); + ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS); PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } PLAYER(SPECIES_DONDOZO); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/compound_eyes.c b/test/battle/ability/compound_eyes.c index 32fa1dda2e..338da6bf21 100644 --- a/test/battle/ability/compound_eyes.c +++ b/test/battle/ability/compound_eyes.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Compound Eyes raises accuracy") { PASSES_RANDOMLY(91, 100, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDER].accuracy == 70); + ASSUME(GetMoveAccuracy(MOVE_THUNDER) == 70); PLAYER(SPECIES_BUTTERFREE) { Ability(ABILITY_COMPOUND_EYES); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -20,8 +20,8 @@ SINGLE_BATTLE_TEST("Compound Eyes does not affect OHKO moves") { PASSES_RANDOMLY(30, 100, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_FISSURE].accuracy == 30); - ASSUME(gMovesInfo[MOVE_FISSURE].effect == EFFECT_OHKO); + ASSUME(GetMoveAccuracy(MOVE_FISSURE) == 30); + ASSUME(GetMoveEffect(MOVE_FISSURE) == EFFECT_OHKO); PLAYER(SPECIES_BUTTERFREE) { Ability(ABILITY_COMPOUND_EYES); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/contrary.c b/test/battle/ability/contrary.c index 56eb6abf65..3c9c3e6dff 100644 --- a/test/battle/ability/contrary.c +++ b/test/battle/ability/contrary.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); } SINGLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a single battle", s16 damage) @@ -83,7 +83,7 @@ SINGLE_BATTLE_TEST("Contrary raises stats after using a move which would normall PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { ASSUME(MoveHasAdditionalEffectSelf(MOVE_OVERHEAT, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); - ASSUME(gMovesInfo[MOVE_OVERHEAT].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_OVERHEAT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SPINDA) { Ability(ability); } } WHEN { @@ -126,7 +126,7 @@ SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normal PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { - ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); PLAYER(SPECIES_WOBBUFFET) { Defense(102); } OPPONENT(SPECIES_SPINDA) { Ability(ability); Attack(100); } } WHEN { @@ -163,7 +163,7 @@ SINGLE_BATTLE_TEST("Contrary raises a stat after using a move which would normal PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); PLAYER(SPECIES_WOBBUFFET) { Speed(3); } OPPONENT(SPECIES_SPINDA) { Ability(ability); Speed(2); } } WHEN { @@ -194,7 +194,7 @@ SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normal PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { - ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM); + ASSUME(GetMoveEffect(MOVE_BELLY_DRUM) == EFFECT_BELLY_DRUM); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SPINDA) { Ability(ability); } } WHEN { diff --git a/test/battle/ability/corrosion.c b/test/battle/ability/corrosion.c index 8addbd90fa..8541c21f27 100644 --- a/test/battle/ability/corrosion.c +++ b/test/battle/ability/corrosion.c @@ -30,8 +30,8 @@ SINGLE_BATTLE_TEST("Corrosion can poison or badly poison a Steel type with a sta PARAMETRIZE { move = MOVE_TOXIC; } GIVEN { - ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON); - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -72,7 +72,7 @@ SINGLE_BATTLE_TEST("Corrosion can poison Poison- and Steel-type targets if it us PARAMETRIZE { heldItem = ITEM_TOXIC_ORB; } GIVEN { - ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING); + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); ASSUME(gItemsInfo[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_POISON_POWER); ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(heldItem); } @@ -110,8 +110,8 @@ SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion poisons a PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); - ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); } } WHEN { @@ -137,8 +137,8 @@ SINGLE_BATTLE_TEST("Corrosion cannot bypass moves that prevent poisoning such as PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); - ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -159,8 +159,8 @@ SINGLE_BATTLE_TEST("Corrosion cannot bypass abilities that prevent poisoning suc PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); - ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_SNORLAX) { Ability(ABILITY_IMMUNITY); } } WHEN { @@ -181,9 +181,9 @@ SINGLE_BATTLE_TEST("Corrosion allows the Pokémon with the ability to poison a S PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); - ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON); - ASSUME(gMovesInfo[MOVE_MAGIC_COAT].effect == EFFECT_MAGIC_COAT); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -205,9 +205,9 @@ SINGLE_BATTLE_TEST("Corrosion's effect is lost if the move used by the Pokémon PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); - ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON); - ASSUME(gMovesInfo[MOVE_MAGIC_COAT].effect == EFFECT_MAGIC_COAT); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/cud_chew.c b/test/battle/ability/cud_chew.c index 297635c9f3..9ac5593474 100644 --- a/test/battle/ability/cud_chew.c +++ b/test/battle/ability/cud_chew.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Kee Berry effect again on the next tu { GIVEN { ASSUME(gItemsInfo[ITEM_KEE_BERRY].holdEffect == HOLD_EFFECT_KEE_BERRY); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { Ability(ABILITY_CUD_CHEW); Item(ITEM_KEE_BERRY); } } WHEN { @@ -28,8 +28,8 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Oran Berry effect again on the next t GIVEN { ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffectParam == 10); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { MaxHP(60); HP(60); Ability(ABILITY_CUD_CHEW); Item(ITEM_ORAN_BERRY); } } WHEN { diff --git a/test/battle/ability/cute_charm.c b/test/battle/ability/cute_charm.c index e6eee0ae08..55e64b3226 100644 --- a/test/battle/ability/cute_charm.c +++ b/test/battle/ability/cute_charm.c @@ -7,15 +7,15 @@ SINGLE_BATTLE_TEST("Cute Charm inflicts infatuation on contact") PARAMETRIZE { move = MOVE_TACKLE; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); - ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(!MoveMakesContact(MOVE_SWIFT)); PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); } OPPONENT(SPECIES_CLEFAIRY) { Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM); } } WHEN { TURN { MOVE(player, move); } TURN { MOVE(player, move); } } SCENE { - if (gMovesInfo[move].makesContact) { + if (MoveMakesContact(move)) { ABILITY_POPUP(opponent, ABILITY_CUTE_CHARM); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_INFATUATION, player); MESSAGE("The opposing Clefairy's Cute Charm infatuated Wobbuffet!"); @@ -51,7 +51,7 @@ SINGLE_BATTLE_TEST("Cute Charm triggers 30% of the time") PASSES_RANDOMLY(3, 10, RNG_CUTE_CHARM); GIVEN { ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); } OPPONENT(SPECIES_CLEFAIRY) { Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM); } } WHEN { diff --git a/test/battle/ability/damp.c b/test/battle/ability/damp.c index b567293aa0..1088a7a17e 100644 --- a/test/battle/ability/damp.c +++ b/test/battle/ability/damp.c @@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from self") SINGLE_BATTLE_TEST("Damp prevents damage from Aftermath") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_PARAS) { Ability(ABILITY_DAMP); } OPPONENT(SPECIES_VOLTORB) { Ability(ABILITY_AFTERMATH); HP(1); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/dancer.c b/test/battle/ability/dancer.c index 5519ac3222..657a126470 100644 --- a/test/battle/ability/dancer.c +++ b/test/battle/ability/dancer.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Dancer can copy a dance move immediately after it was used and allow the user of Dancer to still use its move") { GIVEN { - ASSUME(gMovesInfo[MOVE_QUIVER_DANCE].danceMove == TRUE); + ASSUME(IsDanceMove(MOVE_QUIVER_DANCE)); PLAYER(SPECIES_WOBBUFFET) OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); } } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Dancer can copy a dance move immediately after it was used a SINGLE_BATTLE_TEST("Dancer can copy Teeter Dance") { GIVEN { - ASSUME(gMovesInfo[MOVE_TEETER_DANCE].danceMove == TRUE); + ASSUME(IsDanceMove(MOVE_TEETER_DANCE)); PLAYER(SPECIES_WOBBUFFET) OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Item(ITEM_LUM_BERRY); } } WHEN { @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Dancer can copy Teeter Dance") DOUBLE_BATTLE_TEST("Dancer can copy Teeter Dance and confuse both opposing targets") { GIVEN { - ASSUME(gMovesInfo[MOVE_TEETER_DANCE].danceMove == TRUE); + ASSUME(IsDanceMove(MOVE_TEETER_DANCE)); ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET) PLAYER(SPECIES_WYNAUT) { Item(ITEM_LUM_BERRY); } @@ -57,7 +57,7 @@ DOUBLE_BATTLE_TEST("Dancer can copy Teeter Dance and confuse both opposing targe DOUBLE_BATTLE_TEST("Dancer triggers from slowest to fastest") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_DANCER); Speed(10); } PLAYER(SPECIES_WYNAUT) { Speed(50); } OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(20); } @@ -83,7 +83,7 @@ SINGLE_BATTLE_TEST("Dancer doesn't trigger if the original user flinches") { GIVEN { ASSUME(MoveHasAdditionalEffectWithChance(MOVE_FAKE_OUT, MOVE_EFFECT_FLINCH, 100)); - ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); PLAYER(SPECIES_WOBBUFFET) OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); } } WHEN { @@ -102,7 +102,7 @@ DOUBLE_BATTLE_TEST("Dancer still triggers if another dancer flinches") { GIVEN { ASSUME(MoveHasAdditionalEffectWithChance(MOVE_FAKE_OUT, MOVE_EFFECT_FLINCH, 100)); - ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_DANCER); Speed(10); } PLAYER(SPECIES_WYNAUT) { Speed(5); } OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(20); } @@ -130,8 +130,8 @@ DOUBLE_BATTLE_TEST("Dancer still triggers if another dancer flinches") SINGLE_BATTLE_TEST("Dancer-called attacks have their type updated") { GIVEN { - ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].danceMove == TRUE); - ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].effect == EFFECT_REVELATION_DANCE); + ASSUME(IsDanceMove(MOVE_REVELATION_DANCE)); + ASSUME(GetMoveEffect(MOVE_REVELATION_DANCE) == EFFECT_REVELATION_DANCE); PLAYER(SPECIES_TANGROWTH); OPPONENT(SPECIES_ORICORIO_BAILE); } WHEN { @@ -149,8 +149,8 @@ SINGLE_BATTLE_TEST("Dancer-called attacks have their type updated") DOUBLE_BATTLE_TEST("Dancer doesn't trigger on a snatched move") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); - ASSUME(gMovesInfo[MOVE_SNATCH].effect == EFFECT_SNATCH); + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); + ASSUME(GetMoveEffect(MOVE_SNATCH) == EFFECT_SNATCH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ORICORIO); @@ -173,9 +173,9 @@ DOUBLE_BATTLE_TEST("Dancer doesn't trigger on a snatched move") DOUBLE_BATTLE_TEST("Dancer triggers on Instructed dance moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); - ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].instructBanned == FALSE); - ASSUME(gMovesInfo[MOVE_INSTRUCT].effect == EFFECT_INSTRUCT); + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); + ASSUME(!IsMoveInstructBanned(MOVE_DRAGON_DANCE)); + ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ORICORIO); @@ -200,9 +200,9 @@ DOUBLE_BATTLE_TEST("Dancer triggers on Instructed dance moves") DOUBLE_BATTLE_TEST("Dancer-called move doesn't update move to be Instructed") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); - ASSUME(gMovesInfo[MOVE_TACKLE].instructBanned == FALSE); - ASSUME(gMovesInfo[MOVE_INSTRUCT].effect == EFFECT_INSTRUCT); + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); + ASSUME(!IsMoveInstructBanned(MOVE_TACKLE)); + ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ORICORIO); @@ -228,8 +228,8 @@ DOUBLE_BATTLE_TEST("Dancer-called move doesn't update move to be Instructed") DOUBLE_BATTLE_TEST("Dancer doesn't call a move that didn't execute due to Powder") { GIVEN { - ASSUME(gMovesInfo[MOVE_FIERY_DANCE].danceMove == TRUE); - ASSUME(gMovesInfo[MOVE_FIERY_DANCE].type == TYPE_FIRE); + ASSUME(IsDanceMove(MOVE_FIERY_DANCE)); + ASSUME(GetMoveType(MOVE_FIERY_DANCE) == TYPE_FIRE); PLAYER(SPECIES_VOLCARONA); PLAYER(SPECIES_ORICORIO); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/ability/dazzling.c b/test/battle/ability/dazzling.c index 9eedb56a49..cc77e9a3bd 100644 --- a/test/battle/ability/dazzling.c +++ b/test/battle/ability/dazzling.c @@ -4,7 +4,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority > 0); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) > 0); } DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect the user from priority moves") diff --git a/test/battle/ability/defeatist.c b/test/battle/ability/defeatist.c index d2866d6f30..18d8186a50 100644 --- a/test/battle/ability/defeatist.c +++ b/test/battle/ability/defeatist.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_ECHOED_VOICE].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_ECHOED_VOICE) == DAMAGE_CATEGORY_SPECIAL); } SINGLE_BATTLE_TEST("Defeatist halves Attack when HP <= 50%", s16 damage) diff --git a/test/battle/ability/defiant.c b/test/battle/ability/defiant.c index 9b767b8323..b1bd102453 100644 --- a/test/battle/ability/defiant.c +++ b/test/battle/ability/defiant.c @@ -277,7 +277,7 @@ SINGLE_BATTLE_TEST("Defiant activates before White Herb") SINGLE_BATTLE_TEST("Defiant activates for each stat that is lowered") { GIVEN { - ASSUME(gMovesInfo[MOVE_TICKLE].effect == EFFECT_TICKLE); + ASSUME(GetMoveEffect(MOVE_TICKLE) == EFFECT_TICKLE); PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/desolate_land.c b/test/battle/ability/desolate_land.c index 18fe76b0c9..5bf1358503 100644 --- a/test/battle/ability/desolate_land.c +++ b/test/battle/ability/desolate_land.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(!IS_MOVE_STATUS(MOVE_WATER_GUN)); - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(!IsBattleMoveStatus(MOVE_WATER_GUN)); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); } SINGLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves") @@ -32,9 +32,9 @@ SINGLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves") DOUBLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves and prints the message only once with moves hitting multiple targets") { GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_SURF)); - ASSUME(gMovesInfo[MOVE_SURF].type == TYPE_WATER); - ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(!IsBattleMoveStatus(MOVE_SURF)); + ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(SPECIES_GROUDON) {Item(ITEM_RED_ORB); {Speed(5);}} PLAYER(SPECIES_WOBBUFFET) {Speed(5);} OPPONENT(SPECIES_WOBBUFFET) {Speed(10);} diff --git a/test/battle/ability/disguise.c b/test/battle/ability/disguise.c index 9c5f917e9d..b1d854f0cf 100644 --- a/test/battle/ability/disguise.c +++ b/test/battle/ability/disguise.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_AERIAL_ACE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_AERIAL_ACE) == DAMAGE_CATEGORY_PHYSICAL); } SINGLE_BATTLE_TEST("Disguised Mimikyu will lose 1/8 of its max HP upon changing to its busted form") @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu will lose 1/8 of its max HP upon changing SINGLE_BATTLE_TEST("Disguised Mimikyu takes no damage from a confusion hit and changes to its busted form") { GIVEN { - ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE); + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu's Air Balloon will pop upon changing to it SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from secondary damage without breaking the disguise") { GIVEN { - ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].effect == EFFECT_STEALTH_ROCK); + ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_WOBBUFFET); @@ -138,7 +138,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu is ignored by Mold Breaker") SINGLE_BATTLE_TEST("Disguised Mimikyu's types revert back to Ghost/Fairy when Disguise is broken") { GIVEN { - ASSUME(gMovesInfo[MOVE_SHADOW_CLAW].type == TYPE_GHOST); + ASSUME(GetMoveType(MOVE_SHADOW_CLAW) == TYPE_GHOST); PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -158,7 +158,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu's types revert back to Ghost/Fairy when Di SINGLE_BATTLE_TEST("Disguised Mimikyu blocks a move after getting Gastro Acid Batton Passed") { GIVEN { - ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_WOBBUFFET); @@ -177,7 +177,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu blocks a move after getting Gastro Acid Ba SINGLE_BATTLE_TEST("Disguise does not break from a teammate's Wish") { GIVEN { - ASSUME(gMovesInfo[MOVE_WISH].effect == EFFECT_WISH); + ASSUME(GetMoveEffect(MOVE_WISH) == EFFECT_WISH); PLAYER(SPECIES_JIRACHI); PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); HP(219); MaxHP(220); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/download.c b/test/battle/ability/download.c index 480f0bf10e..eec380e421 100644 --- a/test/battle/ability/download.c +++ b/test/battle/ability/download.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_TRI_ATTACK].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TRI_ATTACK) == DAMAGE_CATEGORY_SPECIAL); } SINGLE_BATTLE_TEST("Download raises Attack if player has lower Def than Sp. Def", s16 damage) @@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Download doesn't activate if target hasn't been sent out yet PARAMETRIZE { ability = ABILITY_TRACE; } PARAMETRIZE { ability = ABILITY_DOWNLOAD; } GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET) { Speed(100); } PLAYER(SPECIES_PORYGON) { Ability(ability); Defense(400); SpDefense(300); Speed(300); Attack(100); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } diff --git a/test/battle/ability/dragons_maw.c b/test/battle/ability/dragons_maw.c index 401c4244c8..d7e1ebd793 100644 --- a/test/battle/ability/dragons_maw.c +++ b/test/battle/ability/dragons_maw.c @@ -14,11 +14,11 @@ SINGLE_BATTLE_TEST("Dragon's Maw increases Dragon-type move damage", s16 damage) PARAMETRIZE { move = MOVE_DRAGON_BREATH; ability = ABILITY_DRAGONS_MAW; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_DRAGON); - ASSUME(gMovesInfo[MOVE_DRAGON_CLAW].type == TYPE_DRAGON); - ASSUME(gMovesInfo[MOVE_DRAGON_BREATH].type == TYPE_DRAGON); - ASSUME(gMovesInfo[MOVE_DRAGON_CLAW].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_DRAGON_BREATH].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_DRAGON); + ASSUME(GetMoveType(MOVE_DRAGON_CLAW) == TYPE_DRAGON); + ASSUME(GetMoveType(MOVE_DRAGON_BREATH) == TYPE_DRAGON); + ASSUME(GetMoveCategory(MOVE_DRAGON_CLAW) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_DRAGON_BREATH) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_REGIDRAGO) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/dry_skin.c b/test/battle/ability/dry_skin.c index 5709a58a94..95a0cd8fa8 100644 --- a/test/battle/ability/dry_skin.c +++ b/test/battle/ability/dry_skin.c @@ -39,8 +39,8 @@ SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%" PARAMETRIZE { ability = ABILITY_EFFECT_SPORE; } PARAMETRIZE { ability = ABILITY_DRY_SKIN; } GIVEN { - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_EMBER].power == 40); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMovePower(MOVE_EMBER) == 40); ASSUME(gSpeciesInfo[SPECIES_PARASECT].types[0] == TYPE_BUG); ASSUME(gSpeciesInfo[SPECIES_PARASECT].types[1] == TYPE_GRASS); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); @@ -64,7 +64,7 @@ SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%" SINGLE_BATTLE_TEST("Dry Skin heals 25% when hit by water type moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_BUBBLE].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_BUBBLE) == TYPE_WATER); PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Dry Skin heals 25% when hit by water type moves") SINGLE_BATTLE_TEST("Dry Skin does not activate if protected") { GIVEN { - ASSUME(gMovesInfo[MOVE_BUBBLE].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_BUBBLE) == TYPE_WATER); PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -92,8 +92,8 @@ SINGLE_BATTLE_TEST("Dry Skin does not activate if protected") SINGLE_BATTLE_TEST("Dry Skin is only triggered once on multi strike moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_SHURIKEN].type == TYPE_WATER); - ASSUME(gMovesInfo[MOVE_WATER_SHURIKEN].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveType(MOVE_WATER_SHURIKEN) == TYPE_WATER); + ASSUME(GetMoveEffect(MOVE_WATER_SHURIKEN) == EFFECT_MULTI_HIT); PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -111,7 +111,7 @@ SINGLE_BATTLE_TEST("Dry Skin prevents Absorb Bulb and Luminous Moss from activat PARAMETRIZE { item = ITEM_ABSORB_BULB; } PARAMETRIZE { item = ITEM_LUMINOUS_MOSS; } GIVEN { - ASSUME(gMovesInfo[MOVE_BUBBLE].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_BUBBLE) == TYPE_WATER); PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/earth_eater.c b/test/battle/ability/earth_eater.c index 2e6ae6dab5..c30b9674f5 100644 --- a/test/battle/ability/earth_eater.c +++ b/test/battle/ability/earth_eater.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Earth Eater heals 25% when hit by ground type moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_MUD_SLAP].type == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_MUD_SLAP) == TYPE_GROUND); PLAYER(SPECIES_ORTHWORM) { Ability(ABILITY_EARTH_EATER); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Earth Eater heals 25% when hit by ground type moves") SINGLE_BATTLE_TEST("Earth Eater does not activate if protected") { GIVEN { - ASSUME(gMovesInfo[MOVE_MUD_SLAP].type == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_MUD_SLAP) == TYPE_GROUND); PLAYER(SPECIES_ORTHWORM) { Ability(ABILITY_EARTH_EATER); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -35,8 +35,8 @@ SINGLE_BATTLE_TEST("Earth Eater does not activate if protected") SINGLE_BATTLE_TEST("Earth Eater activates on status moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_SAND_ATTACK].type == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_SAND_ATTACK].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveType(MOVE_SAND_ATTACK) == TYPE_GROUND); + ASSUME(GetMoveCategory(MOVE_SAND_ATTACK) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_ORTHWORM) { Ability(ABILITY_EARTH_EATER); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/effect_spore.c b/test/battle/ability/effect_spore.c index 49750c4797..06ac84f39a 100644 --- a/test/battle/ability/effect_spore.c +++ b/test/battle/ability/effect_spore.c @@ -8,15 +8,15 @@ SINGLE_BATTLE_TEST("Effect Spore only inflicts status on contact") PARAMETRIZE { move = MOVE_TACKLE; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); - ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(!MoveMakesContact(MOVE_SWIFT)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } } WHEN { TURN { MOVE(player, move, WITH_RNG(RNG_EFFECT_SPORE, 1)); } TURN {} } SCENE { - if (gMovesInfo[move].makesContact) { + if (MoveMakesContact(move)) { ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, player); MESSAGE("Wobbuffet was poisoned by the opposing Breloom's Effect Spore!"); @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Effect Spore causes poison 9% of the time") PASSES_RANDOMLY(9, 100, RNG_EFFECT_SPORE); GIVEN { ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } } WHEN { @@ -56,7 +56,7 @@ SINGLE_BATTLE_TEST("Effect Spore causes paralysis 10% of the time") PASSES_RANDOMLY(10, 100, RNG_EFFECT_SPORE); GIVEN { ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } } WHEN { @@ -75,7 +75,7 @@ SINGLE_BATTLE_TEST("Effect Spore causes sleep 11% of the time") PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } } WHEN { diff --git a/test/battle/ability/electromorphosis.c b/test/battle/ability/electromorphosis.c index 0f0ac1c39a..38a61f4c29 100644 --- a/test/battle/ability/electromorphosis.c +++ b/test/battle/ability/electromorphosis.c @@ -10,12 +10,12 @@ SINGLE_BATTLE_TEST("Electromorphosis sets up Charge when hit by any move") PARAMETRIZE {move = MOVE_GUST; } GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); - ASSUME(!IS_MOVE_STATUS(MOVE_GUST)); - ASSUME(gMovesInfo[MOVE_GUST].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(!IS_MOVE_STATUS(MOVE_THUNDER_SHOCK)); - ASSUME(gMovesInfo[MOVE_THUNDER_SHOCK].type == TYPE_ELECTRIC); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_GUST)); + ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(!IsBattleMoveStatus(MOVE_THUNDER_SHOCK)); + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); PLAYER(SPECIES_BELLIBOLT) { Ability(ABILITY_ELECTROMORPHOSIS); Speed(10); } OPPONENT(SPECIES_WOBBUFFET) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. diff --git a/test/battle/ability/flame_body.c b/test/battle/ability/flame_body.c index b8fa850b65..95afa862c1 100644 --- a/test/battle/ability/flame_body.c +++ b/test/battle/ability/flame_body.c @@ -7,14 +7,14 @@ SINGLE_BATTLE_TEST("Flame Body inflicts burn on contact") PARAMETRIZE { move = MOVE_TACKLE; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); - ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(!MoveMakesContact(MOVE_SWIFT)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_MAGMAR) { Ability(ABILITY_FLAME_BODY); } } WHEN { TURN { MOVE(player, move); } } SCENE { - if (gMovesInfo[move].makesContact) { + if (MoveMakesContact(move)) { ABILITY_POPUP(opponent, ABILITY_FLAME_BODY); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, player); MESSAGE("The opposing Magmar's Flame Body burned Wobbuffet!"); @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Flame Body triggers 30% of the time") PASSES_RANDOMLY(3, 10, RNG_FLAME_BODY); GIVEN { ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_MAGMAR) { Ability(ABILITY_FLAME_BODY); } } WHEN { diff --git a/test/battle/ability/flash_fire.c b/test/battle/ability/flash_fire.c new file mode 100644 index 0000000000..c81967d1af --- /dev/null +++ b/test/battle/ability/flash_fire.c @@ -0,0 +1,28 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Flash Fire boosts fire type moves by 50% but no subsequent increase is applied") +{ + s16 damage[3]; + + GIVEN { + PLAYER(SPECIES_HEATRAN) { Ability(ABILITY_FLASH_FIRE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_EMBER); MOVE(opponent, MOVE_EMBER); } + TURN { MOVE(player, MOVE_EMBER); MOVE(opponent, MOVE_EMBER); } + TURN { MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ABILITY_POPUP(player, ABILITY_FLASH_FIRE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent, captureDamage: &damage[1]); + ABILITY_POPUP(player, ABILITY_FLASH_FIRE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(1.5), damage[1]); + EXPECT_EQ(damage[1], damage[2]); + } +} diff --git a/test/battle/ability/flower_gift.c b/test/battle/ability/flower_gift.c index 5ceb26c5c1..4f09e84a9a 100644 --- a/test/battle/ability/flower_gift.c +++ b/test/battle/ability/flower_gift.c @@ -96,7 +96,7 @@ DOUBLE_BATTLE_TEST("Flower Gift increases the attack of Cherrim and its allies b PARAMETRIZE { sunny = FALSE; } PARAMETRIZE { sunny = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_CHERRIM_OVERCAST) { Ability(ABILITY_FLOWER_GIFT); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -131,7 +131,7 @@ DOUBLE_BATTLE_TEST("Flower Gift increases the Sp. Def of Cherrim and its allies PARAMETRIZE { sunny = FALSE; } PARAMETRIZE { sunny = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_HYPER_VOICE) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_CHERRIM_OVERCAST) { Ability(ABILITY_FLOWER_GIFT); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/fluffy.c b/test/battle/ability/fluffy.c index 30a8b83182..5c51ec2627 100644 --- a/test/battle/ability/fluffy.c +++ b/test/battle/ability/fluffy.c @@ -3,11 +3,11 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); - ASSUME(gMovesInfo[MOVE_FIRE_PUNCH].makesContact); - ASSUME(gMovesInfo[MOVE_FIRE_PUNCH].type == TYPE_FIRE); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(MoveMakesContact(MOVE_FIRE_PUNCH)); + ASSUME(GetMoveType(MOVE_FIRE_PUNCH) == TYPE_FIRE); } SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct contact", s16 damage) diff --git a/test/battle/ability/frisk.c b/test/battle/ability/frisk.c index 28bd477a35..e6d7f275fb 100644 --- a/test/battle/ability/frisk.c +++ b/test/battle/ability/frisk.c @@ -42,7 +42,7 @@ DOUBLE_BATTLE_TEST("Frisk triggers for player in a Double Battle after switching PARAMETRIZE { target = playerRight; } GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_POUND)); + ASSUME(!IsBattleMoveStatus(MOVE_POUND)); PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); }; @@ -65,7 +65,7 @@ DOUBLE_BATTLE_TEST("Frisk triggers for opponent in a Double Battle after switchi PARAMETRIZE { target = opponentRight; } GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_POUND)); + ASSUME(!IsBattleMoveStatus(MOVE_POUND)); PLAYER(SPECIES_WYNAUT) { Item(ITEM_POTION); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } diff --git a/test/battle/ability/gale_wings.c b/test/battle/ability/gale_wings.c index c7a03d0914..df8f025326 100644 --- a/test/battle/ability/gale_wings.c +++ b/test/battle/ability/gale_wings.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Gale Wings only grants priority at full HP (Gen 7+)") PARAMETRIZE { hp = 99; config = GEN_6; } GIVEN { WITH_CONFIG(GEN_CONFIG_GALE_WINGS, config); - ASSUME(gMovesInfo[MOVE_AERIAL_ACE].type == TYPE_FLYING); + ASSUME(GetMoveType(MOVE_AERIAL_ACE) == TYPE_FLYING); PLAYER(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); HP(hp); MaxHP(100); Speed(1);} OPPONENT(SPECIES_WOBBUFFET) { Speed(100);}; } WHEN { @@ -33,8 +33,8 @@ SINGLE_BATTLE_TEST("Gale Wings only grants priority to Flying-type moves") PARAMETRIZE { move = MOVE_AERIAL_ACE; } PARAMETRIZE { move = MOVE_FLARE_BLITZ; } GIVEN { - ASSUME(gMovesInfo[MOVE_AERIAL_ACE].type == TYPE_FLYING); - ASSUME(gMovesInfo[MOVE_FLARE_BLITZ].type == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_AERIAL_ACE) == TYPE_FLYING); + ASSUME(GetMoveType(MOVE_FLARE_BLITZ) == TYPE_FIRE); PLAYER(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); HP(100); MaxHP(100); Speed(1);} OPPONENT(SPECIES_WOBBUFFET) { Speed(100);}; } WHEN { @@ -59,11 +59,11 @@ SINGLE_BATTLE_TEST("Gale Wings doesn't increase priority of Flying-type Natural PARAMETRIZE { move = MOVE_JUDGMENT; heldItem = ITEM_SKY_PLATE; } PARAMETRIZE { move = MOVE_HIDDEN_POWER; heldItem = ITEM_NONE; } GIVEN { - ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); - ASSUME(gMovesInfo[MOVE_JUDGMENT].effect == EFFECT_CHANGE_TYPE_ON_ITEM); + ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); + ASSUME(GetMoveEffect(MOVE_JUDGMENT) == EFFECT_CHANGE_TYPE_ON_ITEM); // IV combinations sourced from https://www.smogon.com/forums/threads/hidden-power-iv-combinations.78083/ - ASSUME(gMovesInfo[MOVE_HIDDEN_POWER].effect == EFFECT_HIDDEN_POWER); - ASSUME(gMovesInfo[MOVE_TERA_BLAST].effect == EFFECT_TERA_BLAST); + ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); + ASSUME(GetMoveEffect(MOVE_TERA_BLAST) == EFFECT_TERA_BLAST); ASSUME(gItemsInfo[ITEM_SKY_PLATE].holdEffect == HOLD_EFFECT_PLATE); ASSUME(gItemsInfo[ITEM_SKY_PLATE].secondaryId == TYPE_FLYING); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_LUM_BERRY)].type == TYPE_FLYING); diff --git a/test/battle/ability/galvanize.c b/test/battle/ability/galvanize.c index 1da82e861d..6de5675b6a 100644 --- a/test/battle/ability/galvanize.c +++ b/test/battle/ability/galvanize.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); } SINGLE_BATTLE_TEST("Galvanize turns a normal type move into Electric") @@ -29,9 +29,9 @@ SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type move PARAMETRIZE { move = MOVE_MULTI_ATTACK; } GIVEN { - ASSUME(gMovesInfo[MOVE_HIDDEN_POWER].effect == EFFECT_HIDDEN_POWER); - ASSUME(gMovesInfo[MOVE_WEATHER_BALL].effect == EFFECT_WEATHER_BALL); - ASSUME(gMovesInfo[MOVE_MULTI_ATTACK].effect == EFFECT_CHANGE_TYPE_ON_ITEM); + ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); + ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); + ASSUME(GetMoveEffect(MOVE_MULTI_ATTACK) == EFFECT_CHANGE_TYPE_ON_ITEM); PLAYER(SPECIES_KRABBY); OPPONENT(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); } } WHEN { diff --git a/test/battle/ability/good_as_gold.c b/test/battle/ability/good_as_gold.c index 40561ee767..fc6c6bc8c4 100644 --- a/test/battle/ability/good_as_gold.c +++ b/test/battle/ability/good_as_gold.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Good as Gold protects from status moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveCategory(MOVE_TOXIC) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); } } WHEN { @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Good as Gold protects from status moves") SINGLE_BATTLE_TEST("Good as Gold doesn't protect the user from it's own moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_NASTY_PLOT].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveCategory(MOVE_NASTY_PLOT) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); } } WHEN { @@ -37,8 +37,8 @@ SINGLE_BATTLE_TEST("Good as Gold doesn't protect the user from it's own moves") SINGLE_BATTLE_TEST("Good as Gold doesn't protect from moves that target the field") { GIVEN { - ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].category == DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].target == MOVE_TARGET_OPPONENTS_FIELD); + ASSUME(GetMoveCategory(MOVE_STEALTH_ROCK) == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveTarget(MOVE_STEALTH_ROCK) == MOVE_TARGET_OPPONENTS_FIELD); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); } } WHEN { @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Good as Gold doesn't protect from moves that target the fiel DOUBLE_BATTLE_TEST("Good as Gold protects from partner's status moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_HELPING_HAND].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveCategory(MOVE_HELPING_HAND) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); } diff --git a/test/battle/ability/grim_neigh.c b/test/battle/ability/grim_neigh.c index 476d9995f1..c58487722b 100644 --- a/test/battle/ability/grim_neigh.c +++ b/test/battle/ability/grim_neigh.c @@ -7,7 +7,7 @@ DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly cau PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } GIVEN { - ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(species) { Ability(ability); } PLAYER(SPECIES_SNORUNT) { HP(1); } OPPONENT(SPECIES_GLALIE) { HP(1); } @@ -80,9 +80,8 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } - KNOWN_FAILING; // Requires simultaneous damage implementation GIVEN { - ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(species) { Ability(ability); } PLAYER(SPECIES_ABRA) { HP(1); } OPPONENT(SPECIES_GLALIE); @@ -94,6 +93,7 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); HP_BAR(opponentLeft, captureDamage: &damage[0]); HP_BAR(playerRight); + HP_BAR(opponentRight, captureDamage: &damage[1]); MESSAGE("Abra fainted!"); ABILITY_POPUP(playerLeft, abilityPopUp); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); @@ -101,7 +101,6 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th MESSAGE("Spectrier's Grim Neigh raised its Sp. Atk!"); else MESSAGE("Calyrex's Grim Neigh raised its Sp. Atk!"); - HP_BAR(opponentRight, captureDamage: &damage[1]); } THEN { EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); EXPECT_EQ(damage[0], damage[1]); diff --git a/test/battle/ability/gulp_missile.c b/test/battle/ability/gulp_missile.c index 189702a4be..72e826b252 100644 --- a/test/battle/ability/gulp_missile.c +++ b/test/battle/ability/gulp_missile.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - // ASSUME(gMovesInfo[MOVE_AERIAL_ACE].category == DAMAGE_CATEGORY_PHYSICAL); + // ASSUME(GetMoveCategory(MOVE_AERIAL_ACE) == DAMAGE_CATEGORY_PHYSICAL); } SINGLE_BATTLE_TEST("(Gulp Missile) If base Cramorant hits target with Surf it transforms into Gulping form if max HP is over 1/2") @@ -167,7 +167,7 @@ SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense PARAMETRIZE { ability = ABILITY_INFILTRATOR; } PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact == TRUE); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_CRAMORANT) { Ability(ABILITY_GULP_MISSILE); Item(ITEM_ROCKY_HELMET); } OPPONENT(SPECIES_DRAGAPULT) { Ability(ability); } } WHEN { diff --git a/test/battle/ability/harvest.c b/test/battle/ability/harvest.c index 03e13b394e..92e7517df5 100644 --- a/test/battle/ability/harvest.c +++ b/test/battle/ability/harvest.c @@ -5,7 +5,7 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); ASSUME(I_SITRUS_BERRY_HEAL >= GEN_4); - ASSUME(gMovesInfo[MOVE_SUNNY_DAY].effect == EFFECT_SUNNY_DAY); + ASSUME(GetMoveEffect(MOVE_SUNNY_DAY) == EFFECT_SUNNY_DAY); } SINGLE_BATTLE_TEST("Harvest has a 50% chance to restore a Berry at the end of the turn") @@ -61,7 +61,7 @@ SINGLE_BATTLE_TEST("Harvest doesn't always restore a Berry if Cloud Nine/Air Loc SINGLE_BATTLE_TEST("Harvest restores a Berry even after being switched out and back in") { GIVEN { - ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT); + ASSUME(GetMoveEffect(MOVE_PARTING_SHOT) == EFFECT_PARTING_SHOT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_WOBBUFFET); @@ -80,7 +80,7 @@ SINGLE_BATTLE_TEST("Harvest restores a Berry even after being switched out and b SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Fling") { GIVEN { - ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING); + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Fling") SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Natural Gift") { GIVEN { - ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); + ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -209,7 +209,7 @@ DOUBLE_BATTLE_TEST("Harvest order is affected by speed") SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when transfered to another Pokémon") { GIVEN { - ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); + ASSUME(GetMoveEffect(MOVE_TRICK) == EFFECT_TRICK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -226,7 +226,7 @@ SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when transfered to another P SINGLE_BATTLE_TEST("Harvest can restore a Berry that was transferred from another Pokémon") { GIVEN { - ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); + ASSUME(GetMoveEffect(MOVE_TRICK) == EFFECT_TRICK); PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); } } WHEN { @@ -245,7 +245,7 @@ SINGLE_BATTLE_TEST("Harvest can restore a Berry that was transferred from anothe SINGLE_BATTLE_TEST("Harvest can only restore the newest berry consumed that was transferred from another Pokémon instead of its original Berry") { GIVEN { - ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); + ASSUME(GetMoveEffect(MOVE_TRICK) == EFFECT_TRICK); ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP); PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); Item(ITEM_APICOT_BERRY); } diff --git a/test/battle/ability/hospitality.c b/test/battle/ability/hospitality.c index 0582549180..c772d6e776 100644 --- a/test/battle/ability/hospitality.c +++ b/test/battle/ability/hospitality.c @@ -82,9 +82,9 @@ DOUBLE_BATTLE_TEST("Hospitality does not trigger if there is no ally on the fiel } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_BLIZZARD, opponentLeft); HP_BAR(playerLeft); - MESSAGE("Wobbuffet fainted!"); HP_BAR(playerRight); MESSAGE("Wobbuffet fainted!"); + MESSAGE("Wobbuffet fainted!"); SEND_IN_MESSAGE("Poltchageist"); NOT ABILITY_POPUP(playerLeft, ABILITY_HOSPITALITY); } diff --git a/test/battle/ability/hyper_cutter.c b/test/battle/ability/hyper_cutter.c index d63938b606..1dc434173a 100644 --- a/test/battle/ability/hyper_cutter.c +++ b/test/battle/ability/hyper_cutter.c @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter prevents intimidate") SINGLE_BATTLE_TEST("Hyper Cutter prevents Attack stage reduction from moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } } WHEN { @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter prevents Attack stage reduction from moves") SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Attack reduction from burn") { GIVEN { - ASSUME(gMovesInfo[MOVE_WILL_O_WISP].effect == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } } WHEN { @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Attack reduction from burn") SINGLE_BATTLE_TEST("Hyper Cutter is ignored by Mold Breaker") { GIVEN { - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } } WHEN { @@ -97,8 +97,8 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Attack stage reduction from mov SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Topsy-Turvy") { GIVEN { - ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); - ASSUME(gMovesInfo[MOVE_TOPSY_TURVY].effect == EFFECT_TOPSY_TURVY); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } } WHEN { @@ -116,8 +116,8 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Topsy-Turvy") SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Spectral Thief from resetting positive Attack stage changes") { GIVEN { - ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); - ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } } WHEN { @@ -135,8 +135,8 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Spectral Thief from resetting p SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent receiving negative Attack stage changes from Baton Pass") { GIVEN { - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); - ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } diff --git a/test/battle/ability/ice_body.c b/test/battle/ability/ice_body.c index 3f278a50cd..07890d52f2 100644 --- a/test/battle/ability/ice_body.c +++ b/test/battle/ability/ice_body.c @@ -2,8 +2,8 @@ #include "test/battle.h" ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); - ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); } SINGLE_BATTLE_TEST("Ice Body prevents damage from hail") diff --git a/test/battle/ability/ice_face.c b/test/battle/ability/ice_face.c index 22b67a7a53..a462b80265 100644 --- a/test/battle/ability/ice_face.c +++ b/test/battle/ability/ice_face.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Ice Face blocks physical moves, changing Eiscue into its Noice Face form") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_EISCUE); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -18,8 +18,8 @@ SINGLE_BATTLE_TEST("Ice Face blocks physical moves, changing Eiscue into its Noi SINGLE_BATTLE_TEST("Ice Face does not block special moves, Eiscue stays in Ice Face form") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_EMBER].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_EMBER) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_EISCUE); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -35,9 +35,9 @@ SINGLE_BATTLE_TEST("Ice Face is restored if hail or snow begins while Noice Face PARAMETRIZE { move = MOVE_SNOWSCAPE; } PARAMETRIZE { move = MOVE_HAIL; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); - ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); PLAYER(SPECIES_EISCUE); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -60,9 +60,9 @@ SINGLE_BATTLE_TEST("Ice Face is restored if Noice Face Eiscue is sent in while h PARAMETRIZE { move = MOVE_SNOWSCAPE; } PARAMETRIZE { move = MOVE_HAIL; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); - ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); PLAYER(SPECIES_EISCUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -86,9 +86,9 @@ SINGLE_BATTLE_TEST("Ice Face is not restored if Eiscue changes into Noice Face f PARAMETRIZE { move = MOVE_SNOWSCAPE; } PARAMETRIZE { move = MOVE_HAIL; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); - ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); PLAYER(SPECIES_EISCUE) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -105,7 +105,7 @@ SINGLE_BATTLE_TEST("Ice Face is not restored if Eiscue changes into Noice Face f SINGLE_BATTLE_TEST("Ice Face form change persists after switching out") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_EISCUE) { HP(1); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -123,7 +123,7 @@ SINGLE_BATTLE_TEST("Ice Face form change persists after switching out") SINGLE_BATTLE_TEST("Ice Face doesn't transform Eiscue if Cloud Nine/Air Lock is on the field") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_EISCUE) { HP(1); } OPPONENT(SPECIES_RAYQUAZA) { Ability(ABILITY_AIR_LOCK); } } WHEN { @@ -142,9 +142,9 @@ SINGLE_BATTLE_TEST("Ice Face is not restored if hail or snow and Eiscue are alre PARAMETRIZE { move = MOVE_SNOWSCAPE; } PARAMETRIZE { move = MOVE_HAIL; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); - ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); PLAYER(SPECIES_EISCUE); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/ability/ice_scales.c b/test/battle/ability/ice_scales.c index fd262147a5..37c5aa0944 100644 --- a/test/battle/ability/ice_scales.c +++ b/test/battle/ability/ice_scales.c @@ -12,10 +12,10 @@ SINGLE_BATTLE_TEST("Ice Scales halves the damage from special moves", s16 damage PARAMETRIZE { ability = ABILITY_SHIELD_DUST; move = MOVE_TACKLE; } PARAMETRIZE { ability = ABILITY_ICE_SCALES; move = MOVE_TACKLE; } GIVEN { - ASSUME(gMovesInfo[MOVE_PSYCHIC].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_PSYSHOCK].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_PSYSHOCK].effect == EFFECT_PSYSHOCK); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_PSYCHIC) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_PSYSHOCK) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveEffect(MOVE_PSYSHOCK) == EFFECT_PSYSHOCK); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_FROSMOTH) { Ability(ability); } } WHEN { diff --git a/test/battle/ability/immunity.c b/test/battle/ability/immunity.c index 2fa90686c5..92e32d31f3 100644 --- a/test/battle/ability/immunity.c +++ b/test/battle/ability/immunity.c @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Immunity prevents Poison Sting poison") SINGLE_BATTLE_TEST("Immunity prevents Toxic bad poison") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SNORLAX) { Ability(ABILITY_IMMUNITY); } } WHEN { @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Immunity prevents Toxic bad poison") SINGLE_BATTLE_TEST("Immunity prevents Toxic Spikes poison") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); + ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SNORLAX) { Ability(ABILITY_IMMUNITY); } diff --git a/test/battle/ability/innards_out.c b/test/battle/ability/innards_out.c index e4f8e58ef6..516bde342e 100644 --- a/test/battle/ability/innards_out.c +++ b/test/battle/ability/innards_out.c @@ -14,8 +14,8 @@ SINGLE_BATTLE_TEST("Innards Out deal dmg on fainting equal to the amount of dmg PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { HP(70); SpAttack(1000); } OPPONENT(SPECIES_WOBBUFFET); - ASSUME(!IS_MOVE_STATUS(MOVE_PSYCHIC)); - ASSUME(gMovesInfo[MOVE_PSYCHIC].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(!IsBattleMoveStatus(MOVE_PSYCHIC)); + ASSUME(GetMoveCategory(MOVE_PSYCHIC) == DAMAGE_CATEGORY_SPECIAL); } WHEN { TURN { MOVE(opponent, MOVE_PSYCHIC); SEND_OUT(player, 1); if (hp == 100) { SEND_OUT(opponent, 1); } } } SCENE { @@ -32,8 +32,8 @@ SINGLE_BATTLE_TEST("Innards Out does not trigger after Gastro Acid has been used PLAYER(SPECIES_PYUKUMUKU) { HP(1); Ability(ABILITY_INNARDS_OUT); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); - ASSUME(!IS_MOVE_STATUS(MOVE_PSYCHIC)); - ASSUME(gMovesInfo[MOVE_GASTRO_ACID].effect == EFFECT_GASTRO_ACID); + ASSUME(!IsBattleMoveStatus(MOVE_PSYCHIC)); + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); } WHEN { TURN { MOVE(opponent, MOVE_GASTRO_ACID); } TURN { MOVE(opponent, MOVE_PSYCHIC); SEND_OUT(player, 1); } @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Innards Out does not damage Magic Guard Pokemon") PLAYER(SPECIES_PYUKUMUKU) { HP(1); Ability(ABILITY_INNARDS_OUT); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); } - ASSUME(!IS_MOVE_STATUS(MOVE_PSYCHIC)); + ASSUME(!IsBattleMoveStatus(MOVE_PSYCHIC)); } WHEN { TURN { MOVE(opponent, MOVE_PSYCHIC); SEND_OUT(player, 1); } } SCENE { @@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Innards Out does not damage Magic Guard Pokemon") SINGLE_BATTLE_TEST("Innards Out uses correct damage amount for Future Sight") { GIVEN { - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); PLAYER(SPECIES_PYUKUMUKU) { HP(1); Ability(ABILITY_INNARDS_OUT); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -89,7 +89,7 @@ SINGLE_BATTLE_TEST("Innards Out uses correct damage amount for Future Sight") SINGLE_BATTLE_TEST("Innards Out doesn't trigger if Future Sight user is not on field") { GIVEN { - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); PLAYER(SPECIES_PYUKUMUKU) { HP(1); Ability(ABILITY_INNARDS_OUT); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -112,7 +112,7 @@ SINGLE_BATTLE_TEST("Innards Out doesn't trigger if Future Sight user is not on f SINGLE_BATTLE_TEST("Innards Out triggers if Future Sight user is back on the field") { GIVEN { - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); PLAYER(SPECIES_PYUKUMUKU) { HP(1); Ability(ABILITY_INNARDS_OUT); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/ability/insomnia.c b/test/battle/ability/insomnia.c index 524fa76338..533ca9ce85 100644 --- a/test/battle/ability/insomnia.c +++ b/test/battle/ability/insomnia.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Insomnia prevents sleep") { GIVEN { - ASSUME(gMovesInfo[MOVE_SPORE].effect == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); PLAYER(SPECIES_DROWZEE) { Ability(ABILITY_INSOMNIA); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Insomnia prevents sleep") SINGLE_BATTLE_TEST("Insomnia prevents yawn") { GIVEN { - ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); PLAYER(SPECIES_DROWZEE) { Ability(ABILITY_INSOMNIA); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Insomnia prevents yawn") SINGLE_BATTLE_TEST("Insomnia prevents rest") { GIVEN { - ASSUME(gMovesInfo[MOVE_REST].effect == EFFECT_REST); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_DROWZEE) { Ability(ABILITY_INSOMNIA); HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/intimidate.c b/test/battle/ability/intimidate.c index 1923a5fe27..61b53f42e1 100644 --- a/test/battle/ability/intimidate.c +++ b/test/battle/ability/intimidate.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); } SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after switch out", s16 damage) @@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after KO", s16 DOUBLE_BATTLE_TEST("Intimidate doesn't activate on an empty field in a double battle") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } @@ -271,9 +271,9 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutral PARAMETRIZE { move = MOVE_HEALING_WISH; } PARAMETRIZE { move = MOVE_BATON_PASS; } GIVEN { - ASSUME(gMovesInfo[MOVE_U_TURN].effect == EFFECT_HIT_ESCAPE); - ASSUME(gMovesInfo[MOVE_HEALING_WISH].effect == EFFECT_HEALING_WISH); - ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_HEALING_WISH) == EFFECT_HEALING_WISH); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } @@ -302,9 +302,9 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutral GIVEN { ASSUME(gItemsInfo[ITEM_EJECT_BUTTON].holdEffect == HOLD_EFFECT_EJECT_BUTTON); ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); - ASSUME(gMovesInfo[MOVE_ROAR].effect == EFFECT_ROAR); - ASSUME(gMovesInfo[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_ROAR) == EFFECT_ROAR); + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); Item(item); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } @@ -333,7 +333,7 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutral SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - fainted") { GIVEN { - ASSUME(gMovesInfo[MOVE_FELL_STINGER].effect == EFFECT_FELL_STINGER); + ASSUME(GetMoveEffect(MOVE_FELL_STINGER) == EFFECT_FELL_STINGER); PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); HP(1); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } diff --git a/test/battle/ability/intrepid_sword.c b/test/battle/ability/intrepid_sword.c index 68300fb229..58fd9883eb 100644 --- a/test/battle/ability/intrepid_sword.c +++ b/test/battle/ability/intrepid_sword.c @@ -67,7 +67,7 @@ SINGLE_BATTLE_TEST("Intrepid Sword activates when it's no longer effected by Neu SINGLE_BATTLE_TEST("Intrepid Sword and Dauntless Shield both can be Skill Swapped and active their effects on the Skill Swap user") { GIVEN { - ASSUME(gMovesInfo[MOVE_SKILL_SWAP].effect == EFFECT_SKILL_SWAP); + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } diff --git a/test/battle/ability/keen_eye.c b/test/battle/ability/keen_eye.c index d1dfad7ceb..f6a5fbc38a 100644 --- a/test/battle/ability/keen_eye.c +++ b/test/battle/ability/keen_eye.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].accuracy == 100); - ASSUME(gMovesInfo[MOVE_SAND_ATTACK].effect == EFFECT_ACCURACY_DOWN); + ASSUME(GetMoveAccuracy(MOVE_TACKLE) == 100); + ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN); ASSUME(B_ILLUMINATE_EFFECT >= GEN_9); } @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasi PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_TEAM].effect == EFFECT_EVASION_UP); + ASSUME(GetMoveEffect(MOVE_DOUBLE_TEAM) == EFFECT_EVASION_UP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { @@ -78,7 +78,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold B PARAMETRIZE { speciesOpponent = SPECIES_URSALUNA_BLOODMOON; abilityOpponent = ABILITY_MINDS_EYE; } } - PASSES_RANDOMLY(gMovesInfo[MOVE_TACKLE].accuracy * 3 / 4, 100, RNG_ACCURACY); + PASSES_RANDOMLY(GetMoveAccuracy(MOVE_TACKLE) * 3 / 4, 100, RNG_ACCURACY); GIVEN { PLAYER(speciesPlayer) { Ability(abilityPlayer); } OPPONENT(speciesOpponent) { Ability(abilityOpponent); } @@ -102,8 +102,8 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-T PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; } GIVEN { - ASSUME(gMovesInfo[MOVE_HONE_CLAWS].effect == EFFECT_ATTACK_ACCURACY_UP); - ASSUME(gMovesInfo[MOVE_TOPSY_TURVY].effect == EFFECT_TOPSY_TURVY); + ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP); + ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { @@ -141,7 +141,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receivi PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; } GIVEN { - ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } @@ -173,8 +173,8 @@ SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief fro PARAMETRIZE { species = SPECIES_STARYU; ability = ABILITY_ILLUMINATE; } GIVEN { - ASSUME(gMovesInfo[MOVE_HONE_CLAWS].effect == EFFECT_ATTACK_ACCURACY_UP); - ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); + ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP); + ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { diff --git a/test/battle/ability/leaf_guard.c b/test/battle/ability/leaf_guard.c index af113f1bb6..e04881ecb4 100644 --- a/test/battle/ability/leaf_guard.c +++ b/test/battle/ability/leaf_guard.c @@ -11,10 +11,10 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents non-volatile status conditions in sun") PARAMETRIZE { move = MOVE_TOXIC; status = STATUS1_TOXIC_POISON; } // PARAMETRIZE { move = MOVE_POWDER_SNOW; status = STATUS1_FREEZE; } // Pointless since you can't freeze in sunlight anyway GIVEN { - ASSUME(gMovesInfo[MOVE_WILL_O_WISP].effect == EFFECT_WILL_O_WISP); - ASSUME(gMovesInfo[MOVE_HYPNOSIS].effect == EFFECT_SLEEP); - ASSUME(gMovesInfo[MOVE_THUNDER_WAVE].effect == EFFECT_PARALYZE); - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_PARALYZE); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -57,7 +57,7 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents Rest during sun") { GIVEN { ASSUME(B_LEAF_GUARD_PREVENTS_REST >= GEN_5); - ASSUME(gMovesInfo[MOVE_REST].effect == EFFECT_REST); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); HP(100); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/lightning_rod.c b/test/battle/ability/lightning_rod.c index 38903f373b..f2e9e434ce 100644 --- a/test/battle/ability/lightning_rod.c +++ b/test/battle/ability/lightning_rod.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the Sp. Attack [Gen5+]") { GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } } WHEN { @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the DOUBLE_BATTLE_TEST("Lightning Rod forces single-target Electric-type moves to target the Pokémon with this Ability.") { GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } @@ -75,7 +75,7 @@ DOUBLE_BATTLE_TEST("Lightning Rod forces single-target Electric-type moves to ta DOUBLE_BATTLE_TEST("Lightning Rod redirects an ally's attack") { GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } diff --git a/test/battle/ability/liquid_ooze.c b/test/battle/ability/liquid_ooze.c index b1f94091f6..fb20522937 100644 --- a/test/battle/ability/liquid_ooze.c +++ b/test/battle/ability/liquid_ooze.c @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Leech Seed users to lose HP instead of he DOUBLE_BATTLE_TEST("Liquid Ooze causes Matcha Gatcha users to lose HP instead of heal") { GIVEN { - ASSUME(gMovesInfo[MOVE_MATCHA_GOTCHA].effect == EFFECT_ABSORB); + ASSUME(GetMoveEffect(MOVE_MATCHA_GOTCHA) == EFFECT_ABSORB); PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); } @@ -61,7 +61,7 @@ DOUBLE_BATTLE_TEST("Liquid Ooze causes Matcha Gatcha users to lose HP instead of DOUBLE_BATTLE_TEST("Liquid Ooze will faint Matcha Gatcha users if it deals enough damage") { GIVEN { - ASSUME(gMovesInfo[MOVE_MATCHA_GOTCHA].effect == EFFECT_ABSORB); + ASSUME(GetMoveEffect(MOVE_MATCHA_GOTCHA) == EFFECT_ABSORB); PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); } @@ -108,9 +108,11 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Strength Sap users to lose HP instead of } } -SINGLE_BATTLE_TEST("Liquid Ooze causes leech seedee to faint before seeder") +/* * https://bulbapedia.bulbagarden.net/wiki/Liquid_Ooze_(Ability)#In_battle: + * If the recipient of Leech Seed's effect were to faint due to Liquid Ooze on the same turn as the victim of Leech Seed, then the victim faints before the recipient. This means that the victim's team loses the battle if both teams had their final Pokémon sent out. + */ +SINGLE_BATTLE_TEST("Liquid Ooze causes leech seed victim to faint before seeder") { - KNOWN_FAILING; // Message fails u16 ability; PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { ability = ABILITY_LIQUID_OOZE; } @@ -120,16 +122,17 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes leech seedee to faint before seeder") } WHEN { TURN { MOVE(player, MOVE_LEECH_SEED); } } SCENE { + // Player seeds opponent MESSAGE("Bulbasaur used Leech Seed!"); // Drain at end of turn ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, opponent); if (ability != ABILITY_LIQUID_OOZE) { - MESSAGE("The opposing Tentacool's health is sapped by Leech Seed!"); MESSAGE("The opposing Tentacool fainted!"); + MESSAGE("The opposing Tentacool's health is sapped by Leech Seed!"); } else { + MESSAGE("The opposing Tentacool fainted!"); ABILITY_POPUP(opponent, ABILITY_LIQUID_OOZE); MESSAGE("Bulbasaur sucked up the liquid ooze!"); - MESSAGE("The opposing Tentacool fainted!"); MESSAGE("Bulbasaur fainted!"); } } diff --git a/test/battle/ability/liquid_voice.c b/test/battle/ability/liquid_voice.c index 79fec2f2a6..6d3fa992f1 100644 --- a/test/battle/ability/liquid_voice.c +++ b/test/battle/ability/liquid_voice.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].power > 0); + ASSUME(GetMoveType(MOVE_HYPER_VOICE) == TYPE_NORMAL); + ASSUME(GetMovePower(MOVE_HYPER_VOICE) > 0); } SINGLE_BATTLE_TEST("Liquid voice turns a sound move into a Water-type move") diff --git a/test/battle/ability/magic_bounce.c b/test/battle/ability/magic_bounce.c index a643b22824..2731a21fed 100644 --- a/test/battle/ability/magic_bounce.c +++ b/test/battle/ability/magic_bounce.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back status moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } } WHEN { @@ -22,8 +22,8 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back status moves") SINGLE_BATTLE_TEST("Magic Bounce bounces back powder moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove); - ASSUME(gMovesInfo[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE); + ASSUME(IsPowderMove(MOVE_STUN_SPORE)); + ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_PARALYZE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } } WHEN { @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back powder moves") SINGLE_BATTLE_TEST("Magic Bounce cannot bounce back powder moves against Grass Types") { GIVEN { - ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove); + ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); PLAYER(SPECIES_ODDISH); OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } @@ -59,8 +59,8 @@ 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 { - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); - ASSUME(gMovesInfo[MOVE_LEER].target == MOVE_TARGET_BOTH); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveTarget(MOVE_LEER) == MOVE_TARGET_BOTH); PLAYER(SPECIES_ABRA); PLAYER(SPECIES_KADABRA); OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } @@ -92,7 +92,7 @@ DOUBLE_BATTLE_TEST("Magic Bounce bounces back moves hitting foes field") battlerTwo = SPECIES_ESPEON; abilityBattlerTwo = ABILITY_MAGIC_BOUNCE; } GIVEN { - ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].target == MOVE_TARGET_OPPONENTS_FIELD); + ASSUME(GetMoveTarget(MOVE_STEALTH_ROCK) == MOVE_TARGET_OPPONENTS_FIELD); PLAYER(SPECIES_ABRA); PLAYER(SPECIES_KADABRA); OPPONENT(battlerOne) { Ability(abilityBattlerOne); } @@ -118,7 +118,7 @@ DOUBLE_BATTLE_TEST("Magic Bounce bounces back moves hitting foes field") SINGLE_BATTLE_TEST("Magic Bounce bounced back status moves can not be bounced back by Magic Bounce") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); PLAYER(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } } WHEN { diff --git a/test/battle/ability/magic_guard.c b/test/battle/ability/magic_guard.c index 344db46e3d..adcfdfc5ac 100644 --- a/test/battle/ability/magic_guard.c +++ b/test/battle/ability/magic_guard.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Magic Guard prevents recoil damage to the user") { GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_EDGE].recoil == 33); + ASSUME(GetMoveRecoil(MOVE_DOUBLE_EDGE) == 33); PLAYER(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/magician.c b/test/battle/ability/magician.c index 14e553a763..f622ac07df 100644 --- a/test/battle/ability/magician.c +++ b/test/battle/ability/magician.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Magician does not get self-damage recoil after stealing Life { GIVEN { ASSUME(gItemsInfo[ITEM_LIFE_ORB].holdEffect == HOLD_EFFECT_LIFE_ORB); - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); PLAYER(SPECIES_DELPHOX) { Ability(ABILITY_MAGICIAN); Item(ITEM_NONE); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } } WHEN { diff --git a/test/battle/ability/merciless.c b/test/battle/ability/merciless.c index fc73842dcf..f9337fb820 100644 --- a/test/battle/ability/merciless.c +++ b/test/battle/ability/merciless.c @@ -3,7 +3,6 @@ SINGLE_BATTLE_TEST("Merciless causes a move to result in a critical hit if the target is poisoned") { - PASSES_RANDOMLY(1, 1, RNG_CRITICAL_HIT); GIVEN { PLAYER(SPECIES_MAREANIE) { Ability(ABILITY_MERCILESS); } OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } diff --git a/test/battle/ability/minds_eye.c b/test/battle/ability/minds_eye.c index bf50fa0e2e..59c81746c7 100644 --- a/test/battle/ability/minds_eye.c +++ b/test/battle/ability/minds_eye.c @@ -48,7 +48,7 @@ AI_SINGLE_BATTLE_TEST("AI doesn't use accuracy-lowering moves if it knows that t for (j = MOVE_NONE + 1; j < MOVES_COUNT; j++) { - if (gMovesInfo[j].effect == EFFECT_ACCURACY_DOWN || gMovesInfo[j].effect == EFFECT_ACCURACY_DOWN_2) { + if (GetMoveEffect(j) == EFFECT_ACCURACY_DOWN || GetMoveEffect(j) == EFFECT_ACCURACY_DOWN_2) { PARAMETRIZE { moveAI = j; abilityAI = ABILITY_SWIFT_SWIM; } PARAMETRIZE { moveAI = j; abilityAI = ABILITY_MOLD_BREAKER; } } diff --git a/test/battle/ability/mirror_armor.c b/test/battle/ability/mirror_armor.c index 288fe72334..5aa2b55ef3 100644 --- a/test/battle/ability/mirror_armor.c +++ b/test/battle/ability/mirror_armor.c @@ -171,8 +171,8 @@ DOUBLE_BATTLE_TEST("Mirror Armor lowers Speed of the partner Pokemon after Court { KNOWN_FAILING; GIVEN { - ASSUME(gMovesInfo[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB); - ASSUME(gMovesInfo[MOVE_COURT_CHANGE].effect == EFFECT_COURT_CHANGE); + ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); + ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_CORVIKNIGHT) {Ability(ABILITY_MIRROR_ARMOR); Item(ITEM_IRON_BALL); } diff --git a/test/battle/ability/moxie.c b/test/battle/ability/moxie.c index 56577736db..35ae64d164 100644 --- a/test/battle/ability/moxie.c +++ b/test/battle/ability/moxie.c @@ -8,7 +8,7 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after direct PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(species) { Ability(ability); } PLAYER(SPECIES_SNORUNT) { HP(1); } OPPONENT(SPECIES_GLALIE) { HP(1); } @@ -84,7 +84,7 @@ SINGLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger when already at maximu PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { - ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM); + ASSUME(GetMoveEffect(MOVE_BELLY_DRUM) == EFFECT_BELLY_DRUM); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_SNORUNT) { HP(1); } OPPONENT(SPECIES_SNORUNT); @@ -122,9 +122,8 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } - KNOWN_FAILING; // Requires simultaneous damage implementation GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(species) { Ability(ability); } PLAYER(SPECIES_ABRA) { HP(1); } OPPONENT(SPECIES_GLALIE); @@ -136,6 +135,7 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); HP_BAR(opponentLeft, captureDamage: &damage[0]); HP_BAR(playerRight); + HP_BAR(opponentRight, captureDamage: &damage[1]); MESSAGE("Abra fainted!"); ABILITY_POPUP(playerLeft, abilityPopUp); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); @@ -145,7 +145,6 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa MESSAGE("Glastrier's Chilling Neigh raised its Attack!"); else MESSAGE("Calyrex's Chilling Neigh raised its Attack!"); - HP_BAR(opponentRight, captureDamage: &damage[1]); } THEN { EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); EXPECT_EQ(damage[0], damage[1]); diff --git a/test/battle/ability/mummy.c b/test/battle/ability/mummy.c index 74461ec2ee..f03e453e5c 100644 --- a/test/battle/ability/mummy.c +++ b/test/battle/ability/mummy.c @@ -10,14 +10,14 @@ SINGLE_BATTLE_TEST("Mummy/Lingering Aroma replace the attacker's ability on cont PARAMETRIZE { move = MOVE_AQUA_JET; ability = ABILITY_LINGERING_AROMA; species = SPECIES_OINKOLOGNE; } PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_LINGERING_AROMA; species = SPECIES_OINKOLOGNE; } GIVEN { - ASSUME(gMovesInfo[MOVE_AQUA_JET].makesContact); - ASSUME(!gMovesInfo[MOVE_WATER_GUN].makesContact); + ASSUME(MoveMakesContact(MOVE_AQUA_JET)); + ASSUME(!MoveMakesContact(MOVE_WATER_GUN)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { TURN { MOVE(player, move); } } SCENE { - if (gMovesInfo[move].makesContact) { + if (MoveMakesContact(move)) { ABILITY_POPUP(opponent, ability); if (ability == ABILITY_MUMMY) MESSAGE("Wobbuffet acquired Mummy!"); @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Mummy and Lingering Aroma don't replace each other") PARAMETRIZE { ability1 = ABILITY_MUMMY; species1 = SPECIES_YAMASK; ability2 = ABILITY_LINGERING_AROMA; species2 = SPECIES_OINKOLOGNE; } PARAMETRIZE { ability1 = ability2 = ABILITY_LINGERING_AROMA; species1 = species2 = SPECIES_OINKOLOGNE; } GIVEN { - ASSUME(gMovesInfo[MOVE_AQUA_JET].makesContact); + ASSUME(MoveMakesContact(MOVE_AQUA_JET)); PLAYER(species1) { Ability(ability1); Speed(2); } OPPONENT(species2) { Ability(ability2); Speed(1); } } WHEN { diff --git a/test/battle/ability/neuroforce.c b/test/battle/ability/neuroforce.c index 88af00b722..bd40982d02 100644 --- a/test/battle/ability/neuroforce.c +++ b/test/battle/ability/neuroforce.c @@ -10,8 +10,8 @@ SINGLE_BATTLE_TEST("Neuroforce increases the strength of super-effective moves b PARAMETRIZE { ability = ABILITY_NEUROFORCE; move = MOVE_TACKLE; } PARAMETRIZE { ability = ABILITY_KLUTZ; move = MOVE_TACKLE; } GIVEN { - ASSUME(gMovesInfo[MOVE_SHADOW_BALL].type == TYPE_GHOST); - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); PLAYER(SPECIES_NECROZMA_ULTRA) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/oblivious.c b/test/battle/ability/oblivious.c index 70bf941923..3ac979a271 100644 --- a/test/battle/ability/oblivious.c +++ b/test/battle/ability/oblivious.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Oblivious prevents Infatuation") { GIVEN { - ASSUME(gMovesInfo[MOVE_ATTRACT].effect == EFFECT_ATTRACT); + ASSUME(GetMoveEffect(MOVE_ATTRACT) == EFFECT_ATTRACT); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); Gender(MON_MALE); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); } } WHEN { @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Oblivious prevents Infatuation") SINGLE_BATTLE_TEST("Oblivious prevents Captivate") { GIVEN { - ASSUME(gMovesInfo[MOVE_CAPTIVATE].effect == EFFECT_CAPTIVATE); + ASSUME(GetMoveEffect(MOVE_CAPTIVATE) == EFFECT_CAPTIVATE); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); Gender(MON_MALE); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); } } WHEN { @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Oblivious prevents Captivate") SINGLE_BATTLE_TEST("Oblivious prevents Taunt") { GIVEN { - ASSUME(gMovesInfo[MOVE_TAUNT].effect == EFFECT_TAUNT); + ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT); ASSUME(B_OBLIVIOUS_TAUNT >= GEN_6); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/opportunist.c b/test/battle/ability/opportunist.c index 662d442dbc..2abd483466 100644 --- a/test/battle/ability/opportunist.c +++ b/test/battle/ability/opportunist.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); } SINGLE_BATTLE_TEST("Opportunist only copies foe's positive stat changes in a turn", s16 damage) diff --git a/test/battle/ability/overcoat.c b/test/battle/ability/overcoat.c index b73f098e78..96f3ffcb08 100644 --- a/test/battle/ability/overcoat.c +++ b/test/battle/ability/overcoat.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Overcoat blocks powder and spore moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove); + ASSUME(IsPowderMove(MOVE_STUN_SPORE)); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PINECO) { Ability(ABILITY_OVERCOAT); } } WHEN { diff --git a/test/battle/ability/overgrow.c b/test/battle/ability/overgrow.c index 0bc2d7cdd5..3ba7790093 100644 --- a/test/battle/ability/overgrow.c +++ b/test/battle/ability/overgrow.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Overgrow boosts Grass-type moves in a pinch", s16 damage) PARAMETRIZE { hp = 99; } PARAMETRIZE { hp = 33; } GIVEN { - ASSUME(gMovesInfo[MOVE_VINE_WHIP].type == TYPE_GRASS); + ASSUME(GetMoveType(MOVE_VINE_WHIP) == TYPE_GRASS); PLAYER(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); MaxHP(99); HP(hp); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/own_tempo.c b/test/battle/ability/own_tempo.c index 01ecdc9434..a061f820ba 100644 --- a/test/battle/ability/own_tempo.c +++ b/test/battle/ability/own_tempo.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes { GIVEN { ASSUME(B_UPDATED_INTIMIDATE >= GEN_8); - ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE); + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; } WHEN { @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes SINGLE_BATTLE_TEST("Own Tempo prevents confusion from moves by the opponent") { GIVEN { - ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE); + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; } WHEN { @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Own Tempo prevents confusion from moves by the user") SINGLE_BATTLE_TEST("Mold Breaker ignores Own Tempo") { GIVEN { - ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE); + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; } WHEN { @@ -73,7 +73,7 @@ SINGLE_BATTLE_TEST("Mold Breaker ignores Own Tempo") SINGLE_BATTLE_TEST("Mold Breaker does not prevent Own Tempo from curing confusion right after") { GIVEN { - ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE); + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); }; OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; } WHEN { @@ -92,8 +92,8 @@ SINGLE_BATTLE_TEST("Mold Breaker does not prevent Own Tempo from curing confusio SINGLE_BATTLE_TEST("Own Tempo cures confusion if it's obtained via Skill Swap") { GIVEN { - ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE); - ASSUME(gMovesInfo[MOVE_SKILL_SWAP].effect == EFFECT_SKILL_SWAP); + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/parental_bond.c b/test/battle/ability/parental_bond.c index e84977c91e..40f70252f9 100644 --- a/test/battle/ability/parental_bond.c +++ b/test/battle/ability/parental_bond.c @@ -4,9 +4,9 @@ SINGLE_BATTLE_TEST("Parental Bond converts Tackle into a two-strike move") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_TACKLE].strikeCount < 2); - ASSUME(gMovesInfo[MOVE_TACKLE].effect == EFFECT_HIT); + ASSUME(GetMoveCategory(MOVE_TACKLE) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveStrikeCount(MOVE_TACKLE) < 2); + ASSUME(GetMoveEffect(MOVE_TACKLE) == EFFECT_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -27,8 +27,8 @@ SINGLE_BATTLE_TEST("Parental Bond converts Tackle into a two-strike move") SINGLE_BATTLE_TEST("Parental Bond does not convert a move with three or more strikes to a two-strike move") { GIVEN { - ASSUME(gMovesInfo[MOVE_TRIPLE_KICK].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_TRIPLE_KICK].strikeCount == 3); + ASSUME(GetMoveCategory(MOVE_TRIPLE_KICK) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveStrikeCount(MOVE_TRIPLE_KICK) == 3); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -54,10 +54,10 @@ SINGLE_BATTLE_TEST("Parental Bond converts multi-target moves into a two-strike PARAMETRIZE { move = MOVE_ICY_WIND; } GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].strikeCount < 2); - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(gMovesInfo[MOVE_ICY_WIND].strikeCount < 2); - ASSUME(gMovesInfo[MOVE_ICY_WIND].target == MOVE_TARGET_BOTH); + ASSUME(GetMoveStrikeCount(MOVE_EARTHQUAKE) < 2); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveStrikeCount(MOVE_ICY_WIND) < 2); + ASSUME(GetMoveTarget(MOVE_ICY_WIND) == MOVE_TARGET_BOTH); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -78,8 +78,8 @@ SINGLE_BATTLE_TEST("Parental Bond converts multi-target moves into a two-strike DOUBLE_BATTLE_TEST("Parental Bond does not convert multi-target moves into a two-strike move in Double Battles, even if it only damages one") { GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].strikeCount < 2); - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveStrikeCount(MOVE_EARTHQUAKE) < 2); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } PLAYER(SPECIES_PIDGEY); @@ -109,8 +109,8 @@ SINGLE_BATTLE_TEST("Parental Bond-converted moves only hit once on Lightning Rod PARAMETRIZE { move = MOVE_THUNDERBOLT; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; type = TYPE_ELECTRIC; } PARAMETRIZE { move = MOVE_SURF; ability = ABILITY_STORM_DRAIN; species = SPECIES_LILEEP; type = TYPE_WATER; } GIVEN { - ASSUME(gMovesInfo[move].strikeCount < 2); - ASSUME(gMovesInfo[move].type == type); + ASSUME(GetMoveStrikeCount(move) < 2); + ASSUME(GetMoveType(move) == type); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(species) { Ability(ability); } } WHEN { @@ -140,8 +140,8 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil GIVEN { WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -169,8 +169,8 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil GIVEN { WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -199,8 +199,8 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil GIVEN { WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -230,8 +230,8 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil GIVEN { WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -254,8 +254,8 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil SINGLE_BATTLE_TEST("Parental Bond Smack Down effect triggers after 2nd hit") { GIVEN { - ASSUME(gMovesInfo[MOVE_SMACK_DOWN].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_SMACK_DOWN].strikeCount < 2); + ASSUME(GetMoveCategory(MOVE_SMACK_DOWN) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveStrikeCount(MOVE_SMACK_DOWN) < 2); ASSUME(MoveHasAdditionalEffect(MOVE_SMACK_DOWN, MOVE_EFFECT_SMACK_DOWN)); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_SKARMORY); @@ -279,7 +279,7 @@ SINGLE_BATTLE_TEST("Parental Bond Snore strikes twice while asleep") { s16 damage[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_SNORE].effect == EFFECT_SNORE); + ASSUME(GetMoveEffect(MOVE_SNORE) == EFFECT_SNORE); PLAYER(SPECIES_KANGASKHAN_MEGA) { Status1(STATUS1_SLEEP); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -301,7 +301,7 @@ SINGLE_BATTLE_TEST("Parental Bond Snore strikes twice while asleep") SINGLE_BATTLE_TEST("Parental Bond only triggers Dragon Tail's target switch out on the second hit") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET); + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/ability/pastel_veil.c b/test/battle/ability/pastel_veil.c index 2b721fd095..5f6fa6b058 100644 --- a/test/battle/ability/pastel_veil.c +++ b/test/battle/ability/pastel_veil.c @@ -34,7 +34,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Poison Sting poison on partner") SINGLE_BATTLE_TEST("Pastel Veil immediately cures Mold Breaker poison") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } } WHEN { @@ -52,7 +52,7 @@ SINGLE_BATTLE_TEST("Pastel Veil immediately cures Mold Breaker poison") DOUBLE_BATTLE_TEST("Pastel Veil does not cure Mold Breaker poison on partner") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } @@ -69,7 +69,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil does not cure Mold Breaker poison on partner") SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } } WHEN { @@ -85,7 +85,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison") DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } @@ -103,7 +103,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner") SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic Spikes poison") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); + ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } @@ -119,7 +119,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic Spikes poison") DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic Spikes poison on partner") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); + ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); } diff --git a/test/battle/ability/pickup.c b/test/battle/ability/pickup.c index a6dabb66cc..22db259399 100644 --- a/test/battle/ability/pickup.c +++ b/test/battle/ability/pickup.c @@ -120,7 +120,7 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item after its holder faints") SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if holder is replaced") { GIVEN { - ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT); + ASSUME(GetMoveEffect(MOVE_PARTING_SHOT) == EFFECT_PARTING_SHOT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { MaxHP(300); HP(151); Item(ITEM_SITRUS_BERRY); } @@ -202,7 +202,7 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item if the user eats it with Bug Bi SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if its user already restored it") { GIVEN { - ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE); + ASSUME(GetMoveEffect(MOVE_RECYCLE) == EFFECT_RECYCLE); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -222,7 +222,7 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if its user already restor SINGLE_BATTLE_TEST("Pickup restores an item that has been Flinged") { GIVEN { - ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING); + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } } WHEN { @@ -239,7 +239,7 @@ SINGLE_BATTLE_TEST("Pickup restores an item that has been Flinged") SINGLE_BATTLE_TEST("Pickup restores an item that was used by Natural Gift") { GIVEN { - ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); + ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } } WHEN { diff --git a/test/battle/ability/pixilate.c b/test/battle/ability/pixilate.c index 97c9c37a0c..44289769a6 100644 --- a/test/battle/ability/pixilate.c +++ b/test/battle/ability/pixilate.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); } SINGLE_BATTLE_TEST("Pixilate turns a Normal-type move into a Fairy-type move") diff --git a/test/battle/ability/poison_point.c b/test/battle/ability/poison_point.c index 9f9cd5e900..635698379c 100644 --- a/test/battle/ability/poison_point.c +++ b/test/battle/ability/poison_point.c @@ -7,15 +7,15 @@ SINGLE_BATTLE_TEST("Poison Point inflicts poison on contact") PARAMETRIZE { move = MOVE_TACKLE; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); - ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(!MoveMakesContact(MOVE_SWIFT)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_NIDORAN_M) { Ability(ABILITY_POISON_POINT); } } WHEN { TURN { MOVE(player, move); } TURN {} } SCENE { - if (gMovesInfo[move].makesContact) { + if (MoveMakesContact(move)) { ABILITY_POPUP(opponent, ABILITY_POISON_POINT); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, player); MESSAGE("Wobbuffet was poisoned by the opposing Nidoran♂'s Poison Point!"); @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Poison Point triggers 30% of the time") PASSES_RANDOMLY(3, 10, RNG_POISON_POINT); GIVEN { ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_NIDORAN_M) { Ability(ABILITY_POISON_POINT); } } WHEN { diff --git a/test/battle/ability/poison_puppeteer.c b/test/battle/ability/poison_puppeteer.c index b8124b975b..d5c470ad37 100644 --- a/test/battle/ability/poison_puppeteer.c +++ b/test/battle/ability/poison_puppeteer.c @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Poison Puppeteer confuses target if it was (badly) poisoned SINGLE_BATTLE_TEST("Poison Puppeteer does not trigger if poison is Toxic Spikes induced") { GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); + ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); PLAYER(SPECIES_PECHARUNT) { Ability(ABILITY_POISON_PUPPETEER); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/poison_touch.c b/test/battle/ability/poison_touch.c index 8fb4d243fb..530d361794 100644 --- a/test/battle/ability/poison_touch.c +++ b/test/battle/ability/poison_touch.c @@ -5,8 +5,8 @@ SINGLE_BATTLE_TEST("Poison Touch has a 30% chance to poison when attacking with { PASSES_RANDOMLY(3, 10, RNG_POISON_TOUCH); GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_GRIMER) { Ability(ABILITY_POISON_TOUCH); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -27,15 +27,15 @@ SINGLE_BATTLE_TEST("Poison Touch only applies when using contact moves") PARAMETRIZE { move = MOVE_TACKLE; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); - ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(!MoveMakesContact(MOVE_SWIFT)); PLAYER(SPECIES_GRIMER) { Ability(ABILITY_POISON_TOUCH); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, move); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, move, player); - if (gMovesInfo[move].makesContact) { + if (MoveMakesContact(move)) { ABILITY_POPUP(player, ABILITY_POISON_TOUCH); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); MESSAGE("The opposing Wobbuffet was poisoned by Grimer's Poison Touch!"); @@ -54,8 +54,8 @@ SINGLE_BATTLE_TEST("Poison Touch only applies when using contact moves") SINGLE_BATTLE_TEST("Poison Touch applies between multi-hit move hits") { GIVEN { - ASSUME(gMovesInfo[MOVE_ARM_THRUST].effect == EFFECT_MULTI_HIT); - ASSUME(gMovesInfo[MOVE_ARM_THRUST].makesContact); + ASSUME(GetMoveEffect(MOVE_ARM_THRUST) == EFFECT_MULTI_HIT); + ASSUME(MoveMakesContact(MOVE_ARM_THRUST)); ASSUME(gItemsInfo[ITEM_PECHA_BERRY].holdEffect == HOLD_EFFECT_CURE_PSN); PLAYER(SPECIES_GRIMER) { Ability(ABILITY_POISON_TOUCH); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_PECHA_BERRY); }; diff --git a/test/battle/ability/prankster.c b/test/battle/ability/prankster.c index c569506729..cf297214d9 100644 --- a/test/battle/ability/prankster.c +++ b/test/battle/ability/prankster.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(gSpeciesInfo[SPECIES_UMBREON].types[0] == TYPE_DARK); - ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveCategory(MOVE_CONFUSE_RAY) == DAMAGE_CATEGORY_STATUS); } SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon") @@ -135,7 +135,7 @@ SINGLE_BATTLE_TEST("Prankster is blocked by Quick Guard in Gen5+") DOUBLE_BATTLE_TEST("Prankster-affected moves that target all Pokémon are successful regardless of the presence of Dark-type Pokémon") { GIVEN { - ASSUME(gMovesInfo[MOVE_CAPTIVATE].target == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_CAPTIVATE) == MOVE_TARGET_BOTH); PLAYER(SPECIES_ILLUMISE) { Ability(ABILITY_PRANKSTER); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_UMBREON); diff --git a/test/battle/ability/primordial_sea.c b/test/battle/ability/primordial_sea.c index 01ed892874..e895d8ba48 100644 --- a/test/battle/ability/primordial_sea.c +++ b/test/battle/ability/primordial_sea.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(!IS_MOVE_STATUS(MOVE_EMBER)); - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(!IsBattleMoveStatus(MOVE_EMBER)); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); } SINGLE_BATTLE_TEST("Primordial Sea blocks damaging Fire-type moves") @@ -32,9 +32,9 @@ SINGLE_BATTLE_TEST("Primordial Sea blocks damaging Fire-type moves") DOUBLE_BATTLE_TEST("Primordial Sea blocks damaging Fire-type moves and prints the message only once with moves hitting multiple targets") { GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_ERUPTION)); - ASSUME(gMovesInfo[MOVE_ERUPTION].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_ERUPTION].target == MOVE_TARGET_BOTH); + ASSUME(!IsBattleMoveStatus(MOVE_ERUPTION)); + ASSUME(GetMoveType(MOVE_ERUPTION) == TYPE_FIRE); + ASSUME(GetMoveTarget(MOVE_ERUPTION) == MOVE_TARGET_BOTH); PLAYER(SPECIES_KYOGRE) {Item(ITEM_BLUE_ORB); {Speed(5);}} PLAYER(SPECIES_WOBBUFFET) {Speed(5);} OPPONENT(SPECIES_WOBBUFFET) {Speed(10);} diff --git a/test/battle/ability/protosynthesis.c b/test/battle/ability/protosynthesis.c index 2be9f81d28..5a468893e5 100644 --- a/test/battle/ability/protosynthesis.c +++ b/test/battle/ability/protosynthesis.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_ROUND].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); } SINGLE_BATTLE_TEST("Protosynthesis boosts the highest stat") diff --git a/test/battle/ability/purifying_salt.c b/test/battle/ability/purifying_salt.c index 495ce01a46..cb8fc6ca56 100644 --- a/test/battle/ability/purifying_salt.c +++ b/test/battle/ability/purifying_salt.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Purifying Salt halves damage from Ghost-type moves", s16 dam PARAMETRIZE { ability = ABILITY_STURDY; } PARAMETRIZE { ability = ABILITY_PURIFYING_SALT; } GIVEN { - ASSUME(gMovesInfo[MOVE_SHADOW_BALL].type == TYPE_GHOST); + ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GARGANACL) { Ability(ability); } } WHEN { @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Purifying Salt halves damage from dynamic Ghost-type moves", PARAMETRIZE { ability = ABILITY_STURDY; } PARAMETRIZE { ability = ABILITY_PURIFYING_SALT; } GIVEN { - ASSUME(gMovesInfo[MOVE_TERA_BLAST].effect == EFFECT_TERA_BLAST); + ASSUME(GetMoveEffect(MOVE_TERA_BLAST) == EFFECT_TERA_BLAST); PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_GHOST); } OPPONENT(SPECIES_GARGANACL) { Ability(ability); } } WHEN { @@ -61,10 +61,10 @@ SINGLE_BATTLE_TEST("Purifying Salt grants immunity to status effects") PARAMETRIZE { move = MOVE_TOXIC; status = STATUS1_TOXIC_POISON; } PARAMETRIZE { move = MOVE_POWDER_SNOW; status = STATUS1_FREEZE; } GIVEN { - ASSUME(gMovesInfo[MOVE_WILL_O_WISP].effect == EFFECT_WILL_O_WISP); - ASSUME(gMovesInfo[MOVE_HYPNOSIS].effect == EFFECT_SLEEP); - ASSUME(gMovesInfo[MOVE_THUNDER_WAVE].effect == EFFECT_PARALYZE); - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_PARALYZE); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); ASSUME(MoveHasAdditionalEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_PURIFYING_SALT); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/quark_drive.c b/test/battle/ability/quark_drive.c index 928ee45eb5..edefdc1305 100644 --- a/test/battle/ability/quark_drive.c +++ b/test/battle/ability/quark_drive.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_ROUND].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); } SINGLE_BATTLE_TEST("Quark Drive boosts the highest stat") diff --git a/test/battle/ability/rain_dish.c b/test/battle/ability/rain_dish.c index 93f642c633..dc7de954c3 100644 --- a/test/battle/ability/rain_dish.c +++ b/test/battle/ability/rain_dish.c @@ -2,7 +2,7 @@ #include "test/battle.h" ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_RAIN_DANCE].effect == EFFECT_RAIN_DANCE); + ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_RAIN_DANCE); } SINGLE_BATTLE_TEST("Rain Dish recovers 1/16th of Max HP in Rain") diff --git a/test/battle/ability/rattled.c b/test/battle/ability/rattled.c index da8157d28a..465a688951 100644 --- a/test/battle/ability/rattled.c +++ b/test/battle/ability/rattled.c @@ -3,14 +3,14 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FURY_CUTTER].type == TYPE_BUG); - ASSUME(!IS_MOVE_STATUS(MOVE_FURY_CUTTER)); - ASSUME(gMovesInfo[MOVE_FEINT_ATTACK].type == TYPE_DARK); - ASSUME(!IS_MOVE_STATUS(MOVE_FEINT_ATTACK)); - ASSUME(gMovesInfo[MOVE_SHADOW_PUNCH].type == TYPE_GHOST); - ASSUME(!IS_MOVE_STATUS(MOVE_SHADOW_PUNCH)); - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); + ASSUME(GetMoveType(MOVE_FURY_CUTTER) == TYPE_BUG); + ASSUME(!IsBattleMoveStatus(MOVE_FURY_CUTTER)); + ASSUME(GetMoveType(MOVE_FEINT_ATTACK) == TYPE_DARK); + ASSUME(!IsBattleMoveStatus(MOVE_FEINT_ATTACK)); + ASSUME(GetMoveType(MOVE_SHADOW_PUNCH) == TYPE_GHOST); + ASSUME(!IsBattleMoveStatus(MOVE_SHADOW_PUNCH)); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); } SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when hit by Bug, Dark or Ghost type move") @@ -73,8 +73,8 @@ SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when affected by Intimidate") SINGLE_BATTLE_TEST("Rattled triggers correctly when hit by U-Turn") // Specific test here, because of #3124 { GIVEN { - ASSUME(gMovesInfo[MOVE_U_TURN].effect == EFFECT_HIT_ESCAPE); - ASSUME(gMovesInfo[MOVE_U_TURN].type == TYPE_BUG); + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveType(MOVE_U_TURN) == TYPE_BUG); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_SUDOWOODO) {Ability(ABILITY_RATTLED); } diff --git a/test/battle/ability/refrigerate.c b/test/battle/ability/refrigerate.c index dbbaa30eb8..b3f7b59a9e 100644 --- a/test/battle/ability/refrigerate.c +++ b/test/battle/ability/refrigerate.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); } SINGLE_BATTLE_TEST("Refrigerate turns a Normal-type move into a Ice-type move") diff --git a/test/battle/ability/regenerator.c b/test/battle/ability/regenerator.c new file mode 100644 index 0000000000..0f1b432772 --- /dev/null +++ b/test/battle/ability/regenerator.c @@ -0,0 +1,50 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Regenerator heals 1/3 of max HP upon switching out") +{ + u32 currHP; + PARAMETRIZE { currHP = 1; } + PARAMETRIZE { currHP = 2; } + PARAMETRIZE { currHP = 3; } + GIVEN { + PLAYER(SPECIES_SLOWBRO) { Ability(ABILITY_REGENERATOR); HP(currHP); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } + } SCENE { + SWITCH_OUT_MESSAGE("Slowbro"); + SEND_IN_MESSAGE("Wobbuffet"); + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Slowbro"); + } THEN { + EXPECT_EQ(player->hp, player->maxHP / 3 + currHP); + } +} + +SINGLE_BATTLE_TEST("Regenerator heals 1/3 of max HP upon switching out but doesn't surpass max HP") +{ + u32 currHP; + PARAMETRIZE { currHP = 5; } + PARAMETRIZE { currHP = 4; } + PARAMETRIZE { currHP = 3; } + PARAMETRIZE { currHP = 2; } + PARAMETRIZE { currHP = 1; } + GIVEN { + PLAYER(SPECIES_SLOWBRO) { Ability(ABILITY_REGENERATOR); HP(currHP); MaxHP(5); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } + } SCENE { + SWITCH_OUT_MESSAGE("Slowbro"); + SEND_IN_MESSAGE("Wobbuffet"); + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Slowbro"); + } THEN { + EXPECT_LE(player->hp, player->maxHP); + } +} diff --git a/test/battle/ability/rocky_payload.c b/test/battle/ability/rocky_payload.c index 27cc45fda0..6756b98b8b 100644 --- a/test/battle/ability/rocky_payload.c +++ b/test/battle/ability/rocky_payload.c @@ -14,11 +14,11 @@ SINGLE_BATTLE_TEST("Rocky Payload increases Rock-type move damage", s16 damage) PARAMETRIZE { move = MOVE_POWER_GEM; ability = ABILITY_ROCKY_PAYLOAD; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ROCK); - ASSUME(gMovesInfo[MOVE_ROCK_THROW].type == TYPE_ROCK); - ASSUME(gMovesInfo[MOVE_POWER_GEM].type == TYPE_ROCK); - ASSUME(gMovesInfo[MOVE_ROCK_THROW].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_POWER_GEM].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_ROCK); + ASSUME(GetMoveType(MOVE_ROCK_THROW) == TYPE_ROCK); + ASSUME(GetMoveType(MOVE_POWER_GEM) == TYPE_ROCK); + ASSUME(GetMoveCategory(MOVE_ROCK_THROW) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_POWER_GEM) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_BOMBIRDIER) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/sand_veil.c b/test/battle/ability/sand_veil.c index f42c267273..7622d18763 100644 --- a/test/battle/ability/sand_veil.c +++ b/test/battle/ability/sand_veil.c @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Sand Veil increases evasion during sandstorm") { PASSES_RANDOMLY(4, 5, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_POUND].accuracy == 100); + ASSUME(GetMoveAccuracy(MOVE_POUND) == 100); PLAYER(SPECIES_SANDSHREW) { Ability(ABILITY_SAND_VEIL); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/sap_sipper.c b/test/battle/ability/sap_sipper.c index d691d4e91a..aeb746d2c6 100644 --- a/test/battle/ability/sap_sipper.c +++ b/test/battle/ability/sap_sipper.c @@ -61,7 +61,7 @@ SINGLE_BATTLE_TEST("Sap Sipper does not increase Attack if already maxed") SINGLE_BATTLE_TEST("Sap Sipper blocks multi-hit grass type moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_BULLET_SEED].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_BULLET_SEED) == EFFECT_MULTI_HIT); PLAYER(SPECIES_MARILL) { Ability(ABILITY_SAP_SIPPER); } OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } } WHEN { diff --git a/test/battle/ability/seed_sower.c b/test/battle/ability/seed_sower.c index 822fa8b703..ad4beea515 100644 --- a/test/battle/ability/seed_sower.c +++ b/test/battle/ability/seed_sower.c @@ -19,7 +19,6 @@ SINGLE_BATTLE_TEST("Seed Sower sets up Grassy Terrain when hit by an attack") #define ABILITY_PARAM(n)(abilities[n] = (k == n) ? ABILITY_SEED_SOWER : ABILITY_HARVEST) #define MOVE_HIT(target, position) \ { \ - HP_BAR(target); \ if (abilities[position] == ABILITY_SEED_SOWER) { \ ABILITY_POPUP(target); \ MESSAGE("Grass grew to cover the battlefield!");\ @@ -50,8 +49,8 @@ DOUBLE_BATTLE_TEST("Multi-target moves hit correct battlers after Seed Sower is } GIVEN { - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].target == MOVE_TARGET_BOTH); - ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(SPECIES_ARBOLIVA) { Ability(abilities[B_POSITION_PLAYER_LEFT]); } PLAYER(SPECIES_ARBOLIVA) { Ability(abilities[B_POSITION_PLAYER_RIGHT]); } OPPONENT(SPECIES_ARBOLIVA) { Ability(abilities[B_POSITION_OPPONENT_LEFT]); } @@ -68,9 +67,13 @@ DOUBLE_BATTLE_TEST("Multi-target moves hit correct battlers after Seed Sower is if (usedMove == MOVE_HYPER_VOICE) { if ((attacker & BIT_SIDE) == B_SIDE_OPPONENT) { if (attacker == B_POSITION_OPPONENT_LEFT) { + HP_BAR(playerLeft); + HP_BAR(playerRight); MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT); MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT); } else { + HP_BAR(playerLeft); + HP_BAR(playerRight); MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT); MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT); } @@ -80,9 +83,13 @@ DOUBLE_BATTLE_TEST("Multi-target moves hit correct battlers after Seed Sower is } } else { if (attacker == B_POSITION_PLAYER_LEFT) { + HP_BAR(opponentLeft); + HP_BAR(opponentRight); MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT); MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT); } else { + HP_BAR(opponentLeft); + HP_BAR(opponentRight); MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT); MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT); } @@ -94,24 +101,36 @@ DOUBLE_BATTLE_TEST("Multi-target moves hit correct battlers after Seed Sower is } else { // SURF switch (attacker) { case B_POSITION_PLAYER_LEFT: + HP_BAR(opponentLeft); + HP_BAR(playerRight); + HP_BAR(opponentRight); MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT); MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT); MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT); NOT HP_BAR(playerLeft); break; case B_POSITION_OPPONENT_LEFT: + HP_BAR(playerLeft); + HP_BAR(playerRight); + HP_BAR(opponentRight); MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT); MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT); MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT); NOT HP_BAR(opponentLeft); break; case B_POSITION_PLAYER_RIGHT: + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT); MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT); MOVE_HIT(opponentRight, B_POSITION_OPPONENT_RIGHT); NOT HP_BAR(playerRight); break; case B_POSITION_OPPONENT_RIGHT: + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + HP_BAR(playerRight); MOVE_HIT(playerLeft, B_POSITION_PLAYER_LEFT); MOVE_HIT(opponentLeft, B_POSITION_OPPONENT_LEFT); MOVE_HIT(playerRight, B_POSITION_PLAYER_RIGHT); diff --git a/test/battle/ability/sharpness.c b/test/battle/ability/sharpness.c index 8ecb07671d..38ed79f86f 100644 --- a/test/battle/ability/sharpness.c +++ b/test/battle/ability/sharpness.c @@ -11,8 +11,8 @@ SINGLE_BATTLE_TEST("Sharpness increases the power of slicing moves", s16 damage) PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_STEADFAST; } GIVEN { - ASSUME(gMovesInfo[MOVE_AERIAL_ACE].slicingMove); - ASSUME(!gMovesInfo[MOVE_SCRATCH].slicingMove); + ASSUME(IsSlicingMove(MOVE_AERIAL_ACE)); + ASSUME(!IsSlicingMove(MOVE_SCRATCH)); PLAYER(SPECIES_GALLADE) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/shed_skin.c b/test/battle/ability/shed_skin.c index e4ab6b736c..2df293ecb4 100644 --- a/test/battle/ability/shed_skin.c +++ b/test/battle/ability/shed_skin.c @@ -8,7 +8,7 @@ SINGLE_BATTLE_TEST("Shed Skin triggers 33% of the time") else PASSES_RANDOMLY(33, 100, RNG_SHED_SKIN); GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ARBOK) { Status1(STATUS1_POISON); Ability(ABILITY_SHED_SKIN); } } WHEN { diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index bd8d57a168..7624dee9cb 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -616,7 +616,7 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to s16 damage1, damage2; u32 move = 0; for (u32 j = 1; j < MOVES_COUNT; j += 4) - if (gMovesInfo[j].category != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } GIVEN { PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } @@ -653,23 +653,26 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to } else TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - if (gMovesInfo[move].effect == EFFECT_TWO_TURNS_ATTACK || gMovesInfo[move].effect == EFFECT_SEMI_INVULNERABLE || gMovesInfo[move].effect == EFFECT_SOLAR_BEAM || gMovesInfo[move].effect == EFFECT_SKY_DROP) + switch (GetMoveEffect(move)) { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } TURN { ; } - } - if (gMovesInfo[move].effect == EFFECT_FUTURE_SIGHT) - { - TURN { ; } - TURN { ; } - } - if (gMovesInfo[move].effect == EFFECT_BIDE) - { + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; } } SCENE { - if (gMovesInfo[move].effect != EFFECT_FUTURE_SIGHT) + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) { HP_BAR(opponentRight, captureDamage: &damage1); HP_BAR(playerRight, captureDamage: &damage2); @@ -691,7 +694,7 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to s16 damage1, damage2; u32 move = 0; for (u32 j = 2; j < MOVES_COUNT; j += 4) - if (gMovesInfo[j].category != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } GIVEN { PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } @@ -728,23 +731,26 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to } else TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - if (gMovesInfo[move].effect == EFFECT_TWO_TURNS_ATTACK || gMovesInfo[move].effect == EFFECT_SEMI_INVULNERABLE || gMovesInfo[move].effect == EFFECT_SOLAR_BEAM || gMovesInfo[move].effect == EFFECT_SKY_DROP) + switch (GetMoveEffect(move)) { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } TURN { ; } - } - if (gMovesInfo[move].effect == EFFECT_FUTURE_SIGHT) - { - TURN { ; } - TURN { ; } - } - if (gMovesInfo[move].effect == EFFECT_BIDE) - { + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; } } SCENE { - if (gMovesInfo[move].effect != EFFECT_FUTURE_SIGHT) + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) { HP_BAR(opponentRight, captureDamage: &damage1); HP_BAR(playerRight, captureDamage: &damage2); @@ -766,7 +772,7 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to s16 damage1, damage2; u32 move = 0; for (u32 j = 3; j < MOVES_COUNT; j += 4) - if (gMovesInfo[j].category != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } GIVEN { PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } @@ -803,23 +809,26 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to } else TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - if (gMovesInfo[move].effect == EFFECT_TWO_TURNS_ATTACK || gMovesInfo[move].effect == EFFECT_SEMI_INVULNERABLE || gMovesInfo[move].effect == EFFECT_SOLAR_BEAM || gMovesInfo[move].effect == EFFECT_SKY_DROP) + switch (GetMoveEffect(move)) { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } TURN { ; } - } - if (gMovesInfo[move].effect == EFFECT_FUTURE_SIGHT) - { - TURN { ; } - TURN { ; } - } - if (gMovesInfo[move].effect == EFFECT_BIDE) - { + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; } } SCENE { - if (gMovesInfo[move].effect != EFFECT_FUTURE_SIGHT) + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) { HP_BAR(opponentRight, captureDamage: &damage1); HP_BAR(playerRight, captureDamage: &damage2); @@ -842,7 +851,7 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to u32 move = 0; for (u32 j = 4; j < MOVES_COUNT; j += 4) { - if (gMovesInfo[j].category != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } } GIVEN { @@ -880,23 +889,26 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to } else TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - if (gMovesInfo[move].effect == EFFECT_TWO_TURNS_ATTACK || gMovesInfo[move].effect == EFFECT_SEMI_INVULNERABLE || gMovesInfo[move].effect == EFFECT_SOLAR_BEAM || gMovesInfo[move].effect == EFFECT_SKY_DROP) + switch (GetMoveEffect(move)) { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } TURN { ; } - } - if (gMovesInfo[move].effect == EFFECT_FUTURE_SIGHT) - { - TURN { ; } - TURN { ; } - } - if (gMovesInfo[move].effect == EFFECT_BIDE) - { + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; } } SCENE { - if (gMovesInfo[move].effect != EFFECT_FUTURE_SIGHT) + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) { HP_BAR(opponentRight, captureDamage: &damage1); HP_BAR(playerRight, captureDamage: &damage2); diff --git a/test/battle/ability/shield_dust.c b/test/battle/ability/shield_dust.c index 9e3dc0bf19..59f5b1162c 100644 --- a/test/battle/ability/shield_dust.c +++ b/test/battle/ability/shield_dust.c @@ -93,7 +93,7 @@ SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary o PARAMETRIZE { move = MOVE_METEOR_ASSAULT; } GIVEN { - ASSUME(gMovesInfo[MOVE_RAPID_SPIN].effect == EFFECT_RAPID_SPIN); + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); ASSUME(MoveHasAdditionalEffectSelf(MOVE_POWER_UP_PUNCH, MOVE_EFFECT_ATK_PLUS_1) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_LEAF_STORM, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_METEOR_ASSAULT, MOVE_EFFECT_RECHARGE) == TRUE); @@ -124,7 +124,6 @@ SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary o DOUBLE_BATTLE_TEST("Shield Dust does or does not block Sparkling Aria depending on number of targets hit") { u32 moveToUse; - KNOWN_FAILING; PARAMETRIZE { moveToUse = MOVE_FINAL_GAMBIT; } PARAMETRIZE { moveToUse = MOVE_TACKLE; } GIVEN { @@ -148,9 +147,22 @@ DOUBLE_BATTLE_TEST("Shield Dust does or does not block Sparkling Aria depending } } +DOUBLE_BATTLE_TEST("Shield Dust blocks Sparkling Aria if all other targets avoid getting hit by") +{ + GIVEN { + PLAYER(SPECIES_PRIMARINA); + PLAYER(SPECIES_VIVILLON) { Ability(ABILITY_SHIELD_DUST); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WYNAUT) { Status1(STATUS1_BURN); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_FLY, target:playerLeft); MOVE(opponentRight, MOVE_PROTECT); MOVE(playerRight, MOVE_CELEBRATE); MOVE(playerLeft, MOVE_SPARKLING_ARIA); } + } SCENE { + NOT MESSAGE("Vivillon's burn was cured!"); + } +} + SINGLE_BATTLE_TEST("Shield Dust blocks Sparkling Aria in singles") { - KNOWN_FAILING; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_VIVILLON) { Ability(ABILITY_SHIELD_DUST); Status1(STATUS1_BURN); } diff --git a/test/battle/ability/snow_cloak.c b/test/battle/ability/snow_cloak.c index 5b589f168f..fe0adeaff9 100644 --- a/test/battle/ability/snow_cloak.c +++ b/test/battle/ability/snow_cloak.c @@ -17,7 +17,7 @@ SINGLE_BATTLE_TEST("Snow Cloak increases evasion during hail") { PASSES_RANDOMLY(4, 5, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_POUND].accuracy == 100); + ASSUME(GetMoveAccuracy(MOVE_POUND) == 100); PLAYER(SPECIES_GLACEON) { Ability(ABILITY_SNOW_CLOAK); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -45,7 +45,7 @@ SINGLE_BATTLE_TEST("Snow Cloak increases evasion during snow") { PASSES_RANDOMLY(4, 5, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_POUND].accuracy == 100); + ASSUME(GetMoveAccuracy(MOVE_POUND) == 100); PLAYER(SPECIES_GLACEON) { Ability(ABILITY_SNOW_CLOAK); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/stalwart.c b/test/battle/ability/stalwart.c index 6f8acd6d82..22debe74cd 100644 --- a/test/battle/ability/stalwart.c +++ b/test/battle/ability/stalwart.c @@ -24,8 +24,8 @@ DOUBLE_BATTLE_TEST("Stalwart stops Lightning Rod and Storm Drain from redirectin PARAMETRIZE { ability = ABILITY_STORM_DRAIN; species = SPECIES_LUMINEON; } PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; } GIVEN { - ASSUME(gMovesInfo[MOVE_SPARK].type == TYPE_ELECTRIC); - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_SPARK) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STALWART); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } diff --git a/test/battle/ability/stamina.c b/test/battle/ability/stamina.c index f5b89bb86b..172154cc85 100644 --- a/test/battle/ability/stamina.c +++ b/test/battle/ability/stamina.c @@ -24,10 +24,10 @@ SINGLE_BATTLE_TEST("Stamina raises Defense by 1 when hit by a move") PARAMETRIZE {move = MOVE_GUST; } GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); - ASSUME(!IS_MOVE_STATUS(MOVE_GUST)); - ASSUME(gMovesInfo[MOVE_GUST].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_GUST)); + ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STAMINA); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -56,7 +56,7 @@ DOUBLE_BATTLE_TEST("Stamina activates correctly for every battler with the abili PARAMETRIZE {abilityLeft = ABILITY_STAMINA, abilityRight = ABILITY_STAMINA; } GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET) { Ability(abilityLeft); Speed(10); } PLAYER(SPECIES_WOBBUFFET) { Ability(abilityRight); Speed(5); } OPPONENT(SPECIES_WOBBUFFET) {Speed(20); } @@ -67,18 +67,19 @@ DOUBLE_BATTLE_TEST("Stamina activates correctly for every battler with the abili ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, opponentLeft); HP_BAR(playerLeft); + HP_BAR(playerRight); + 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); + 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); + 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. } THEN { EXPECT_NE(playerLeft->hp, playerLeft->maxHP); diff --git a/test/battle/ability/stance_change.c b/test/battle/ability/stance_change.c index 7998c907cb..c2325ec768 100644 --- a/test/battle/ability/stance_change.c +++ b/test/battle/ability/stance_change.c @@ -64,7 +64,7 @@ SINGLE_BATTLE_TEST("Stance Change changes Aegislash from Blade to Shield when us SINGLE_BATTLE_TEST("Stance Change doesn't change Aegislash to Shield if King's Shield is called by a different move - Sleep Talk") { GIVEN { - ASSUME(gMovesInfo[MOVE_SLEEP_TALK].effect == EFFECT_SLEEP_TALK); + ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); PLAYER(SPECIES_AEGISLASH_BLADE) { Moves(MOVE_KINGS_SHIELD, MOVE_SLEEP_TALK); Status1(STATUS1_SLEEP_TURN(3)); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/static.c b/test/battle/ability/static.c index 3c5d042cd0..8d5a27c6b5 100644 --- a/test/battle/ability/static.c +++ b/test/battle/ability/static.c @@ -7,14 +7,14 @@ SINGLE_BATTLE_TEST("Static inflicts paralysis on contact") PARAMETRIZE { move = MOVE_TACKLE; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); - ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(!MoveMakesContact(MOVE_SWIFT)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU) { Ability(ABILITY_STATIC); } } WHEN { TURN { MOVE(player, move); } } SCENE { - if (gMovesInfo[move].makesContact) { + if (MoveMakesContact(move)) { ABILITY_POPUP(opponent, ABILITY_STATIC); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, player); MESSAGE("The opposing Pikachu's Static paralyzed Wobbuffet, so it may be unable to move!"); @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Static triggers 30% of the time") PASSES_RANDOMLY(3, 10, RNG_STATIC); GIVEN { ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU) { Ability(ABILITY_STATIC); } } WHEN { diff --git a/test/battle/ability/steelworker.c b/test/battle/ability/steelworker.c index 7e8ecbb568..23d4be2917 100644 --- a/test/battle/ability/steelworker.c +++ b/test/battle/ability/steelworker.c @@ -14,11 +14,11 @@ SINGLE_BATTLE_TEST("Steelworker increases Steel-type move damage", s16 damage) PARAMETRIZE { move = MOVE_FLASH_CANNON; ability = ABILITY_STEELWORKER; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_STEEL); - ASSUME(gMovesInfo[MOVE_ANCHOR_SHOT].type == TYPE_STEEL); - ASSUME(gMovesInfo[MOVE_FLASH_CANNON].type == TYPE_STEEL); - ASSUME(gMovesInfo[MOVE_ANCHOR_SHOT].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_FLASH_CANNON].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_STEEL); + ASSUME(GetMoveType(MOVE_ANCHOR_SHOT) == TYPE_STEEL); + ASSUME(GetMoveType(MOVE_FLASH_CANNON) == TYPE_STEEL); + ASSUME(GetMoveCategory(MOVE_ANCHOR_SHOT) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_FLASH_CANNON) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_DHELMISE) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/stench.c b/test/battle/ability/stench.c index 76b36f3ff3..f1484de6c9 100644 --- a/test/battle/ability/stench.c +++ b/test/battle/ability/stench.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Stench has a 10% chance to flinch") { PASSES_RANDOMLY(1, 10, RNG_STENCH); GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); PLAYER(SPECIES_GRIMER) { Ability(ABILITY_STENCH); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Stench does not stack with King's Rock") PASSES_RANDOMLY(1, 10, RNG_STENCH); GIVEN { ASSUME(gItemsInfo[ITEM_KINGS_ROCK].holdEffect == HOLD_EFFECT_FLINCH); - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); PLAYER(SPECIES_GRIMER) { Ability(ABILITY_STENCH); Item(ITEM_KINGS_ROCK); } OPPONENT(SPECIES_WOBBUFFET); @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Stench does not stack with King's Rock") DOUBLE_BATTLE_TEST("Stench only triggers if target takes damage") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); ASSUME(MoveHasAdditionalEffectWithChance(MOVE_FAKE_OUT, MOVE_EFFECT_FLINCH, 100)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); @@ -58,7 +58,7 @@ DOUBLE_BATTLE_TEST("Stench only triggers if target takes damage") DOUBLE_BATTLE_TEST("Stench doesn't trigger if partner uses a move") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); ASSUME(MoveHasAdditionalEffectWithChance(MOVE_FAKE_OUT, MOVE_EFFECT_FLINCH, 100)); PLAYER(SPECIES_WOBBUFFET) { Speed(20); } PLAYER(SPECIES_WYNAUT) { Speed(10); } diff --git a/test/battle/ability/storm_drain.c b/test/battle/ability/storm_drain.c index b4d5a2c169..962317b108 100644 --- a/test/battle/ability/storm_drain.c +++ b/test/battle/ability/storm_drain.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Storm Drain absorbs Water-type moves and increases the Sp. Attack [Gen5+]") { GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GASTRODON_EAST) { Ability(ABILITY_STORM_DRAIN); } } WHEN { @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Storm Drain absorbs Water-type moves and increases the Sp. A DOUBLE_BATTLE_TEST("Storm Drain forces single-target Water-type moves to target the Pokémon with this Ability.") { GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GASTRODON_EAST) { Ability(ABILITY_STORM_DRAIN); } diff --git a/test/battle/ability/sturdy.c b/test/battle/ability/sturdy.c index b79fd5e921..5ba7e16ea8 100644 --- a/test/battle/ability/sturdy.c +++ b/test/battle/ability/sturdy.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Sturdy prevents OHKO moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_FISSURE].effect == EFFECT_OHKO); + ASSUME(GetMoveEffect(MOVE_FISSURE) == EFFECT_OHKO); PLAYER(SPECIES_GEODUDE) { Ability(ABILITY_STURDY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/supreme_overlord.c b/test/battle/ability/supreme_overlord.c index f8868b4afb..eec81e89ed 100644 --- a/test/battle/ability/supreme_overlord.c +++ b/test/battle/ability/supreme_overlord.c @@ -95,7 +95,7 @@ SINGLE_BATTLE_TEST("Supreme Overlord does not boost attack if party members are SINGLE_BATTLE_TEST("Supreme Overlord's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET) { HP(1);} PLAYER(SPECIES_KINGAMBIT) { Ability(ABILITY_SUPREME_OVERLORD); } OPPONENT(SPECIES_WOBBUFFET); @@ -116,7 +116,7 @@ SINGLE_BATTLE_TEST("Supreme Overlord's message displays correctly after all batt SINGLE_BATTLE_TEST("Supreme Overlord's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { HP(1);} diff --git a/test/battle/ability/swarm.c b/test/battle/ability/swarm.c index c3da16f6b6..a70c1ffb55 100644 --- a/test/battle/ability/swarm.c +++ b/test/battle/ability/swarm.c @@ -7,9 +7,9 @@ SINGLE_BATTLE_TEST("Swarm boosts Bug-type moves in a pinch", s16 damage) PARAMETRIZE { hp = 99; } PARAMETRIZE { hp = 33; } GIVEN { - ASSUME(gMovesInfo[MOVE_BUG_BITE].type == TYPE_BUG); - ASSUME(gMovesInfo[MOVE_BUG_BITE].power == 60); - ASSUME(gMovesInfo[MOVE_BUG_BITE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveType(MOVE_BUG_BITE) == TYPE_BUG); + ASSUME(GetMovePower(MOVE_BUG_BITE) == 60); + ASSUME(GetMoveCategory(MOVE_BUG_BITE) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(gSpeciesInfo[SPECIES_LEDYBA].types[0] == TYPE_BUG); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); diff --git a/test/battle/ability/sword_of_ruin.c b/test/battle/ability/sword_of_ruin.c index 3498522423..9501322ab7 100644 --- a/test/battle/ability/sword_of_ruin.c +++ b/test/battle/ability/sword_of_ruin.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_ROLE_PLAY].effect == EFFECT_ROLE_PLAY); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveEffect(MOVE_ROLE_PLAY) == EFFECT_ROLE_PLAY); } SINGLE_BATTLE_TEST("Sword of Ruin reduces Defense if opposing mon's ability doesn't match") @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Sword of Ruin reduces Defense if opposing mon's ability does SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET) { HP(1);} PLAYER(SPECIES_CHIEN_PAO); OPPONENT(SPECIES_WOBBUFFET); @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battler SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { HP(1);} diff --git a/test/battle/ability/tablets_of_ruin.c b/test/battle/ability/tablets_of_ruin.c index c98384b805..976f929bbe 100644 --- a/test/battle/ability/tablets_of_ruin.c +++ b/test/battle/ability/tablets_of_ruin.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_ENTRAINMENT].effect == EFFECT_ENTRAINMENT); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveEffect(MOVE_ENTRAINMENT) == EFFECT_ENTRAINMENT); } SINGLE_BATTLE_TEST("Tablets of Ruin reduces Attack if opposing mon's ability doesn't match") @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Tablets of Ruin reduces Attack if opposing mon's ability doe SINGLE_BATTLE_TEST("Tablets of Ruin's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET) { HP(1);} PLAYER(SPECIES_WO_CHIEN); OPPONENT(SPECIES_WOBBUFFET); @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Tablets of Ruin's message displays correctly after all battl SINGLE_BATTLE_TEST("Tablets of Ruin's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { HP(1);} diff --git a/test/battle/ability/tangling_hair.c b/test/battle/ability/tangling_hair.c index f663465163..45f6282fb8 100644 --- a/test/battle/ability/tangling_hair.c +++ b/test/battle/ability/tangling_hair.c @@ -3,9 +3,9 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].effect == EFFECT_HIT); - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact == TRUE); + ASSUME(GetMoveEffect(MOVE_TACKLE) == EFFECT_HIT); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); + ASSUME(MoveMakesContact(MOVE_TACKLE) == TRUE); } @@ -17,7 +17,7 @@ SINGLE_BATTLE_TEST("Tangling Hair drops opposing mon's speed if ability user got PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { - ASSUME(gMovesInfo[MOVE_SWIFT].makesContact == FALSE); + ASSUME(MoveMakesContact(MOVE_SWIFT) == FALSE); PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); } OPPONENT(SPECIES_WYNAUT); } WHEN { diff --git a/test/battle/ability/tera_shell.c b/test/battle/ability/tera_shell.c index 08a9ad1cd8..63dda3207a 100644 --- a/test/battle/ability/tera_shell.c +++ b/test/battle/ability/tera_shell.c @@ -92,8 +92,23 @@ DOUBLE_BATTLE_TEST("Tera Shell only makes the first hit against Terapagos from a MESSAGE("Terapagos made its shell gleam! It's distorting type matchups!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_BLIZZARD, opponentLeft); HP_BAR(playerLeft); - MESSAGE("It's not very effective…"); HP_BAR(playerRight); + MESSAGE("It's not very effective…"); NOT MESSAGE("It's not very effective…"); } } + +SINGLE_BATTLE_TEST("Tera Shell respects immunity") +{ + GIVEN { + PLAYER(SPECIES_TERAPAGOS_TERASTAL) { Ability(ABILITY_TERA_SHELL); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SHADOW_BALL); } + } SCENE { + NONE_OF { + ABILITY_POPUP(player, ABILITY_TERA_SHELL); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHADOW_BALL, opponent); + } + } +} diff --git a/test/battle/ability/teraform_zero.c b/test/battle/ability/teraform_zero.c index 819d0eef3d..09ce921931 100644 --- a/test/battle/ability/teraform_zero.c +++ b/test/battle/ability/teraform_zero.c @@ -39,8 +39,8 @@ DOUBLE_BATTLE_TEST("Teraform Zero can be supressed") SINGLE_BATTLE_TEST("Teraform Zero can be replaced") { GIVEN { - ASSUME(gMovesInfo[MOVE_WORRY_SEED].effect == EFFECT_WORRY_SEED); - ASSUME(gMovesInfo[MOVE_REST].effect == EFFECT_REST); + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_WORRY_SEED); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_TERAPAGOS); OPPONENT(SPECIES_WHIMSICOTT) { Ability(ABILITY_PRANKSTER); } } WHEN { @@ -57,7 +57,7 @@ SINGLE_BATTLE_TEST("Teraform Zero can be replaced") SINGLE_BATTLE_TEST("Teraform Zero cannot be swapped") { GIVEN { - ASSUME(gMovesInfo[MOVE_SKILL_SWAP].effect == EFFECT_SKILL_SWAP); + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); PLAYER(SPECIES_TERAPAGOS); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -71,7 +71,7 @@ SINGLE_BATTLE_TEST("Teraform Zero cannot be swapped") SINGLE_BATTLE_TEST("Teraform Zero cannot be copied") { GIVEN { - ASSUME(gMovesInfo[MOVE_ROLE_PLAY].effect == EFFECT_ROLE_PLAY); + ASSUME(GetMoveEffect(MOVE_ROLE_PLAY) == EFFECT_ROLE_PLAY); PLAYER(SPECIES_TERAPAGOS); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/torrent.c b/test/battle/ability/torrent.c index df27d8e996..f0da964b93 100644 --- a/test/battle/ability/torrent.c +++ b/test/battle/ability/torrent.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Torrent boosts Water-type moves in a pinch", s16 damage) PARAMETRIZE { hp = 99; } PARAMETRIZE { hp = 33; } GIVEN { - ASSUME(gMovesInfo[MOVE_BUBBLE].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_BUBBLE) == TYPE_WATER); PLAYER(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); MaxHP(99); HP(hp); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/toxic_chain.c b/test/battle/ability/toxic_chain.c index 0037cb85b6..97c3fdf4f9 100644 --- a/test/battle/ability/toxic_chain.c +++ b/test/battle/ability/toxic_chain.c @@ -5,8 +5,8 @@ SINGLE_BATTLE_TEST("Toxic Chain inflicts bad poison when attacking") { PASSES_RANDOMLY(3, 10, RNG_TOXIC_CHAIN); GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMoveCategory(MOVE_TACKLE) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); PLAYER(SPECIES_OKIDOGI) { Ability(ABILITY_TOXIC_CHAIN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -24,9 +24,9 @@ SINGLE_BATTLE_TEST("Toxic Chain inflicts bad poison when attacking") SINGLE_BATTLE_TEST("Toxic Chain inflicts bad poison on any hit of a multi-hit move") { GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_SLAP].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_DOUBLE_SLAP].effect == EFFECT_MULTI_HIT); - ASSUME(gMovesInfo[MOVE_DOUBLE_SLAP].power > 0); + ASSUME(GetMoveCategory(MOVE_DOUBLE_SLAP) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT); + ASSUME(GetMovePower(MOVE_DOUBLE_SLAP) > 0); ASSUME(gItemsInfo[ITEM_PECHA_BERRY].holdEffect == HOLD_EFFECT_CURE_PSN); PLAYER(SPECIES_OKIDOGI) { Ability(ABILITY_TOXIC_CHAIN); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_PECHA_BERRY); } @@ -51,9 +51,9 @@ SINGLE_BATTLE_TEST("Toxic Chain inflicts bad poison on any hit of a multi-hit mo DOUBLE_BATTLE_TEST("Toxic Chain can inflict bad poison on both foes") { GIVEN { - ASSUME(gMovesInfo[MOVE_RAZOR_LEAF].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_RAZOR_LEAF].target == MOVE_TARGET_BOTH); - ASSUME(gMovesInfo[MOVE_RAZOR_LEAF].power > 0); + ASSUME(GetMoveCategory(MOVE_RAZOR_LEAF) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveTarget(MOVE_RAZOR_LEAF) == MOVE_TARGET_BOTH); + ASSUME(GetMovePower(MOVE_RAZOR_LEAF) > 0); PLAYER(SPECIES_OKIDOGI) { Ability(ABILITY_TOXIC_CHAIN); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -62,11 +62,11 @@ DOUBLE_BATTLE_TEST("Toxic Chain can inflict bad poison on both foes") TURN { MOVE(playerLeft, MOVE_RAZOR_LEAF, WITH_RNG(RNG_TOXIC_CHAIN, TRUE)); } } SCENE { HP_BAR(opponentLeft); + HP_BAR(opponentRight); ABILITY_POPUP(playerLeft, ABILITY_TOXIC_CHAIN); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponentLeft); MESSAGE("The opposing Wobbuffet was badly poisoned!"); STATUS_ICON(opponentLeft, badPoison: TRUE); - HP_BAR(opponentRight); ABILITY_POPUP(playerLeft, ABILITY_TOXIC_CHAIN); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponentRight); MESSAGE("The opposing Wynaut was badly poisoned!"); @@ -85,9 +85,9 @@ SINGLE_BATTLE_TEST("Toxic Chain makes Lum/Pecha Berry trigger before being knock PARAMETRIZE { item = ITEM_LUM_BERRY; } GIVEN { - ASSUME(gMovesInfo[MOVE_KNOCK_OFF].category != DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_KNOCK_OFF].effect == EFFECT_KNOCK_OFF); - ASSUME(gMovesInfo[MOVE_KNOCK_OFF].power > 0); + ASSUME(GetMoveCategory(MOVE_KNOCK_OFF) != DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); + ASSUME(GetMovePower(MOVE_KNOCK_OFF) > 0); ASSUME(gItemsInfo[ITEM_PECHA_BERRY].holdEffect == HOLD_EFFECT_CURE_PSN); ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS); PLAYER(SPECIES_OKIDOGI) { Ability(ABILITY_TOXIC_CHAIN); } diff --git a/test/battle/ability/toxic_debris.c b/test/battle/ability/toxic_debris.c index c4a50a5d13..b3b9dbbb2e 100644 --- a/test/battle/ability/toxic_debris.c +++ b/test/battle/ability/toxic_debris.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); } SINGLE_BATTLE_TEST("Toxic Debris sets Toxic Spikes on the opposing side if hit by a physical attack") diff --git a/test/battle/ability/transistor.c b/test/battle/ability/transistor.c index f02743ab8c..eb3c015af7 100644 --- a/test/battle/ability/transistor.c +++ b/test/battle/ability/transistor.c @@ -4,7 +4,7 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Transistor increases Electric-type move damage", s16 damage) +SINGLE_BATTLE_TEST("Transistor increases Electric-type attack / special attack", s16 damage) { u32 move; u16 ability; @@ -17,11 +17,11 @@ SINGLE_BATTLE_TEST("Transistor increases Electric-type move damage", s16 damage) PARAMETRIZE { move = MOVE_THUNDER_SHOCK; ability = ABILITY_TRANSISTOR; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ELECTRIC); - ASSUME(gMovesInfo[MOVE_WILD_CHARGE].type == TYPE_ELECTRIC); - ASSUME(gMovesInfo[MOVE_THUNDER_SHOCK].type == TYPE_ELECTRIC); - ASSUME(gMovesInfo[MOVE_WILD_CHARGE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_THUNDER_SHOCK].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_WILD_CHARGE) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); + ASSUME(GetMoveCategory(MOVE_WILD_CHARGE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_THUNDER_SHOCK) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_REGIELEKI) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -30,27 +30,20 @@ SINGLE_BATTLE_TEST("Transistor increases Electric-type move damage", s16 damage) HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { EXPECT_EQ(results[0].damage, results[1].damage); // Tackle should be unaffected - if (B_TRANSISTOR_BOOST >= GEN_9) - { - EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.3), results[3].damage); // Wild Charge should be affected - EXPECT_MUL_EQ(results[4].damage, Q_4_12(1.3), results[5].damage); // Thunder Shock should be affected - } - else - { - EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[3].damage); // Wild Charge should be affected - EXPECT_MUL_EQ(results[4].damage, Q_4_12(1.5), results[5].damage); // Thunder Shock should be affected - } + + EXPECT_LT(results[2].damage, results[3].damage); // cannot test exact factor because ATK / SPATK introduces inaccuracies + EXPECT_LT(results[4].damage, results[5].damage); } } -SINGLE_BATTLE_TEST("Transistor boosts Electric type moves by 1.5 in Gen8 and 1.3 in Gen9+", s16 damage) +SINGLE_BATTLE_TEST("Transistor is blocked by neutralizing gas", s16 damage) { u16 ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDER_SHOCK].type == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); PLAYER(SPECIES_REGIELEKI) { Ability(ABILITY_TRANSISTOR); } OPPONENT(SPECIES_KOFFING) { Ability(ability); } } WHEN { @@ -58,9 +51,6 @@ SINGLE_BATTLE_TEST("Transistor boosts Electric type moves by 1.5 in Gen8 and 1.3 } SCENE { HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { - if (B_TRANSISTOR_BOOST >= GEN_9) - EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.3), results[1].damage); - else - EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + EXPECT_LT(results[0].damage, results[1].damage); // cannot test exact factor because ATK / SPATK introduces inaccuracies } } diff --git a/test/battle/ability/unnerve.c b/test/battle/ability/unnerve.c index ce35cf72c1..4547854231 100644 --- a/test/battle/ability/unnerve.c +++ b/test/battle/ability/unnerve.c @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Unnerve doesn't prevent opposing Pokémon from using Natural PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { - ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); + ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); PLAYER(mon) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ORAN_BERRY); } } WHEN { diff --git a/test/battle/ability/vessel_of_ruin.c b/test/battle/ability/vessel_of_ruin.c index 6531cbbf3a..4d159c0b0e 100644 --- a/test/battle/ability/vessel_of_ruin.c +++ b/test/battle/ability/vessel_of_ruin.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_WATER_GUN].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_ENTRAINMENT].effect == EFFECT_ENTRAINMENT); + ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveEffect(MOVE_ENTRAINMENT) == EFFECT_ENTRAINMENT); } SINGLE_BATTLE_TEST("Vessel of Ruin reduces Sp. Atk if opposing mon's ability doesn't match") @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Vessel of Ruin reduces Sp. Atk if opposing mon's ability doe SINGLE_BATTLE_TEST("Vessel of Ruin's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET) { HP(1);} PLAYER(SPECIES_TING_LU); OPPONENT(SPECIES_WOBBUFFET); @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Vessel of Ruin's message displays correctly after all battle SINGLE_BATTLE_TEST("Vessel of Ruin's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { HP(1);} diff --git a/test/battle/ability/volt_absorb.c b/test/battle/ability/volt_absorb.c index 93498bd1c7..5d88cb95e4 100644 --- a/test/battle/ability/volt_absorb.c +++ b/test/battle/ability/volt_absorb.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Volt Absorb heals 25% when hit by electric type moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDER_SHOCK].type == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Volt Absorb heals 25% when hit by electric type moves") SINGLE_BATTLE_TEST("Volt Absorb does not activate if protected") { GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDER_SHOCK].type == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -32,8 +32,8 @@ SINGLE_BATTLE_TEST("Volt Absorb does not activate if protected") SINGLE_BATTLE_TEST("Volt Absorb activates on status moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDER_WAVE].type == TYPE_ELECTRIC); - ASSUME(gMovesInfo[MOVE_THUNDER_WAVE].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveType(MOVE_THUNDER_WAVE) == TYPE_ELECTRIC); + ASSUME(GetMoveCategory(MOVE_THUNDER_WAVE) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -48,8 +48,8 @@ SINGLE_BATTLE_TEST("Volt Absorb activates on status moves") SINGLE_BATTLE_TEST("Volt Absorb is only triggered once on multi strike moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_FURY_SWIPES].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_FURY_SWIPES].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveType(MOVE_FURY_SWIPES) == TYPE_NORMAL); + ASSUME(GetMoveEffect(MOVE_FURY_SWIPES) == EFFECT_MULTI_HIT); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); } OPPONENT(SPECIES_GRAVELER_ALOLA) { Ability(ABILITY_GALVANIZE); } } WHEN { @@ -65,8 +65,8 @@ DOUBLE_BATTLE_TEST("Volt Absorb does not stop Electric Typed Explosion from dama { s16 damage1, damage2; GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); - ASSUME(gMovesInfo[MOVE_EXPLOSION].type == TYPE_NORMAL); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(GetMoveType(MOVE_EXPLOSION) == TYPE_NORMAL); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); } PLAYER(SPECIES_ABRA); OPPONENT(SPECIES_GRAVELER_ALOLA) { Ability(ABILITY_GALVANIZE); } @@ -88,7 +88,7 @@ DOUBLE_BATTLE_TEST("Volt Absorb does not stop Electric Typed Explosion from dama SINGLE_BATTLE_TEST("Volt Absorb prevents Cell Battery from activating") { GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDER_SHOCK].type == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); Item(ITEM_CELL_BATTERY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/water_absorb.c b/test/battle/ability/water_absorb.c index 842a448bab..1c0406ebdc 100644 --- a/test/battle/ability/water_absorb.c +++ b/test/battle/ability/water_absorb.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Water Absorb heals 25% when hit by water type moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_BUBBLE].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_BUBBLE) == TYPE_WATER); PLAYER(SPECIES_POLIWAG) { Ability(ABILITY_WATER_ABSORB); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Water Absorb heals 25% when hit by water type moves") SINGLE_BATTLE_TEST("Water Absorb does not activate if protected") { GIVEN { - ASSUME(gMovesInfo[MOVE_BUBBLE].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_BUBBLE) == TYPE_WATER); PLAYER(SPECIES_POLIWAG) { Ability(ABILITY_WATER_ABSORB); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -32,8 +32,8 @@ SINGLE_BATTLE_TEST("Water Absorb does not activate if protected") SINGLE_BATTLE_TEST("Water Absorb activates on status moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_SOAK].type == TYPE_WATER); - ASSUME(gMovesInfo[MOVE_SOAK].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveType(MOVE_SOAK) == TYPE_WATER); + ASSUME(GetMoveCategory(MOVE_SOAK) == DAMAGE_CATEGORY_STATUS); PLAYER(SPECIES_POLIWAG) { Ability(ABILITY_WATER_ABSORB); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -48,8 +48,8 @@ SINGLE_BATTLE_TEST("Water Absorb activates on status moves") SINGLE_BATTLE_TEST("Water Absorb is only triggered once on multi strike moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_SHURIKEN].type == TYPE_WATER); - ASSUME(gMovesInfo[MOVE_WATER_SHURIKEN].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveType(MOVE_WATER_SHURIKEN) == TYPE_WATER); + ASSUME(GetMoveEffect(MOVE_WATER_SHURIKEN) == EFFECT_MULTI_HIT); PLAYER(SPECIES_POLIWAG) { Ability(ABILITY_WATER_ABSORB); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -67,7 +67,7 @@ SINGLE_BATTLE_TEST("Water Absorb prevents Absorb Bulb and Luminous Moss from act PARAMETRIZE { item = ITEM_ABSORB_BULB; } PARAMETRIZE { item = ITEM_LUMINOUS_MOSS; } GIVEN { - ASSUME(gMovesInfo[MOVE_BUBBLE].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_BUBBLE) == TYPE_WATER); PLAYER(SPECIES_POLIWAG) { Ability(ABILITY_WATER_ABSORB); HP(1); MaxHP(100); Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/water_compaction.c b/test/battle/ability/water_compaction.c index 51297f5a8a..e4e32e2713 100644 --- a/test/battle/ability/water_compaction.c +++ b/test/battle/ability/water_compaction.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages when hit by a water type move") { GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_SANDYGAST) { Ability(ABILITY_WATER_COMPACTION); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -20,8 +20,8 @@ SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages when hit by a water SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages on each hit of a multi-hit Water type move") { GIVEN { - ASSUME(gMovesInfo[MOVE_SURGING_STRIKES].type == TYPE_WATER); - ASSUME(gMovesInfo[MOVE_SURGING_STRIKES].strikeCount == 3); + ASSUME(GetMoveType(MOVE_SURGING_STRIKES) == TYPE_WATER); + ASSUME(GetMoveStrikeCount(MOVE_SURGING_STRIKES) == 3); PLAYER(SPECIES_SANDYGAST) { Ability(ABILITY_WATER_COMPACTION); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Water Compaction does not affect damage taken from Water typ PARAMETRIZE { ability = ABILITY_SAND_VEIL; } PARAMETRIZE { ability = ABILITY_WATER_COMPACTION; } GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_SANDYGAST) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/weak_armor.c b/test/battle/ability/weak_armor.c index 0d264e7ff9..12e9ef3bcc 100644 --- a/test/battle/ability/weak_armor.c +++ b/test/battle/ability/weak_armor.c @@ -3,10 +3,10 @@ ASSUMPTIONS { - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); - ASSUME(!IS_MOVE_STATUS(MOVE_GUST)); - ASSUME(gMovesInfo[MOVE_GUST].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_GUST)); + ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(B_WEAK_ARMOR_SPEED >= GEN_7); } @@ -50,8 +50,8 @@ SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 2 when hi SINGLE_BATTLE_TEST("Weak Armor does not trigger when brought in by Dragon Tail and taking Stealth Rock damage") { GIVEN { - ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].effect == EFFECT_STEALTH_ROCK); - ASSUME(gMovesInfo[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET); + ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK); + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/wind_power.c b/test/battle/ability/wind_power.c index a62fa9c47a..fd4a4b95f5 100644 --- a/test/battle/ability/wind_power.c +++ b/test/battle/ability/wind_power.c @@ -3,16 +3,16 @@ ASSUMPTIONS { - ASSUME(!IS_MOVE_STATUS(MOVE_THUNDERBOLT)); - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); - ASSUME(!IS_MOVE_STATUS(MOVE_AIR_CUTTER)); - ASSUME(gMovesInfo[MOVE_AIR_CUTTER].target == MOVE_TARGET_BOTH); - ASSUME(gMovesInfo[MOVE_AIR_CUTTER].windMove == TRUE); - ASSUME(!IS_MOVE_STATUS(MOVE_PETAL_BLIZZARD)); - ASSUME(gMovesInfo[MOVE_PETAL_BLIZZARD].target == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(gMovesInfo[MOVE_PETAL_BLIZZARD].windMove == TRUE); - ASSUME(gMovesInfo[MOVE_TACKLE].windMove == FALSE); + ASSUME(!IsBattleMoveStatus(MOVE_THUNDERBOLT)); + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_AIR_CUTTER)); + ASSUME(GetMoveTarget(MOVE_AIR_CUTTER) == MOVE_TARGET_BOTH); + ASSUME(IsWindMove(MOVE_AIR_CUTTER)); + ASSUME(!IsBattleMoveStatus(MOVE_PETAL_BLIZZARD)); + ASSUME(GetMoveTarget(MOVE_PETAL_BLIZZARD) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(IsWindMove(MOVE_PETAL_BLIZZARD)); + ASSUME(!IsWindMove(MOVE_TACKLE)); } SINGLE_BATTLE_TEST("Wind Power sets up Charge for player when hit by a wind move") @@ -165,17 +165,17 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_BLIZZARD, opponentLeft); HP_BAR(playerLeft); + HP_BAR(playerRight); + HP_BAR(opponentRight); + NOT HP_BAR(opponentLeft); if (abilityLeft == ABILITY_WIND_POWER) { ABILITY_POPUP(playerLeft, ABILITY_WIND_POWER); MESSAGE("Being hit by Petal Blizzard charged Wattrel with power!"); } - HP_BAR(playerRight); if (abilityRight == ABILITY_WIND_POWER) { ABILITY_POPUP(playerRight, ABILITY_WIND_POWER); MESSAGE("Being hit by Petal Blizzard charged Wattrel with power!"); } - HP_BAR(opponentRight); - NOT HP_BAR(opponentLeft); } THEN { EXPECT_NE(playerLeft->hp, playerLeft->maxHP); @@ -193,7 +193,7 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly when Tailwind is used") PARAMETRIZE {opponentSide = FALSE;} GIVEN { - ASSUME(gMovesInfo[MOVE_TAILWIND].effect == EFFECT_TAILWIND); + ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); PLAYER(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(10); } PLAYER(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(5); } OPPONENT(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(20); } diff --git a/test/battle/ability/wind_rider.c b/test/battle/ability/wind_rider.c index 44baacc8a2..d68414d060 100644 --- a/test/battle/ability/wind_rider.c +++ b/test/battle/ability/wind_rider.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TAILWIND].effect == EFFECT_TAILWIND); - ASSUME(gMovesInfo[MOVE_TAILWIND].windMove == TRUE); + ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); + ASSUME(IsWindMove(MOVE_TAILWIND)); } SINGLE_BATTLE_TEST("Wind Rider raises Attack by one stage if it sets up Tailwind") @@ -108,7 +108,7 @@ SINGLE_BATTLE_TEST("Wind Rider activates when it's no longer effected by Neutral SINGLE_BATTLE_TEST("Wind Rider absorbs Wind moves and raises Attack by one stage") { GIVEN { - ASSUME(gMovesInfo[MOVE_GUST].windMove == TRUE); + ASSUME(IsWindMove(MOVE_GUST)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRAMBLIN) { Ability(ABILITY_WIND_RIDER); } } WHEN { diff --git a/test/battle/ability/zero_to_hero.c b/test/battle/ability/zero_to_hero.c index 733104f153..195bb44289 100644 --- a/test/battle/ability/zero_to_hero.c +++ b/test/battle/ability/zero_to_hero.c @@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Zero to Hero transforms both player and opponent") SINGLE_BATTLE_TEST("Zero to Hero will activate if a switch move is used") { GIVEN { - ASSUME(gMovesInfo[MOVE_FLIP_TURN].effect == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_FLIP_TURN) == EFFECT_HIT_ESCAPE); PLAYER(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -83,9 +83,9 @@ SINGLE_BATTLE_TEST("Gastro Acid, Worry Seed, and Simple Beam fail if the target PARAMETRIZE { move = MOVE_SIMPLE_BEAM; } GIVEN { - ASSUME(gMovesInfo[MOVE_GASTRO_ACID].effect == EFFECT_GASTRO_ACID); - ASSUME(gMovesInfo[MOVE_WORRY_SEED].effect == EFFECT_WORRY_SEED); - ASSUME(gMovesInfo[MOVE_SIMPLE_BEAM].effect == EFFECT_SIMPLE_BEAM); + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_WORRY_SEED); + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_SIMPLE_BEAM); PLAYER(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -139,7 +139,7 @@ SINGLE_BATTLE_TEST("Imposter doesn't apply the heroic transformation message whe SINGLE_BATTLE_TEST("Zero to Hero's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_PALAFIN_ZERO); PLAYER(SPECIES_WOBBUFFET) { HP(1);} OPPONENT(SPECIES_WOBBUFFET); @@ -162,7 +162,7 @@ SINGLE_BATTLE_TEST("Zero to Hero's message displays correctly after all battlers SINGLE_BATTLE_TEST("Zero to Hero's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PALAFIN_ZERO); diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 5f01c761a6..da77f828e4 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -80,25 +80,25 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves with better accuracy, but only if they b AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(hp); } PLAYER(SPECIES_WOBBUFFET); - ASSUME(gMovesInfo[MOVE_SWIFT].accuracy == 0); - ASSUME(gMovesInfo[MOVE_SLAM].power == gMovesInfo[MOVE_STRENGTH].power); - ASSUME(gMovesInfo[MOVE_MEGA_KICK].power > gMovesInfo[MOVE_STRENGTH].power); - ASSUME(gMovesInfo[MOVE_SLAM].accuracy < gMovesInfo[MOVE_STRENGTH].accuracy); - ASSUME(gMovesInfo[MOVE_MEGA_KICK].accuracy < gMovesInfo[MOVE_STRENGTH].accuracy); - ASSUME(gMovesInfo[MOVE_TACKLE].accuracy == 100); - ASSUME(gMovesInfo[MOVE_GUST].accuracy == 100); - ASSUME(gMovesInfo[MOVE_SHOCK_WAVE].accuracy == 0); - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].accuracy == 100); - ASSUME(gMovesInfo[MOVE_ICY_WIND].accuracy != 100); - ASSUME(gMovesInfo[MOVE_SLAM].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_STRENGTH].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_MEGA_KICK].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_SHOCK_WAVE].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_ICY_WIND].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_GUST].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveAccuracy(MOVE_SWIFT) == 0); + ASSUME(GetMovePower(MOVE_SLAM) == GetMovePower(MOVE_STRENGTH)); + ASSUME(GetMovePower(MOVE_MEGA_KICK) > GetMovePower(MOVE_STRENGTH)); + ASSUME(GetMoveAccuracy(MOVE_SLAM) < GetMoveAccuracy(MOVE_STRENGTH)); + ASSUME(GetMoveAccuracy(MOVE_MEGA_KICK) < GetMoveAccuracy(MOVE_STRENGTH)); + ASSUME(GetMoveAccuracy(MOVE_TACKLE) == 100); + ASSUME(GetMoveAccuracy(MOVE_GUST) == 100); + ASSUME(GetMoveAccuracy(MOVE_SHOCK_WAVE) == 0); + ASSUME(GetMoveAccuracy(MOVE_THUNDERBOLT) == 100); + ASSUME(GetMoveAccuracy(MOVE_ICY_WIND) != 100); + ASSUME(GetMoveCategory(MOVE_SLAM) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_STRENGTH) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_MEGA_KICK) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_SHOCK_WAVE) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_ICY_WIND) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_THUNDERBOLT) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); OPPONENT(SPECIES_EXPLOUD) { Moves(move1, move2, move3, move4); Ability(abilityAtk); SpAttack(50); } // Low Sp.Atk, so Swift deals less damage than Strength. } WHEN { switch (turns) @@ -146,10 +146,10 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves which deal more damage instead of moves PARAMETRIZE { move1 = MOVE_POISON_JAB; move2 = MOVE_WATER_GUN; expectedMove = MOVE_POISON_JAB; abilityDef = ABILITY_IMMUNITY; turns = 3; } GIVEN { - ASSUME(gMovesInfo[MOVE_WATERFALL].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_SCALD].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_POISON_JAB].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_WATER_GUN].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_WATERFALL) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_SCALD) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_POISON_JAB) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_TYPHLOSION) { Ability(abilityDef); } PLAYER(SPECIES_WOBBUFFET); @@ -176,8 +176,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers Earthquake over Drill Run if both require the { // Drill Run has less accuracy than E-quake, but can score a higher crit. However the chance is too small, so AI should ignore it. GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].category == DAMAGE_CATEGORY_PHYSICAL); // Added because Geodude has to KO Typhlosion - ASSUME(gMovesInfo[MOVE_DRILL_RUN].category == DAMAGE_CATEGORY_PHYSICAL); // Added because Geodude has to KO Typhlosion + ASSUME(GetMoveCategory(MOVE_EARTHQUAKE) == DAMAGE_CATEGORY_PHYSICAL); // Added because Geodude has to KO Typhlosion + ASSUME(GetMoveCategory(MOVE_DRILL_RUN) == DAMAGE_CATEGORY_PHYSICAL); // Added because Geodude has to KO Typhlosion AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_TYPHLOSION); PLAYER(SPECIES_WOBBUFFET); @@ -202,8 +202,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers a weaker move over a one with a downside effec PARAMETRIZE { move1 = MOVE_OVERHEAT; move2 = MOVE_FLAMETHROWER; hp = 250; expectedMove = MOVE_OVERHEAT; turns = 1; } GIVEN { - ASSUME(gMovesInfo[MOVE_FLAMETHROWER].category == DAMAGE_CATEGORY_SPECIAL); // Added because Typhlosion has to KO Wobbuffet - ASSUME(gMovesInfo[MOVE_OVERHEAT].category == DAMAGE_CATEGORY_SPECIAL); // Added because Typhlosion has to KO Wobbuffet + ASSUME(GetMoveCategory(MOVE_FLAMETHROWER) == DAMAGE_CATEGORY_SPECIAL); // Added because Typhlosion has to KO Wobbuffet + ASSUME(GetMoveCategory(MOVE_OVERHEAT) == DAMAGE_CATEGORY_SPECIAL); // Added because Typhlosion has to KO Wobbuffet AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(hp); } PLAYER(SPECIES_WOBBUFFET); @@ -242,8 +242,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves with the best possible score, chosen ran AI_SINGLE_BATTLE_TEST("AI can choose a status move that boosts the attack by two") { GIVEN { - ASSUME(gMovesInfo[MOVE_STRENGTH].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_HORN_ATTACK].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_STRENGTH) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_HORN_ATTACK) == DAMAGE_CATEGORY_PHYSICAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(277); }; PLAYER(SPECIES_WOBBUFFET); @@ -330,8 +330,8 @@ AI_SINGLE_BATTLE_TEST("AI won't use Solar Beam if there is no Sun up or the user PARAMETRIZE { } GIVEN { - ASSUME(gMovesInfo[MOVE_SOLAR_BEAM].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_GRASS_PLEDGE].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_SOLAR_BEAM) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_GRASS_PLEDGE) == DAMAGE_CATEGORY_SPECIAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(211); } PLAYER(SPECIES_WOBBUFFET); @@ -355,7 +355,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use Solar Beam if there is no Sun up or the user AI_SINGLE_BATTLE_TEST("AI won't use ground type attacks against flying type Pokemon unless Gravity is in effect") { GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].category == DAMAGE_CATEGORY_PHYSICAL); // Otherwise, it doesn't KO Crobat + ASSUME(GetMoveCategory(MOVE_EARTHQUAKE) == DAMAGE_CATEGORY_PHYSICAL); // Otherwise, it doesn't KO Crobat AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_CROBAT); PLAYER(SPECIES_WOBBUFFET); @@ -430,7 +430,7 @@ AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose He for (j = MOVE_NONE + 1; j < MOVES_COUNT; j++) { - if (gMovesInfo[j].category == DAMAGE_CATEGORY_STATUS) { + if (GetMoveCategory(j) == DAMAGE_CATEGORY_STATUS) { PARAMETRIZE { statusMove = j; } } } @@ -509,9 +509,9 @@ AI_SINGLE_BATTLE_TEST("AI will choose either Rock Tomb or Bulldoze if Stat drop AI_SINGLE_BATTLE_TEST("First Impression is preferred on the first turn of the species if it's the best dmg move") { GIVEN { - ASSUME(gMovesInfo[MOVE_FIRST_IMPRESSION].effect == EFFECT_FIRST_TURN_ONLY); - ASSUME(gMovesInfo[MOVE_FIRST_IMPRESSION].power == 90); - ASSUME(gMovesInfo[MOVE_LUNGE].power == 80); + ASSUME(GetMoveEffect(MOVE_FIRST_IMPRESSION) == EFFECT_FIRST_TURN_ONLY); + ASSUME(GetMovePower(MOVE_FIRST_IMPRESSION) == 90); + ASSUME(GetMovePower(MOVE_LUNGE) == 80); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_KANGASKHAN); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_FIRST_IMPRESSION, MOVE_LUNGE); } @@ -531,9 +531,9 @@ AI_SINGLE_BATTLE_TEST("First Impression is not chosen if it's blocked by certain PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } GIVEN { - ASSUME(gMovesInfo[MOVE_FIRST_IMPRESSION].effect == EFFECT_FIRST_TURN_ONLY); - ASSUME(gMovesInfo[MOVE_FIRST_IMPRESSION].power == 90); - ASSUME(gMovesInfo[MOVE_LUNGE].power == 80); + ASSUME(GetMoveEffect(MOVE_FIRST_IMPRESSION) == EFFECT_FIRST_TURN_ONLY); + ASSUME(GetMovePower(MOVE_FIRST_IMPRESSION) == 90); + ASSUME(GetMovePower(MOVE_LUNGE) == 80); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_FIRST_IMPRESSION, MOVE_LUNGE); } @@ -545,7 +545,7 @@ AI_SINGLE_BATTLE_TEST("First Impression is not chosen if it's blocked by certain AI_SINGLE_BATTLE_TEST("AI will not choose Burn Up if the user lost the Fire typing") { GIVEN { - ASSUME(gMovesInfo[MOVE_BURN_UP].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE); + ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CYNDAQUIL) { Moves(MOVE_BURN_UP, MOVE_EXTRASENSORY, MOVE_FLAMETHROWER); } @@ -559,7 +559,7 @@ AI_SINGLE_BATTLE_TEST("AI will only choose Surf 1/3 times if the opposing mon ha { PASSES_RANDOMLY(1, 3, RNG_AI_ABILITY); GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); }; OPPONENT(SPECIES_LANTURN) { Moves(MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_SURF); } @@ -576,7 +576,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Thunderbolt then Surf 2/3 times if the opp { PASSES_RANDOMLY(2, 3, RNG_AI_ABILITY); GIVEN { - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); }; OPPONENT(SPECIES_LANTURN) { Moves(MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_SURF); } @@ -596,10 +596,10 @@ AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary" PARAMETRIZE {ability = ABILITY_SUCTION_CUPS; } PARAMETRIZE {ability = ABILITY_CONTRARY; } GIVEN { - ASSUME(gMovesInfo[MOVE_SCRATCH].power == 40); - ASSUME(gMovesInfo[MOVE_SCRATCH].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_POWER_UP_PUNCH].power == 40); - ASSUME(gMovesInfo[MOVE_POWER_UP_PUNCH].type == TYPE_FIGHTING); + ASSUME(GetMovePower(MOVE_SCRATCH) == 40); + ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); + ASSUME(GetMovePower(MOVE_POWER_UP_PUNCH) == 40); + ASSUME(GetMoveType(MOVE_POWER_UP_PUNCH) == TYPE_FIGHTING); ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); @@ -622,10 +622,10 @@ AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary") PARAMETRIZE {ability = ABILITY_SUCTION_CUPS; } PARAMETRIZE {ability = ABILITY_CONTRARY; } GIVEN { - ASSUME(gMovesInfo[MOVE_SUPERPOWER].power == 120); - ASSUME(gMovesInfo[MOVE_SUPERPOWER].type == TYPE_FIGHTING); - ASSUME(gMovesInfo[MOVE_OUTRAGE].power == 120); - ASSUME(gMovesInfo[MOVE_OUTRAGE].type == TYPE_DRAGON); + ASSUME(GetMovePower(MOVE_SUPERPOWER) == 120); + ASSUME(GetMoveType(MOVE_SUPERPOWER) == TYPE_FIGHTING); + ASSUME(GetMovePower(MOVE_OUTRAGE) == 120); + ASSUME(GetMoveType(MOVE_OUTRAGE) == TYPE_DRAGON); ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); @@ -650,7 +650,7 @@ AI_DOUBLE_BATTLE_TEST("AI will not choose Earthquake if it damages the partner") PARAMETRIZE { species = SPECIES_CHIKORITA; } GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -667,7 +667,7 @@ AI_DOUBLE_BATTLE_TEST("AI will not choose Earthquake if it damages the partner") AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if partner is not alive") { GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -682,7 +682,7 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if partner is not alive") AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kill an opposing mon and does 1/3 of damage to AI") { GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { HP(1); } @@ -700,7 +700,7 @@ AI_DOUBLE_BATTLE_TEST("AI will the see a corresponding absorbing ability on part PARAMETRIZE { ability = ABILITY_STATIC; } GIVEN { - ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -721,11 +721,11 @@ AI_SINGLE_BATTLE_TEST("AI calculates guaranteed criticals and detects critical i PARAMETRIZE { ability = ABILITY_SHELL_ARMOR; } GIVEN { - ASSUME(gMovesInfo[MOVE_STORM_THROW].alwaysCriticalHit); - ASSUME(gMovesInfo[MOVE_STORM_THROW].power == 60); - ASSUME(gMovesInfo[MOVE_BRICK_BREAK].power == 75); - ASSUME(gMovesInfo[MOVE_STORM_THROW].type == gMovesInfo[MOVE_BRICK_BREAK].type); - ASSUME(gMovesInfo[MOVE_STORM_THROW].category == gMovesInfo[MOVE_BRICK_BREAK].category); + ASSUME(MoveAlwaysCrits(MOVE_STORM_THROW)); + ASSUME(GetMovePower(MOVE_STORM_THROW) == 60); + ASSUME(GetMovePower(MOVE_BRICK_BREAK) == 75); + ASSUME(GetMoveType(MOVE_STORM_THROW) == GetMoveType(MOVE_BRICK_BREAK)); + ASSUME(GetMoveCategory(MOVE_STORM_THROW) == GetMoveCategory(MOVE_BRICK_BREAK)); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_OMASTAR) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_STORM_THROW, MOVE_BRICK_BREAK); } @@ -761,11 +761,11 @@ AI_SINGLE_BATTLE_TEST("AI avoids contact moves against rocky helmet") PARAMETRIZE { item = ITEM_ROCKY_HELMET; } GIVEN { - ASSUME(gMovesInfo[MOVE_BRANCH_POKE].makesContact); - ASSUME(!gMovesInfo[MOVE_LEAFAGE].makesContact); - ASSUME(gMovesInfo[MOVE_BRANCH_POKE].power == gMovesInfo[MOVE_LEAFAGE].power); - ASSUME(gMovesInfo[MOVE_BRANCH_POKE].type == gMovesInfo[MOVE_LEAFAGE].type); - ASSUME(gMovesInfo[MOVE_BRANCH_POKE].category == gMovesInfo[MOVE_LEAFAGE].category); + ASSUME(MoveMakesContact(MOVE_BRANCH_POKE)); + ASSUME(!MoveMakesContact(MOVE_LEAFAGE)); + ASSUME(GetMovePower(MOVE_BRANCH_POKE) == GetMovePower(MOVE_LEAFAGE)); + ASSUME(GetMoveType(MOVE_BRANCH_POKE) == GetMoveType(MOVE_LEAFAGE)); + ASSUME(GetMoveCategory(MOVE_BRANCH_POKE) == GetMoveCategory(MOVE_LEAFAGE)); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_WOBBUFFET) { Item(item); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BRANCH_POKE, MOVE_LEAFAGE); } @@ -785,11 +785,11 @@ AI_SINGLE_BATTLE_TEST("AI uses a guaranteed KO move instead of the move with the PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } GIVEN { - ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); - ASSUME(gMovesInfo[MOVE_SLASH].power == 70); - ASSUME(gMovesInfo[MOVE_STRENGTH].power == 80); - ASSUME(gMovesInfo[MOVE_SLASH].type == gMovesInfo[MOVE_STRENGTH].type); - ASSUME(gMovesInfo[MOVE_SLASH].category == gMovesInfo[MOVE_STRENGTH].category); + ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); + ASSUME(GetMovePower(MOVE_SLASH) == 70); + ASSUME(GetMovePower(MOVE_STRENGTH) == 80); + ASSUME(GetMoveType(MOVE_SLASH) == GetMoveType(MOVE_STRENGTH)); + ASSUME(GetMoveCategory(MOVE_SLASH) == GetMoveCategory(MOVE_STRENGTH)); AI_FLAGS(flags); PLAYER(SPECIES_WOBBUFFET) { HP(225); } OPPONENT(SPECIES_ABSOL) { Ability(ABILITY_SUPER_LUCK); Moves(MOVE_SLASH, MOVE_STRENGTH); } @@ -818,10 +818,10 @@ AI_SINGLE_BATTLE_TEST("AI stays choice locked into moves in spite of the player' GIVEN { ASSUME(gItemsInfo[ITEM_CHOICE_BAND].holdEffect == HOLD_EFFECT_CHOICE_BAND); - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); - ASSUME(gMovesInfo[MOVE_BOOMBURST].soundMove == TRUE); - ASSUME(gMovesInfo[MOVE_BULLET_SEED].ballisticMove == TRUE); - ASSUME(gMovesInfo[MOVE_TAIL_WHIP].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); + ASSUME(IsSoundMove(MOVE_BOOMBURST)); + ASSUME(IsBallisticMove(MOVE_BULLET_SEED)); + ASSUME(GetMoveCategory(MOVE_TAIL_WHIP) == DAMAGE_CATEGORY_STATUS); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(playerMon) { Ability(ability); } diff --git a/test/battle/ai/ai_calc_best_move_score.c b/test/battle/ai/ai_calc_best_move_score.c index bece527f30..f3b339deba 100644 --- a/test/battle/ai/ai_calc_best_move_score.c +++ b/test/battle/ai/ai_calc_best_move_score.c @@ -10,9 +10,9 @@ AI_SINGLE_BATTLE_TEST("AI will not further increase Attack / Sp. Atk stat if it PARAMETRIZE { move = MOVE_CALM_MIND; } GIVEN { - ASSUME(gMovesInfo[MOVE_SKY_UPPERCUT].power == 85); - ASSUME(gMovesInfo[MOVE_HOWL].effect == EFFECT_ATTACK_UP_USER_ALLY); - ASSUME(gMovesInfo[MOVE_CALM_MIND].effect == EFFECT_CALM_MIND); + ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_COMBUSKEN) { Speed(15); Moves(MOVE_SKY_UPPERCUT, MOVE_CELEBRATE); }; OPPONENT(SPECIES_KANGASKHAN) { Speed(20); Moves(MOVE_CHIP_AWAY, MOVE_SWIFT, move); } @@ -30,9 +30,9 @@ AI_SINGLE_BATTLE_TEST("AI will not further increase Attack / Sp. Atk stat if it PARAMETRIZE { move = MOVE_CALM_MIND; } GIVEN { - ASSUME(gMovesInfo[MOVE_SKY_UPPERCUT].power == 85); - ASSUME(gMovesInfo[MOVE_HOWL].effect == EFFECT_ATTACK_UP_USER_ALLY); - ASSUME(gMovesInfo[MOVE_CALM_MIND].effect == EFFECT_CALM_MIND); + ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_COMBUSKEN) { Speed(20); Moves(MOVE_DOUBLE_KICK, MOVE_CELEBRATE); }; OPPONENT(SPECIES_KANGASKHAN) { Speed(15); Moves(MOVE_CHIP_AWAY, MOVE_SWIFT, move); } @@ -62,9 +62,9 @@ AI_SINGLE_BATTLE_TEST("AI will correctly predict what move the opposing mon goin PARAMETRIZE { move = MOVE_CALM_MIND; } GIVEN { - ASSUME(gMovesInfo[MOVE_SKY_UPPERCUT].power == 85); - ASSUME(gMovesInfo[MOVE_HOWL].effect == EFFECT_ATTACK_UP_USER_ALLY); - ASSUME(gMovesInfo[MOVE_CALM_MIND].effect == EFFECT_CALM_MIND); + ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_COMBUSKEN) { Speed(15); Moves(MOVE_SKY_UPPERCUT, MOVE_DOUBLE_KICK, MOVE_FLAME_WHEEL, MOVE_CELEBRATE); }; OPPONENT(SPECIES_KANGASKHAN) { Speed(20); Moves(MOVE_CHIP_AWAY, MOVE_SWIFT, move); } @@ -77,10 +77,10 @@ AI_SINGLE_BATTLE_TEST("AI will correctly predict what move the opposing mon goin AI_SINGLE_BATTLE_TEST("AI will not use Throat Chop if opposing mon has a better move") { GIVEN { - ASSUME(gMovesInfo[MOVE_PSYCHIC_FANGS].power == 85); - ASSUME(gMovesInfo[MOVE_THROAT_CHOP].power == 80); - ASSUME(gMovesInfo[MOVE_DISARMING_VOICE].power == 40); - ASSUME(gMovesInfo[MOVE_FLAME_BURST].power == 70); + ASSUME(GetMovePower(MOVE_PSYCHIC_FANGS) == 85); + ASSUME(GetMovePower(MOVE_THROAT_CHOP) == 80); + ASSUME(GetMovePower(MOVE_DISARMING_VOICE) == 40); + ASSUME(GetMovePower(MOVE_FLAME_BURST) == 70); ASSUME(MoveHasAdditionalEffect(MOVE_THROAT_CHOP, MOVE_EFFECT_THROAT_CHOP) == TRUE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_REGIROCK) { Speed(15); Moves(MOVE_DISARMING_VOICE, MOVE_FLAME_BURST); }; @@ -96,10 +96,10 @@ AI_SINGLE_BATTLE_TEST("AI will select Throat Chop if the sound move is the best { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_THROAT_CHOP, MOVE_EFFECT_THROAT_CHOP) == TRUE); - ASSUME(gMovesInfo[MOVE_PSYCHIC_FANGS].power == 85); - ASSUME(gMovesInfo[MOVE_THROAT_CHOP].power == 80); - ASSUME(gMovesInfo[MOVE_FLAME_BURST].power == 70); - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].power == 90); + ASSUME(GetMovePower(MOVE_PSYCHIC_FANGS) == 85); + ASSUME(GetMovePower(MOVE_THROAT_CHOP) == 80); + ASSUME(GetMovePower(MOVE_FLAME_BURST) == 70); + ASSUME(GetMovePower(MOVE_HYPER_VOICE) == 90); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_REGIROCK) { Speed(15); Moves(MOVE_HYPER_VOICE, MOVE_FLAME_BURST); }; OPPONENT(SPECIES_WOBBUFFET) { Speed(20); Moves(MOVE_THROAT_CHOP, MOVE_PSYCHIC_FANGS); } diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 37ad7edb15..0e9377fdea 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -15,7 +15,7 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Facade") PARAMETRIZE { status1 = STATUS1_BURN; expectedMove = MOVE_FACADE; } GIVEN { - ASSUME(gMovesInfo[MOVE_FACADE].effect == EFFECT_FACADE); + ASSUME(GetMoveEffect(MOVE_FACADE) == EFFECT_FACADE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(60); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BODY_SLAM, MOVE_FACADE); Status1(status1); } @@ -36,8 +36,8 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Smelling Salt") GIVEN { ASSUME(B_UPDATED_MOVE_DATA >= GEN_6); - ASSUME(gMovesInfo[MOVE_SMELLING_SALTS].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); - ASSUME(gMovesInfo[MOVE_SMELLING_SALTS].argument == STATUS1_PARALYSIS); + ASSUME(GetMoveEffect(MOVE_SMELLING_SALTS) == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(GetMoveEffectArg_Status(MOVE_SMELLING_SALTS) == STATUS1_PARALYSIS); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(60); Status1(status1); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BODY_SLAM, MOVE_SMELLING_SALTS); } @@ -58,8 +58,8 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Wake Up Slap") GIVEN { ASSUME(B_UPDATED_MOVE_DATA >= GEN_6); - ASSUME(gMovesInfo[MOVE_WAKE_UP_SLAP].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); - ASSUME(gMovesInfo[MOVE_WAKE_UP_SLAP].argument == STATUS1_SLEEP); + ASSUME(GetMoveEffect(MOVE_WAKE_UP_SLAP) == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(GetMoveEffectArg_Status(MOVE_WAKE_UP_SLAP) == STATUS1_SLEEP); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_MEGANIUM) { HP(35); Status1(status1); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BODY_SLAM, MOVE_WAKE_UP_SLAP); } @@ -80,8 +80,8 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Grav Apple") PARAMETRIZE { movePlayer = MOVE_GRAVITY; expectedMove = MOVE_GRAV_APPLE; } GIVEN { - ASSUME(gMovesInfo[MOVE_GRAV_APPLE].effect == EFFECT_GRAV_APPLE); - ASSUME(gMovesInfo[MOVE_GRAV_APPLE].power == gMovesInfo[MOVE_DRUM_BEATING].power); + ASSUME(GetMoveEffect(MOVE_GRAV_APPLE) == EFFECT_GRAV_APPLE); + ASSUME(GetMovePower(MOVE_GRAV_APPLE) == GetMovePower(MOVE_DRUM_BEATING)); ASSUME(MoveHasAdditionalEffect(MOVE_DRUM_BEATING, MOVE_EFFECT_SPD_MINUS_1) == TRUE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(81); Speed(20); } @@ -103,7 +103,7 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Flail") PARAMETRIZE { hp = 5; expectedMove = MOVE_FLAIL; } GIVEN { - ASSUME(gMovesInfo[MOVE_FLAIL].effect == EFFECT_FLAIL); + ASSUME(GetMoveEffect(MOVE_FLAIL) == EFFECT_FLAIL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { HP(hp); MaxHP(490); Speed(20); Moves(MOVE_BODY_SLAM, MOVE_FLAIL); } @@ -134,8 +134,8 @@ AI_SINGLE_BATTLE_TEST("AI will only use Dream Eater if target is asleep") AI_SINGLE_BATTLE_TEST("AI sees increased base power of Spit Up") { GIVEN { - ASSUME(gMovesInfo[MOVE_STOCKPILE].effect == EFFECT_STOCKPILE); - ASSUME(gMovesInfo[MOVE_SPIT_UP].effect == EFFECT_SPIT_UP); + ASSUME(GetMoveEffect(MOVE_STOCKPILE) == EFFECT_STOCKPILE); + ASSUME(GetMoveEffect(MOVE_SPIT_UP) == EFFECT_SPIT_UP); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(43); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_STOCKPILE, MOVE_SPIT_UP, MOVE_TACKLE); } @@ -155,10 +155,10 @@ AI_SINGLE_BATTLE_TEST("AI can choose Counter or Mirror Coat if the predicted mov PARAMETRIZE { playerMove = MOVE_POWER_GEM; opponentMove = MOVE_MIRROR_COAT; } GIVEN { - ASSUME(gMovesInfo[MOVE_COUNTER].effect == EFFECT_COUNTER); - ASSUME(gMovesInfo[MOVE_MIRROR_COAT].effect == EFFECT_MIRROR_COAT); - ASSUME(gMovesInfo[MOVE_STRENGTH].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_POWER_GEM].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER); + ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT); + ASSUME(GetMoveCategory(MOVE_STRENGTH) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_POWER_GEM) == DAMAGE_CATEGORY_SPECIAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { HP(102); Speed(100); Moves(opponentMove, MOVE_STRENGTH); } @@ -202,8 +202,8 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; partnerAbility = ABILITY_SOUNDPROOF; } GIVEN { - ASSUME(gMovesInfo[MOVE_HEAL_BELL].effect == EFFECT_HEAL_BELL); - ASSUME(B_HEAL_BELL_SOUNDPROOF >= GEN_8); + ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); + WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, GEN_8); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -219,21 +219,22 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members") { - u32 status, ability; + u32 status, ability, config; PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SCRAPPY; } - PARAMETRIZE { status = STATUS1_NONE; ability = ABILITY_SCRAPPY; } - PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SOUNDPROOF; } + PARAMETRIZE { status = STATUS1_NONE; ability = ABILITY_SCRAPPY; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SOUNDPROOF; config = GEN_4; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SOUNDPROOF; config = GEN_5; } GIVEN { - ASSUME(gMovesInfo[MOVE_HEAL_BELL].effect == EFFECT_HEAL_BELL); - ASSUME(B_HEAL_BELL_SOUNDPROOF >= GEN_5); + ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); + WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_BODY_PRESS, MOVE_HEAL_BELL); } OPPONENT(SPECIES_EXPLOUD) { Status1(status); Ability(ability); } } WHEN { - if (status == STATUS1_NONE) + if (status == STATUS1_NONE || (ability == ABILITY_SOUNDPROOF && config <= GEN_4)) TURN { EXPECT_MOVE(opponent, MOVE_BODY_PRESS); } else TURN { EXPECT_MOVE(opponent, MOVE_HEAL_BELL); } @@ -243,8 +244,8 @@ AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members") AI_DOUBLE_BATTLE_TEST("AI prioritizes Skill Swapping Contrary to allied mons that would benefit from it") { GIVEN { - ASSUME(gMovesInfo[MOVE_SKILL_SWAP].effect == EFFECT_SKILL_SWAP); - ASSUME(gMovesInfo[MOVE_OVERHEAT].additionalEffects[0].moveEffect == MOVE_EFFECT_SP_ATK_MINUS_2); + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); + ASSUME(GetMoveAdditionalEffectById(MOVE_OVERHEAT, 0)->moveEffect == MOVE_EFFECT_SP_ATK_MINUS_2); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); PLAYER(SPECIES_WOBBUFFET) { Speed(3); } PLAYER(SPECIES_WOBBUFFET) { Speed(3); } @@ -254,3 +255,16 @@ AI_DOUBLE_BATTLE_TEST("AI prioritizes Skill Swapping Contrary to allied mons tha TURN { EXPECT_MOVE(opponentLeft, MOVE_SKILL_SWAP, target:opponentRight); EXPECT_MOVE(opponentRight, MOVE_OVERHEAT); } } } + +AI_SINGLE_BATTLE_TEST("AI prioritizes Pursuit if it would KO opponent") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_PURSUIT) == EFFECT_PURSUIT); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_ESPEON) { Level(5); } + PLAYER(SPECIES_TYRANITAR); + OPPONENT(SPECIES_TYRANITAR) { Moves(MOVE_CRUNCH, MOVE_PURSUIT); } + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_PURSUIT); SEND_OUT(player, 1); } + } +} diff --git a/test/battle/ai/ai_choice.c b/test/battle/ai/ai_choice.c index c9992d2cab..b19af6a073 100644 --- a/test/battle/ai/ai_choice.c +++ b/test/battle/ai/ai_choice.c @@ -24,9 +24,11 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon switch out after using a status move onc PARAMETRIZE { ability = ABILITY_KLUTZ; heldItem = choiceItems[j]; } } + PASSES_RANDOMLY(SHOULD_SWITCH_CHOICE_LOCKED_PERCENTAGE, 100, RNG_AI_SWITCH_CHOICE_LOCKED); + GIVEN { - ASSUME(gMovesInfo[MOVE_YAWN].category == DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(GetMoveCategory(MOVE_YAWN) == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_RHYDON) OPPONENT(SPECIES_LOPUNNY) { Moves(MOVE_YAWN, MOVE_TACKLE); Item(heldItem); Ability(ability); } @@ -42,6 +44,20 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon switch out after using a status move onc } } +AI_SINGLE_BATTLE_TEST("Choiced Pokémon only consider their own status moves when determining if they should switch") +{ + GIVEN + { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_ZIGZAGOON) { Speed(4); Moves(MOVE_TAIL_WHIP, MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(5); Moves(MOVE_TACKLE); Item(ITEM_CHOICE_BAND); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(5); Moves(MOVE_TACKLE); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_TAIL_WHIP); } + TURN { EXPECT_MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_TAIL_WHIP); } + } +} + AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use stat boosting moves") { // Moves defined by MOVE_TARGET_USER (with exceptions?) @@ -60,7 +76,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use stat boosting moves") } GIVEN { - ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].target == MOVE_TARGET_USER); + ASSUME(GetMoveTarget(MOVE_SWORDS_DANCE) == MOVE_TARGET_USER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_RHYDON) OPPONENT(SPECIES_LOPUNNY) { Moves(MOVE_SWORDS_DANCE, MOVE_TACKLE); Item(heldItem); Ability(ability); } @@ -94,8 +110,8 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they are the on } GIVEN { - ASSUME(gMovesInfo[MOVE_YAWN].category == DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(GetMoveCategory(MOVE_YAWN) == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_RHYDON) OPPONENT(SPECIES_LOPUNNY) { Moves(MOVE_YAWN, MOVE_TACKLE); Item(heldItem); Ability(ability); } @@ -129,8 +145,8 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they don't have } GIVEN { - ASSUME(gMovesInfo[MOVE_YAWN].category == DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(GetMoveCategory(MOVE_YAWN) == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_RHYDON) OPPONENT(SPECIES_LOPUNNY) { Moves(MOVE_YAWN, MOVE_TACKLE); Item(heldItem); Ability(ability); } @@ -164,8 +180,8 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they are trappe } GIVEN { - ASSUME(gMovesInfo[MOVE_YAWN].category == DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(GetMoveCategory(MOVE_YAWN) == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(species) { Ability(playerAbility); } OPPONENT(SPECIES_LOPUNNY) { Moves(MOVE_YAWN, MOVE_TACKLE); Item(heldItem); Ability(aiAbility); } diff --git a/test/battle/ai/ai_double_ace.c b/test/battle/ai/ai_double_ace.c index aec37b9307..5e49c0d6e1 100644 --- a/test/battle/ai/ai_double_ace.c +++ b/test/battle/ai/ai_double_ace.c @@ -2,8 +2,8 @@ #include "test/battle.h" ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_U_TURN].effect == EFFECT_HIT_ESCAPE); - ASSUME(gMovesInfo[MOVE_CRUNCH].type == TYPE_DARK); + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveType(MOVE_CRUNCH) == TYPE_DARK); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); } diff --git a/test/battle/ai/ai_flag_predict_ability.c b/test/battle/ai/ai_flag_predict_ability.c new file mode 100644 index 0000000000..9d85773e3e --- /dev/null +++ b/test/battle/ai/ai_flag_predict_ability.c @@ -0,0 +1,16 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("AI_FLAG_WEIGH_ABILITY_PREDICTION: AI will predict opposing ability based on its aiRating") +{ + PASSES_RANDOMLY(7, 14, RNG_AI_PREDICT_ABILITY); + GIVEN { + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_WEIGH_ABILITY_PREDICTION); + PLAYER(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); }; + OPPONENT(SPECIES_LANTURN) { Moves(MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_SURF); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_THUNDERBOLT); } + } +} diff --git a/test/battle/ai/ai_flag_predict_switch.c b/test/battle/ai/ai_flag_predict_switch.c new file mode 100644 index 0000000000..132ddf4175 --- /dev/null +++ b/test/battle/ai/ai_flag_predict_switch.c @@ -0,0 +1,151 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI will use Pursuit on predicted switches") +{ + PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON); + PLAYER(SPECIES_GENGAR) { Moves(MOVE_PSYCHIC); } + PLAYER(SPECIES_CONKELDURR) { Moves(MOVE_HAMMER_ARM); } + OPPONENT(SPECIES_TYRANITAR) { Moves(MOVE_PURSUIT, MOVE_CRUNCH); } + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_PURSUIT); SEND_OUT(player, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would switch out in Pursuit scenario") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_TYRANITAR) { Moves(MOVE_PURSUIT, MOVE_CRUNCH); } + OPPONENT(SPECIES_GENGAR) { Moves(MOVE_PSYCHIC); } + OPPONENT(SPECIES_CONKELDURR) { Moves(MOVE_HAMMER_ARM); } + } WHEN { + TURN { MOVE(player, MOVE_PURSUIT); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI will use hit escape moves on predicted switches") +{ + PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH); + PLAYER(SPECIES_BRONZONG) { Moves(MOVE_PSYCHIC); } + PLAYER(SPECIES_CONKELDURR) { Moves(MOVE_HAMMER_ARM); } + OPPONENT(SPECIES_TYRANITAR) { Moves(MOVE_U_TURN, MOVE_CRUNCH); } + OPPONENT(SPECIES_TYRANITAR) { Moves(MOVE_U_TURN, MOVE_CRUNCH); } + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_U_TURN); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would switch out in hit escape scenario") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_TYRANITAR) { Moves(MOVE_U_TURN, MOVE_CRUNCH); } + PLAYER(SPECIES_TYRANITAR) { Moves(MOVE_U_TURN, MOVE_CRUNCH); } + OPPONENT(SPECIES_BRONZONG) { Moves(MOVE_PSYCHIC); } + OPPONENT(SPECIES_CONKELDURR) { Moves(MOVE_HAMMER_ARM); } + } WHEN { + TURN { EXPECT_SWITCH(opponent, 1); MOVE(player, MOVE_U_TURN); SEND_OUT(player, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: Considers ShouldSwitch and GetMostSuitableMonToSwitchInto from player's perspective") +{ + // Switching in trapper is an advanced feature of ShouldSwitch that requires GetMostSuitableMonToSwitchInto to also return a specific mon; this passing means the AI can use both in prediction + PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH); + GIVEN { + ASSUME(B_POWDER_GRASS >= GEN_6); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON); + PLAYER(SPECIES_SKARMORY) { Moves(MOVE_TACKLE); } + PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_ACROBATICS); } + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); Moves(MOVE_HEADBUTT, MOVE_THUNDERPUNCH); } + OPPONENT(SPECIES_BRELOOM); + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_HEADBUTT); } + TURN { MOVE(player, MOVE_ACROBATICS); EXPECT_MOVE(opponent, MOVE_HEADBUTT); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would switch out in trapper-from-player's-perspective case") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_BRELOOM) { Speed(5); Ability(ABILITY_EFFECT_SPORE); Moves(MOVE_PURSUIT, MOVE_BITE); } + PLAYER(SPECIES_BRELOOM) { Speed(5); } + OPPONENT(SPECIES_CACNEA) { Speed(6); Moves(MOVE_ABSORB); } + OPPONENT(SPECIES_DUGTRIO) { Speed(6); Ability(ABILITY_ARENA_TRAP); Moves(MOVE_ACROBATICS); } + } WHEN { + TURN { MOVE(player, MOVE_PURSUIT); EXPECT_SWITCH(opponent, 1); } + TURN { EXPECT_MOVE(opponent, MOVE_ACROBATICS); MOVE(player, MOVE_BITE); SEND_OUT(player, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI can use Focus Punch on predicted switches") +{ + PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH); + PLAYER(SPECIES_BRONZONG) { Moves(MOVE_PSYCHIC); } + PLAYER(SPECIES_CONKELDURR) { Moves(MOVE_HAMMER_ARM); } + OPPONENT(SPECIES_TYRANITAR) { Moves(MOVE_FOCUS_PUNCH, MOVE_BRICK_BREAK); } + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_FOCUS_PUNCH); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would switch out in Focus Punch scenario") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_TYRANITAR) { Moves(MOVE_FOCUS_PUNCH, MOVE_BRICK_BREAK); } + OPPONENT(SPECIES_BRONZONG) { Moves(MOVE_PSYCHIC); } + OPPONENT(SPECIES_CONKELDURR) { Moves(MOVE_HAMMER_ARM); } + } WHEN { + TURN { EXPECT_SWITCH(opponent, 1); MOVE(player, MOVE_FOCUS_PUNCH); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON: AI will score against predicted incoming mon when switch predicted") +{ + PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON); + PLAYER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + PLAYER(SPECIES_TYRANITAR) { Moves(MOVE_EARTHQUAKE, MOVE_CRUNCH); } + OPPONENT(SPECIES_TYRANITAR) { Moves(MOVE_SPORE, MOVE_CRUNCH); } + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_SPORE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would switch out in predicted-incoming-mon scenario") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_TYRANITAR) { Moves(MOVE_CRUNCH, MOVE_SPORE); } + OPPONENT(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + OPPONENT(SPECIES_TYRANITAR) { Moves(MOVE_EARTHQUAKE, MOVE_CRUNCH); } + } WHEN { + TURN { MOVE(player, MOVE_CRUNCH); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would normally choose prediction-informed move against mon in predicted-incoming-mon scenario") +{ + // The test "AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON: AI will score against predicted incoming mon when switch predicted" is evaluating whether the AI targets the incoming mon. + // This test makes sure the move that we are using to evaluate that, MOVE_SPORE, is actually what the AI would use against the incoming mon under normal circumstances. + // If both of these tests fail, prediction is still working, it just means the move scoring no longer has Breloom using Spore against the target in a vaccuum, so that test needs to be adjusted. + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH); + PLAYER(SPECIES_TYRANITAR) { Moves(MOVE_EARTHQUAKE, MOVE_CRUNCH); } + OPPONENT(SPECIES_TYRANITAR) { Moves(MOVE_SPORE, MOVE_CRUNCH); } + } WHEN { + TURN { MOVE(player, MOVE_CRUNCH); EXPECT_MOVE(opponent, MOVE_SPORE); } + } +} diff --git a/test/battle/ai/ai_flag_risky.c b/test/battle/ai/ai_flag_risky.c index 87be344ab8..b725b0f444 100644 --- a/test/battle/ai/ai_flag_risky.c +++ b/test/battle/ai/ai_flag_risky.c @@ -9,7 +9,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Mirror Coat against specia PARAMETRIZE { aiRiskyFlag = AI_FLAG_RISKY; } GIVEN { - ASSUME(gMovesInfo[MOVE_MIRROR_COAT].effect == EFFECT_MIRROR_COAT); + ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT); ASSUME(gSpeciesInfo[SPECIES_GROVYLE].baseSpAttack == 85); ASSUME(gSpeciesInfo[SPECIES_GROVYLE].baseAttack == 65); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); @@ -28,7 +28,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Counter against physical a PARAMETRIZE { aiRiskyFlag = AI_FLAG_RISKY; } GIVEN { - ASSUME(gMovesInfo[MOVE_COUNTER].effect == EFFECT_COUNTER); + ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER); ASSUME(gSpeciesInfo[SPECIES_MARSHTOMP].baseAttack == 85); ASSUME(gSpeciesInfo[SPECIES_MARSHTOMP].baseSpAttack == 60); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); @@ -47,7 +47,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will prioritize Revenge if slower") PARAMETRIZE { aiRiskyFlag = AI_FLAG_RISKY; } GIVEN { - ASSUME(gMovesInfo[MOVE_REVENGE].effect == EFFECT_REVENGE); + ASSUME(GetMoveEffect(MOVE_REVENGE) == EFFECT_REVENGE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); PLAYER(SPECIES_GROVYLE) { Level(20); Speed(4); Moves(MOVE_ENERGY_BALL); } OPPONENT(SPECIES_CASTFORM) { Level(19); Speed(3); Moves(MOVE_TACKLE, MOVE_REVENGE); } @@ -74,12 +74,13 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: Mid-battle switches prioritize offensive o } } -AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI prefers high damage moves at the expense of accuracy regardless of KO thresholds") +AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE: AI prefers high damage moves at the expense of accuracy regardless of KO thresholds") { u32 aiRiskyFlag = 0; PARAMETRIZE { aiRiskyFlag = 0; } PARAMETRIZE { aiRiskyFlag = AI_FLAG_RISKY; } + PARAMETRIZE { aiRiskyFlag = AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE; } GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); diff --git a/test/battle/ai/ai_flag_sequence_switching.c b/test/battle/ai/ai_flag_sequence_switching.c index 8502efbba7..56d7eb881f 100644 --- a/test/battle/ai/ai_flag_sequence_switching.c +++ b/test/battle/ai/ai_flag_sequence_switching.c @@ -48,8 +48,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SEQUENCE_SWITCHING: Roar and Dragon Tail still fo PASSES_RANDOMLY(1, 2, RNG_FORCE_RANDOM_SWITCH); GIVEN { - ASSUME(gMovesInfo[MOVE_ROAR].effect == EFFECT_ROAR); - ASSUME(gMovesInfo[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET); + ASSUME(GetMoveEffect(MOVE_ROAR) == EFFECT_ROAR); + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); AI_FLAGS(AI_FLAG_SEQUENCE_SWITCHING); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -82,10 +82,10 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SEQUENCE_SWITCHING: AI will always switch into lo } GIVEN { - ASSUME(gMovesInfo[MOVE_U_TURN].effect == EFFECT_HIT_ESCAPE); - ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT); - ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); - ASSUME(gMovesInfo[MOVE_CHILLY_RECEPTION].effect == EFFECT_CHILLY_RECEPTION); + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_PARTING_SHOT) == EFFECT_PARTING_SHOT); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_CHILLY_RECEPTION); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSequenceSwitchingFlag); PLAYER(SPECIES_SWELLOW) { Level (50); } OPPONENT(SPECIES_MACHOP) { Level(1); Moves(move); } diff --git a/test/battle/ai/ai_powerful_status.c b/test/battle/ai/ai_powerful_status.c index c58c4f3af9..414ba7329a 100644 --- a/test/battle/ai/ai_powerful_status.c +++ b/test/battle/ai/ai_powerful_status.c @@ -5,8 +5,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers to set up a powerful Status over fainting a target") { GIVEN { - ASSUME(gMovesInfo[MOVE_TRICK_ROOM].effect == EFFECT_TRICK_ROOM); - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_POWERFUL_STATUS); PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WYNAUT); @@ -22,9 +22,9 @@ AI_SINGLE_BATTLE_TEST("AI prefers to set up a powerful Status over fainting a ta AI_SINGLE_BATTLE_TEST("AI will try to do damage on target instead of setting up hazards if target has a way to remove them") { GIVEN { - ASSUME(gMovesInfo[MOVE_RAPID_SPIN].effect == EFFECT_RAPID_SPIN); - ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].effect == EFFECT_STEALTH_ROCK); - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); + ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_POWERFUL_STATUS | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_WOBBUFFET) { HP(1); Moves(MOVE_RAPID_SPIN, MOVE_DEFOG, MOVE_CELEBRATE); } PLAYER(SPECIES_WYNAUT); @@ -40,8 +40,8 @@ AI_SINGLE_BATTLE_TEST("AI will try to do damage on target instead of setting up AI_SINGLE_BATTLE_TEST("AI will not set up Rain if it is already raining") { GIVEN { - ASSUME(gMovesInfo[MOVE_RAIN_DANCE].effect == EFFECT_RAIN_DANCE); - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_RAIN_DANCE); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_POWERFUL_STATUS); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 45210efea6..367afbc0f1 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -24,6 +24,7 @@ AI_SINGLE_BATTLE_TEST("AI gets baited by Protect Switch tactics") // This behavi // General switching behaviour AI_SINGLE_BATTLE_TEST("AI switches if Perish Song is about to kill") { + PASSES_RANDOMLY(SHOULD_SWITCH_PERISH_SONG_PERCENTAGE, 100, RNG_AI_SWITCH_PERISH_SONG); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); @@ -46,6 +47,7 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spot PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } PARAMETRIZE {flags = 0; } + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); PLAYER(SPECIES_RATTATA); @@ -67,8 +69,22 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spot } } +AI_SINGLE_BATTLE_TEST("AI will switch out if it has no move that affects the player") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_RATTATA); + OPPONENT(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + OPPONENT(SPECIES_RATTATA) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { EXPECT_SWITCH(opponent, 1); } + } +} + AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spots in a double battle (Wonder Guard)") { + PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_SHEDINJA); @@ -93,7 +109,7 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spot AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: U-Turn will send out Ace Mon if it's the only one remaining") { GIVEN { - ASSUME(gMovesInfo[MOVE_U_TURN].effect == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_ACE_POKEMON); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_U_TURN); } @@ -103,6 +119,37 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: U-Turn will send out Ace Mon i } } +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Eject Button will send out Ace Mon if it's the only one remaining") +{ + u32 aiSmartMonChoicesFlag; + PARAMETRIZE { aiSmartMonChoicesFlag = 0; } + PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag | AI_FLAG_ACE_POKEMON); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Item(ITEM_EJECT_BUTTON); }; + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Eject Pack will send out Ace Mon if it's the only one remaining") +{ + u32 aiSmartMonChoicesFlag; + PARAMETRIZE { aiSmartMonChoicesFlag = 0; } + PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag | AI_FLAG_ACE_POKEMON); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + PLAYER(SPECIES_ARCANINE) { Ability(ABILITY_INTIMIDATE); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Item(ITEM_EJECT_PACK); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_LINOONE) { Moves(MOVE_HEADBUTT); } + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 1); } + } +} + // General AI_FLAG_SMART_MON_CHOICES behaviour AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Number of hits to KO calculation checks whether incoming damage is less than recurring healing to avoid an infinite loop") { @@ -168,11 +215,11 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will not switch in a Pokemo PARAMETRIZE { speedAlakazm = 400; alakazamFirst = TRUE; aiSmartSwitchFlags = AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES; } // AI_FLAG_SMART_MON_CHOICES recognizes that Alakazam is faster and can KO, and will switch it in GIVEN { - ASSUME(gMovesInfo[MOVE_PSYCHIC].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_FOCUS_BLAST].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_BUBBLE_BEAM].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_WATER_GUN].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_STRENGTH].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_PSYCHIC) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_FOCUS_BLAST) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_BUBBLE_BEAM) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_STRENGTH) == DAMAGE_CATEGORY_PHYSICAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartSwitchFlags); PLAYER(SPECIES_WEAVILE) { Speed(300); Ability(ABILITY_SHADOW_TAG); } // Weavile has Shadow Tag, so AI can't switch on the first turn, but has to do it after fainting. OPPONENT(SPECIES_KADABRA) { Speed(200); Moves(MOVE_PSYCHIC, MOVE_DISABLE, MOVE_TAUNT, MOVE_CALM_MIND); } @@ -250,7 +297,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize offensive options after slow U-Turn") { GIVEN { - ASSUME(gMovesInfo[MOVE_FALSE_SWIPE].effect == EFFECT_FALSE_SWIPE); + ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_FALSE_SWIPE, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_U_TURN); Speed(4); } // Forces switchout @@ -265,7 +312,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize { GIVEN { ASSUME(gItemsInfo[ITEM_EJECT_BUTTON].holdEffect == HOLD_EFFECT_EJECT_BUTTON); - ASSUME(gMovesInfo[MOVE_FALSE_SWIPE].effect == EFFECT_FALSE_SWIPE); + ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_FALSE_SWIPE, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_BUTTON); Moves(MOVE_TACKLE); Speed(4); } // Forces switchout @@ -280,7 +327,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize { GIVEN { ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_GROWL, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_PACK); Moves(MOVE_TACKLE); Speed(4); } // Forces switchout @@ -337,7 +384,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Post-KO switches prioritize of AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Post-KO switches factor in Trick Room for revenge killing") { GIVEN { - ASSUME(gMovesInfo[MOVE_TRICK_ROOM].effect == EFFECT_TRICK_ROOM); + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_SWELLOW) { Level(30); Speed(10); Moves(MOVE_WING_ATTACK, MOVE_GROWL); } OPPONENT(SPECIES_BALTOY) { Level(1); Speed(10); Moves(MOVE_TRICK_ROOM); } @@ -371,10 +418,10 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will not switch out if Pokemo PARAMETRIZE { move1 = MOVE_RAPID_SPIN; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_RAPID_SPIN].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_HEADBUTT].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_RAPID_SPIN) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_EARTHQUAKE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_HEADBUTT) == DAMAGE_CATEGORY_PHYSICAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_HITMONTOP) { Level(30); Moves(MOVE_CHARM, MOVE_TACKLE, MOVE_STEALTH_ROCK, MOVE_EARTHQUAKE); Ability(ABILITY_INTIMIDATE); Speed(5); } OPPONENT(SPECIES_GRIMER) { Level(30); Moves(MOVE_TACKLE); Item(ITEM_FOCUS_SASH); Speed(4); } @@ -399,7 +446,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch in trapping mon m u32 aiSmartSwitchingFlag = 0; PARAMETRIZE { aiSmartSwitchingFlag = 0; } PARAMETRIZE { aiSmartSwitchingFlag = AI_FLAG_SMART_SWITCHING; } - + PASSES_RANDOMLY(SHOULD_SWITCH_TRAPPER_PERCENTAGE, 100, RNG_AI_SWITCH_TRAPPER); GIVEN { ASSUME(gSpeciesInfo[SPECIES_GOLURK].types[0] == TYPE_GROUND); ASSUME(gSpeciesInfo[SPECIES_GOLURK].types[1] == TYPE_GHOST); @@ -422,7 +469,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will switch in trapping mon u32 aiSmartMonChoicesFlag = 0; // Enables trapping behaviour after KOs PARAMETRIZE { aiSmartMonChoicesFlag = 0; } // No trapping behaviour PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches - GIVEN{ + GIVEN { ASSUME(gSpeciesInfo[SPECIES_MAWILE].types[0] == TYPE_STEEL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag); PLAYER(SPECIES_MAWILE) { Speed(2); Moves(MOVE_PROTECT, MOVE_TACKLE); } @@ -443,7 +490,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use trapping behaviour if player only has 1 mon u32 aiSmartMonChoicesFlag = 0; // Enables trapping behaviour after KOs PARAMETRIZE { aiSmartMonChoicesFlag = 0; } // No trapping behaviour PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches - GIVEN{ + GIVEN { ASSUME(gSpeciesInfo[SPECIES_MAWILE].types[0] == TYPE_STEEL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag); PLAYER(SPECIES_MAWILE) { Speed(2); Moves(MOVE_PROTECT, MOVE_TACKLE); } @@ -451,19 +498,33 @@ AI_SINGLE_BATTLE_TEST("AI won't use trapping behaviour if player only has 1 mon OPPONENT(SPECIES_MAGNEZONE) { Speed(1); Ability(ABILITY_MAGNET_PULL); Moves(MOVE_SHOCK_WAVE); } OPPONENT(SPECIES_MEGANIUM) { Speed(3); Moves(MOVE_EARTH_POWER); } } WHEN { - TURN{ MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_SELF_DESTRUCT); EXPECT_SEND_OUT(opponent, 2); } + TURN{ MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_SELF_DESTRUCT); EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will trap player using Trace if player has a trapper") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_TRAPPER_PERCENTAGE, 100, RNG_AI_SWITCH_TRAPPER); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_ROCK_TOMB); } + PLAYER(SPECIES_DUGTRIO); + OPPONENT(SPECIES_GENGAR); + OPPONENT(SPECIES_PORYGON2) { Ability(ABILITY_TRACE); Item(ITEM_EVIOLITE); Moves(MOVE_ICE_BEAM); } + } WHEN { + TURN { MOVE(player, MOVE_ROCK_TOMB); EXPECT_SWITCH(opponent, 1); } } } AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would be OKHO'd and they have a good switchin 50% of the time") { - PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_HASBADODDS); + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); GIVEN { ASSUME(gSpeciesInfo[SPECIES_RHYDON].types[0] == TYPE_GROUND); ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[0] == TYPE_WATER); ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[1] == TYPE_FLYING); - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].type == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_ELECTRODE) { Moves(MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_THUNDER_SHOCK); } @@ -476,14 +537,15 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it can't deal damage to a mon with Wonder Guard") { + PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD); GIVEN { ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG); ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST); ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[0] == ABILITY_WONDER_GUARD); ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[1] == ABILITY_NONE); ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[2] == ABILITY_NONE); - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_SHADOW_BALL].type == TYPE_GHOST); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_SHEDINJA) { Moves(MOVE_TACKLE); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -495,14 +557,15 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it can't deal damage to AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it can't deal damage to a mon with Wonder Guard") { + PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD); GIVEN { ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG); ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST); ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[0] == ABILITY_WONDER_GUARD); ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[1] == ABILITY_NONE); ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[2] == ABILITY_NONE); - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_SHADOW_BALL].type == TYPE_GHOST); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_SHEDINJA) { Moves(MOVE_TACKLE); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -516,10 +579,10 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee { u32 species = SPECIES_NONE, odds = 0; PARAMETRIZE { species = SPECIES_ZIGZAGOON, odds = 0; } - PARAMETRIZE { species = SPECIES_HARIYAMA, odds = 50; } + PARAMETRIZE { species = SPECIES_HARIYAMA, odds = SHOULD_SWITCH_BADLY_POISONED_PERCENTAGE; } PASSES_RANDOMLY(odds, 100, RNG_AI_SWITCH_BADLY_POISONED); GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE, MOVE_CELEBRATE, MOVE_TOXIC, MOVE_AURA_SPHERE); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -533,9 +596,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Curse'd 50% of the time") { - PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_CURSED); + PASSES_RANDOMLY(SHOULD_SWITCH_CURSED_PERCENTAGE, 100, RNG_AI_SWITCH_CURSED); GIVEN { - ASSUME(gMovesInfo[MOVE_CURSE].effect == EFFECT_CURSE); + ASSUME(GetMoveEffect(MOVE_CURSE) == EFFECT_CURSE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_DUSCLOPS) { Moves(MOVE_FIRE_PUNCH, MOVE_CURSE); } PLAYER(SPECIES_MILOTIC) { Moves(MOVE_WATER_GUN); } @@ -549,9 +612,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Nightmare'd 33% of the time") { - PASSES_RANDOMLY(33, 100, RNG_AI_SWITCH_NIGHTMARE); + PASSES_RANDOMLY(SHOULD_SWITCH_NIGHTMARE_PERCENTAGE, 100, RNG_AI_SWITCH_NIGHTMARE); GIVEN { - ASSUME(gMovesInfo[MOVE_NIGHTMARE].effect == EFFECT_NIGHTMARE); + ASSUME(GetMoveEffect(MOVE_NIGHTMARE) == EFFECT_NIGHTMARE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_GENGAR) { Moves(MOVE_NIGHTMARE); } OPPONENT(SPECIES_DUSCLOPS) { Moves(MOVE_SHADOW_BALL); Status1(STATUS1_SLEEP); } @@ -564,9 +627,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Leech Seed'd 25% of the time") { - PASSES_RANDOMLY(25, 100, RNG_AI_SWITCH_SEEDED); + PASSES_RANDOMLY(SHOULD_SWITCH_SEEDED_PERCENTAGE, 100, RNG_AI_SWITCH_SEEDED); GIVEN { - ASSUME(gMovesInfo[MOVE_LEECH_SEED].effect == EFFECT_LEECH_SEED); + ASSUME(GetMoveEffect(MOVE_LEECH_SEED) == EFFECT_LEECH_SEED); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_WHIMSICOTT) { Moves(MOVE_LEECH_SEED); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -579,8 +642,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been infatuated") { + PASSES_RANDOMLY(SHOULD_SWITCH_INFATUATION_PERCENTAGE, 100, RNG_AI_SWITCH_INFATUATION); GIVEN { - ASSUME(gMovesInfo[MOVE_ATTRACT].effect == EFFECT_ATTRACT); + ASSUME(GetMoveEffect(MOVE_ATTRACT) == EFFECT_ATTRACT); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_LUVDISC) { Moves(MOVE_ATTRACT); Gender(MON_FEMALE); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); Gender(MON_MALE); } @@ -591,17 +655,18 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee } } -AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Yawn'd with more than 1/3 HP remaining") +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Yawn'd with more than 1/3 HP remaining and it has a good switchin") { u32 hp; PARAMETRIZE { hp = 30; } PARAMETRIZE { hp = 10; } + PASSES_RANDOMLY(SHOULD_SWITCH_YAWN_PERCENTAGE, 100, RNG_AI_SWITCH_YAWN); GIVEN { - ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE, MOVE_YAWN); } - OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); HP(hp); MaxHP(30); } - OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE); HP(hp); MaxHP(30); } + OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_HEADBUTT); } } WHEN { TURN { MOVE(player, MOVE_YAWN) ; EXPECT_MOVE(opponent, MOVE_TACKLE); } if (hp == 30) @@ -611,13 +676,31 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee } } -AI_DOUBLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Yawn'd with more than 1/3 HP remaining (Doubles)") +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will not switch out if it has been Yawn'd with more than 1/3 HP remaining and it does not have a good switchin") { u32 hp; PARAMETRIZE { hp = 30; } PARAMETRIZE { hp = 10; } GIVEN { - ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE, MOVE_YAWN); } + OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE); HP(hp); MaxHP(30); } + OPPONENT(SPECIES_SLAKOTH) { Level(1); Moves(MOVE_HEADBUTT); } + } WHEN { + TURN { MOVE(player, MOVE_YAWN) ; EXPECT_MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_TACKLE) ; EXPECT_MOVE(opponent, MOVE_TACKLE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Yawn'd with more than 1/3 HP remaining (Doubles)") +{ + u32 hp; + PARAMETRIZE { hp = 30; } + PARAMETRIZE { hp = 10; } + PASSES_RANDOMLY(SHOULD_SWITCH_YAWN_PERCENTAGE, 100, RNG_AI_SWITCH_YAWN); + GIVEN { + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE, MOVE_CELEBRATE, MOVE_YAWN); } PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE, MOVE_CELEBRATE, MOVE_YAWN); } @@ -636,8 +719,9 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is semi-invulnerable and it has an absorber") { + PASSES_RANDOMLY(SHOULD_SWITCH_FREE_TURN_PERCENTAGE, 100, RNG_AI_SWITCH_FREE_TURN); GIVEN { - ASSUME(gMovesInfo[MOVE_DIVE].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_DIVE) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_LUVDISC) { Moves(MOVE_DIVE); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -650,9 +734,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an absorber but current mon has SE move 33% of the time") { - PASSES_RANDOMLY(33, 100, RNG_AI_SWITCH_ABSORBING); + PASSES_RANDOMLY(33, 100, RNG_AI_SWITCH_ABSORBING_STAY_IN); GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_LUVDISC) { Moves(MOVE_WATER_GUN); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SHOCK_WAVE); } @@ -665,11 +749,11 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is charging and it has an absorber") { - PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_ABSORBING); + PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING); GIVEN { - ASSUME(gMovesInfo[MOVE_SOLAR_BEAM].type == TYPE_GRASS); + ASSUME(GetMoveType(MOVE_SOLAR_BEAM) == TYPE_GRASS); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); - PLAYER(SPECIES_BELLOSSOM) { Moves(MOVE_SOLAR_BEAM); } + PLAYER(SPECIES_BELLOSSOM) { Moves(MOVE_SOLAR_BEAM, MOVE_THUNDERBOLT); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } OPPONENT(SPECIES_AZUMARILL) { Moves(MOVE_PLAY_ROUGH); Ability(ABILITY_SAP_SIPPER); } } WHEN { @@ -680,8 +764,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is charging and it has a good switchin immunity (type)") { + PASSES_RANDOMLY(SHOULD_SWITCH_FREE_TURN_PERCENTAGE, 100, RNG_AI_SWITCH_FREE_TURN); GIVEN { - ASSUME(gMovesInfo[MOVE_DIG].type == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_DIG) == TYPE_GROUND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_SANDSHREW) { Moves(MOVE_DIG); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -694,8 +779,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is charging and it has a good switchin immunity (ability)") { + PASSES_RANDOMLY(SHOULD_SWITCH_FREE_TURN_PERCENTAGE, 100, RNG_AI_SWITCH_FREE_TURN); GIVEN { - ASSUME(gMovesInfo[MOVE_DIG].type == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_DIG) == TYPE_GROUND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_SANDSHREW) { Moves(MOVE_DIG); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -708,15 +794,29 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an absorber") { + u32 aiMon; u32 move; u32 absorbingAbility; + PARAMETRIZE { aiMon = SPECIES_NINETALES; absorbingAbility = ABILITY_FLASH_FIRE; move = MOVE_FLAMETHROWER;} + PARAMETRIZE { aiMon = SPECIES_MANTINE; absorbingAbility = ABILITY_WATER_ABSORB; move = MOVE_SURF;} + PARAMETRIZE { aiMon = SPECIES_TOXICROAK; absorbingAbility = ABILITY_DRY_SKIN; move = MOVE_SURF;} + PARAMETRIZE { aiMon = SPECIES_GASTRODON; absorbingAbility = ABILITY_STORM_DRAIN; move = MOVE_SURF;} + PARAMETRIZE { aiMon = SPECIES_JOLTEON; absorbingAbility = ABILITY_VOLT_ABSORB; move = MOVE_THUNDERBOLT;} + PARAMETRIZE { aiMon = SPECIES_ELECTIVIRE; absorbingAbility = ABILITY_MOTOR_DRIVE; move = MOVE_THUNDERBOLT;} + PARAMETRIZE { aiMon = SPECIES_MANECTRIC; absorbingAbility = ABILITY_LIGHTNING_ROD; move = MOVE_THUNDERBOLT;} + PARAMETRIZE { aiMon = SPECIES_ELECTIVIRE; absorbingAbility = ABILITY_MOTOR_DRIVE; move = MOVE_THUNDERBOLT;} + PARAMETRIZE { aiMon = SPECIES_AZUMARILL; absorbingAbility = ABILITY_SAP_SIPPER; move = MOVE_GIGA_DRAIN;} + PARAMETRIZE { aiMon = SPECIES_ORTHWORM; absorbingAbility = ABILITY_EARTH_EATER; move = MOVE_EARTHQUAKE;} + PARAMETRIZE { aiMon = SPECIES_BRONZONG; absorbingAbility = ABILITY_LEVITATE; move = MOVE_EARTHQUAKE;} + PARAMETRIZE { aiMon = SPECIES_ELECTRODE; absorbingAbility = ABILITY_SOUNDPROOF; move = MOVE_HYPER_VOICE;} GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(B_REDIRECT_ABILITY_IMMUNITY >= GEN_5); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); - PLAYER(SPECIES_LUVDISC) { Moves(MOVE_WATER_GUN); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(move); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } - OPPONENT(SPECIES_MANTINE) { Moves(MOVE_TACKLE); Ability(ABILITY_WATER_ABSORB); } + OPPONENT(aiMon) { Moves(MOVE_TACKLE); Ability(absorbingAbility); } } WHEN { - TURN { MOVE(player, MOVE_WATER_GUN) ; EXPECT_MOVE(opponent, MOVE_TACKLE); } - TURN { MOVE(player, MOVE_WATER_GUN) ; EXPECT_SWITCH(opponent, 1); } + TURN { MOVE(player, move); EXPECT_MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, move); EXPECT_SWITCH(opponent, 1); } } } @@ -727,8 +827,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if opponent u PARAMETRIZE { move = MOVE_FLY; } GIVEN { - ASSUME(gMovesInfo[MOVE_FLY].effect == EFFECT_SEMI_INVULNERABLE); - ASSUME(gMovesInfo[MOVE_SKY_ATTACK].effect == EFFECT_TWO_TURNS_ATTACK); + ASSUME(GetMoveEffect(MOVE_FLY) == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveEffect(MOVE_SKY_ATTACK) == EFFECT_TWO_TURNS_ATTACK); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_SWELLOW) { Moves(move); } OPPONENT(SPECIES_MILOTIC) { Moves(MOVE_SURF); } @@ -741,7 +841,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if opponent u AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if badly statused with >= 50% HP remaining and has Natural Cure and a good switchin 66% of the time") { - PASSES_RANDOMLY(66, 100, RNG_AI_SWITCH_NATURAL_CURE); + PASSES_RANDOMLY(SHOULD_SWITCH_NATURAL_CURE_STRONG_PERCENTAGE, 100, RNG_AI_SWITCH_NATURAL_CURE); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_ODDISH) { Moves(MOVE_TOXIC, MOVE_TACKLE); } @@ -755,7 +855,7 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if badly statused with >= 5 AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it has <= 66% HP remaining and has Regenerator and a good switchin 50% of the time") { - PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_REGENERATOR); + PASSES_RANDOMLY(SHOULD_SWITCH_REGENERATOR_PERCENTAGE, 100, RNG_AI_SWITCH_REGENERATOR); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -768,8 +868,9 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it has <= 66% HP remaini AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has been Encore'd into a status move") { + PASSES_RANDOMLY(SHOULD_SWITCH_ENCORE_STATUS_PERCENTAGE, 100, RNG_AI_SWITCH_ENCORE); GIVEN { - ASSUME(gMovesInfo[MOVE_ENCORE].effect == EFFECT_ENCORE); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_AZURILL) { Moves(MOVE_TACKLE, MOVE_ENCORE); } OPPONENT(SPECIES_ODDISH) { Moves(MOVE_TOXIC, MOVE_SWEET_SCENT, MOVE_INGRAIN, MOVE_TACKLE); } @@ -783,7 +884,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will stay in if Encore'd into super effective move") { GIVEN { - ASSUME(gMovesInfo[MOVE_ENCORE].effect == EFFECT_ENCORE); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_AZURILL) { Moves(MOVE_TACKLE, MOVE_ENCORE); } OPPONENT(SPECIES_ODDISH) { Moves(MOVE_ACID); } @@ -797,9 +898,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will stay in if Encore'd into AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if Encore'd into neutral move with good switchin 50% of the time") { KNOWN_FAILING; // AI still switches even if ShouldSwitch is set to immediately return FALSE, something external seems to be triggering this - PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_ENCORE); + PASSES_RANDOMLY(SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE, 100, RNG_AI_SWITCH_ENCORE); GIVEN { - ASSUME(gMovesInfo[MOVE_ENCORE].effect == EFFECT_ENCORE); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_AZURILL) { Moves(MOVE_TACKLE, MOVE_ENCORE); } OPPONENT(SPECIES_ODDISH) { Moves(MOVE_TACKLE); } @@ -812,6 +913,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if Encore'd i AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if mon has Truant and opponent has Protect") { + PASSES_RANDOMLY(SHOULD_SWITCH_TRUANT_PERCENTAGE, 100, RNG_AI_SWITCH_TRUANT); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_ARON) { Moves(MOVE_TACKLE, MOVE_PROTECT); } @@ -825,6 +927,7 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if mon has Truant and oppon AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if mon has Truant and opponent has invulnerability move and is faster") { + PASSES_RANDOMLY(SHOULD_SWITCH_TRUANT_PERCENTAGE, 100, RNG_AI_SWITCH_TRUANT); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_SWELLOW) { Speed(5); Moves(MOVE_FLY); } @@ -840,13 +943,13 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if main attac { u32 aiSpecies = SPECIES_NONE, aiMove = MOVE_NONE, move = MOVE_NONE; - PASSES_RANDOMLY(50, 100, RNG_AI_SWITCH_STATS_LOWERED); + PASSES_RANDOMLY(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO_PERCENTAGE, 100, RNG_AI_SWITCH_STATS_LOWERED); PARAMETRIZE {move = MOVE_CHARM; aiSpecies = SPECIES_FLAREON; aiMove = MOVE_FIRE_FANG; }; PARAMETRIZE {move = MOVE_EERIE_IMPULSE; aiSpecies = SPECIES_ESPEON; aiMove = MOVE_CONFUSION; }; GIVEN { - ASSUME(gMovesInfo[MOVE_CHARM].effect == EFFECT_ATTACK_DOWN_2); - ASSUME(gMovesInfo[MOVE_EERIE_IMPULSE].effect == EFFECT_SPECIAL_ATTACK_DOWN_2); + ASSUME(GetMoveEffect(MOVE_CHARM) == EFFECT_ATTACK_DOWN_2); + ASSUME(GetMoveEffect(MOVE_EERIE_IMPULSE) == EFFECT_SPECIAL_ATTACK_DOWN_2); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ARON) { Moves(move, MOVE_TACKLE); } OPPONENT(aiSpecies) { Moves(aiMove); } @@ -861,13 +964,13 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if main attac { u32 aiSpecies = SPECIES_NONE, aiMove = MOVE_NONE, move = MOVE_NONE, move2 = MOVE_NONE; - PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_STATS_LOWERED); + PASSES_RANDOMLY(SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS_PERCENTAGE, 100, RNG_AI_SWITCH_STATS_LOWERED); PARAMETRIZE {move = MOVE_GROWL; move2 = MOVE_CHARM; aiSpecies = SPECIES_FLAREON; aiMove = MOVE_FIRE_FANG; }; PARAMETRIZE {move = MOVE_CONFIDE; move2 = MOVE_EERIE_IMPULSE; aiSpecies = SPECIES_ESPEON; aiMove = MOVE_STORED_POWER; }; GIVEN { - ASSUME(gMovesInfo[MOVE_CHARM].effect == EFFECT_ATTACK_DOWN_2); - ASSUME(gMovesInfo[MOVE_EERIE_IMPULSE].effect == EFFECT_SPECIAL_ATTACK_DOWN_2); + ASSUME(GetMoveEffect(MOVE_CHARM) == EFFECT_ATTACK_DOWN_2); + ASSUME(GetMoveEffect(MOVE_EERIE_IMPULSE) == EFFECT_SPECIAL_ATTACK_DOWN_2); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ARON) { Moves(move, move2, MOVE_TACKLE); } OPPONENT(aiSpecies) { Moves(aiMove); } @@ -881,6 +984,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if main attac AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch into mon with good type matchup and SE move if current mon has no SE move and no stats raised") { + KNOWN_FAILING; // Either remove or replace the function u32 odds = 0, species = SPECIES_NONE, move = MOVE_NONE; PARAMETRIZE { odds = 33; species = SPECIES_SCIZOR; move = MOVE_X_SCISSOR; } PARAMETRIZE { odds = 50; species = SPECIES_DUSCLOPS; move = MOVE_SHADOW_BALL; } @@ -916,17 +1020,17 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch out if Yawn'd wi PARAMETRIZE{ aceFlag = 0; } PARAMETRIZE{ aceFlag = AI_FLAG_ACE_POKEMON; } GIVEN { - ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | aceFlag | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_SMART_SWITCHING); - PLAYER(SPECIES_SLOWKING) { Moves(MOVE_YAWN, MOVE_CONFUSION, MOVE_POWER_GEM, MOVE_WATER_PULSE); Item(ITEM_LEFTOVERS); } - OPPONENT(SPECIES_SCOLIPEDE) { Moves(MOVE_POISON_TAIL); } - OPPONENT(SPECIES_ABSOL) { Moves(MOVE_KNOCK_OFF, MOVE_CRUNCH); } + PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE, MOVE_YAWN); } + OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_HEADBUTT); } } WHEN { - TURN { MOVE(player, MOVE_YAWN); EXPECT_MOVE(opponent, MOVE_POISON_TAIL); } + TURN { MOVE(player, MOVE_YAWN); EXPECT_MOVE(opponent, MOVE_TACKLE); } if (aceFlag) - TURN { MOVE(player, MOVE_POWER_GEM); EXPECT_MOVE(opponent, MOVE_POISON_TAIL); } + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); } else - TURN { MOVE(player, MOVE_POWER_GEM); EXPECT_SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_TACKLE); EXPECT_SWITCH(opponent, 1); } } } @@ -967,3 +1071,17 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI won't switch in ace mon after U-Turn if oth TURN { EXPECT_MOVE(opponent, MOVE_U_TURN); EXPECT_SEND_OUT(opponent, 2); MOVE(player, MOVE_SURF); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch in absorbing mon immediately after sending out new mon") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_BLAZIKEN) { Moves(MOVE_FLAMETHROWER, MOVE_CLOSE_COMBAT); } + OPPONENT(SPECIES_FERROTHORN) { Moves(MOVE_GYRO_BALL); } + OPPONENT(SPECIES_DIALGA) { Moves(MOVE_DRACO_METEOR); } + OPPONENT(SPECIES_HEATRAN) { Moves(MOVE_EARTH_POWER, MOVE_FLAMETHROWER); } + } WHEN { + TURN { MOVE(player, MOVE_FLAMETHROWER); EXPECT_SEND_OUT(opponent, 1); } + TURN { MOVE(player, MOVE_CLOSE_COMBAT); EXPECT_MOVE(opponent, MOVE_DRACO_METEOR); } + } +} diff --git a/test/battle/ai/ai_trytofaint.c b/test/battle/ai/ai_trytofaint.c index 10eca2d676..a1a23efdec 100644 --- a/test/battle/ai/ai_trytofaint.c +++ b/test/battle/ai/ai_trytofaint.c @@ -5,7 +5,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers priority moves if it's slower and can kill target") { GIVEN { - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(1); Speed(100); } PLAYER(SPECIES_WOBBUFFET) { Speed(100); } @@ -20,7 +20,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers priority moves if it's slower and can kill tar AI_SINGLE_BATTLE_TEST("AI will choose a random move if it's faster and can kill target") { GIVEN { - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(1); Speed(1); } PLAYER(SPECIES_WOBBUFFET) { Speed(1); } @@ -35,7 +35,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose a random move if it's faster and can kill AI_SINGLE_BATTLE_TEST("AI will choose a priority move if it is slower then the target and will be killed") { GIVEN { - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { Speed(100); } OPPONENT(SPECIES_WOBBUFFET) { HP(60); Speed(1); Moves(MOVE_QUICK_ATTACK, MOVE_STRENGTH); } diff --git a/test/battle/crit_chance.c b/test/battle/crit_chance.c index 0ff0634539..0bc8841845 100644 --- a/test/battle/crit_chance.c +++ b/test/battle/crit_chance.c @@ -36,9 +36,9 @@ SINGLE_BATTLE_TEST("Crit Chance: Raising critical hit rate to 3 guarantees a cri PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); + ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); }; + PLAYER(SPECIES_TOGEKISS) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SLASH); } diff --git a/test/battle/damage_formula.c b/test/battle/damage_formula.c index 473f631b11..0679725510 100644 --- a/test/battle/damage_formula.c +++ b/test/battle/damage_formula.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+") PARAMETRIZE { expectedDamage = 168; } PARAMETRIZE { expectedDamage = 168; } GIVEN { - ASSUME(gMovesInfo[MOVE_ICE_FANG].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_ICE_FANG) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_GLACEON) { Level(75); Attack(123); } OPPONENT(SPECIES_GARCHOMP) { Defense(163); } } WHEN { @@ -62,7 +62,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Muscle Band, crit)") PARAMETRIZE { expectedDamage = 276; } PARAMETRIZE { expectedDamage = 268; } GIVEN { - ASSUME(gMovesInfo[MOVE_ICE_FANG].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_ICE_FANG) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_GLACEON) { Level(75); Attack(123); Item(ITEM_MUSCLE_BAND); } OPPONENT(SPECIES_GARCHOMP) { Defense(163); } } WHEN { @@ -100,7 +100,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Marshadow vs Mawile)") PARAMETRIZE { expectedDamage = 124; } PARAMETRIZE { expectedDamage = 123; } GIVEN { - ASSUME(gMovesInfo[MOVE_SPECTRAL_THIEF].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_SPECTRAL_THIEF) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_MARSHADOW) { Level(100); Attack(286); } OPPONENT(SPECIES_MAWILE) { Level(100); Defense(226); HP(241); } } WHEN { @@ -150,3 +150,134 @@ DOUBLE_BATTLE_TEST("A spread move will do correct damage to the second mon if th EXPECT_EQ(damage[4], damage[5]); } } + +SINGLE_BATTLE_TEST("Punching Glove vs Muscle Band Damage calculation") +{ + s16 dmgPlayer, dmgOpponent; + s16 expectedDamagePlayer, expectedDamageOpponent; + PARAMETRIZE { expectedDamagePlayer = 204, expectedDamageOpponent = 201; } + PARAMETRIZE { expectedDamagePlayer = 201, expectedDamageOpponent = 198; } + PARAMETRIZE { expectedDamagePlayer = 199, expectedDamageOpponent = 196; } + PARAMETRIZE { expectedDamagePlayer = 196, expectedDamageOpponent = 193; } + PARAMETRIZE { expectedDamagePlayer = 195, expectedDamageOpponent = 192; } + PARAMETRIZE { expectedDamagePlayer = 193, expectedDamageOpponent = 190; } + PARAMETRIZE { expectedDamagePlayer = 190, expectedDamageOpponent = 187; } + PARAMETRIZE { expectedDamagePlayer = 189, expectedDamageOpponent = 186; } + PARAMETRIZE { expectedDamagePlayer = 187, expectedDamageOpponent = 184; } + PARAMETRIZE { expectedDamagePlayer = 184, expectedDamageOpponent = 181; } + PARAMETRIZE { expectedDamagePlayer = 183, expectedDamageOpponent = 180; } + PARAMETRIZE { expectedDamagePlayer = 181, expectedDamageOpponent = 178; } + PARAMETRIZE { expectedDamagePlayer = 178, expectedDamageOpponent = 175; } + PARAMETRIZE { expectedDamagePlayer = 177, expectedDamageOpponent = 174; } + PARAMETRIZE { expectedDamagePlayer = 174, expectedDamageOpponent = 172; } + PARAMETRIZE { expectedDamagePlayer = 172, expectedDamageOpponent = 169; } + GIVEN { + PLAYER(SPECIES_MAKUHITA) { Item(ITEM_PUNCHING_GLOVE); } + OPPONENT(SPECIES_MAKUHITA) { Item(ITEM_MUSCLE_BAND); } + } WHEN { + TURN { + MOVE(player, MOVE_DRAIN_PUNCH, WITH_RNG(RNG_DAMAGE_MODIFIER, i)); + MOVE(opponent, MOVE_DRAIN_PUNCH, WITH_RNG(RNG_DAMAGE_MODIFIER, i)); + } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAIN_PUNCH, player); + HP_BAR(opponent, captureDamage: &dmgPlayer); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAIN_PUNCH, opponent); + HP_BAR(player, captureDamage: &dmgOpponent); + } + THEN { + EXPECT_EQ(expectedDamagePlayer, dmgPlayer); + EXPECT_EQ(expectedDamageOpponent, dmgOpponent); + } +} + +SINGLE_BATTLE_TEST("Gem boosted Damage calculation") +{ + s16 dmg; + s16 expectedDamage; + PARAMETRIZE { expectedDamage = 240; } + PARAMETRIZE { expectedDamage = 237; } + PARAMETRIZE { expectedDamage = 234; } + PARAMETRIZE { expectedDamage = 232; } + PARAMETRIZE { expectedDamage = 229; } + PARAMETRIZE { expectedDamage = 228; } + PARAMETRIZE { expectedDamage = 225; } + PARAMETRIZE { expectedDamage = 222; } + PARAMETRIZE { expectedDamage = 220; } + PARAMETRIZE { expectedDamage = 217; } + PARAMETRIZE { expectedDamage = 216; } + PARAMETRIZE { expectedDamage = 213; } + PARAMETRIZE { expectedDamage = 210; } + PARAMETRIZE { expectedDamage = 208; } + PARAMETRIZE { expectedDamage = 205; } + PARAMETRIZE { expectedDamage = 204; } + GIVEN { + PLAYER(SPECIES_MAKUHITA) { Item(ITEM_FIGHTING_GEM); } + OPPONENT(SPECIES_MAKUHITA); + } WHEN { + TURN { + MOVE(player, MOVE_DRAIN_PUNCH, WITH_RNG(RNG_DAMAGE_MODIFIER, i)); + } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAIN_PUNCH, player); + HP_BAR(opponent, captureDamage: &dmg); + } + THEN { + EXPECT_EQ(expectedDamage, dmg); + } +} + +#define NUM_DAMAGE_SPREADS (DMG_ROLL_PERCENT_HI - DMG_ROLL_PERCENT_LO) + 1 + +static const s16 sThunderShockTransistorSpread[] = { 54, 55, 56, 57, 57, 58, 59, 60, 60, 60, 61, 62, 63, 63, 64, 65 }; +static const s16 sThunderShockRegularSpread[] = { 42, 42, 43, 43, 44, 45, 45, 45, 46, 46, 47, 48, 48, 48, 49, 50 }; +static const s16 sWildChargeTransistorSpread[] = { 123, 124, 126, 127, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 144, 145 }; +static const s16 sWildChargeRegularSpread[] = { 94, 96, 96, 98, 99, 100, 101, 102, 103, 105, 105, 107, 108, 109, 110, 111 }; + +DOUBLE_BATTLE_TEST("Transistor Damage calculation", s16 damage) +{ + s16 expectedDamageTransistorSpec = 0, expectedDamageRegularPhys = 0, expectedDamageRegularSpec = 0, expectedDamageTransistorPhys = 0; + s16 damagePlayerLeft, damagePlayerRight, damageOpponentLeft, damageOpponentRight; + for (u32 spread = 0; spread < 16; ++spread) { + PARAMETRIZE { expectedDamageTransistorSpec = sThunderShockTransistorSpread[spread], + expectedDamageRegularSpec = sThunderShockRegularSpread[spread], + expectedDamageTransistorPhys = sWildChargeTransistorSpread[spread], + expectedDamageRegularPhys = sWildChargeRegularSpread[spread]; + } + } + GIVEN { + ASSUME(GetMoveType(MOVE_WILD_CHARGE) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); + ASSUME(GetMoveCategory(MOVE_WILD_CHARGE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_THUNDER_SHOCK) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(NUM_DAMAGE_SPREADS == 16); + + PLAYER(SPECIES_REGIELEKI) { Ability(ABILITY_KLUTZ); } + PLAYER(SPECIES_REGIELEKI) { Ability(ABILITY_TRANSISTOR); } + OPPONENT(SPECIES_REGIELEKI) { Ability(ABILITY_KLUTZ); } + OPPONENT(SPECIES_REGIELEKI) { Ability(ABILITY_TRANSISTOR); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_THUNDER_SHOCK, target: opponentLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); + MOVE(playerRight, MOVE_THUNDER_SHOCK, target: opponentRight, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); + MOVE(opponentLeft, MOVE_WILD_CHARGE, target: playerLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); + MOVE(opponentRight, MOVE_WILD_CHARGE, target: playerRight, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_SHOCK, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damageOpponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_SHOCK, playerRight); + HP_BAR(opponentRight, captureDamage: &damageOpponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WILD_CHARGE, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damagePlayerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WILD_CHARGE, opponentRight); + HP_BAR(playerRight, captureDamage: &damagePlayerRight); + } THEN { + EXPECT_EQ(damageOpponentLeft, expectedDamageRegularSpec); + EXPECT_EQ(damageOpponentRight, expectedDamageTransistorSpec); + EXPECT_EQ(damagePlayerLeft, expectedDamageRegularPhys); + EXPECT_EQ(damagePlayerRight, expectedDamageTransistorPhys); + } +} diff --git a/test/battle/form_change/mega_evolution.c b/test/battle/form_change/mega_evolution.c index 4c97c2c151..3d9d9cf507 100644 --- a/test/battle/form_change/mega_evolution.c +++ b/test/battle/form_change/mega_evolution.c @@ -108,7 +108,7 @@ SINGLE_BATTLE_TEST("Abilities replaced by Mega Evolution do not affect turn orde DOUBLE_BATTLE_TEST("Mega Evolution happens after switching, but before Focus Punch-like Moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_FOCUS_PUNCH].effect == EFFECT_FOCUS_PUNCH); + ASSUME(GetMoveEffect(MOVE_FOCUS_PUNCH) == EFFECT_FOCUS_PUNCH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_VENUSAUR) { Item(ITEM_VENUSAURITE); } OPPONENT(SPECIES_WYNAUT); @@ -157,7 +157,7 @@ SINGLE_BATTLE_TEST("Regular Mega Evolution and Fervent Wish Mega Evolution can h SINGLE_BATTLE_TEST("Mega Evolved Pokemon do not change abilities after fainting") { GIVEN { - ASSUME(gMovesInfo[MOVE_CRUNCH].makesContact == TRUE); + ASSUME(MoveMakesContact(MOVE_CRUNCH) == TRUE); ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[0] != ABILITY_ROUGH_SKIN); ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[1] != ABILITY_ROUGH_SKIN); ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[2] != ABILITY_ROUGH_SKIN); diff --git a/test/battle/form_change/primal_reversion.c b/test/battle/form_change/primal_reversion.c index d4e682e8de..d7d956d64b 100644 --- a/test/battle/form_change/primal_reversion.c +++ b/test/battle/form_change/primal_reversion.c @@ -120,7 +120,7 @@ DOUBLE_BATTLE_TEST("Primal reversion's order is determined by Speed - player fas SINGLE_BATTLE_TEST("Primal reversion happens after a mon is sent out after a mon is fainted") { GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET) {HP(1); } PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } OPPONENT(SPECIES_WOBBUFFET); @@ -156,7 +156,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after a mon is switched in") SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Eject Button") { GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); ASSUME(gItemsInfo[ITEM_EJECT_BUTTON].holdEffect == HOLD_EFFECT_EJECT_BUTTON); PLAYER(SPECIES_WOBBUFFET) {Item(ITEM_EJECT_BUTTON); } PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } @@ -177,7 +177,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Eject B SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Red Card") { GIVEN { - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); ASSUME(gItemsInfo[ITEM_RED_CARD].holdEffect == HOLD_EFFECT_RED_CARD); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } @@ -197,7 +197,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Red Car SINGLE_BATTLE_TEST("Primal reversion happens after the entry hazards damage") { GIVEN { - ASSUME(gMovesInfo[MOVE_SPIKES].effect == EFFECT_SPIKES); + ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } OPPONENT(SPECIES_WOBBUFFET); @@ -239,7 +239,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens immediately if it was brought in by DOUBLE_BATTLE_TEST("Primal reversion triggers for multiple battlers if multiple fainted the previous turn") { GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_CATERPIE) { HP(1); } PLAYER(SPECIES_RESHIRAM); @@ -262,8 +262,8 @@ DOUBLE_BATTLE_TEST("Primal reversion triggers for multiple battlers if multiple DOUBLE_BATTLE_TEST("Primal reversion triggers for all battlers if multiple fainted the previous turn") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); - ASSUME(gMovesInfo[MOVE_EXPLOSION].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_CATERPIE) { HP(1); } PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } @@ -290,11 +290,11 @@ DOUBLE_BATTLE_TEST("Primal reversion triggers for all battlers if multiple faint DOUBLE_BATTLE_TEST("Primal reversion and other switch-in effects trigger for all battlers if multiple fainted the previous turn") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); - ASSUME(gMovesInfo[MOVE_EXPLOSION].target == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(gMovesInfo[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB); - ASSUME(gMovesInfo[MOVE_SPIKES].effect == EFFECT_SPIKES); - ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); + ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); + ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_CATERPIE) { HP(1); } PLAYER(SPECIES_SCRAFTY) { Ability(ABILITY_INTIMIDATE); } diff --git a/test/battle/form_change/ultra_burst.c b/test/battle/form_change/ultra_burst.c index 8eb21866f3..640db3f881 100644 --- a/test/battle/form_change/ultra_burst.c +++ b/test/battle/form_change/ultra_burst.c @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Ultra Burst affects turn order") DOUBLE_BATTLE_TEST("Ultra Burst happens after switching, but before Focus Punch-like Moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_FOCUS_PUNCH].effect == EFFECT_FOCUS_PUNCH); + ASSUME(GetMoveEffect(MOVE_FOCUS_PUNCH) == EFFECT_FOCUS_PUNCH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_NECROZMA_DUSK_MANE) { Item(ITEM_ULTRANECROZIUM_Z); } OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 6a753a92af..809e0f65d3 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -144,7 +144,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax expires after three turns and correctly co SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be flinched") { GIVEN { - ASSUME(gMovesInfo[MOVE_FAKE_OUT].effect == EFFECT_FIRST_TURN_ONLY); + ASSUME(GetMoveEffect(MOVE_FAKE_OUT) == EFFECT_FIRST_TURN_ONLY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -159,7 +159,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be flinched") SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by weight-based moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_HEAVY_SLAM].effect == EFFECT_HEAT_CRASH); + ASSUME(GetMoveEffect(MOVE_HEAVY_SLAM) == EFFECT_HEAT_CRASH); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -175,7 +175,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by weight-based mo SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by OHKO moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_FISSURE].effect == EFFECT_OHKO); + ASSUME(GetMoveEffect(MOVE_FISSURE) == EFFECT_OHKO); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_MACHAMP) { Ability(ABILITY_NO_GUARD); } } WHEN { @@ -206,8 +206,8 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are affected by Grudge") SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by phazing moves, but still take damage") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET); - ASSUME(gMovesInfo[MOVE_WHIRLWIND].effect == EFFECT_ROAR); + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); + ASSUME(GetMoveEffect(MOVE_WHIRLWIND) == EFFECT_ROAR); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -228,7 +228,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by phazing move SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by phazing moves but no block message is printed if they faint") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET); + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); PLAYER(SPECIES_WOBBUFFET) { HP(1); }; PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -576,7 +576,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot use Max Guard while holdi } } -// Almost anything that calculates gBattleMoveDamage based on HP has been changed to non-Dynamax HP. +// Almost anything that calculates damage based on HP has been changed to non-Dynamax HP. // This includes Leftovers, Life Orb, Heal Pulse, Rocky Helmet, Sandstorm, etc. etc. // There are some redundant cases (i.e Substitute) that can never be used by a Dynamaxed pokemon. // Anything that is conditional based off max HP still uses gBattleMons[battler].maxHP. @@ -588,7 +588,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Endeavor uses a Pokemon's non-Dynamax HP", s16 dam PARAMETRIZE { dynamax = GIMMICK_NONE; } PARAMETRIZE { dynamax = GIMMICK_DYNAMAX; } GIVEN { - ASSUME(gMovesInfo[MOVE_ENDEAVOR].effect == EFFECT_ENDEAVOR); + ASSUME(GetMoveEffect(MOVE_ENDEAVOR) == EFFECT_ENDEAVOR); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } } WHEN { @@ -607,7 +607,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Super Fang uses a Pokemon's non-Dynamax HP", s16 d PARAMETRIZE { dynamax = GIMMICK_NONE; } PARAMETRIZE { dynamax = GIMMICK_DYNAMAX; } GIVEN { - ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_SUPER_FANG); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { @@ -626,7 +626,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Pain Split uses a Pokemon's non-Dynamax HP", s16 d PARAMETRIZE { dynamax = GIMMICK_NONE; } PARAMETRIZE { dynamax = GIMMICK_DYNAMAX; } GIVEN { - ASSUME(gMovesInfo[MOVE_PAIN_SPLIT].effect == EFFECT_PAIN_SPLIT); + ASSUME(GetMoveEffect(MOVE_PAIN_SPLIT) == EFFECT_PAIN_SPLIT); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } } WHEN { @@ -665,7 +665,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Heal Pulse heals based on a Pokemon's non-Dynamax PARAMETRIZE { dynamax = GIMMICK_NONE; } PARAMETRIZE { dynamax = GIMMICK_DYNAMAX; } GIVEN { - ASSUME(gMovesInfo[MOVE_HEAL_PULSE].effect == EFFECT_HEAL_PULSE); + ASSUME(GetMoveEffect(MOVE_HEAL_PULSE) == EFFECT_HEAL_PULSE); PLAYER(SPECIES_WOBBUFFET) { HP(1); Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); Speed(100); } } WHEN { @@ -683,7 +683,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers single opponent's speed") { GIVEN { // Fails?: ASSUME(GetMaxMove(B_POSITION_PLAYER_LEFT, MOVE_TACKLE) == MOVE_MAX_STRIKE); - ASSUME(gMovesInfo[MOVE_MAX_STRIKE].argument == MAX_EFFECT_LOWER_SPEED); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } PLAYER(SPECIES_WOBBUFFET) { Speed(80); } } WHEN { @@ -707,7 +707,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers single opponent's speed") DOUBLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers both opponents' speed") { GIVEN { - ASSUME(gMovesInfo[MOVE_MAX_STRIKE].argument == MAX_EFFECT_LOWER_SPEED); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); PLAYER(SPECIES_WOBBUFFET) { Speed(80); } PLAYER(SPECIES_WOBBUFFET) { Speed(79); } OPPONENT(SPECIES_WOBBUFFET) {Speed(100); } @@ -744,9 +744,9 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Max Knuckle raises both allies' attack") { s16 damage[4]; GIVEN { - ASSUME(gMovesInfo[MOVE_MAX_KNUCKLE].argument == MAX_EFFECT_RAISE_TEAM_ATTACK); - ASSUME(gMovesInfo[MOVE_CLOSE_COMBAT].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_KNUCKLE, MOVE_EFFECT_RAISE_TEAM_ATTACK)); + ASSUME(GetMoveCategory(MOVE_CLOSE_COMBAT) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -786,7 +786,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Max Knuckle raises both allies' attack") SINGLE_BATTLE_TEST("(DYNAMAX) Max Flare sets up sunlight") { GIVEN { - ASSUME(gMovesInfo[MOVE_MAX_FLARE].argument == MAX_EFFECT_SUN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_FLARE, MOVE_EFFECT_SUN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -802,7 +802,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Flare sets up sunlight") SINGLE_BATTLE_TEST("(DYNAMAX) Max Geyser sets up heavy rain") { GIVEN { - ASSUME(gMovesInfo[MOVE_MAX_GEYSER].argument == MAX_EFFECT_RAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_GEYSER, MOVE_EFFECT_RAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -818,7 +818,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Geyser sets up heavy rain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Hailstorm sets up hail") { GIVEN { - ASSUME(gMovesInfo[MOVE_MAX_HAILSTORM].argument == MAX_EFFECT_HAIL); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_HAILSTORM, MOVE_EFFECT_HAIL)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -834,7 +834,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Hailstorm sets up hail") SINGLE_BATTLE_TEST("(DYNAMAX) Max Rockfall sets up a sandstorm") { GIVEN { - ASSUME(gMovesInfo[MOVE_MAX_ROCKFALL].argument == MAX_EFFECT_SANDSTORM); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_ROCKFALL, MOVE_EFFECT_SANDSTORM)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -851,7 +851,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Overgrowth sets up Grassy Terrain") { s32 maxHP = 490; // Because of recalculated stats upon Dynamaxing GIVEN { - ASSUME(gMovesInfo[MOVE_MAX_OVERGROWTH].argument == MAX_EFFECT_GRASSY_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_OVERGROWTH, MOVE_EFFECT_GRASSY_TERRAIN)); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; @@ -871,7 +871,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Overgrowth sets up Grassy Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Mindstorm sets up Psychic Terrain") { GIVEN { - ASSUME(gMovesInfo[MOVE_MAX_MINDSTORM].argument == MAX_EFFECT_PSYCHIC_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_MINDSTORM, MOVE_EFFECT_PSYCHIC_TERRAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -888,7 +888,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Mindstorm sets up Psychic Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Lightning sets up Electric Terrain") { GIVEN { - ASSUME(gMovesInfo[MOVE_MAX_LIGHTNING].argument == MAX_EFFECT_ELECTRIC_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_LIGHTNING, MOVE_EFFECT_ELECTRIC_TERRAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -903,7 +903,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Lightning sets up Electric Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Starfall sets up Misty Terrain") { GIVEN { - ASSUME(gMovesInfo[MOVE_MAX_STARFALL].argument == MAX_EFFECT_MISTY_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STARFALL, MOVE_EFFECT_MISTY_TERRAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -918,7 +918,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Starfall sets up Misty Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Stonesurge sets up Stealth Rocks") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_STONESURGE].argument == MAX_EFFECT_STEALTH_ROCK); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STONESURGE, MOVE_EFFECT_STEALTH_ROCK)); PLAYER(SPECIES_DREDNAW) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -938,7 +938,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Stonesurge sets up Stealth Rocks") SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Steelsurge sets up sharp steel") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_STEELSURGE].argument == MAX_EFFECT_STEELSURGE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STEELSURGE, MOVE_EFFECT_STEELSURGE)); PLAYER(SPECIES_COPPERAJAH) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_HATTERENE); @@ -969,7 +969,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Hydrosnipe has fixed power and ignores abili PARAMETRIZE { move = MOVE_WATER_GUN; } PARAMETRIZE { move = MOVE_HYDRO_CANNON; } GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_HYDROSNIPE].argument == MAX_EFFECT_FIXED_POWER); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_HYDROSNIPE, MOVE_EFFECT_FIXED_POWER)); PLAYER(SPECIES_INTELEON) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_ARCTOVISH) { Ability(ABILITY_WATER_ABSORB); } } WHEN { @@ -985,7 +985,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Hydrosnipe has fixed power and ignores abili DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Volt Crash paralyzes both opponents") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_VOLT_CRASH].argument == MAX_EFFECT_PARALYZE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_VOLT_CRASH, MOVE_EFFECT_PARALYZE_SIDE)); PLAYER(SPECIES_PIKACHU) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_PICHU); OPPONENT(SPECIES_WOBBUFFET); @@ -1012,7 +1012,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock paralyzes or poisons both opponen PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = STATUS1_PARALYSIS; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = STATUS1_POISON; } GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_STUN_SHOCK].argument == MAX_EFFECT_POISON_PARALYZE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STUN_SHOCK, MOVE_EFFECT_POISON_PARALYZE_SIDE)); PLAYER(SPECIES_TOXTRICITY) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_TOXEL); OPPONENT(SPECIES_WOBBUFFET); @@ -1049,7 +1049,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock paralyzes or poisons both opponen DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock chooses statuses before considering immunities") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_STUN_SHOCK].argument == MAX_EFFECT_POISON_PARALYZE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STUN_SHOCK, MOVE_EFFECT_POISON_PARALYZE_SIDE)); PLAYER(SPECIES_TOXTRICITY) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_TOXEL); OPPONENT(SPECIES_GARBODOR); @@ -1082,7 +1082,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Befuddle paralyzes, poisons, or sleeps both PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = STATUS1_POISON; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = STATUS1_SLEEP; } GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_BEFUDDLE].argument == MAX_EFFECT_EFFECT_SPORE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_BEFUDDLE, MOVE_EFFECT_EFFECT_SPORE_SIDE)); PLAYER(SPECIES_BUTTERFREE) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_CATERPIE); OPPONENT(SPECIES_WOBBUFFET); @@ -1126,7 +1126,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Befuddle paralyzes, poisons, or sleeps both DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Gold Rush confuses both opponents and generates money") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_GOLD_RUSH].argument == MAX_EFFECT_CONFUSE_FOES_PAY_DAY); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_GOLD_RUSH, MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE)); PLAYER(SPECIES_MEOWTH) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_PERSIAN); OPPONENT(SPECIES_WOBBUFFET); @@ -1146,7 +1146,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Gold Rush confuses both opponents and genera DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Smite confuses both opponents") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_SMITE].argument == MAX_EFFECT_CONFUSE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SMITE, MOVE_EFFECT_CONFUSE_SIDE)); PLAYER(SPECIES_HATTERENE) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_HATENNA); OPPONENT(SPECIES_WOBBUFFET); @@ -1165,7 +1165,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Smite confuses both opponents") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Cuddle infatuates both opponents, if possible") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_CUDDLE].argument == MAX_EFFECT_INFATUATE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CUDDLE, MOVE_EFFECT_INFATUATE_SIDE)); PLAYER(SPECIES_EEVEE) { Gender(MON_MALE); GigantamaxFactor(TRUE); } PLAYER(SPECIES_EEVEE); OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); } @@ -1186,7 +1186,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Cuddle infatuates both opponents, if possibl DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_TERROR].argument == MAX_EFFECT_MEAN_LOOK); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_TERROR, MOVE_EFFECT_PREVENT_ESCAPE_SIDE)); PLAYER(SPECIES_GENGAR) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_GASTLY); OPPONENT(SPECIES_WOBBUFFET); @@ -1205,7 +1205,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") SINGLE_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention effect") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_TERROR].argument == MAX_EFFECT_MEAN_LOOK); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_TERROR, MOVE_EFFECT_PREVENT_ESCAPE_SIDE)); PLAYER(SPECIES_GENGAR) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -1222,7 +1222,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Meltdown torments both opponents for 3 turns") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_MELTDOWN].argument == MAX_EFFECT_TORMENT_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_MELTDOWN, MOVE_EFFECT_TORMENT_SIDE)); PLAYER(SPECIES_MELMETAL) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_MELTAN); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_CELEBRATE); } @@ -1259,7 +1259,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Wildfire sets a field effect that damages no { s16 damage; GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_WILDFIRE].argument == MAX_EFFECT_WILDFIRE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_WILDFIRE, MOVE_EFFECT_WILDFIRE)); PLAYER(SPECIES_CHARIZARD) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_CHARMANDER); OPPONENT(SPECIES_WOBBUFFET) { HP(600); MaxHP(600); } @@ -1305,7 +1305,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Replenish recycles allies' berries 50\% of t { PASSES_RANDOMLY(1, 2, RNG_G_MAX_REPLENISH); GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_REPLENISH].argument == MAX_EFFECT_RECYCLE_BERRIES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_REPLENISH, MOVE_EFFECT_RECYCLE_BERRIES)); PLAYER(SPECIES_SNORLAX) { Item(ITEM_APICOT_BERRY); GigantamaxFactor(TRUE); } PLAYER(SPECIES_MUNCHLAX) { Item(ITEM_APICOT_BERRY); Ability(ABILITY_THICK_FAT); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_APICOT_BERRY); } @@ -1333,8 +1333,8 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Snooze makes only the target drowsy") { PASSES_RANDOMLY(1, 2, RNG_G_MAX_SNOOZE); GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_SNOOZE].argument == MAX_EFFECT_YAWN_FOE); - ASSUME(gMovesInfo[MOVE_DARK_PULSE].category == DAMAGE_CATEGORY_SPECIAL); // Otherwise, Blissey faints. + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SNOOZE, MOVE_EFFECT_YAWN_FOE)); + ASSUME(GetMoveCategory(MOVE_DARK_PULSE) == DAMAGE_CATEGORY_SPECIAL); // Otherwise, Blissey faints. PLAYER(SPECIES_GRIMMSNARL) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_IMPIDIMP); OPPONENT(SPECIES_BLISSEY); @@ -1357,7 +1357,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Finale heals allies by 1/6 of their health") { s16 damage1, damage2; GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_FINALE].argument == MAX_EFFECT_HEAL_TEAM); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_FINALE, MOVE_EFFECT_HEAL_TEAM)); PLAYER(SPECIES_ALCREMIE) { HP(1); GigantamaxFactor(TRUE); } PLAYER(SPECIES_MILCERY) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -1376,10 +1376,15 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Finale heals allies by 1/6 of their health") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") { + u32 j; GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_SWEETNESS].argument == MAX_EFFECT_AROMATHERAPY); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SWEETNESS, MOVE_EFFECT_AROMATHERAPY)); PLAYER(SPECIES_APPLETUN) { Status1(STATUS1_POISON); GigantamaxFactor(TRUE); } PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -1387,9 +1392,10 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") } SCENE { MESSAGE("Appletun used G-Max Sweetness!"); STATUS_ICON(playerLeft, none: TRUE); - MESSAGE("Appletun's status returned to normal!"); STATUS_ICON(playerRight, none: TRUE); - MESSAGE("Applin's status returned to normal!"); + } THEN { + for (j = 0; j < PARTY_SIZE; j++) + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_STATUS), STATUS1_NONE); } } @@ -1397,7 +1403,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Centiferno traps both opponents in Fire Spin") { GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_CENTIFERNO].argument == MAX_EFFECT_FIRE_SPIN_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CENTIFERNO, MOVE_EFFECT_FIRE_SPIN_SIDE)); PLAYER(SPECIES_CENTISKORCH) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_SIZZLIPEDE); PLAYER(SPECIES_SIZZLIPEDE); @@ -1426,7 +1432,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Chi Strike boosts allies' crit chance by 1 s u32 j; GIVEN { ASSUME(B_CRIT_CHANCE >= GEN_6); - ASSUME(gMovesInfo[MOVE_G_MAX_CHI_STRIKE].argument == MAX_EFFECT_CRIT_PLUS); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CHI_STRIKE, MOVE_EFFECT_CRIT_PLUS_SIDE)); PLAYER(SPECIES_MACHAMP) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_MACHOP); OPPONENT(SPECIES_WOBBUFFET); @@ -1457,12 +1463,13 @@ TO_DO_BATTLE_TEST("(DYNAMAX) Baton Pass doesn't pass G-Max Chi Strike's effect") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Depletion takes away 2 PP from the target's last move") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_CLAW].category == DAMAGE_CATEGORY_PHYSICAL); // Otherwise Sableye faints. - ASSUME(gMovesInfo[MOVE_G_MAX_DEPLETION].argument == MAX_EFFECT_SPITE); + ASSUME(GetMoveCategory(MOVE_DRAGON_CLAW) == DAMAGE_CATEGORY_PHYSICAL); // Otherwise Sableye faints. + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_DEPLETION, MOVE_EFFECT_SPITE)); + ASSUME(GetMovePP(MOVE_CELEBRATE) >= 3); PLAYER(SPECIES_DURALUDON) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_WYNAUT); // Dynamax behaves weird with test turn order because stats are recalculated. - OPPONENT(SPECIES_SABLEYE) { Ability(ABILITY_PRANKSTER); } + OPPONENT(SPECIES_SABLEYE) { Ability(ABILITY_PRANKSTER); Moves(MOVE_CELEBRATE); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(playerLeft, MOVE_DRAGON_CLAW, target: opponentLeft, gimmick: GIMMICK_DYNAMAX); } @@ -1470,6 +1477,8 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Depletion takes away 2 PP from the target's MESSAGE("The opposing Sableye used Celebrate!"); MESSAGE("Duraludon used G-Max Depletion!"); MESSAGE("The opposing Sableye's PP was reduced!"); + } THEN { + EXPECT_EQ(opponentLeft->pp[0], GetMovePP(MOVE_CELEBRATE) - 3); // 1 from regular use + 2 from G-Max Depletion } } @@ -1480,7 +1489,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max One Blow bypasses Max Guard for full damage" PARAMETRIZE { protect = TRUE; } PARAMETRIZE { protect = FALSE; } GIVEN { - ASSUME(gMovesInfo[MOVE_G_MAX_ONE_BLOW].argument == MAX_EFFECT_BYPASS_PROTECT); + ASSUME(MoveIgnoresProtect(MOVE_G_MAX_RAPID_FLOW)); PLAYER(SPECIES_URSHIFU) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_KUBFU); OPPONENT(SPECIES_WOBBUFFET); @@ -1503,6 +1512,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max One Blow bypasses Max Guard for full damage" } // Bug Testing +// This test will fail if it's the first test a thread runs DOUBLE_BATTLE_TEST("(DYNAMAX) Max Flare doesn't softlock the game when fainting player partner") { GIVEN { @@ -1537,7 +1547,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't execute effects on fainted battler SINGLE_BATTLE_TEST("(DYNAMAX) Moxie clones can be triggered by Max Moves fainting opponents") { GIVEN { - ASSUME(gMovesInfo[MOVE_WATERFALL].power > 0); + ASSUME(GetMovePower(MOVE_WATERFALL) > 0); PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_MOXIE); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WYNAUT); @@ -1578,11 +1588,11 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass absorbing abilities") PARAMETRIZE { move = MOVE_VINE_WHIP; ability = ABILITY_SAP_SIPPER; species = SPECIES_MILTANK; } GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); - ASSUME(gMovesInfo[MOVE_SPARK].type == TYPE_ELECTRIC); - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_MUD_BOMB].type == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_VINE_WHIP].type == TYPE_GRASS); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); + ASSUME(GetMoveType(MOVE_SPARK) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_MUD_BOMB) == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_VINE_WHIP) == TYPE_GRASS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { diff --git a/test/battle/gimmick/terastal.c b/test/battle/gimmick/terastal.c index 42c495829d..7ea75c3e4a 100644 --- a/test/battle/gimmick/terastal.c +++ b/test/battle/gimmick/terastal.c @@ -92,7 +92,7 @@ SINGLE_BATTLE_TEST("(TERA) Terastallizing boosts moves of the same type to 60 BP PARAMETRIZE { tera = GIMMICK_NONE; } PARAMETRIZE { tera = GIMMICK_TERA; } GIVEN { - ASSUME(gMovesInfo[MOVE_ABSORB].power == 20); + ASSUME(GetMovePower(MOVE_ABSORB) == 20); PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_GRASS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -113,7 +113,7 @@ SINGLE_BATTLE_TEST("(TERA) Terastallization's 60 BP floor occurs after Technicia PARAMETRIZE { tera = GIMMICK_NONE; } PARAMETRIZE { tera = GIMMICK_TERA; } GIVEN { - ASSUME(gMovesInfo[MOVE_MEGA_DRAIN].power == 40); + ASSUME(GetMovePower(MOVE_MEGA_DRAIN) == 40); PLAYER(SPECIES_MR_MIME) { Ability(ABILITY_TECHNICIAN); TeraType(TYPE_GRASS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -192,7 +192,7 @@ SINGLE_BATTLE_TEST("(TERA) Terastallization's 60 BP floor does not apply to dyna PARAMETRIZE { tera = GIMMICK_NONE; } PARAMETRIZE { tera = GIMMICK_TERA; } GIVEN { - ASSUME(gMovesInfo[MOVE_WATER_SPOUT].effect == EFFECT_POWER_BASED_ON_USER_HP); + ASSUME(GetMoveEffect(MOVE_WATER_SPOUT) == EFFECT_POWER_BASED_ON_USER_HP); PLAYER(SPECIES_WOBBUFFET) { HP(1); TeraType(TYPE_WATER); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -412,7 +412,7 @@ SINGLE_BATTLE_TEST("(TERA) Double Shock does not remove the user's Electric type { s16 damage[4]; GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_SHOCK].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE); + ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE); PLAYER(SPECIES_PICHU) { TeraType(TYPE_ELECTRIC); } PLAYER(SPECIES_WOBBUFFET) OPPONENT(SPECIES_WOBBUFFET); @@ -627,8 +627,8 @@ SINGLE_BATTLE_TEST("(TERA) Terastallizing into the Stellar type boosts all moves { s16 damage[4]; GIVEN { - ASSUME(gMovesInfo[MOVE_MEGA_DRAIN].power == 40); - ASSUME(gMovesInfo[MOVE_BUBBLE].power == 40); + ASSUME(GetMovePower(MOVE_MEGA_DRAIN) == 40); + ASSUME(GetMovePower(MOVE_BUBBLE) == 40); PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -707,7 +707,7 @@ SINGLE_BATTLE_TEST("(TERA) Stellar type's one-time boost factors in dynamically- { s16 damage[4]; GIVEN { - ASSUME(gMovesInfo[MOVE_WEATHER_BALL].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL); PLAYER(SPECIES_PELIPPER) { Ability(ABILITY_DRIZZLE); TeraType(TYPE_STELLAR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -750,8 +750,8 @@ SINGLE_BATTLE_TEST("(TERA) Terapagos retains the Stellar type boost at all times PARAMETRIZE { move = MOVE_TACKLE; } PARAMETRIZE { move = MOVE_MACH_PUNCH; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_MACH_PUNCH].type != TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_MACH_PUNCH) != TYPE_NORMAL); PLAYER(SPECIES_TERAPAGOS); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index e0716f9495..4ab84eb389 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -6,7 +6,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves do not retain priority") { GIVEN { - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves do not retain priority") SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves are not affected by -ate abilities") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING); PLAYER(SPECIES_AURORUS) { Ability(ABILITY_REFRIGERATE); Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_SWELLOW); @@ -38,8 +38,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves are not affected by -ate abilities") SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves are affected by Ion Deluge") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_ION_DELUGE].effect == EFFECT_ION_DELUGE); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(GetMoveEffect(MOVE_ION_DELUGE) == EFFECT_ION_DELUGE); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_SWELLOW); } WHEN { @@ -57,8 +57,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves deal 1/4 damage through protect", s16 damag PARAMETRIZE { protected = TRUE; } PARAMETRIZE { protected = FALSE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_PROTECT].effect == EFFECT_PROTECT); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(GetMoveEffect(MOVE_PROTECT) == EFFECT_PROTECT); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -77,7 +77,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves deal 1/4 damage through protect", s16 damag SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_RESET_STATS clears a battler's negative stat stages") { GIVEN { - ASSUME(gMovesInfo[MOVE_LEECH_SEED].zMove.effect == Z_EFFECT_RESET_STATS); + ASSUME(GetMoveZEffect(MOVE_LEECH_SEED) == Z_EFFECT_RESET_STATS); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRASSIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -96,8 +96,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_RESET_STATS clears a battler's negative st SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_ALL_STATS_UP raises all of a battler's stat stages by one") { GIVEN { - ASSUME(gMovesInfo[MOVE_CELEBRATE].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_CELEBRATE].zMove.effect == Z_EFFECT_ALL_STATS_UP_1); + ASSUME(GetMoveType(MOVE_CELEBRATE) == TYPE_NORMAL); + ASSUME(GetMoveZEffect(MOVE_CELEBRATE) == Z_EFFECT_ALL_STATS_UP_1); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -118,8 +118,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_BOOST_CRITS raises a battler's critical hi { PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); GIVEN { - ASSUME(gMovesInfo[MOVE_FORESIGHT].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_FORESIGHT].zMove.effect == Z_EFFECT_BOOST_CRITS); + ASSUME(GetMoveType(MOVE_FORESIGHT) == TYPE_NORMAL); + ASSUME(GetMoveZEffect(MOVE_FORESIGHT) == Z_EFFECT_BOOST_CRITS); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -136,8 +136,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_BOOST_CRITS raises a battler's critical hi DOUBLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_FOLLOW_ME redirects attacks to the user") { GIVEN { - ASSUME(gMovesInfo[MOVE_DESTINY_BOND].type == TYPE_GHOST); - ASSUME(gMovesInfo[MOVE_DESTINY_BOND].zMove.effect == Z_EFFECT_FOLLOW_ME); + ASSUME(GetMoveType(MOVE_DESTINY_BOND) == TYPE_GHOST); + ASSUME(GetMoveZEffect(MOVE_DESTINY_BOND) == Z_EFFECT_FOLLOW_ME); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GHOSTIUM_Z); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -157,8 +157,8 @@ DOUBLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_FOLLOW_ME redirects attacks to the user") SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_RESTORE_REPLACEMENT_HP fully heals the replacement battler's HP") { GIVEN { - ASSUME(gMovesInfo[MOVE_PARTING_SHOT].type == TYPE_DARK); - ASSUME(gMovesInfo[MOVE_PARTING_SHOT].zMove.effect == Z_EFFECT_RESTORE_REPLACEMENT_HP); + ASSUME(GetMoveType(MOVE_PARTING_SHOT) == TYPE_DARK); + ASSUME(GetMoveZEffect(MOVE_PARTING_SHOT) == Z_EFFECT_RESTORE_REPLACEMENT_HP); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_DARKINIUM_Z); } PLAYER(SPECIES_WYNAUT) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -181,11 +181,11 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_CURSE activates Z_EFFECT_RECOVER_HP or Z_E PARAMETRIZE { species = SPECIES_WOBBUFFET; } PARAMETRIZE { species = SPECIES_DUSCLOPS; } GIVEN { - ASSUME(gMovesInfo[MOVE_CURSE].type == TYPE_GHOST); + ASSUME(GetMoveType(MOVE_CURSE) == TYPE_GHOST); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_GHOST); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_GHOST); ASSUME(gSpeciesInfo[SPECIES_DUSCLOPS].types[0] == TYPE_GHOST); - ASSUME(gMovesInfo[MOVE_CURSE].zMove.effect == Z_EFFECT_CURSE); + ASSUME(GetMoveZEffect(MOVE_CURSE) == Z_EFFECT_CURSE); PLAYER(species) { Item(ITEM_GHOSTIUM_Z); HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -218,8 +218,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_CURSE activates Z_EFFECT_RECOVER_HP or Z_E SINGLE_BATTLE_TEST("(Z-MOVE) Z-Mirror Move raises the user's attack by two stages and copies the last used non-status move as a Z-Move") { GIVEN { - ASSUME(gMovesInfo[MOVE_MIRROR_MOVE].type == TYPE_FLYING); - ASSUME(gMovesInfo[MOVE_MIRROR_MOVE].zMove.effect == Z_EFFECT_ATK_UP_2); + ASSUME(GetMoveType(MOVE_MIRROR_MOVE) == TYPE_FLYING); + ASSUME(GetMoveZEffect(MOVE_MIRROR_MOVE) == Z_EFFECT_ATK_UP_2); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FLYINIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -240,8 +240,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Mirror Move raises the user's attack by two stage SINGLE_BATTLE_TEST("(Z-MOVE) Z-Mirror Move raises the user's attack by two stages and copies the last used status move regularly") { GIVEN { - ASSUME(gMovesInfo[MOVE_MIRROR_MOVE].type == TYPE_FLYING); - ASSUME(gMovesInfo[MOVE_MIRROR_MOVE].zMove.effect == Z_EFFECT_ATK_UP_2); + ASSUME(GetMoveType(MOVE_MIRROR_MOVE) == TYPE_FLYING); + ASSUME(GetMoveZEffect(MOVE_MIRROR_MOVE) == Z_EFFECT_ATK_UP_2); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FLYINIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -259,8 +259,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Mirror Move raises the user's attack by two stage SINGLE_BATTLE_TEST("(Z-MOVE) Z-Copycat raises the user's accuracy by one stage and copies the last used non-status move as a Z-Move") { GIVEN { - ASSUME(gMovesInfo[MOVE_COPYCAT].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_COPYCAT].zMove.effect == Z_EFFECT_ACC_UP_1); + ASSUME(GetMoveType(MOVE_COPYCAT) == TYPE_NORMAL); + ASSUME(GetMoveZEffect(MOVE_COPYCAT) == Z_EFFECT_ACC_UP_1); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -281,8 +281,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Me First raises the user's speed by two stages an PARAMETRIZE { meFirst = TRUE; } PARAMETRIZE { meFirst = FALSE; } GIVEN { - ASSUME(gMovesInfo[MOVE_ME_FIRST].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_ME_FIRST].zMove.effect == Z_EFFECT_SPD_UP_2); + ASSUME(GetMoveType(MOVE_ME_FIRST) == TYPE_NORMAL); + ASSUME(GetMoveZEffect(MOVE_ME_FIRST) == Z_EFFECT_SPD_UP_2); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -313,7 +313,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Nature Power transforms into different Z-Moves ba PARAMETRIZE { terrainMove = MOVE_GRASSY_TERRAIN; zMove = gTypesInfo[TYPE_GRASS].zMove; } PARAMETRIZE { terrainMove = MOVE_MISTY_TERRAIN; zMove = gTypesInfo[TYPE_FAIRY].zMove; } GIVEN { - ASSUME(gMovesInfo[MOVE_NATURE_POWER].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_NATURE_POWER) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -334,7 +334,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Hidden Power always transforms into Breakneck Bli PARAMETRIZE { iv = 21; } PARAMETRIZE { iv = 31; } GIVEN { - ASSUME(gMovesInfo[MOVE_HIDDEN_POWER].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_HIDDEN_POWER) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); AttackIV(iv); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -354,7 +354,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Weather Ball transforms into different Z-Moves ba PARAMETRIZE { weatherMove = MOVE_SANDSTORM; zMove = gTypesInfo[TYPE_ROCK].zMove; } PARAMETRIZE { weatherMove = MOVE_HAIL; zMove = gTypesInfo[TYPE_ICE].zMove; } GIVEN { - ASSUME(gMovesInfo[MOVE_WEATHER_BALL].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -370,7 +370,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Weather Ball transforms into different Z-Moves ba SINGLE_BATTLE_TEST("(Z-MOVE) Z-Sleep Talk transforms a used non-status move into a Z-Move") { GIVEN { - ASSUME(gMovesInfo[MOVE_SLEEP_TALK].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_SLEEP_TALK) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_ABSORB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -385,7 +385,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Sleep Talk transforms a used non-status move into SINGLE_BATTLE_TEST("(Z-MOVE) Z-Sleep Talk turns Weather Ball into Breakneck Blitz even under rain") { GIVEN { - ASSUME(gMovesInfo[MOVE_SLEEP_TALK].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_SLEEP_TALK) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_WEATHER_BALL); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -400,7 +400,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Sleep Talk turns Weather Ball into Breakneck Blit SINGLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves and deals 25% of maximum HP to the user") { GIVEN { - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FIRIUM_Z); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -417,8 +417,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves and deals 25% of ma DOUBLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves (from Z-Mirror Move)") { GIVEN { - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_MIRROR_MOVE].type == TYPE_FLYING); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_MIRROR_MOVE) == TYPE_FLYING); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FLYINIUM_Z); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -436,8 +436,8 @@ DOUBLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves (from Z-Mirror Move SINGLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves but not boosts granted") { GIVEN { - ASSUME(gMovesInfo[MOVE_WILL_O_WISP].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_WILL_O_WISP].zMove.effect == Z_EFFECT_ATK_UP_1); + ASSUME(GetMoveType(MOVE_WILL_O_WISP) == TYPE_FIRE); + ASSUME(GetMoveZEffect(MOVE_WILL_O_WISP) == Z_EFFECT_ATK_UP_1); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FIRIUM_Z); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -455,7 +455,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Powder blocks Fire type Z-Moves but not boosts gran DOUBLE_BATTLE_TEST("(Z-MOVE) Instruct fails if the target last used a Z-Move") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -474,7 +474,7 @@ DOUBLE_BATTLE_TEST("(Z-MOVE) Instruct fails if the target last used a Z-Move") DOUBLE_BATTLE_TEST("(Z-MOVE) Dancer does not use a Z-Move if the battler has used a Z-Move the same turn") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_DANCER); Item(ITEM_NORMALIUM_Z); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -498,7 +498,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Light That Burns the Sky uses the battler's highest PARAMETRIZE { useSwordsDance = FALSE; } PARAMETRIZE { useSwordsDance = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); PLAYER(SPECIES_NECROZMA_DUSK_MANE) { Item(ITEM_ULTRANECROZIUM_Z); } OPPONENT(SPECIES_WOBBUFFET) { HP(1000); MaxHP(1000); }; // hits hard lol } WHEN { @@ -527,7 +527,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) 10,000,000 Volt Thunderbolt has an increased critic PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_10_000_000_VOLT_THUNDERBOLT].criticalHitStage == 2); + ASSUME(GetMoveCriticalHitStage(MOVE_10_000_000_VOLT_THUNDERBOLT) == 2); ASSUME(gSpeciesInfo[SPECIES_PIKACHU_PARTNER].baseSpeed == 90); PLAYER(SPECIES_PIKACHU_PARTNER) { Item(ITEM_PIKASHUNIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); @@ -543,7 +543,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) 10,000,000 Volt Thunderbolt has an increased critic SINGLE_BATTLE_TEST("(Z-MOVE) Stoked Sparksurfer paralyzes the target") { GIVEN { - ASSUME(gMovesInfo[MOVE_STOKED_SPARKSURFER].additionalEffects[0].moveEffect == MOVE_EFFECT_PARALYSIS); + ASSUME(GetMoveAdditionalEffectById(MOVE_STOKED_SPARKSURFER, 0)->moveEffect == MOVE_EFFECT_PARALYSIS); PLAYER(SPECIES_RAICHU_ALOLA) { Item(ITEM_ALORAICHIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -558,7 +558,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Stoked Sparksurfer paralyzes the target") SINGLE_BATTLE_TEST("(Z-MOVE) Extreme Evoboost boosts all the user's stats by two stages") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXTREME_EVOBOOST].effect == EFFECT_EXTREME_EVOBOOST); + ASSUME(GetMoveEffect(MOVE_EXTREME_EVOBOOST) == EFFECT_EXTREME_EVOBOOST); PLAYER(SPECIES_EEVEE) { Item(ITEM_EEVIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -578,7 +578,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Extreme Evoboost boosts all the user's stats by two SINGLE_BATTLE_TEST("(Z-MOVE) Genesis Supernova sets up psychic terrain") { GIVEN { - ASSUME(gMovesInfo[MOVE_GENESIS_SUPERNOVA].effect == EFFECT_HIT_SET_REMOVE_TERRAIN); + ASSUME(GetMoveEffect(MOVE_GENESIS_SUPERNOVA) == EFFECT_HIT_SET_REMOVE_TERRAIN); PLAYER(SPECIES_MEW) { Item(ITEM_MEWNIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -595,7 +595,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Genesis Supernova sets up psychic terrain") SINGLE_BATTLE_TEST("(Z-MOVE) Splintered Stormshards removes terrain") { GIVEN { - ASSUME(gMovesInfo[MOVE_SPLINTERED_STORMSHARDS].effect == EFFECT_HIT_SET_REMOVE_TERRAIN); + ASSUME(GetMoveEffect(MOVE_SPLINTERED_STORMSHARDS) == EFFECT_HIT_SET_REMOVE_TERRAIN); PLAYER(SPECIES_LYCANROC_DUSK) { Item(ITEM_LYCANIUM_Z); } OPPONENT(SPECIES_TAPU_LELE) { Ability(ABILITY_PSYCHIC_SURGE); HP(1000); MaxHP(1000); } } WHEN { @@ -613,7 +613,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Splintered Stormshards removes terrain") SINGLE_BATTLE_TEST("(Z-MOVE) Clangorous Soulblaze boosts all the user's stats by one stage") { GIVEN { - ASSUME(gMovesInfo[MOVE_CLANGOROUS_SOULBLAZE].additionalEffects[0].moveEffect == MOVE_EFFECT_ALL_STATS_UP); + ASSUME(GetMoveAdditionalEffectById(MOVE_CLANGOROUS_SOULBLAZE, 0)->moveEffect == MOVE_EFFECT_ALL_STATS_UP); PLAYER(SPECIES_KOMMO_O) { Item(ITEM_KOMMONIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -633,7 +633,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Clangorous Soulblaze boosts all the user's stats by SINGLE_BATTLE_TEST("(Z-MOVE) Guardian of Alola deals 75\% of the target's current HP") { GIVEN { - ASSUME(gMovesInfo[MOVE_GUARDIAN_OF_ALOLA].effect == EFFECT_GUARDIAN_OF_ALOLA); + ASSUME(GetMoveEffect(MOVE_GUARDIAN_OF_ALOLA) == EFFECT_GUARDIAN_OF_ALOLA); PLAYER(SPECIES_TAPU_FINI) { Item(ITEM_TAPUNIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -669,7 +669,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Revelation Dance always transforms into Breakneck PARAMETRIZE { species = SPECIES_ORICORIO_POM_POM; } PARAMETRIZE { species = SPECIES_ORICORIO_SENSU; } GIVEN { - ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_REVELATION_DANCE) == TYPE_NORMAL); PLAYER(species) { Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/air_balloon.c b/test/battle/hold_effect/air_balloon.c index c99423edc1..cb06743e4c 100644 --- a/test/battle/hold_effect/air_balloon.c +++ b/test/battle/hold_effect/air_balloon.c @@ -4,9 +4,9 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_AIR_BALLOON].holdEffect == HOLD_EFFECT_AIR_BALLOON); - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].type == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE); + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_GROUND); + ASSUME(GetMoveEffect(MOVE_RECYCLE) == EFFECT_RECYCLE); } SINGLE_BATTLE_TEST("Air Balloon prevents the holder from taking damage from ground type moves") diff --git a/test/battle/hold_effect/attack_up.c b/test/battle/hold_effect/attack_up.c index 383e564ce6..63203e588a 100644 --- a/test/battle/hold_effect/attack_up.c +++ b/test/battle/hold_effect/attack_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_LIECHI_BERRY].holdEffect == HOLD_EFFECT_ATTACK_UP); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Liechi Berry raises the holder's Attack by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/berserk_gene.c b/test/battle/hold_effect/berserk_gene.c index 59f78c1a12..1ff601fc83 100644 --- a/test/battle/hold_effect/berserk_gene.c +++ b/test/battle/hold_effect/berserk_gene.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Berserk Gene sharply raises attack at the start of a single PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BERSERK_GENE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -37,7 +37,7 @@ DOUBLE_BATTLE_TEST("Berserk Gene sharply raises attack at the start of a double PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BERSERK_GENE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WOBBUFFET) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); @@ -64,7 +64,7 @@ SINGLE_BATTLE_TEST("Berserk Gene activates on switch in", s16 damage) PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BERSERK_GENE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WOBBUFFET) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); @@ -91,7 +91,7 @@ SINGLE_BATTLE_TEST("Berserk Gene does not confuse a Pokemon with Own Tempo but s PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BERSERK_GENE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_SLOWBRO) { Ability(ABILITY_OWN_TEMPO); Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -122,7 +122,7 @@ DOUBLE_BATTLE_TEST("Berserk Gene does not confuse a Pokemon with Own Tempo but s PARAMETRIZE { item = ITEM_BERSERK_GENE; positionLeft = TRUE; } PARAMETRIZE { item = ITEM_BERSERK_GENE; positionLeft = FALSE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); if (positionLeft) { PLAYER(SPECIES_SLOWBRO) { Ability(ABILITY_OWN_TEMPO); Item(item); } PLAYER(SPECIES_WOBBUFFET); @@ -156,7 +156,7 @@ DOUBLE_BATTLE_TEST("Berserk Gene does not confuse a Pokemon with Own Tempo but s SINGLE_BATTLE_TEST("Berserk Gene does not confuse on Misty Terrain but still raises attack sharply") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_TAPU_FINI) { Ability(ABILITY_MISTY_SURGE); Item(ITEM_BERSERK_GENE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/blunder_policy.c b/test/battle/hold_effect/blunder_policy.c index 552ad2f6fb..e9215b3eb2 100644 --- a/test/battle/hold_effect/blunder_policy.c +++ b/test/battle/hold_effect/blunder_policy.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Blunder Policy raises the users speed by 2 stages if the use { PASSES_RANDOMLY(3, 10, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_FOCUS_BLAST].accuracy == 70); + ASSUME(GetMoveAccuracy(MOVE_FOCUS_BLAST) == 70); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_BLUNDER_POLICY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Blunder Policy will never trigger if the move fails due to a { PASSES_RANDOMLY(10, 10, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_FOCUS_BLAST].accuracy == 70); + ASSUME(GetMoveAccuracy(MOVE_FOCUS_BLAST) == 70); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_BLUNDER_POLICY); } OPPONENT(SPECIES_GASTLY); } WHEN { @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Blunder Policy will never trigger if the move fails due to P { PASSES_RANDOMLY(10, 10, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_FOCUS_BLAST].accuracy == 70); + ASSUME(GetMoveAccuracy(MOVE_FOCUS_BLAST) == 70); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_BLUNDER_POLICY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/booster_energy.c b/test/battle/hold_effect/booster_energy.c index 072eb8df60..f6f44a272c 100644 --- a/test/battle/hold_effect/booster_energy.c +++ b/test/battle/hold_effect/booster_energy.c @@ -143,7 +143,7 @@ SINGLE_BATTLE_TEST("Booster Energy increases special attack by 30% if it is the PARAMETRIZE { species = SPECIES_IRON_MOTH; ability = ABILITY_QUARK_DRIVE; item = ITEM_BOOSTER_ENERGY; } GIVEN { - ASSUME(gMovesInfo[MOVE_ROUND].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); PLAYER(species) { Attack(100); Defense(100); Speed(100); SpAttack(110); SpDefense(100); Ability(ability); Item(item); } OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }; } WHEN { @@ -169,7 +169,7 @@ SINGLE_BATTLE_TEST("Booster Energy increases special defense by 30% if it is the PARAMETRIZE { species = SPECIES_IRON_MOTH; ability = ABILITY_QUARK_DRIVE; item = ITEM_BOOSTER_ENERGY; } GIVEN { - ASSUME(gMovesInfo[MOVE_ROUND].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); PLAYER(species) { Attack(100); Defense(100); Speed(100); SpAttack(100); SpDefense(110); Ability(ability); Item(item); } OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }; } WHEN { diff --git a/test/battle/hold_effect/clear_amulet.c b/test/battle/hold_effect/clear_amulet.c index d0666ff3a9..cc143c51e1 100644 --- a/test/battle/hold_effect/clear_amulet.c +++ b/test/battle/hold_effect/clear_amulet.c @@ -42,13 +42,13 @@ SINGLE_BATTLE_TEST("Clear Amulet prevents stat reducing effects") PARAMETRIZE { move = MOVE_SAND_ATTACK; } GIVEN { - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); - ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN); - ASSUME(gMovesInfo[MOVE_FAKE_TEARS].effect == EFFECT_SPECIAL_DEFENSE_DOWN_2); - ASSUME(gMovesInfo[MOVE_SCARY_FACE].effect == EFFECT_SPEED_DOWN_2); - ASSUME(gMovesInfo[MOVE_SWEET_SCENT].effect == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN)); - ASSUME(gMovesInfo[MOVE_SAND_ATTACK].effect == EFFECT_ACCURACY_DOWN); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_CONFIDE) == EFFECT_SPECIAL_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_FAKE_TEARS) == EFFECT_SPECIAL_DEFENSE_DOWN_2); + ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2); + ASSUME(GetMoveEffect(MOVE_SWEET_SCENT) == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN)); + ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CLEAR_AMULET); }; } WHEN { diff --git a/test/battle/hold_effect/covert_cloak.c b/test/battle/hold_effect/covert_cloak.c index d2f371bbe5..583a250bcd 100644 --- a/test/battle/hold_effect/covert_cloak.c +++ b/test/battle/hold_effect/covert_cloak.c @@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary PARAMETRIZE { move = MOVE_METEOR_ASSAULT; } GIVEN { - ASSUME(gMovesInfo[MOVE_RAPID_SPIN].effect == EFFECT_RAPID_SPIN); + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); ASSUME(MoveHasAdditionalEffectSelf(MOVE_POWER_UP_PUNCH, MOVE_EFFECT_ATK_PLUS_1) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_LEAF_STORM, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); ASSUME(MoveHasAdditionalEffectSelf(MOVE_METEOR_ASSAULT, MOVE_EFFECT_RECHARGE) == TRUE); @@ -127,7 +127,6 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary DOUBLE_BATTLE_TEST("Covert Cloak does or does not block Sparkling Aria depending on number of targets hit") { u32 moveToUse; - KNOWN_FAILING; PARAMETRIZE { moveToUse = MOVE_FINAL_GAMBIT; } PARAMETRIZE { moveToUse = MOVE_TACKLE; } GIVEN { @@ -151,9 +150,33 @@ DOUBLE_BATTLE_TEST("Covert Cloak does or does not block Sparkling Aria depending } } +DOUBLE_BATTLE_TEST("Covert Cloak does block Sparkling Aria when only one mon is hit") +{ + u32 move; + PARAMETRIZE { move = MOVE_PROTECT; } + PARAMETRIZE { move = MOVE_FLY; } + + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_COVERT_CLOAK); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, move, target: playerLeft); + MOVE(playerRight, move, target: opponentRight); + MOVE(playerLeft, MOVE_SPARKLING_ARIA); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPARKLING_ARIA, playerLeft); + NONE_OF { + MESSAGE("The opposing Wobbuffet's burn was cured!"); + STATUS_ICON(opponentLeft, none: TRUE); + } + } +} + SINGLE_BATTLE_TEST("Covert Cloak blocks Sparkling Aria in singles") { - KNOWN_FAILING; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_COVERT_CLOAK); Status1(STATUS1_BURN); } diff --git a/test/battle/hold_effect/critical_hit_up.c b/test/battle/hold_effect/critical_hit_up.c index 7689d183f0..3ea7ef52e7 100644 --- a/test/battle/hold_effect/critical_hit_up.c +++ b/test/battle/hold_effect/critical_hit_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_LANSAT_BERRY].holdEffect == HOLD_EFFECT_CRITICAL_UP); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two stages when HP drops to 1/4 or below") @@ -58,7 +58,7 @@ SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by 2 sta PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); + ASSUME(GetMoveCriticalHitStage(MOVE_TACKLE) == 0); PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_LANSAT_BERRY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/defense_up.c b/test/battle/hold_effect/defense_up.c index 46130b9fe7..1812b96d33 100644 --- a/test/battle/hold_effect/defense_up.c +++ b/test/battle/hold_effect/defense_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_GANLON_BERRY].holdEffect == HOLD_EFFECT_DEFENSE_UP); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Ganlon Berry raises the holder's Defense by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/jaboca_berry.c b/test/battle/hold_effect/jaboca_berry.c index 8e69ff1bac..e446c4253d 100644 --- a/test/battle/hold_effect/jaboca_berry.c +++ b/test/battle/hold_effect/jaboca_berry.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_JABOCA_BERRY].holdEffect == HOLD_EFFECT_JABOCA_BERRY); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); } SINGLE_BATTLE_TEST("Jaboca Berry causes the attacker to lose 1/8 of its max HP if a physical move was used") @@ -16,7 +16,7 @@ SINGLE_BATTLE_TEST("Jaboca Berry causes the attacker to lose 1/8 of its max HP i PARAMETRIZE { move = MOVE_TACKLE; } GIVEN { - ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_JABOCA_BERRY); } } WHEN { @@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Jaboca Berry tirggers before Bug Bite can steal it") { KNOWN_FAILING; GIVEN { - ASSUME(gMovesInfo[MOVE_BUG_BITE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_BUG_BITE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_JABOCA_BERRY); } } WHEN { diff --git a/test/battle/hold_effect/kee_berry.c b/test/battle/hold_effect/kee_berry.c index 26cd2152a1..33de8ee004 100644 --- a/test/battle/hold_effect/kee_berry.c +++ b/test/battle/hold_effect/kee_berry.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_KEE_BERRY].holdEffect == HOLD_EFFECT_KEE_BERRY); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); } SINGLE_BATTLE_TEST("Kee Berry raises the holder's Defense by one stage when hit by a physical move") @@ -15,7 +15,7 @@ SINGLE_BATTLE_TEST("Kee Berry raises the holder's Defense by one stage when hit PARAMETRIZE { move = MOVE_TACKLE; } GIVEN { - ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_KEE_BERRY); } } WHEN { diff --git a/test/battle/hold_effect/life_orb.c b/test/battle/hold_effect/life_orb.c new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/battle/hold_effect/maranga_berry.c b/test/battle/hold_effect/maranga_berry.c index 77cdaddf42..eeb1aacf94 100644 --- a/test/battle/hold_effect/maranga_berry.c +++ b/test/battle/hold_effect/maranga_berry.c @@ -12,8 +12,8 @@ SINGLE_BATTLE_TEST("Maranga Berry raises the holder's Sp. Def by one stage when PARAMETRIZE { move = MOVE_TACKLE; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_MARANGA_BERRY); } } WHEN { @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Maranga Berry raises the holder's Sp. Def by one stage when SINGLE_BATTLE_TEST("Maranga Berry raises the holder's Sp. Def by two stages with Ripen when hit by a special move") { GIVEN { - ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_APPLIN) { Item(ITEM_MARANGA_BERRY); Ability(ABILITY_RIPEN); } } WHEN { diff --git a/test/battle/hold_effect/metronome.c b/test/battle/hold_effect/metronome.c index 21ad326cf1..f1d756b3a7 100644 --- a/test/battle/hold_effect/metronome.c +++ b/test/battle/hold_effect/metronome.c @@ -112,7 +112,7 @@ SINGLE_BATTLE_TEST("Metronome Item counts charging turn of moves for its attacki PARAMETRIZE {item = ITEM_NONE; } PARAMETRIZE {item = ITEM_METRONOME; } GIVEN { - ASSUME(gMovesInfo[MOVE_SOLAR_BEAM].effect == EFFECT_SOLAR_BEAM); + ASSUME(GetMoveEffect(MOVE_SOLAR_BEAM) == EFFECT_SOLAR_BEAM); PLAYER(SPECIES_WOBBUFFET) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -134,7 +134,7 @@ SINGLE_BATTLE_TEST("Metronome Item doesn't increase damage per hit of multi-hit { s16 damage[3]; GIVEN { - ASSUME(gMovesInfo[MOVE_FURY_ATTACK].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_FURY_ATTACK) == EFFECT_MULTI_HIT); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_METRONOME); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/micle_berry.c b/test/battle/hold_effect/micle_berry.c index 87f6742609..818eae09a6 100644 --- a/test/battle/hold_effect/micle_berry.c +++ b/test/battle/hold_effect/micle_berry.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_MICLE_BERRY].holdEffect == HOLD_EFFECT_MICLE_BERRY); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Micle Berry raises the holder's accuracy by 1.2 when HP drops to 1/4 or below") @@ -52,7 +52,7 @@ SINGLE_BATTLE_TEST("Micle Berry raises the holder's accuracy by 1.2") { PASSES_RANDOMLY(24, 25, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_SUBMISSION].accuracy == 80); + ASSUME(GetMoveAccuracy(MOVE_SUBMISSION) == 80); PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_MICLE_BERRY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -68,7 +68,7 @@ SINGLE_BATTLE_TEST("Micle Berry raises the holder's accuracy by 1.2") SINGLE_BATTLE_TEST("Micle Berry increases the accuracy of the next used move across turns") { GIVEN { - ASSUME(gMovesInfo[MOVE_ROCK_SLIDE].accuracy == 90); + ASSUME(GetMoveAccuracy(MOVE_ROCK_SLIDE) == 90); PASSES_RANDOMLY(100, 100, RNG_ACCURACY); PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(26); Item(ITEM_MICLE_BERRY); } OPPONENT(SPECIES_WOBBUFFET); @@ -85,7 +85,7 @@ SINGLE_BATTLE_TEST("Micle Berry increases the accuracy of the next used move acr SINGLE_BATTLE_TEST("Micle Berry increases the accuracy of the next used move the same turn the berry was triggered") { GIVEN { - ASSUME(gMovesInfo[MOVE_ROCK_SLIDE].accuracy == 90); + ASSUME(GetMoveAccuracy(MOVE_ROCK_SLIDE) == 90); PASSES_RANDOMLY(100, 100, RNG_ACCURACY); PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(26); Item(ITEM_MICLE_BERRY); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/hold_effect/mirror_herb.c b/test/battle/hold_effect/mirror_herb.c index 88a7467334..68294bee43 100644 --- a/test/battle/hold_effect/mirror_herb.c +++ b/test/battle/hold_effect/mirror_herb.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Mirror Herb copies all of foe's positive stat changes in a t PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_MIRROR_HERB; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Item(item); } } WHEN { diff --git a/test/battle/hold_effect/ogerpon_mask.c b/test/battle/hold_effect/ogerpon_mask.c index 209b854d66..919151684a 100644 --- a/test/battle/hold_effect/ogerpon_mask.c +++ b/test/battle/hold_effect/ogerpon_mask.c @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Ogerpon Masks increase the base power of moves by 20%", s16 PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE; item = ITEM_HEARTHFLAME_MASK; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].power > 0); + ASSUME(GetMovePower(MOVE_TACKLE) > 0); PLAYER(species) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/protective_pads.c b/test/battle/hold_effect/protective_pads.c index 95de944b81..843d2fa003 100644 --- a/test/battle/hold_effect/protective_pads.c +++ b/test/battle/hold_effect/protective_pads.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_PROTECTIVE_PADS].holdEffect == HOLD_EFFECT_PROTECTIVE_PADS); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact == TRUE); + ASSUME(MoveMakesContact(MOVE_TACKLE) == TRUE); } SINGLE_BATTLE_TEST("Protective Pads protected moves still make direct contact", s16 damage) diff --git a/test/battle/hold_effect/red_card.c b/test/battle/hold_effect/red_card.c index 6bf34b8f75..88b208cf50 100644 --- a/test/battle/hold_effect/red_card.c +++ b/test/battle/hold_effect/red_card.c @@ -413,7 +413,7 @@ SINGLE_BATTLE_TEST("Red Card does not activate if attacker's Sheer Force applied SINGLE_BATTLE_TEST("Red Card is consumed after dragged out replacement has its Speed lowered by Sticky Web") { GIVEN { - ASSUME(gMovesInfo[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB); + ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT) { Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } diff --git a/test/battle/hold_effect/restore_hp.c b/test/battle/hold_effect/restore_hp.c index 47f409ff84..ef96ead7e4 100644 --- a/test/battle/hold_effect/restore_hp.c +++ b/test/battle/hold_effect/restore_hp.c @@ -37,7 +37,7 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil mo PARAMETRIZE { item = ITEM_SITRUS_BERRY; } GIVEN { - ASSUME(gMovesInfo[MOVE_TAKE_DOWN].recoil == 25); + ASSUME(GetMoveRecoil(MOVE_TAKE_DOWN) == 25); ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); ASSUME(gItemsInfo[ITEM_BERRY_JUICE].holdEffect == HOLD_EFFECT_RESTORE_HP); ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); diff --git a/test/battle/hold_effect/restore_stats.c b/test/battle/hold_effect/restore_stats.c index c0f888469c..192ad2f65e 100644 --- a/test/battle/hold_effect/restore_stats.c +++ b/test/battle/hold_effect/restore_stats.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("White Herb restores stats when they're lowered") { GIVEN { - ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -103,7 +103,7 @@ SINGLE_BATTLE_TEST("White Herb restores stats after all hits of a multi hit move PARAMETRIZE { species = SPECIES_DUGTRIO_ALOLA; ability = ABILITY_TANGLING_HAIR; } GIVEN { - ASSUME(gMovesInfo[MOVE_DUAL_WINGBEAT].strikeCount == 2); + ASSUME(GetMoveStrikeCount(MOVE_DUAL_WINGBEAT) == 2); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } OPPONENT(species) { Ability(ability); } } WHEN { @@ -133,7 +133,7 @@ SINGLE_BATTLE_TEST("White Herb wont have time to activate if it is knocked off o GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_THIEF, MOVE_EFFECT_STEAL_ITEM) == TRUE); - ASSUME(gMovesInfo[MOVE_KNOCK_OFF].effect == EFFECT_KNOCK_OFF); + ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/room_service.c b/test/battle/hold_effect/room_service.c index 04b6450e05..e775ca496c 100644 --- a/test/battle/hold_effect/room_service.c +++ b/test/battle/hold_effect/room_service.c @@ -9,9 +9,9 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Room Serive decreases the holder's seep by one stage") { GIVEN { - ASSUME(gMovesInfo[MOVE_U_TURN].effect == EFFECT_HIT_ESCAPE); - ASSUME(gMovesInfo[MOVE_TRICK_ROOM].effect == EFFECT_TRICK_ROOM); - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); Item(ITEM_ROOM_SERVICE); } OPPONENT(SPECIES_WYNAUT) { HP(1); } diff --git a/test/battle/hold_effect/rowap_berry.c b/test/battle/hold_effect/rowap_berry.c index 5dc85492c3..2ad8b9d300 100644 --- a/test/battle/hold_effect/rowap_berry.c +++ b/test/battle/hold_effect/rowap_berry.c @@ -15,8 +15,8 @@ SINGLE_BATTLE_TEST("Rowap Berry causes the attacker to lose 1/8 of its max HP if PARAMETRIZE { move = MOVE_TACKLE; } GIVEN { - ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ROWAP_BERRY); } } WHEN { @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Rowap Berry causes the attacker to lose 1/8 of its max HP if SINGLE_BATTLE_TEST("Rowap Berry is not triggered by a physical move") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ROWAP_BERRY); } } WHEN { diff --git a/test/battle/hold_effect/safety_goggles.c b/test/battle/hold_effect/safety_goggles.c index ec66ad8bcd..e2d329bcf6 100644 --- a/test/battle/hold_effect/safety_goggles.c +++ b/test/battle/hold_effect/safety_goggles.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Safety Goggles block powder and spore moves") { GIVEN { - ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove); + ASSUME(IsPowderMove(MOVE_STUN_SPORE)); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ABRA) { Item(ITEM_SAFETY_GOGGLES); } } WHEN { diff --git a/test/battle/hold_effect/shell_bell.c b/test/battle/hold_effect/shell_bell.c index 92625b182a..f669c55081 100644 --- a/test/battle/hold_effect/shell_bell.c +++ b/test/battle/hold_effect/shell_bell.c @@ -1,6 +1,121 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_SHELL_BELL].holdEffect == HOLD_EFFECT_SHELL_BELL); +} + +#define HITS 5 +SINGLE_BATTLE_TEST("Shell Bell recovers 1/8 of HP from after the last hit from all hits of a multi hit move") +{ + s16 multiHitDamage[HITS]; + s16 totalDamage = 0; + s16 shellBellRecovery = 0; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BULLET_SEED); } + } SCENE { + for (u32 i = 0; i < HITS; i++) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player); + HP_BAR(opponent, captureDamage: &multiHitDamage[i]); + totalDamage += multiHitDamage[i]; + } + HP_BAR(player, captureDamage: &shellBellRecovery); + } THEN { + EXPECT_EQ(totalDamage / 8, -1 * shellBellRecovery); + } +} +#undef HITS + +SINGLE_BATTLE_TEST("Shell Bell recovers no HP if the move did no damage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + } WHEN { + TURN { MOVE(player, MOVE_FALSE_SWIPE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FALSE_SWIPE, player); + HP_BAR(opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player); + } + } +} + +SINGLE_BATTLE_TEST("Shell Bell activates if it hits a Substitute") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + // HP_BAR(opponent); // When you hit a sub the hp bar check doesn't work. Not sure if this is a bug + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player); + } +} + +SINGLE_BATTLE_TEST("Shell Bell activates after Absorb") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ABSORB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ABSORB, player); + HP_BAR(opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player); + } +} + +SINGLE_BATTLE_TEST("Shell Bell activates after Rough Skin") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_GIBLE) { Ability(ABILITY_ROUGH_SKIN); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + HP_BAR(opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player); + } +} + +SINGLE_BATTLE_TEST("Shell Bell does not activate on Future Sight if the original user is on the field") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_FUTURE_SIGHT); } + TURN {} + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); + MESSAGE("The opposing Wynaut took the Future Sight attack!"); + HP_BAR(opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player); + } + } +} + SINGLE_BATTLE_TEST("Shell Bell restores 1/8 HP of damage dealt") { GIVEN { @@ -18,7 +133,7 @@ SINGLE_BATTLE_TEST("Shell Bell restores 1/8 HP of damage dealt") SINGLE_BATTLE_TEST("Shell Bell doesn't restore HP for damage dealt by a foreseen move") { GIVEN { - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); PLAYER(SPECIES_WOBBUFFET) { Level(16); Item(ITEM_SHELL_BELL); HP(10); } OPPONENT(SPECIES_WOBBUFFET) { Level(16); }; } WHEN { @@ -35,6 +150,28 @@ SINGLE_BATTLE_TEST("Shell Bell doesn't restore HP for damage dealt by a foreseen } } +SINGLE_BATTLE_TEST("Shell Bell does not activate on Future Sight if the original user is not on the field") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET) { HP(1); Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_FUTURE_SIGHT); } + TURN { SWITCH(player, 1); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); + MESSAGE("The opposing Wynaut took the Future Sight attack!"); + HP_BAR(opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player); + } + } +} + + SINGLE_BATTLE_TEST("Shell Bell does not activate on Future Sight if the original user is on the field") { s16 damage = 0; @@ -59,4 +196,98 @@ SINGLE_BATTLE_TEST("Shell Bell does not activate on Future Sight if the original } THEN { EXPECT_MUL_EQ(damage, Q_4_12(-0.25), healed); } -} +} + +DOUBLE_BATTLE_TEST("Shell Bell heals accumulated damage for spread moves") +{ + s16 opponentLeftDamage; + s16 opponentRightDamage; + s16 playerRightDamage; + s16 shellBellHeal; + + const u16 maxHp = 200; + const u16 initHp = 1; + GIVEN { + ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_ARIADOS) { MaxHP(maxHp); HP(initHp); Item(ITEM_SHELL_BELL); } + PLAYER(SPECIES_WOBBUFFET) {} + OPPONENT(SPECIES_GYARADOS) {} + OPPONENT(SPECIES_CHANSEY) {} + } WHEN { + TURN { + MOVE(playerLeft, MOVE_DISCHARGE); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &opponentLeftDamage); + HP_BAR(playerRight, captureDamage: &playerRightDamage); + HP_BAR(opponentRight, captureDamage: &opponentRightDamage); + + HP_BAR(playerLeft, captureDamage: &shellBellHeal); + } THEN { + const s16 totalDamage = opponentLeftDamage + + playerRightDamage + opponentRightDamage; + EXPECT_EQ(shellBellHeal, -totalDamage / 8); + EXPECT_EQ(playerLeft->hp, initHp + (totalDamage / 8)); + } +} + +SINGLE_BATTLE_TEST("Shell Bell restores 1/8 HP at move end, one strike") +{ + const u16 maxHp = 200; + u16 hp, opponentHp; + u16 hpGainFromDamage, hpGainActual; + + PARAMETRIZE { hp = maxHp; opponentHp = maxHp; } + PARAMETRIZE { hp = maxHp - 1; opponentHp = maxHp; } + PARAMETRIZE { hp = maxHp / 2; opponentHp = maxHp; } + PARAMETRIZE { hp = maxHp; opponentHp = 24; } // dragon rage only does 24 dmg, only heal 3 HP instead of 5 + PARAMETRIZE { hp = maxHp - 1; opponentHp = 24; } // dragon rage only does 24 dmg, only heal 3 HP instead of 5 + PARAMETRIZE { hp = maxHp / 2; opponentHp = 24; } // dragon rage only does 24 dmg, only heal 3 HP instead of 5 + PARAMETRIZE { hp = maxHp; opponentHp = 1; } + PARAMETRIZE { hp = maxHp - 1; opponentHp = 1; } + PARAMETRIZE { hp = maxHp / 2; opponentHp = 1; } + + hpGainFromDamage = max(1, min(40, opponentHp) / 8); + hpGainActual = min(maxHp - hp, hpGainFromDamage); + + GIVEN { + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHp); HP(hp); Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHp); HP(opponentHp); } + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, player); + HP_BAR(opponent); + if (hp < maxHp) { + HP_BAR(player, damage: -hpGainActual); + } else { + NOT HP_BAR(player); + } + } THEN { + EXPECT_EQ(player->hp, hp + hpGainActual); + } +} + +SINGLE_BATTLE_TEST("Shell Bell recovers only 1 damage if the move only did 1 damage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); Item(ITEM_SHELL_BELL); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player); + + } THEN { + EXPECT_EQ(player->hp, 2); + } +} + +TO_DO_BATTLE_TEST("If a Pokémon steals a Shell Bell with Thief or Covet, it will recover HP for the use of that move that stole the Shell Bell") +TO_DO_BATTLE_TEST("If a Pokémon steals a Shell Bell with Magician, it will recover HP for the use of that move that stole the Shell Bell") diff --git a/test/battle/hold_effect/special_attack_up.c b/test/battle/hold_effect/special_attack_up.c index ef348024fc..0199bab83c 100644 --- a/test/battle/hold_effect/special_attack_up.c +++ b/test/battle/hold_effect/special_attack_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_PETAYA_BERRY].holdEffect == HOLD_EFFECT_SP_ATTACK_UP); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Petaya Berry raises the holder's Sp. Atk by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/special_defense_up.c b/test/battle/hold_effect/special_defense_up.c index 9585e5b5a7..e075d05c49 100644 --- a/test/battle/hold_effect/special_defense_up.c +++ b/test/battle/hold_effect/special_defense_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Apicot Berry raises the holder's Sp. Def by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/speed_up.c b/test/battle/hold_effect/speed_up.c index 4a8b28b6d9..f31ee7e924 100644 --- a/test/battle/hold_effect/speed_up.c +++ b/test/battle/hold_effect/speed_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_SALAC_BERRY].holdEffect == HOLD_EFFECT_SPEED_UP); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Salac Berry raises the holder's Speed by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/utility_umbrella.c b/test/battle/hold_effect/utility_umbrella.c index f04a773789..67a3be4c7a 100644 --- a/test/battle/hold_effect/utility_umbrella.c +++ b/test/battle/hold_effect/utility_umbrella.c @@ -5,8 +5,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); } SINGLE_BATTLE_TEST("Utility Umbrella blocks Sun damage modifiers", s16 damage) diff --git a/test/battle/item_effect/escape.c b/test/battle/item_effect/escape.c index bffa6e4292..dd27c425c2 100644 --- a/test/battle/item_effect/escape.c +++ b/test/battle/item_effect/escape.c @@ -21,7 +21,7 @@ WILD_BATTLE_TEST("Poke Toy lets the player escape from a wild battle") WILD_BATTLE_TEST("Poke Toy lets the player escape from a wild battle even if a move forbid them to") { GIVEN { - ASSUME(gMovesInfo[MOVE_MEAN_LOOK].effect == EFFECT_MEAN_LOOK); + ASSUME(GetMoveEffect(MOVE_MEAN_LOOK) == EFFECT_MEAN_LOOK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/item_effect/increase_stat.c b/test/battle/item_effect/increase_stat.c index 9b3ced5759..2b9486e3a6 100644 --- a/test/battle/item_effect/increase_stat.c +++ b/test/battle/item_effect/increase_stat.c @@ -8,7 +8,7 @@ SINGLE_BATTLE_TEST("X Attack sharply raises battler's Attack stat", s16 damage) PARAMETRIZE { useItem = TRUE; } GIVEN { ASSUME(gItemsInfo[ITEM_X_ATTACK].battleUsage == EFFECT_ITEM_INCREASE_STAT); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("X Defense sharply raises battler's Defense stat", s16 damage PARAMETRIZE { useItem = TRUE; } GIVEN { ASSUME(gItemsInfo[ITEM_X_DEFENSE].battleUsage == EFFECT_ITEM_INCREASE_STAT); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -56,7 +56,7 @@ SINGLE_BATTLE_TEST("X Sp. Atk sharply raises battler's Sp. Attack stat", s16 dam PARAMETRIZE { useItem = TRUE; } GIVEN { ASSUME(gItemsInfo[ITEM_X_SP_ATK].battleUsage == EFFECT_ITEM_INCREASE_STAT); - ASSUME(gMovesInfo[MOVE_DISARMING_VOICE].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_DISARMING_VOICE) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -80,7 +80,7 @@ SINGLE_BATTLE_TEST("X Sp. Def sharply raises battler's Sp. Defense stat", s16 da PARAMETRIZE { useItem = TRUE; } GIVEN { ASSUME(gItemsInfo[ITEM_X_SP_DEF].battleUsage == EFFECT_ITEM_INCREASE_STAT); - ASSUME(gMovesInfo[MOVE_DISARMING_VOICE].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_DISARMING_VOICE) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -134,11 +134,11 @@ SINGLE_BATTLE_TEST("X Speed sharply raises battler's Speed stat", s16 damage) SINGLE_BATTLE_TEST("X Accuracy sharply raises battler's Accuracy stat") { - ASSUME(gMovesInfo[MOVE_SING].accuracy == 55); + ASSUME(GetMoveAccuracy(MOVE_SING) == 55); if (B_X_ITEMS_BUFF >= GEN_7) - PASSES_RANDOMLY(gMovesInfo[MOVE_SING].accuracy * 5 / 3, 100, RNG_ACCURACY); + PASSES_RANDOMLY(GetMoveAccuracy(MOVE_SING) * 5 / 3, 100, RNG_ACCURACY); else - PASSES_RANDOMLY(gMovesInfo[MOVE_SING].accuracy * 4 / 3, 100, RNG_ACCURACY); + PASSES_RANDOMLY(GetMoveAccuracy(MOVE_SING) * 4 / 3, 100, RNG_ACCURACY); GIVEN { ASSUME(gItemsInfo[ITEM_X_ACCURACY].battleUsage == EFFECT_ITEM_INCREASE_STAT); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move.c b/test/battle/move.c index ab2f5157bc..6286b48c42 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -9,8 +9,8 @@ SINGLE_BATTLE_TEST("Accuracy controls the proportion of misses") PARAMETRIZE { move = MOVE_HYDRO_PUMP; } PARAMETRIZE { move = MOVE_RAZOR_LEAF; } PARAMETRIZE { move = MOVE_SCRATCH; } - ASSUME(0 < gMovesInfo[move].accuracy && gMovesInfo[move].accuracy <= 100); - PASSES_RANDOMLY(gMovesInfo[move].accuracy, 100, RNG_ACCURACY); + ASSUME(0 < GetMoveAccuracy(move) && GetMoveAccuracy(move) <= 100); + PASSES_RANDOMLY(GetMoveAccuracy(move), 100, RNG_ACCURACY); GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("AdditionalEffect.chance controls the proportion of secondary SINGLE_BATTLE_TEST("Turn order is determined by priority") { GIVEN { - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority > gMovesInfo[MOVE_TACKLE].priority); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) > GetMovePriority(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -86,10 +86,10 @@ DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie PASSES_RANDOMLY(24, 24, RNG_SPEED_TIE); GIVEN { - ASSUME(gMovesInfo[MOVE_ENDEAVOR].effect == EFFECT_ENDEAVOR); - ASSUME(gMovesInfo[MOVE_LIFE_DEW].effect == EFFECT_JUNGLE_HEALING); - ASSUME(gMovesInfo[MOVE_CRUSH_GRIP].effect == EFFECT_POWER_BASED_ON_TARGET_HP); - ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG); + ASSUME(GetMoveEffect(MOVE_ENDEAVOR) == EFFECT_ENDEAVOR); + ASSUME(GetMoveEffect(MOVE_LIFE_DEW) == EFFECT_JUNGLE_HEALING); + ASSUME(GetMoveEffect(MOVE_CRUSH_GRIP) == EFFECT_POWER_BASED_ON_TARGET_HP); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_SUPER_FANG); PLAYER(SPECIES_WOBBUFFET) { MaxHP(480); HP(360); Defense(100); Speed(1); } PLAYER(SPECIES_WYNAUT) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Attack(100); Speed(1); } @@ -162,7 +162,7 @@ SINGLE_BATTLE_TEST("Critical hits do not ignore positive stat stages", s16 damag PARAMETRIZE { move = MOVE_HOWL; } PARAMETRIZE { move = MOVE_TAIL_WHIP; } GIVEN { - ASSUME(gMovesInfo[MOVE_SCRATCH].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -183,7 +183,7 @@ SINGLE_BATTLE_TEST("Critical hits ignore negative stat stages", s16 damage) PARAMETRIZE { move = MOVE_HARDEN; } PARAMETRIZE { move = MOVE_GROWL; } GIVEN { - ASSUME(gMovesInfo[MOVE_SCRATCH].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -229,7 +229,7 @@ DOUBLE_BATTLE_TEST("Moves do not fail if an alive partner is the target") DOUBLE_BATTLE_TEST("Moves fail if they target into a pokemon that was fainted by the previous move") { GIVEN { - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].target == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } @@ -252,7 +252,7 @@ DOUBLE_BATTLE_TEST("Moves fail if they target into a pokemon that was fainted by DOUBLE_BATTLE_TEST("Moves that target the field are not going to fail if one mon fainted by the previous move") { GIVEN { - ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index 8c235cf07c..456c888cd4 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ABSORB].effect == EFFECT_ABSORB); + ASSUME(GetMoveEffect(MOVE_ABSORB) == EFFECT_ABSORB); } SINGLE_BATTLE_TEST("Absorb recovers 50% of the damage dealt") @@ -50,18 +50,18 @@ DOUBLE_BATTLE_TEST("Matcha Gatcha recovers 50% of the damage dealt from both tar s16 healedRight; GIVEN { - ASSUME(gMovesInfo[MOVE_MATCHA_GOTCHA].effect == EFFECT_ABSORB); - PLAYER(SPECIES_WOBBUFFET) { HP(1); } + ASSUME(GetMoveEffect(MOVE_MATCHA_GOTCHA) == EFFECT_ABSORB); + PLAYER(SPECIES_PIKACHU) { HP(1); } PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_STARYU); + OPPONENT(SPECIES_STARYU); } WHEN { TURN { MOVE(playerLeft, MOVE_MATCHA_GOTCHA); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft); HP_BAR(opponentLeft, captureDamage: &damageLeft); - HP_BAR(playerLeft, captureDamage: &healedLeft); HP_BAR(opponentRight, captureDamage: &damageRight); + HP_BAR(playerLeft, captureDamage: &healedLeft); HP_BAR(playerLeft, captureDamage: &healedRight); } THEN { EXPECT_MUL_EQ(damageLeft, Q_4_12(-0.5), healedLeft); diff --git a/test/battle/move_effect/accuracy_down.c b/test/battle/move_effect/accuracy_down.c index f174a7f946..c11001928f 100644 --- a/test/battle/move_effect/accuracy_down.c +++ b/test/battle/move_effect/accuracy_down.c @@ -3,14 +3,14 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SAND_ATTACK].effect == EFFECT_ACCURACY_DOWN); + ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN); } SINGLE_BATTLE_TEST("Sand Attack lowers Accuracy by 1 stage") { - PASSES_RANDOMLY(gMovesInfo[MOVE_SCRATCH].accuracy * 3 / 4, 100, RNG_ACCURACY); + PASSES_RANDOMLY(GetMoveAccuracy(MOVE_SCRATCH) * 3 / 4, 100, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100); + ASSUME(GetMoveAccuracy(MOVE_SCRATCH) == 100); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/acrobatics.c b/test/battle/move_effect/acrobatics.c index 70953d0958..809b77f948 100644 --- a/test/battle/move_effect/acrobatics.c +++ b/test/battle/move_effect/acrobatics.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ACROBATICS].effect == EFFECT_ACROBATICS); - ASSUME(gMovesInfo[MOVE_ACROBATICS].type == TYPE_FLYING); + ASSUME(GetMoveEffect(MOVE_ACROBATICS) == EFFECT_ACROBATICS); + ASSUME(GetMoveType(MOVE_ACROBATICS) == TYPE_FLYING); } SINGLE_BATTLE_TEST("Acrobatics doubles in power if the user has no held item", s16 damage) diff --git a/test/battle/move_effect/after_you.c b/test/battle/move_effect/after_you.c index c1202f0f9c..42eb0f3ff9 100644 --- a/test/battle/move_effect/after_you.c +++ b/test/battle/move_effect/after_you.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_AFTER_YOU].effect == EFFECT_AFTER_YOU); + ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); } DOUBLE_BATTLE_TEST("After You makes the target move after user") @@ -112,7 +112,7 @@ DOUBLE_BATTLE_TEST("After You doesn't fail if the turn order remains the same af DOUBLE_BATTLE_TEST("After You ignores the effects of Quash") { GIVEN { - ASSUME(gMovesInfo[MOVE_QUASH].effect == EFFECT_QUASH); + ASSUME(GetMoveEffect(MOVE_QUASH) == EFFECT_QUASH); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WYNAUT) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } diff --git a/test/battle/move_effect/ally_switch.c b/test/battle/move_effect/ally_switch.c index cd5a347d68..7222f34587 100644 --- a/test/battle/move_effect/ally_switch.c +++ b/test/battle/move_effect/ally_switch.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ALLY_SWITCH].effect == EFFECT_ALLY_SWITCH); + ASSUME(GetMoveEffect(MOVE_ALLY_SWITCH) == EFFECT_ALLY_SWITCH); } SINGLE_BATTLE_TEST("Ally Switch fails in a single battle") @@ -41,8 +41,8 @@ DOUBLE_BATTLE_TEST("Ally Switch fails if there is no partner") DOUBLE_BATTLE_TEST("Ally Switch changes the position of battlers") { GIVEN { - ASSUME(gMovesInfo[MOVE_SCREECH].effect == EFFECT_DEFENSE_DOWN_2); - ASSUME(gMovesInfo[MOVE_SCREECH].target == MOVE_TARGET_SELECTED); + ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2); + ASSUME(GetMoveTarget(MOVE_SCREECH) == MOVE_TARGET_SELECTED); PLAYER(SPECIES_WOBBUFFET) { Speed(5); } // Wobb is playerLeft, but it'll be Wynaut after Ally Switch PLAYER(SPECIES_WYNAUT) { Speed(4); } OPPONENT(SPECIES_KADABRA) { Speed(3); } @@ -72,7 +72,7 @@ DOUBLE_BATTLE_TEST("Ally Switch changes the position of battlers") DOUBLE_BATTLE_TEST("Ally Switch does not redirect the target of Snipe Shot") { GIVEN { - ASSUME(gMovesInfo[MOVE_SNIPE_SHOT].effect == EFFECT_SNIPE_SHOT); + ASSUME(GetMoveEffect(MOVE_SNIPE_SHOT) == EFFECT_SNIPE_SHOT); PLAYER(SPECIES_WOBBUFFET); // Wobb is playerLeft, but it'll be Wynaut after Ally Switch PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_KADABRA); @@ -207,7 +207,7 @@ DOUBLE_BATTLE_TEST("Ally switch swaps sky drop targets if being used by partner" { u8 visibility; GIVEN { - ASSUME(gMovesInfo[MOVE_SKY_DROP].effect == EFFECT_SKY_DROP); + ASSUME(GetMoveEffect(MOVE_SKY_DROP) == EFFECT_SKY_DROP); PLAYER(SPECIES_FEAROW) { Speed(100); } PLAYER(SPECIES_XATU) { Speed(150); } OPPONENT(SPECIES_ARON) { Speed(25); Ability(ABILITY_STURDY); } @@ -244,7 +244,7 @@ DOUBLE_BATTLE_TEST("Ally switch swaps opposing sky drop targets if partner is be { u8 visibility; GIVEN { - ASSUME(gMovesInfo[MOVE_SKY_DROP].effect == EFFECT_SKY_DROP); + ASSUME(GetMoveEffect(MOVE_SKY_DROP) == EFFECT_SKY_DROP); PLAYER(SPECIES_ARON) { Speed(25); Ability(ABILITY_STURDY); } PLAYER(SPECIES_WYNAUT) { Speed(30); } OPPONENT(SPECIES_FEAROW) { Speed(100); } @@ -281,8 +281,9 @@ DOUBLE_BATTLE_TEST("Ally switch swaps opposing sky drop targets if partner is be /* DOUBLE_BATTLE_TEST("Ally Switch swaps Illusion data") { + KNOWN_FAILING; // Test passes in isolation but fails on CI GIVEN { - ASSUME(gMovesInfo[MOVE_ALLY_SWITCH].effect == EFFECT_ALLY_SWITCH); + ASSUME(GetMoveEffect(MOVE_ALLY_SWITCH) == EFFECT_ALLY_SWITCH); PLAYER(SPECIES_HOOPA); PLAYER(SPECIES_ZOROARK); PLAYER(SPECIES_MAMOSWINE); // the third member here is required for zoroark diff --git a/test/battle/move_effect/assist.c b/test/battle/move_effect/assist.c index 0c9a0b6128..6036de8e8c 100644 --- a/test/battle/move_effect/assist.c +++ b/test/battle/move_effect/assist.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ASSIST].effect == EFFECT_ASSIST); + ASSUME(GetMoveEffect(MOVE_ASSIST) == EFFECT_ASSIST); } TO_DO_BATTLE_TEST("Assist randomly calls a move from any party member"); diff --git a/test/battle/move_effect/attack_accuracy_up.c b/test/battle/move_effect/attack_accuracy_up.c index 102f4d4d21..25b09ab1c0 100644 --- a/test/battle/move_effect/attack_accuracy_up.c +++ b/test/battle/move_effect/attack_accuracy_up.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Hone Claws increases Attack and Accuracy by one stage each") { GIVEN { - ASSUME(gMovesInfo[MOVE_HONE_CLAWS].effect == EFFECT_ATTACK_ACCURACY_UP); + ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/attack_down.c b/test/battle/move_effect/attack_down.c index e88ef43c26..eb562c0c6a 100644 --- a/test/battle/move_effect/attack_down.c +++ b/test/battle/move_effect/attack_down.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); } SINGLE_BATTLE_TEST("Growl lowers Attack by 1 stage", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Growl lowers Attack by 1 stage", s16 damage) PARAMETRIZE { lowerAttack = FALSE; } PARAMETRIZE { lowerAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/attack_down_2.c b/test/battle/move_effect/attack_down_2.c index 6fefec5e45..896bbf947c 100644 --- a/test/battle/move_effect/attack_down_2.c +++ b/test/battle/move_effect/attack_down_2.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_CHARM].effect == EFFECT_ATTACK_DOWN_2); + ASSUME(GetMoveEffect(MOVE_CHARM) == EFFECT_ATTACK_DOWN_2); } SINGLE_BATTLE_TEST("Charm lowers Attack by 2 stages", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Charm lowers Attack by 2 stages", s16 damage) PARAMETRIZE { lowerAttack = FALSE; } PARAMETRIZE { lowerAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/attack_spatk_up.c b/test/battle/move_effect/attack_spatk_up.c index b5aa2418a2..671ed667a6 100644 --- a/test/battle/move_effect/attack_spatk_up.c +++ b/test/battle/move_effect/attack_spatk_up.c @@ -4,7 +4,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_WORK_UP].effect == EFFECT_ATTACK_SPATK_UP); + ASSUME(GetMoveEffect(MOVE_WORK_UP) == EFFECT_ATTACK_SPATK_UP); } SINGLE_BATTLE_TEST("Work Up raises Attack and Sp. Attack by 1 stage each", s16 damage) @@ -16,8 +16,8 @@ SINGLE_BATTLE_TEST("Work Up raises Attack and Sp. Attack by 1 stage each", s16 d PARAMETRIZE { raiseStats = FALSE; move = MOVE_SWIFT; } PARAMETRIZE { raiseStats = TRUE; move = MOVE_SWIFT; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/attack_up.c b/test/battle/move_effect/attack_up.c index da878fb60d..1865c7f30e 100644 --- a/test/battle/move_effect/attack_up.c +++ b/test/battle/move_effect/attack_up.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_MEDITATE].effect == EFFECT_ATTACK_UP); + ASSUME(GetMoveEffect(MOVE_MEDITATE) == EFFECT_ATTACK_UP); } SINGLE_BATTLE_TEST("Meditate raises Attack by 1 stage", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Meditate raises Attack by 1 stage", s16 damage) PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/attack_up_2.c b/test/battle/move_effect/attack_up_2.c index 1f44efe9e3..fd247fad01 100644 --- a/test/battle/move_effect/attack_up_2.c +++ b/test/battle/move_effect/attack_up_2.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); } SINGLE_BATTLE_TEST("Swords Dance raises Attack by 2 stages", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Swords Dance raises Attack by 2 stages", s16 damage) PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/attack_up_user_ally.c b/test/battle/move_effect/attack_up_user_ally.c index 1d623c2bbd..8f9c4a3388 100644 --- a/test/battle/move_effect/attack_up_user_ally.c +++ b/test/battle/move_effect/attack_up_user_ally.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HOWL].effect == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); } SINGLE_BATTLE_TEST("Howl raises user's Attack by 1 stage", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Howl raises user's Attack by 1 stage", s16 damage) PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -37,7 +37,7 @@ DOUBLE_BATTLE_TEST("Howl raises user's and partner's Attack by 1 stage", s16 dam PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Speed(15); } PLAYER(SPECIES_WYNAUT) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(13); } @@ -69,7 +69,7 @@ DOUBLE_BATTLE_TEST("Howl does not work on partner if it has Soundproof") s16 damage[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Speed(15); } PLAYER(SPECIES_VOLTORB) { Speed(10); Ability(ABILITY_SOUNDPROOF); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } diff --git a/test/battle/move_effect/aura_wheel.c b/test/battle/move_effect/aura_wheel.c index 3d601f3583..dfd31c878f 100644 --- a/test/battle/move_effect/aura_wheel.c +++ b/test/battle/move_effect/aura_wheel.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(MoveHasAdditionalEffectSelf(MOVE_AURA_WHEEL, MOVE_EFFECT_SPD_PLUS_1) == TRUE); - ASSUME(gMovesInfo[MOVE_AURA_WHEEL].effect == EFFECT_AURA_WHEEL); + ASSUME(GetMoveEffect(MOVE_AURA_WHEEL) == EFFECT_AURA_WHEEL); } SINGLE_BATTLE_TEST("Aura Wheel raises Speed; fails if the user is not Morpeko") diff --git a/test/battle/move_effect/aurora_veil.c b/test/battle/move_effect/aurora_veil.c index f681e965d7..b57c85df06 100644 --- a/test/battle/move_effect/aurora_veil.c +++ b/test/battle/move_effect/aurora_veil.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_AURORA_VEIL].effect == EFFECT_AURORA_VEIL); + ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL); } SINGLE_BATTLE_TEST("Aurora Veil can only be used in Hail and Snow") diff --git a/test/battle/move_effect/baton_pass.c b/test/battle/move_effect/baton_pass.c index 57f678470a..cb6530ae89 100644 --- a/test/battle/move_effect/baton_pass.c +++ b/test/battle/move_effect/baton_pass.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); } // This softlocked the game before. diff --git a/test/battle/move_effect/beak_blast.c b/test/battle/move_effect/beak_blast.c index a07b28f992..92557ddee3 100644 --- a/test/battle/move_effect/beak_blast.c +++ b/test/battle/move_effect/beak_blast.c @@ -3,13 +3,13 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_BEAK_BLAST].effect == EFFECT_BEAK_BLAST); + ASSUME(GetMoveEffect(MOVE_BEAK_BLAST) == EFFECT_BEAK_BLAST); } DOUBLE_BATTLE_TEST("Beak Blast's charging message is shown before other moves are used") { GIVEN { - ASSUME(gMovesInfo[MOVE_BEAK_BLAST].priority < 0); + ASSUME(GetMovePriority(MOVE_BEAK_BLAST) < 0); PLAYER(SPECIES_WYNAUT) { Speed(10); } PLAYER(SPECIES_WOBBUFFET) { Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } @@ -36,8 +36,8 @@ DOUBLE_BATTLE_TEST("Beak Blast's charging message is shown before other moves ar DOUBLE_BATTLE_TEST("Beak Blast burns all who make contact with the pokemon") { GIVEN { - ASSUME(gMovesInfo[MOVE_BEAK_BLAST].priority < 0); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); + ASSUME(GetMovePriority(MOVE_BEAK_BLAST) < 0); + ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_WYNAUT) { Speed(10); } PLAYER(SPECIES_WOBBUFFET) { Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(3); } @@ -80,9 +80,9 @@ SINGLE_BATTLE_TEST("Beak Blast burns only when contact moves are used") PARAMETRIZE { move = MOVE_LEER; burn = FALSE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); - ASSUME(!gMovesInfo[MOVE_WATER_GUN].makesContact); - ASSUME(!gMovesInfo[MOVE_LEER].makesContact); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(!MoveMakesContact(MOVE_WATER_GUN)); + ASSUME(!MoveMakesContact(MOVE_LEER)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/belch.c b/test/battle/move_effect/belch.c index f8e28929f9..1abcefb353 100644 --- a/test/battle/move_effect/belch.c +++ b/test/battle/move_effect/belch.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_BELCH].effect == EFFECT_BELCH); - ASSUME(gMovesInfo[MOVE_MUD_SHOT].type == TYPE_GROUND); + ASSUME(GetMoveEffect(MOVE_BELCH) == EFFECT_BELCH); + ASSUME(GetMoveType(MOVE_MUD_SHOT) == TYPE_GROUND); ASSUME(gItemsInfo[ITEM_SHUCA_BERRY].holdEffect == HOLD_EFFECT_RESIST_BERRY); ASSUME(gItemsInfo[ITEM_SHUCA_BERRY].holdEffectParam == TYPE_GROUND); ASSUME(gItemsInfo[ITEM_SHUCA_BERRY].pocket == POCKET_BERRIES); @@ -56,7 +56,7 @@ SINGLE_BATTLE_TEST("Belch cannot be used if the user has not eaten a berry") SINGLE_BATTLE_TEST("Belch can still be used after switching out") { GIVEN { - ASSUME(gMovesInfo[MOVE_STUFF_CHEEKS].effect == EFFECT_STUFF_CHEEKS); + ASSUME(GetMoveEffect(MOVE_STUFF_CHEEKS) == EFFECT_STUFF_CHEEKS); PLAYER(SPECIES_GREEDENT) { Item(ITEM_ORAN_BERRY); } PLAYER(SPECIES_SKWOVET); OPPONENT(SPECIES_WOBBUFFET); @@ -76,9 +76,9 @@ SINGLE_BATTLE_TEST("Belch can still be used after switching out") SINGLE_BATTLE_TEST("Belch can still be used after fainting") { GIVEN { - ASSUME(gMovesInfo[MOVE_STUFF_CHEEKS].effect == EFFECT_STUFF_CHEEKS); - ASSUME(gMovesInfo[MOVE_FISSURE].effect == EFFECT_OHKO); - ASSUME(gMovesInfo[MOVE_REVIVAL_BLESSING].effect == EFFECT_REVIVAL_BLESSING); + ASSUME(GetMoveEffect(MOVE_STUFF_CHEEKS) == EFFECT_STUFF_CHEEKS); + ASSUME(GetMoveEffect(MOVE_FISSURE) == EFFECT_OHKO); + ASSUME(GetMoveEffect(MOVE_REVIVAL_BLESSING) == EFFECT_REVIVAL_BLESSING); PLAYER(SPECIES_GREEDENT) { Item(ITEM_ORAN_BERRY); } PLAYER(SPECIES_SKWOVET); OPPONENT(SPECIES_WOBBUFFET); @@ -99,8 +99,8 @@ SINGLE_BATTLE_TEST("Belch can still be used after fainting") SINGLE_BATTLE_TEST("Belch can still be used after restoring the consumed berry") { GIVEN { - ASSUME(gMovesInfo[MOVE_STUFF_CHEEKS].effect == EFFECT_STUFF_CHEEKS); - ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE); + ASSUME(GetMoveEffect(MOVE_STUFF_CHEEKS) == EFFECT_STUFF_CHEEKS); + ASSUME(GetMoveEffect(MOVE_RECYCLE) == EFFECT_RECYCLE); PLAYER(SPECIES_GREEDENT) { Item(ITEM_ORAN_BERRY); } PLAYER(SPECIES_SKWOVET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/belly_drum.c b/test/battle/move_effect/belly_drum.c index bfc558a982..e36689ac34 100644 --- a/test/battle/move_effect/belly_drum.c +++ b/test/battle/move_effect/belly_drum.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM); + ASSUME(GetMoveEffect(MOVE_BELLY_DRUM) == EFFECT_BELLY_DRUM); } SINGLE_BATTLE_TEST("Belly Drum cuts the user's HP in half") @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Belly Drum maximizes the user's Attack stat", s16 damage) PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -64,7 +64,7 @@ SINGLE_BATTLE_TEST("Belly Drum fails if user's current HP is half or less than h SINGLE_BATTLE_TEST("Belly Drum fails if the user's Attack is already at +6") { GIVEN { - ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -111,7 +111,7 @@ SINGLE_BATTLE_TEST("Belly Drum minimizes the user's Attack stat with Contrary", PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_CONTRARY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/bide.c b/test/battle/move_effect/bide.c index f99829d57c..177b139d08 100644 --- a/test/battle/move_effect/bide.c +++ b/test/battle/move_effect/bide.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_BIDE].effect == EFFECT_BIDE); + ASSUME(GetMoveEffect(MOVE_BIDE) == EFFECT_BIDE); } SINGLE_BATTLE_TEST("Bide deals twice the taken damage over two turns") diff --git a/test/battle/move_effect/body_press.c b/test/battle/move_effect/body_press.c index 3a61c4d55d..d3aafa2d32 100644 --- a/test/battle/move_effect/body_press.c +++ b/test/battle/move_effect/body_press.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_BODY_PRESS].effect == EFFECT_BODY_PRESS); - ASSUME(gMovesInfo[MOVE_BODY_PRESS].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveEffect(MOVE_BODY_PRESS) == EFFECT_BODY_PRESS); + ASSUME(GetMoveCategory(MOVE_BODY_PRESS) == DAMAGE_CATEGORY_PHYSICAL); } SINGLE_BATTLE_TEST("Body Press uses physical defense stat of target", s16 damage) @@ -15,8 +15,8 @@ SINGLE_BATTLE_TEST("Body Press uses physical defense stat of target", s16 damage PARAMETRIZE { move = MOVE_BODY_PRESS; } GIVEN { - ASSUME(gMovesInfo[MOVE_DRILL_PECK].power == gMovesInfo[MOVE_BODY_PRESS].power); - ASSUME(gMovesInfo[MOVE_CHARM].effect == EFFECT_ATTACK_DOWN_2); + ASSUME(GetMovePower(MOVE_DRILL_PECK) == GetMovePower(MOVE_BODY_PRESS)); + ASSUME(GetMoveEffect(MOVE_CHARM) == EFFECT_ATTACK_DOWN_2); PLAYER(SPECIES_MEW); OPPONENT(SPECIES_SHELLDER); } WHEN { @@ -55,8 +55,8 @@ SINGLE_BATTLE_TEST("Body Press's damage depends on the user's Defense and not At PARAMETRIZE { move = MOVE_SWORDS_DANCE; } PARAMETRIZE { move = MOVE_CELEBRATE; } // Nothing, stats are default GIVEN { - ASSUME(gMovesInfo[MOVE_IRON_DEFENSE].effect == EFFECT_DEFENSE_UP_2); - ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); + ASSUME(GetMoveEffect(MOVE_IRON_DEFENSE) == EFFECT_DEFENSE_UP_2); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Attack(150); Defense(150); } } WHEN { @@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Body Press uses Defense Stat even in Wonder Room", s16 damag PARAMETRIZE { move = MOVE_WONDER_ROOM; } PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { - ASSUME(gMovesInfo[MOVE_WONDER_ROOM].effect == EFFECT_WONDER_ROOM); + ASSUME(GetMoveEffect(MOVE_WONDER_ROOM) == EFFECT_WONDER_ROOM); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { SpDefense(50); Defense(150); } } WHEN { @@ -102,8 +102,8 @@ SINGLE_BATTLE_TEST("Body Press uses Special Defense stat Stages in Wonder Room", PARAMETRIZE { move = MOVE_AMNESIA; } PARAMETRIZE { move = MOVE_CELEBRATE; } // Nothing, stats are default GIVEN { - ASSUME(gMovesInfo[MOVE_IRON_DEFENSE].effect == EFFECT_DEFENSE_UP_2); - ASSUME(gMovesInfo[MOVE_AMNESIA].effect == EFFECT_SPECIAL_DEFENSE_UP_2); + ASSUME(GetMoveEffect(MOVE_IRON_DEFENSE) == EFFECT_DEFENSE_UP_2); + ASSUME(GetMoveEffect(MOVE_AMNESIA) == EFFECT_SPECIAL_DEFENSE_UP_2); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { SpDefense(150); Defense(150); } } WHEN { diff --git a/test/battle/move_effect/brick_break.c b/test/battle/move_effect/brick_break.c index 30436c6d56..05e22f42d9 100644 --- a/test/battle/move_effect/brick_break.c +++ b/test/battle/move_effect/brick_break.c @@ -3,12 +3,12 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_BRICK_BREAK].effect == EFFECT_BRICK_BREAK); - ASSUME(gMovesInfo[MOVE_PSYCHIC_FANGS].effect == EFFECT_BRICK_BREAK); - ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); - ASSUME(gMovesInfo[MOVE_LIGHT_SCREEN].effect == EFFECT_LIGHT_SCREEN); - ASSUME(gMovesInfo[MOVE_REFLECT].effect == EFFECT_REFLECT); - ASSUME(gMovesInfo[MOVE_AURORA_VEIL].effect == EFFECT_AURORA_VEIL); + ASSUME(GetMoveEffect(MOVE_BRICK_BREAK) == EFFECT_BRICK_BREAK); + ASSUME(GetMoveEffect(MOVE_PSYCHIC_FANGS) == EFFECT_BRICK_BREAK); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_LIGHT_SCREEN) == EFFECT_LIGHT_SCREEN); + ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT); + ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL); } SINGLE_BATTLE_TEST("Brick Break and Psychic Fangs remove Light Screen, Reflect and Aurora Veil from the target's side of the field") diff --git a/test/battle/move_effect/change_type_on_item.c b/test/battle/move_effect/change_type_on_item.c index 6365215a42..f5c8f92376 100644 --- a/test/battle/move_effect/change_type_on_item.c +++ b/test/battle/move_effect/change_type_on_item.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TECHNO_BLAST].effect == EFFECT_CHANGE_TYPE_ON_ITEM); - ASSUME(gMovesInfo[MOVE_TECHNO_BLAST].argument == HOLD_EFFECT_DRIVE); + ASSUME(GetMoveEffect(MOVE_TECHNO_BLAST) == EFFECT_CHANGE_TYPE_ON_ITEM); + ASSUME(GetMoveEffectArg_HoldEffect(MOVE_TECHNO_BLAST) == HOLD_EFFECT_DRIVE); } SINGLE_BATTLE_TEST("Techno Blast changes type depending on the drive the user holds") diff --git a/test/battle/move_effect/charge.c b/test/battle/move_effect/charge.c index 78a0ba1b04..8d4bbd9bcc 100644 --- a/test/battle/move_effect/charge.c +++ b/test/battle/move_effect/charge.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(!IS_MOVE_STATUS(MOVE_THUNDERBOLT)); - ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC); + ASSUME(!IsBattleMoveStatus(MOVE_THUNDERBOLT)); + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); } SINGLE_BATTLE_TEST("Charge doubles the damage of the next Electric move of the user") @@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Charge's effect does not stack with Electromorphosis or Wind PARAMETRIZE { species = SPECIES_TADBULB; ability = ABILITY_ELECTROMORPHOSIS; } GIVEN { - ASSUME(gMovesInfo[MOVE_AIR_CUTTER].windMove == TRUE); + ASSUME(IsWindMove(MOVE_AIR_CUTTER)); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -106,8 +106,8 @@ SINGLE_BATTLE_TEST("Charge's effect is removed regardless if the next move is El { s16 damage[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ELECTRIC); - ASSUME(!IS_MOVE_STATUS(MOVE_TACKLE)); + ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_ELECTRIC); + ASSUME(!IsBattleMoveStatus(MOVE_TACKLE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -134,7 +134,7 @@ SINGLE_BATTLE_TEST("Charge will not expire if it flinches twice in a row") { s16 damage[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_IRON_HEAD].additionalEffects[0].moveEffect == MOVE_EFFECT_FLINCH); + ASSUME(GetMoveAdditionalEffectById(MOVE_IRON_HEAD, 0)->moveEffect == MOVE_EFFECT_FLINCH); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } } WHEN { diff --git a/test/battle/move_effect/chilly_reception.c b/test/battle/move_effect/chilly_reception.c index 7e821abe3d..9b464f0d03 100644 --- a/test/battle/move_effect/chilly_reception.c +++ b/test/battle/move_effect/chilly_reception.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_CHILLY_RECEPTION].effect == EFFECT_CHILLY_RECEPTION); + ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_CHILLY_RECEPTION); } SINGLE_BATTLE_TEST("Chilly Reception sets up snow and switches the user out") diff --git a/test/battle/move_effect/coaching.c b/test/battle/move_effect/coaching.c index 4d5581ac33..812063579d 100644 --- a/test/battle/move_effect/coaching.c +++ b/test/battle/move_effect/coaching.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_COACHING].effect == EFFECT_COACHING); + ASSUME(GetMoveEffect(MOVE_COACHING) == EFFECT_COACHING); } DOUBLE_BATTLE_TEST("Coaching raises Attack and Defense of ally by 1 stage each") @@ -25,7 +25,7 @@ DOUBLE_BATTLE_TEST("Coaching raises Attack and Defense of ally by 1 stage each") DOUBLE_BATTLE_TEST("Coaching bypasses Protect") { GIVEN { - ASSUME(gMovesInfo[MOVE_PROTECT].effect == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_PROTECT) == EFFECT_PROTECT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -42,7 +42,7 @@ DOUBLE_BATTLE_TEST("Coaching bypasses Protect") DOUBLE_BATTLE_TEST("Coaching bypasses Crafty Shield") { GIVEN { - ASSUME(gMovesInfo[MOVE_CRAFTY_SHIELD].effect == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_CRAFTY_SHIELD) == EFFECT_PROTECT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -59,7 +59,7 @@ DOUBLE_BATTLE_TEST("Coaching bypasses Crafty Shield") DOUBLE_BATTLE_TEST("Coaching fails if all allies are is semi-invulnerable") { GIVEN { - ASSUME(gMovesInfo[MOVE_FLY].effect == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveEffect(MOVE_FLY) == EFFECT_SEMI_INVULNERABLE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_HAWLUCHA); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/collision_course.c b/test/battle/move_effect/collision_course.c index 9eeeda5b1e..9933df0dc7 100644 --- a/test/battle/move_effect/collision_course.c +++ b/test/battle/move_effect/collision_course.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_COLLISION_COURSE].effect == EFFECT_COLLISION_COURSE); + ASSUME(GetMoveEffect(MOVE_COLLISION_COURSE) == EFFECT_COLLISION_COURSE); } SINGLE_BATTLE_TEST("Collision Course damage is increased by 33 Percent if super effective", s16 damage) diff --git a/test/battle/move_effect/confuse.c b/test/battle/move_effect/confuse.c index 0533821972..425adfc889 100644 --- a/test/battle/move_effect/confuse.c +++ b/test/battle/move_effect/confuse.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TEETER_DANCE].effect == EFFECT_CONFUSE); + ASSUME(GetMoveEffect(MOVE_TEETER_DANCE) == EFFECT_CONFUSE); } SINGLE_BATTLE_TEST("Teeter Dance confuses target") diff --git a/test/battle/move_effect/corrosive_gas.c b/test/battle/move_effect/corrosive_gas.c index cc4110a7e3..84b7c1c70b 100644 --- a/test/battle/move_effect/corrosive_gas.c +++ b/test/battle/move_effect/corrosive_gas.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_CORROSIVE_GAS].effect == EFFECT_CORROSIVE_GAS); + ASSUME(GetMoveEffect(MOVE_CORROSIVE_GAS) == EFFECT_CORROSIVE_GAS); } SINGLE_BATTLE_TEST("Corrosive Gas destroys the target's item or fails if the target has no item") @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Corrosive Gas doesn't destroy the item of a Pokemon with the SINGLE_BATTLE_TEST("Items lost to Corrosive Gas cannot be restored by Recycle") { GIVEN { - ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE); + ASSUME(GetMoveEffect(MOVE_RECYCLE) == EFFECT_RECYCLE); PLAYER(SPECIES_WOBBUFFET) {Speed(15); } OPPONENT(SPECIES_WOBBUFFET) {Item(ITEM_ORAN_BERRY); Speed(10); } } WHEN { diff --git a/test/battle/move_effect/cosmic_power.c b/test/battle/move_effect/cosmic_power.c index 3b52fbe046..5c8fe30f67 100644 --- a/test/battle/move_effect/cosmic_power.c +++ b/test/battle/move_effect/cosmic_power.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_COSMIC_POWER].effect == EFFECT_COSMIC_POWER); + ASSUME(GetMoveEffect(MOVE_COSMIC_POWER) == EFFECT_COSMIC_POWER); } SINGLE_BATTLE_TEST("Cosmic Power increases the user's Defense and Sp. Defense by 1 stage each") diff --git a/test/battle/move_effect/court_change.c b/test/battle/move_effect/court_change.c index f3775d0af6..817ab134ca 100644 --- a/test/battle/move_effect/court_change.c +++ b/test/battle/move_effect/court_change.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_COURT_CHANGE].effect == EFFECT_COURT_CHANGE); + ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); } DOUBLE_BATTLE_TEST("Court Change swaps entry hazards used by the opponent") @@ -106,7 +106,7 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Auror MESSAGE("The opposing Wobbuffet used Tailwind!"); MESSAGE("Wynaut used Court Change!"); MESSAGE("Wynaut swapped the battle effects affecting each side of the field!"); - // The effects now end for the player side. + // The effects now end for the player side. MESSAGE("Your team's Mist wore off!"); MESSAGE("Your team is no longer protected by Safeguard!"); MESSAGE("Your team's Reflect wore off!"); @@ -153,4 +153,66 @@ DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Aur } } -TO_DO_BATTLE_TEST("Court Change used by the player swaps G-Max Steelsurge, G-Max Vine Lash, G-Max Wildfire, G-Max Cannonade"); +DOUBLE_BATTLE_TEST("Court Change used by the player swaps G-Max Steelsurge") +{ + GIVEN { + PLAYER(SPECIES_COPPERAJAH) { GigantamaxFactor(TRUE); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_IRON_HEAD, target: opponentRight, gimmick: GIMMICK_DYNAMAX); } + TURN { MOVE(opponentLeft, MOVE_COURT_CHANGE); } + TURN { SWITCH(opponentLeft, 2); SWITCH(playerLeft, 2); } + } SCENE { + MESSAGE("Copperajah used G-Max Steelsurge!"); + SEND_IN_MESSAGE("Wobbuffet"); + MESSAGE("The sharp steel bit into Wobbuffet!"); + NONE_OF { + MESSAGE("The sharp steel bit into the opposing Wynaut!"); + } + } +} + +DOUBLE_BATTLE_TEST("Court Change used by the player swaps G-Max Vine Lash, G-Max Wildfire, G-Max Cannonade") +{ + u32 species, move; + PARAMETRIZE { species = SPECIES_VENUSAUR; move = MOVE_VINE_WHIP; } + PARAMETRIZE { species = SPECIES_CHARIZARD; move = MOVE_EMBER; } + PARAMETRIZE { species = SPECIES_BLASTOISE; move = MOVE_WATER_GUN; } + GIVEN { + PLAYER(species) { GigantamaxFactor(TRUE); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(playerLeft, move, target: opponentRight, gimmick: GIMMICK_DYNAMAX); + MOVE(opponentLeft, MOVE_COURT_CHANGE); + } + } SCENE { + switch (species) { + case SPECIES_VENUSAUR: + MESSAGE("Venusaur used G-Max Vine Lash!"); + MESSAGE("Wobbuffet is hurt by G-Max Vine Lash's ferocious beating!"); + break; + case SPECIES_CHARIZARD: + MESSAGE("Charizard used G-Max Wildfire!"); + MESSAGE("Wobbuffet is burning up within G-Max Wildfire's flames!"); + break; + case SPECIES_BLASTOISE: + MESSAGE("Blastoise used G-Max Cannonade!"); + MESSAGE("Wobbuffet is hurt by G-Max Cannonade's vortex!"); + break; + } + NONE_OF { + MESSAGE("The opposing Wynaut is hurt by G-Max Vine Lash's ferocious beating!"); + MESSAGE("The opposing Wynaut is burning up within G-Max Wildfire's flames!"); + MESSAGE("The opposing Wynaut is hurt by G-Max Cannonade's vortex!"); + } + } +} diff --git a/test/battle/move_effect/curse.c b/test/battle/move_effect/curse.c index 9d456ef8db..bb1de42fba 100644 --- a/test/battle/move_effect/curse.c +++ b/test/battle/move_effect/curse.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_CURSE].effect == EFFECT_CURSE); + ASSUME(GetMoveEffect(MOVE_CURSE) == EFFECT_CURSE); } SINGLE_BATTLE_TEST("Curse lowers Speed, raises Attack, and raises Defense when used by non-Ghost-types") diff --git a/test/battle/move_effect/dark_void.c b/test/battle/move_effect/dark_void.c index b7af9a58b2..a69d7d6930 100644 --- a/test/battle/move_effect/dark_void.c +++ b/test/battle/move_effect/dark_void.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_DARK_VOID].effect == EFFECT_DARK_VOID); + ASSUME(GetMoveEffect(MOVE_DARK_VOID) == EFFECT_DARK_VOID); } SINGLE_BATTLE_TEST("Dark Void inflicts 1-3 turns of sleep") diff --git a/test/battle/move_effect/defense_curl.c b/test/battle/move_effect/defense_curl.c index da9acbbeda..c8beffe171 100644 --- a/test/battle/move_effect/defense_curl.c +++ b/test/battle/move_effect/defense_curl.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_DEFENSE_CURL].effect == EFFECT_DEFENSE_CURL); + ASSUME(GetMoveEffect(MOVE_DEFENSE_CURL) == EFFECT_DEFENSE_CURL); } SINGLE_BATTLE_TEST("Defense Curl raises Defense by 1 stage", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Defense Curl raises Defense by 1 stage", s16 damage) PARAMETRIZE { raiseDefense = FALSE; } PARAMETRIZE { raiseDefense = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/defense_down.c b/test/battle/move_effect/defense_down.c index bda3a128d7..9691b4a1c2 100644 --- a/test/battle/move_effect/defense_down.c +++ b/test/battle/move_effect/defense_down.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TAIL_WHIP].effect == EFFECT_DEFENSE_DOWN); + ASSUME(GetMoveEffect(MOVE_TAIL_WHIP) == EFFECT_DEFENSE_DOWN); } SINGLE_BATTLE_TEST("Tail Whip lowers Defense by 1 stage", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Tail Whip lowers Defense by 1 stage", s16 damage) PARAMETRIZE { lowerDefense = FALSE; } PARAMETRIZE { lowerDefense = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/defense_down_2.c b/test/battle/move_effect/defense_down_2.c index 121d638536..961e2de02f 100644 --- a/test/battle/move_effect/defense_down_2.c +++ b/test/battle/move_effect/defense_down_2.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SCREECH].effect == EFFECT_DEFENSE_DOWN_2); + ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2); } SINGLE_BATTLE_TEST("Screech lowers Defense by 2 stages", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Screech lowers Defense by 2 stages", s16 damage) PARAMETRIZE { lowerDefense = FALSE; } PARAMETRIZE { lowerDefense = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/defense_up.c b/test/battle/move_effect/defense_up.c index 9840760254..c83f2c01c5 100644 --- a/test/battle/move_effect/defense_up.c +++ b/test/battle/move_effect/defense_up.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HARDEN].effect == EFFECT_DEFENSE_UP); + ASSUME(GetMoveEffect(MOVE_HARDEN) == EFFECT_DEFENSE_UP); } SINGLE_BATTLE_TEST("Harden raises Defense by 1 stage", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Harden raises Defense by 1 stage", s16 damage) PARAMETRIZE { raiseDefense = FALSE; } PARAMETRIZE { raiseDefense = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/defense_up_2.c b/test/battle/move_effect/defense_up_2.c index 18fbac53d6..59ca5c1af9 100644 --- a/test/battle/move_effect/defense_up_2.c +++ b/test/battle/move_effect/defense_up_2.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_IRON_DEFENSE].effect == EFFECT_DEFENSE_UP_2); + ASSUME(GetMoveEffect(MOVE_IRON_DEFENSE) == EFFECT_DEFENSE_UP_2); } SINGLE_BATTLE_TEST("Iron Defense raises Defense by 2 stages", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Iron Defense raises Defense by 2 stages", s16 damage) PARAMETRIZE { raiseDefense = FALSE; } PARAMETRIZE { raiseDefense = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/defense_up_3.c b/test/battle/move_effect/defense_up_3.c index 983bbb2446..040537c1d4 100644 --- a/test/battle/move_effect/defense_up_3.c +++ b/test/battle/move_effect/defense_up_3.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_COTTON_GUARD].effect == EFFECT_DEFENSE_UP_3); + ASSUME(GetMoveEffect(MOVE_COTTON_GUARD) == EFFECT_DEFENSE_UP_3); } SINGLE_BATTLE_TEST("Cotton Guard raises Defense by 3 stages", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Cotton Guard raises Defense by 3 stages", s16 damage) PARAMETRIZE { raiseDefense = FALSE; } PARAMETRIZE { raiseDefense = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/defog.c b/test/battle/move_effect/defog.c index a429da4511..3d0a46806c 100644 --- a/test/battle/move_effect/defog.c +++ b/test/battle/move_effect/defog.c @@ -3,20 +3,20 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_DEFOG].effect == EFFECT_DEFOG); - ASSUME(gMovesInfo[MOVE_REFLECT].effect == EFFECT_REFLECT); - ASSUME(gMovesInfo[MOVE_LIGHT_SCREEN].effect == EFFECT_LIGHT_SCREEN); - ASSUME(gMovesInfo[MOVE_MIST].effect == EFFECT_MIST); - ASSUME(gMovesInfo[MOVE_SAFEGUARD].effect == EFFECT_SAFEGUARD); - ASSUME(gMovesInfo[MOVE_AURORA_VEIL].effect == EFFECT_AURORA_VEIL); - ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].effect == EFFECT_STEALTH_ROCK); - ASSUME(gMovesInfo[MOVE_SPIKES].effect == EFFECT_SPIKES); - ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); - ASSUME(gMovesInfo[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB); - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); - ASSUME(gMovesInfo[MOVE_SCREECH].effect == EFFECT_DEFENSE_DOWN_2); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_GUST].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveEffect(MOVE_DEFOG) == EFFECT_DEFOG); + ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT); + ASSUME(GetMoveEffect(MOVE_LIGHT_SCREEN) == EFFECT_LIGHT_SCREEN); + ASSUME(GetMoveEffect(MOVE_MIST) == EFFECT_MIST); + ASSUME(GetMoveEffect(MOVE_SAFEGUARD) == EFFECT_SAFEGUARD); + ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL); + ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK); + ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); + ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); + ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); } SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 stage") @@ -302,7 +302,7 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy PARAMETRIZE { move = MOVE_DEFOG; } PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { - ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); PLAYER(SPECIES_GLALIE) { Speed(4); } PLAYER(SPECIES_GLALIE) { Speed(3); } @@ -334,7 +334,7 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy DOUBLE_BATTLE_TEST("Defog removes everything it can") { GIVEN { - ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); PLAYER(SPECIES_GLALIE) { Speed(4); } PLAYER(SPECIES_GLALIE) { Speed(3); } diff --git a/test/battle/move_effect/destiny_bond.c b/test/battle/move_effect/destiny_bond.c index b8ce84f759..ecb8b1d3ef 100644 --- a/test/battle/move_effect/destiny_bond.c +++ b/test/battle/move_effect/destiny_bond.c @@ -1,6 +1,11 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_DESTINY_BOND) == EFFECT_DESTINY_BOND); +} + SINGLE_BATTLE_TEST("Destiny Bond faints the opposing mon if it fainted from the attack") { GIVEN { @@ -16,6 +21,79 @@ SINGLE_BATTLE_TEST("Destiny Bond faints the opposing mon if it fainted from the } } +SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially in Gen 7+") +{ + GIVEN { + ASSUME(B_DESTINY_BOND_FAIL >= GEN_7); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); } + TURN { MOVE(player, MOVE_DESTINY_BOND); SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + MESSAGE("2 sent out Zigzagoon!"); + NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); } + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by other moves in Gen 7+") +{ + GIVEN { + ASSUME(B_DESTINY_BOND_FAIL >= GEN_7); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); } + TURN { MOVE(player, MOVE_GROWL); SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_DESTINY_BOND); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + MESSAGE("2 sent out Zigzagoon!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + NOT { MESSAGE("But it failed!"); } + } +} + +SINGLE_BATTLE_TEST("Destiny Bond does not fail if used after failing in Gen 7+") +{ + GIVEN { + ASSUME(B_DESTINY_BOND_FAIL >= GEN_7); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); } + TURN { MOVE(player, MOVE_DESTINY_BOND); SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_DESTINY_BOND); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + MESSAGE("2 sent out Zigzagoon!"); + NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); } + MESSAGE("But it failed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + } +} + +// can't be used at all in Raid, see "Documenting Dynamax" +SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Destiny Bond") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } + } WHEN { + TURN { MOVE(opponent, MOVE_DESTINY_BOND); MOVE(player, MOVE_TACKLE, gimmick: GIMMICK_DYNAMAX); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Destiny Bond!"); + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("The opposing Wobbuffet fainted!"); + NONE_OF { HP_BAR(player); } + } +} + TO_DO_BATTLE_TEST("Destiny Bond's effect disappears if the user takes a new turn - Move"); TO_DO_BATTLE_TEST("Destiny Bond's effect disappears if the user takes a new turn - Sleep"); TO_DO_BATTLE_TEST("Destiny Bond's effect disappears if the user takes a new turn - Paralysis"); @@ -31,18 +109,3 @@ TO_DO_BATTLE_TEST("Destiny Bond can be used multiple times in a row (Gen 2-6)"); TO_DO_BATTLE_TEST("Destiny Bond always fails if it was successfully used the previous turn (Gen 7+)"); TO_DO_BATTLE_TEST("Destiny Bond cannot be used in Raids"); -// can't be used at all in Raid, see "Documenting Dynamax" -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Destiny Bond") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; - OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } - } WHEN { - TURN { MOVE(opponent, MOVE_DESTINY_BOND); MOVE(player, MOVE_TACKLE, gimmick: GIMMICK_DYNAMAX); } - } SCENE { - MESSAGE("The opposing Wobbuffet used Destiny Bond!"); - MESSAGE("Wobbuffet used Max Strike!"); - MESSAGE("The opposing Wobbuffet fainted!"); - NONE_OF { HP_BAR(player); } - } -} diff --git a/test/battle/move_effect/doodle.c b/test/battle/move_effect/doodle.c index a43a149dc8..af144ecee5 100644 --- a/test/battle/move_effect/doodle.c +++ b/test/battle/move_effect/doodle.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_DOODLE].effect == EFFECT_DOODLE); + ASSUME(GetMoveEffect(MOVE_DOODLE) == EFFECT_DOODLE); } DOUBLE_BATTLE_TEST("Doodle gives the target's ability to user and ally") diff --git a/test/battle/move_effect/double_power_on_arg_status.c b/test/battle/move_effect/double_power_on_arg_status.c index d147264470..d733d04c4f 100644 --- a/test/battle/move_effect/double_power_on_arg_status.c +++ b/test/battle/move_effect/double_power_on_arg_status.c @@ -12,8 +12,8 @@ SINGLE_BATTLE_TEST("Hex deals double damage to foes with a status", s16 damage) PARAMETRIZE { status1 = STATUS1_PARALYSIS; } PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; } GIVEN { - ASSUME(gMovesInfo[MOVE_HEX].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); - ASSUME(gMovesInfo[MOVE_HEX].argument == STATUS1_ANY); + ASSUME(GetMoveEffect(MOVE_HEX) == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(GetMoveEffectArg_Status(MOVE_HEX) == STATUS1_ANY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); } } WHEN { @@ -36,8 +36,8 @@ SINGLE_BATTLE_TEST("Venoshock's power doubles if the target is poisoned/badly po PARAMETRIZE { status1 = STATUS1_POISON; } PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; } GIVEN { - ASSUME(gMovesInfo[MOVE_VENOSHOCK].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); - ASSUME(gMovesInfo[MOVE_VENOSHOCK].argument == STATUS1_PSN_ANY); + ASSUME(GetMoveEffect(MOVE_VENOSHOCK) == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(GetMoveEffectArg_Status(MOVE_VENOSHOCK) == STATUS1_PSN_ANY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); } } WHEN { diff --git a/test/battle/move_effect/dragon_cheer.c b/test/battle/move_effect/dragon_cheer.c index 34a7f0b05e..e2929c16d4 100644 --- a/test/battle/move_effect/dragon_cheer.c +++ b/test/battle/move_effect/dragon_cheer.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER); + ASSUME(GetMoveEffect(MOVE_DRAGON_CHEER) == EFFECT_DRAGON_CHEER); } SINGLE_BATTLE_TEST("Dragon Cheer fails in a single battle") @@ -29,7 +29,7 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 1 on non-Dragon PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); + ASSUME(GetMoveCriticalHitStage(MOVE_TACKLE) == 0); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -63,7 +63,7 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 2 on Dragon typ PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); + ASSUME(GetMoveCriticalHitStage(MOVE_TACKLE) == 0); ASSUME(gSpeciesInfo[SPECIES_DRATINI].baseSpeed == 50); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_DRATINI); @@ -88,8 +88,8 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 2 on Dragon typ DOUBLE_BATTLE_TEST("Dragon Cheer fails if critical hit stage was already increased by Focus Energy") { GIVEN { - ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); - ASSUME(gMovesInfo[MOVE_FOCUS_ENERGY].effect == EFFECT_FOCUS_ENERGY); + ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); + ASSUME(GetMoveEffect(MOVE_FOCUS_ENERGY) == EFFECT_FOCUS_ENERGY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/dragon_darts.c b/test/battle/move_effect/dragon_darts.c index 336d9cd1a5..9e178f67c8 100644 --- a/test/battle/move_effect/dragon_darts.c +++ b/test/battle/move_effect/dragon_darts.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_DRAGON_DARTS].effect == EFFECT_DRAGON_DARTS); + ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS); ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); } @@ -103,7 +103,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if electrified and th PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; abilityLeft = ABILITY_VOLT_ABSORB; abilityRight = ABILITY_WATER_ABSORB; } PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentRight; abilityLeft = ABILITY_VOLT_ABSORB; abilityRight = ABILITY_WATER_ABSORB; } GIVEN { - ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_LANTURN) { Ability(abilityLeft); }; @@ -129,7 +129,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if electrified and th PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; abilityLeft = ABILITY_MOTOR_DRIVE; abilityRight = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentRight; abilityLeft = ABILITY_MOTOR_DRIVE; abilityRight = ABILITY_VITAL_SPIRIT; } GIVEN { - ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ELECTIVIRE) { Ability(abilityLeft); }; @@ -152,7 +152,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if the other one is i PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; } PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; } GIVEN { - ASSUME(gMovesInfo[MOVE_FLY].effect == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveEffect(MOVE_FLY) == EFFECT_SEMI_INVULNERABLE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/dream_eater.c b/test/battle/move_effect/dream_eater.c index 70319be9c5..67b2ed5af5 100644 --- a/test/battle/move_effect/dream_eater.c +++ b/test/battle/move_effect/dream_eater.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_DREAM_EATER].effect == EFFECT_DREAM_EATER); + ASSUME(GetMoveEffect(MOVE_DREAM_EATER) == EFFECT_DREAM_EATER); } SINGLE_BATTLE_TEST("Dream Eater recovers 50% of the damage dealt") diff --git a/test/battle/move_effect/dynamax_double_dmg.c b/test/battle/move_effect/dynamax_double_dmg.c index 593f969862..c19ba5ecbc 100644 --- a/test/battle/move_effect/dynamax_double_dmg.c +++ b/test/battle/move_effect/dynamax_double_dmg.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Dynamax Cannon causes double damage to Dynamaxed Pokemon", s PARAMETRIZE { dynamax = GIMMICK_NONE; } PARAMETRIZE { dynamax = GIMMICK_DYNAMAX; } GIVEN { - ASSUME(gMovesInfo[MOVE_DYNAMAX_CANNON].effect == EFFECT_DYNAMAX_DOUBLE_DMG); + ASSUME(GetMoveEffect(MOVE_DYNAMAX_CANNON) == EFFECT_DYNAMAX_DOUBLE_DMG); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/earthquake.c b/test/battle/move_effect/earthquake.c index 93955e15b4..2cbf3b32c5 100644 --- a/test/battle/move_effect/earthquake.c +++ b/test/battle/move_effect/earthquake.c @@ -10,8 +10,8 @@ SINGLE_BATTLE_TEST("Earthquake's and Bulldoze's damage is halved when Grassy Ter PARAMETRIZE { terrain = FALSE; move = MOVE_BULLDOZE; } // 2 PARAMETRIZE { terrain = TRUE; move = MOVE_BULLDOZE; } // 3 GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].effect == EFFECT_EARTHQUAKE); - ASSUME(gMovesInfo[MOVE_BULLDOZE].effect == EFFECT_EARTHQUAKE); + ASSUME(GetMoveEffect(MOVE_EARTHQUAKE) == EFFECT_EARTHQUAKE); + ASSUME(GetMoveEffect(MOVE_BULLDOZE) == EFFECT_EARTHQUAKE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/electrify.c b/test/battle/move_effect/electrify.c index 374a5b143f..d00d342196 100644 --- a/test/battle/move_effect/electrify.c +++ b/test/battle/move_effect/electrify.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the rema { GIVEN { ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SANDSLASH); } WHEN { @@ -20,7 +20,7 @@ DOUBLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the rema { GIVEN { ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_SANDSLASH); @@ -40,8 +40,8 @@ SINGLE_BATTLE_TEST("Electrify can change status moves to Electric-type") KNOWN_FAILING; GIVEN { ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_LEER].category == DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_LEER].type != TYPE_ELECTRIC); + ASSUME(GetMoveCategory(MOVE_LEER) == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveType(MOVE_LEER) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SANDSLASH); } WHEN { @@ -56,8 +56,8 @@ SINGLE_BATTLE_TEST("Electrify changes the type of foreseen moves when hitting it { GIVEN { ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].type != TYPE_ELECTRIC); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); + ASSUME(GetMoveType(MOVE_FUTURE_SIGHT) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SANDSLASH); } WHEN { diff --git a/test/battle/move_effect/embargo.c b/test/battle/move_effect/embargo.c index 81939a6d56..3e86b60b0b 100644 --- a/test/battle/move_effect/embargo.c +++ b/test/battle/move_effect/embargo.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_EMBARGO].effect == EFFECT_EMBARGO); + ASSUME(GetMoveEffect(MOVE_EMBARGO) == EFFECT_EMBARGO); } SINGLE_BATTLE_TEST("Embargo blocks the effect of an affected Pokémon's held item") diff --git a/test/battle/move_effect/encore.c b/test/battle/move_effect/encore.c index dc7968b2a5..2d1863da6b 100644 --- a/test/battle/move_effect/encore.c +++ b/test/battle/move_effect/encore.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ENCORE].effect == EFFECT_ENCORE); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); } SINGLE_BATTLE_TEST("Encore forces consecutive move uses for 3 turns: Encore used before move") diff --git a/test/battle/move_effect/endeavor.c b/test/battle/move_effect/endeavor.c index 72eeaccdaf..43786c29b3 100644 --- a/test/battle/move_effect/endeavor.c +++ b/test/battle/move_effect/endeavor.c @@ -1,6 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Endeavor sets the the target's HP to the user's current HP"); -TO_DO_BATTLE_TEST("Endeavor doesn't fail if the user's HP is greater or equal than the target, but it doesn't heal the target"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_ENDEAVOR) == EFFECT_ENDEAVOR); +} + +SINGLE_BATTLE_TEST("Endeavor causes the target's HP to equal the user's current HP") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ENDEAVOR); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDEAVOR, player); + } THEN { + EXPECT_EQ(player->hp, opponent->hp); + } +} +TO_DO_BATTLE_TEST("Endeavor does not change HP if the target has less HP than the user, but still plays the animation") TO_DO_BATTLE_TEST("Endeavor fails on Ghost-type Pokémon"); diff --git a/test/battle/move_effect/endure.c b/test/battle/move_effect/endure.c index 04f150d3ce..5401321162 100644 --- a/test/battle/move_effect/endure.c +++ b/test/battle/move_effect/endure.c @@ -6,8 +6,8 @@ TO_DO_BATTLE_TEST("Endure allows the user to survive any attack with 1 HP left") SINGLE_BATTLE_TEST("Endure does not prevent multiple hits and stat changes occur at the end of the turn") { GIVEN { - ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); - ASSUME(gMovesInfo[MOVE_ENDURE].effect == EFFECT_ENDURE); + ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_ENDURE) == EFFECT_ENDURE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { diff --git a/test/battle/move_effect/evasion_up.c b/test/battle/move_effect/evasion_up.c index 48722a7596..529a32c4f1 100644 --- a/test/battle/move_effect/evasion_up.c +++ b/test/battle/move_effect/evasion_up.c @@ -3,14 +3,14 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_DOUBLE_TEAM].effect == EFFECT_EVASION_UP); + ASSUME(GetMoveEffect(MOVE_DOUBLE_TEAM) == EFFECT_EVASION_UP); } SINGLE_BATTLE_TEST("Double Team raises Evasion by 1 stage") { - PASSES_RANDOMLY(gMovesInfo[MOVE_SCRATCH].accuracy * 3 / 4, 100, RNG_ACCURACY); + PASSES_RANDOMLY(GetMoveAccuracy(MOVE_SCRATCH) * 3 / 4, 100, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100); + ASSUME(GetMoveAccuracy(MOVE_SCRATCH) == 100); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/evasion_up_2.c b/test/battle/move_effect/evasion_up_2.c index cd5cb543a9..e38f037545 100644 --- a/test/battle/move_effect/evasion_up_2.c +++ b/test/battle/move_effect/evasion_up_2.c @@ -6,14 +6,14 @@ /* ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_X].effect == EFFECT_EVASION_UP_2); + ASSUME(GetMoveEffect(MOVE_X) == EFFECT_EVASION_UP_2); } SINGLE_BATTLE_TEST("Double Team raises Evasion by 1 stage") { - PASSES_RANDOMLY(gMovesInfo[MOVE_SCRATCH].accuracy * 3 / 5, 100, RNG_ACCURACY); + PASSES_RANDOMLY(GetMoveAccuracy(MOVE_SCRATCH) * 3 / 5, 100, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100); + ASSUME(GetMoveAccuracy(MOVE_SCRATCH) == 100); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/explosion.c b/test/battle/move_effect/explosion.c index d463e10349..52eec1a8e2 100644 --- a/test/battle/move_effect/explosion.c +++ b/test/battle/move_effect/explosion.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); } SINGLE_BATTLE_TEST("Explosion causes the user to faint") @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Explosion causes the user to faint even if it misses") SINGLE_BATTLE_TEST("Explosion causes the user to faint even if it has no effect") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_EXPLOSION) == TYPE_NORMAL); ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GASTLY); @@ -82,10 +82,10 @@ DOUBLE_BATTLE_TEST("Explosion causes everyone to faint in a double battle") HP_BAR(playerLeft, hp: 0); ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft); HP_BAR(opponentLeft, hp: 0); - MESSAGE("The opposing Abra fainted!"); HP_BAR(playerRight, hp: 0); - MESSAGE("Wynaut fainted!"); HP_BAR(opponentRight, hp: 0); + MESSAGE("The opposing Abra fainted!"); + MESSAGE("Wynaut fainted!"); MESSAGE("The opposing Kadabra fainted!"); MESSAGE("Wobbuffet fainted!"); } @@ -139,8 +139,8 @@ DOUBLE_BATTLE_TEST("Explosion boosted by Galvanize is correctly blocked by Volt ABILITY_POPUP(opponentLeft, ABILITY_VOLT_ABSORB); NOT HP_BAR(opponentLeft, hp: 0); HP_BAR(playerRight, hp: 0); - MESSAGE("Wynaut fainted!"); HP_BAR(opponentRight, hp: 0); + MESSAGE("Wynaut fainted!"); MESSAGE("The opposing Wobbuffet fainted!"); MESSAGE("Geodude fainted!"); } diff --git a/test/battle/move_effect/fail_if_not_arg_type.c b/test/battle/move_effect/fail_if_not_arg_type.c index 9e8d005d8b..368c3410c0 100644 --- a/test/battle/move_effect/fail_if_not_arg_type.c +++ b/test/battle/move_effect/fail_if_not_arg_type.c @@ -4,8 +4,8 @@ SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type") { GIVEN { - ASSUME(gMovesInfo[MOVE_BURN_UP].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE); - ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); + ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); + ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE); ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE); PLAYER(SPECIES_CYNDAQUIL); @@ -24,8 +24,8 @@ SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type") SINGLE_BATTLE_TEST("Burn Up fails if the user isn't a Fire-type") { GIVEN { - ASSUME(gMovesInfo[MOVE_BURN_UP].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE); - ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); + ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); + ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -41,8 +41,8 @@ SINGLE_BATTLE_TEST("Burn Up fails if the user isn't a Fire-type") SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type if enemy faints") { GIVEN { - ASSUME(gMovesInfo[MOVE_BURN_UP].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE); - ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); + ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); + ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE); ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE); PLAYER(SPECIES_CYNDAQUIL); @@ -59,8 +59,8 @@ SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type if enemy faints") SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type") { GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_SHOCK].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE); - ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); + ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE); + ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC); ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC); PLAYER(SPECIES_PIKACHU); @@ -79,8 +79,8 @@ SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type") SINGLE_BATTLE_TEST("Double Shock fails if the user isn't an Electric-type") { GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_SHOCK].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE); - ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); + ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE); + ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -96,8 +96,8 @@ SINGLE_BATTLE_TEST("Double Shock fails if the user isn't an Electric-type") SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type if enemy faints") { GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_SHOCK].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE); - ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); + ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE); + ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC); ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC); PLAYER(SPECIES_PIKACHU); diff --git a/test/battle/move_effect/fickle_beam.c b/test/battle/move_effect/fickle_beam.c index ffbbe4d18d..0313823aa9 100644 --- a/test/battle/move_effect/fickle_beam.c +++ b/test/battle/move_effect/fickle_beam.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FICKLE_BEAM].effect == EFFECT_FICKLE_BEAM); + ASSUME(GetMoveEffect(MOVE_FICKLE_BEAM) == EFFECT_FICKLE_BEAM); } SINGLE_BATTLE_TEST("Fickle Beam deals double damage 30% of the time") @@ -12,8 +12,8 @@ SINGLE_BATTLE_TEST("Fickle Beam deals double damage 30% of the time") PASSES_RANDOMLY(30, 100, RNG_FICKLE_BEAM); GIVEN { - ASSUME(gMovesInfo[MOVE_POWER_GEM].power == 80); - ASSUME(gMovesInfo[MOVE_FICKLE_BEAM].power == 80); + ASSUME(GetMovePower(MOVE_POWER_GEM) == 80); + ASSUME(GetMovePower(MOVE_FICKLE_BEAM) == 80); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/fillet_away.c b/test/battle/move_effect/fillet_away.c index de203dbc5a..f9b679bfe5 100644 --- a/test/battle/move_effect/fillet_away.c +++ b/test/battle/move_effect/fillet_away.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FILLET_AWAY].effect == EFFECT_FILLET_AWAY); + ASSUME(GetMoveEffect(MOVE_FILLET_AWAY) == EFFECT_FILLET_AWAY); } SINGLE_BATTLE_TEST("Fillet Away cuts the user's HP in half") diff --git a/test/battle/move_effect/fixed_damage_arg.c b/test/battle/move_effect/fixed_damage_arg.c index 484601be05..8cb2987072 100644 --- a/test/battle/move_effect/fixed_damage_arg.c +++ b/test/battle/move_effect/fixed_damage_arg.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SONIC_BOOM].effect == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveEffect(MOVE_SONIC_BOOM) == EFFECT_FIXED_DAMAGE_ARG); } SINGLE_BATTLE_TEST("Sonic Boom deals fixed damage", s16 damage) @@ -11,9 +11,9 @@ SINGLE_BATTLE_TEST("Sonic Boom deals fixed damage", s16 damage) u16 mon; PARAMETRIZE { mon = SPECIES_RATTATA; } PARAMETRIZE { mon = SPECIES_ARON; } - + GIVEN { - ASSUME(gMovesInfo[MOVE_SONIC_BOOM].argument == 20); + ASSUME(GetMoveFixedDamage(MOVE_SONIC_BOOM) == 20); PLAYER(SPECIES_WOBBUFFET); OPPONENT(mon); } WHEN { diff --git a/test/battle/move_effect/flame_burst.c b/test/battle/move_effect/flame_burst.c index 3597c80014..df0199e116 100644 --- a/test/battle/move_effect/flame_burst.c +++ b/test/battle/move_effect/flame_burst.c @@ -3,14 +3,14 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FLAME_BURST].additionalEffects->moveEffect == MOVE_EFFECT_FLAME_BURST); + ASSUME(GetMoveAdditionalEffectById(MOVE_FLAME_BURST, 0)->moveEffect == MOVE_EFFECT_FLAME_BURST); } // Flame Burst AoE is supposed to hit through Substitute DOUBLE_BATTLE_TEST("Flame Burst Substitute") { GIVEN { - ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE); + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/move_effect/fling.c b/test/battle/move_effect/fling.c index 2bd1e824f1..b98020474b 100644 --- a/test/battle/move_effect/fling.c +++ b/test/battle/move_effect/fling.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING); + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); } SINGLE_BATTLE_TEST("Fling fails if pokemon holds no item") @@ -38,8 +38,8 @@ SINGLE_BATTLE_TEST("Fling fails if pokemon is under the effects of Embargo or Ma PARAMETRIZE {move = MOVE_MAGIC_ROOM; } GIVEN { - ASSUME(gMovesInfo[MOVE_EMBARGO].effect == EFFECT_EMBARGO); - ASSUME(gMovesInfo[MOVE_MAGIC_ROOM].effect == EFFECT_MAGIC_ROOM); + ASSUME(GetMoveEffect(MOVE_EMBARGO) == EFFECT_EMBARGO); + ASSUME(GetMoveEffect(MOVE_MAGIC_ROOM) == EFFECT_MAGIC_ROOM); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RAZOR_CLAW); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -83,7 +83,7 @@ SINGLE_BATTLE_TEST("Fling fails for pokemon with Klutz ability") SINGLE_BATTLE_TEST("Fling's thrown item can be regained with Recycle") { GIVEN { - ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE); + ASSUME(GetMoveEffect(MOVE_RECYCLE) == EFFECT_RECYCLE); PLAYER(SPECIES_WOBBUFFET) {Item(ITEM_RAZOR_CLAW); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -106,7 +106,7 @@ SINGLE_BATTLE_TEST("Fling's thrown item can be regained with Recycle") SINGLE_BATTLE_TEST("Fling - Item is lost even when there is no target") { GIVEN { - ASSUME(gMovesInfo[MOVE_SELF_DESTRUCT].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_SELF_DESTRUCT) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET) {Item(ITEM_RAZOR_CLAW); Speed(2); } OPPONENT(SPECIES_WOBBUFFET) {Speed(5); } OPPONENT(SPECIES_WOBBUFFET) {Speed(5); } @@ -131,7 +131,7 @@ SINGLE_BATTLE_TEST("Fling - Item is lost even when there is no target") SINGLE_BATTLE_TEST("Fling - Item is lost when target protects itself") { GIVEN { - ASSUME(gMovesInfo[MOVE_PROTECT].effect == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_PROTECT) == EFFECT_PROTECT); PLAYER(SPECIES_WOBBUFFET) {Item(ITEM_RAZOR_CLAW); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -362,7 +362,7 @@ SINGLE_BATTLE_TEST("Fling - thrown berry's effect activates for the target even PARAMETRIZE { item = ITEM_SALAC_BERRY; effect = HOLD_EFFECT_SPEED_UP; statId = STAT_SPEED; } GIVEN { - ASSUME(gMovesInfo[MOVE_FLING].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_FLING) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Item(item); Attack(1); } OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); HP(399); MaxHP(400); MovesWithPP({MOVE_CELEBRATE, 35}); } } WHEN { @@ -441,7 +441,7 @@ SINGLE_BATTLE_TEST("Fling deals damage based on items fling power") s16 damage[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_CRUNCH].power == 80); + ASSUME(GetMovePower(MOVE_CRUNCH) == 80); ASSUME(gItemsInfo[ITEM_VENUSAURITE].flingPower == 80); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_VENUSAURITE); } OPPONENT(SPECIES_REGIROCK); diff --git a/test/battle/move_effect/flower_shield.c b/test/battle/move_effect/flower_shield.c index e31fc9e5cd..784cce99f2 100644 --- a/test/battle/move_effect/flower_shield.c +++ b/test/battle/move_effect/flower_shield.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FLOWER_SHIELD].effect == EFFECT_FLOWER_SHIELD); + ASSUME(GetMoveEffect(MOVE_FLOWER_SHIELD) == EFFECT_FLOWER_SHIELD); } DOUBLE_BATTLE_TEST("Flower Shield raises the defense of all grass type pokemon") diff --git a/test/battle/move_effect/focus_energy.c b/test/battle/move_effect/focus_energy.c index 151a259cfd..227f6b4604 100644 --- a/test/battle/move_effect/focus_energy.c +++ b/test/battle/move_effect/focus_energy.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FOCUS_ENERGY].effect == EFFECT_FOCUS_ENERGY); + ASSUME(GetMoveEffect(MOVE_FOCUS_ENERGY) == EFFECT_FOCUS_ENERGY); } SINGLE_BATTLE_TEST("Focus Energy increases the user's critical hit ratio by 1 stage (Gen 1-2) or 2 stages (Gen 3+)") diff --git a/test/battle/move_effect/focus_punch.c b/test/battle/move_effect/focus_punch.c index e8f36d4ff1..55854ee80e 100644 --- a/test/battle/move_effect/focus_punch.c +++ b/test/battle/move_effect/focus_punch.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FOCUS_PUNCH].effect == EFFECT_FOCUS_PUNCH); + ASSUME(GetMoveEffect(MOVE_FOCUS_PUNCH) == EFFECT_FOCUS_PUNCH); } SINGLE_BATTLE_TEST("Focus Punch activates only if not damaged") diff --git a/test/battle/move_effect/foul_play.c b/test/battle/move_effect/foul_play.c index cc853b48de..7df04201ef 100644 --- a/test/battle/move_effect/foul_play.c +++ b/test/battle/move_effect/foul_play.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FOUL_PLAY].effect == EFFECT_FOUL_PLAY); + ASSUME(GetMoveEffect(MOVE_FOUL_PLAY) == EFFECT_FOUL_PLAY); } SINGLE_BATTLE_TEST("Foul Play uses physical attack stat of target", s16 damage) @@ -14,8 +14,8 @@ SINGLE_BATTLE_TEST("Foul Play uses physical attack stat of target", s16 damage) PARAMETRIZE { move = MOVE_FOUL_PLAY; } GIVEN { - ASSUME(gMovesInfo[MOVE_HIGH_HORSEPOWER].power == gMovesInfo[MOVE_FOUL_PLAY].power); - ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); + ASSUME(GetMovePower(MOVE_HIGH_HORSEPOWER) == GetMovePower(MOVE_FOUL_PLAY)); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); PLAYER(SPECIES_SHELLDER); OPPONENT(SPECIES_SHELLDER); } WHEN { diff --git a/test/battle/move_effect/fury_cutter.c b/test/battle/move_effect/fury_cutter.c index b193882d37..10d9d8a64e 100644 --- a/test/battle/move_effect/fury_cutter.c +++ b/test/battle/move_effect/fury_cutter.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FURY_CUTTER].effect == EFFECT_FURY_CUTTER); + ASSUME(GetMoveEffect(MOVE_FURY_CUTTER) == EFFECT_FURY_CUTTER); } SINGLE_BATTLE_TEST("Fury Cutter power doubles with each use, up to 160 power") diff --git a/test/battle/move_effect/future_sight.c b/test/battle/move_effect/future_sight.c index e25fc75012..3995e8479f 100644 --- a/test/battle/move_effect/future_sight.c +++ b/test/battle/move_effect/future_sight.c @@ -3,10 +3,10 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SEED_FLARE].power == gMovesInfo[MOVE_FUTURE_SIGHT].power); - ASSUME(gMovesInfo[MOVE_SEED_FLARE].category == gMovesInfo[MOVE_FUTURE_SIGHT].category); - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); - ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].power > 0); + ASSUME(GetMovePower(MOVE_SEED_FLARE) == GetMovePower(MOVE_FUTURE_SIGHT)); + ASSUME(GetMoveCategory(MOVE_SEED_FLARE) == GetMoveCategory(MOVE_FUTURE_SIGHT)); + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); + ASSUME(GetMovePower(MOVE_FUTURE_SIGHT) > 0); } SINGLE_BATTLE_TEST("Future Sight uses Sp. Atk stat of the original user without modifiers") @@ -159,7 +159,7 @@ SINGLE_BATTLE_TEST("Future Sight will miss timing if target faints by residual d SINGLE_BATTLE_TEST("Future Sight breaks Focus Sash and doesn't make the holder endure another move") { GIVEN { - ASSUME(gMovesInfo[MOVE_PSYCHIC].power > 0); + ASSUME(GetMovePower(MOVE_PSYCHIC) > 0); ASSUME(gItemsInfo[ITEM_FOCUS_SASH].holdEffect == HOLD_EFFECT_FOCUS_SASH); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Level(1); Item(ITEM_FOCUS_SASH); } diff --git a/test/battle/move_effect/gastro_acid.c b/test/battle/move_effect/gastro_acid.c index b3ce378794..8cb0a7d4af 100644 --- a/test/battle/move_effect/gastro_acid.c +++ b/test/battle/move_effect/gastro_acid.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_GASTRO_ACID].effect == EFFECT_GASTRO_ACID); + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); } SINGLE_BATTLE_TEST("Gastro Acid fails if target has a banned ability") diff --git a/test/battle/move_effect/glaive_rush.c b/test/battle/move_effect/glaive_rush.c index 639756da44..bb5bb7aaf6 100644 --- a/test/battle/move_effect/glaive_rush.c +++ b/test/battle/move_effect/glaive_rush.c @@ -3,14 +3,14 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_GLAIVE_RUSH].effect == EFFECT_GLAIVE_RUSH); + ASSUME(GetMoveEffect(MOVE_GLAIVE_RUSH) == EFFECT_GLAIVE_RUSH); } SINGLE_BATTLE_TEST("If Glaive Rush is successful moves targeted at the user do not check accuracy") { PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { - ASSUME(gMovesInfo[MOVE_MEGA_PUNCH].accuracy == 85); + ASSUME(GetMoveAccuracy(MOVE_MEGA_PUNCH) == 85); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/gravity.c b/test/battle/move_effect/gravity.c index 4ccad08b58..baac7a53ea 100644 --- a/test/battle/move_effect/gravity.c +++ b/test/battle/move_effect/gravity.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_GRAVITY].effect == EFFECT_GRAVITY); + ASSUME(GetMoveEffect(MOVE_GRAVITY) == EFFECT_GRAVITY); } DOUBLE_BATTLE_TEST("Gravity cancels fly and sky drop if they are in the air") diff --git a/test/battle/move_effect/guard_split.c b/test/battle/move_effect/guard_split.c index 3f012ab6e2..d7572c1431 100644 --- a/test/battle/move_effect/guard_split.c +++ b/test/battle/move_effect/guard_split.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_GUARD_SPLIT].effect == EFFECT_GUARD_SPLIT); + ASSUME(GetMoveEffect(MOVE_GUARD_SPLIT) == EFFECT_GUARD_SPLIT); } SINGLE_BATTLE_TEST("Guard Split averages users and targets Def and Sp. Def stats") diff --git a/test/battle/move_effect/haze.c b/test/battle/move_effect/haze.c index 0b28268ae9..3d0602bb73 100644 --- a/test/battle/move_effect/haze.c +++ b/test/battle/move_effect/haze.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HAZE].effect == EFFECT_HAZE); + ASSUME(GetMoveEffect(MOVE_HAZE) == EFFECT_HAZE); } SINGLE_BATTLE_TEST("Haze resets stat changes", s16 damage) @@ -12,8 +12,8 @@ SINGLE_BATTLE_TEST("Haze resets stat changes", s16 damage) PARAMETRIZE { haze = FALSE; } PARAMETRIZE { haze = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_MEDITATE].effect == EFFECT_ATTACK_UP); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveEffect(MOVE_MEDITATE) == EFFECT_ATTACK_UP); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 9b62a36f9b..7730879d45 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -3,49 +3,71 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HEAL_BELL].effect == EFFECT_HEAL_BELL); - ASSUME(gMovesInfo[MOVE_AROMATHERAPY].effect == EFFECT_HEAL_BELL); + ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); } -DOUBLE_BATTLE_TEST("Heal Bell cures the entire party") +DOUBLE_BATTLE_TEST("Heal Bell/Aromatherapy cures the entire party of the user from primary status effects") { - u32 move; - - PARAMETRIZE { move = MOVE_HEAL_BELL; } - PARAMETRIZE { move = MOVE_AROMATHERAPY; } + u32 j, move, status; + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_SLEEP; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_SLEEP; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_POISON; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_POISON; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_BURN; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_BURN; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_FREEZE; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_FREEZE; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_PARALYSIS; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_PARALYSIS; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { move = MOVE_HEAL_BELL; status = STATUS1_FROSTBITE; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; status = STATUS1_FROSTBITE; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); + PLAYER(SPECIES_WOBBUFFET) { + if (status != STATUS1_SLEEP && status != STATUS1_FREEZE) + Status1(status); + } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } OPPONENT(SPECIES_WYNAUT); OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(playerLeft, move, target: playerLeft); } TURN { SWITCH(playerLeft, 2); SWITCH(playerRight, 3); } } SCENE { - int i; - ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); - NOT MESSAGE("Wobbuffet was hurt by its poisoning!"); - for (i = 0; i < 6; i++) + switch(status) + { + case STATUS1_SLEEP: STATUS_ICON(playerLeft, sleep: FALSE); STATUS_ICON(playerRight, sleep: FALSE); break; + case STATUS1_POISON: STATUS_ICON(playerLeft, poison: FALSE); STATUS_ICON(playerRight, poison: FALSE); break; + case STATUS1_BURN: STATUS_ICON(playerLeft, burn: FALSE); STATUS_ICON(playerRight, burn: FALSE); break; + case STATUS1_PARALYSIS: STATUS_ICON(playerLeft, paralysis: FALSE); STATUS_ICON(playerRight, paralysis: FALSE); break; + case STATUS1_TOXIC_POISON: STATUS_ICON(playerLeft, badPoison: FALSE); STATUS_ICON(playerRight, badPoison: FALSE); break; + case STATUS1_FROSTBITE: STATUS_ICON(playerLeft, frostbite: FALSE); STATUS_ICON(playerRight, frostbite: FALSE); break; + } + for (j = 0; j < PARTY_SIZE; j++) EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_STATUS), STATUS1_NONE); } } -DOUBLE_BATTLE_TEST("Heal Bell does not cure soundproof partners") +DOUBLE_BATTLE_TEST("Heal Bell does not cure Soundproof partners (Gen 4, Gen 6+)") { - u32 ability; + u32 ability, config; - PARAMETRIZE { ability = ABILITY_SCRAPPY; } - PARAMETRIZE { ability = ABILITY_SOUNDPROOF; } - - ASSUME(B_HEAL_BELL_SOUNDPROOF != GEN_5); + PARAMETRIZE { ability = ABILITY_SCRAPPY; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_5; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_6; } GIVEN { + ASSUME(IsSoundMove(MOVE_HEAL_BELL)); + WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -54,7 +76,7 @@ DOUBLE_BATTLE_TEST("Heal Bell does not cure soundproof partners") TURN { MOVE(playerLeft, MOVE_HEAL_BELL, target: playerLeft); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BELL, playerLeft); - if (ability == ABILITY_SOUNDPROOF) { + if (ability == ABILITY_SOUNDPROOF && config != GEN_5) { MESSAGE("Exploud was hurt by its poisoning!"); } else { NOT MESSAGE("Exploud was hurt by its poisoning!"); @@ -62,16 +84,17 @@ DOUBLE_BATTLE_TEST("Heal Bell does not cure soundproof partners") } } -SINGLE_BATTLE_TEST("Heal Bell cures inactive soundproof Pokemon") +SINGLE_BATTLE_TEST("Heal Bell cures inactive Soundproof Pokemon (Gen5+)") { - u32 ability; + u32 config, ability; - PARAMETRIZE { ability = ABILITY_SCRAPPY; } - PARAMETRIZE { ability = ABILITY_SOUNDPROOF; } - - ASSUME(B_HEAL_BELL_SOUNDPROOF >= GEN_5); + PARAMETRIZE { config = GEN_4, ability = ABILITY_SCRAPPY; } + PARAMETRIZE { config = GEN_4, ability = ABILITY_SOUNDPROOF; } + PARAMETRIZE { config = GEN_5, ability = ABILITY_SOUNDPROOF; } GIVEN { + ASSUME(IsSoundMove(MOVE_HEAL_BELL)); + WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -81,21 +104,35 @@ SINGLE_BATTLE_TEST("Heal Bell cures inactive soundproof Pokemon") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BELL, player); SEND_IN_MESSAGE("Exploud"); - NOT MESSAGE("Exploud was hurt by its poisoning!"); + if (ability == ABILITY_SCRAPPY || config >= GEN_5) { + NOT MESSAGE("Exploud was hurt by its poisoning!"); + } else { + MESSAGE("Exploud was hurt by its poisoning!"); + } } } -SINGLE_BATTLE_TEST("Heal Bell cures a soundproof user") +SINGLE_BATTLE_TEST("Heal Bell cures a Soundproof user (Gen5, Gen8+)") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } + PARAMETRIZE { config = GEN_6; } + PARAMETRIZE { config = GEN_8; } GIVEN { - ASSUME(B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8); + ASSUME(IsSoundMove(MOVE_HEAL_BELL)); + WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_EXPLOUD) { Ability(ABILITY_SOUNDPROOF); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(player, MOVE_HEAL_BELL, target: player); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BELL, player); - NOT MESSAGE("Exploud was hurt by its poisoning!"); + if (config == GEN_5 || config >= GEN_8) { + NOT MESSAGE("Exploud was hurt by its poisoning!"); + } else { + MESSAGE("Exploud was hurt by its poisoning!"); + } } } diff --git a/test/battle/move_effect/heal_pulse.c b/test/battle/move_effect/heal_pulse.c index e252039982..7c46cbf344 100644 --- a/test/battle/move_effect/heal_pulse.c +++ b/test/battle/move_effect/heal_pulse.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HEAL_PULSE].effect == EFFECT_HEAL_PULSE); + ASSUME(GetMoveEffect(MOVE_HEAL_PULSE) == EFFECT_HEAL_PULSE); } SINGLE_BATTLE_TEST("Heal Pulse heals the target by 1/2 of it's maxHP") @@ -68,7 +68,7 @@ SINGLE_BATTLE_TEST("Heal Pulse ignores accurace checks") SINGLE_BATTLE_TEST("Heal Pulse is blocked by Substitute") { GIVEN { - ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE); + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(50); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -86,8 +86,8 @@ SINGLE_BATTLE_TEST("Heal Pulse is blocked by Substitute") SINGLE_BATTLE_TEST("Floral Healing heals the target by 2/3rd of it's maxHP if Grassy Terrain is on the field") { GIVEN { - ASSUME(gMovesInfo[MOVE_FLORAL_HEALING].argument == MOVE_EFFECT_FLORAL_HEALING); - ASSUME(gMovesInfo[MOVE_GRASSY_TERRAIN].effect == EFFECT_GRASSY_TERRAIN); + ASSUME(GetMoveEffectArg_MoveProperty(MOVE_FLORAL_HEALING) == MOVE_EFFECT_FLORAL_HEALING); + ASSUME(GetMoveEffect(MOVE_GRASSY_TERRAIN) == EFFECT_GRASSY_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/healing_wish.c b/test/battle/move_effect/healing_wish.c index a597d552ed..a29b04367c 100644 --- a/test/battle/move_effect/healing_wish.c +++ b/test/battle/move_effect/healing_wish.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HEALING_WISH].effect == EFFECT_HEALING_WISH); - ASSUME(gMovesInfo[MOVE_LUNAR_DANCE].effect == EFFECT_HEALING_WISH); + ASSUME(GetMoveEffect(MOVE_HEALING_WISH) == EFFECT_HEALING_WISH); + ASSUME(GetMoveEffect(MOVE_LUNAR_DANCE) == EFFECT_HEALING_WISH); } SINGLE_BATTLE_TEST("Healing Wish causes the user to faint and fully heals the replacement") diff --git a/test/battle/move_effect/hidden_power.c b/test/battle/move_effect/hidden_power.c index d1d175013a..7f2bb5f2b9 100644 --- a/test/battle/move_effect/hidden_power.c +++ b/test/battle/move_effect/hidden_power.c @@ -1,6 +1,33 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(gTypesInfo[TYPE_NONE].isHiddenPowerType == FALSE); + ASSUME(gTypesInfo[TYPE_NORMAL].isHiddenPowerType == FALSE); + ASSUME(gTypesInfo[TYPE_FIGHTING].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_FLYING].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_POISON].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_GROUND].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_ROCK].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_BUG].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_GHOST].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_STEEL].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_MYSTERY].isHiddenPowerType == FALSE); + ASSUME(gTypesInfo[TYPE_FIRE].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_WATER].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_GRASS].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_PSYCHIC].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_ICE].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_DRAGON].isHiddenPowerType == TRUE); + ASSUME(gTypesInfo[TYPE_DARK].isHiddenPowerType == TRUE); + // Any type after Dark shouldn't be part of Hidden Power officially. + for (u32 j = TYPE_DARK + 1; j < NUMBER_OF_MON_TYPES; j++) { + ASSUME(gTypesInfo[j].isHiddenPowerType == FALSE); + } +} + // IV combinations sourced from https://www.smogon.com/forums/threads/hidden-power-iv-combinations.78083/ SINGLE_BATTLE_TEST("Hidden Power's type is determined by IVs") { diff --git a/test/battle/move_effect/hit_escape.c b/test/battle/move_effect/hit_escape.c index fb69e1b2fe..83280f9f50 100644 --- a/test/battle/move_effect/hit_escape.c +++ b/test/battle/move_effect/hit_escape.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_U_TURN].effect == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); } SINGLE_BATTLE_TEST("Hit Escape: U-turn switches the user out") @@ -98,7 +98,7 @@ SINGLE_BATTLE_TEST("Hit Escape: U-turn switches the user out if Wimp Out fails t SINGLE_BATTLE_TEST("Hit Escape: U-turn switches the user out after Ice Face activates") { GIVEN { - ASSUME(gMovesInfo[MOVE_U_TURN].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_U_TURN) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_BEEDRILL); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_EISCUE) { Ability(ABILITY_ICE_FACE); } diff --git a/test/battle/move_effect/hit_set_remove_terrain.c b/test/battle/move_effect/hit_set_remove_terrain.c index feeca62560..9b9180d6e4 100644 --- a/test/battle/move_effect/hit_set_remove_terrain.c +++ b/test/battle/move_effect/hit_set_remove_terrain.c @@ -3,12 +3,12 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ELECTRIC_TERRAIN].effect == EFFECT_ELECTRIC_TERRAIN); - ASSUME(gMovesInfo[MOVE_PSYCHIC_TERRAIN].effect == EFFECT_PSYCHIC_TERRAIN); - ASSUME(gMovesInfo[MOVE_GRASSY_TERRAIN].effect == EFFECT_GRASSY_TERRAIN); - ASSUME(gMovesInfo[MOVE_MISTY_TERRAIN].effect == EFFECT_MISTY_TERRAIN); - ASSUME(gMovesInfo[MOVE_STEEL_ROLLER].effect == EFFECT_HIT_SET_REMOVE_TERRAIN); - ASSUME(gMovesInfo[MOVE_ICE_SPINNER].effect == EFFECT_HIT_SET_REMOVE_TERRAIN); + ASSUME(GetMoveEffect(MOVE_ELECTRIC_TERRAIN) == EFFECT_ELECTRIC_TERRAIN); + ASSUME(GetMoveEffect(MOVE_PSYCHIC_TERRAIN) == EFFECT_PSYCHIC_TERRAIN); + ASSUME(GetMoveEffect(MOVE_GRASSY_TERRAIN) == EFFECT_GRASSY_TERRAIN); + ASSUME(GetMoveEffect(MOVE_MISTY_TERRAIN) == EFFECT_MISTY_TERRAIN); + ASSUME(GetMoveEffect(MOVE_STEEL_ROLLER) == EFFECT_HIT_SET_REMOVE_TERRAIN); + ASSUME(GetMoveEffect(MOVE_ICE_SPINNER) == EFFECT_HIT_SET_REMOVE_TERRAIN); } SINGLE_BATTLE_TEST("Steel Roller and Ice Spinner can remove a terrain from the field") diff --git a/test/battle/move_effect/hit_switch_target.c b/test/battle/move_effect/hit_switch_target.c index 8760dd597c..61c92d227e 100644 --- a/test/battle/move_effect/hit_switch_target.c +++ b/test/battle/move_effect/hit_switch_target.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET); - ASSUME(gMovesInfo[MOVE_LOCK_ON].effect == EFFECT_LOCK_ON); + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); + ASSUME(GetMoveEffect(MOVE_LOCK_ON) == EFFECT_LOCK_ON); } SINGLE_BATTLE_TEST("Dragon Tail switches the target with a random non-fainted replacement") diff --git a/test/battle/move_effect/hold_hands.c b/test/battle/move_effect/hold_hands.c new file mode 100644 index 0000000000..fb1c498bd3 --- /dev/null +++ b/test/battle/move_effect/hold_hands.c @@ -0,0 +1,25 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_HOLD_HANDS) == EFFECT_HOLD_HANDS); +} + +DOUBLE_BATTLE_TEST("Hold Hands is blocked by Crafty Shield") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(playerLeft, MOVE_CRAFTY_SHIELD, target: opponentLeft); + MOVE(playerRight, MOVE_HOLD_HANDS, target: playerLeft); + } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HOLD_HANDS, playerLeft); + MESSAGE("Wynaut protected itself!"); + } +} diff --git a/test/battle/move_effect/hydro_steam.c b/test/battle/move_effect/hydro_steam.c index a9c14c9acb..cb19cc6ec1 100644 --- a/test/battle/move_effect/hydro_steam.c +++ b/test/battle/move_effect/hydro_steam.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HYDRO_STEAM].effect == EFFECT_HYDRO_STEAM); + ASSUME(GetMoveEffect(MOVE_HYDRO_STEAM) == EFFECT_HYDRO_STEAM); } SINGLE_BATTLE_TEST("Hydro Steam deals 1.5x damage under both Sunlight and Rain", s16 damage) diff --git a/test/battle/move_effect/instruct.c b/test/battle/move_effect/instruct.c index 313fb05cef..85f56d4c4b 100644 --- a/test/battle/move_effect/instruct.c +++ b/test/battle/move_effect/instruct.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_INSTRUCT].effect == EFFECT_INSTRUCT); + ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); } DOUBLE_BATTLE_TEST("Instruct fails if target hasn't made a move") @@ -24,7 +24,7 @@ DOUBLE_BATTLE_TEST("Instruct fails if target hasn't made a move") DOUBLE_BATTLE_TEST("Instruct fails if move is banned by Instruct") { GIVEN { - ASSUME(gMovesInfo[MOVE_BIDE].instructBanned == TRUE); + ASSUME(IsMoveInstructBanned(MOVE_BIDE)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_BIDE); } OPPONENT(SPECIES_WOBBUFFET); @@ -60,7 +60,7 @@ DOUBLE_BATTLE_TEST("Instruct-called move targets the target of the move picked o DOUBLE_BATTLE_TEST("Instruct doesn't bypass sleep") { GIVEN { - ASSUME(gMovesInfo[MOVE_SPORE].effect == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_GROWL); } OPPONENT(SPECIES_WOBBUFFET); @@ -79,7 +79,7 @@ DOUBLE_BATTLE_TEST("Instruct doesn't bypass sleep") DOUBLE_BATTLE_TEST("Instruct fails if target doesn't know the last move it used") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE); + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_ORICORIO) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_CELEBRATE); } OPPONENT(SPECIES_WOBBUFFET); @@ -100,7 +100,7 @@ DOUBLE_BATTLE_TEST("Instruct fails if target doesn't know the last move it used" DOUBLE_BATTLE_TEST("Instruct-called move fails if it can only be used on the first turn but consumes PP") { GIVEN { - ASSUME(gMovesInfo[MOVE_FAKE_OUT].effect == EFFECT_FIRST_TURN_ONLY); + ASSUME(GetMoveEffect(MOVE_FAKE_OUT) == EFFECT_FIRST_TURN_ONLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_FAKE_OUT); } OPPONENT(SPECIES_WOBBUFFET); @@ -112,14 +112,14 @@ DOUBLE_BATTLE_TEST("Instruct-called move fails if it can only be used on the fir ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, playerLeft); NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_OUT, playerRight); } THEN { - EXPECT_EQ(playerRight->pp[3], gMovesInfo[MOVE_FAKE_OUT].pp - 2); + EXPECT_EQ(playerRight->pp[3], GetMovePP(MOVE_FAKE_OUT) - 2); } } DOUBLE_BATTLE_TEST("Instruct-called move doesn't fail if tormented") { GIVEN { - ASSUME(gMovesInfo[MOVE_TORMENT].effect == EFFECT_TORMENT); + ASSUME(GetMoveEffect(MOVE_TORMENT) == EFFECT_TORMENT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_FAKE_OUT); } OPPONENT(SPECIES_WOBBUFFET); @@ -138,7 +138,7 @@ DOUBLE_BATTLE_TEST("Instruct-called status moves don't fail if holding Assault V { GIVEN { ASSUME(gItemsInfo[ITEM_ASSAULT_VEST].holdEffect == HOLD_EFFECT_ASSAULT_VEST); - ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK); + ASSUME(GetMoveEffect(MOVE_TRICK) == EFFECT_TRICK); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_TRICK); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ASSAULT_VEST); } @@ -155,7 +155,7 @@ DOUBLE_BATTLE_TEST("Instruct-called status moves don't fail if holding Assault V DOUBLE_BATTLE_TEST("Instruct-called status move fails if taunted") { GIVEN { - ASSUME(gMovesInfo[MOVE_TAUNT].effect == EFFECT_TAUNT); + ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_GROWL); } OPPONENT(SPECIES_WOBBUFFET); @@ -174,14 +174,14 @@ DOUBLE_BATTLE_TEST("Instruct-called status move fails if taunted") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); } } THEN { - EXPECT_EQ(playerRight->pp[3], gMovesInfo[MOVE_GROWL].pp - 1); + EXPECT_EQ(playerRight->pp[3], GetMovePP(MOVE_GROWL) - 1); } } DOUBLE_BATTLE_TEST("Instruct-called moves fail if disabled") { GIVEN { - ASSUME(gMovesInfo[MOVE_DISABLE].effect == EFFECT_DISABLE); + ASSUME(GetMoveEffect(MOVE_DISABLE) == EFFECT_DISABLE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_GROWL); } OPPONENT(SPECIES_WOBBUFFET); @@ -194,15 +194,15 @@ DOUBLE_BATTLE_TEST("Instruct-called moves fail if disabled") ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, playerLeft); NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight); } THEN { - EXPECT_EQ(playerRight->pp[0], gMovesInfo[MOVE_TACKLE].pp - 1); + EXPECT_EQ(playerRight->pp[0], GetMovePP(MOVE_TACKLE) - 1); } } DOUBLE_BATTLE_TEST("Instruct-called moves keep their priority") { GIVEN { - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); - ASSUME(gMovesInfo[MOVE_PSYCHIC_TERRAIN].effect == EFFECT_PSYCHIC_TERRAIN); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); + ASSUME(GetMoveEffect(MOVE_PSYCHIC_TERRAIN) == EFFECT_PSYCHIC_TERRAIN); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_QUICK_ATTACK); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/ion_deluge.c b/test/battle/move_effect/ion_deluge.c index d0862ee8b4..8147048527 100644 --- a/test/battle/move_effect/ion_deluge.c +++ b/test/battle/move_effect/ion_deluge.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ION_DELUGE].effect == EFFECT_ION_DELUGE); + ASSUME(GetMoveEffect(MOVE_ION_DELUGE) == EFFECT_ION_DELUGE); } // For some reason SINGLE_BATTLE_TEST didn't catch these two issues. @@ -51,7 +51,7 @@ WILD_BATTLE_TEST("Ion Deluge works the same way as always when used by a mon wit SINGLE_BATTLE_TEST("Ion Deluge makes Normal type moves Electric type") { GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GOLBAT); } WHEN { diff --git a/test/battle/move_effect/ivy_cudgel.c b/test/battle/move_effect/ivy_cudgel.c index 095f4d8eff..88d002ae35 100644 --- a/test/battle/move_effect/ivy_cudgel.c +++ b/test/battle/move_effect/ivy_cudgel.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_IVY_CUDGEL].effect == EFFECT_IVY_CUDGEL); + ASSUME(GetMoveEffect(MOVE_IVY_CUDGEL) == EFFECT_IVY_CUDGEL); } SINGLE_BATTLE_TEST("Ivy Cudgel changes the move type depending on the form of Ogerpon") diff --git a/test/battle/move_effect/knock_off.c b/test/battle/move_effect/knock_off.c index 61bb062a25..4eb1269717 100644 --- a/test/battle/move_effect/knock_off.c +++ b/test/battle/move_effect/knock_off.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_KNOCK_OFF].effect == EFFECT_KNOCK_OFF); + ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); } SINGLE_BATTLE_TEST("Knock Off knocks a healing berry before it has the chance to activate") diff --git a/test/battle/move_effect/laser_focus.c b/test/battle/move_effect/laser_focus.c index 2f61c99ef8..c486a3cbee 100644 --- a/test/battle/move_effect/laser_focus.c +++ b/test/battle/move_effect/laser_focus.c @@ -8,8 +8,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Laser Focus causes the user's move used on the next turn to result in a Critical Hit") { - PASSES_RANDOMLY(1, 1, RNG_CRITICAL_HIT); GIVEN { + ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/last_resort.c b/test/battle/move_effect/last_resort.c index a9660f2c0e..50a0a31512 100644 --- a/test/battle/move_effect/last_resort.c +++ b/test/battle/move_effect/last_resort.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_LAST_RESORT].effect == EFFECT_LAST_RESORT); + ASSUME(GetMoveEffect(MOVE_LAST_RESORT) == EFFECT_LAST_RESORT); } SINGLE_BATTLE_TEST("Last Resort always fails if it's the only known move") @@ -95,7 +95,7 @@ SINGLE_BATTLE_TEST("Last Resort works only when all of the known moves have been SINGLE_BATTLE_TEST("Last Resort works with Sleep Talk") { GIVEN { - ASSUME(gMovesInfo[MOVE_SLEEP_TALK].effect == EFFECT_SLEEP_TALK); + ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_LAST_RESORT, MOVE_SLEEP_TALK); Status1(STATUS1_SLEEP_TURN(3)); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/last_respects.c b/test/battle/move_effect/last_respects.c index 9b1f01f5fc..6ef4c73c2d 100644 --- a/test/battle/move_effect/last_respects.c +++ b/test/battle/move_effect/last_respects.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_LAST_RESPECTS].effect == EFFECT_LAST_RESPECTS); + ASSUME(GetMoveEffect(MOVE_LAST_RESPECTS) == EFFECT_LAST_RESPECTS); } SINGLE_BATTLE_TEST("Last Respects power is multiplied by the amount of fainted mon in the user's side - Player", s16 damage) diff --git a/test/battle/move_effect/leech_seed.c b/test/battle/move_effect/leech_seed.c index 1ed050a2e0..d363e98009 100644 --- a/test/battle/move_effect/leech_seed.c +++ b/test/battle/move_effect/leech_seed.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_LEECH_SEED].effect == EFFECT_LEECH_SEED); + ASSUME(GetMoveEffect(MOVE_LEECH_SEED) == EFFECT_LEECH_SEED); } SINGLE_BATTLE_TEST("Leech Seed doesn't affect Grass-type Pokémon") diff --git a/test/battle/move_effect/lucky_chant.c b/test/battle/move_effect/lucky_chant.c index 31e9dce254..e492d604b6 100644 --- a/test/battle/move_effect/lucky_chant.c +++ b/test/battle/move_effect/lucky_chant.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Lucky Chant prevents critical hits on the user's side") { GIVEN { - ASSUME(gMovesInfo[MOVE_LUCKY_CHANT].effect == EFFECT_LUCKY_CHANT); + ASSUME(GetMoveEffect(MOVE_LUCKY_CHANT) == EFFECT_LUCKY_CHANT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/magic_coat.c b/test/battle/move_effect/magic_coat.c index 2e78967f39..561d15a532 100644 --- a/test/battle/move_effect/magic_coat.c +++ b/test/battle/move_effect/magic_coat.c @@ -3,13 +3,13 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_MAGIC_COAT].effect == EFFECT_MAGIC_COAT); + ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); } SINGLE_BATTLE_TEST("Magic Coat prints the correct message when bouncing back a move") { GIVEN { - ASSUME(gMovesInfo[MOVE_SPORE].effect == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_WYNAUT); } WHEN { diff --git a/test/battle/move_effect/max_hp_50_recoil.c b/test/battle/move_effect/max_hp_50_recoil.c index b35043014b..3e54e05532 100644 --- a/test/battle/move_effect/max_hp_50_recoil.c +++ b/test/battle/move_effect/max_hp_50_recoil.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_STEEL_BEAM].effect == EFFECT_MAX_HP_50_RECOIL); + ASSUME(GetMoveEffect(MOVE_STEEL_BEAM) == EFFECT_MAX_HP_50_RECOIL); } SINGLE_BATTLE_TEST("Steel Beam makes the user lose 1/2 of its Max HP") diff --git a/test/battle/move_effect/metronome.c b/test/battle/move_effect/metronome.c index 98e4bfd618..1a5d4aeb9d 100644 --- a/test/battle/move_effect/metronome.c +++ b/test/battle/move_effect/metronome.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_METRONOME].effect == EFFECT_METRONOME); + ASSUME(GetMoveEffect(MOVE_METRONOME) == EFFECT_METRONOME); } SINGLE_BATTLE_TEST("Metronome picks a random move") @@ -25,9 +25,9 @@ SINGLE_BATTLE_TEST("Metronome picks a random move") SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types") { GIVEN { - ASSUME(gMovesInfo[MOVE_POISON_POWDER].powderMove); + ASSUME(IsPowderMove(MOVE_POISON_POWDER)); ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TANGELA); } WHEN { @@ -45,7 +45,7 @@ SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types") SINGLE_BATTLE_TEST("Metronome's called multi-hit move hits multiple times") { GIVEN { - ASSUME(gMovesInfo[MOVE_ROCK_BLAST].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_ROCK_BLAST) == EFFECT_MULTI_HIT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/mind_blown.c b/test/battle/move_effect/mind_blown.c index dbb3a6164a..0a34198777 100644 --- a/test/battle/move_effect/mind_blown.c +++ b/test/battle/move_effect/mind_blown.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_MIND_BLOWN].effect == EFFECT_MIND_BLOWN); + ASSUME(GetMoveEffect(MOVE_MIND_BLOWN) == EFFECT_MIND_BLOWN); } SINGLE_BATTLE_TEST("Mind Blown makes the user lose 1/2 of its Max HP") @@ -96,10 +96,10 @@ DOUBLE_BATTLE_TEST("Mind Blown causes everyone to faint in a double battle") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_MIND_BLOWN, playerLeft); HP_BAR(opponentLeft, hp: 0); - MESSAGE("The opposing Abra fainted!"); HP_BAR(playerRight, hp: 0); - MESSAGE("Wynaut fainted!"); HP_BAR(opponentRight, hp: 0); + MESSAGE("The opposing Abra fainted!"); + MESSAGE("Wynaut fainted!"); MESSAGE("The opposing Kadabra fainted!"); HP_BAR(playerLeft, hp: 0); MESSAGE("Wobbuffet fainted!"); @@ -154,7 +154,7 @@ SINGLE_BATTLE_TEST("Mind Blown makes the user lose HP even if the opposing mon p SINGLE_BATTLE_TEST("Mind Blown makes the user lose HP even if it is absorbed by Flash Fire") { GIVEN { - ASSUME(gMovesInfo[MOVE_MIND_BLOWN].type == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_MIND_BLOWN) == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CYNDAQUIL) { Ability(ABILITY_FLASH_FIRE); } } WHEN { diff --git a/test/battle/move_effect/mirror_move.c b/test/battle/move_effect/mirror_move.c index 65c600fb18..cc148eb97c 100644 --- a/test/battle/move_effect/mirror_move.c +++ b/test/battle/move_effect/mirror_move.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_MIRROR_MOVE].effect == EFFECT_MIRROR_MOVE); + ASSUME(GetMoveEffect(MOVE_MIRROR_MOVE) == EFFECT_MIRROR_MOVE); } SINGLE_BATTLE_TEST("Mirror Move copies the last used move by the target") @@ -41,9 +41,9 @@ SINGLE_BATTLE_TEST("Mirror Move fails if no move was used before") SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") { GIVEN { - ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove); + ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); - ASSUME(gMovesInfo[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE); + ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_PARALYZE); PLAYER(SPECIES_ODDISH); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -62,7 +62,7 @@ SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") SINGLE_BATTLE_TEST("Mirror Move's called multi-hit move hits multiple times") { GIVEN { - ASSUME(gMovesInfo[MOVE_BULLET_SEED].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_BULLET_SEED) == EFFECT_MULTI_HIT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/moonlight.c b/test/battle/move_effect/moonlight.c index 41359ea97c..34baa31b14 100644 --- a/test/battle/move_effect/moonlight.c +++ b/test/battle/move_effect/moonlight.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_MOONLIGHT].effect == EFFECT_MOONLIGHT); + ASSUME(GetMoveEffect(MOVE_MOONLIGHT) == EFFECT_MOONLIGHT); } SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP") diff --git a/test/battle/move_effect/morning_sun.c b/test/battle/move_effect/morning_sun.c index 3b57f89500..64fb1b044b 100644 --- a/test/battle/move_effect/morning_sun.c +++ b/test/battle/move_effect/morning_sun.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_MORNING_SUN].effect == EFFECT_MORNING_SUN); + ASSUME(GetMoveEffect(MOVE_MORNING_SUN) == EFFECT_MORNING_SUN); } SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP") diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index 9309f97ed9..c257ddd3b2 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_BULLET_SEED].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_BULLET_SEED) == EFFECT_MULTI_HIT); } SINGLE_BATTLE_TEST("Multi hit Moves hit the maximum amount with Skill Link") @@ -153,7 +153,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit five times 50 Percent of the time with L SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after final hit") { GIVEN { - ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -175,8 +175,8 @@ SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after final SINGLE_BATTLE_TEST("Scale Shot is immune to Fairy types and will end the move correctly") { GIVEN { - ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); - ASSUME(gMovesInfo[MOVE_SCALE_SHOT].type == TYPE_DRAGON); + ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); + ASSUME(GetMoveType(MOVE_SCALE_SHOT) == TYPE_DRAGON); ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CLEFAIRY) { HP(1); } @@ -191,7 +191,7 @@ SINGLE_BATTLE_TEST("Scale Shot is immune to Fairy types and will end the move co DOUBLE_BATTLE_TEST("Scale Shot does not corrupt the next turn move used") { GIVEN { - ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -216,7 +216,7 @@ SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after the 4 { PASSES_RANDOMLY(50, 100, RNG_LOADED_DICE); GIVEN { - ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LOADED_DICE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -241,7 +241,7 @@ SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after killi PARAMETRIZE { item = ITEM_LOADED_DICE; } GIVEN { - ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); PLAYER(SPECIES_BAGON) { Item(item); } OPPONENT(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/ohko.c b/test/battle/move_effect/ohko.c index 8a8015309b..11dbb78f1f 100644 --- a/test/battle/move_effect/ohko.c +++ b/test/battle/move_effect/ohko.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SHEER_COLD].effect == EFFECT_OHKO); + ASSUME(GetMoveEffect(MOVE_SHEER_COLD) == EFFECT_OHKO); } SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon") @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon") SINGLE_BATTLE_TEST("OHKO moves can hit semi-invulnerable mons when the user has No-Guard") { GIVEN { - ASSUME(gMovesInfo[MOVE_SHEER_COLD].effect == EFFECT_OHKO); + ASSUME(GetMoveEffect(MOVE_SHEER_COLD) == EFFECT_OHKO); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NO_GUARD); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/photon_geyser.c b/test/battle/move_effect/photon_geyser.c index 986d3865aa..3f4bb10146 100644 --- a/test/battle/move_effect/photon_geyser.c +++ b/test/battle/move_effect/photon_geyser.c @@ -3,14 +3,14 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_PHOTON_GEYSER].effect == EFFECT_PHOTON_GEYSER); + ASSUME(GetMoveEffect(MOVE_PHOTON_GEYSER) == EFFECT_PHOTON_GEYSER); } SINGLE_BATTLE_TEST("Photon Geyser can be mirror coated if it is a special move") { GIVEN { // EFFECT_PHOTON_GEYSER requires the move data to be Special to work - ASSUME(gMovesInfo[MOVE_PHOTON_GEYSER].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_PHOTON_GEYSER) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET) { Attack(100); SpAttack(110); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/pledge.c b/test/battle/move_effect/pledge.c index 4441fdccb9..a7935450b6 100644 --- a/test/battle/move_effect/pledge.c +++ b/test/battle/move_effect/pledge.c @@ -3,9 +3,9 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_WATER_PLEDGE].effect == EFFECT_PLEDGE); - ASSUME(gMovesInfo[MOVE_FIRE_PLEDGE].effect == EFFECT_PLEDGE); - ASSUME(gMovesInfo[MOVE_GRASS_PLEDGE].effect == EFFECT_PLEDGE); + ASSUME(GetMoveEffect(MOVE_WATER_PLEDGE) == EFFECT_PLEDGE); + ASSUME(GetMoveEffect(MOVE_FIRE_PLEDGE) == EFFECT_PLEDGE); + ASSUME(GetMoveEffect(MOVE_GRASS_PLEDGE) == EFFECT_PLEDGE); } DOUBLE_BATTLE_TEST("Water and Fire Pledge create a rainbow on the user's side of the field for four turns") @@ -189,7 +189,7 @@ DOUBLE_BATTLE_TEST("The base power of a combined pledge move effect is 150") s16 combinedPledgeDamage; GIVEN { - ASSUME(gMovesInfo[MOVE_HYPER_BEAM].power == 150); + ASSUME(GetMovePower(MOVE_HYPER_BEAM) == 150); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WYNAUT) { Speed(3); } OPPONENT(SPECIES_WOBBUFFET) { Speed(8); } @@ -313,7 +313,7 @@ DOUBLE_BATTLE_TEST("Damage calculation: Combined pledge move") PARAMETRIZE { expectedDamage = 136; } PARAMETRIZE { expectedDamage = 135; } GIVEN { - ASSUME(gMovesInfo[MOVE_GRASS_PLEDGE].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_GRASS_PLEDGE) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WOBBUFFET) { HP(521); SpDefense(152); Speed(3); } OPPONENT(SPECIES_CHARIZARD) { Speed(8); } @@ -344,7 +344,7 @@ DOUBLE_BATTLE_TEST("Pledge move combo interactions with Powder are correct") PARAMETRIZE { moveLeft = MOVE_GRASS_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 4; speedRight = 3; } PARAMETRIZE { moveLeft = MOVE_GRASS_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 3; speedRight = 4; } // FAIL 2 GIVEN { - ASSUME(gMovesInfo[MOVE_FIRE_PLEDGE].type == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_FIRE_PLEDGE) == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET) { Speed(speedLeft); } PLAYER(SPECIES_WYNAUT) { Speed(speedRight); } OPPONENT(SPECIES_WOBBUFFET) { Speed(8); } @@ -885,7 +885,7 @@ DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Electrify") { GIVEN { - ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); PLAYER(SPECIES_ELECTIVIRE) { Ability(ABILITY_MOTOR_DRIVE); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -1002,7 +1002,7 @@ DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Motor Drive") { GIVEN { - ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); PLAYER(SPECIES_ELECTIVIRE) { Ability(ABILITY_MOTOR_DRIVE); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -1027,7 +1027,7 @@ DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Volt Absorb") { GIVEN { - ASSUME(gMovesInfo[MOVE_ELECTRIFY].effect == EFFECT_ELECTRIFY); + ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/population_bomb.c b/test/battle/move_effect/population_bomb.c index b3e2e4768e..54da0726ae 100644 --- a/test/battle/move_effect/population_bomb.c +++ b/test/battle/move_effect/population_bomb.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Population Bomb can hit ten times") { GIVEN { - ASSUME(gMovesInfo[MOVE_POPULATION_BOMB].strikeCount == 10); + ASSUME(GetMoveStrikeCount(MOVE_POPULATION_BOMB) == 10); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/powder.c b/test/battle/move_effect/powder.c index 85e486918b..aa789fb05f 100644 --- a/test/battle/move_effect/powder.c +++ b/test/battle/move_effect/powder.c @@ -3,9 +3,9 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_POWDER].effect == EFFECT_POWDER); - ASSUME(gMovesInfo[MOVE_POWDER].powderMove == TRUE); - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(GetMoveEffect(MOVE_POWDER) == EFFECT_POWDER); + ASSUME(IsPowderMove(MOVE_POWDER)); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); } @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Powder blocks the target's Fire type moves and consumes PP") HP_BAR(opponent); } } THEN { - EXPECT_EQ(player->pp[0], gMovesInfo[MOVE_EMBER].pp - 1); + EXPECT_EQ(player->pp[0], GetMovePP(MOVE_EMBER) - 1); } } @@ -164,8 +164,8 @@ SINGLE_BATTLE_TEST("Powder fails if the target has Overcoat") DOUBLE_BATTLE_TEST("Powder still blocks the target's Fire type moves even if it was given Grass type") { GIVEN { - ASSUME(gMovesInfo[MOVE_FORESTS_CURSE].effect == EFFECT_THIRD_TYPE); - ASSUME(gMovesInfo[MOVE_FORESTS_CURSE].argument == TYPE_GRASS); + ASSUME(GetMoveEffect(MOVE_FORESTS_CURSE) == EFFECT_THIRD_TYPE); + ASSUME(GetMoveArgType(MOVE_FORESTS_CURSE) == TYPE_GRASS); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TREVENANT); @@ -185,7 +185,7 @@ DOUBLE_BATTLE_TEST("Powder still blocks the target's Fire type moves even if it DOUBLE_BATTLE_TEST("Powder still blocks the target's Fire type moves even if it was given Overcoat") { GIVEN { - ASSUME(gMovesInfo[MOVE_DOODLE].effect == EFFECT_DOODLE); + ASSUME(GetMoveEffect(MOVE_DOODLE) == EFFECT_DOODLE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_FORRETRESS) { Ability(ABILITY_OVERCOAT); } @@ -224,8 +224,8 @@ SINGLE_BATTLE_TEST("Powder prevents Protean from changing its user to Fire type" SINGLE_BATTLE_TEST("Powder doesn't prevent a Fire move from thawing its user out") { GIVEN { - ASSUME(gMovesInfo[MOVE_FLAME_WHEEL].thawsUser); - ASSUME(gMovesInfo[MOVE_FLAME_WHEEL].type == TYPE_FIRE); + ASSUME(MoveThawsUser(MOVE_FLAME_WHEEL)); + ASSUME(GetMoveType(MOVE_FLAME_WHEEL) == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_FREEZE); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -244,7 +244,7 @@ SINGLE_BATTLE_TEST("Powder doesn't prevent a Fire move from thawing its user out SINGLE_BATTLE_TEST("Powder doesn't consume Berry from Fire type Natural Gift but prevents using the move") { GIVEN { - ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT); + ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CHERI_BERRY); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -267,12 +267,12 @@ DOUBLE_BATTLE_TEST("Powder damages a target using Shell Trap even if it wasn't h PARAMETRIZE { move = MOVE_EMBER; } PARAMETRIZE { move = MOVE_TICKLE;} GIVEN { - ASSUME(gMovesInfo[MOVE_SHELL_TRAP].effect == EFFECT_SHELL_TRAP); - ASSUME(gMovesInfo[MOVE_SHELL_TRAP].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_EMBER].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_TICKLE].category == DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_TICKLE].effect == EFFECT_TICKLE); + ASSUME(GetMoveEffect(MOVE_SHELL_TRAP) == EFFECT_SHELL_TRAP); + ASSUME(GetMoveType(MOVE_SHELL_TRAP) == TYPE_FIRE); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_EMBER) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TICKLE) == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_TICKLE) == EFFECT_TICKLE); PLAYER(SPECIES_TURTONATOR); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/move_effect/power_based_on_target_hp.c b/test/battle/move_effect/power_based_on_target_hp.c index 2cecf3ff7f..030418cd87 100644 --- a/test/battle/move_effect/power_based_on_target_hp.c +++ b/test/battle/move_effect/power_based_on_target_hp.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_CRUSH_GRIP].effect == EFFECT_POWER_BASED_ON_TARGET_HP); + ASSUME(GetMoveEffect(MOVE_CRUSH_GRIP) == EFFECT_POWER_BASED_ON_TARGET_HP); } SINGLE_BATTLE_TEST("Crush Grip's damage is affected by the target's current HP", s16 damage) diff --git a/test/battle/move_effect/power_based_on_user_hp.c b/test/battle/move_effect/power_based_on_user_hp.c index 1dfa70ddf9..622b195525 100644 --- a/test/battle/move_effect/power_based_on_user_hp.c +++ b/test/battle/move_effect/power_based_on_user_hp.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ERUPTION].effect == EFFECT_POWER_BASED_ON_USER_HP); + ASSUME(GetMoveEffect(MOVE_ERUPTION) == EFFECT_POWER_BASED_ON_USER_HP); } SINGLE_BATTLE_TEST("Eruption's damage is affected by the user's current HP", s16 damage) diff --git a/test/battle/move_effect/power_split.c b/test/battle/move_effect/power_split.c index 70d1bfd5ea..84c64b1d89 100644 --- a/test/battle/move_effect/power_split.c +++ b/test/battle/move_effect/power_split.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_POWER_SPLIT].effect == EFFECT_POWER_SPLIT); + ASSUME(GetMoveEffect(MOVE_POWER_SPLIT) == EFFECT_POWER_SPLIT); } SINGLE_BATTLE_TEST("Power Split averages user and targets Atk and Sp. Atk stats") diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index dff486cb00..84862bbcd4 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -3,21 +3,21 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_PROTECT].effect == EFFECT_PROTECT); - ASSUME(gMovesInfo[MOVE_DETECT].effect == EFFECT_PROTECT); - ASSUME(gMovesInfo[MOVE_KINGS_SHIELD].effect == EFFECT_PROTECT); - ASSUME(gMovesInfo[MOVE_SILK_TRAP].effect == EFFECT_PROTECT); - ASSUME(gMovesInfo[MOVE_SPIKY_SHIELD].effect == EFFECT_PROTECT); - ASSUME(gMovesInfo[MOVE_WIDE_GUARD].effect == EFFECT_PROTECT); - ASSUME(gMovesInfo[MOVE_QUICK_GUARD].effect == EFFECT_PROTECT); - ASSUME(gMovesInfo[MOVE_CRAFTY_SHIELD].effect == EFFECT_PROTECT); - ASSUME(gMovesInfo[MOVE_BANEFUL_BUNKER].effect == EFFECT_PROTECT); - ASSUME(gMovesInfo[MOVE_BURNING_BULWARK].effect == EFFECT_PROTECT); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_TACKLE].makesContact); - ASSUME(gMovesInfo[MOVE_LEER].category == DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_WATER_GUN].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(!(gMovesInfo[MOVE_WATER_GUN].makesContact)); + ASSUME(GetMoveEffect(MOVE_PROTECT) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_DETECT) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_KINGS_SHIELD) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_SILK_TRAP) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_SPIKY_SHIELD) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_WIDE_GUARD) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_QUICK_GUARD) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_CRAFTY_SHIELD) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_BANEFUL_BUNKER) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_BURNING_BULWARK) == EFFECT_PROTECT); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(GetMoveCategory(MOVE_LEER) == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(!(MoveMakesContact(MOVE_WATER_GUN))); } SINGLE_BATTLE_TEST("Protect, Detect, Spiky Shield, Baneful Bunker and Burning Bulwark protect from all moves") @@ -244,10 +244,10 @@ SINGLE_BATTLE_TEST("Recoil damage is not applied if target was protected") GIVEN { - ASSUME(gMovesInfo[MOVE_VOLT_TACKLE].recoil > 0); - ASSUME(gMovesInfo[MOVE_HEAD_SMASH].recoil > 0); - ASSUME(gMovesInfo[MOVE_TAKE_DOWN].recoil > 0); - ASSUME(gMovesInfo[MOVE_DOUBLE_EDGE].recoil > 0); + ASSUME(GetMoveRecoil(MOVE_VOLT_TACKLE) > 0); + ASSUME(GetMoveRecoil(MOVE_HEAD_SMASH) > 0); + ASSUME(GetMoveRecoil(MOVE_TAKE_DOWN) > 0); + ASSUME(GetMoveRecoil(MOVE_DOUBLE_EDGE) > 0); PLAYER(SPECIES_RAPIDASH); OPPONENT(SPECIES_BEAUTIFLY); } WHEN { @@ -282,7 +282,7 @@ SINGLE_BATTLE_TEST("Multi-hit moves don't hit a protected target and fail only o PARAMETRIZE { move = MOVE_SPIKY_SHIELD; } GIVEN { - ASSUME(gMovesInfo[MOVE_ARM_THRUST].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_ARM_THRUST) == EFFECT_MULTI_HIT); PLAYER(SPECIES_RAPIDASH); OPPONENT(SPECIES_BEAUTIFLY); } WHEN { @@ -325,9 +325,9 @@ DOUBLE_BATTLE_TEST("Wide Guard protects self and ally from multi-target moves") PARAMETRIZE { move = MOVE_HYPER_VOICE; } // 2 foes GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].target == MOVE_TARGET_SELECTED); - ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].target == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_TACKLE) == MOVE_TARGET_SELECTED); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -364,7 +364,7 @@ DOUBLE_BATTLE_TEST("Wide Guard can not fail on consecutive turns") PASSES_RANDOMLY(2, 2); GIVEN { - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].target == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -397,8 +397,8 @@ DOUBLE_BATTLE_TEST("Quick Guard protects self and ally from priority moves") PARAMETRIZE { move = MOVE_QUICK_ATTACK; targetOpponent = opponentRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].priority == 0); - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); + ASSUME(GetMovePriority(MOVE_TACKLE) == 0); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -427,7 +427,7 @@ DOUBLE_BATTLE_TEST("Quick Guard can not fail on consecutive turns") PASSES_RANDOMLY(2, 2); GIVEN { - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -457,9 +457,9 @@ DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from status moves") PARAMETRIZE { move = MOVE_TACKLE; targetOpponent = opponentRight; } GIVEN { - ASSUME(gMovesInfo[MOVE_LEER].target == MOVE_TARGET_BOTH); - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].target == MOVE_TARGET_BOTH); - ASSUME(gMovesInfo[MOVE_HYPER_VOICE].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveTarget(MOVE_LEER) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveCategory(MOVE_HYPER_VOICE) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -494,10 +494,10 @@ SINGLE_BATTLE_TEST("Protect does not block Confide or Decorate") PARAMETRIZE { move = MOVE_DECORATE; } GIVEN { - ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN); - ASSUME(gMovesInfo[MOVE_CONFIDE].ignoresProtect == TRUE); - ASSUME(gMovesInfo[MOVE_DECORATE].effect == EFFECT_DECORATE); - ASSUME(gMovesInfo[MOVE_DECORATE].ignoresProtect == TRUE); + ASSUME(GetMoveEffect(MOVE_CONFIDE) == EFFECT_SPECIAL_ATTACK_DOWN); + ASSUME(MoveIgnoresProtect(MOVE_CONFIDE)); + ASSUME(GetMoveEffect(MOVE_DECORATE) == EFFECT_DECORATE); + ASSUME(MoveIgnoresProtect(MOVE_DECORATE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -516,10 +516,10 @@ DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from Confide and Decora PARAMETRIZE { move = MOVE_DECORATE; } GIVEN { - ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN); - ASSUME(gMovesInfo[MOVE_CONFIDE].ignoresProtect == TRUE); - ASSUME(gMovesInfo[MOVE_DECORATE].effect == EFFECT_DECORATE); - ASSUME(gMovesInfo[MOVE_DECORATE].ignoresProtect == TRUE); + ASSUME(GetMoveEffect(MOVE_CONFIDE) == EFFECT_SPECIAL_ATTACK_DOWN); + ASSUME(MoveIgnoresProtect(MOVE_CONFIDE)); + ASSUME(GetMoveEffect(MOVE_DECORATE) == EFFECT_DECORATE); + ASSUME(MoveIgnoresProtect(MOVE_DECORATE)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/pursuit.c b/test/battle/move_effect/pursuit.c index 3a1db03d06..ea64813e68 100644 --- a/test/battle/move_effect/pursuit.c +++ b/test/battle/move_effect/pursuit.c @@ -3,13 +3,465 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_PURSUIT].effect == EFFECT_PURSUIT); + ASSUME(GetMoveEffect(MOVE_PURSUIT) == EFFECT_PURSUIT); +} + +SINGLE_BATTLE_TEST("Pursuit attacks a switching foe") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_PURSUIT); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + HP_BAR(player); + SEND_IN_MESSAGE("Zigzagoon"); + } +} + +SINGLE_BATTLE_TEST("Pursuit attacks a foe using Volt Switch / U-Turn / Parting Shot to switch out") +{ + u32 move; + PARAMETRIZE { move = MOVE_VOLT_SWITCH; } + PARAMETRIZE { move = MOVE_U_TURN; } + PARAMETRIZE { move = MOVE_PARTING_SHOT; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_VOLT_SWITCH) == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_PARTING_SHOT) == EFFECT_PARTING_SHOT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, move); MOVE(opponent, MOVE_PURSUIT); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + MESSAGE("Wobbuffet went back to 1!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + SEND_IN_MESSAGE("Zigzagoon"); + } +} + +DOUBLE_BATTLE_TEST("Pursuit doesn't attack a foe using Teleport / Baton Pass to switch out") +{ + u32 move; + PARAMETRIZE { move = MOVE_TELEPORT; } + PARAMETRIZE { move = MOVE_BATON_PASS; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_QUASH) == EFFECT_QUASH); + ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_NIDOKING); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { MOVE(playerRight, MOVE_QUASH, target: opponentLeft); MOVE(playerLeft, move); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUASH, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + SEND_IN_MESSAGE("Zigzagoon"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + } +} + +SINGLE_BATTLE_TEST("Pursuit doesn't attack switching foe if user already acted that turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_PURSUIT); MOVE(player, MOVE_VOLT_SWITCH); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_VOLT_SWITCH, player); + MESSAGE("Wobbuffet went back to 1!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + SEND_IN_MESSAGE("Zigzagoon"); + } +} + +SINGLE_BATTLE_TEST("Pursuit doubles in power if attacking while target switches out", s16 damage) +{ + u32 speed; + PARAMETRIZE { speed = 5; } + PARAMETRIZE { speed = 3; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_ZIGZAGOON) { Speed(2); } + OPPONENT(SPECIES_WYNAUT) { Speed(speed); } + } WHEN { + TURN { MOVE(opponent, MOVE_PURSUIT); MOVE(player, MOVE_VOLT_SWITCH); SEND_OUT(player, 1); } + } SCENE { + if (speed == 3) + ANIMATION(ANIM_TYPE_MOVE, MOVE_VOLT_SWITCH, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + HP_BAR(player, captureDamage: &results[i].damage); + if (speed == 5) + ANIMATION(ANIM_TYPE_MOVE, MOVE_VOLT_SWITCH, player); + SEND_IN_MESSAGE("Zigzagoon"); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Pursuit ignores accuracy checks when attacking a switching target") +{ + PASSES_RANDOMLY(100, 100, RNG_ACCURACY); + GIVEN { + ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + PLAYER(SPECIES_GLACEON) { Ability(ABILITY_SNOW_CLOAK); } + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SAND_ATTACK); MOVE(opponent, MOVE_HAIL); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_PURSUIT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SAND_ATTACK, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HAIL, opponent); + SWITCH_OUT_MESSAGE("Glaceon"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + SEND_IN_MESSAGE("Zigzagoon"); + } +} + +DOUBLE_BATTLE_TEST("Pursuit attacks switching foes even if not targetting them (Gen 4+)") +{ + GIVEN { + ASSUME(B_PURSUIT_TARGET >= GEN_4); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_GRIMER); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { SWITCH(playerLeft, 2); MOVE(opponentLeft, MOVE_PURSUIT, target: playerRight); MOVE(opponentRight, MOVE_PURSUIT, target: playerRight); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + HP_BAR(playerLeft); + SEND_IN_MESSAGE("Grimer"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} + +DOUBLE_BATTLE_TEST("Pursuit attacks a switching foe from fastest to slowest") +{ + u32 speedLeft, speedRight; + PARAMETRIZE { speedLeft = 5; speedRight = 3; } + PARAMETRIZE { speedLeft = 3; speedRight = 5; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_ZIGZAGOON) { Speed(4); } + PLAYER(SPECIES_GRIMER) { Speed(2); } + OPPONENT(SPECIES_WYNAUT) { Speed(speedLeft); } + OPPONENT(SPECIES_LINOONE) { Speed(speedRight); } + } WHEN { + TURN { SWITCH(playerLeft, 2); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); MOVE(opponentRight, MOVE_PURSUIT, target: playerLeft); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + if (speedLeft > speedRight) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + HP_BAR(playerLeft); + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + HP_BAR(playerLeft); + } + SEND_IN_MESSAGE("Grimer"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} + +DOUBLE_BATTLE_TEST("Pursuit attacks a switching foe but not switching allies") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_GRIMER); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_LINOONE); + OPPONENT(SPECIES_ABRA); + } WHEN { + TURN { SWITCH(playerLeft, 2); SWITCH(opponentRight, 2); MOVE(playerRight, MOVE_PURSUIT, target: opponentRight); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + SEND_IN_MESSAGE("Grimer"); + MESSAGE("2 withdrew Linoone!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, playerRight); + MESSAGE("2 sent out Abra!"); + } +} + +DOUBLE_BATTLE_TEST("Pursuit only attacks the first switching foe") +{ + // This test does not make sense for B_PURSUIT_TARGET < GEN_4 + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_GRIMER); + PLAYER(SPECIES_SUNKERN); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { SWITCH(playerLeft, 2); SWITCH(playerRight, 3); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); MOVE(opponentRight, MOVE_PURSUIT, target: playerLeft); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + HP_BAR(playerLeft); + SEND_IN_MESSAGE("Grimer"); + SWITCH_OUT_MESSAGE("Zigzagoon"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + HP_BAR(playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + HP_BAR(playerRight); + } + SEND_IN_MESSAGE("Sunkern"); + } +} + +DOUBLE_BATTLE_TEST("Pursuit only attacks a switching foe if foe is alive") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_GRIMER); + PLAYER(SPECIES_SUNKERN); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { SWITCH(playerLeft, 2); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); MOVE(opponentRight, MOVE_PURSUIT, target: playerLeft); SEND_OUT(playerLeft, 2); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + HP_BAR(playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + MESSAGE("Wobbuffet fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + SEND_IN_MESSAGE("Grimer"); + } +} + +DOUBLE_BATTLE_TEST("Pursuit attacks the second switching foe if the first faints from pursuit") +{ + // This test does not make sense for B_PURSUIT_TARGET < GEN_4 + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_GRIMER); + PLAYER(SPECIES_SUNKERN); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { SWITCH(playerLeft, 2); SWITCH(playerRight, 3); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); MOVE(opponentRight, MOVE_PURSUIT, target: playerRight); SEND_OUT(playerLeft, 2); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + HP_BAR(playerLeft); + MESSAGE("Wobbuffet fainted!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + SWITCH_OUT_MESSAGE("Zigzagoon"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + HP_BAR(playerRight); + SEND_IN_MESSAGE("Sunkern"); + SEND_IN_MESSAGE("Grimer"); + } +} + +DOUBLE_BATTLE_TEST("Pursuit only attacks a switching foe if user is alive") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_GRIMER); + OPPONENT(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_LINOONE); + OPPONENT(SPECIES_SUNKERN); + } WHEN { + TURN { MOVE(playerLeft, MOVE_VOLT_SWITCH, target: opponentLeft); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); SEND_OUT(playerLeft, 2); SEND_OUT(opponentLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_VOLT_SWITCH, playerLeft); + MESSAGE("The opposing Wynaut fainted!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + SEND_IN_MESSAGE("Grimer"); + } +} + +SINGLE_BATTLE_TEST("Pursuit attacks a switching foe but fails if user is asleep") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WYNAUT) { Status1(STATUS1_SLEEP_TURN(2)); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_PURSUIT); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + MESSAGE("The opposing Wynaut is fast asleep."); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + SEND_IN_MESSAGE("Zigzagoon"); + } +} + +SINGLE_BATTLE_TEST("Pursuit attacks a switching foe and takes Life Orb damage") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_LIFE_ORB].holdEffect == HOLD_EFFECT_LIFE_ORB); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_LIFE_ORB); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_PURSUIT); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + HP_BAR(opponent); + SEND_IN_MESSAGE("Zigzagoon"); + } +} + +DOUBLE_BATTLE_TEST("Pursuit attacks a switching foe but isn't affected by Follow Me") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FOLLOW_ME) == EFFECT_FOLLOW_ME); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CLEFABLE); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { MOVE(playerRight, MOVE_FOLLOW_ME); MOVE(playerLeft, MOVE_VOLT_SWITCH, target: opponentLeft); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOLLOW_ME, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_VOLT_SWITCH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + SEND_IN_MESSAGE("Zigzagoon"); + } +} + +SINGLE_BATTLE_TEST("Pursuit user mega evolves before attacking a switching foe and hits twice if user has Parental Bond") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_PURSUIT, gimmick: GIMMICK_MEGA); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + HP_BAR(player); + HP_BAR(player); + SEND_IN_MESSAGE("Zigzagoon"); + } +} + +DOUBLE_BATTLE_TEST("Pursuit user mega evolves before attacking a switching foe and others mega evolve after switch") +{ + GIVEN { + PLAYER(SPECIES_CHARIZARD) { Item(ITEM_CHARIZARDITE_X); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } + } WHEN { + TURN { SWITCH(playerRight, 2); MOVE(opponentRight, MOVE_PURSUIT, gimmick: GIMMICK_MEGA, target: playerRight); MOVE(playerLeft, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + HP_BAR(playerRight); + HP_BAR(playerRight); + SEND_IN_MESSAGE("Zigzagoon"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + } +} + +SINGLE_BATTLE_TEST("Pursuit user terastalizes before attacking a switching foe and gets the damage boost from the tera type", s16 damage) +{ + u32 tera; + PARAMETRIZE { tera = GIMMICK_NONE; } + PARAMETRIZE { tera = GIMMICK_TERA; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_KANGASKHAN) { TeraType(TYPE_DARK); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_PURSUIT, gimmick: tera); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + if (tera == GIMMICK_TERA) + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + HP_BAR(player, captureDamage: &results[i].damage); + SEND_IN_MESSAGE("Zigzagoon"); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("Pursuit affected by Electrify fails against immune target") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); + PLAYER(SPECIES_DONPHAN); + PLAYER(SPECIES_HELIOLISK); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { MOVE(playerRight, MOVE_ELECTRIFY, target: opponentLeft); MOVE(playerLeft, MOVE_VOLT_SWITCH, target: opponentLeft); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIFY, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_VOLT_SWITCH, playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + SEND_IN_MESSAGE("Zigzagoon"); + } +} + +DOUBLE_BATTLE_TEST("Pursuit affected by Electrify fails against target with Volt Absorb") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); + PLAYER(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); } + PLAYER(SPECIES_HELIOLISK); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { MOVE(playerRight, MOVE_ELECTRIFY, target: opponentLeft); MOVE(playerLeft, MOVE_VOLT_SWITCH, target: opponentLeft); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIFY, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_VOLT_SWITCH, playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_VOLT_ABSORB); + SEND_IN_MESSAGE("Zigzagoon"); + } } SINGLE_BATTLE_TEST("Pursuited mon correctly switches out after it got hit and activated ability Tangling Hair") { GIVEN { - PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); } + PLAYER(SPECIES_DUGTRIO_ALOLA) { Ability(ABILITY_TANGLING_HAIR); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -25,6 +477,80 @@ SINGLE_BATTLE_TEST("Pursuited mon correctly switches out after it got hit and ac } } +DOUBLE_BATTLE_TEST("Pursuited mon correctly switches out after it got hit and activated ability Tangling Hair - Doubles") +{ + GIVEN { + PLAYER(SPECIES_DUGTRIO_ALOLA) { Ability(ABILITY_TANGLING_HAIR); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(playerLeft, 2); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); MOVE(opponentRight, MOVE_PURSUIT, target: playerLeft); } + } SCENE { + SWITCH_OUT_MESSAGE("Dugtrio"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_TANGLING_HAIR); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("The opposing Wynaut's Speed fell!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + ABILITY_POPUP(playerLeft, ABILITY_TANGLING_HAIR); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("The opposing Wobbuffet's Speed fell!"); + SEND_IN_MESSAGE("Wobbuffet"); + } +} + +SINGLE_BATTLE_TEST("Pursuited mon correctly switches out after it got hit and activated ability Tangling Hair - Mirror Armor") +{ + GIVEN { + PLAYER(SPECIES_DUGTRIO_ALOLA) { Ability(ABILITY_TANGLING_HAIR); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CORVIKNIGHT) { Ability(ABILITY_MIRROR_ARMOR); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_PURSUIT); } + } SCENE { + SWITCH_OUT_MESSAGE("Dugtrio"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + ABILITY_POPUP(player, ABILITY_TANGLING_HAIR); + ABILITY_POPUP(opponent, ABILITY_MIRROR_ARMOR); + SEND_IN_MESSAGE("Wobbuffet"); + } +} + +DOUBLE_BATTLE_TEST("Pursuited mon correctly switches out after it got hit and activated ability Cotton Down") +{ + GIVEN { + PLAYER(SPECIES_ELDEGOSS) { Ability(ABILITY_COTTON_DOWN); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(playerLeft, 2); MOVE(opponentLeft, MOVE_PURSUIT, target: playerLeft); MOVE(opponentRight, MOVE_PURSUIT, target: playerLeft); } + } SCENE { + SWITCH_OUT_MESSAGE("Eldegoss"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_COTTON_DOWN); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("The opposing Wynaut's Speed fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Wobbuffet's Speed fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("The opposing Wobbuffet's Speed fell!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponentRight); + ABILITY_POPUP(playerLeft, ABILITY_COTTON_DOWN); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("The opposing Wynaut's Speed fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Wobbuffet's Speed fell!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("The opposing Wobbuffet's Speed fell!"); + SEND_IN_MESSAGE("Wobbuffet"); + } +} + // Checked so that Pursuit has only 1 PP and it forces the player to use Struggle. SINGLE_BATTLE_TEST("Pursuit becomes a locked move after being used on switch-out while holding a Choice Item") { @@ -46,4 +572,105 @@ SINGLE_BATTLE_TEST("Pursuit becomes a locked move after being used on switch-out } } +SINGLE_BATTLE_TEST("Pursuit attacks a switching foe and switchin is correctly stored") +{ + u32 switchin; + PARAMETRIZE { switchin = 1; } + PARAMETRIZE { switchin = 2; } + PARAMETRIZE { switchin = 3; } + PARAMETRIZE { switchin = 4; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_AIPOM); + PLAYER(SPECIES_ABRA); + PLAYER(SPECIES_VENIPEDE); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { SWITCH(player, switchin); MOVE(opponent, MOVE_PURSUIT); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + switch (switchin) + { + case 1: + SEND_IN_MESSAGE("Zigzagoon"); + break; + case 2: + SEND_IN_MESSAGE("Aipom"); + break; + case 3: + SEND_IN_MESSAGE("Abra"); + break; + case 4: + SEND_IN_MESSAGE("Venipede"); + break; + } + } +} + +SINGLE_BATTLE_TEST("Pursuit doesn't cause mon with Emergency Exit to switch twice") +{ + GIVEN { + PLAYER(SPECIES_GOLISOPOD) { HP(101); MaxHP(200); Ability(ABILITY_EMERGENCY_EXIT); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_VOLTORB); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_PURSUIT); SEND_OUT(player, 2); } + } SCENE { + SWITCH_OUT_MESSAGE("Golisopod"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + ABILITY_POPUP(player, ABILITY_EMERGENCY_EXIT); + SEND_IN_MESSAGE("Voltorb"); + } THEN { + EXPECT_EQ(player->species, SPECIES_VOLTORB); + } +} + +SINGLE_BATTLE_TEST("Pursuit user gets forced out by Red Card and target still switches out") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_RED_CARD].holdEffect == HOLD_EFFECT_RED_CARD); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + PLAYER(SPECIES_VOLTORB); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VOLTORB); + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_PURSUIT); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("The opposing Voltorb was dragged out!"); + SEND_IN_MESSAGE("Voltorb"); + } THEN { + EXPECT_EQ(player->species, SPECIES_VOLTORB); + EXPECT_EQ(opponent->species, SPECIES_VOLTORB); + } +} + +SINGLE_BATTLE_TEST("Pursuit user faints to Life Orb and target still switches out") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_LIFE_ORB].holdEffect == HOLD_EFFECT_LIFE_ORB); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_VOLTORB); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); HP(1); } + OPPONENT(SPECIES_VOLTORB); + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_PURSUIT); SEND_OUT(opponent, 1); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURSUIT, opponent); + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet fainted!"); + SEND_IN_MESSAGE("Voltorb"); + } THEN { + EXPECT_EQ(player->species, SPECIES_VOLTORB); + EXPECT_EQ(opponent->species, SPECIES_VOLTORB); + } +} + TO_DO_BATTLE_TEST("Baton Pass doesn't cause Pursuit to increase its power or priority"); diff --git a/test/battle/move_effect/quash.c b/test/battle/move_effect/quash.c index b342eafd74..1d2f89230c 100644 --- a/test/battle/move_effect/quash.c +++ b/test/battle/move_effect/quash.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_QUASH].effect == EFFECT_QUASH); + ASSUME(GetMoveEffect(MOVE_QUASH) == EFFECT_QUASH); } DOUBLE_BATTLE_TEST("Quash-affected target will move last in the priority bracket") @@ -27,7 +27,7 @@ DOUBLE_BATTLE_TEST("Quash is not affected by dynamic speed") { GIVEN { ASSUME(B_RECALC_TURN_AFTER_ACTIONS >= GEN_8); - ASSUME(gMovesInfo[MOVE_TAILWIND].effect == EFFECT_TAILWIND); + ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); PLAYER(SPECIES_VOLBEAT) { Speed(10); Ability(ABILITY_PRANKSTER); } PLAYER(SPECIES_WOBBUFFET) { Speed(30); } OPPONENT(SPECIES_TORCHIC) { Speed(50); } @@ -113,8 +113,8 @@ DOUBLE_BATTLE_TEST("Quash-affected mon that acted early via After You is not aff { GIVEN { ASSUME(B_RECALC_TURN_AFTER_ACTIONS >= GEN_8); - ASSUME(gMovesInfo[MOVE_TAILWIND].effect == EFFECT_TAILWIND); - ASSUME(gMovesInfo[MOVE_AFTER_YOU].effect == EFFECT_AFTER_YOU); + ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); + ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); } PLAYER(SPECIES_WOBBUFFET) { Speed(30); } OPPONENT(SPECIES_TORCHIC) { Speed(10); } diff --git a/test/battle/move_effect/rage_fist.c b/test/battle/move_effect/rage_fist.c index 7bc349cef0..7a87f3e34d 100644 --- a/test/battle/move_effect/rage_fist.c +++ b/test/battle/move_effect/rage_fist.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_RAGE_FIST].effect == EFFECT_RAGE_FIST); - ASSUME(gMovesInfo[MOVE_RAGE_FIST].power == 50); + ASSUME(GetMoveEffect(MOVE_RAGE_FIST) == EFFECT_RAGE_FIST); + ASSUME(GetMovePower(MOVE_RAGE_FIST) == 50); } SINGLE_BATTLE_TEST("Rage Fist base power is increased by 50 if the user takes damage") @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Rage Fist base power is increased by each multi hit") s16 timesGotHit[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_BULLET_SEED].effect == EFFECT_MULTI_HIT); + ASSUME(GetMoveEffect(MOVE_BULLET_SEED) == EFFECT_MULTI_HIT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_REGIROCK); } WHEN { @@ -130,7 +130,7 @@ SINGLE_BATTLE_TEST("Rage Fist base power is not increased if a substitute was hi s16 timesGotHit[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_CRUNCH].category == DAMAGE_CATEGORY_PHYSICAL); // Substitute doesn't fade otherwise + ASSUME(GetMoveCategory(MOVE_CRUNCH) == DAMAGE_CATEGORY_PHYSICAL); // Substitute doesn't fade otherwise PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_REGIROCK); } WHEN { diff --git a/test/battle/move_effect/raging_bull.c b/test/battle/move_effect/raging_bull.c index 17b9c23985..056a5093a8 100644 --- a/test/battle/move_effect/raging_bull.c +++ b/test/battle/move_effect/raging_bull.c @@ -3,11 +3,11 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_RAGING_BULL].effect == EFFECT_RAGING_BULL); - ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); - ASSUME(gMovesInfo[MOVE_LIGHT_SCREEN].effect == EFFECT_LIGHT_SCREEN); - ASSUME(gMovesInfo[MOVE_REFLECT].effect == EFFECT_REFLECT); - ASSUME(gMovesInfo[MOVE_AURORA_VEIL].effect == EFFECT_AURORA_VEIL); + ASSUME(GetMoveEffect(MOVE_RAGING_BULL) == EFFECT_RAGING_BULL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_LIGHT_SCREEN) == EFFECT_LIGHT_SCREEN); + ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT); + ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL); } SINGLE_BATTLE_TEST("Raging Bull removes Light Screen, Reflect and Aurora Veil from the target's side of the field") diff --git a/test/battle/move_effect/rapid_spin.c b/test/battle/move_effect/rapid_spin.c index e5457395b9..9d142bf32e 100644 --- a/test/battle/move_effect/rapid_spin.c +++ b/test/battle/move_effect/rapid_spin.c @@ -1,19 +1,13 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS -{ - ASSUME(gMovesInfo[MOVE_RAPID_SPIN].effect == EFFECT_RAPID_SPIN); - ASSUME(gMovesInfo[MOVE_MORTAL_SPIN].effect == EFFECT_RAPID_SPIN); -#if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 - ASSUME(MoveHasAdditionalEffectSelf(MOVE_RAPID_SPIN, MOVE_EFFECT_SPD_PLUS_1) == TRUE); -#endif - ASSUME(MoveHasAdditionalEffect(MOVE_MORTAL_SPIN, MOVE_EFFECT_POISON) == TRUE); -} - SINGLE_BATTLE_TEST("Rapid Spin activates after Toxic Debris") { GIVEN { + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); + #if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 + ASSUME(MoveHasAdditionalEffectSelf(MOVE_RAPID_SPIN, MOVE_EFFECT_SPD_PLUS_1) == TRUE); + #endif PLAYER(SPECIES_GLIMMORA) { Ability(ABILITY_TOXIC_DEBRIS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -29,6 +23,10 @@ SINGLE_BATTLE_TEST("Rapid Spin activates after Toxic Debris") SINGLE_BATTLE_TEST("Rapid Spin blows away Wrap, hazards and raises Speed (Gen 8+)") { GIVEN { + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); + #if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 + ASSUME(MoveHasAdditionalEffectSelf(MOVE_RAPID_SPIN, MOVE_EFFECT_SPD_PLUS_1) == TRUE); + #endif PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -49,6 +47,8 @@ SINGLE_BATTLE_TEST("Rapid Spin blows away Wrap, hazards and raises Speed (Gen 8+ SINGLE_BATTLE_TEST("Rapid Spin: Mortal Spin blows away Wrap, hazards and poisons foe") { GIVEN { + ASSUME(GetMoveEffect(MOVE_MORTAL_SPIN) == EFFECT_RAPID_SPIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MORTAL_SPIN, MOVE_EFFECT_POISON) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/recoil_if_miss.c b/test/battle/move_effect/recoil_if_miss.c index a5f0111095..8695156dd0 100644 --- a/test/battle/move_effect/recoil_if_miss.c +++ b/test/battle/move_effect/recoil_if_miss.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_JUMP_KICK].effect == EFFECT_RECOIL_IF_MISS); + ASSUME(GetMoveEffect(MOVE_JUMP_KICK) == EFFECT_RECOIL_IF_MISS); } SINGLE_BATTLE_TEST("Jump Kick has 50% recoil on miss") @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Jump Kick has 50% recoil on miss") SINGLE_BATTLE_TEST("Jump Kick has 50% recoil on protect") { GIVEN { - ASSUME(!gMovesInfo[MOVE_JUMP_KICK].ignoresProtect); + ASSUME(!MoveIgnoresProtect(MOVE_JUMP_KICK)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -64,7 +64,7 @@ SINGLE_BATTLE_TEST("Jump Kick's recoil happens after Spiky Shield damage and Pok PARAMETRIZE { hp = maxHp / 8; faintOnSpiky = TRUE; } // Faints after Spiky Shield's recoil GIVEN { - ASSUME(gMovesInfo[MOVE_SPIKY_SHIELD].effect == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_SPIKY_SHIELD) == EFFECT_PROTECT); PLAYER(SPECIES_WOBBUFFET) { HP(hp); MaxHP(maxHp); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/reflect.c b/test/battle/move_effect/reflect.c index 429dc6f696..83ac3b8503 100644 --- a/test/battle/move_effect/reflect.c +++ b/test/battle/move_effect/reflect.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_REFLECT].effect == EFFECT_REFLECT); + ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT); } SINGLE_BATTLE_TEST("Reflect reduces physical damage", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Reflect reduces physical damage", s16 damage) PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_REFLECT; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Reflect applies for 5 turns") { s16 damage[6]; GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/refresh.c b/test/battle/move_effect/refresh.c index 7cf319f3e6..7d0ba0273e 100644 --- a/test/battle/move_effect/refresh.c +++ b/test/battle/move_effect/refresh.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_REFRESH].effect == EFFECT_REFRESH); + ASSUME(GetMoveEffect(MOVE_REFRESH) == EFFECT_REFRESH); } SINGLE_BATTLE_TEST("Refresh cures the user of burn, frostbite, poison, and paralysis") @@ -45,8 +45,8 @@ SINGLE_BATTLE_TEST("Refresh does not cure the user of Freeze") SINGLE_BATTLE_TEST("Refresh does not cure sleep when used by Sleep Talk") { GIVEN { - ASSUME(gMovesInfo[MOVE_SPORE].effect == EFFECT_SLEEP); - ASSUME(gMovesInfo[MOVE_SLEEP_TALK].effect == EFFECT_SLEEP_TALK); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SLEEP_TALK, MOVE_REFRESH); } } WHEN { diff --git a/test/battle/move_effect/relic_song.c b/test/battle/move_effect/relic_song.c index e7569c7e38..f1e7fae92f 100644 --- a/test/battle/move_effect/relic_song.c +++ b/test/battle/move_effect/relic_song.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_RELIC_SONG].effect == EFFECT_RELIC_SONG); + ASSUME(GetMoveEffect(MOVE_RELIC_SONG) == EFFECT_RELIC_SONG); ASSUME(MoveHasAdditionalEffect(MOVE_RELIC_SONG, MOVE_EFFECT_SLEEP) == TRUE); } diff --git a/test/battle/move_effect/retaliate.c b/test/battle/move_effect/retaliate.c index 581793e854..39c26d196c 100644 --- a/test/battle/move_effect/retaliate.c +++ b/test/battle/move_effect/retaliate.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_RETALIATE].effect == EFFECT_RETALIATE); + ASSUME(GetMoveEffect(MOVE_RETALIATE) == EFFECT_RETALIATE); } SINGLE_BATTLE_TEST("Retaliate doubles in base power the turn after an ally faints") @@ -63,17 +63,17 @@ DOUBLE_BATTLE_TEST("Retaliate works with passive damage") PARAMETRIZE { move = MOVE_FLAME_BURST; moveTarget = playerRight; } PARAMETRIZE { move = MOVE_FIRE_PLEDGE; moveTarget = playerRight; move2 = MOVE_GRASS_PLEDGE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); - ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON); - ASSUME(gMovesInfo[MOVE_WILL_O_WISP].effect == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); #if B_USE_FROSTBITE == TRUE - ASSUME(gMovesInfo[MOVE_ICE_BEAM].additionalEffects[0].moveEffect == MOVE_EFFECT_FREEZE_OR_FROSTBITE); + ASSUME(GetMoveAdditionalEffectById(MOVE_ICE_BEAM, 0)->moveEffect == MOVE_EFFECT_FREEZE_OR_FROSTBITE); #endif - ASSUME(gMovesInfo[MOVE_SANDSTORM].effect == EFFECT_SANDSTORM); - ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); - ASSUME(gMovesInfo[MOVE_LEECH_SEED].effect == EFFECT_LEECH_SEED); - ASSUME(gMovesInfo[MOVE_MAGMA_STORM].additionalEffects[0].moveEffect == MOVE_EFFECT_WRAP); - ASSUME(gMovesInfo[MOVE_FLAME_BURST].additionalEffects[0].moveEffect == MOVE_EFFECT_FLAME_BURST); + ASSUME(GetMoveEffect(MOVE_SANDSTORM) == EFFECT_SANDSTORM); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_LEECH_SEED) == EFFECT_LEECH_SEED); + ASSUME(GetMoveAdditionalEffectById(MOVE_MAGMA_STORM, 0)->moveEffect == MOVE_EFFECT_WRAP); + ASSUME(GetMoveAdditionalEffectById(MOVE_FLAME_BURST, 0)->moveEffect == MOVE_EFFECT_FLAME_BURST); PLAYER(SPECIES_WYNAUT) { Ability(ABILITY_SHADOW_TAG); HP(18); } PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); } PLAYER(SPECIES_WOBBUFFET); @@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("Retaliate works with Perish Song") { s16 damage[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_PERISH_SONG].effect == EFFECT_PERISH_SONG); + ASSUME(GetMoveEffect(MOVE_PERISH_SONG) == EFFECT_PERISH_SONG); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KOMMO_O) { Ability(ABILITY_SOUNDPROOF); } @@ -120,7 +120,7 @@ SINGLE_BATTLE_TEST("Retaliate works with self-inflicted fainting") { s16 damage[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_HEALING_WISH].effect == EFFECT_HEALING_WISH); + ASSUME(GetMoveEffect(MOVE_HEALING_WISH) == EFFECT_HEALING_WISH); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/revelation_dance.c b/test/battle/move_effect/revelation_dance.c index 9ab5d4a8e2..3730ecc0b2 100644 --- a/test/battle/move_effect/revelation_dance.c +++ b/test/battle/move_effect/revelation_dance.c @@ -3,12 +3,12 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].effect == EFFECT_REVELATION_DANCE); - ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].danceMove == TRUE); - ASSUME(MoveHasAdditionalEffectSelfArg(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE)); - ASSUME(gMovesInfo[MOVE_FORESTS_CURSE].effect == EFFECT_THIRD_TYPE); - ASSUME(gMovesInfo[MOVE_FORESTS_CURSE].argument == TYPE_GRASS); - ASSUME(gMovesInfo[MOVE_ROOST].effect == EFFECT_ROOST); + ASSUME(GetMoveEffect(MOVE_REVELATION_DANCE) == EFFECT_REVELATION_DANCE); + ASSUME(IsDanceMove(MOVE_REVELATION_DANCE)); + ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE)); + ASSUME(GetMoveEffect(MOVE_FORESTS_CURSE) == EFFECT_THIRD_TYPE); + ASSUME(GetMoveArgType(MOVE_FORESTS_CURSE) == TYPE_GRASS); + ASSUME(GetMoveEffect(MOVE_ROOST) == EFFECT_ROOST); } SINGLE_BATTLE_TEST("Revelation Dance changes its type depending on the user's 1st Type") diff --git a/test/battle/move_effect/revival_blessing.c b/test/battle/move_effect/revival_blessing.c index dbeda39f91..10198ce352 100644 --- a/test/battle/move_effect/revival_blessing.c +++ b/test/battle/move_effect/revival_blessing.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_REVIVAL_BLESSING].effect == EFFECT_REVIVAL_BLESSING); + ASSUME(GetMoveEffect(MOVE_REVIVAL_BLESSING) == EFFECT_REVIVAL_BLESSING); } SINGLE_BATTLE_TEST("Revival Blessing revives a chosen fainted party member for the player") diff --git a/test/battle/move_effect/roar.c b/test/battle/move_effect/roar.c index 3819fc2043..525e75b6df 100644 --- a/test/battle/move_effect/roar.c +++ b/test/battle/move_effect/roar.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ROAR].effect == EFFECT_ROAR); + ASSUME(GetMoveEffect(MOVE_ROAR) == EFFECT_ROAR); } SINGLE_BATTLE_TEST("Roar switches the target with a random non-fainted replacement") diff --git a/test/battle/move_effect/role_play.c b/test/battle/move_effect/role_play.c index ab0d801ee9..d2d937f7d1 100644 --- a/test/battle/move_effect/role_play.c +++ b/test/battle/move_effect/role_play.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ROLE_PLAY].effect == EFFECT_ROLE_PLAY); + ASSUME(GetMoveEffect(MOVE_ROLE_PLAY) == EFFECT_ROLE_PLAY); } SINGLE_BATTLE_TEST("Role Play copies target's ability") diff --git a/test/battle/move_effect/roost.c b/test/battle/move_effect/roost.c index 449119a89a..51d9499bd1 100644 --- a/test/battle/move_effect/roost.c +++ b/test/battle/move_effect/roost.c @@ -3,28 +3,28 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ROOST].effect == EFFECT_ROOST); + ASSUME(GetMoveEffect(MOVE_ROOST) == EFFECT_ROOST); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FLYING); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FLYING); // One attack of each type to verify typelessness - ASSUME(gMovesInfo[MOVE_POUND].type == TYPE_NORMAL); - ASSUME(gMovesInfo[MOVE_KARATE_CHOP].type == TYPE_FIGHTING); - ASSUME(gMovesInfo[MOVE_GUST].type == TYPE_FLYING); - ASSUME(gMovesInfo[MOVE_POISON_STING].type == TYPE_POISON); - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].type == TYPE_GROUND); - ASSUME(gMovesInfo[MOVE_ROCK_THROW].type == TYPE_ROCK); - ASSUME(gMovesInfo[MOVE_LEECH_LIFE].type == TYPE_BUG); - ASSUME(gMovesInfo[MOVE_LICK].type == TYPE_GHOST); - ASSUME(gMovesInfo[MOVE_STEEL_WING].type == TYPE_STEEL); - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); - ASSUME(gMovesInfo[MOVE_VINE_WHIP].type == TYPE_GRASS); - ASSUME(gMovesInfo[MOVE_THUNDER_SHOCK].type == TYPE_ELECTRIC); - ASSUME(gMovesInfo[MOVE_CONFUSION].type == TYPE_PSYCHIC); - ASSUME(gMovesInfo[MOVE_ICE_BEAM].type == TYPE_ICE); - ASSUME(gMovesInfo[MOVE_DRAGON_BREATH].type == TYPE_DRAGON); - ASSUME(gMovesInfo[MOVE_BITE].type == TYPE_DARK); - ASSUME(gMovesInfo[MOVE_DISARMING_VOICE].type == TYPE_FAIRY); + ASSUME(GetMoveType(MOVE_POUND) == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_KARATE_CHOP) == TYPE_FIGHTING); + ASSUME(GetMoveType(MOVE_GUST) == TYPE_FLYING); + ASSUME(GetMoveType(MOVE_POISON_STING) == TYPE_POISON); + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_ROCK_THROW) == TYPE_ROCK); + ASSUME(GetMoveType(MOVE_LEECH_LIFE) == TYPE_BUG); + ASSUME(GetMoveType(MOVE_LICK) == TYPE_GHOST); + ASSUME(GetMoveType(MOVE_STEEL_WING) == TYPE_STEEL); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); + ASSUME(GetMoveType(MOVE_VINE_WHIP) == TYPE_GRASS); + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_CONFUSION) == TYPE_PSYCHIC); + ASSUME(GetMoveType(MOVE_ICE_BEAM) == TYPE_ICE); + ASSUME(GetMoveType(MOVE_DRAGON_BREATH) == TYPE_DRAGON); + ASSUME(GetMoveType(MOVE_BITE) == TYPE_DARK); + ASSUME(GetMoveType(MOVE_DISARMING_VOICE) == TYPE_FAIRY); } SINGLE_BATTLE_TEST("Roost fails when user is at full HP") diff --git a/test/battle/move_effect/round.c b/test/battle/move_effect/round.c index 09209c79a2..0bac324b0f 100644 --- a/test/battle/move_effect/round.c +++ b/test/battle/move_effect/round.c @@ -3,14 +3,14 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ROUND].effect == EFFECT_ROUND); + ASSUME(GetMoveEffect(MOVE_ROUND) == EFFECT_ROUND); } DOUBLE_BATTLE_TEST("Round allows other battlers which also selected the moves to immediately use the move, ignoring turn order") { GIVEN { ASSUME(gItemsInfo[ITEM_LAGGING_TAIL].holdEffect == HOLD_EFFECT_LAGGING_TAIL); - ASSUME(gMovesInfo[MOVE_IRON_HEAD].additionalEffects[0].moveEffect == MOVE_EFFECT_FLINCH); + ASSUME(GetMoveAdditionalEffectById(MOVE_IRON_HEAD, 0)->moveEffect == MOVE_EFFECT_FLINCH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/semi_invulnerable.c b/test/battle/move_effect/semi_invulnerable.c index d3869bfe54..331413121c 100644 --- a/test/battle/move_effect/semi_invulnerable.c +++ b/test/battle/move_effect/semi_invulnerable.c @@ -3,18 +3,18 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FLY].effect == EFFECT_SEMI_INVULNERABLE); - ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_FLY].argument)) == STATUS3_ON_AIR); - ASSUME(gMovesInfo[MOVE_DIG].effect == EFFECT_SEMI_INVULNERABLE); - ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_DIG].argument)) == STATUS3_UNDERGROUND); - ASSUME(gMovesInfo[MOVE_BOUNCE].effect == EFFECT_SEMI_INVULNERABLE); - ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_BOUNCE].argument)) == STATUS3_ON_AIR); - ASSUME(gMovesInfo[MOVE_DIVE].effect == EFFECT_SEMI_INVULNERABLE); - ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_DIVE].argument)) == STATUS3_UNDERWATER); - ASSUME(gMovesInfo[MOVE_PHANTOM_FORCE].effect == EFFECT_SEMI_INVULNERABLE); - ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_PHANTOM_FORCE].argument)) == STATUS3_PHANTOM_FORCE); - ASSUME(gMovesInfo[MOVE_SHADOW_FORCE].effect == EFFECT_SEMI_INVULNERABLE); - ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_SHADOW_FORCE].argument)) == STATUS3_PHANTOM_FORCE); + ASSUME(GetMoveEffect(MOVE_FLY) == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_FLY) == STATUS3_ON_AIR); + ASSUME(GetMoveEffect(MOVE_DIG) == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_DIG) == STATUS3_UNDERGROUND); + ASSUME(GetMoveEffect(MOVE_BOUNCE) == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_BOUNCE) == STATUS3_ON_AIR); + ASSUME(GetMoveEffect(MOVE_DIVE) == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_DIVE) == STATUS3_UNDERWATER); + ASSUME(GetMoveEffect(MOVE_PHANTOM_FORCE) == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_PHANTOM_FORCE) == STATUS3_PHANTOM_FORCE); + ASSUME(GetMoveEffect(MOVE_SHADOW_FORCE) == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_SHADOW_FORCE) == STATUS3_PHANTOM_FORCE); } SINGLE_BATTLE_TEST("Semi-invulnerable moves make the user semi-invulnerable turn 1, then strike turn 2") diff --git a/test/battle/move_effect/shed_tail.c b/test/battle/move_effect/shed_tail.c index 6e337f4fe7..f4498c7e34 100644 --- a/test/battle/move_effect/shed_tail.c +++ b/test/battle/move_effect/shed_tail.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SHED_TAIL].effect == EFFECT_SHED_TAIL); + ASSUME(GetMoveEffect(MOVE_SHED_TAIL) == EFFECT_SHED_TAIL); } SINGLE_BATTLE_TEST("Shed Tail creates a Substitute at the cost of 1/2 users maximum HP and switches the user out") @@ -86,16 +86,19 @@ SINGLE_BATTLE_TEST("Shed Tail's HP cost doesn't trigger effects that trigger on } } -AI_SINGLE_BATTLE_TEST("AI will use Shed Tail to pivot to another mon while in damage stalemate with player") +AI_SINGLE_BATTLE_TEST("AI will use Shed Tail to pivot to another mon while in damage stalemate with player rather than hard switching") { - KNOWN_FAILING; // missing AI code + u32 aiFlags; + PARAMETRIZE { aiFlags = 0; } + PARAMETRIZE { aiFlags = AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES; } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiFlags); PLAYER(SPECIES_WOBBUFFET) { Speed(100); Ability(ABILITY_RUN_AWAY); Moves(MOVE_TACKLE, MOVE_CELEBRATE); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); Ability(ABILITY_RUN_AWAY); Moves(MOVE_CONFUSION, MOVE_SHED_TAIL); } OPPONENT(SPECIES_SCIZOR) { Speed(101); Moves(MOVE_CELEBRATE, MOVE_X_SCISSOR); } } WHEN { - TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_CONFUSION); } + if (aiFlags == 0) + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_CONFUSION); } TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_SHED_TAIL); } } } @@ -107,8 +110,8 @@ SINGLE_BATTLE_TEST("Shed Tail creates a Substitute with 1/4 of user maximum heal PARAMETRIZE { hp = 164; } GIVEN { - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40); - ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); PLAYER(SPECIES_BULBASAUR) { MaxHP(hp); } PLAYER(SPECIES_BULBASAUR); OPPONENT(SPECIES_CHARMANDER); diff --git a/test/battle/move_effect/shell_trap.c b/test/battle/move_effect/shell_trap.c index d43893244a..f121d1444d 100644 --- a/test/battle/move_effect/shell_trap.c +++ b/test/battle/move_effect/shell_trap.c @@ -3,10 +3,10 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SHELL_TRAP].effect == EFFECT_SHELL_TRAP); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_WATER_GUN].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_LEER].category == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMoveEffect(MOVE_SHELL_TRAP) == EFFECT_SHELL_TRAP); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_LEER) == DAMAGE_CATEGORY_STATUS); } SINGLE_BATTLE_TEST("Shell Trap activates only if hit by a physical move") @@ -98,7 +98,7 @@ SINGLE_BATTLE_TEST("Shell Trap does not activate if battler faints before being DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 1 and attacks both opponents") { GIVEN { - ASSUME(gMovesInfo[MOVE_SHELL_TRAP].target == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == MOVE_TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } PLAYER(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } @@ -122,7 +122,7 @@ DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 1 a DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 2 and attacks both opponents") { GIVEN { - ASSUME(gMovesInfo[MOVE_SHELL_TRAP].target == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == MOVE_TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } PLAYER(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } @@ -146,7 +146,7 @@ DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 2 a DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 3 and attacks both opponents") { GIVEN { - ASSUME(gMovesInfo[MOVE_SHELL_TRAP].target == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == MOVE_TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } PLAYER(SPECIES_WOBBUFFET) { Speed(7); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } @@ -170,7 +170,7 @@ DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 3 a DOUBLE_BATTLE_TEST("Shell Trap targets correctly if one of the opponents has fainted") { GIVEN { - ASSUME(gMovesInfo[MOVE_SHELL_TRAP].target == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == MOVE_TARGET_BOTH); PLAYER(SPECIES_GRENINJA) { Speed(60); } PLAYER(SPECIES_TURTONATOR) { Speed(10); } OPPONENT(SPECIES_BLASTOISE) { Speed(120); } diff --git a/test/battle/move_effect/simple_beam.c b/test/battle/move_effect/simple_beam.c index e91bf0b8ce..4250c8ce45 100644 --- a/test/battle/move_effect/simple_beam.c +++ b/test/battle/move_effect/simple_beam.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SIMPLE_BEAM].effect == EFFECT_SIMPLE_BEAM); + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_SIMPLE_BEAM); } SINGLE_BATTLE_TEST("Simple Beam replaces target's ability with Simple") diff --git a/test/battle/move_effect/skill_swap.c b/test/battle/move_effect/skill_swap.c index 9c31ae59a7..c3c2ca91f4 100644 --- a/test/battle/move_effect/skill_swap.c +++ b/test/battle/move_effect/skill_swap.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SKILL_SWAP].effect == EFFECT_SKILL_SWAP); + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); } SINGLE_BATTLE_TEST("Skill Swap swaps user and target's abilities") diff --git a/test/battle/move_effect/sleep.c b/test/battle/move_effect/sleep.c index 834f606672..702044d331 100644 --- a/test/battle/move_effect/sleep.c +++ b/test/battle/move_effect/sleep.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HYPNOSIS].effect == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_SLEEP); } SINGLE_BATTLE_TEST("Hypnosis inflicts 1-3 turns of sleep") diff --git a/test/battle/move_effect/sleep_talk.c b/test/battle/move_effect/sleep_talk.c index aaff5dc123..b00f89e582 100644 --- a/test/battle/move_effect/sleep_talk.c +++ b/test/battle/move_effect/sleep_talk.c @@ -3,10 +3,10 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SLEEP_TALK].effect == EFFECT_SLEEP_TALK); - ASSUME(gMovesInfo[MOVE_RAZOR_WIND].sleepTalkBanned == TRUE); - ASSUME(gMovesInfo[MOVE_FLY].sleepTalkBanned == TRUE); - ASSUME(gMovesInfo[MOVE_DIG].sleepTalkBanned == TRUE); + ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); + ASSUME(IsMoveSleepTalkBanned(MOVE_RAZOR_WIND)); + ASSUME(IsMoveSleepTalkBanned(MOVE_FLY)); + ASSUME(IsMoveSleepTalkBanned(MOVE_DIG)); } SINGLE_BATTLE_TEST("Sleep Talk fails if not asleep") diff --git a/test/battle/move_effect/smelling_salts.c b/test/battle/move_effect/smelling_salts.c index bb3f333a42..6b1d0b2d7e 100644 --- a/test/battle/move_effect/smelling_salts.c +++ b/test/battle/move_effect/smelling_salts.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(MoveHasAdditionalEffect(MOVE_SMELLING_SALTS, MOVE_EFFECT_REMOVE_STATUS) == TRUE); - ASSUME(gMovesInfo[MOVE_SMELLING_SALTS].argument == STATUS1_PARALYSIS); + ASSUME(GetMoveEffectArg_Status(MOVE_SMELLING_SALTS) == STATUS1_PARALYSIS); } SINGLE_BATTLE_TEST("Smelling Salts does not cure paralyzed pokemons behind substitutes or get increased power") diff --git a/test/battle/move_effect/solar_beam.c b/test/battle/move_effect/solar_beam.c new file mode 100644 index 0000000000..309d950c50 --- /dev/null +++ b/test/battle/move_effect/solar_beam.c @@ -0,0 +1,34 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SOLAR_BEAM) == EFFECT_SOLAR_BEAM); + ASSUME(GetMoveTwoTurnAttackWeather(MOVE_SOLAR_BLADE) == B_WEATHER_SUN); +} + +SINGLE_BATTLE_TEST("Solar Beam does not need a charging turn if Sun is up") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_DROUGHT; } + PARAMETRIZE { ability = ABILITY_WHITE_SMOKE; } + + GIVEN { + PLAYER(SPECIES_TORKOAL) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SOLAR_BEAM); } + if (ability == ABILITY_WHITE_SMOKE) { + TURN { SKIP_TURN(player); } + } + } SCENE { + if (ability == ABILITY_WHITE_SMOKE) { + MESSAGE("Torkoal used Solar Beam!"); + MESSAGE("Torkoal absorbed light!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } + MESSAGE("Torkoal used Solar Beam!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SOLAR_BEAM, player); + } +} diff --git a/test/battle/move_effect/sparkling_aria.c b/test/battle/move_effect/sparkling_aria.c index 332cf8165c..86b906228b 100644 --- a/test/battle/move_effect/sparkling_aria.c +++ b/test/battle/move_effect/sparkling_aria.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLING_ARIA, MOVE_EFFECT_REMOVE_STATUS) == TRUE); - ASSUME(gMovesInfo[MOVE_SPARKLING_ARIA].argument == STATUS1_BURN); - ASSUME(gMovesInfo[MOVE_SPARKLING_ARIA].soundMove == TRUE); + ASSUME(GetMoveEffectArg_Status(MOVE_SPARKLING_ARIA) == STATUS1_BURN); + ASSUME(IsSoundMove(MOVE_SPARKLING_ARIA)); } DOUBLE_BATTLE_TEST("Sparkling Aria cures burns from all Pokemon on the field and behind substitutes") diff --git a/test/battle/move_effect/special_attack_down.c b/test/battle/move_effect/special_attack_down.c index 60d015d1cd..63ca071fc1 100644 --- a/test/battle/move_effect/special_attack_down.c +++ b/test/battle/move_effect/special_attack_down.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_CONFIDE) == EFFECT_SPECIAL_ATTACK_DOWN); } SINGLE_BATTLE_TEST("Confide lowers Special Attack", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Confide lowers Special Attack", s16 damage) PARAMETRIZE { lowerSpecialAttack = FALSE; } PARAMETRIZE { lowerSpecialAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_GUST].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/special_attack_up_3.c b/test/battle/move_effect/special_attack_up_3.c index a701893f51..75f6c4b36d 100644 --- a/test/battle/move_effect/special_attack_up_3.c +++ b/test/battle/move_effect/special_attack_up_3.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TAIL_GLOW].effect == EFFECT_SPECIAL_ATTACK_UP_3); + ASSUME(GetMoveEffect(MOVE_TAIL_GLOW) == EFFECT_SPECIAL_ATTACK_UP_3); } SINGLE_BATTLE_TEST("Tail Glow drastically raises Special Attack", s16 damage) @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Tail Glow drastically raises Special Attack", s16 damage) PARAMETRIZE { raiseSpecialAttack = FALSE; } PARAMETRIZE { raiseSpecialAttack = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_GUST].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/speed_swap.c b/test/battle/move_effect/speed_swap.c new file mode 100644 index 0000000000..0a87b26236 --- /dev/null +++ b/test/battle/move_effect/speed_swap.c @@ -0,0 +1,58 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SPEED_SWAP) == EFFECT_SPEED_SWAP); +} + +SINGLE_BATTLE_TEST("Speed Swap swaps user and target's speed stats") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(6); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + }WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_SPEED_SWAP); } + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_TACKLE); } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPEED_SWAP, player); + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + } THEN { + EXPECT_EQ(player->speed, 10); + EXPECT_EQ(opponent->speed, 6); + } +} + +SINGLE_BATTLE_TEST("Speed Swap doesn't swap user and target's speed modifiers") +{ + u32 species, ability, move; + PARAMETRIZE { species = SPECIES_WOBBUFFET; ability = ABILITY_TELEPATHY; move = MOVE_ROCK_POLISH; } // x2.0 + PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_SWIFT_SWIM; move = MOVE_RAIN_DANCE; } // x2.0 + GIVEN { + ASSUME(GetMoveEffect(MOVE_ROCK_POLISH) == EFFECT_SPEED_UP_2); + ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_RAIN_DANCE); + PLAYER(SPECIES_WOBBUFFET) { Speed(8); } + OPPONENT(species) { Speed(10); Ability(ability); } + }WHEN { + TURN { MOVE(opponent, move); MOVE(player, MOVE_SPEED_SWAP); } + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_TACKLE); } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPEED_SWAP, player); + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); // Opponent is still first + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + } THEN { + EXPECT_EQ(player->speed, 10); + EXPECT_EQ(opponent->speed, 8); + if (move == MOVE_ROCK_POLISH) { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + } + } +} diff --git a/test/battle/move_effect/spicy_extract.c b/test/battle/move_effect/spicy_extract.c index c9ddb3c30d..b5fe1da0f1 100644 --- a/test/battle/move_effect/spicy_extract.c +++ b/test/battle/move_effect/spicy_extract.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SPICY_EXTRACT].effect == EFFECT_SPICY_EXTRACT); + ASSUME(GetMoveEffect(MOVE_SPICY_EXTRACT) == EFFECT_SPICY_EXTRACT); } SINGLE_BATTLE_TEST("Spicy Extract raises target's Attack by 2 stages and lowers target's Defense by 2 stages") @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Spicy Extract is prevented by target's ability if it's Attac PARAMETRIZE { ability = ABILITY_LIGHT_METAL; } GIVEN { - ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BELDUM) { Ability(ability); } } WHEN { diff --git a/test/battle/move_effect/spikes.c b/test/battle/move_effect/spikes.c index 339a9f9a4b..187b9ce7ac 100644 --- a/test/battle/move_effect/spikes.c +++ b/test/battle/move_effect/spikes.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SPIKES].effect == EFFECT_SPIKES); + ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); } SINGLE_BATTLE_TEST("Spikes damage on switch in") diff --git a/test/battle/move_effect/stealth_rock.c b/test/battle/move_effect/stealth_rock.c index 9a38f17a5e..d4399a2d0f 100644 --- a/test/battle/move_effect/stealth_rock.c +++ b/test/battle/move_effect/stealth_rock.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].effect == EFFECT_STEALTH_ROCK); + ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK); } SINGLE_BATTLE_TEST("Stealth Rock damage on switch in based on typing") diff --git a/test/battle/move_effect/sticky_web.c b/test/battle/move_effect/sticky_web.c index e99368aa7d..ed0f6e5d93 100644 --- a/test/battle/move_effect/sticky_web.c +++ b/test/battle/move_effect/sticky_web.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB); + ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); } SINGLE_BATTLE_TEST("Sticky Web lowers Speed by 1 on switch-in") @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Sticky Web can only be set up 1 time") DOUBLE_BATTLE_TEST("Sticky Web lowers Speed by 1 in a double battle after Explosion fainting both mons") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); PLAYER(SPECIES_WOBBUFFET) {Speed(5);} PLAYER(SPECIES_WOBBUFFET) {HP(1500); Speed(10);} PLAYER(SPECIES_WOBBUFFET) {Speed(10);} @@ -197,7 +197,7 @@ DOUBLE_BATTLE_TEST("Sticky Web has correct interactions with Mirror Armor - no o PARAMETRIZE {hasReplacement = FALSE;} GIVEN { - ASSUME(gMovesInfo[MOVE_MEMENTO].effect == EFFECT_MEMENTO); + ASSUME(GetMoveEffect(MOVE_MEMENTO) == EFFECT_MEMENTO); PLAYER(SPECIES_SQUIRTLE) {Speed(5); } PLAYER(SPECIES_CHARMANDER) {Speed(5); } PLAYER(SPECIES_CORVIKNIGHT) {Ability(ABILITY_MIRROR_ARMOR); Item(ITEM_IRON_BALL); Speed(5); } // Iron Ball, so that flying type Corviknight is affected by Sticky Web. diff --git a/test/battle/move_effect/stockpile.c b/test/battle/move_effect/stockpile.c index f6c3f02a46..f045fa6823 100644 --- a/test/battle/move_effect/stockpile.c +++ b/test/battle/move_effect/stockpile.c @@ -4,9 +4,9 @@ // These tests cover all 3 effects: Stockpile, Spit up and Swallow. ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_STOCKPILE].effect == EFFECT_STOCKPILE); - ASSUME(gMovesInfo[MOVE_SWALLOW].effect == EFFECT_SWALLOW); - ASSUME(gMovesInfo[MOVE_SPIT_UP].effect == EFFECT_SPIT_UP); + ASSUME(GetMoveEffect(MOVE_STOCKPILE) == EFFECT_STOCKPILE); + ASSUME(GetMoveEffect(MOVE_SWALLOW) == EFFECT_SWALLOW); + ASSUME(GetMoveEffect(MOVE_SPIT_UP) == EFFECT_SPIT_UP); } SINGLE_BATTLE_TEST("Stockpile's count can go up only to 3") @@ -148,8 +148,8 @@ SINGLE_BATTLE_TEST("Stockpile temporarily raises Def and Sp. Def", s16 dmgPyhsic PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { ASSUME(B_STOCKPILE_RAISES_DEFS >= GEN_4); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_GUST].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } } WHEN { @@ -184,8 +184,8 @@ DOUBLE_BATTLE_TEST("Stockpile's Def and Sp. Def boost is lost after using Spit U PARAMETRIZE { count = 3; move = MOVE_SPIT_UP; } GIVEN { ASSUME(B_STOCKPILE_RAISES_DEFS >= GEN_4); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_GUST].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET) { Speed(4); HP(399); MaxHP(400); } PLAYER(SPECIES_WOBBUFFET) { Speed(3); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } diff --git a/test/battle/move_effect/stomping_tantrum.c b/test/battle/move_effect/stomping_tantrum.c index 32747282e4..c759de38b1 100644 --- a/test/battle/move_effect/stomping_tantrum.c +++ b/test/battle/move_effect/stomping_tantrum.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_STOMPING_TANTRUM].effect == EFFECT_STOMPING_TANTRUM); + ASSUME(GetMoveEffect(MOVE_STOMPING_TANTRUM) == EFFECT_STOMPING_TANTRUM); } SINGLE_BATTLE_TEST("Stomping Tatrum will deal double damage if user flinched on the previous turn") diff --git a/test/battle/move_effect/strength_sap.c b/test/battle/move_effect/strength_sap.c index 813b2abfb2..c38048ba8f 100644 --- a/test/battle/move_effect/strength_sap.c +++ b/test/battle/move_effect/strength_sap.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_STRENGTH_SAP].effect == EFFECT_STRENGTH_SAP); + ASSUME(GetMoveEffect(MOVE_STRENGTH_SAP) == EFFECT_STRENGTH_SAP); } SINGLE_BATTLE_TEST("Strength Sap lowers Attack by 1 and restores HP based on target's Attack Stat", s16 hp) @@ -69,8 +69,8 @@ SINGLE_BATTLE_TEST("Strength Sap lowers Attack by 1 and restores HP based on tar } GIVEN { - ASSUME(gMovesInfo[MOVE_WORK_UP].effect == EFFECT_ATTACK_SPATK_UP); - ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_WORK_UP) == EFFECT_ATTACK_SPATK_UP); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); PLAYER(SPECIES_WOBBUFFET) { HP(50); } OPPONENT(SPECIES_WOBBUFFET) { Attack(60); } } WHEN { @@ -117,7 +117,7 @@ SINGLE_BATTLE_TEST("Strength Sap lowers Attack by 1 and restores HP based on tar SINGLE_BATTLE_TEST("Strength Sap fails if target is at -6 Atk") { GIVEN { - ASSUME(gMovesInfo[MOVE_CHARM].effect == EFFECT_ATTACK_DOWN_2); + ASSUME(GetMoveEffect(MOVE_CHARM) == EFFECT_ATTACK_DOWN_2); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/stuff_cheeks.c b/test/battle/move_effect/stuff_cheeks.c index 3bb3f22925..9e6a34c306 100644 --- a/test/battle/move_effect/stuff_cheeks.c +++ b/test/battle/move_effect/stuff_cheeks.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_STUFF_CHEEKS].effect == EFFECT_STUFF_CHEEKS); + ASSUME(GetMoveEffect(MOVE_STUFF_CHEEKS) == EFFECT_STUFF_CHEEKS); ASSUME(gItemsInfo[ITEM_LIECHI_BERRY].pocket == POCKET_BERRIES); ASSUME(gItemsInfo[ITEM_LIECHI_BERRY].holdEffect == HOLD_EFFECT_ATTACK_UP); } @@ -92,7 +92,7 @@ SINGLE_BATTLE_TEST("Stuff Cheeks can be used even if Magic Room is active") SINGLE_BATTLE_TEST("Stuff Cheeks fails if the user's berry is removed before they use the move") { GIVEN { - ASSUME(gMovesInfo[MOVE_KNOCK_OFF].effect == EFFECT_KNOCK_OFF); + ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); PLAYER(SPECIES_SKWOVET) { Item(ITEM_LIECHI_BERRY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/substitute.c b/test/battle/move_effect/substitute.c index 92e894fa07..e94767b660 100644 --- a/test/battle/move_effect/substitute.c +++ b/test/battle/move_effect/substitute.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE); + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); } SINGLE_BATTLE_TEST("Substitute creates a Substitute at the cost of 1/4 users maximum HP") diff --git a/test/battle/move_effect/super_effective_on_arg.c b/test/battle/move_effect/super_effective_on_arg.c index d10b8a2231..2569ccb109 100644 --- a/test/battle/move_effect/super_effective_on_arg.c +++ b/test/battle/move_effect/super_effective_on_arg.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_FREEZE_DRY].effect == EFFECT_SUPER_EFFECTIVE_ON_ARG); + ASSUME(GetMoveEffect(MOVE_FREEZE_DRY) == EFFECT_SUPER_EFFECTIVE_ON_ARG); } SINGLE_BATTLE_TEST("Freeze Dry is super effective on water types") diff --git a/test/battle/move_effect/synthesis.c b/test/battle/move_effect/synthesis.c index e4a2b77869..6799bd2870 100644 --- a/test/battle/move_effect/synthesis.c +++ b/test/battle/move_effect/synthesis.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SYNTHESIS].effect == EFFECT_SYNTHESIS); + ASSUME(GetMoveEffect(MOVE_SYNTHESIS) == EFFECT_SYNTHESIS); } SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP") diff --git a/test/battle/move_effect/tailwind.c b/test/battle/move_effect/tailwind.c index 5fa5356451..f105c9612a 100644 --- a/test/battle/move_effect/tailwind.c +++ b/test/battle/move_effect/tailwind.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TAILWIND].effect == EFFECT_TAILWIND); + ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); } SINGLE_BATTLE_TEST("Tailwind applies for 4 turns") diff --git a/test/battle/move_effect/take_heart.c b/test/battle/move_effect/take_heart.c index 2961725b22..e029439103 100644 --- a/test/battle/move_effect/take_heart.c +++ b/test/battle/move_effect/take_heart.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TAKE_HEART].effect == EFFECT_TAKE_HEART); + ASSUME(GetMoveEffect(MOVE_TAKE_HEART) == EFFECT_TAKE_HEART); } SINGLE_BATTLE_TEST("Take Heart increases Sp. Atk and Sp. Def by one stage") @@ -50,8 +50,8 @@ SINGLE_BATTLE_TEST("Take Heart cures the user of all status conditions") SINGLE_BATTLE_TEST("Take Heart cures sleep when used by Sleep Talk") { GIVEN { - ASSUME(gMovesInfo[MOVE_SPORE].effect == EFFECT_SLEEP); - ASSUME(gMovesInfo[MOVE_SLEEP_TALK].effect == EFFECT_SLEEP_TALK); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SLEEP_TALK, MOVE_TAKE_HEART); } } WHEN { diff --git a/test/battle/move_effect/tar_shot.c b/test/battle/move_effect/tar_shot.c index 2b780577ec..f2aac4e552 100644 --- a/test/battle/move_effect/tar_shot.c +++ b/test/battle/move_effect/tar_shot.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TAR_SHOT].effect == EFFECT_TAR_SHOT); + ASSUME(GetMoveEffect(MOVE_TAR_SHOT) == EFFECT_TAR_SHOT); } SINGLE_BATTLE_TEST("Tar Shot doubles the effectiveness of Fire-type moves used on the target") @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Tar Shot doubles the effectiveness of Fire-type moves used o ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); ASSUME(gSpeciesInfo[SPECIES_OMASTAR].types[0] == TYPE_ROCK); ASSUME(gSpeciesInfo[SPECIES_OMASTAR].types[1] == TYPE_WATER); - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); GIVEN { PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/teatime.c b/test/battle/move_effect/teatime.c index dfdc70c801..fc4ad22198 100644 --- a/test/battle/move_effect/teatime.c +++ b/test/battle/move_effect/teatime.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TEATIME].effect == EFFECT_TEATIME); + ASSUME(GetMoveEffect(MOVE_TEATIME) == EFFECT_TEATIME); ASSUME(gItemsInfo[ITEM_LIECHI_BERRY].holdEffect == HOLD_EFFECT_ATTACK_UP); } diff --git a/test/battle/move_effect/telekinesis.c b/test/battle/move_effect/telekinesis.c index 746c42d053..31390d9733 100644 --- a/test/battle/move_effect/telekinesis.c +++ b/test/battle/move_effect/telekinesis.c @@ -3,14 +3,14 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TELEKINESIS].effect == EFFECT_TELEKINESIS); + ASSUME(GetMoveEffect(MOVE_TELEKINESIS) == EFFECT_TELEKINESIS); } SINGLE_BATTLE_TEST("Telekinesis makes the target unable to avoid any attacks made against it") { GIVEN { - ASSUME(gMovesInfo[MOVE_MINIMIZE].effect == EFFECT_MINIMIZE); // Raises evs by 2 - ASSUME(gMovesInfo[MOVE_SCREECH].accuracy < 100); + ASSUME(GetMoveEffect(MOVE_MINIMIZE) == EFFECT_MINIMIZE); // Raises evs by 2 + ASSUME(GetMoveAccuracy(MOVE_SCREECH) < 100); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); } WHEN { @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Telekinesis ends after 3 turns") SINGLE_BATTLE_TEST("Telekinesis makes the target immune to Ground-type attacks") { GIVEN { - ASSUME(gMovesInfo[MOVE_BULLDOZE].type == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_BULLDOZE) == TYPE_GROUND); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); } WHEN { diff --git a/test/battle/move_effect/teleport.c b/test/battle/move_effect/teleport.c index 3c79cb54ff..f77dffc658 100644 --- a/test/battle/move_effect/teleport.c +++ b/test/battle/move_effect/teleport.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TELEPORT].effect == EFFECT_TELEPORT); + ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT); } SINGLE_BATTLE_TEST("Teleport fails when there is no pokemon to switch in") diff --git a/test/battle/move_effect/tera_blast.c b/test/battle/move_effect/tera_blast.c index 80e960a1af..63e7a776b9 100644 --- a/test/battle/move_effect/tera_blast.c +++ b/test/battle/move_effect/tera_blast.c @@ -3,13 +3,13 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TERA_BLAST].effect == EFFECT_TERA_BLAST); + ASSUME(GetMoveEffect(MOVE_TERA_BLAST) == EFFECT_TERA_BLAST); } SINGLE_BATTLE_TEST("Tera Blast changes from Normal-type to the user's Tera Type") { GIVEN { - ASSUME(gMovesInfo[MOVE_TERA_BLAST].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_TERA_BLAST) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_DARK); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/tera_starstorm.c b/test/battle/move_effect/tera_starstorm.c index b6b4571644..3077b38df9 100644 --- a/test/battle/move_effect/tera_starstorm.c +++ b/test/battle/move_effect/tera_starstorm.c @@ -3,13 +3,13 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TERA_STARSTORM].effect == EFFECT_TERA_STARSTORM); + ASSUME(GetMoveEffect(MOVE_TERA_STARSTORM) == EFFECT_TERA_STARSTORM); } SINGLE_BATTLE_TEST("Tera Starstorm changes from Normal-type to Stellar-type if used by Terapagos-Stellar") { GIVEN { - ASSUME(gMovesInfo[MOVE_TERA_STARSTORM].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_TERA_STARSTORM) == TYPE_NORMAL); PLAYER(SPECIES_TERAPAGOS_STELLAR); OPPONENT(SPECIES_MISDREAVUS); } WHEN { @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Tera Starstorm changes from Normal-type to Stellar-type if u DOUBLE_BATTLE_TEST("Tera Starstorm targets both opponents in a double battle if used by Terapagos-Stellar") { GIVEN { - ASSUME(gMovesInfo[MOVE_TERA_STARSTORM].target == MOVE_TARGET_SELECTED); + ASSUME(GetMoveTarget(MOVE_TERA_STARSTORM) == MOVE_TARGET_SELECTED); PLAYER(SPECIES_TERAPAGOS_STELLAR); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -46,7 +46,7 @@ SINGLE_BATTLE_TEST("Tera Starstorm becomes a physical move if the user is Terapa PARAMETRIZE { tera = GIMMICK_NONE; } PARAMETRIZE { tera = GIMMICK_TERA; } GIVEN { - ASSUME(gMovesInfo[MOVE_TERA_STARSTORM].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_TERA_STARSTORM) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_TERAPAGOS_STELLAR) { Attack(100); SpAttack(50); } OPPONENT(SPECIES_WOBBUFFET) { Defense(200); SpDefense(200); } } WHEN { @@ -63,7 +63,7 @@ SINGLE_BATTLE_TEST("Tera Starstorm becomes a physical move if the user is Terapa SINGLE_BATTLE_TEST("Tera Starstorm remains Normal-type if used by Pokemon other than Terapagos") { GIVEN { - ASSUME(gMovesInfo[MOVE_TERA_STARSTORM].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_TERA_STARSTORM) == TYPE_NORMAL); ASSUME(gSpeciesInfo[SPECIES_MISDREAVUS].types[0] == TYPE_GHOST); PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } OPPONENT(SPECIES_MISDREAVUS); diff --git a/test/battle/move_effect/thousand_arrows.c b/test/battle/move_effect/thousand_arrows.c index 09e726fa20..c62e71001d 100644 --- a/test/battle/move_effect/thousand_arrows.c +++ b/test/battle/move_effect/thousand_arrows.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(MoveHasAdditionalEffect(MOVE_THOUSAND_ARROWS, MOVE_EFFECT_SMACK_DOWN) == TRUE); - ASSUME(gMovesInfo[MOVE_THOUSAND_ARROWS].ignoreTypeIfFlyingAndUngrounded == TRUE); + ASSUME(MoveHasAdditionalEffect(MOVE_THOUSAND_ARROWS, MOVE_EFFECT_SMACK_DOWN)); + ASSUME(MoveIgnoresTypeIfFlyingAndUngrounded(MOVE_THOUSAND_ARROWS) == TRUE); } SINGLE_BATTLE_TEST("Thousand Arrows does not ground mons behind substitutes") diff --git a/test/battle/move_effect/thunder.c b/test/battle/move_effect/thunder.c index 98a4979e79..81ebd416ca 100644 --- a/test/battle/move_effect/thunder.c +++ b/test/battle/move_effect/thunder.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_THUNDER].effect == EFFECT_THUNDER); - ASSUME(gMovesInfo[MOVE_THUNDER].accuracy == 70); + ASSUME(GetMoveEffect(MOVE_THUNDER) == EFFECT_THUNDER); + ASSUME(GetMoveAccuracy(MOVE_THUNDER) == 70); } SINGLE_BATTLE_TEST("Thunder's accuracy is lowered to 50% in Sunlight") diff --git a/test/battle/move_effect/tidy_up.c b/test/battle/move_effect/tidy_up.c index fcb78ba962..9c934ab213 100644 --- a/test/battle/move_effect/tidy_up.c +++ b/test/battle/move_effect/tidy_up.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TIDY_UP].effect == EFFECT_TIDY_UP); + ASSUME(GetMoveEffect(MOVE_TIDY_UP) == EFFECT_TIDY_UP); } SINGLE_BATTLE_TEST("Tidy Up raises Attack and Speed by one") diff --git a/test/battle/move_effect/torment.c b/test/battle/move_effect/torment.c index dc911691b0..446d168de2 100644 --- a/test/battle/move_effect/torment.c +++ b/test/battle/move_effect/torment.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TORMENT].effect == EFFECT_TORMENT); + ASSUME(GetMoveEffect(MOVE_TORMENT) == EFFECT_TORMENT); } SINGLE_BATTLE_TEST("Torment prevents consecutive move uses") diff --git a/test/battle/move_effect/toxic.c b/test/battle/move_effect/toxic.c index 804ed56b8f..7b8274a441 100644 --- a/test/battle/move_effect/toxic.c +++ b/test/battle/move_effect/toxic.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); } SINGLE_BATTLE_TEST("Toxic inflicts bad poison") diff --git a/test/battle/move_effect/toxic_spikes.c b/test/battle/move_effect/toxic_spikes.c index fd18f57b97..70053b4a44 100644 --- a/test/battle/move_effect/toxic_spikes.c +++ b/test/battle/move_effect/toxic_spikes.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES); + ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); } SINGLE_BATTLE_TEST("Toxic Spikes inflicts poison on switch in") @@ -212,7 +212,7 @@ SINGLE_BATTLE_TEST("Toxic Spikes are removed by Poison-type Pokémon affected by SINGLE_BATTLE_TEST("Toxic Spikes inflicts poison on switch in after Primal Reversed mon fainted") // Oddly specific, but encountered during testing { GIVEN { - ASSUME(gMovesInfo[MOVE_MEMENTO].effect == EFFECT_MEMENTO); // Faints the user. + ASSUME(GetMoveEffect(MOVE_MEMENTO) == EFFECT_MEMENTO); // Faints the user. PLAYER(SPECIES_WOBBUFFET) {Speed(5); } PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(1); } PLAYER(SPECIES_WYNAUT) {Speed(5); } diff --git a/test/battle/move_effect/triple_kick.c b/test/battle/move_effect/triple_kick.c index 9fe0ec6022..5aeb1ea442 100644 --- a/test/battle/move_effect/triple_kick.c +++ b/test/battle/move_effect/triple_kick.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_TRIPLE_KICK].effect == EFFECT_TRIPLE_KICK); + ASSUME(GetMoveEffect(MOVE_TRIPLE_KICK) == EFFECT_TRIPLE_KICK); } SINGLE_BATTLE_TEST("Triple Kick damage is increased by its base damage for each hit") diff --git a/test/battle/move_effect/two_turns_attack.c b/test/battle/move_effect/two_turns_attack.c index 78dd62f093..4dd79ade46 100644 --- a/test/battle/move_effect/two_turns_attack.c +++ b/test/battle/move_effect/two_turns_attack.c @@ -3,20 +3,14 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_RAZOR_WIND].effect == EFFECT_TWO_TURNS_ATTACK); - ASSUME(gMovesInfo[MOVE_SKULL_BASH].effect == EFFECT_TWO_TURNS_ATTACK); + ASSUME(GetMoveEffect(MOVE_RAZOR_WIND) == EFFECT_TWO_TURNS_ATTACK); + ASSUME(GetMoveEffect(MOVE_SKULL_BASH) == EFFECT_TWO_TURNS_ATTACK); ASSUME(MoveHasAdditionalEffectSelf(MOVE_SKULL_BASH, MOVE_EFFECT_DEF_PLUS_1) == TRUE); - ASSUME(gMovesInfo[MOVE_SKY_ATTACK].effect == EFFECT_TWO_TURNS_ATTACK); - - // Solar Beam - check for sun - ASSUME(gMovesInfo[MOVE_SOLAR_BEAM].effect == EFFECT_SOLAR_BEAM); - ASSUME(HIHALF(gMovesInfo[MOVE_SOLAR_BLADE].argument) == B_WEATHER_SUN); - ASSUME(gMovesInfo[MOVE_SOLAR_BLADE].effect == EFFECT_SOLAR_BEAM); - ASSUME(HIHALF(gMovesInfo[MOVE_SOLAR_BLADE].argument) == B_WEATHER_SUN); + ASSUME(GetMoveEffect(MOVE_SKY_ATTACK) == EFFECT_TWO_TURNS_ATTACK); // Electro shot - check for rain - ASSUME(HIHALF(gMovesInfo[MOVE_ELECTRO_SHOT].argument) == B_WEATHER_RAIN); - ASSUME(gMovesInfo[MOVE_ELECTRO_SHOT].effect == EFFECT_TWO_TURNS_ATTACK); + ASSUME(GetMoveTwoTurnAttackWeather(MOVE_ELECTRO_SHOT) == B_WEATHER_RAIN); + ASSUME(GetMoveEffect(MOVE_ELECTRO_SHOT) == EFFECT_TWO_TURNS_ATTACK); ASSUME(MoveHasAdditionalEffectSelf(MOVE_ELECTRO_SHOT, MOVE_EFFECT_SP_ATK_PLUS_1) == TRUE); } diff --git a/test/battle/move_effect/upper_hand.c b/test/battle/move_effect/upper_hand.c index 69b2b75ef9..72a80a0542 100644 --- a/test/battle/move_effect/upper_hand.c +++ b/test/battle/move_effect/upper_hand.c @@ -3,16 +3,16 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_UPPER_HAND].effect == EFFECT_UPPER_HAND); - ASSUME(gMovesInfo[MOVE_UPPER_HAND].priority == 3); + ASSUME(GetMoveEffect(MOVE_UPPER_HAND) == EFFECT_UPPER_HAND); + ASSUME(GetMovePriority(MOVE_UPPER_HAND) == 3); ASSUME(MoveHasAdditionalEffect(MOVE_UPPER_HAND, MOVE_EFFECT_FLINCH) == TRUE); } SINGLE_BATTLE_TEST("Upper Hand succeeds if the target is using a priority attacking move and causes it to flinch") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXTREME_SPEED].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_EXTREME_SPEED].priority == 2); + ASSUME(GetMoveCategory(MOVE_EXTREME_SPEED) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMovePriority(MOVE_EXTREME_SPEED) == 2); PLAYER(SPECIES_MIENSHAO); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -28,8 +28,8 @@ SINGLE_BATTLE_TEST("Upper Hand succeeds if the target is using a priority attack SINGLE_BATTLE_TEST("Upper Hand fails if the target is using a status move") { GIVEN { - ASSUME(gMovesInfo[MOVE_BABY_DOLL_EYES].category == DAMAGE_CATEGORY_STATUS); - ASSUME(gMovesInfo[MOVE_BABY_DOLL_EYES].priority == 1); + ASSUME(GetMoveCategory(MOVE_BABY_DOLL_EYES) == DAMAGE_CATEGORY_STATUS); + ASSUME(GetMovePriority(MOVE_BABY_DOLL_EYES) == 1); PLAYER(SPECIES_MIENSHAO); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -47,8 +47,8 @@ SINGLE_BATTLE_TEST("Upper Hand fails if the target is using a status move") SINGLE_BATTLE_TEST("Upper Hand fails if the target is not using a priority move") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAINING_KISS].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_DRAINING_KISS].priority == 0); + ASSUME(GetMoveCategory(MOVE_DRAINING_KISS) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMovePriority(MOVE_DRAINING_KISS) == 0); PLAYER(SPECIES_MIENSHAO); OPPONENT(SPECIES_COMFEY) { Ability(ABILITY_FLOWER_VEIL); } } WHEN { @@ -66,8 +66,8 @@ SINGLE_BATTLE_TEST("Upper Hand fails if the target is not using a priority move" SINGLE_BATTLE_TEST("Upper Hand succeeds if the target's move is boosted in priority by an Ability") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAINING_KISS].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_DRAINING_KISS].priority == 0); + ASSUME(GetMoveCategory(MOVE_DRAINING_KISS) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMovePriority(MOVE_DRAINING_KISS) == 0); PLAYER(SPECIES_MIENSHAO) { Speed(10); } OPPONENT(SPECIES_COMFEY) { Speed(5); Ability(ABILITY_TRIAGE); } } WHEN { @@ -83,8 +83,8 @@ SINGLE_BATTLE_TEST("Upper Hand succeeds if the target's move is boosted in prior SINGLE_BATTLE_TEST("Upper Hand fails if the target moves first") { GIVEN { - ASSUME(gMovesInfo[MOVE_DRAINING_KISS].category == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_DRAINING_KISS].priority == 0); + ASSUME(GetMoveCategory(MOVE_DRAINING_KISS) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMovePriority(MOVE_DRAINING_KISS) == 0); PLAYER(SPECIES_MIENSHAO) { Speed(5); } OPPONENT(SPECIES_COMFEY) { Speed(10); Ability(ABILITY_TRIAGE); } } WHEN { @@ -102,8 +102,8 @@ SINGLE_BATTLE_TEST("Upper Hand fails if the target moves first") SINGLE_BATTLE_TEST("Upper Hand is boosted by Sheer Force") { GIVEN { - ASSUME(gMovesInfo[MOVE_EXTREME_SPEED].category == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gMovesInfo[MOVE_EXTREME_SPEED].priority == 2); + ASSUME(GetMoveCategory(MOVE_EXTREME_SPEED) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMovePriority(MOVE_EXTREME_SPEED) == 2); ASSUME(MoveIsAffectedBySheerForce(MOVE_UPPER_HAND) == TRUE); PLAYER(SPECIES_HARIYAMA) { Ability(ABILITY_SHEER_FORCE); } OPPONENT(SPECIES_WOBBUFFET); @@ -124,7 +124,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use Upper Hand unless it has seen a priority mov PARAMETRIZE { move = MOVE_QUICK_ATTACK; } GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); PLAYER(SPECIES_WOBBUFFET) {Moves(move); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_UPPER_HAND, MOVE_KARATE_CHOP); } } WHEN { diff --git a/test/battle/move_effect/uproar.c b/test/battle/move_effect/uproar.c index a97422390f..cbe17ce066 100644 --- a/test/battle/move_effect/uproar.c +++ b/test/battle/move_effect/uproar.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_UPROAR].effect == EFFECT_UPROAR); + ASSUME(GetMoveEffect(MOVE_UPROAR) == EFFECT_UPROAR); } DOUBLE_BATTLE_TEST("Uproar status causes sleeping pokemon to wake up during an attack") diff --git a/test/battle/move_effect/wake_up_slap.c b/test/battle/move_effect/wake_up_slap.c index 0a881be100..0e172bf053 100644 --- a/test/battle/move_effect/wake_up_slap.c +++ b/test/battle/move_effect/wake_up_slap.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(MoveHasAdditionalEffect(MOVE_WAKE_UP_SLAP, MOVE_EFFECT_REMOVE_STATUS) == TRUE); - ASSUME(gMovesInfo[MOVE_WAKE_UP_SLAP].argument == STATUS1_SLEEP); + ASSUME(GetMoveEffectArg_Status(MOVE_WAKE_UP_SLAP) == STATUS1_SLEEP); } SINGLE_BATTLE_TEST("Wake-Up Slap does not cure paralyzed pokemons behind substitutes or get increased power") diff --git a/test/battle/move_effect/weather_ball.c b/test/battle/move_effect/weather_ball.c index 432e5f79f7..0474383483 100644 --- a/test/battle/move_effect/weather_ball.c +++ b/test/battle/move_effect/weather_ball.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_WEATHER_BALL].effect == EFFECT_WEATHER_BALL); + ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); } SINGLE_BATTLE_TEST("Weather Ball doubles its power and turns to a Fire-type move in Sunlight", s16 damage) diff --git a/test/battle/move_effect/worry_seed.c b/test/battle/move_effect/worry_seed.c index 3e74c883e7..c4b18b7cab 100644 --- a/test/battle/move_effect/worry_seed.c +++ b/test/battle/move_effect/worry_seed.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_WORRY_SEED].effect == EFFECT_WORRY_SEED); + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_WORRY_SEED); } SINGLE_BATTLE_TEST("Worry Seed replaces target's ability with Insomnia") diff --git a/test/battle/move_effect_secondary/aromatherapy.c b/test/battle/move_effect_secondary/aromatherapy.c new file mode 100644 index 0000000000..9f1e82ba2d --- /dev/null +++ b/test/battle/move_effect_secondary/aromatherapy.c @@ -0,0 +1,51 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLY_SWIRL, MOVE_EFFECT_AROMATHERAPY)); +} + +DOUBLE_BATTLE_TEST("Sparkly Swirl cures the entire party of the user from primary status effects") +{ + u32 j; + u32 status; + PARAMETRIZE { status = STATUS1_SLEEP; } + PARAMETRIZE { status = STATUS1_POISON; } + PARAMETRIZE { status = STATUS1_BURN; } + PARAMETRIZE { status = STATUS1_FREEZE; } + PARAMETRIZE { status = STATUS1_PARALYSIS; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { status = STATUS1_FROSTBITE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { + if (status != STATUS1_SLEEP && status != STATUS1_FREEZE) + Status1(status); + } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPARKLY_SWIRL, target: opponentLeft); } + TURN { SWITCH(playerLeft, 2); SWITCH(playerRight, 3); } + } SCENE { + MESSAGE("Wobbuffet used Sparkly Swirl!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPARKLY_SWIRL, playerLeft); + switch(status) + { + case STATUS1_SLEEP: STATUS_ICON(playerLeft, sleep: FALSE); STATUS_ICON(playerRight, sleep: FALSE); break; + case STATUS1_POISON: STATUS_ICON(playerLeft, poison: FALSE); STATUS_ICON(playerRight, poison: FALSE); break; + case STATUS1_BURN: STATUS_ICON(playerLeft, burn: FALSE); STATUS_ICON(playerRight, burn: FALSE); break; + case STATUS1_PARALYSIS: STATUS_ICON(playerLeft, paralysis: FALSE); STATUS_ICON(playerRight, paralysis: FALSE); break; + case STATUS1_TOXIC_POISON: STATUS_ICON(playerLeft, badPoison: FALSE); STATUS_ICON(playerRight, badPoison: FALSE); break; + case STATUS1_FROSTBITE: STATUS_ICON(playerLeft, frostbite: FALSE); STATUS_ICON(playerRight, frostbite: FALSE); break; + } + } THEN { + for (j = 0; j < PARTY_SIZE; j++) + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_STATUS), STATUS1_NONE); + } +} diff --git a/test/battle/move_effect_secondary/bug_bite.c b/test/battle/move_effect_secondary/bug_bite.c index a55f7f9a2f..e086941a5e 100644 --- a/test/battle/move_effect_secondary/bug_bite.c +++ b/test/battle/move_effect_secondary/bug_bite.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE)); - ASSUME(gMovesInfo[MOVE_BUG_BITE].pp == 20); + ASSUME(GetMovePP(MOVE_BUG_BITE) == 20); } // Pretty much copy/paste of the Berry Fling Test. @@ -126,10 +126,9 @@ SINGLE_BATTLE_TEST("Tanga Berry activates before Bug Bite") } SCENE { MESSAGE("Wobbuffet used Bug Bite!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); - MESSAGE("The opposing Wobbuffet ate its Tanga Berry!"); + MESSAGE("The Tanga Berry weakened the damage to the opposing Wobbuffet!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_BUG_BITE, player); HP_BAR(opponent); - MESSAGE("The Tanga Berry weakened the damage to the opposing Wobbuffet!"); } THEN { EXPECT_EQ(player->item, ITEM_NONE); } diff --git a/test/battle/move_effect_secondary/burn.c b/test/battle/move_effect_secondary/burn.c index 1b6843715c..0bc979f08e 100644 --- a/test/battle/move_effect_secondary/burn.c +++ b/test/battle/move_effect_secondary/burn.c @@ -43,7 +43,7 @@ DOUBLE_BATTLE_TEST("Lava Plume inflicts burn to all adjacent battlers") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_LAVA_PLUME, MOVE_EFFECT_BURN) == TRUE); - ASSUME(gMovesInfo[MOVE_LAVA_PLUME].target == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_LAVA_PLUME) == MOVE_TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -53,12 +53,12 @@ DOUBLE_BATTLE_TEST("Lava Plume inflicts burn to all adjacent battlers") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_LAVA_PLUME, playerLeft); HP_BAR(opponentLeft); + HP_BAR(playerRight); + HP_BAR(opponentRight); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentLeft); STATUS_ICON(opponentLeft, burn: TRUE); - HP_BAR(playerRight); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, playerRight); STATUS_ICON(playerRight, burn: TRUE); - HP_BAR(opponentRight); STATUS_ICON(opponentRight, burn: TRUE); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight); } @@ -94,9 +94,9 @@ DOUBLE_BATTLE_TEST("Matcha Gatcha can burn both targets") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft); HP_BAR(opponentLeft); + HP_BAR(opponentRight); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentLeft); STATUS_ICON(opponentLeft, burn: TRUE); - HP_BAR(opponentRight); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight); STATUS_ICON(opponentRight, burn: TRUE); } @@ -111,7 +111,7 @@ SINGLE_BATTLE_TEST("Scald shouldn't burn a Water-type Pokémon") GIVEN { ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); ASSUME(MoveHasAdditionalEffect(MOVE_SCALD, MOVE_EFFECT_BURN) == TRUE); - ASSUME(gMovesInfo[MOVE_SCALD].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_SCALD) == TYPE_WATER); PLAYER(SPECIES_SQUIRTLE); OPPONENT(SPECIES_SQUIRTLE); } WHEN { diff --git a/test/battle/move_effect_secondary/freeze.c b/test/battle/move_effect_secondary/freeze.c index 45005cf5d7..bfaadcebe1 100644 --- a/test/battle/move_effect_secondary/freeze.c +++ b/test/battle/move_effect_secondary/freeze.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(MoveHasAdditionalEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); - ASSUME(gMovesInfo[MOVE_BLIZZARD].accuracy == 70); + ASSUME(GetMoveAccuracy(MOVE_BLIZZARD) == 70); } #if B_USE_FROSTBITE == TRUE @@ -92,7 +92,7 @@ SINGLE_BATTLE_TEST("Freezing Glare shouldn't freeze Psychic-types") GIVEN { ASSUME(gSpeciesInfo[SPECIES_ARTICUNO_GALAR].types[0] == TYPE_PSYCHIC); ASSUME(MoveHasAdditionalEffect(MOVE_FREEZING_GLARE, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); - ASSUME(gMovesInfo[MOVE_FREEZING_GLARE].type == TYPE_PSYCHIC); + ASSUME(GetMoveType(MOVE_FREEZING_GLARE) == TYPE_PSYCHIC); PLAYER(SPECIES_ARTICUNO_GALAR); OPPONENT(SPECIES_ARTICUNO_GALAR); } WHEN { diff --git a/test/battle/move_effect_secondary/ion_deluge.c b/test/battle/move_effect_secondary/ion_deluge.c index efc66903bc..e5bf7c0810 100644 --- a/test/battle/move_effect_secondary/ion_deluge.c +++ b/test/battle/move_effect_secondary/ion_deluge.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Ion Duldge turns normal moves into electric for the remainder of the current turn") { GIVEN { - ASSUME(gMovesInfo[MOVE_ION_DELUGE].effect == EFFECT_ION_DELUGE); + ASSUME(GetMoveEffect(MOVE_ION_DELUGE) == EFFECT_ION_DELUGE); PLAYER(SPECIES_KRABBY); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect_secondary/order_up.c b/test/battle/move_effect_secondary/order_up.c index 8d286850a2..ec6f1c51b5 100644 --- a/test/battle/move_effect_secondary/order_up.c +++ b/test/battle/move_effect_secondary/order_up.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_ORDER_UP].additionalEffects[0].moveEffect == MOVE_EFFECT_ORDER_UP); + ASSUME(GetMoveAdditionalEffectById(MOVE_ORDER_UP, 0)->moveEffect == MOVE_EFFECT_ORDER_UP); } DOUBLE_BATTLE_TEST("Order Up increases a stat based on Tatsugiri's form") @@ -123,7 +123,7 @@ DOUBLE_BATTLE_TEST("Order up does not boosts any stats if Dondozo is not affecte DOUBLE_BATTLE_TEST("Order Up is boosted by Sheer Force without removing the stat boosting effect") { GIVEN { - ASSUME(gMovesInfo[MOVE_ENTRAINMENT].effect == EFFECT_ENTRAINMENT); + ASSUME(GetMoveEffect(MOVE_ENTRAINMENT) == EFFECT_ENTRAINMENT); PLAYER(SPECIES_DONDOZO) { Speed(10); } PLAYER(SPECIES_TATSUGIRI_CURLY) { Speed(9); } OPPONENT(SPECIES_WOBBUFFET) { Speed(8); } @@ -146,8 +146,8 @@ DOUBLE_BATTLE_TEST("Order Up is always boosted by Sheer Force", s16 damage) PARAMETRIZE(move = MOVE_ENTRAINMENT, ability = ABILITY_COMMANDER); GIVEN { - ASSUME(gMovesInfo[MOVE_HAZE].effect == EFFECT_HAZE); - ASSUME(gMovesInfo[MOVE_ENTRAINMENT].effect == EFFECT_ENTRAINMENT); + ASSUME(GetMoveEffect(MOVE_HAZE) == EFFECT_HAZE); + ASSUME(GetMoveEffect(MOVE_ENTRAINMENT) == EFFECT_ENTRAINMENT); PLAYER(SPECIES_DONDOZO) { Speed(10); } PLAYER(SPECIES_TATSUGIRI_CURLY) { Speed(9); Ability(ability); } OPPONENT(SPECIES_TAUROS) { Speed(21); Ability(ABILITY_SHEER_FORCE); } diff --git a/test/battle/move_effect_secondary/paralysis.c b/test/battle/move_effect_secondary/paralysis.c index 0e9d9589a8..711ca11ee8 100644 --- a/test/battle/move_effect_secondary/paralysis.c +++ b/test/battle/move_effect_secondary/paralysis.c @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Body Slam shouldn't paralyze Normal-types") GIVEN { ASSUME(gSpeciesInfo[SPECIES_TAUROS].types[0] == TYPE_NORMAL); ASSUME(MoveHasAdditionalEffect(MOVE_BODY_SLAM, MOVE_EFFECT_PARALYSIS) == TRUE); - ASSUME(gMovesInfo[MOVE_BODY_SLAM].type == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_BODY_SLAM) == TYPE_NORMAL); PLAYER(SPECIES_TAUROS); OPPONENT(SPECIES_TAUROS); } WHEN { diff --git a/test/battle/move_effect_secondary/psychic_noise.c b/test/battle/move_effect_secondary/psychic_noise.c index e44ae75abe..8e5eae4efb 100644 --- a/test/battle/move_effect_secondary/psychic_noise.c +++ b/test/battle/move_effect_secondary/psychic_noise.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(MoveHasAdditionalEffect(MOVE_PSYCHIC_NOISE, MOVE_EFFECT_PSYCHIC_NOISE)); - ASSUME(gMovesInfo[MOVE_RECOVER].effect == EFFECT_RESTORE_HP); + ASSUME(GetMoveEffect(MOVE_RECOVER) == EFFECT_RESTORE_HP); } SINGLE_BATTLE_TEST("Psychic Noise blocks healing moves for 2 turns") diff --git a/test/battle/move_effects_combined/axe_kick.c b/test/battle/move_effects_combined/axe_kick.c index 94ab9377ad..5cc5b9b90c 100644 --- a/test/battle/move_effects_combined/axe_kick.c +++ b/test/battle/move_effects_combined/axe_kick.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_AXE_KICK].effect == EFFECT_RECOIL_IF_MISS); + ASSUME(GetMoveEffect(MOVE_AXE_KICK) == EFFECT_RECOIL_IF_MISS); ASSUME(MoveHasAdditionalEffect(MOVE_AXE_KICK, MOVE_EFFECT_CONFUSION) == TRUE); } diff --git a/test/battle/move_effects_combined/barb_barrage.c b/test/battle/move_effects_combined/barb_barrage.c index e2e5059fee..62f78cd4cf 100644 --- a/test/battle/move_effects_combined/barb_barrage.c +++ b/test/battle/move_effects_combined/barb_barrage.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_BARB_BARRAGE].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); - ASSUME(gMovesInfo[MOVE_BARB_BARRAGE].argument == STATUS1_PSN_ANY); + ASSUME(GetMoveEffect(MOVE_BARB_BARRAGE) == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(GetMoveEffectArg_Status(MOVE_BARB_BARRAGE) == STATUS1_PSN_ANY); ASSUME(MoveHasAdditionalEffect(MOVE_BARB_BARRAGE, MOVE_EFFECT_POISON) == TRUE); } diff --git a/test/battle/move_effects_combined/hurricane.c b/test/battle/move_effects_combined/hurricane.c index 61acac6649..02620f4d05 100644 --- a/test/battle/move_effects_combined/hurricane.c +++ b/test/battle/move_effects_combined/hurricane.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HURRICANE].effect == EFFECT_THUNDER); - ASSUME(gMovesInfo[MOVE_HURRICANE].accuracy == 70); + ASSUME(GetMoveEffect(MOVE_HURRICANE) == EFFECT_THUNDER); + ASSUME(GetMoveAccuracy(MOVE_HURRICANE) == 70); } SINGLE_BATTLE_TEST("Hurricane's accuracy is lowered to 50% in Sunlight") @@ -39,10 +39,10 @@ SINGLE_BATTLE_TEST("Hurricane can hit airborne targets (Fly, Bounce)") PARAMETRIZE { move = MOVE_FLY; } PARAMETRIZE { move = MOVE_BOUNCE; } GIVEN { - ASSUME(gMovesInfo[MOVE_FLY].effect == EFFECT_SEMI_INVULNERABLE); - ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_FLY].argument)) == STATUS3_ON_AIR); - ASSUME(gMovesInfo[MOVE_BOUNCE].effect == EFFECT_SEMI_INVULNERABLE); - ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_BOUNCE].argument)) == STATUS3_ON_AIR); + ASSUME(GetMoveEffect(MOVE_FLY) == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_FLY) == STATUS3_ON_AIR); + ASSUME(GetMoveEffect(MOVE_BOUNCE) == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_BOUNCE) == STATUS3_ON_AIR); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(move); } } WHEN { @@ -57,8 +57,8 @@ SINGLE_BATTLE_TEST("Hurricane can hit airborne targets (Fly, Bounce)") DOUBLE_BATTLE_TEST("Hurricane can hit airborne targets (Sky Drop)") { GIVEN { - ASSUME(gMovesInfo[MOVE_SKY_DROP].effect == EFFECT_SKY_DROP); - ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_SKY_DROP].argument)) == STATUS3_ON_AIR); + ASSUME(GetMoveEffect(MOVE_SKY_DROP) == EFFECT_SKY_DROP); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_SKY_DROP) == STATUS3_ON_AIR); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effects_combined/infernal_parade.c b/test/battle/move_effects_combined/infernal_parade.c index 6aa46ef8cb..266718d2e9 100644 --- a/test/battle/move_effects_combined/infernal_parade.c +++ b/test/battle/move_effects_combined/infernal_parade.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_INFERNAL_PARADE].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); - ASSUME(gMovesInfo[MOVE_INFERNAL_PARADE].argument == STATUS1_ANY); + ASSUME(GetMoveEffect(MOVE_INFERNAL_PARADE) == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(GetMoveEffectArg_Status(MOVE_INFERNAL_PARADE) == STATUS1_ANY); ASSUME(MoveHasAdditionalEffect(MOVE_INFERNAL_PARADE, MOVE_EFFECT_BURN) == TRUE); } diff --git a/test/battle/move_effects_combined/make_it_rain.c b/test/battle/move_effects_combined/make_it_rain.c index 5469eac8a5..e0e00015a4 100644 --- a/test/battle/move_effects_combined/make_it_rain.c +++ b/test/battle/move_effects_combined/make_it_rain.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Make It Rain lowers special attack by one stage") s16 damage[2]; GIVEN { - ASSUME(gMovesInfo[MOVE_MAKE_IT_RAIN].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_MAKE_IT_RAIN) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -58,3 +58,46 @@ DOUBLE_BATTLE_TEST("Make It Rain lowers special attack by one stage if it hits b MESSAGE("Wobbuffet's Sp. Atk fell!"); } } + +DOUBLE_BATTLE_TEST("Make It Rain lowers special attack by one stage if it hits both targets") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_MAKE_IT_RAIN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAKE_IT_RAIN, playerLeft); + HP_BAR(opponentLeft); + NONE_OF { + MESSAGE("Coins were scattered everywhere!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Sp. Atk fell!"); + } + HP_BAR(opponentRight); + MESSAGE("Coins were scattered everywhere!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Sp. Atk fell!"); + } +} +DOUBLE_BATTLE_TEST("Make It Rain lowers special attack by one stage if second target Protects") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_PROTECT); MOVE(playerLeft, MOVE_MAKE_IT_RAIN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAKE_IT_RAIN, playerLeft); + HP_BAR(opponentLeft); + NOT HP_BAR(opponentRight); + MESSAGE("Coins were scattered everywhere!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Sp. Atk fell!"); + } +} diff --git a/test/battle/move_effects_combined/triple_arrows.c b/test/battle/move_effects_combined/triple_arrows.c index d0b514fd19..3a348825b9 100644 --- a/test/battle/move_effects_combined/triple_arrows.c +++ b/test/battle/move_effects_combined/triple_arrows.c @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Triple Arrows has an increased critical hit ratio") PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_TRIPLE_ARROWS].criticalHitStage == 1); + ASSUME(GetMoveCriticalHitStage(MOVE_TRIPLE_ARROWS) == 1); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_flags/cant_use_twice.c b/test/battle/move_flags/cant_use_twice.c index 99bd681acb..cba5596d26 100644 --- a/test/battle/move_flags/cant_use_twice.c +++ b/test/battle/move_flags/cant_use_twice.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_GIGATON_HAMMER].cantUseTwice == TRUE); - ASSUME(gMovesInfo[MOVE_BLOOD_MOON].cantUseTwice == TRUE); + ASSUME(MoveCantBeUsedTwice(MOVE_GIGATON_HAMMER) == TRUE); + ASSUME(MoveCantBeUsedTwice(MOVE_BLOOD_MOON) == TRUE); } SINGLE_BATTLE_TEST("Struggle will be used if slow Encore is used on moves with the cantUseTwice flag") @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Struggle will be used if slow Encore is used on moves with t PARAMETRIZE { move = MOVE_GIGATON_HAMMER; } PARAMETRIZE { move = MOVE_BLOOD_MOON; } GIVEN { - ASSUME(gMovesInfo[MOVE_ENCORE].effect == EFFECT_ENCORE); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Moves with the cantUseTwice flag strike again if fast encore PARAMETRIZE { move = MOVE_GIGATON_HAMMER; } PARAMETRIZE { move = MOVE_BLOOD_MOON; } GIVEN { - ASSUME(gMovesInfo[MOVE_ENCORE].effect == EFFECT_ENCORE); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_flags/critical_hit_stage.c b/test/battle/move_flags/critical_hit_stage.c index 8660da3714..02999e9a8a 100644 --- a/test/battle/move_flags/critical_hit_stage.c +++ b/test/battle/move_flags/critical_hit_stage.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("criticalHitStage set to 1 increases critical hits occur at a PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1); + ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_flags/damages_airborne_double_damage.c b/test/battle/move_flags/damages_airborne_double_damage.c index dcdb801ff6..adeac7d3a2 100644 --- a/test/battle/move_flags/damages_airborne_double_damage.c +++ b/test/battle/move_flags/damages_airborne_double_damage.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Being airborne causes the target to take double damage from PARAMETRIZE { useDive = FALSE; } PARAMETRIZE { useDive = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TWISTER].damagesAirborneDoubleDamage); + ASSUME(MoveDamagesAirborneDoubleDamage(MOVE_TWISTER)); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } } WHEN { diff --git a/test/battle/move_flags/damages_underground.c b/test/battle/move_flags/damages_underground.c index 97b792b4dd..7d4b8cd946 100644 --- a/test/battle/move_flags/damages_underground.c +++ b/test/battle/move_flags/damages_underground.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Being underground causes the target to take double damage fr PARAMETRIZE { useDig = FALSE; } PARAMETRIZE { useDig = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_EARTHQUAKE].damagesUnderground); + ASSUME(MoveDamagesUnderground(MOVE_EARTHQUAKE)); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } } WHEN { diff --git a/test/battle/move_flags/damages_underwater.c b/test/battle/move_flags/damages_underwater.c index a7269a0162..b313d044c2 100644 --- a/test/battle/move_flags/damages_underwater.c +++ b/test/battle/move_flags/damages_underwater.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Being underwater causes the target to take double damage fro PARAMETRIZE { useDive = FALSE; } PARAMETRIZE { useDive = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_SURF].damagesUnderwater); + ASSUME(MoveDamagesUnderWater(MOVE_SURF)); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } } WHEN { diff --git a/test/battle/move_flags/ignores_target_ability.c b/test/battle/move_flags/ignores_target_ability.c index e5cd476641..25e0f9a20f 100644 --- a/test/battle/move_flags/ignores_target_ability.c +++ b/test/battle/move_flags/ignores_target_ability.c @@ -3,9 +3,9 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SUNSTEEL_STRIKE].ignoresTargetAbility); - ASSUME(gMovesInfo[MOVE_MOONGEIST_BEAM].ignoresTargetAbility); - ASSUME(gMovesInfo[MOVE_PHOTON_GEYSER].ignoresTargetAbility); + ASSUME(MoveIgnoresTargetAbility(MOVE_SUNSTEEL_STRIKE)); + ASSUME(MoveIgnoresTargetAbility(MOVE_MOONGEIST_BEAM)); + ASSUME(MoveIgnoresTargetAbility(MOVE_PHOTON_GEYSER)); } SINGLE_BATTLE_TEST("ignoresTargetAbility moves do not ignore the attacker's own ability", s16 damage) @@ -20,19 +20,19 @@ SINGLE_BATTLE_TEST("ignoresTargetAbility moves do not ignore the attacker's own PARAMETRIZE { move = MOVE_PHOTON_GEYSER; ability = ABILITY_UNAWARE; } ASSUME(gAbilitiesInfo[ABILITY_UNAWARE].breakable); - ASSUME(gMovesInfo[MOVE_IRON_DEFENSE].effect == EFFECT_DEFENSE_UP_2); - ASSUME(gMovesInfo[MOVE_AMNESIA].effect == EFFECT_SPECIAL_DEFENSE_UP_2); + ASSUME(GetMoveEffect(MOVE_IRON_DEFENSE) == EFFECT_DEFENSE_UP_2); + ASSUME(GetMoveEffect(MOVE_AMNESIA) == EFFECT_SPECIAL_DEFENSE_UP_2); GIVEN { PLAYER(SPECIES_CLEFABLE) { Speed(1); Ability(ability); } OPPONENT(SPECIES_ARON) { Speed(2); } } WHEN { - if (gMovesInfo[move].category == DAMAGE_CATEGORY_PHYSICAL) + if (GetMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) TURN { MOVE(opponent, MOVE_IRON_DEFENSE); MOVE(player, move); } else TURN { MOVE(opponent, MOVE_AMNESIA); MOVE(player, move); } } SCENE { - if (gMovesInfo[move].category == DAMAGE_CATEGORY_PHYSICAL) + if (GetMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) ANIMATION(ANIM_TYPE_MOVE, MOVE_IRON_DEFENSE, opponent); else ANIMATION(ANIM_TYPE_MOVE, MOVE_AMNESIA, opponent); @@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("ignoresTargetAbility allows Pokémon with Battle Armor and S PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } GIVEN { - ASSUME(gMovesInfo[MOVE_SUNSTEEL_STRIKE].ignoresTargetAbility == TRUE); + ASSUME(MoveIgnoresTargetAbility(MOVE_SUNSTEEL_STRIKE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { diff --git a/test/battle/move_flags/minimize_double_damage.c b/test/battle/move_flags/minimize_double_damage.c index f3cdd7657f..fd44077c4f 100644 --- a/test/battle/move_flags/minimize_double_damage.c +++ b/test/battle/move_flags/minimize_double_damage.c @@ -7,8 +7,8 @@ SINGLE_BATTLE_TEST("MinimizeDoubleDamage flag makes moves cause double damage to PARAMETRIZE { useMinimize = FALSE; } PARAMETRIZE { useMinimize = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_MINIMIZE].effect == EFFECT_MINIMIZE); - ASSUME(gMovesInfo[MOVE_STEAMROLLER].minimizeDoubleDamage); + ASSUME(GetMoveEffect(MOVE_MINIMIZE) == EFFECT_MINIMIZE); + ASSUME(MoveIncreasesPowerToMinimizedTargets(MOVE_STEAMROLLER)); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } } WHEN { diff --git a/test/battle/move_flags/powder.c b/test/battle/move_flags/powder.c index 35a6e1012b..04920f79f3 100644 --- a/test/battle/move_flags/powder.c +++ b/test/battle/move_flags/powder.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Powder moves are blocked by Grass-type Pokémon") { GIVEN { - ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove); + ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ODDISH); diff --git a/test/battle/move_flags/recoil.c b/test/battle/move_flags/recoil.c index 6740fb2fa8..5a8f3be576 100644 --- a/test/battle/move_flags/recoil.c +++ b/test/battle/move_flags/recoil.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Take Down deals 25% of recoil damage to the user") s16 recoilDamage; GIVEN { - ASSUME(gMovesInfo[MOVE_TAKE_DOWN].recoil == 25); + ASSUME(GetMoveRecoil(MOVE_TAKE_DOWN) == 25); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -27,7 +27,7 @@ SINGLE_BATTLE_TEST("Double Edge deals 33% of recoil damage to the user") s16 recoilDamage; GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_EDGE].recoil == 33); + ASSUME(GetMoveRecoil(MOVE_DOUBLE_EDGE) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Head Smash deals 50% of recoil damage to the user") s16 recoilDamage; GIVEN { - ASSUME(gMovesInfo[MOVE_HEAD_SMASH].recoil == 50); + ASSUME(GetMoveRecoil(MOVE_HEAD_SMASH) == 50); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -67,7 +67,7 @@ SINGLE_BATTLE_TEST("Flare Blitz deals 33% of recoil damage to the user and can b s16 recoilDamage; GIVEN { - ASSUME(gMovesInfo[MOVE_FLARE_BLITZ].recoil == 33); + ASSUME(GetMoveRecoil(MOVE_FLARE_BLITZ) == 33); ASSUME(MoveHasAdditionalEffect(MOVE_FLARE_BLITZ, MOVE_EFFECT_BURN)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_flags/strike_count.c b/test/battle/move_flags/strike_count.c index ba71e35c26..80a6f24359 100644 --- a/test/battle/move_flags/strike_count.c +++ b/test/battle/move_flags/strike_count.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Two strike count turns a move into a 2-hit move") { GIVEN { - ASSUME(gMovesInfo[MOVE_DOUBLE_KICK].strikeCount == 2); + ASSUME(GetMoveStrikeCount(MOVE_DOUBLE_KICK) == 2); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -23,7 +23,7 @@ SINGLE_BATTLE_TEST("Three strike count turns a move into a 3-hit move") s16 thirdHit; GIVEN { - ASSUME(gMovesInfo[MOVE_TRIPLE_DIVE].strikeCount == 3); + ASSUME(GetMoveStrikeCount(MOVE_TRIPLE_DIVE) == 3); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -49,8 +49,8 @@ SINGLE_BATTLE_TEST("Surging Strikes hits 3 times with each hit being a critical s16 thirdHit; GIVEN { - ASSUME(gMovesInfo[MOVE_SURGING_STRIKES].strikeCount == 3); - ASSUME(gMovesInfo[MOVE_SURGING_STRIKES].alwaysCriticalHit == TRUE); + ASSUME(GetMoveStrikeCount(MOVE_SURGING_STRIKES) == 3); + ASSUME(MoveAlwaysCrits(MOVE_SURGING_STRIKES)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c new file mode 100644 index 0000000000..7537fb437a --- /dev/null +++ b/test/battle/sleep_clause.c @@ -0,0 +1,1815 @@ +#include "global.h" +#include "test/battle.h" + +AI_SINGLE_BATTLE_TEST("Sleep Clause: AI will not use sleep moves while sleep clause is active") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRELOOM) { Moves(MOVE_SPORE, MOVE_MACH_PUNCH); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_SPORE); } + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_MACH_PUNCH); } + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_MACH_PUNCH); } + } +} + +AI_DOUBLE_BATTLE_TEST("Sleep Clause: AI will not use sleep moves while sleep clause is active (Doubles)") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRELOOM) { Moves(MOVE_SPORE, MOVE_MACH_PUNCH); } + OPPONENT(SPECIES_BRELOOM) { Moves(MOVE_MACH_PUNCH); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); EXPECT_MOVE(opponentLeft, MOVE_SPORE); EXPECT_MOVE(opponentRight, MOVE_MACH_PUNCH); } + TURN { SWITCH(playerLeft, 2); MOVE(playerRight, MOVE_CELEBRATE); EXPECT_MOVE(opponentLeft, MOVE_MACH_PUNCH); EXPECT_MOVE(opponentRight, MOVE_MACH_PUNCH); } + TURN { MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); EXPECT_MOVE(opponentLeft, MOVE_MACH_PUNCH); EXPECT_MOVE(opponentRight, MOVE_MACH_PUNCH); } + } +} + +AI_DOUBLE_BATTLE_TEST("Sleep Clause: AI will not use sleep move if partner is already using a sleep move") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRELOOM) { Moves(MOVE_SPORE, MOVE_MACH_PUNCH); } + OPPONENT(SPECIES_BRELOOM) { Moves(MOVE_SPORE, MOVE_MACH_PUNCH); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); EXPECT_MOVE(opponentLeft, MOVE_SPORE); EXPECT_MOVE(opponentRight, MOVE_MACH_PUNCH); } + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep moves fail when sleep clause is active") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { MOVE(player, MOVE_SPORE); SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } + MESSAGE("Sleep Clause kept the opposing Wobbuffet awake!"); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep moves fail when sleep clause is active (Doubles)") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); MaxHP(100); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentRight); MOVE(playerRight, MOVE_SPORE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentRight); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponentRight, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerRight); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + } + MESSAGE("Sleep Clause kept the opposing Wobbuffet awake!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Rest does not activate sleep clause") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_REST); } + TURN { MOVE(player, MOVE_SPORE); SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Rest does not activate sleep clause (Doubles)") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); MaxHP(100); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_REST); MOVE(playerLeft, MOVE_SPORE, target: opponentRight); } + } SCENE { + STATUS_ICON(opponentLeft, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentRight); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponentRight, sleep: TRUE); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Rest can still be used when sleep clause is active") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { MOVE(player, MOVE_TACKLE); SWITCH(opponent, 1); } + TURN { MOVE(opponent, MOVE_REST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + STATUS_ICON(opponent, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, opponent); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Rest can still be used when sleep clause is active (Doubles)") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); MaxHP(100); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentRight); MOVE(opponentLeft, MOVE_REST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentRight); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponentRight, sleep: TRUE); + STATUS_ICON(opponentLeft, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, opponentLeft); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Psycho Shift'ing sleep will fail if sleep clause is active") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); + ASSUME(GetMoveEffect(MOVE_PSYCHO_SHIFT) == EFFECT_PSYCHO_SHIFT); + PLAYER(SPECIES_WOBBUFFET) + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SLEEP_TALK, MOVE_PSYCHO_SHIFT); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } + TURN { MOVE(opponent, MOVE_SPORE); MOVE(player, MOVE_SLEEP_TALK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, player); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHO_SHIFT, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + STATUS_ICON(opponent, sleep: TRUE); + } + MESSAGE("Sleep Clause kept the opposing Wobbuffet awake!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Psycho Shift'ing sleep will activate sleep clause") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); + ASSUME(GetMoveEffect(MOVE_PSYCHO_SHIFT) == EFFECT_PSYCHO_SHIFT); + PLAYER(SPECIES_ZIGZAGOON) + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SLEEP_TALK, MOVE_PSYCHO_SHIFT); } + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); MOVE(opponent, MOVE_SLEEP_TALK); } + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } + TURN { MOVE(opponent, MOVE_SPORE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHO_SHIFT, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + STATUS_ICON(player, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } + MESSAGE("Sleep Clause kept Zigzagoon awake!"); + } +} + +AI_SINGLE_BATTLE_TEST("Sleep Clause: AI will not use Yawn while sleep clause is active") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRELOOM) { Moves(MOVE_YAWN, MOVE_MACH_PUNCH); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_YAWN); } + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_MACH_PUNCH); } + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_MACH_PUNCH); } + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_MACH_PUNCH); } + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Yawn will fail when sleep clause is active") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_YAWN); } + TURN { } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_YAWN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Wobbuffet fell asleep!"); + STATUS_ICON(player, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + STATUS_ICON(player, sleep: TRUE); + } + MESSAGE("Sleep Clause kept Wobbuffet awake!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% of the time with sleep clause active") +{ + PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + } WHEN { + TURN { MOVE(opponent, MOVE_SPORE); } + TURN { SWITCH(player, 1); } + TURN { MOVE(player, MOVE_TACKLE); } + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("The opposing Breloom's Effect Spore made Wobbuffet sleep!"); + STATUS_ICON(player, sleep: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% of the time with sleep clause active (Doubles)") +{ + PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SPORE, target:playerRight); MOVE(playerLeft, MOVE_TACKLE, target:opponentLeft);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Wobbuffet fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + ABILITY_POPUP(opponentLeft, ABILITY_EFFECT_SPORE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerLeft); + MESSAGE("The opposing Breloom's Effect Spore made Wobbuffet sleep!"); + STATUS_ICON(playerLeft, sleep: TRUE); + } +} + + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep from Effect Spore will not activate sleep clause") +{ + PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + TURN {} + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SPORE); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("The opposing Breloom's Effect Spore made Wobbuffet sleep!"); + STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Wobbuffet fell asleep!"); + STATUS_ICON(player, sleep: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep from Effect Spore will not activate sleep clause (Doubles)") +{ + PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target:opponentLeft); MOVE(opponentLeft, MOVE_SPORE, target:playerRight); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_EFFECT_SPORE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerLeft); + MESSAGE("The opposing Breloom's Effect Spore made Wobbuffet sleep!"); + STATUS_ICON(playerLeft, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Wobbuffet fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Moves with sleep effect chance will activate sleep clause") +{ + PASSES_RANDOMLY(10, 100, RNG_SECONDARY_EFFECT); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(MoveHasAdditionalEffect(MOVE_RELIC_SONG, MOVE_EFFECT_SLEEP)); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RELIC_SONG); } + TURN { MOVE(player, MOVE_SPORE); SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + STATUS_ICON(opponent, sleep: TRUE); + MESSAGE("Wobbuffet used Spore!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Moves with sleep effect chance will still do damage when sleep clause active, but won't sleep") +{ + PASSES_RANDOMLY(100, 100, RNG_SECONDARY_EFFECT); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(MoveHasAdditionalEffect(MOVE_RELIC_SONG, MOVE_EFFECT_SLEEP)); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { MOVE(player, MOVE_RELIC_SONG); SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + STATUS_ICON(opponent, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Dire Claw cannot sleep a mon when sleep clause is active") +{ + PASSES_RANDOMLY(100, 100, RNG_SECONDARY_EFFECT); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(MoveHasAdditionalEffect(MOVE_DIRE_CLAW, MOVE_EFFECT_DIRE_CLAW)); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { MOVE(player, MOVE_DIRE_CLAW); SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + STATUS_ICON(opponent, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DIRE_CLAW, player); + HP_BAR(opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Dark Void can only sleep one opposing mon if sleep clause is active") +{ + // Source: https://bulbapedia.bulbagarden.net/wiki/Dark_Void_(move) + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_DARK_VOID) == EFFECT_DARK_VOID); + PLAYER(SPECIES_DARKRAI); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_DARK_VOID); } + TURN { MOVE(playerLeft, MOVE_DARK_VOID); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DARK_VOID, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentRight); + STATUS_ICON(opponentRight, sleep: TRUE); + MESSAGE("The opposing Wobbuffet fell asleep!"); + } + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: G-Max Befuddle can only sleep one opposing mon if sleep clause is active") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_BEFUDDLE, MOVE_EFFECT_EFFECT_SPORE_SIDE)); + PLAYER(SPECIES_BUTTERFREE) { GigantamaxFactor(TRUE); } + PLAYER(SPECIES_CATERPIE); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_BUG_BITE, target: opponentLeft, gimmick: GIMMICK_DYNAMAX, + WITH_RNG(RNG_G_MAX_BEFUDDLE, STATUS1_SLEEP)); } + } SCENE { + MESSAGE("Butterfree used G-Max Befuddle!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentRight); + STATUS_ICON(opponentRight, sleep: TRUE); + MESSAGE("The opposing Wobbuffet fell asleep!"); + } + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon wakes up") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(B_SLEEP_TURNS >= GEN_5); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN {} + TURN {} + TURN {} + TURN { MOVE(player, MOVE_SPORE); } + } SCENE { + MESSAGE("The opposing Wobbuffet woke up!"); + MESSAGE("Wobbuffet used Spore!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Wobbuffet fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up with Aromatherapy / Heal Bell / Sparkly Swirl") +{ + u32 move = MOVE_NONE, switchIndex = 0; + struct BattlePokemon *healingSlot = opponentRight; + struct BattlePokemon *sporedSlot = opponentLeft; + PARAMETRIZE { move = MOVE_AROMATHERAPY; healingSlot = opponentRight; sporedSlot = opponentLeft; switchIndex = 0; } + PARAMETRIZE { move = MOVE_HEAL_BELL; healingSlot = opponentRight; sporedSlot = opponentLeft; switchIndex = 0; } + PARAMETRIZE { move = MOVE_SPARKLY_SWIRL; healingSlot = opponentRight; sporedSlot = opponentLeft; switchIndex = 0; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; healingSlot = opponentLeft; sporedSlot = opponentRight; switchIndex = 1; } + PARAMETRIZE { move = MOVE_HEAL_BELL; healingSlot = opponentLeft; sporedSlot = opponentRight; switchIndex = 1; } + PARAMETRIZE { move = MOVE_SPARKLY_SWIRL; healingSlot = opponentLeft; sporedSlot = opponentRight; switchIndex = 1; } + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); + ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); + ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLY_SWIRL, MOVE_EFFECT_AROMATHERAPY)); + ASSUME(B_SLEEP_TURNS >= GEN_5); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPORE, target:sporedSlot); } + TURN { SWITCH(sporedSlot, 2); MOVE(playerLeft, MOVE_SPORE, target:healingSlot); } + if (move == MOVE_SPARKLY_SWIRL) + TURN { SWITCH(sporedSlot, switchIndex); MOVE(healingSlot, move, target: playerRight); MOVE(playerLeft, MOVE_SPORE, target:sporedSlot); } + else + TURN { SWITCH(sporedSlot, switchIndex); MOVE(healingSlot, move); MOVE(playerLeft, MOVE_SPORE, target:sporedSlot); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, sporedSlot); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(sporedSlot, sleep: TRUE); + MESSAGE("Zigzagoon used Spore!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, healingSlot); + STATUS_ICON(healingSlot, sleep: TRUE); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } + MESSAGE("Sleep Clause kept the opposing Zigzagoon awake!"); + if (move == MOVE_AROMATHERAPY) + { + MESSAGE("The opposing Zigzagoon used Aromatherapy!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AROMATHERAPY, healingSlot); + } + else if (move == MOVE_HEAL_BELL) + { + MESSAGE("The opposing Zigzagoon used Heal Bell!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BELL, healingSlot); + } + else + { + MESSAGE("The opposing Zigzagoon used Sparkly Swirl!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPARKLY_SWIRL, healingSlot); + } + STATUS_ICON(sporedSlot, sleep: FALSE); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, sporedSlot); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up forcefully by a move from an opponent") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(MoveHasAdditionalEffect(MOVE_WAKE_UP_SLAP, MOVE_EFFECT_REMOVE_STATUS)); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPORE, target:opponentLeft); } + TURN { SWITCH(opponentLeft, 2); MOVE(playerLeft, MOVE_SPORE, target:opponentRight); } + TURN { SWITCH(opponentLeft, 0); MOVE(playerLeft, MOVE_WAKE_UP_SLAP, target:opponentLeft); } + TURN { MOVE(playerLeft, MOVE_SPORE, target:opponentLeft); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + MESSAGE("Zigzagoon used Spore!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentRight); + STATUS_ICON(opponentRight, sleep: TRUE); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } + MESSAGE("Sleep Clause kept the opposing Zigzagoon awake!"); + MESSAGE("Zigzagoon used Wake-Up Slap!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WAKE_UP_SLAP, playerLeft); + MESSAGE("The opposing Zigzagoon woke up!"); + STATUS_ICON(opponentLeft, sleep: FALSE); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up forcefully by Uproar") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_UPROAR) == EFFECT_UPROAR); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPORE, target:opponentLeft); MOVE(playerRight, MOVE_UPROAR); MOVE(opponentRight, MOVE_ROAR, target:playerRight); } + TURN { MOVE(playerLeft, MOVE_SPORE, target:opponentLeft); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + MESSAGE("Zigzagoon used Uproar!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_UPROAR, playerRight); + MESSAGE("Zigzagoon caused an uproar!"); + MESSAGE("The uproar woke the opposing Zigzagoon!"); + STATUS_ICON(opponentLeft, sleep: FALSE); + MESSAGE("The opposing Zigzagoon used Roar!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROAR, opponentRight); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by using Sleep Talk into a status curing move") +{ + u32 move; + PARAMETRIZE { move = MOVE_PSYCHO_SHIFT; } + PARAMETRIZE { move = MOVE_JUNGLE_HEALING; } + PARAMETRIZE { move = MOVE_LUNAR_BLESSING; } + PARAMETRIZE { move = MOVE_TAKE_HEART; } + PARAMETRIZE { move = MOVE_AROMATHERAPY; } + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); + ASSUME(GetMoveEffect(MOVE_PSYCHO_SHIFT) == EFFECT_PSYCHO_SHIFT); + ASSUME(GetMoveEffect(MOVE_JUNGLE_HEALING) == EFFECT_JUNGLE_HEALING); + ASSUME(GetMoveEffect(MOVE_LUNAR_BLESSING) == EFFECT_JUNGLE_HEALING); + ASSUME(GetMoveEffect(MOVE_PURIFY) == EFFECT_PURIFY); + ASSUME(GetMoveEffect(MOVE_TAKE_HEART) == EFFECT_TAKE_HEART); + ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); + ASSUME(gItemsInfo[ITEM_CHESTO_BERRY].holdEffect == HOLD_EFFECT_CURE_SLP); + PLAYER(SPECIES_ZIGZAGOON) { Item(ITEM_CHESTO_BERRY); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SLEEP_TALK, move); } + } WHEN { + TURN { MOVE(player, MOVE_SPORE); MOVE(opponent, MOVE_SLEEP_TALK); } + TURN { MOVE(player, MOVE_SPORE); MOVE(opponent, move); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + MESSAGE("The opposing Zigzagoon used Sleep Talk!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, opponent); + if (move == MOVE_PSYCHO_SHIFT) + { + MESSAGE("The opposing Zigzagoon used Psycho Shift!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHO_SHIFT, opponent); + } + else if (move == MOVE_JUNGLE_HEALING) + { + MESSAGE("The opposing Zigzagoon used Jungle Healing!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_JUNGLE_HEALING, opponent); + } + else if (move == MOVE_LUNAR_BLESSING) + { + MESSAGE("The opposing Zigzagoon used Lunar Blessing!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_BLESSING, opponent); + } + else if (move == MOVE_TAKE_HEART) + { + MESSAGE("The opposing Zigzagoon used Take Heart!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAKE_HEART, opponent); + } + else if (move == MOVE_AROMATHERAPY) + { + MESSAGE("The opposing Zigzagoon used Aromatherapy!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AROMATHERAPY, opponent); + } + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by Hydration in the rain") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_PELIPPER) { Ability(ABILITY_DRIZZLE); } + OPPONENT(SPECIES_LUVDISC) { Ability(ABILITY_HYDRATION); } + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { MOVE(player, MOVE_SPORE); } + } SCENE { + MESSAGE("Pelipper used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Luvdisc fell asleep!"); + MESSAGE("The opposing Luvdisc's Hydration cured its sleep problem!"); + STATUS_ICON(opponent, sleep: FALSE); + MESSAGE("Pelipper used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Luvdisc fell asleep!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by Natural Cure") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_SWABLU) { Ability(ABILITY_NATURAL_CURE); } + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { SWITCH(opponent, 1); } + TURN { SWITCH(opponent, 0); MOVE(player, MOVE_SPORE); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Swablu fell asleep!"); + MESSAGE("2 withdrew Swablu!"); + MESSAGE("2 sent out Swablu!"); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Swablu fell asleep!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by Shed Skin") +{ + if (B_ABILITY_TRIGGER_CHANCE == GEN_4) + PASSES_RANDOMLY(30, 100, RNG_SHED_SKIN); + else + PASSES_RANDOMLY(33, 100, RNG_SHED_SKIN); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_DRATINI) { Ability(ABILITY_SHED_SKIN); } + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { MOVE(player, MOVE_SPORE); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Dratini fell asleep!"); + MESSAGE("The opposing Dratini's Shed Skin cured its sleep problem!"); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Dratini fell asleep!"); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by Healer") +{ + PASSES_RANDOMLY(30, 100, RNG_HEALER); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_CHANSEY) { Ability(ABILITY_HEALER); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPORE, target:opponentLeft); } + TURN { MOVE(playerLeft, MOVE_SPORE, target:opponentLeft); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + MESSAGE("The opposing Chansey's Healer cured the opposing Zigzagoon's problem!"); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by using a held item") +{ + u32 heldItem = ITEM_NONE; + PARAMETRIZE { heldItem = ITEM_CHESTO_BERRY; } + PARAMETRIZE { heldItem = ITEM_LUM_BERRY; } + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(gItemsInfo[ITEM_CHESTO_BERRY].holdEffect == HOLD_EFFECT_CURE_SLP); + ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON) { Item(heldItem); } + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { MOVE(player, MOVE_SPORE); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + if (heldItem == ITEM_CHESTO_BERRY) + MESSAGE("The opposing Zigzagoon's Chesto Berry woke it up!"); + else + MESSAGE("The opposing Zigzagoon's Lum Berry cured its sleep problem!"); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by Flinging a held item") +{ + u32 heldItem = ITEM_NONE; + PARAMETRIZE { heldItem = ITEM_CHESTO_BERRY; } + PARAMETRIZE { heldItem = ITEM_LUM_BERRY; } + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); + ASSUME(gItemsInfo[ITEM_CHESTO_BERRY].holdEffect == HOLD_EFFECT_CURE_SLP); + ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON) { Item(heldItem); } + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentLeft); MOVE(playerRight, MOVE_FLING, target: opponentLeft); } + TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentLeft); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + MESSAGE("Zigzagoon used Fling!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, playerRight); + if (heldItem == ITEM_CHESTO_BERRY) + MESSAGE("The opposing Zigzagoon's Chesto Berry woke it up!"); + else + MESSAGE("The opposing Zigzagoon's Lum Berry cured its sleep problem!"); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by using an item") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(gItemsInfo[ITEM_AWAKENING].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { USE_ITEM(opponent, ITEM_AWAKENING, partyIndex: 0); MOVE(player, MOVE_SPORE); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + MESSAGE("Zigzagoon had its status healed!"); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon faints") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON) { Level(5); } + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { MOVE(player, MOVE_TACKLE); SEND_OUT(opponent, 1); } + TURN { MOVE(player, MOVE_SPORE); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + MESSAGE("The opposing Zigzagoon fainted!"); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon faints (Doubles)") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON) { Level(5); } + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentLeft); MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentRight);} + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + MESSAGE("The opposing Zigzagoon fainted!"); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentRight); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by gaining the ability Insomnia / Vital Spirit") +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } + PARAMETRIZE { ability = ABILITY_INSOMNIA; } + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_DELIBIRD) { Ability(ability); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SLEEP_TALK, MOVE_SKILL_SWAP); } + } WHEN { + TURN { MOVE(player, MOVE_SPORE); MOVE(opponent, MOVE_SLEEP_TALK); } + TURN { MOVE(opponent, MOVE_SKILL_SWAP); } + TURN { MOVE(player, MOVE_SPORE); MOVE(opponent, MOVE_SKILL_SWAP); } + } SCENE { + MESSAGE("Delibird used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + MESSAGE("The opposing Zigzagoon used Sleep Talk!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, opponent); + MESSAGE("The opposing Zigzagoon used Skill Swap!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + if (ability == ABILITY_VITAL_SPIRIT) + MESSAGE("The opposing Zigzagoon's Vital Spirit cured its sleep problem!"); + if (ability == ABILITY_INSOMNIA) + MESSAGE("The opposing Zigzagoon's Insomnia cured its sleep problem!"); + MESSAGE("The opposing Zigzagoon used Skill Swap!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + MESSAGE("Delibird used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is sent out, has Trace, and Traces Insomnia / Vital spirit") +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } + PARAMETRIZE { ability = ABILITY_INSOMNIA; } + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ZIGZAGOON) + PLAYER(SPECIES_DELIBIRD) { Ability(ability); } + OPPONENT(SPECIES_RALTS) { Ability(ABILITY_TRACE); } + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } + TURN { SWITCH(opponent, 0); } + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_SPORE); } + } SCENE { + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Ralts fell asleep!"); + MESSAGE("2 sent out Zigzagoon!"); + MESSAGE("2 sent out Ralts!"); + if (ability == ABILITY_VITAL_SPIRIT) + MESSAGE("The opposing Ralts's Vital Spirit cured its sleep problem!"); + if (ability == ABILITY_INSOMNIA) + MESSAGE("The opposing Ralts's Insomnia cured its sleep problem!"); + MESSAGE("2 sent out Zigzagoon!"); + MESSAGE("Delibird used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is sent out and transforms into a mon with Insomnia / Vital spirit") +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } + PARAMETRIZE { ability = ABILITY_INSOMNIA; } + KNOWN_FAILING; // Sleep Clause parts work, but Imposter seems broken with battle messages / targeting. Issue #5565 https://github.com/rh-hideout/pokeemerald-expansion/issues/5565 + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(gItemsInfo[ITEM_LAGGING_TAIL].holdEffect == HOLD_EFFECT_LAGGING_TAIL); + PLAYER(SPECIES_ZIGZAGOON) + PLAYER(SPECIES_DELIBIRD) { Ability(ability); } + OPPONENT(SPECIES_DITTO) { Ability(ABILITY_IMPOSTER); } + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } + TURN { SWITCH(opponent, 0); } + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_SPORE); } + } SCENE { + MESSAGE("The opposing Ditto transformed into Zigzagoon using Imposter!"); + MESSAGE("Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Ditto fell asleep!"); + MESSAGE("2 sent out Zigzagoon!"); + MESSAGE("2 sent out Ditto!"); + if (ability == ABILITY_VITAL_SPIRIT) + MESSAGE("The opposing Ditto's Vital Spirit cured its sleep problem!"); + else + MESSAGE("The opposing Ditto's Insomnia cured its sleep problem!"); + MESSAGE("2 sent out Zigzagoon!"); + MESSAGE("Delibird used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + } +} + +AI_SINGLE_BATTLE_TEST("Sleep Clause: AI will use sleep moves again when sleep clause has been deactivated") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(gItemsInfo[ITEM_CHESTO_BERRY].holdEffect == HOLD_EFFECT_CURE_SLP); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CHESTO_BERRY); } + OPPONENT(SPECIES_BRELOOM) { Moves(MOVE_SPORE, MOVE_MACH_PUNCH); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_SPORE); } + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_SPORE); } + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up with G-Max Sweetness") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SWEETNESS, MOVE_EFFECT_AROMATHERAPY)); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_APPLETUN) { GigantamaxFactor(TRUE); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, MOVE_SPORE, target: playerRight); } + TURN { MOVE(playerLeft, MOVE_VINE_WHIP, target: opponentLeft, gimmick: GIMMICK_DYNAMAX); } + TURN { MOVE(opponentRight, MOVE_SPORE, target: playerRight); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentRight); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Wobbuffet fell asleep!"); + MESSAGE("Appletun used G-Max Sweetness!"); + MESSAGE("The opposing Wobbuffet used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentRight); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Wobbuffet fell asleep!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Pre-existing sleep condition doesn't activate sleep clause") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON) { Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_SPORE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Sleep caused by Effect Spore does not prevent sleep clause from ever activating") // checks that sleepClauseEffectExempt works properly +{ + PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SPORE); } + TURN { SWITCH(player, 2); MOVE(opponent, MOVE_SPORE); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("The opposing Breloom's Effect Spore made Zigzagoon sleep!"); + STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(player, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(player, sleep: TRUE); + } + MESSAGE("Sleep Clause kept Zigzagoon awake!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Waking up after Effect Spore doesn't deactivate sleep clause") +{ + PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + TURN {} + TURN {} + TURN {} + TURN { MOVE(opponent, MOVE_SPORE); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SPORE); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("The opposing Breloom's Effect Spore made Zigzagoon sleep!"); + STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(player, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(player, sleep: TRUE); + } + MESSAGE("Sleep Clause kept Zigzagoon awake!"); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Waking up after Effect Spore doesn't deactivate sleep clause (Doubles)") +{ + PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); MOVE(opponentRight, MOVE_SPORE, target:playerRight); } + TURN { SWITCH(playerLeft, 2); } + TURN { MOVE(playerLeft, MOVE_AROMATHERAPY); MOVE(opponentRight, MOVE_SPORE, target:playerRight); MOVE(opponentLeft, MOVE_SPORE, target:playerLeft); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_EFFECT_SPORE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerLeft); + MESSAGE("The opposing Breloom's Effect Spore made Zigzagoon sleep!"); + STATUS_ICON(playerLeft, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentRight); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AROMATHERAPY, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentRight); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerLeft); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerLeft, sleep: TRUE); + } + MESSAGE("Sleep Clause kept Zigzagoon awake!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Waking up after Rest doesn't deactivate sleep clause") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); + PLAYER(SPECIES_ZIGZAGOON) { HP(1); MaxHP(100); } + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_REST); } + TURN {} + TURN {} + TURN {} + TURN { MOVE(opponent, MOVE_SPORE); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SPORE); } + } SCENE { + MESSAGE("Zigzagoon went to sleep!"); + STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Zigzagoon woke up!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(player, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(player, sleep: TRUE); + } + MESSAGE("Sleep Clause kept Zigzagoon awake!"); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Waking up after Rest doesn't deactivate sleep clause (Doubles)") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); + PLAYER(SPECIES_ZIGZAGOON) { HP(1); MaxHP(100); } + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_REST); MOVE(opponentRight, MOVE_SPORE, target:playerRight); } + TURN { SWITCH(playerRight, 2); } + TURN {} + TURN {} + TURN { MOVE(opponentRight, MOVE_SPORE, target:playerRight); } + } SCENE { + MESSAGE("Zigzagoon went to sleep!"); + STATUS_ICON(playerLeft, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, playerLeft); + MESSAGE("The opposing Zigzagoon used Spore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + MESSAGE("Zigzagoon woke up!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + } + MESSAGE("Sleep Clause kept Zigzagoon awake!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Suppressing and then sleeping Vital Spirit / Insomnia and switching back in deactivates sleep clause") +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } + PARAMETRIZE { ability = ABILITY_INSOMNIA; } + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_DELIBIRD) { Ability(ability); } + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_GASTRO_ACID); } + TURN { MOVE(player, MOVE_SPORE); } + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_SPORE); } + TURN { SWITCH(opponent, 0); } + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_SPORE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Delibird fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + MESSAGE("Sleep Clause kept the opposing Zigzagoon awake!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Mold Breaker Pokémon sleeping Vital Spirit / Insomnia activates sleep clause") +{ + KNOWN_FAILING; // Interaction between Mold Breaker and Vital Spirit / Insomnia is broken. Issue #5578 https://github.com/rh-hideout/pokeemerald-expansion/issues/5578 + u32 ability; + PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } + PARAMETRIZE { ability = ABILITY_INSOMNIA; } + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_PANCHAM) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_DELIBIRD) { Ability(ability); } + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_SPORE); } + TURN { SWITCH(opponent, 0); } + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_SPORE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Delibird fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + MESSAGE("Sleep Clause kept the opposing Delibird awake!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Yawn'd Pokémon slept due to Effect Spore before Yawn triggers does not activate sleep clause") +{ + PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + PLAYER(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_YAWN); } + TURN { MOVE(opponent, MOVE_TACKLE); } + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_SPORE); } + } SCENE { + MESSAGE("The opposing Zigzagoon grew drowsy!"); + ABILITY_POPUP(player, ABILITY_EFFECT_SPORE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("Breloom's Effect Spore made the opposing Zigzagoon sleep!"); + STATUS_ICON(opponent, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Yawn'd Pokémon who's partner is slept before Yawn triggers will not fall asleep due to sleep clause being activated") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_YAWN, target: opponentLeft); MOVE(playerRight, MOVE_YAWN, target: opponentRight); } + TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentLeft); } + } SCENE { + MESSAGE("The opposing Zigzagoon grew drowsy!"); + MESSAGE("The opposing Zigzagoon grew drowsy!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + NONE_OF { + MESSAGE( "The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponentRight, sleep: TRUE); + } + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: If both Pokémon on one side are Yawn'd at the same time, one will fall asleep and the other will not") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + PLAYER(SPECIES_ZIGZAGOON) { Speed(5); } + PLAYER(SPECIES_ZIGZAGOON) { Speed(4); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(3); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(2); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_YAWN, target: opponentLeft); MOVE(playerRight, MOVE_YAWN, target: opponentRight); } + TURN { } + } SCENE { + MESSAGE("The opposing Zigzagoon grew drowsy!"); + MESSAGE("The opposing Zigzagoon grew drowsy!"); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + NONE_OF { + MESSAGE( "The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponentRight, sleep: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Reflection moves (ie. Magic Coat) fail if sleep clause is active and they reflect a sleep move") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_SPORE); } + TURN { SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_MAGIC_COAT); MOVE(opponent, MOVE_SPORE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_COAT, player); + MESSAGE("The opposing Zigzagoon bounced the Spore back!"); // Should be MESSAGE("Zigzagoon bounced the Spore back!"); Issue #5579 https://github.com/rh-hideout/pokeemerald-expansion/issues/5579 + MESSAGE("Sleep Clause kept the opposing Zigzagoon awake!"); + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Reflection moves (ie. Magic Coat) that reflect a sleep move activate sleep clause") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_MAGIC_COAT); MOVE(opponent, MOVE_SPORE); } + TURN { SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_SPORE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_COAT, player); + MESSAGE("Zigzagoon bounced the Spore back!"); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } + MESSAGE("Sleep Clause kept the opposing Zigzagoon awake!"); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Reflection moves (ie. Magic Coat) that reflect Dark Void only sleep one opposing Pokémon") +{ + // Source: https://bulbapedia.bulbagarden.net/wiki/Dark_Void_(move) + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); + ASSUME(GetMoveEffect(MOVE_DARK_VOID) == EFFECT_DARK_VOID); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_DARKRAI); + OPPONENT(SPECIES_DARKRAI); + } WHEN { + TURN { MOVE(playerLeft, MOVE_MAGIC_COAT); MOVE(opponentLeft, MOVE_DARK_VOID); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DARK_VOID, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Darkrai fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentRight); + STATUS_ICON(opponentRight, sleep: TRUE); + MESSAGE("The opposing Darkrai fell asleep!"); + } + } +} + +SINGLE_BATTLE_TEST("Sleep Clause: Magic Bounce'ing a sleep move activates sleep clause, and fails if sleep clause is active") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(opponent, MOVE_SPORE); } + TURN { SWITCH(opponent, 1); } + TURN { MOVE(opponent, MOVE_SPORE); } + } SCENE { + MESSAGE("The opposing Zigzagoon's Spore was bounced back by Espeon's Magic Bounce!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + MESSAGE("The opposing Zigzagoon's Spore was bounced back by Espeon's Magic Bounce!"); + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponent, sleep: TRUE); + } + MESSAGE("Sleep Clause kept the opposing Zigzagoon awake!"); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Magic Bounce reflecting Dark Void only sleeps one opposing Pokémon") +{ + // Source: https://bulbapedia.bulbagarden.net/wiki/Dark_Void_(move) + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_DARK_VOID) == EFFECT_DARK_VOID); + PLAYER(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_DARKRAI); + OPPONENT(SPECIES_DARKRAI); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_DARK_VOID); } + } SCENE { + MESSAGE("The opposing Darkrai's Dark Void was bounced back by Espeon's Magic Bounce!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Darkrai fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentRight); + STATUS_ICON(opponentRight, sleep: TRUE); + MESSAGE("The opposing Darkrai fell asleep!"); + } + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep Clause does not prevent sleeping your partner Pokémon with sleep effects") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPORE, target: playerRight); } + TURN { SWITCH(playerRight, 2); MOVE(playerLeft, MOVE_SPORE, target: playerRight); } + TURN { SWITCH(playerRight, 3); MOVE(playerLeft, MOVE_SPORE, target: playerRight); } + TURN { SWITCH(playerRight, 4); MOVE(playerLeft, MOVE_SPORE, target: playerRight); } + TURN { SWITCH(playerRight, 5); MOVE(playerLeft, MOVE_SPORE, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep Clause does not prevent sleeping your partner Pokémon with Yawn") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_YAWN, target: playerRight); } + TURN {} + TURN { SWITCH(playerRight, 2); MOVE(playerLeft, MOVE_YAWN, target: playerRight); } + TURN {} + TURN { SWITCH(playerRight, 3); MOVE(playerLeft, MOVE_YAWN, target: playerRight); } + TURN {} + TURN { SWITCH(playerRight, 4); MOVE(playerLeft, MOVE_YAWN, target: playerRight); } + TURN {} + TURN { SWITCH(playerRight, 5); MOVE(playerLeft, MOVE_YAWN, target: playerRight); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, playerLeft); + MESSAGE("Zigzagoon grew drowsy!"); + STATUS_ICON(playerRight, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, playerLeft); + MESSAGE("Zigzagoon grew drowsy!"); + STATUS_ICON(playerRight, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, playerLeft); + MESSAGE("Zigzagoon grew drowsy!"); + STATUS_ICON(playerRight, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, playerLeft); + MESSAGE("Zigzagoon grew drowsy!"); + STATUS_ICON(playerRight, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, playerLeft); + MESSAGE("Zigzagoon grew drowsy!"); + STATUS_ICON(playerRight, sleep: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Sleep moves used after being Encore'd are prevented when sleep clause is active") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SPORE, target: playerLeft); MOVE(playerRight, MOVE_ENCORE, target: opponentLeft); } + TURN { SWITCH(playerLeft, 2); FORCED_MOVE(opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerLeft); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerLeft, sleep: TRUE); + MESSAGE("Zigzagoon used Encore!"); + MESSAGE("Go! Zigzagoon!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerLeft); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerLeft, sleep: TRUE); + } + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Spore'ing opponent after Yawn'ing partner does not prevent Yawn's effect from sleeping partner") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPORE, target: playerRight); } + TURN { SWITCH(playerRight, 2); MOVE(playerLeft, MOVE_YAWN, target: playerRight); } + TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentLeft); MOVE(playerRight, MOVE_SPORE, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + MESSAGE("Go! Zigzagoon!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, playerLeft); + MESSAGE("Zigzagoon grew drowsy!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentLeft); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponentLeft, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerRight); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponentRight); + MESSAGE("The opposing Zigzagoon fell asleep!"); + STATUS_ICON(opponentRight, sleep: TRUE); + } + MESSAGE("Zigzagoon fell asleep!"); + } +} + +DOUBLE_BATTLE_TEST("Sleep Clause: Opponent Spore'ing player's partner after partner was Yawn'd by player does not prevent Spore's effect from sleeping partner and activating clause") +{ + GIVEN { + FLAG_SET(B_FLAG_SLEEP_CLAUSE); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(playerLeft, MOVE_YAWN, target: playerRight); } + TURN { MOVE(opponentLeft, MOVE_SPORE, target: playerRight); MOVE(opponentRight, MOVE_SPORE, target:playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, playerLeft); + MESSAGE("Zigzagoon grew drowsy!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerRight, sleep: TRUE); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentRight); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerLeft); + MESSAGE("Zigzagoon fell asleep!"); + STATUS_ICON(playerLeft, sleep: TRUE); + } + MESSAGE("Sleep Clause kept Zigzagoon awake!"); + } +} diff --git a/test/battle/spread_moves.c b/test/battle/spread_moves.c new file mode 100644 index 0000000000..2791ca0ea5 --- /dev/null +++ b/test/battle/spread_moves.c @@ -0,0 +1,435 @@ +#include "global.h" +#include "test/battle.h" + +DOUBLE_BATTLE_TEST("Spread Moves: Ability and Item effects activate correctly after a multi target move") +{ + // TODO: Might be a bug, verify on cardridge + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_COVERT_CLOAK); } + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(260); HP(131); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_PIKACHU); + } WHEN { + TURN { + MOVE(opponentRight, MOVE_HEAT_WAVE); + MOVE(playerLeft, MOVE_HYPER_VOICE); + SEND_OUT(opponentRight, 3); + SEND_OUT(opponentLeft, 2); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + MESSAGE("The opposing Wobbuffet is switched out with the Eject Button!"); + MESSAGE("2 sent out Pikachu!"); + ABILITY_POPUP(opponentLeft, ABILITY_EMERGENCY_EXIT); + MESSAGE("2 sent out Wynaut!"); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: No damage will be dealt to a mon in an invulnerable position") +{ + u32 attackingMove = 0, invulMove = 0; + PARAMETRIZE { attackingMove = MOVE_HYPER_VOICE; invulMove = MOVE_FLY; } + PARAMETRIZE { attackingMove = MOVE_LAVA_PLUME; invulMove = MOVE_FLY; } + PARAMETRIZE { attackingMove = MOVE_HYPER_VOICE; invulMove = MOVE_DIVE; } + PARAMETRIZE { attackingMove = MOVE_LAVA_PLUME; invulMove = MOVE_DIVE; } + GIVEN { + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_LAVA_PLUME) == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ZAPDOS); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, invulMove, target: playerLeft); MOVE(playerLeft, attackingMove); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, attackingMove, playerLeft); + NOT HP_BAR(opponentLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: A spread move attack will activate both resist berries") +{ + s16 opponentLeftDmg[2]; + s16 opponentRightDmg[2]; + + GIVEN { + PLAYER(SPECIES_GARDEVOIR); + PLAYER(SPECIES_RALTS); + OPPONENT(SPECIES_RAICHU) { Item(ITEM_CHILAN_BERRY); } + OPPONENT(SPECIES_SANDSLASH) { Item(ITEM_CHILAN_BERRY); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); } + TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + MESSAGE("The Chilan Berry weakened the damage to the opposing Raichu!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + MESSAGE("The Chilan Berry weakened the damage to the opposing Sandslash!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[0]); + HP_BAR(opponentRight, captureDamage: &opponentRightDmg[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[1]); + HP_BAR(opponentRight, captureDamage: &opponentRightDmg[1]); + } THEN { + EXPECT_MUL_EQ(opponentLeftDmg[1], Q_4_12(0.5), opponentLeftDmg[0]); + EXPECT_MUL_EQ(opponentRightDmg[1], Q_4_12(0.5), opponentRightDmg[0]); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: If a spread move attack will activate a resist berries on one pokemon, only the damage for that mon will be reduced") +{ + s16 opponentLeftDmg[2]; + s16 opponentRightDmg[2]; + + GIVEN { + PLAYER(SPECIES_GARDEVOIR); + PLAYER(SPECIES_RALTS); + OPPONENT(SPECIES_RAICHU) + OPPONENT(SPECIES_SANDSLASH) { Item(ITEM_CHILAN_BERRY); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); } + TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + MESSAGE("The Chilan Berry weakened the damage to the opposing Sandslash!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[0]); + HP_BAR(opponentRight, captureDamage: &opponentRightDmg[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[1]); + HP_BAR(opponentRight, captureDamage: &opponentRightDmg[1]); + } THEN { + EXPECT_EQ(opponentLeftDmg[1], opponentLeftDmg[0]); + EXPECT_MUL_EQ(opponentRightDmg[1], Q_4_12(0.5), opponentRightDmg[0]); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: A spread move attack will be weakened by strong winds on both targets") +{ + s16 opponentLeftDmg[2]; + s16 opponentRightDmg[2]; + + GIVEN { + PLAYER(SPECIES_GARDEVOIR); + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_AIR_LOCK); } + PLAYER(SPECIES_RALTS); + OPPONENT(SPECIES_ZAPDOS) + OPPONENT(SPECIES_RAYQUAZA) { Moves(MOVE_DRAGON_ASCENT, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(opponentRight, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); MOVE(playerLeft, MOVE_ROCK_SLIDE); } + TURN { SWITCH(playerRight, 2); MOVE(opponentRight, MOVE_CELEBRATE); MOVE(playerLeft, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[0]); + HP_BAR(opponentRight, captureDamage: &opponentRightDmg[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[1]); + HP_BAR(opponentRight, captureDamage: &opponentRightDmg[1]); + } THEN { + EXPECT_MUL_EQ(opponentLeftDmg[0], Q_4_12(0.5), opponentLeftDmg[1]); + EXPECT_MUL_EQ(opponentRightDmg[0], Q_4_12(0.5), opponentRightDmg[1]); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: A spread move attack will be weakened by strong winds on one of the targets") +{ + s16 opponentLeftDmg[2]; + s16 opponentRightDmg[2]; + + GIVEN { + PLAYER(SPECIES_GARDEVOIR); + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_AIR_LOCK); } + PLAYER(SPECIES_RALTS); + OPPONENT(SPECIES_DONPHAN) + OPPONENT(SPECIES_RAYQUAZA) { Moves(MOVE_DRAGON_ASCENT, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(opponentRight, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); MOVE(playerLeft, MOVE_ROCK_SLIDE); } + TURN { SWITCH(playerRight, 2); MOVE(opponentRight, MOVE_CELEBRATE); MOVE(playerLeft, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[0]); + HP_BAR(opponentRight, captureDamage: &opponentRightDmg[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &opponentLeftDmg[1]); + HP_BAR(opponentRight, captureDamage: &opponentRightDmg[1]); + } THEN { + EXPECT_EQ(opponentLeftDmg[1], opponentLeftDmg[0]); + EXPECT_MUL_EQ(opponentRightDmg[0], Q_4_12(0.5), opponentRightDmg[1]); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (right) and Lightning Rod (left)") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_MIMIKYU); + OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } + OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); HP(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_DISCHARGE); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_LIGHTNING_ROD); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); + ABILITY_POPUP(playerRight, ABILITY_DISGUISE); + ABILITY_POPUP(opponentRight, ABILITY_VOLT_ABSORB); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (left) and Lightning Rod (reft)") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_MIMIKYU); + OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); HP(1); } + OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_DISCHARGE); } + } SCENE { + ABILITY_POPUP(opponentRight, ABILITY_LIGHTNING_ROD); + ABILITY_POPUP(opponentLeft, ABILITY_VOLT_ABSORB); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); + ABILITY_POPUP(playerRight, ABILITY_DISGUISE); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Eiscue and Mimikyu (Based on vanilla games)") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveCategory(MOVE_EARTHQUAKE) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_EISCUE); + OPPONENT(SPECIES_MIMIKYU); + OPPONENT(SPECIES_EISCUE); + } WHEN { + TURN { MOVE(playerLeft, MOVE_EARTHQUAKE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_DISGUISE); + ABILITY_POPUP(playerRight, ABILITY_ICE_FACE); + ABILITY_POPUP(opponentRight, ABILITY_ICE_FACE); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Spread move, Gem Boosted, vs Resist Berries") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_WOBBUFFET) { Speed(40); Item(ITEM_NORMAL_GEM); } + PLAYER(SPECIES_WYNAUT) { Speed(30); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); Item(ITEM_CHILAN_BERRY); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); Item(ITEM_CHILAN_BERRY); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); } + } SCENE { + MESSAGE("The Normal Gem strengthened Wobbuffet's power!"); + MESSAGE("The Chilan Berry weakened the damage to the opposing Wobbuffet!"); + MESSAGE("The Chilan Berry weakened the damage to the opposing Wynaut!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Explosion, Gem Boosted, vs Resist Berries") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_WOBBUFFET) { Speed(40); Item(ITEM_NORMAL_GEM); } + PLAYER(SPECIES_MISDREAVUS) { Speed(30); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); Item(ITEM_CHILAN_BERRY); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); Item(ITEM_CHILAN_BERRY); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPLOSION); } + } SCENE { + MESSAGE("The Normal Gem strengthened Wobbuffet's power!"); + MESSAGE("The Chilan Berry weakened the damage to the opposing Wobbuffet!"); + MESSAGE("The Chilan Berry weakened the damage to the opposing Wynaut!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + MESSAGE("It doesn't affect Misdreavus…"); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs Eiscue and Mimikyu with 1 Eject Button") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_RAZOR_LEAF) == MOVE_TARGET_BOTH); + ASSUME(GetMoveCategory(MOVE_RAZOR_LEAF) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WOBBUFFET) { Speed(40); } + PLAYER(SPECIES_WYNAUT) { Speed(30); } + OPPONENT(SPECIES_MIMIKYU) { Speed(20); Item(ITEM_EJECT_BUTTON); } + OPPONENT(SPECIES_EISCUE) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_RAZOR_LEAF); SEND_OUT(opponentLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAZOR_LEAF, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_DISGUISE); + ABILITY_POPUP(opponentRight, ABILITY_ICE_FACE); + MESSAGE("The opposing Mimikyu is switched out with the Eject Button!"); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs Wide Guard") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_WOBBUFFET) { Speed(40); } + PLAYER(SPECIES_WYNAUT) { Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_WIDE_GUARD); MOVE(opponentLeft, MOVE_HYPER_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WIDE_GUARD, playerLeft); + MESSAGE("Wide Guard protected your team!"); + MESSAGE("The opposing Wobbuffet used Hyper Voice!"); + MESSAGE("Wobbuffet protected itself!"); + MESSAGE("Wynaut protected itself!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs one protecting mon") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_PROTECT); MOVE(playerLeft, MOVE_HYPER_VOICE); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Protect!"); + MESSAGE("Wobbuffet used Hyper Voice!"); + MESSAGE("The opposing Wobbuffet protected itself!"); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Super Effective Message on both opposing mons") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GOLEM); + OPPONENT(SPECIES_ONIX); + } WHEN { + TURN { MOVE(playerLeft, MOVE_PRECIPICE_BLADES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PRECIPICE_BLADES, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + MESSAGE("It's super effective on the opposing Golem and Onix!"); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Super Effective Message on both player mons") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_GOLEM); + PLAYER(SPECIES_ONIX); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_PRECIPICE_BLADES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PRECIPICE_BLADES, opponentLeft); + HP_BAR(playerLeft); + HP_BAR(playerRight); + MESSAGE("It's super effective on Golem and Onix!"); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Not very effective Message on both opposing mons") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_CHIKORITA); + OPPONENT(SPECIES_TREECKO); + } WHEN { + TURN { MOVE(playerLeft, MOVE_PRECIPICE_BLADES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PRECIPICE_BLADES, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + MESSAGE("It's not very effective on the opposing Chikorita and Treecko!"); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Not very effective message on both player mons") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_CHIKORITA); + PLAYER(SPECIES_TREECKO); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_PRECIPICE_BLADES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PRECIPICE_BLADES, opponentLeft); + HP_BAR(playerLeft); + HP_BAR(playerRight); + MESSAGE("It's not very effective on Chikorita and Treecko!"); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Doesn't affect message on both opposing mons") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == MOVE_TARGET_BOTH); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_PIDGEY); + OPPONENT(SPECIES_HOOTHOOT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_PRECIPICE_BLADES); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PRECIPICE_BLADES, playerLeft); + MESSAGE("It doesn't affect the opposing Pidgey and Hoothoot…"); + } +} + +DOUBLE_BATTLE_TEST("Spread Moves: Unless move hits every target user will not include partner in the target count") +{ + GIVEN { + PLAYER(SPECIES_SANDSLASH); + PLAYER(SPECIES_WYNAUT) { HP(1); } + PLAYER(SPECIES_RALTS); + OPPONENT(SPECIES_TORKOAL); + OPPONENT(SPECIES_TORKOAL); + } WHEN { + TURN { MOVE(opponentRight, MOVE_ICY_WIND); MOVE(playerLeft, MOVE_ROCK_SLIDE); SEND_OUT(playerRight, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ICY_WIND, opponentRight); + HP_BAR(playerLeft); + HP_BAR(playerRight); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + MESSAGE("It's super effective on the opposing Torkoal and Torkoal!"); + } +} diff --git a/test/battle/status1/burn.c b/test/battle/status1/burn.c index 63d6506fb6..c37768cedf 100644 --- a/test/battle/status1/burn.c +++ b/test/battle/status1/burn.c @@ -23,7 +23,7 @@ SINGLE_BATTLE_TEST("Burn reduces Attack by 50%", s16 damage) PARAMETRIZE { burned = FALSE; } PARAMETRIZE { burned = TRUE; } GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { if (burned) Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/status1/freeze.c b/test/battle/status1/freeze.c index d19e1776be..f363ab9e35 100644 --- a/test/battle/status1/freeze.c +++ b/test/battle/status1/freeze.c @@ -17,7 +17,7 @@ SINGLE_BATTLE_TEST("Freeze has a 20% chance of being thawed") SINGLE_BATTLE_TEST("Freeze is thawed by opponent's Fire-type attacks") { GIVEN { - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_FREEZE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Freeze is thawed by opponent's Fire-type attacks") SINGLE_BATTLE_TEST("Freeze is thawed by user's Flame Wheel") { GIVEN { - ASSUME(gMovesInfo[MOVE_FLAME_WHEEL].thawsUser); + ASSUME(MoveThawsUser(MOVE_FLAME_WHEEL)); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_FREEZE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/status1/frostbite.c b/test/battle/status1/frostbite.c index a7776e5e2e..f45508f800 100644 --- a/test/battle/status1/frostbite.c +++ b/test/battle/status1/frostbite.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Frostbite reduces the special attack by 50 percent") s16 normaleDamage; GIVEN { - ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_FROSTBITE); } } WHEN { diff --git a/test/battle/status1/paralysis.c b/test/battle/status1/paralysis.c index 4caeb3c509..64ed27f361 100644 --- a/test/battle/status1/paralysis.c +++ b/test/battle/status1/paralysis.c @@ -62,3 +62,18 @@ AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target") TURN { SCORE_EQ(opponent, MOVE_CELEBRATE, MOVE_THUNDER_WAVE); } // Both get -10 } } + +SINGLE_BATTLE_TEST("Thunder Wave doesn't affect Electric types in Gen6+") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC); + ASSUME(B_PARALYZE_ELECTRIC >= GEN_6); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIKACHU); + } WHEN { + TURN { MOVE(player, MOVE_THUNDER_WAVE); } + } SCENE { + MESSAGE("Wobbuffet used Thunder Wave!"); + MESSAGE("It doesn't affect the opposing Pikachu…"); + } +} diff --git a/test/battle/status2/confusion.c b/test/battle/status2/confusion.c index 9c7524cdec..00ea0c2ed1 100644 --- a/test/battle/status2/confusion.c +++ b/test/battle/status2/confusion.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Confusion adds a 50/33% chance to hit self with 40 power") PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); GIVEN { WITH_CONFIG(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); - ASSUME(gMovesInfo[MOVE_TACKLE].power == 40); + ASSUME(GetMovePower(MOVE_TACKLE) == 40); PLAYER(SPECIES_WOBBUFFET) { Speed(1); }; OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }; } WHEN { diff --git a/test/battle/trainer_control.c b/test/battle/trainer_control.c index 5344a26596..89a5c905a9 100644 --- a/test/battle/trainer_control.c +++ b/test/battle/trainer_control.c @@ -6,21 +6,38 @@ #include "malloc.h" #include "random.h" #include "string_util.h" +#include "trainer_pools.h" #include "constants/item.h" #include "constants/abilities.h" #include "constants/trainers.h" #include "constants/battle.h" -static const struct Trainer sTestTrainers[] = +#define NUM_TEST_TRAINERS 9 + +static const struct Trainer sTestTrainers[DIFFICULTY_COUNT][NUM_TEST_TRAINERS] = { #include "trainer_control.h" }; +enum DifficultyLevel GetTrainerDifficultyLevelTest(u16 trainerId) +{ + enum DifficultyLevel difficulty = GetCurrentDifficultyLevel(); + + if (difficulty == DIFFICULTY_NORMAL) + return DIFFICULTY_NORMAL; + + if (sTestTrainers[difficulty][trainerId].party == NULL) + return DIFFICULTY_NORMAL; + + return difficulty; +} + TEST("CreateNPCTrainerPartyForTrainer generates customized Pokémon") { struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 0; u8 nickBuffer[20]; - CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[0], TRUE, BATTLE_TYPE_TRAINER); + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); EXPECT(IsMonShiny(&testParty[0])); EXPECT(!IsMonShiny(&testParty[1])); @@ -94,8 +111,9 @@ TEST("CreateNPCTrainerPartyForTrainer generates customized Pokémon") TEST("CreateNPCTrainerPartyForTrainer generates different personalities for different mons") { + enum DifficultyLevel difficulty = GetTrainerDifficultyLevelTest(0); struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); - CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[0], TRUE, BATTLE_TYPE_TRAINER); + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[difficulty][0], TRUE, BATTLE_TYPE_TRAINER); EXPECT(testParty[0].box.personality != testParty[1].box.personality); Free(testParty); } @@ -160,3 +178,107 @@ TEST("Trainer Class Balls apply to the entire party") } Free(testParty); } + +TEST("Difficulty default to Normal is the trainer doesn't have a member for the current diffuculty") +{ + SetCurrentDifficultyLevel(DIFFICULTY_EASY); + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 1; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_MEWTWO); + Free(testParty); +} + +TEST("Difficulty changes which party if used for NPCs if defined for the difficulty (EASY)") +{ + SetCurrentDifficultyLevel(DIFFICULTY_EASY); + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 2; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_METAPOD); + EXPECT(GetMonData(&testParty[0], MON_DATA_LEVEL) == 1); + Free(testParty); +} + +TEST("Difficulty changes which party if used for NPCs if defined for the difficulty (HARD)") +{ + SetCurrentDifficultyLevel(DIFFICULTY_HARD); + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 2; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_ARCEUS); + EXPECT(GetMonData(&testParty[0], MON_DATA_LEVEL) == 99); + Free(testParty); +} + +TEST("Difficulty changes which party if used for NPCs if defined for the difficulty (NORMAL)") +{ + SetCurrentDifficultyLevel(DIFFICULTY_NORMAL); + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 2; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_MEWTWO); + EXPECT(GetMonData(&testParty[0], MON_DATA_LEVEL) == 50); + Free(testParty); +} + +TEST("Trainer Party Pool generates a party from the trainer pool") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 3; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_EEVEE); + Free(testParty); +} + +TEST("Trainer Party Pool picks a random lead and a random ace if tags exist in the pool") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 4; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_ARON); // Lead + EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_WYNAUT); // Not Lead or Ace + EXPECT(GetMonData(&testParty[2], MON_DATA_SPECIES) == SPECIES_EEVEE); // Ace + Free(testParty); +} + +TEST("Trainer Party Pool picks according to custom rules") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 5; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_TORKOAL); // Lead + Weather Setter + EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_BULBASAUR); // Lead + Weather Abuser + EXPECT(GetMonData(&testParty[2], MON_DATA_SPECIES) == SPECIES_EEVEE); // Anything else + Free(testParty); +} + +TEST("Trainer Party Pool uses standard party creation if pool is illegal") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 6; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_WYNAUT); + EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_WOBBUFFET); + Free(testParty); +} + +TEST("Trainer Party Pool can be pruned before picking") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 7; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_EEVEE); + EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_WYNAUT); + Free(testParty); +} + +TEST("Trainer Party Pool can choose which functions to use for picking mons") +{ + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + u32 currTrainer = 8; + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_SPECIES) == SPECIES_WYNAUT); + EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_WOBBUFFET); + Free(testParty); +} diff --git a/test/battle/trainer_control.h b/test/battle/trainer_control.h index fb548e6558..62a8045694 100644 --- a/test/battle/trainer_control.h +++ b/test/battle/trainer_control.h @@ -9,7 +9,7 @@ #line 1 "test/battle/trainer_control.party" #line 1 - [0] = + [DIFFICULTY_NORMAL][0] = { #line 2 .trainerName = _("Test1"), @@ -87,3 +87,621 @@ }, }, }, +#line 33 +#line 40 + [DIFFICULTY_NORMAL][1] = + { +#line 34 + .trainerName = _("Test2"), +#line 35 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 36 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 38 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 39 + .doubleBattle = FALSE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 42 + .species = SPECIES_MEWTWO, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 44 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 43 + .lvl = 5, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 45 +#line 52 + [DIFFICULTY_NORMAL][2] = + { +#line 46 + .trainerName = _("Test2"), +#line 47 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 48 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 50 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 51 + .doubleBattle = FALSE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 54 + .species = SPECIES_MEWTWO, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 56 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 55 + .lvl = 50, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 57 +#line 64 + [DIFFICULTY_EASY][2] = + { +#line 58 + .trainerName = _("Test2"), +#line 59 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 60 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 62 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 63 + .doubleBattle = FALSE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 66 + .species = SPECIES_METAPOD, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 68 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 67 + .lvl = 1, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 69 +#line 76 + [DIFFICULTY_HARD][2] = + { +#line 70 + .trainerName = _("Test2"), +#line 71 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 72 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 74 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 75 + .doubleBattle = FALSE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 78 + .species = SPECIES_ARCEUS, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 80 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 79 + .lvl = 99, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 81 + [DIFFICULTY_NORMAL][3] = + { +#line 82 + .trainerName = _("Test3"), +#line 83 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 84 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 86 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 87 + .doubleBattle = FALSE, +#line 88 + .partySize = 1, + .poolSize = 4, + .party = (const struct TrainerMon[]) + { + { +#line 90 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 91 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 91 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 92 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 93 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 93 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 94 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 95 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 95 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 96 + .species = SPECIES_MEW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 97 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 97 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 98 + [DIFFICULTY_NORMAL][4] = + { +#line 99 + .trainerName = _("Test4"), +#line 100 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 101 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 103 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 104 + .doubleBattle = FALSE, +#line 105 + .partySize = 3, + .poolSize = 6, + .party = (const struct TrainerMon[]) + { + { +#line 107 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 108 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 108 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 109 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 111 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 111 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 110 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 112 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 114 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 114 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 113 + .tags = MON_POOL_TAG_ACE, + }, + { +#line 115 + .species = SPECIES_MEW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 116 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 116 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 117 + .species = SPECIES_ODDISH, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 119 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 119 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 118 + .tags = MON_POOL_TAG_ACE, + }, + { +#line 120 + .species = SPECIES_ARON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 122 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 122 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 121 + .tags = MON_POOL_TAG_LEAD, + }, + }, + }, +#line 123 + [DIFFICULTY_NORMAL][5] = + { +#line 124 + .trainerName = _("Test5"), +#line 125 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 126 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 128 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 129 + .doubleBattle = TRUE, +#line 131 + .poolRuleIndex = POOL_RULESET_WEATHER_DOUBLES, +#line 130 + .partySize = 3, + .poolSize = 10, + .party = (const struct TrainerMon[]) + { + { +#line 133 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 135 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 135 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 134 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 136 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 138 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 138 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 137 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 139 + .species = SPECIES_VULPIX, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 141 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 141 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 140 + .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER, + }, + { +#line 142 + .species = SPECIES_BULBASAUR, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 144 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 144 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 143 + .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_ABUSER, + }, + { +#line 145 + .species = SPECIES_TORKOAL, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 147 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 147 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 146 + .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER, + }, + { +#line 148 + .species = SPECIES_CHERRIM, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 150 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 150 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 149 + .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_ABUSER, + }, + { +#line 151 + .species = SPECIES_MEW, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 153 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 153 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 152 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 154 + .species = SPECIES_ARON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 156 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 156 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 155 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 157 + .species = SPECIES_ODDISH, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 158 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 158 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 159 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 160 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 160 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 161 + [DIFFICULTY_NORMAL][6] = + { +#line 162 + .trainerName = _("Test6"), +#line 163 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 164 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 166 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 167 + .doubleBattle = FALSE, +#line 169 + .poolRuleIndex = POOL_RULESET_BASIC, +#line 168 + .partySize = 2, + .poolSize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 171 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 173 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 173 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 172 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 174 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 176 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 176 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 175 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 177 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 179 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 179 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 178 + .tags = MON_POOL_TAG_LEAD, + }, + }, + }, +#line 180 + [DIFFICULTY_NORMAL][7] = + { +#line 181 + .trainerName = _("Test1"), +#line 182 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 183 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 185 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 186 + .doubleBattle = FALSE, +#line 188 + .poolRuleIndex = POOL_RULESET_BASIC, +#line 189 + .poolPruneIndex = POOL_PRUNE_TEST, +#line 187 + .partySize = 2, + .poolSize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 191 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 192 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 192 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 193 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 195 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 195 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 194 + .tags = MON_POOL_TAG_LEAD, + }, + { +#line 196 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 197 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 197 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 198 + [DIFFICULTY_NORMAL][8] = + { +#line 199 + .trainerName = _("Test1"), +#line 200 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 201 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 203 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 204 + .doubleBattle = FALSE, +#line 206 + .poolRuleIndex = POOL_RULESET_BASIC, +#line 207 + .poolPickIndex = POOL_PICK_LOWEST, +#line 205 + .partySize = 2, + .poolSize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 209 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 211 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 211 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 210 + .tags = MON_POOL_TAG_ACE, + }, + { +#line 212 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 213 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 213 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 214 + .species = SPECIES_EEVEE, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 216 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 216 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, +#line 215 + .tags = MON_POOL_TAG_LEAD, + }, + }, + }, + diff --git a/test/battle/trainer_control.party b/test/battle/trainer_control.party index 8ebfc0e664..b4ba68c6b1 100644 --- a/test/battle/trainer_control.party +++ b/test/battle/trainer_control.party @@ -29,3 +29,187 @@ IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe Wynaut Level: 5 IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe + +=== 1 === +Name: Test2 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Difficulty: Normal + +Mewtwo +Level: 5 + +=== 2 === +Name: Test2 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Difficulty: Normal + +Mewtwo +Level: 50 + +=== 2 === +Name: Test2 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Difficulty: Easy + +Metapod +Level: 1 + +=== 2 === +Name: Test2 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Difficulty: Hard + +Arceus +Level: 99 + +=== 3 === +Name: Test3 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Party Size: 1 + +Wynaut + +Wobbuffet + +Eevee + +Mew + +=== 4 === +Name: Test4 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Party Size: 3 + +Wynaut + +Wobbuffet +Tags: Lead + +Eevee +Tags: Ace + +Mew + +Oddish +Tags: Ace + +Aron +Tags: Lead + +=== 5 === +Name: Test5 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: Yes +Party Size: 3 +Pool Rules: Weather Doubles + +Wynaut +Tags: Lead + +Wobbuffet +Tags: Lead + +Vulpix +Tags: Lead / Weather Setter + +Bulbasaur +Tags: Lead / Weather Abuser + +Torkoal +Tags: Lead / Weather Setter + +Cherrim +Tags: Lead / Weather Abuser + +Mew +Tags: Lead + +Aron +Tags: Lead + +Oddish + +Eevee + +=== 6 === +Name: Test6 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Party Size: 2 +Pool Rules: Basic + +Wynaut +Tags: Lead + +Wobbuffet +Tags: Lead + +Eevee +Tags: Lead + +=== 7 === +Name: Test1 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Party Size: 2 +Pool Rules: Basic +Pool Prune: Test + +Wynaut + +Wobbuffet +Tags: Lead + +Eevee + +=== 8 === +Name: Test1 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: No +Party Size: 2 +Pool Rules: Basic +Pool Pick Functions: Lowest + +Wynaut +Tags: Ace + +Wobbuffet + +Eevee +Tags: Lead diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c new file mode 100644 index 0000000000..3ad0c38248 --- /dev/null +++ b/test/battle/trainer_slides.c @@ -0,0 +1,214 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_setup.h" + +SINGLE_BATTLE_TEST("Trainer Slide: Before First Turn") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_BEFORE_FIRST_TURN; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { } + } SCENE { + MESSAGE("This message plays before the first turn.{PAUSE_UNTIL_PRESS}"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Critical Hit") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_LASER_FOCUS); } + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASER_FOCUS, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + MESSAGE("A critical hit!"); + MESSAGE("This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Enemy Lands First Critical Hit") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_LASER_FOCUS); } + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASER_FOCUS, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("A critical hit!"); + MESSAGE("This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First STAB Hit") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; + + GIVEN { + ASSUME((GetMoveType(MOVE_VINE_WHIP)) == gSpeciesInfo[SPECIES_BULBASAUR].types[0]); + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_VINE_WHIP); } + } SCENE { + MESSAGE("Bulbasaur used Vine Whip!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_VINE_WHIP, player); + MESSAGE("Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Super Effective Hit") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT; + + GIVEN { + ASSUME(GetMoveType(MOVE_BITE) == TYPE_DARK); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BITE); } + } SCENE { + MESSAGE("It's super effective!"); + MESSAGE("This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Down") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_HEALING_WISH); SEND_OUT(opponent,1); } + } SCENE { + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; + GIVEN { + ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); + ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GLALIE); + } WHEN { + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + MESSAGE("It doesn't affect the opposing Glalie…"); + MESSAGE("Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Last Switchin") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_SWITCHIN; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_HEALING_WISH); SEND_OUT(opponent,1); } + } SCENE { + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_HALF_HP; + GIVEN { + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_SUPER_FANG); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUPER_FANG); } + } SCENE { + MESSAGE("Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Last Low Hp") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_LOW_HP; + GIVEN { + ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); + PLAYER(SPECIES_WOBBUFFET) { Attack(999);} + OPPONENT(SPECIES_WOBBUFFET) { Defense(1);} + } WHEN { + TURN { MOVE(player, MOVE_FALSE_SWIPE); } + } SCENE { + MESSAGE("Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Mega Evolution") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_MEGA_EVOLUTION; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_LOPUNNY) {Item(ITEM_LOPUNNITE); }; + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + } SCENE { + MESSAGE("This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + MESSAGE("The opposing Lopunny has Mega Evolved into Mega Lopunny!"); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Z Move") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_Z_MOVE; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + } WHEN { + TURN { MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + MESSAGE("This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"); + MESSAGE("The opposing Wobbuffet surrounded itself with its Z-Power!"); + MESSAGE("The opposing Wobbuffet unleashes its full-force Z-Move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BREAKNECK_BLITZ, opponent); + } +} + +SINGLE_BATTLE_TEST("Trainer Slide: Dynamax") +{ + gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_DYNAMAX; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_DYNAMAX); } + } SCENE { + MESSAGE("This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, opponent); + } +} diff --git a/test/battle/trainer_slides.h b/test/battle/trainer_slides.h new file mode 100644 index 0000000000..cb62a00800 --- /dev/null +++ b/test/battle/trainer_slides.h @@ -0,0 +1,56 @@ +[DIFFICULTY_NORMAL] = +{ + [TRAINER_SLIDE_BEFORE_FIRST_TURN] = + { + [TRAINER_SLIDE_BEFORE_FIRST_TURN] = COMPOUND_STRING("This message plays before the first turn.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = + { + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = + { + [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = + { + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = COMPOUND_STRING("This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = + { + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = COMPOUND_STRING("This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = + { + [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = COMPOUND_STRING("Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = + { + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = COMPOUND_STRING("Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_LAST_SWITCHIN] = + { + [TRAINER_SLIDE_LAST_SWITCHIN] = COMPOUND_STRING("This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_LAST_HALF_HP] = + { + [TRAINER_SLIDE_LAST_HALF_HP] = COMPOUND_STRING("Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_LAST_LOW_HP] = + { + [TRAINER_SLIDE_LAST_LOW_HP] = COMPOUND_STRING("Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_MEGA_EVOLUTION] = + { + [TRAINER_SLIDE_MEGA_EVOLUTION] = COMPOUND_STRING("This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_Z_MOVE] = + { + [TRAINER_SLIDE_Z_MOVE] = COMPOUND_STRING("This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"), + }, + [TRAINER_SLIDE_DYNAMAX] = + { + [TRAINER_SLIDE_DYNAMAX] = COMPOUND_STRING("This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"), + }, +}, + diff --git a/test/battle/weather/rain.c b/test/battle/weather/rain.c index 3359d25a81..0620aae100 100644 --- a/test/battle/weather/rain.c +++ b/test/battle/weather/rain.c @@ -4,8 +4,8 @@ // Please add Rain interactions with move, item and ability effects on their respective files. ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); } SINGLE_BATTLE_TEST("Rain multiplies the power of Fire-type moves by 0.5x", s16 damage) diff --git a/test/battle/weather/sandstorm.c b/test/battle/weather/sandstorm.c index 38502cbbc7..dcac3f71c3 100644 --- a/test/battle/weather/sandstorm.c +++ b/test/battle/weather/sandstorm.c @@ -23,7 +23,7 @@ SINGLE_BATTLE_TEST("Sandstorm multiplies the special defense of Rock-types by 1. PARAMETRIZE { move = MOVE_SANDSTORM; } PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { - ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET) ; OPPONENT(SPECIES_NOSEPASS); } WHEN { diff --git a/test/battle/weather/snow.c b/test/battle/weather/snow.c index 6c084f6b7a..7b4e4cb2ff 100644 --- a/test/battle/weather/snow.c +++ b/test/battle/weather/snow.c @@ -4,10 +4,10 @@ // Please add Snow interactions with move, item and ability effects on their respective files. ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE && gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE || gSpeciesInfo[SPECIES_GLALIE].types[1] == TYPE_ICE); - ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); } SINGLE_BATTLE_TEST("Snow multiplies the defense of Ice-types by 1.5x", s16 damage) diff --git a/test/battle/weather/sunlight.c b/test/battle/weather/sunlight.c index 6cf6348987..796ad3c3af 100644 --- a/test/battle/weather/sunlight.c +++ b/test/battle/weather/sunlight.c @@ -4,8 +4,8 @@ // Please add Sunlight interactions with move, item and ability effects on their respective files. ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE); - ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); } SINGLE_BATTLE_TEST("Sunlight multiplies the power of Fire-type moves by 1.5x", s16 damage) diff --git a/test/pokemon.c b/test/pokemon.c index ac2342f155..97e034dc82 100644 --- a/test/pokemon.c +++ b/test/pokemon.c @@ -275,7 +275,7 @@ TEST("givemon [all]") ZeroPlayerPartyMons(); RUN_OVERWORLD_SCRIPT( - givemon SPECIES_WOBBUFFET, 100, item=ITEM_LEFTOVERS, ball=ITEM_MASTER_BALL, nature=NATURE_BOLD, abilityNum=2, gender=MON_MALE, hpEv=1, atkEv=2, defEv=3, speedEv=4, spAtkEv=5, spDefEv=6, hpIv=7, atkIv=8, defIv=9, speedIv=10, spAtkIv=11, spDefIv=12, move1=MOVE_TACKLE, move2=MOVE_SPLASH, move3=MOVE_CELEBRATE, move4=MOVE_EXPLOSION, isShiny=TRUE, ggMaxFactor=TRUE, teraType=TYPE_FIRE; + givemon SPECIES_WOBBUFFET, 100, item=ITEM_LEFTOVERS, ball=ITEM_MASTER_BALL, nature=NATURE_BOLD, abilityNum=2, gender=MON_MALE, hpEv=1, atkEv=2, defEv=3, speedEv=4, spAtkEv=5, spDefEv=6, hpIv=7, atkIv=8, defIv=9, speedIv=10, spAtkIv=11, spDefIv=12, move1=MOVE_TACKLE, move2=MOVE_SPLASH, move3=MOVE_CELEBRATE, move4=MOVE_EXPLOSION, isShiny=TRUE, gmaxFactor=TRUE, teraType=TYPE_FIRE, dmaxLevel=7; ); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET); @@ -304,6 +304,7 @@ TEST("givemon [all]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_IS_SHINY), TRUE); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_GIGANTAMAX_FACTOR), TRUE); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_TERA_TYPE), TYPE_FIRE); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DYNAMAX_LEVEL), 7); } TEST("givemon [vars]") @@ -336,9 +337,10 @@ TEST("givemon [vars]") VarSet(VAR_TEMP_9, TRUE); VarSet(VAR_TEMP_A, TRUE); VarSet(VAR_TEMP_B, TYPE_FIRE); + VarSet(VAR_TEMP_E, 7); RUN_OVERWORLD_SCRIPT( - givemon VAR_TEMP_C, VAR_TEMP_D, item=VAR_0x8000, ball=VAR_0x8001, nature=VAR_0x8002, abilityNum=VAR_0x8003, gender=VAR_0x8004, hpEv=VAR_0x8005, atkEv=VAR_0x8006, defEv=VAR_0x8007, speedEv=VAR_0x8008, spAtkEv=VAR_0x8009, spDefEv=VAR_0x800A, hpIv=VAR_0x800B, atkIv=VAR_TEMP_0, defIv=VAR_TEMP_1, speedIv=VAR_TEMP_2, spAtkIv=VAR_TEMP_3, spDefIv=VAR_TEMP_4, move1=VAR_TEMP_5, move2=VAR_TEMP_6, move3=VAR_TEMP_7, move4=VAR_TEMP_8, isShiny=VAR_TEMP_9, ggMaxFactor=VAR_TEMP_A, teraType=VAR_TEMP_B; + givemon VAR_TEMP_C, VAR_TEMP_D, item=VAR_0x8000, ball=VAR_0x8001, nature=VAR_0x8002, abilityNum=VAR_0x8003, gender=VAR_0x8004, hpEv=VAR_0x8005, atkEv=VAR_0x8006, defEv=VAR_0x8007, speedEv=VAR_0x8008, spAtkEv=VAR_0x8009, spDefEv=VAR_0x800A, hpIv=VAR_0x800B, atkIv=VAR_TEMP_0, defIv=VAR_TEMP_1, speedIv=VAR_TEMP_2, spAtkIv=VAR_TEMP_3, spDefIv=VAR_TEMP_4, move1=VAR_TEMP_5, move2=VAR_TEMP_6, move3=VAR_TEMP_7, move4=VAR_TEMP_8, isShiny=VAR_TEMP_9, gmaxFactor=VAR_TEMP_A, teraType=VAR_TEMP_B, dmaxLevel=VAR_TEMP_E; ); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET); @@ -367,6 +369,7 @@ TEST("givemon [vars]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_IS_SHINY), TRUE); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_GIGANTAMAX_FACTOR), TRUE); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_TERA_TYPE), TYPE_FIRE); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DYNAMAX_LEVEL), 7); } TEST("checkteratype/setteratype work") diff --git a/test/script.c b/test/script.c new file mode 100644 index 0000000000..5f185d72cf --- /dev/null +++ b/test/script.c @@ -0,0 +1,116 @@ +#include "global.h" +#include "test/test.h" +#include "test/overworld_script.h" +#include "script.h" +#include "constants/decorations.h" +#include "constants/moves.h" + +TEST("Script_HasNoEffect control flow") +{ + const u8 *script = OVERWORLD_SCRIPT( + nop; + nop1; + checkflag FLAG_TEMP_1; + checktrainerflag 0; + compare VAR_TEMP_0, 0; + goto_if_eq GoneTo; + GoneTo: + call Sub; + call_if_eq Sub; + end; + + Sub: + goto SubRet; + SubRet: + return; + ); + EXPECT(Script_HasNoEffect(script)); +} + +TEST("Script_HasNoEffect variables") +{ + // Writes to special variables are not considered player-visible + // because their values are indeterminate if the player has control. + const u8 *writeSpecial = OVERWORLD_SCRIPT( + setvar VAR_0x8000, 1; + addvar VAR_0x8000, 1; + subvar VAR_0x8000, VAR_TEMP_0; + copyvar VAR_0x8000, VAR_TEMP_0; + setorcopyvar VAR_0x8000, VAR_TEMP_0; + specialvar VAR_RESULT, GetPlayerFacingDirection; + getplayerxy VAR_0x8000, VAR_0x8001; + getpartysize; + checkitemspace ITEM_POTION, 1; + checkitem ITEM_POTION, 1; + checkitemtype ITEM_POTION; + checkpcitem ITEM_POTION, 1; + checkdecorspace DECOR_SNORLAX_DOLL; + checkdecor DECOR_SNORLAX_DOLL; + checkpartymove MOVE_CELEBRATE; + random 2; + checkmoney 5000; + getpokenewsactive POKENEWS_LILYCOVE; + checkplayergender; + checkcoins VAR_RESULT; + checkmodernfatefulencounter 0; + end; + ); + + // Writes to other variables are considered player-visible because + // their values are preserved even while the player has control. + const u8 *setVariable = OVERWORLD_SCRIPT( + setvar VAR_TEMP_0, 1; + end; + ); + + const u8 *addVariable = OVERWORLD_SCRIPT( + addvar VAR_TEMP_0, 1; + end; + ); + + const u8 *subVariable = OVERWORLD_SCRIPT( + subvar VAR_TEMP_0, 1; + end; + ); + + const u8 *copyVariable = OVERWORLD_SCRIPT( + copyvar VAR_TEMP_0, VAR_RESULT; + end; + ); + + const u8 *setorcopyVariable = OVERWORLD_SCRIPT( + setorcopyvar VAR_TEMP_0, VAR_RESULT; + end; + ); + + const u8 *specialvarVariable = OVERWORLD_SCRIPT( + specialvar VAR_TEMP_0, GetPlayerFacingDirection; + end; + ); + + const u8 *getPlayerXYVariable1 = OVERWORLD_SCRIPT( + getplayerxy VAR_TEMP_0, VAR_RESULT; + end; + ); + + const u8 *getPlayerXYVariable2 = OVERWORLD_SCRIPT( + getplayerxy VAR_RESULT, VAR_TEMP_0; + end; + ); + + const u8 *checkCoinsVariable = OVERWORLD_SCRIPT( + checkcoins VAR_TEMP_0; + end; + ); + + EXPECT(Script_HasNoEffect(writeSpecial)); + EXPECT(!Script_HasNoEffect(setVariable)); + EXPECT(!Script_HasNoEffect(addVariable)); + EXPECT(!Script_HasNoEffect(subVariable)); + EXPECT(!Script_HasNoEffect(copyVariable)); + EXPECT(!Script_HasNoEffect(setorcopyVariable)); + EXPECT(!Script_HasNoEffect(specialvarVariable)); + EXPECT(!Script_HasNoEffect(getPlayerXYVariable1)); + EXPECT(!Script_HasNoEffect(getPlayerXYVariable2)); + EXPECT(!Script_HasNoEffect(checkCoinsVariable)); +} diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index d50668ca30..40e8b31f41 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -1373,7 +1373,6 @@ static inline rng_value_t MakeRngValue(const u16 seed) static void CB2_BattleTest_NextTrial(void) { - ClearFlagAfterTest(); TearDownBattle(); SetMainCallback2(CB2_BattleTest_NextParameter); @@ -1775,7 +1774,8 @@ void Moves_(u32 sourceLine, u16 moves[MAX_MON_MOVES]) break; INVALID_IF(moves[i] >= MOVES_COUNT, "Illegal move: %d", moves[i]); SetMonData(DATA.currentMon, MON_DATA_MOVE1 + i, &moves[i]); - SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &gMovesInfo[moves[i]].pp); + u32 pp = GetMovePP(moves[i]); + SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &pp); } DATA.explicitMoves[DATA.currentSide] |= 1 << DATA.currentPartyIndex; } @@ -2093,7 +2093,8 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * { INVALID_IF(DATA.explicitMoves[battlerId & BIT_SIDE] & (1 << DATA.currentMonIndexes[battlerId]), "Missing explicit %S", GetMoveName(ctx->move)); SetMonData(mon, MON_DATA_MOVE1 + i, &ctx->move); - SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &gMovesInfo[ctx->move].pp); + u32 pp = GetMovePP(ctx->move); + SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &pp); *moveSlot = i; *moveId = ctx->move; break; @@ -2122,7 +2123,7 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * // Check invalid item usage. INVALID_IF(ctx->gimmick == GIMMICK_MEGA && holdEffect != HOLD_EFFECT_MEGA_STONE && species != SPECIES_RAYQUAZA, "Cannot Mega Evolve without a Mega Stone"); INVALID_IF(ctx->gimmick == GIMMICK_Z_MOVE && holdEffect != HOLD_EFFECT_Z_CRYSTAL, "Cannot use a Z-Move without a Z-Crystal"); - INVALID_IF(ctx->gimmick == GIMMICK_Z_MOVE && ItemId_GetSecondaryId(item) != gMovesInfo[*moveId].type + INVALID_IF(ctx->gimmick == GIMMICK_Z_MOVE && ItemId_GetSecondaryId(item) != GetMoveType(*moveId) && GetSignatureZMove(*moveId, species, item) == MOVE_NONE && *moveId != MOVE_PHOTON_GEYSER, // exception because test won't recognize Ultra Necrozma pre-Burst "Cannot turn %S into a Z-Move with %S", GetMoveName(ctx->move), ItemId_GetName(item)); @@ -2184,7 +2185,7 @@ void Move(u32 sourceLine, struct BattlePokemon *battler, struct MoveContext ctx) MoveGetIdAndSlot(battlerId, &ctx, &moveId, &moveSlot, sourceLine); target = MoveGetTarget(battlerId, moveId, &ctx, sourceLine); - if (gMovesInfo[moveId].effect == EFFECT_REVIVAL_BLESSING) + if (GetMoveEffect(moveId) == EFFECT_REVIVAL_BLESSING) requirePartyIndex = MoveGetFirstFainted(battlerId) != PARTY_SIZE; // Check party menu moves. diff --git a/test/text.c b/test/text.c index ed343d1039..7650c2dd59 100644 --- a/test/text.c +++ b/test/text.c @@ -23,10 +23,10 @@ TEST("Move names fit on Pokemon Summary Screen") u32 move = MOVE_NONE; for (i = 1; i < MOVES_COUNT; i++) { - PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } + PARAMETRIZE_LABEL("%S", GetMoveName(i)) { move = i; } } - //DebugPrintf("Move %d: %S", GetStringWidth(fontId, gMovesInfo[move].name, 0), gMovesInfo[move].name); - EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); + //DebugPrintf("Move %d: %S", GetStringWidth(fontId, GetMoveName(move), 0), GetMoveName(move)); + EXPECT_LE(GetStringWidth(fontId, GetMoveName(move), 0), widthPx); } TEST("Move names fit on Battle Screen") @@ -36,9 +36,9 @@ TEST("Move names fit on Battle Screen") u32 move = MOVE_NONE; for (i = 1; i < MOVES_COUNT; i++) { - PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } + PARAMETRIZE_LABEL("%S", GetMoveName(i)) { move = i; } } - EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); + EXPECT_LE(GetStringWidth(fontId, GetMoveName(move), 0), widthPx); } TEST("Move names fit on Contest Screen") @@ -48,7 +48,7 @@ TEST("Move names fit on Contest Screen") u32 move = MOVE_NONE; for (i = 1; i < MOVES_COUNT; i++) { - PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } + PARAMETRIZE_LABEL("%S", GetMoveName(i)) { move = i; } } // All moves explicitly listed here are too big to fit. switch (move) @@ -56,10 +56,10 @@ TEST("Move names fit on Contest Screen") case MOVE_STOMPING_TANTRUM: case MOVE_NATURES_MADNESS: case MOVE_DOUBLE_IRON_BASH: - EXPECT_GT(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); + EXPECT_GT(GetStringWidth(fontId, GetMoveName(move), 0), widthPx); break; default: - EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); + EXPECT_LE(GetStringWidth(fontId, GetMoveName(move), 0), widthPx); break; } } @@ -71,9 +71,9 @@ TEST("Move names fit on TMs & HMs Bag Screen") u32 move = MOVE_NONE; for (i = 1; i < MOVES_COUNT; i++) { - PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } + PARAMETRIZE_LABEL("%S", GetMoveName(i)) { move = i; } } - EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); + EXPECT_LE(GetStringWidth(fontId, GetMoveName(move), 0), widthPx); } TEST("Move names fit on Move Relearner Screen") @@ -83,9 +83,9 @@ TEST("Move names fit on Move Relearner Screen") u32 move = MOVE_NONE; for (i = 1; i < MOVES_COUNT; i++) { - PARAMETRIZE_LABEL("%S", gMovesInfo[i].name) { move = i; } + PARAMETRIZE_LABEL("%S", GetMoveName(i)) { move = i; } } - EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].name, 0), widthPx); + EXPECT_LE(GetStringWidth(fontId, GetMoveName(move), 0), widthPx); } TEST("Move descriptions fit on Pokemon Summary Screen") @@ -95,9 +95,9 @@ TEST("Move descriptions fit on Pokemon Summary Screen") u32 move = MOVE_NONE; for (i = 1; i < MOVES_COUNT; i++) { - PARAMETRIZE_LABEL("%S", gMovesInfo[i].description) { move = i; } + PARAMETRIZE_LABEL("%S", GetMoveDescription(i)) { move = i; } } - EXPECT_LE(GetStringWidth(fontId, gMovesInfo[move].description, 0), widthPx); + EXPECT_LE(GetStringWidth(fontId, GetMoveDescription(move), 0), widthPx); } TEST("Item names fit on Bag Screen (list)") @@ -612,8 +612,8 @@ TEST("Battle strings fit on the battle message window") sBattlerAbilities[j] = longAbilityID; // Set Trainers - gTrainerBattleOpponent_A = 1; - gTrainerBattleOpponent_B = 1; + TRAINER_BATTLE_PARAM.opponentA = 1; + TRAINER_BATTLE_PARAM.opponentB = 1; // Set battler to 1, so "The opposing " is prefixed when refering to battlers. gBattleTypeFlags |= BATTLE_TYPE_TRAINER; diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index d94a60a113..b301ddf552 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -16,8 +16,9 @@ #define MAX_TRAINER_AI_FLAGS 32 #define MAX_TRAINER_ITEMS 4 -#define PARTY_SIZE 6 +#define PARTY_SIZE 255 #define MAX_MON_MOVES 4 +#define MAX_MON_TAGS 32 struct String { @@ -82,6 +83,10 @@ struct Pokemon struct String moves[MAX_MON_MOVES]; int moves_n; int move1_line; + + struct String tags[MAX_MON_TAGS]; + int tags_n; + int tags_line; }; struct Trainer @@ -123,6 +128,21 @@ struct Trainer struct String starting_status; int starting_status_line; + + struct String difficulty; + int difficulty_line; + + int party_size; + int party_size_line; + + struct String pool_rules; + int pool_rules_line; + + struct String pool_pick_functions; + int pool_pick_functions_line; + + struct String pool_prune; + int pool_prune_line; }; static bool is_empty_string(struct String s) @@ -1195,9 +1215,45 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct trainer->starting_status_line = value.location.line; trainer->starting_status = token_string(&value); } + else if (is_literal_token(&key, "Difficulty")) + { + if (trainer->difficulty_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Difficulty'"); + trainer->difficulty_line = value.location.line; + trainer->difficulty = token_string(&value); + } + else if (is_literal_token(&key, "Party Size")) + { + if (trainer->party_size_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Party Size'"); + trainer->party_size_line = value.location.line; + if (!token_int(p, &value, &trainer->party_size)) + any_error = !show_parse_error(p); + } + else if (is_literal_token(&key, "Pool Rules")) + { + if (trainer->pool_rules_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Pool Rules'"); + trainer->pool_rules_line = value.location.line; + trainer->pool_rules = token_string(&value); + } + else if (is_literal_token(&key, "Pool Pick Functions")) + { + if (trainer->pool_pick_functions_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Pool Pick Function'"); + trainer->pool_pick_functions_line = value.location.line; + trainer->pool_pick_functions = token_string(&value); + } + else if (is_literal_token(&key, "Pool Prune")) + { + if (trainer->pool_prune_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Pool Prune'"); + trainer->pool_prune_line = value.location.line; + trainer->pool_prune = token_string(&value); + } else { - any_error = !set_show_parse_error(p, key.location, "expected one of 'Name', 'Class', 'Pic', 'Gender', 'Music', 'Items', 'Double Battle', or 'AI'"); + any_error = !set_show_parse_error(p, key.location, "expected one of 'Name', 'Class', 'Pic', 'Gender', 'Music', 'Items', 'Double Battle', 'Difficulty', 'Party Size', 'Pool Rules', 'Pool Pick Functions', 'Pool Prune' or 'AI'"); } } if (!trainer->pic_line) @@ -1361,6 +1417,14 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct pokemon->tera_type_line = value.location.line; pokemon->tera_type = token_string(&value); } + else if (is_literal_token(&key, "Tags")) + { + if (pokemon->tags_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Tags'"); + pokemon->tags_line = value.location.line; + if (!token_human_identifiers(p, &value, pokemon->tags, &pokemon->tags_n, MAX_MON_TAGS)) + any_error = !show_parse_error(p); + } else { any_error = !set_show_parse_error(p, key.location, "expected one of 'EVs', 'IVs', 'Ability', 'Level', 'Ball', 'Happiness', 'Nature', 'Shiny', 'Dynamax Level', 'Gigantamax', or 'Tera Type'"); @@ -1424,6 +1488,11 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct } } + if (trainer->party_size_line && trainer->party_size > trainer->pokemon_n) + { + set_show_parse_error(p, p->location, "partySize larger than supplied pool"); + } + return !any_error; } @@ -1618,7 +1687,14 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par { struct Trainer *trainer = &parsed->trainers[i]; fprintf(f, "#line %d\n", trainer->id_line); - fprintf(f, " ["); + if (is_empty_string(trainer->difficulty)) + trainer->difficulty = literal_string("Normal"); + else + fprintf(f, "#line %d\n", trainer->difficulty_line); + fprint_constant(f, " [DIFFICULTY",trainer->difficulty); + fprintf(f, "]"); + + fprintf(f, "["); fprint_string(f, trainer->id); fprintf(f, "] =\n"); fprintf(f, " {\n"); @@ -1705,7 +1781,6 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par if (!is_empty_string(trainer->mugshot)) { fprintf(f, "#line %d\n", trainer->mugshot_line); - fprintf(f, " .mugshotEnabled = TRUE,\n"); fprintf(f, " .mugshotColor = "); fprint_constant(f, "MUGSHOT_COLOR", trainer->mugshot); fprintf(f, ",\n"); @@ -1719,9 +1794,44 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, ",\n"); } - fprintf(f, " .partySize = %d,\n", trainer->pokemon_n); - fprintf(f, " .party = (const struct TrainerMon[])\n"); - fprintf(f, " {\n"); + if (!is_empty_string(trainer->pool_rules)) + { + fprintf(f, "#line %d\n", trainer->pool_rules_line); + fprintf(f, " .poolRuleIndex = "); + fprint_constant(f, "POOL_RULESET", trainer->pool_rules); + fprintf(f, ",\n"); + } + + if (!is_empty_string(trainer->pool_pick_functions)) + { + fprintf(f, "#line %d\n", trainer->pool_pick_functions_line); + fprintf(f, " .poolPickIndex = "); + fprint_constant(f, "POOL_PICK", trainer->pool_pick_functions); + fprintf(f, ",\n"); + } + + if (!is_empty_string(trainer->pool_prune)) + { + fprintf(f, "#line %d\n", trainer->pool_prune_line); + fprintf(f, " .poolPruneIndex = "); + fprint_constant(f, "POOL_PRUNE", trainer->pool_prune); + fprintf(f, ",\n"); + } + + if (trainer->party_size_line) + { + fprintf(f, "#line %d\n", trainer->party_size_line); + fprintf(f, " .partySize = %d,\n", trainer->party_size); + fprintf(f, " .poolSize = %d,\n", trainer->pokemon_n); + fprintf(f, " .party = (const struct TrainerMon[])\n"); + fprintf(f, " {\n"); + } + else + { + fprintf(f, " .partySize = %d,\n", trainer->pokemon_n); + fprintf(f, " .party = (const struct TrainerMon[])\n"); + fprintf(f, " {\n"); + } for (int j = 0; j < trainer->pokemon_n; j++) { struct Pokemon *pokemon = &trainer->pokemon[j]; @@ -1742,17 +1852,17 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par switch (pokemon->gender) { - case GENDER_ANY: - fprintf(f, " .gender = TRAINER_MON_RANDOM_GENDER,\n"); - break; - case GENDER_MALE: - fprintf(f, "#line %d\n", pokemon->header_line); - fprintf(f, " .gender = TRAINER_MON_MALE,\n"); - break; - case GENDER_FEMALE: - fprintf(f, "#line %d\n", pokemon->header_line); - fprintf(f, " .gender = TRAINER_MON_FEMALE,\n"); - break; + case GENDER_ANY: + fprintf(f, " .gender = TRAINER_MON_RANDOM_GENDER,\n"); + break; + case GENDER_MALE: + fprintf(f, "#line %d\n", pokemon->header_line); + fprintf(f, " .gender = TRAINER_MON_MALE,\n"); + break; + case GENDER_FEMALE: + fprintf(f, "#line %d\n", pokemon->header_line); + fprintf(f, " .gender = TRAINER_MON_FEMALE,\n"); + break; } if (!is_empty_string(pokemon->item)) @@ -1857,6 +1967,19 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, ",\n"); } + if (pokemon->tags_line) + { + fprintf(f, "#line %d\n", pokemon->tags_line); + fprintf(f, " .tags = "); + for (int i = 0; i < pokemon->tags_n; i++) + { + if (i > 0) + fprintf(f, " | "); + fprint_constant(f, "MON_POOL_TAG", pokemon->tags[i]); + } + fprintf(f, ",\n"); + } + if (pokemon->moves_n > 0) { fprintf(f, " .moves = {\n");