diff --git a/.gitignore b/.gitignore index 082430d794..9fa431e143 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,6 @@ sound/**/*.bin sound/songs/midi/*.s tools/agbcc *.map -*.ld *.bat *.dump *.sa* diff --git a/INSTALL.md b/INSTALL.md index 01fbd5ceef..7ffcdee07b 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -33,27 +33,23 @@ WSL1 is the preferred terminal to build **pokeemerald**. The following instructi - Otherwise, **open WSL** and go to [Choosing where to store pokeemerald (WSL1)](#Choosing-where-to-store-pokeemerald-WSL1). ### Installing WSL1 -1. Open [Windows Powershell **as Administrator**](https://i.imgur.com/QKmVbP9.png), and run the following command (Right Click or Shift+Insert is paste in the Powershell). +1. Open [Windows Powershell **as Administrator**](https://i.imgur.com/QKmVbP9.png), and run the following commands (Right Click or Shift+Insert is paste in the Powershell). ```powershell - dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart + wsl --install -d Ubuntu --enable-wsl1 ``` 2. Once the process finishes, restart your machine. -3. The next step is to choose and install a Linux distribution from the Microsoft Store. The following instructions will assume Ubuntu as the Linux distribution of choice. +3. Open Windows Powershell **as Administrator** again (after restarting), and run the following command to configure Ubuntu to use WSL1. + + ```powershell + wsl --set-version Ubuntu 1 + ```
- Note for advanced users... + Note... - > You can pick a preferred Linux distribution, but setup instructions may differ. Debian should work with the given instructions, but has not been tested. -
- -4. Open the [Microsoft Store Linux Selection](https://aka.ms/wslstore), click Ubuntu, then click Get, which will install the Ubuntu distribution. -
- Notes... - - > Note 1: If a dialog pops up asking for you to sign into a Microsoft Account, then just close the dialog. - > Note 2: If the link does not work, then open the Microsoft Store manually, and search for the Ubuntu app (choose the one with no version number). + > WSL may open automatically after restarting, but you can ignore it for now.
### Setting up WSL1 @@ -125,19 +121,53 @@ Otherwise, ask for help on Discord or IRC (see [README.md](README.md)), or conti Note that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert. -1. Open msys2 at C:\devkitPro\msys2\mingw64.exe or run `C:\devkitPro\msys2\msys2_shell.bat -mingw64`. +1. Open msys2 at C:\devkitPro\msys2\msys2_shell.bat. -2. Certain packages are required to build pokeemerald. Install these by running the following command: +2. Certain packages are required to build pokeemerald. Install these by running the following two commands: ```bash - pacman -S make zlib-devel git mingw-w64-x86_64-gcc mingw-w64-x86_64-libpng + pacman -Sy msys2-keyring + pacman -S make gcc zlib-devel git ```
Note... - > This command will ask for confirmation, just enter the yes action when prompted. + > The commands will ask for confirmation, just enter the yes action when prompted.
+3. Download [libpng](https://sourceforge.net/projects/libpng/files/libpng16/1.6.37/libpng-1.6.37.tar.xz/download). + +4. Change directory to where libpng was downloaded. By default, msys2 will start in the current user's profile folder, located at **C:\Users\\⁠_\_**, where *\* is your Windows username. In most cases, libpng should be saved within a subfolder of the profile folder. For example, if libpng was saved to **C:\Users\\_\_\Downloads** (the Downloads location for most users), enter this command: + + ```bash + cd Downloads + ``` + +
+ Notes... + + > Note 1: While not shown, msys uses forward slashes `/` instead of backwards slashes `\` as the directory separator. + > Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "Downloads/My Downloads"`. + > Note 3: Windows path names are case-insensitive so adhering to capitalization isn’t needed. + > Note 4: If libpng was saved elsewhere, you will need to specify the full path to where libpng was downloaded, e.g. `cd c:/devkitpro/msys2` if it was saved there. +
+ +5. Run the following commands to uncompress and install libpng. + + ```bash + tar xf libpng-1.6.37.tar.xz + cd libpng-1.6.37 + ./configure --prefix=/usr + make check + make install + ``` + +6. Then finally, run the following command to change back to the user profile folder. + + ```bash + cd + ``` + ### Choosing where to store pokeemerald (msys2) At this point, you can choose a folder to store pokeemerald into. If you're okay with storing pokeemerald in the user profile folder, then proceed to [Installation](#installation). Otherwise, you'll need to account for where pokeemerald is stored when changing directory to the pokeemerald folder. @@ -320,6 +350,13 @@ Then proceed to [Choosing where to store pokeemerald (Linux)](#choosing-where-to > [install devkitARM on Arch Linux](#installing-devkitarm-on-arch-linux). +### NixOS +Run the following command to start an interactive shell with the necessary packages: +```bash +nix-shell -p pkgsCross.arm-embedded.stdenv.cc git pkg-config libpng +``` +Then proceed to [Choosing where to store pokeemerald (Linux)](#choosing-where-to-store-pokeemerald-linux). + ### Other distributions _(Specific instructions for other distributions would be greatly appreciated!)_ diff --git a/Makefile b/Makefile index 50a7e0d255..bf74e0331a 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ LD := $(PREFIX)ld # note: the makefile must be set up so MODERNCC is never called # if MODERN=0 MODERNCC := $(PREFIX)gcc -PATH_MODERNCC := PATH=$(TOOLCHAIN)/bin:PATH $(MODERNCC) +PATH_MODERNCC := PATH="$(PATH)" $(MODERNCC) ifeq ($(OS),Windows_NT) EXE := .exe @@ -73,7 +73,7 @@ MODERN_ELF_NAME := $(MODERN_ROM_NAME:.gba=.elf) MODERN_MAP_NAME := $(MODERN_ROM_NAME:.gba=.map) MODERN_OBJ_DIR_NAME := build/modern -SHELL := /bin/bash -o pipefail +SHELL := bash -o pipefail ELF = $(ROM:.gba=.elf) MAP = $(ROM:.gba=.map) @@ -119,8 +119,6 @@ ifneq ($(MODERN),1) CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef endif -LDFLAGS = -Map ../../$(MAP) - SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c GFX := tools/gbagfx/gbagfx$(EXE) AIF := tools/aif2pcm/aif2pcm$(EXE) @@ -236,8 +234,7 @@ clean-tools: @$(foreach tooldir,$(TOOLDIRS),$(MAKE) clean -C $(tooldir);) mostlyclean: tidynonmodern tidymodern - rm -f $(SAMPLE_SUBDIR)/*.bin - rm -f $(CRY_SUBDIR)/*.bin + find sound -iname '*.bin' -exec rm {} + rm -f $(MID_SUBDIR)/*.s find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.rl' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + rm -f $(DATA_ASM_SUBDIR)/layouts/layouts.inc $(DATA_ASM_SUBDIR)/layouts/layouts_table.inc @@ -314,7 +311,7 @@ ifeq ($(NODEP),1) $(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.c ifeq (,$(KEEP_TEMPS)) @echo "$(CC1) -o $@ $<" - @$(CPP) $(CPPFLAGS) $< | $(PREPROC) $< charmap.txt -i | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ - + @$(CPP) $(CPPFLAGS) $< | $(PREPROC) -i $< charmap.txt | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ - else @$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i @$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s @@ -326,7 +323,7 @@ define C_DEP $1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2) ifeq (,$$(KEEP_TEMPS)) @echo "$$(CC1) -o $$@ $$<" - @$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ - + @$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) -i $$< charmap.txt | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ - else @$$(CPP) $$(CPPFLAGS) $$< -o $$(C_BUILDDIR)/$3.i @$$(PREPROC) $$(C_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(C_BUILDDIR)/$3.s @@ -341,7 +338,7 @@ ifeq ($(NODEP),1) $(GFLIB_BUILDDIR)/%.o: $(GFLIB_SUBDIR)/%.c $$(c_dep) ifeq (,$(KEEP_TEMPS)) @echo "$(CC1) -o $@ $<" - @$(CPP) $(CPPFLAGS) $< | $(PREPROC) $< charmap.txt -i | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ - + @$(CPP) $(CPPFLAGS) $< | $(PREPROC) -i $< charmap.txt | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ - else @$(CPP) $(CPPFLAGS) $< -o $(GFLIB_BUILDDIR)/$*.i @$(PREPROC) $(GFLIB_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(GFLIB_BUILDDIR)/$*.s @@ -353,7 +350,7 @@ define GFLIB_DEP $1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2) ifeq (,$$(KEEP_TEMPS)) @echo "$$(CC1) -o $$@ $$<" - @$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ - + @$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) -i $$< charmap.txt | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ - else @$$(CPP) $$(CPPFLAGS) $$< -o $$(GFLIB_BUILDDIR)/$3.i @$$(PREPROC) $$(GFLIB_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(GFLIB_BUILDDIR)/$3.s @@ -366,11 +363,11 @@ endif ifeq ($(NODEP),1) $(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s - $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@ + $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(PREPROC) -i $$< charmap.txt | $(AS) $(ASFLAGS) -o $@ else define SRC_ASM_DATA_DEP $1: $2 $$(shell $(SCANINC) -I include -I "" $2) - $$(PREPROC) $$< charmap.txt | $$(CPP) -I include - | $$(AS) $$(ASFLAGS) -o $$@ + $$(PREPROC) $$< charmap.txt | $$(CPP) -I include - | $$(PREPROC) -ie $$< charmap.txt | $$(AS) $$(ASFLAGS) -o $$@ endef $(foreach src, $(C_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o, $(src)),$(src)))) endif @@ -388,7 +385,7 @@ endif ifeq ($(NODEP),1) $(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s - $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@ + $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(PREPROC) -ie $$< charmap.txt | $(AS) $(ASFLAGS) -o $@ else $(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src)))) endif @@ -407,19 +404,20 @@ $(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt $(RAMSCRGEN) ewram_data $< ENGLISH > $@ ifeq ($(MODERN),0) -LD_SCRIPT := ld_script.txt +LD_SCRIPT := ld_script.ld LD_SCRIPT_DEPS := $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld else -LD_SCRIPT := ld_script_modern.txt +LD_SCRIPT := ld_script_modern.ld LD_SCRIPT_DEPS := endif $(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS) cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld +LDFLAGS = -Map ../../$(MAP) $(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ " - @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ $(OBJS_REL) $(LIB) + @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent $(ROM): $(ELF) diff --git a/README.md b/README.md index c23965485f..d9148b32ec 100644 --- a/README.md +++ b/README.md @@ -8,24 +8,4 @@ It builds the following ROM: To set up the repository, see [INSTALL.md](INSTALL.md). - -## See also - -Other disassembly and/or decompilation projects: -* [**Pokémon Red and Blue**](https://github.com/pret/pokered) -* [**Pokémon Gold and Silver (Space World '97 demo)**](https://github.com/pret/pokegold-spaceworld) -* [**Pokémon Yellow**](https://github.com/pret/pokeyellow) -* [**Pokémon Trading Card Game**](https://github.com/pret/poketcg) -* [**Pokémon Pinball**](https://github.com/pret/pokepinball) -* [**Pokémon Stadium**](https://github.com/pret/pokestadium) -* [**Pokémon Gold and Silver**](https://github.com/pret/pokegold) -* [**Pokémon Crystal**](https://github.com/pret/pokecrystal) -* [**Pokémon Ruby and Sapphire**](https://github.com/pret/pokeruby) -* [**Pokémon Pinball: Ruby & Sapphire**](https://github.com/pret/pokepinballrs) -* [**Pokémon FireRed and LeafGreen**](https://github.com/pret/pokefirered) -* [**Pokémon Mystery Dungeon: Red Rescue Team**](https://github.com/pret/pmd-red) - - -## Contacts - -You can find us on [Discord](https://discord.gg/d5dubZ3) and [IRC](https://web.libera.chat/?#pret). +For contacts and other pret projects, see [pret.github.io](https://pret.github.io/). diff --git a/asm/macros/battle_frontier/frontier_util.inc b/asm/macros/battle_frontier/frontier_util.inc index c875fcdde2..e40eccb5e7 100644 --- a/asm/macros/battle_frontier/frontier_util.inc +++ b/asm/macros/battle_frontier/frontier_util.inc @@ -1,4 +1,4 @@ - @ Get the status (CHALLENGE_STATUS_*) of the current challenge and store the result in VAR_TEMP_0 + @ Get the status (CHALLENGE_STATUS_*) of the current challenge and store the result in VAR_TEMP_CHALLENGE_STATUS .macro frontier_getstatus setvar VAR_0x8004, FRONTIER_UTIL_FUNC_GET_STATUS special CallFrontierUtilFunc diff --git a/asmdiff.sh b/asmdiff.sh index f5a7010747..aca670e324 100755 --- a/asmdiff.sh +++ b/asmdiff.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash if [[ -d "$DEVKITARM/bin/" ]]; then OBJDUMP_BIN="$DEVKITARM/bin/arm-none-eabi-objdump" diff --git a/constants/constants.inc b/constants/constants.inc index e7561f4293..1f8f1cda2e 100644 --- a/constants/constants.inc +++ b/constants/constants.inc @@ -1,2 +1,3 @@ .include "constants/gba_constants.inc" .include "constants/global.inc" + .include "constants/tms_hms.inc" diff --git a/constants/gba_constants.inc b/constants/gba_constants.inc index 3ff857ee8d..9f51b0f02b 100644 --- a/constants/gba_constants.inc +++ b/constants/gba_constants.inc @@ -1,3 +1,6 @@ +#ifndef GUARD_CONSTANTS_GBA_CONSTANTS_INC +#define GUARD_CONSTANTS_GBA_CONSTANTS_INC + .set PSR_USR_MODE, 0x00000010 .set PSR_FIQ_MODE, 0x00000011 .set PSR_IRQ_MODE, 0x00000012 @@ -511,3 +514,5 @@ .set BLDCNT_TGT2_OBJ, 1 << 12 .set BLDCNT_TGT2_BD, 1 << 13 .set BLDCNT_TGT2_ALL, BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD + +#endif @ GUARD_CONSTANTS_GBA_CONSTANTS_INC diff --git a/constants/global.inc b/constants/global.inc index 621ba2af89..b9462fa26b 100644 --- a/constants/global.inc +++ b/constants/global.inc @@ -1,3 +1,6 @@ +#ifndef GUARD_CONSTANTS_GLOBAL_INC +#define GUARD_CONSTANTS_GLOBAL_INC + .set TRUE, 1 .set FALSE, 0 @@ -20,3 +23,5 @@ .set OBJ_IMAGE_ANIM_H_FLIP, 1 << 6 .set OBJ_IMAGE_ANIM_V_FLIP, 1 << 7 + +#endif @ GUARD_CONSTANTS_GLOBAL_INC diff --git a/constants/m4a_constants.inc b/constants/m4a_constants.inc index 1a744dc7fb..2599b6c4aa 100644 --- a/constants/m4a_constants.inc +++ b/constants/m4a_constants.inc @@ -1,3 +1,6 @@ +#ifndef GUARD_CONSTANTS_M4A_CONSTANTS_INC +#define GUARD_CONSTANTS_M4A_CONSTANTS_INC + .equiv ID_NUMBER, 0x68736d53 .equiv PCM_DMA_BUF_SIZE, 1584 @@ -250,3 +253,5 @@ struct_field o_CgbChannel_nextChannelPointer, 4 struct_field o_CgbChannel_dummy4, 8 struct_field CgbChannel_size, 0 + +#endif @ GUARD_CONSTANTS_M4A_CONSTANTS_INC diff --git a/constants/tms_hms.inc b/constants/tms_hms.inc new file mode 100644 index 0000000000..4ce6d90328 --- /dev/null +++ b/constants/tms_hms.inc @@ -0,0 +1,22 @@ +#ifndef GUARD_CONSTANTS_TMS_HMS_INC +#define GUARD_CONSTANTS_TMS_HMS_INC + +#include "constants/tms_hms.h" + +/* Expands to: +* enum_start ITEM_TM01 +* enum ITEM_TM_FOCUS_PUNCH +* ... +* enum_start ITEM_HM01 +* enum ITEM_HM_CUT +* ... */ +#define EQUIV_TM(id) enum ITEM_TM_ ## id; +#define EQUIV_HM(id) enum ITEM_HM_ ## id; + enum_start ITEM_TM01 +FOREACH_TM(EQUIV_TM) + enum_start ITEM_HM01 +FOREACH_HM(EQUIV_HM) +#undef EQUIV_TM +#undef EQUIV_HM + +#endif @ GUARD_CONSTANTS_TMS_HMS_INC diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index bdc80cd5b4..a43c889502 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -1,3 +1,4 @@ +#include "config.h" #include "constants/battle.h" #include "constants/battle_ai.h" #include "constants/abilities.h" @@ -6,6 +7,7 @@ #include "constants/battle_move_effects.h" #include "constants/hold_effects.h" #include "constants/pokemon.h" + .include "asm/macros.inc" .include "asm/macros/battle_ai_script.inc" .include "constants/constants.inc" @@ -1925,19 +1927,19 @@ AI_CV_Protect_End: @ BUG: Foresight is only encouraged if the user is Ghost type or @ has high evasion, but should check target instead AI_CV_Foresight: -.ifdef BUGFIX +#ifdef BUGFIX get_target_type1 if_equal TYPE_GHOST, AI_CV_Foresight2 get_target_type2 if_equal TYPE_GHOST, AI_CV_Foresight2 if_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_Foresight3 -.else +#else get_user_type1 if_equal TYPE_GHOST, AI_CV_Foresight2 get_user_type2 if_equal TYPE_GHOST, AI_CV_Foresight2 if_stat_level_more_than AI_USER, STAT_EVASION, 8, AI_CV_Foresight3 -.endif +#endif score -2 goto AI_CV_Foresight_End @@ -2182,13 +2184,13 @@ AI_CV_SemiInvulnerable2: if_status2 AI_TARGET, STATUS2_CURSED, AI_CV_SemiInvulnerable_TryEncourage if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_SemiInvulnerable_TryEncourage get_weather -.ifdef BUGFIX +#ifdef BUGFIX if_equal AI_WEATHER_HAIL, AI_CV_SemiInvulnerable_CheckIceType if_equal AI_WEATHER_SANDSTORM, AI_CV_SemiInvulnerable_CheckSandstormTypes -.else +#else if_equal AI_WEATHER_HAIL, AI_CV_SemiInvulnerable_CheckSandstormTypes if_equal AI_WEATHER_SANDSTORM, AI_CV_SemiInvulnerable_CheckIceType -.endif +#endif goto AI_CV_SemiInvulnerable5 AI_CV_SemiInvulnerable_CheckSandstormTypes: @@ -2253,11 +2255,11 @@ AI_CV_Hail_End: @ BUG: Facade score is increased if the target is statused, but should be if the user is AI_CV_Facade: -.ifdef BUGFIX +#ifdef BUGFIX if_not_status AI_USER, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, AI_CV_Facade_End -.else +#else if_not_status AI_TARGET, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, AI_CV_Facade_End -.endif +#endif score +1 AI_CV_Facade_End: end @@ -3175,9 +3177,9 @@ AI_HPAware_DiscouragedEffectsWhenTargetLowHP: AI_TrySunnyDayStart: if_target_is_ally AI_TryOnAlly if_not_effect EFFECT_SUNNY_DAY, AI_TrySunnyDayStart_End -.ifndef BUGFIX @ funcResult has not been set in this script yet, below call is nonsense +#ifndef BUGFIX @ funcResult has not been set in this script yet, below call is nonsense if_equal FALSE, AI_TrySunnyDayStart_End -.endif +#endif is_first_turn_for AI_USER if_equal FALSE, AI_TrySunnyDayStart_End score +5 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7e99911b19..0c0dc72831 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -533,7 +533,7 @@ BattleScript_EffectEvasionDown:: setstatchanger STAT_EVASION, 1, TRUE BattleScript_EffectStatDown:: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce + jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_FailedFromAtkString accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce @@ -1216,7 +1216,7 @@ BattleScript_EffectPsywave:: BattleScript_EffectCounter:: attackcanceler - counterdamagecalculator BattleScript_ButItFailedAtkStringPpReduce + counterdamagecalculator BattleScript_FailedFromAtkString accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce @@ -1543,7 +1543,7 @@ BattleScript_EffectEndure:: BattleScript_EffectSpikes:: attackcanceler - trysetspikes BattleScript_ButItFailedAtkStringPpReduce + trysetspikes BattleScript_FailedFromAtkString attackstring ppreduce attackanimation @@ -1800,7 +1800,7 @@ BattleScript_EffectPsychUp:: BattleScript_EffectMirrorCoat:: attackcanceler - mirrorcoatdamagecalculator BattleScript_ButItFailedAtkStringPpReduce + mirrorcoatdamagecalculator BattleScript_FailedFromAtkString accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce @@ -2047,13 +2047,13 @@ BattleScript_AlreadyAtFullHp:: BattleScript_EffectFakeOut:: attackcanceler - jumpifnotfirstturn BattleScript_ButItFailedAtkStringPpReduce + jumpifnotfirstturn BattleScript_FailedFromAtkString setmoveeffect MOVE_EFFECT_FLINCH | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit -BattleScript_ButItFailedAtkStringPpReduce:: +BattleScript_FailedFromAtkString:: attackstring -BattleScript_ButItFailedPpReduce:: +BattleScript_FailedFromPpReduce:: ppreduce BattleScript_ButItFailed:: pause B_WAIT_TIME_SHORT @@ -2367,7 +2367,7 @@ BattleScript_EffectWish:: BattleScript_EffectAssist:: attackcanceler attackstring - assistattackselect BattleScript_ButItFailedPpReduce + assistattackselect BattleScript_FailedFromPpReduce attackanimation waitanimation setbyte sB_ANIM_TURN, 0 @@ -2391,7 +2391,7 @@ BattleScript_EffectSuperpower:: BattleScript_EffectMagicCoat:: attackcanceler - trysetmagiccoat BattleScript_ButItFailedAtkStringPpReduce + trysetmagiccoat BattleScript_FailedFromAtkString attackstring ppreduce attackanimation @@ -2542,7 +2542,7 @@ BattleScript_EffectGrudge:: BattleScript_EffectSnatch:: attackcanceler - trysetsnatch BattleScript_ButItFailedAtkStringPpReduce + trysetsnatch BattleScript_FailedFromAtkString attackstring ppreduce attackanimation @@ -3208,7 +3208,7 @@ BattleScript_DamagingWeatherLoop:: jumpifword CMP_EQUAL, gBattleMoveDamage, 0, BattleScript_DamagingWeatherLoopIncrement printfromtable gSandStormHailDmgStringIds waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE + orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE effectivenesssound hitanimation BS_ATTACKER healthbarupdate BS_ATTACKER @@ -3220,7 +3220,7 @@ BattleScript_DamagingWeatherLoopIncrement:: addbyte gBattleCommunication, 1 jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_DamagingWeatherLoop BattleScript_DamagingWeatherContinuesEnd:: - bicword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE + bicword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE end2 BattleScript_SandStormHailEnds:: diff --git a/data/contest_ai_scripts.s b/data/contest_ai_scripts.s index ecd3103ae2..affaf31d6d 100644 --- a/data/contest_ai_scripts.s +++ b/data/contest_ai_scripts.s @@ -1,3 +1,4 @@ +#include "config.h" #include "constants/global.h" #include "constants/contest.h" .include "asm/macros.inc" @@ -435,11 +436,11 @@ AI_CGM_BetterWhenAudienceExcited: AI_CGM_BetterWhenAudienceExcited_1stUp: @ BUG: Should be if_appeal_num_eq 0 @ 1st up on 1st appeal excitement will always be 0 -.ifdef BUGFIX +#ifdef BUGFIX if_appeal_num_eq 0, AI_CGM_BetterWhenAudienceExcited_1stAppeal -.else +#else if_appeal_num_not_eq 0, AI_CGM_BetterWhenAudienceExcited_1stAppeal -.endif +#endif if_excitement_eq 4, AI_CGM_BetterWhenAudienceExcited_1AwayFromMax if_excitement_eq 3, AI_CGM_BetterWhenAudienceExcited_2AwayFromMax end @@ -546,11 +547,11 @@ AI_CGM_TargetMonWithJudgesAttention: end AI_CGM_TargetMonWithJudgesAttention_CheckMon1: if_cannot_participate MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 -.ifdef BUGFIX +#ifdef BUGFIX if_not_used_combo_starter MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 -.else +#else if_used_combo_starter MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 -.endif +#endif if_random_less_than 125, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 score +2 if_not_completed_combo MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 @@ -559,11 +560,11 @@ AI_CGM_TargetMonWithJudgesAttention_CheckMon1: AI_CGM_TargetMonWithJudgesAttention_CheckMon2: if_user_order_eq MON_2, AI_CGM_End if_cannot_participate MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 -.ifdef BUGFIX +#ifdef BUGFIX if_not_used_combo_starter MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 -.else +#else if_used_combo_starter MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 -.endif +#endif if_random_less_than 125, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 score +2 if_not_completed_combo MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 @@ -572,11 +573,11 @@ AI_CGM_TargetMonWithJudgesAttention_CheckMon2: AI_CGM_TargetMonWithJudgesAttention_CheckMon3: if_user_order_eq MON_3, AI_CGM_End if_cannot_participate MON_3, AI_CGM_End -.ifdef BUGFIX +#ifdef BUGFIX if_not_used_combo_starter MON_3, AI_CGM_End -.else +#else if_used_combo_starter MON_3, AI_CGM_End -.endif +#endif if_random_less_than 125, AI_CGM_End score +2 if_not_completed_combo MON_3, AI_CGM_End diff --git a/data/event_scripts.s b/data/event_scripts.s index 1f3db6aa2b..e8fb9dcbd1 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -1,3 +1,4 @@ +#include "config.h" #include "constants/global.h" #include "constants/apprentice.h" #include "constants/battle.h" diff --git a/data/maps/AbandonedShip_HiddenFloorRooms/map.json b/data/maps/AbandonedShip_HiddenFloorRooms/map.json index e808250f47..08869317e3 100644 --- a/data/maps/AbandonedShip_HiddenFloorRooms/map.json +++ b/data/maps/AbandonedShip_HiddenFloorRooms/map.json @@ -50,8 +50,8 @@ "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "AbandonedShip_HiddenFloorRooms_EventScript_ItemTM18", - "flag": "FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM18" + "script": "AbandonedShip_HiddenFloorRooms_EventScript_ItemTMRainDance", + "flag": "FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", diff --git a/data/maps/AbandonedShip_Room_B1F/map.json b/data/maps/AbandonedShip_Room_B1F/map.json index 2a296325c9..ac9820a8ab 100644 --- a/data/maps/AbandonedShip_Room_B1F/map.json +++ b/data/maps/AbandonedShip_Room_B1F/map.json @@ -24,8 +24,8 @@ "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "AbandonedShip_Room_B1F_EventScript_ItemTM13", - "flag": "FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM13" + "script": "AbandonedShip_Room_B1F_EventScript_ItemTMIceBeam", + "flag": "FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM" } ], "warp_events": [ diff --git a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc index 9467f34197..5d9ee507ec 100644 --- a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc @@ -15,11 +15,11 @@ BattleFrontier_BattleArenaLobby_EventScript_TurnPlayerNorth:: end BattleFrontier_BattleArenaLobby_OnFrame: - map_script_2 VAR_TEMP_0, 0, BattleFrontier_BattleArenaLobby_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, BattleFrontier_BattleArenaLobby_EventScript_QuitWithoutSaving - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattleArenaLobby_EventScript_ResumeChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_WON, BattleFrontier_BattleArenaLobby_EventScript_WonChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_LOST, BattleFrontier_BattleArenaLobby_EventScript_LostChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, BattleFrontier_BattleArenaLobby_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, BattleFrontier_BattleArenaLobby_EventScript_QuitWithoutSaving + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattleArenaLobby_EventScript_ResumeChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_WON, BattleFrontier_BattleArenaLobby_EventScript_WonChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST, BattleFrontier_BattleArenaLobby_EventScript_LostChallenge .2byte 0 BattleFrontier_BattleArenaLobby_EventScript_GetChallengeStatus:: @@ -33,7 +33,7 @@ BattleFrontier_BattleArenaLobby_EventScript_QuitWithoutSaving:: arena_set ARENA_DATA_WIN_STREAK, 0 arena_set ARENA_DATA_WIN_STREAK_ACTIVE, FALSE frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0 - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -55,7 +55,7 @@ BattleFrontier_BattleArenaLobby_EventScript_GiveBattlePoints:: call BattleFrontier_BattleArenaLobby_EventScript_SaveAfterChallenge msgbox BattleFrontier_BattleArenaLobby_Text_AwaitAnotherChallenge2, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -67,7 +67,7 @@ BattleFrontier_BattleArenaLobby_EventScript_LostChallenge:: call BattleFrontier_BattleArenaLobby_EventScript_SaveAfterChallenge msgbox BattleFrontier_BattleArenaLobby_Text_AwaitAnotherChallenge2, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -101,7 +101,7 @@ BattleFrontier_BattleArenaLobby_EventScript_ResumeChallenge:: playse SE_SAVE waitse frontier_set FRONTIER_DATA_PAUSED, FALSE - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto BattleFrontier_BattleArenaLobby_EventScript_EnterChallenge BattleFrontier_BattleArenaLobby_EventScript_Attendant:: @@ -146,7 +146,7 @@ BattleFrontier_BattleArenaLobby_EventScript_TryEnterChallenge:: case MULTI_B_PRESSED, BattleFrontier_BattleArenaLobby_EventScript_LoadPartyAndCancelChallenge BattleFrontier_BattleArenaLobby_EventScript_SaveBeforeChallenge:: - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 frontier_set FRONTIER_DATA_SELECTED_MON_ORDER arena_init arena_set ARENA_DATA_WIN_STREAK_ACTIVE, TRUE @@ -156,7 +156,7 @@ BattleFrontier_BattleArenaLobby_EventScript_SaveBeforeChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleArenaLobby_EventScript_CancelChallengeSaveFailed BattleFrontier_BattleArenaLobby_EventScript_EnterChallenge:: special SavePlayerParty @@ -167,7 +167,7 @@ BattleFrontier_BattleArenaLobby_EventScript_EnterChallenge:: call_if_eq VAR_RESULT, FRONTIER_LVL_50, BattleFrontier_BattleArenaLobby_EventScript_WalkToDoorLv50 call_if_eq VAR_RESULT, FRONTIER_LVL_OPEN, BattleFrontier_BattleArenaLobby_EventScript_WalkToDoorLvOpen warp MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR, 9, 13 - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 waitstate end diff --git a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc index b972a0814c..9801b19fe5 100644 --- a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc @@ -21,11 +21,11 @@ BattleFrontier_BattleDomeLobby_EventScript_TurnPlayerNorth:: end BattleFrontier_BattleDomeLobby_OnFrame: - map_script_2 VAR_TEMP_0, 0, BattleFrontier_BattleDomeLobby_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, BattleFrontier_BattleDomeLobby_EventScript_QuitWithoutSaving - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattleDomeLobby_EventScript_ResumeChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_WON, BattleFrontier_BattleDomeLobby_EventScript_WonChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_LOST, BattleFrontier_BattleDomeLobby_EventScript_LostChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, BattleFrontier_BattleDomeLobby_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, BattleFrontier_BattleDomeLobby_EventScript_QuitWithoutSaving + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattleDomeLobby_EventScript_ResumeChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_WON, BattleFrontier_BattleDomeLobby_EventScript_WonChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST, BattleFrontier_BattleDomeLobby_EventScript_LostChallenge .2byte 0 BattleFrontier_BattleDomeLobby_EventScript_GetChallengeStatus:: @@ -40,7 +40,7 @@ BattleFrontier_BattleDomeLobby_EventScript_QuitWithoutSaving:: dome_set DOME_DATA_WIN_STREAK_ACTIVE, FALSE dome_set DOME_DATA_ATTEMPTED_CHALLENGE, TRUE frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0 - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -101,7 +101,7 @@ BattleFrontier_BattleDomeLobby_EventScript_RecordBattle:: BattleFrontier_BattleDomeLobby_EventScript_EndChallenge:: msgbox BattleFrontier_BattleDomeLobby_Text_HopeToSeeYouAgain, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -114,7 +114,7 @@ BattleFrontier_BattleDomeLobby_EventScript_ResumeChallenge:: playse SE_SAVE waitse frontier_set FRONTIER_DATA_PAUSED, FALSE - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto BattleFrontier_BattleDomeLobby_EventScript_EnterChallenge BattleFrontier_BattleDomeLobby_EventScript_SinglesAttendant:: @@ -173,7 +173,7 @@ BattleFrontier_BattleDomeLobby_EventScript_TryEnterChallenge:: case MULTI_B_PRESSED, BattleFrontier_BattleDomeLobby_EventScript_LoadPartyCancelChallenge BattleFrontier_BattleDomeLobby_EventScript_SaveBeforeChallenge:: - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 frontier_set FRONTIER_DATA_SELECTED_MON_ORDER dome_init frontier_set FRONTIER_DATA_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING @@ -182,7 +182,7 @@ BattleFrontier_BattleDomeLobby_EventScript_SaveBeforeChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleDomeLobby_EventScript_CancelChallengeSaveFailed dome_inittrainers BattleFrontier_BattleDomeLobby_EventScript_EnterChallenge:: @@ -194,7 +194,7 @@ BattleFrontier_BattleDomeLobby_EventScript_EnterChallenge:: call BattleFrontier_BattleDomeLobby_EventScript_WalkToDoor special HealPlayerParty warp MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR, 23, 6 - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 waitstate end diff --git a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc index 682b2c91d1..be9caa0cd7 100644 --- a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc @@ -16,11 +16,11 @@ BattleFrontier_BattleFactoryLobby_EventScript_TurnPlayerNorth:: end BattleFrontier_BattleFactoryLobby_OnFrame: - map_script_2 VAR_TEMP_0, 0, BattleFrontier_BattleFactoryLobby_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, BattleFrontier_BattleFactoryLobby_EventScript_QuitWithoutSaving - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattleFactoryLobby_EventScript_ResumeChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_WON, BattleFrontier_BattleFactoryLobby_EventScript_WonChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_LOST, BattleFrontier_BattleFactoryLobby_EventScript_LostChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, BattleFrontier_BattleFactoryLobby_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, BattleFrontier_BattleFactoryLobby_EventScript_QuitWithoutSaving + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattleFactoryLobby_EventScript_ResumeChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_WON, BattleFrontier_BattleFactoryLobby_EventScript_WonChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST, BattleFrontier_BattleFactoryLobby_EventScript_LostChallenge .2byte 0 BattleFrontier_BattleFactoryLobby_EventScript_GetChallengeStatus:: @@ -36,7 +36,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_QuitWithoutSaving:: factory_set FACTORY_DATA_WIN_STREAK, 0 factory_set FACTORY_DATA_WIN_STREAK_ACTIVE, FALSE frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0 - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -92,7 +92,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_RecordBattle:: BattleFrontier_BattleFactoryLobby_EventScript_EndRecordBattle:: msgbox BattleFrontier_BattleFactoryLobby_Text_LookForwardToNextVisit, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -104,7 +104,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_ResumeChallenge:: playse SE_SAVE waitse frontier_set FRONTIER_DATA_PAUSED, FALSE - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 setvar VAR_0x8006, 2 goto BattleFrontier_BattleFactoryLobby_EventScript_EnterChallenge @@ -152,7 +152,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_TryEnterChallenge:: case MULTI_B_PRESSED, BattleFrontier_BattleFactoryLobby_EventScript_LoadPartyAndCancelChallenge BattleFrontier_BattleFactoryLobby_EventScript_SaveBeforeChallenge:: - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 factory_init frontier_set FRONTIER_DATA_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING factory_set FACTORY_DATA_WIN_STREAK_ACTIVE, TRUE @@ -160,7 +160,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_SaveBeforeChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleFactoryLobby_EventScript_CancelChallengeSaveFailed setvar VAR_0x8006, 0 BattleFrontier_BattleFactoryLobby_EventScript_EnterChallenge:: @@ -173,7 +173,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_EnterChallenge:: applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryLobby_Movement_PlayerEnterDoor waitmovement 0 warp MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM, 8, 13 - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 waitstate end diff --git a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc index 2a8903fe6f..e38ec6f7db 100644 --- a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc @@ -16,11 +16,11 @@ BattleFrontier_BattlePalaceLobby_EventScript_TurnPlayerNorth:: end BattleFrontier_BattlePalaceLobby_OnFrame: - map_script_2 VAR_TEMP_0, 0, BattleFrontier_BattlePalaceLobby_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, BattleFrontier_BattlePalaceLobby_EventScript_QuitWithoutSaving - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattlePalaceLobby_EventScript_ResumeChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_WON, BattleFrontier_BattlePalaceLobby_EventScript_WonChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_LOST, BattleFrontier_BattlePalaceLobby_EventScript_LostChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, BattleFrontier_BattlePalaceLobby_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, BattleFrontier_BattlePalaceLobby_EventScript_QuitWithoutSaving + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattlePalaceLobby_EventScript_ResumeChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_WON, BattleFrontier_BattlePalaceLobby_EventScript_WonChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST, BattleFrontier_BattlePalaceLobby_EventScript_LostChallenge .2byte 0 BattleFrontier_BattlePalaceLobby_EventScript_GetChallengeStatus:: @@ -34,7 +34,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_QuitWithoutSaving:: palace_set PALACE_DATA_WIN_STREAK, 0 palace_set PALACE_DATA_WIN_STREAK_ACTIVE, FALSE frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0 - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -56,7 +56,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_GiveBattlePoints:: call BattleFrontier_BattlePalaceLobby_EventScript_SaveAfterChallenge msgbox BattleFrontier_BattlePalaceLobby_Text_ReturnWhenFortified, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -68,7 +68,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_LostChallenge:: call BattleFrontier_BattlePalaceLobby_EventScript_SaveAfterChallenge msgbox BattleFrontier_BattlePalaceLobby_Text_ReturnWhenFortified, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -103,7 +103,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_ResumeChallenge:: playse SE_SAVE waitse frontier_set FRONTIER_DATA_PAUSED, FALSE - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto BattleFrontier_BattlePalaceLobby_EventScript_EnterChallenge BattleFrontier_BattlePalaceLobby_EventScript_SinglesAttendant:: @@ -164,7 +164,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_TryEnterChallenge:: case MULTI_B_PRESSED, BattleFrontier_BattlePalaceLobby_EventScript_LoadPartyAndCancelChallenge BattleFrontier_BattlePalaceLobby_EventScript_SaveBeforeChallenge:: - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 frontier_set FRONTIER_DATA_SELECTED_MON_ORDER palace_init palace_set PALACE_DATA_WIN_STREAK_ACTIVE, TRUE @@ -174,7 +174,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_SaveBeforeChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, BattleFrontier_BattlePalaceLobby_EventScript_CancelChallengeSaveFailed BattleFrontier_BattlePalaceLobby_EventScript_EnterChallenge:: special SavePlayerParty @@ -183,7 +183,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_EnterChallenge:: closemessage call BattleFrontier_BattlePalaceLobby_EventScript_WalkToDoor warp MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR, 8, 13 - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 waitstate end diff --git a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc index 3e729e2121..faba545f0e 100644 --- a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc @@ -6,10 +6,10 @@ BattleFrontier_BattlePikeLobby_MapScripts:: .byte 0 BattleFrontier_BattlePikeLobby_OnFrame: - map_script_2 VAR_TEMP_0, 0, BattleFrontier_BattlePikeLobby_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, BattleFrontier_BattlePikeLobby_EventScript_QuitWithoutSaving - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_WON, BattleFrontier_BattlePikeLobby_EventScript_WonChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_LOST, BattleFrontier_BattlePikeLobby_EventScript_LostChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, BattleFrontier_BattlePikeLobby_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, BattleFrontier_BattlePikeLobby_EventScript_QuitWithoutSaving + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_WON, BattleFrontier_BattlePikeLobby_EventScript_WonChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST, BattleFrontier_BattlePikeLobby_EventScript_LostChallenge .2byte 0 BattleFrontier_BattlePikeLobby_OnWarp: @@ -34,7 +34,7 @@ BattleFrontier_BattlePikeLobby_EventScript_QuitWithoutSaving:: pike_set PIKE_DATA_WIN_STREAK, 0 pike_set PIKE_DATA_WIN_STREAK_ACTIVE, FALSE frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0 - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -67,7 +67,7 @@ BattleFrontier_BattlePikeLobby_EventScript_GiveBattlePoints:: waitse msgbox BattleFrontier_BattlePikeLobby_Text_LookForwardToSeeingYou, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -86,7 +86,7 @@ BattleFrontier_BattlePikeLobby_EventScript_LostChallenge:: waitse msgbox BattleFrontier_BattlePikeLobby_Text_LookForwardToSeeingYou, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -132,7 +132,7 @@ BattleFrontier_BattlePikeLobby_EventScript_TryEnterChallenge:: case MULTI_B_PRESSED, BattleFrontier_BattlePikeLobby_EventScript_LoadPartyAndCancelChallenge BattleFrontier_BattlePikeLobby_EventScript_SaveBeforeChallenge:: - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 setvar VAR_TEMP_1, 0 frontier_set FRONTIER_DATA_SELECTED_MON_ORDER pike_init @@ -144,7 +144,7 @@ BattleFrontier_BattlePikeLobby_EventScript_SaveBeforeChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 pike_savehelditems goto_if_eq VAR_RESULT, 0, BattleFrontier_BattlePikeLobby_EventScript_CancelChallengeSaveFailed special SavePlayerParty @@ -156,7 +156,7 @@ BattleFrontier_BattlePikeLobby_EventScript_SaveBeforeChallenge:: special HealPlayerParty call BattleFrontier_BattlePike_EventScript_CloseCurtain warpsilent MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR, 6, 7 - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 waitstate end diff --git a/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc b/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc index e95ca9dcea..3547871444 100644 --- a/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc @@ -7,9 +7,9 @@ BattleFrontier_BattlePikeThreePathRoom_MapScripts:: .byte 0 BattleFrontier_BattlePikeThreePathRoom_OnFrame: - map_script_2 VAR_TEMP_0, 0, BattleFrontier_BattlePikeThreePathRoom_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, BattleFrontier_BattlePikeThreePathRoom_EventScript_WarpToLobby - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattlePikeThreePathRoom_EventScript_ResumeChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, BattleFrontier_BattlePikeThreePathRoom_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, BattleFrontier_BattlePikeThreePathRoom_EventScript_WarpToLobby + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattlePikeThreePathRoom_EventScript_ResumeChallenge map_script_2 VAR_TEMP_5, 0, BattleFrontier_BattlePikeThreePathRoom_EventScript_SetHintRoom map_script_2 VAR_TEMP_5, 1, BattleFrontier_BattlePikeThreePathRoom_EventScript_GivePikeQueenHint .2byte 0 @@ -40,7 +40,7 @@ BattleFrontier_BattlePikeThreePathRoom_EventScript_ResumeChallenge:: playse SE_SAVE waitse frontier_set FRONTIER_DATA_PAUSED, FALSE - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 special SavePlayerParty frontier_setpartyorder FRONTIER_PARTY_SIZE msgbox BattleFrontier_BattlePikeThreePathRoom_Text_PleaseEnjoyChallenge, MSGBOX_DEFAULT diff --git a/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc b/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc index a6b3f63c8e..ba9d996706 100644 --- a/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc @@ -6,7 +6,7 @@ BattleFrontier_BattlePyramidFloor_MapScripts:: BattleFrontier_BattlePyramidFloor_OnFrame: map_script_2 VAR_TEMP_D, 1, BattleFrontier_BattlePyramidFloor_EventScript_UpdateLight - map_script_2 VAR_TEMP_E, 0, BattleFrontier_BattlePyramidFloor_EventScript_PlayPyramidMusic + map_script_2 VAR_TEMP_PLAYING_PYRAMID_MUSIC, 0, BattleFrontier_BattlePyramidFloor_EventScript_PlayPyramidMusic map_script_2 VAR_TEMP_F, 1, BattleFrontier_BattlePyramidFloor_EventScript_ShowMapName .2byte 0 @@ -33,13 +33,13 @@ BattleFrontier_BattlePyramidFloor_EventScript_ShowMapName:: BattleFrontier_BattlePyramidFloor_EventScript_PlayPyramidMusic:: playbgm MUS_B_PYRAMID, FALSE - setvar VAR_TEMP_E, 1 + setvar VAR_TEMP_PLAYING_PYRAMID_MUSIC, 1 end BattleFrontier_BattlePyramidFloor_OnResume: pyramid_setfloorpal frontier_getstatus - switch VAR_TEMP_0 + switch VAR_TEMP_CHALLENGE_STATUS case 0, BattleFrontier_BattlePyramidFloor_EventScript_ReadyChallenge case CHALLENGE_STATUS_SAVING, BattleFrontier_BattlePyramid_EventScript_WarpToLobby case CHALLENGE_STATUS_PAUSED, BattleFrontier_BattlePyramidFloor_EventScript_ReadyChallenge diff --git a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc index 550644511b..25f5dc2b04 100644 --- a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc @@ -17,11 +17,11 @@ BattleFrontier_BattlePyramidLobby_EventScript_TurnPlayerNorth: end BattleFrontier_BattlePyramidLobby_OnFrame: - map_script_2 VAR_TEMP_0, 0, BattleFrontier_BattlePyramidLobby_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, BattleFrontier_BattlePyramidLobby_EventScript_QuitWithoutSaving - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattlePyramidLobby_EventScript_ResumeChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_WON, BattleFrontier_BattlePyramidLobby_EventScript_WonChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_LOST, BattleFrontier_BattlePyramidLobby_EventScript_LostChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, BattleFrontier_BattlePyramidLobby_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, BattleFrontier_BattlePyramidLobby_EventScript_QuitWithoutSaving + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattlePyramidLobby_EventScript_ResumeChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_WON, BattleFrontier_BattlePyramidLobby_EventScript_WonChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST, BattleFrontier_BattlePyramidLobby_EventScript_LostChallenge .2byte 0 BattleFrontier_BattlePyramidLobby_EventScript_GetChallengeStatus:: @@ -38,7 +38,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_QuitWithoutSaving:: pyramid_set PYRAMID_DATA_WIN_STREAK, 0 pyramid_set PYRAMID_DATA_WIN_STREAK_ACTIVE, FALSE frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0 - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -74,7 +74,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_GiveBattlePoints:: waitse msgbox BattleFrontier_BattlePyramidLobby_Text_LookForwardToNextChallenge, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -96,7 +96,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_LostChallenge:: waitse msgbox BattleFrontier_BattlePyramidLobby_Text_LookForwardToNextChallenge, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -145,7 +145,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_TryEnterChallenge:: case MULTI_B_PRESSED, BattleFrontier_BattlePyramidLobby_EventScript_LoadPartyAndCancelChallenge BattleFrontier_BattlePyramidLobby_EventScript_SaveBeforeChallenge:: - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 frontier_set FRONTIER_DATA_SELECTED_MON_ORDER pyramid_init pyramid_set PYRAMID_DATA_WIN_STREAK_ACTIVE, TRUE @@ -157,7 +157,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_SaveBeforeChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, BattleFrontier_BattlePyramidLobby_EventScript_CancelChallengeSaveFailed BattleFrontier_BattlePyramidLobby_EventScript_EnterChallenge:: special SavePlayerParty @@ -169,7 +169,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_EnterChallenge:: setvar VAR_RESULT, 0 special HealPlayerParty warp MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR, 1, 1 - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 waitstate end diff --git a/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc b/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc index 385356c4ba..fa57635271 100644 --- a/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc @@ -32,7 +32,7 @@ BattleFrontier_BattlePyramidTop_OnResume: BattleFrontier_BattlePyramidTop_EventScript_CheckChallengeStatus:: copyvar VAR_TEMP_C, VAR_RESULT frontier_getstatus - switch VAR_TEMP_0 + switch VAR_TEMP_CHALLENGE_STATUS case 0, BattleFrontier_BattlePyramidTop_EventScript_ReadyChallenge case CHALLENGE_STATUS_SAVING, BattleFrontier_BattlePyramid_EventScript_WarpToLobby case CHALLENGE_STATUS_PAUSED, BattleFrontier_BattlePyramidTop_EventScript_ReadyChallenge @@ -43,13 +43,13 @@ BattleFrontier_BattlePyramidTop_EventScript_CheckChallengeStatus:: end BattleFrontier_BattlePyramidTop_OnFrame: - map_script_2 VAR_TEMP_E, 0, BattleFrontier_BattlePyramidTop_EventScript_PlayPyramidMusic + map_script_2 VAR_TEMP_PLAYING_PYRAMID_MUSIC, 0, BattleFrontier_BattlePyramidTop_EventScript_PlayPyramidMusic map_script_2 VAR_TEMP_F, 1, BattleFrontier_BattlePyramidTop_EventScript_ShowMapName .2byte 0 BattleFrontier_BattlePyramidTop_EventScript_PlayPyramidMusic:: playbgm MUS_B_PYRAMID_TOP, FALSE - setvar VAR_TEMP_E, 1 + setvar VAR_TEMP_PLAYING_PYRAMID_MUSIC, 1 end BattleFrontier_BattlePyramidTop_EventScript_ShowMapName:: diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index e99c7f88e8..a216055b5b 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -41,11 +41,11 @@ BattleFrontier_BattleTowerLobby_EventScript_PlayerFaceNorth:: end BattleFrontier_BattleTowerLobby_OnFrame: - map_script_2 VAR_TEMP_0, 0, BattleFrontier_BattleTowerLobby_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, BattleFrontier_BattleTowerLobby_EventScript_QuitWithoutSaving - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattleTowerLobby_EventScript_ResumeChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_WON, BattleFrontier_BattleTowerLobby_EventScript_WonChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_LOST, BattleFrontier_BattleTowerLobby_EventScript_LostChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, BattleFrontier_BattleTowerLobby_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, BattleFrontier_BattleTowerLobby_EventScript_QuitWithoutSaving + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_PAUSED, BattleFrontier_BattleTowerLobby_EventScript_ResumeChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_WON, BattleFrontier_BattleTowerLobby_EventScript_WonChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST, BattleFrontier_BattleTowerLobby_EventScript_LostChallenge .2byte 0 BattleFrontier_BattleTowerLobby_EventScript_GetChallengeStatus:: @@ -60,7 +60,7 @@ BattleFrontier_BattleTowerLobby_EventScript_QuitWithoutSaving:: tower_set TOWER_DATA_WIN_STREAK, 0 tower_set TOWER_DATA_WIN_STREAK_ACTIVE, FALSE frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0 - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 release end @@ -94,7 +94,7 @@ BattleFrontier_BattleTowerLobby_EventScript_GiveBattlePoints:: BattleFrontier_BattleTowerLobby_EventScript_LookForwardToChallenge:: msgbox BattleFrontier_BattleTowerLobby_Text_LookForwardToAnotherChallenge, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 release end @@ -113,7 +113,7 @@ BattleFrontier_BattleTowerLobby_EventScript_LostThanksForPlaying:: call BattleFrontier_BattleTowerLobby_EventScript_AskSaveBattle msgbox BattleFrontier_BattleTowerLobby_Text_LookForwardToAnotherChallenge, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 release end @@ -214,7 +214,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterSinglesChallenge:: BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeSinglesChallenge:: frontier_set FRONTIER_DATA_SELECTED_MON_ORDER - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 tower_init tower_set TOWER_DATA_WIN_STREAK_ACTIVE, TRUE frontier_set FRONTIER_DATA_PAUSED, FALSE @@ -222,7 +222,7 @@ BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeSinglesChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleTowerLobby_EventScript_CancelChallengeSaveFailed incrementgamestat GAME_STAT_ENTERED_BATTLE_TOWER setvar VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, TRUE @@ -277,7 +277,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterDoublesChallenge:: BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeDoublesChallenge:: frontier_set FRONTIER_DATA_SELECTED_MON_ORDER - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 tower_init tower_set TOWER_DATA_WIN_STREAK_ACTIVE, TRUE frontier_set FRONTIER_DATA_PAUSED, FALSE @@ -285,7 +285,7 @@ BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeDoublesChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleTowerLobby_EventScript_CancelChallengeSaveFailed incrementgamestat GAME_STAT_ENTERED_BATTLE_TOWER setvar VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, FALSE @@ -341,7 +341,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterMultisChallenge:: BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeMultisChallenge:: frontier_set FRONTIER_DATA_SELECTED_MON_ORDER - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 tower_init tower_set TOWER_DATA_WIN_STREAK_ACTIVE, TRUE frontier_set FRONTIER_DATA_PAUSED, FALSE @@ -349,7 +349,7 @@ BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeMultisChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleTowerLobby_EventScript_CancelChallengeSaveFailed incrementgamestat GAME_STAT_ENTERED_BATTLE_TOWER setvar VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, FALSE @@ -404,7 +404,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterLinkMultisChallenge:: BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeLinkMultisChallenge:: frontier_set FRONTIER_DATA_SELECTED_MON_ORDER - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 tower_init tower_set TOWER_DATA_WIN_STREAK_ACTIVE, TRUE frontier_set FRONTIER_DATA_PAUSED, FALSE @@ -415,13 +415,18 @@ BattleFrontier_BattleTowerLobby_EventScript_SaveBeforeLinkMultisChallenge:: @ to the flash, but not data in PokemonStorage. The SaveGame script that follows asks the player to do a full save, @ which they can opt out of. As a result the player can save their party and quit without having saved the PC. @ This allows players to clone pokemon and their held items by withdrawing them (or erase them by despositing). -.ifndef BUGFIX +#ifndef BUGFIX tower_save 0 -.endif +#endif call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleTowerLobby_EventScript_CancelChallengeSaveFailed +@ GAME_STAT_ENTERED_BATTLE_TOWER should not be incremented here, for two reasons: +@ 1. It is incremented again in BattleFrontier_BattleTowerLobby_EventScript_CableLinkSuccessful or BattleFrontier_BattleTowerLobby_EventScript_WirelessLinkSuccessful +@ 2. If the player tries to connect, but fails, the counter will still be incremented even if the player never enters the tower. +#ifndef BUGFIX incrementgamestat GAME_STAT_ENTERED_BATTLE_TOWER +#endif specialvar VAR_RESULT, IsWirelessAdapterConnected goto_if_eq VAR_RESULT, TRUE, BattleFrontier_BattleTowerLobby_EventScript_TryWirelessLink goto BattleFrontier_BattleTowerLobby_EventScript_TryCableLink @@ -597,7 +602,7 @@ BattleFrontier_BattleTowerLobby_EventScript_WaitForLinkOpponentLoad:: call BattleFrontier_BattleTowerLobby_EventScript_ShowYouToBattleRoom clearflag FLAG_CANCEL_BATTLE_ROOM_CHALLENGE warp MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR, 1, 6 - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 waitstate end diff --git a/data/maps/BattleFrontier_Lounge7/scripts.inc b/data/maps/BattleFrontier_Lounge7/scripts.inc index c52df3cafb..d2b6114a72 100644 --- a/data/maps/BattleFrontier_Lounge7/scripts.inc +++ b/data/maps/BattleFrontier_Lounge7/scripts.inc @@ -20,12 +20,12 @@ BattleFrontier_Lounge7_EventScript_ChooseLeftTutorMove:: message BattleFrontier_Lounge7_Text_TeachWhichMove waitmessage special ShowBattlePointsWindow - setvar VAR_TEMP_E, 0 + setvar VAR_TEMP_FRONTIER_TUTOR_ID, 0 setvar VAR_0x8004, SCROLL_MULTI_BF_MOVE_TUTOR_1 setvar VAR_0x8006, 0 special ShowScrollableMultichoice waitstate - copyvar VAR_TEMP_D, VAR_RESULT + copyvar VAR_TEMP_FRONTIER_TUTOR_SELECTION, VAR_RESULT switch VAR_RESULT case 0, BattleFrontier_Lounge7_EventScript_Softboiled case 1, BattleFrontier_Lounge7_EventScript_SeismicToss @@ -44,12 +44,12 @@ BattleFrontier_Lounge7_EventScript_ChooseLeftTutorMove:: BattleFrontier_Lounge7_EventScript_ChooseNewLeftTutorMove:: message BattleFrontier_Lounge7_Text_TeachWhichMove waitmessage - setvar VAR_TEMP_E, 0 + setvar VAR_TEMP_FRONTIER_TUTOR_ID, 0 setvar VAR_0x8004, SCROLL_MULTI_BF_MOVE_TUTOR_1 setvar VAR_0x8006, 1 special ShowScrollableMultichoice waitstate - copyvar VAR_TEMP_D, VAR_RESULT + copyvar VAR_TEMP_FRONTIER_TUTOR_SELECTION, VAR_RESULT switch VAR_RESULT case 0, BattleFrontier_Lounge7_EventScript_Softboiled case 1, BattleFrontier_Lounge7_EventScript_SeismicToss @@ -134,12 +134,12 @@ BattleFrontier_Lounge7_EventScript_ChooseRightTutorMove:: message BattleFrontier_Lounge7_Text_TeachWhichMove waitmessage special ShowBattlePointsWindow - setvar VAR_TEMP_E, 1 + setvar VAR_TEMP_FRONTIER_TUTOR_ID, 1 setvar VAR_0x8004, SCROLL_MULTI_BF_MOVE_TUTOR_2 setvar VAR_0x8006, 0 special ShowScrollableMultichoice waitstate - copyvar VAR_TEMP_D, VAR_RESULT + copyvar VAR_TEMP_FRONTIER_TUTOR_SELECTION, VAR_RESULT switch VAR_RESULT case 0, BattleFrontier_Lounge7_EventScript_DefenseCurl case 1, BattleFrontier_Lounge7_EventScript_Snore @@ -158,12 +158,12 @@ BattleFrontier_Lounge7_EventScript_ChooseRightTutorMove:: BattleFrontier_Lounge7_EventScript_ChooseNewRightTutorMove:: message BattleFrontier_Lounge7_Text_TeachWhichMove waitmessage - setvar VAR_TEMP_E, 1 + setvar VAR_TEMP_FRONTIER_TUTOR_ID, 1 setvar VAR_0x8004, SCROLL_MULTI_BF_MOVE_TUTOR_2 setvar VAR_0x8006, 1 special ShowScrollableMultichoice waitstate - copyvar VAR_TEMP_D, VAR_RESULT + copyvar VAR_TEMP_FRONTIER_TUTOR_SELECTION, VAR_RESULT switch VAR_RESULT case 0, BattleFrontier_Lounge7_EventScript_DefenseCurl case 1, BattleFrontier_Lounge7_EventScript_Snore @@ -243,11 +243,11 @@ BattleFrontier_Lounge7_EventScript_CancelChooseMon:: @ VAR_0x8008 is the price @ VAR_TEMP_C is the scroll multichoice ID -@ VAR_TEMP_D is the move selection -@ VAR_TEMP_E is which move tutor was spoken to +@ VAR_TEMP_FRONTIER_TUTOR_SELECTION is the move selection +@ VAR_TEMP_FRONTIER_TUTOR_ID is which move tutor was spoken to BattleFrontier_Lounge7_EventScript_ConfirmMoveSelection:: - copyvar VAR_0x8004, VAR_TEMP_D - copyvar VAR_0x8005, VAR_TEMP_E + copyvar VAR_0x8004, VAR_TEMP_FRONTIER_TUTOR_SELECTION + copyvar VAR_0x8005, VAR_TEMP_FRONTIER_TUTOR_ID special BufferBattleFrontierTutorMoveName buffernumberstring STR_VAR_2, VAR_0x8008 copyvar VAR_0x8004, VAR_TEMP_C @@ -275,7 +275,7 @@ BattleFrontier_Lounge7_EventScript_TeachTutorMove:: end BattleFrontier_Lounge7_EventScript_ChooseNewMove:: - goto_if_eq VAR_TEMP_E, 0, BattleFrontier_Lounge7_EventScript_ChooseNewLeftTutorMove + goto_if_eq VAR_TEMP_FRONTIER_TUTOR_ID, 0, BattleFrontier_Lounge7_EventScript_ChooseNewLeftTutorMove goto BattleFrontier_Lounge7_EventScript_ChooseNewRightTutorMove end diff --git a/data/maps/DewfordTown_Gym/scripts.inc b/data/maps/DewfordTown_Gym/scripts.inc index 81474af726..c425819304 100644 --- a/data/maps/DewfordTown_Gym/scripts.inc +++ b/data/maps/DewfordTown_Gym/scripts.inc @@ -136,7 +136,7 @@ DewfordTown_Gym_EventScript_Brawly:: trainerbattle_single TRAINER_BRAWLY_1, DewfordTown_Gym_Text_BrawlyIntro, DewfordTown_Gym_Text_BrawlyDefeat, DewfordTown_Gym_EventScript_BrawlyDefeated, NO_MUSIC specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, DewfordTown_Gym_EventScript_BrawlyRematch - goto_if_unset FLAG_RECEIVED_TM08, DewfordTown_Gym_EventScript_GiveBulkUp2 + goto_if_unset FLAG_RECEIVED_TM_BULK_UP, DewfordTown_Gym_EventScript_GiveBulkUp2 msgbox DewfordTown_Gym_Text_BrawlyPostBattle, MSGBOX_DEFAULT release end @@ -168,17 +168,17 @@ DewfordTown_Gym_EventScript_BrawlyDefeated:: end DewfordTown_Gym_EventScript_GiveBulkUp:: - giveitem ITEM_TM08 + giveitem ITEM_TM_BULK_UP goto_if_eq VAR_RESULT, 0, Common_EventScript_BagIsFull msgbox DewfordTown_Gym_Text_ExplainBulkUp, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM08 + setflag FLAG_RECEIVED_TM_BULK_UP return DewfordTown_Gym_EventScript_GiveBulkUp2: - giveitem ITEM_TM08 + giveitem ITEM_TM_BULK_UP goto_if_eq VAR_RESULT, 0, Common_EventScript_ShowBagIsFull msgbox DewfordTown_Gym_Text_ExplainBulkUp, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM08 + setflag FLAG_RECEIVED_TM_BULK_UP release end diff --git a/data/maps/DewfordTown_Hall/scripts.inc b/data/maps/DewfordTown_Hall/scripts.inc index 6249a7fac5..1472bebb24 100644 --- a/data/maps/DewfordTown_Hall/scripts.inc +++ b/data/maps/DewfordTown_Hall/scripts.inc @@ -246,11 +246,11 @@ DewfordTown_Hall_EventScript_SludgeBombMan:: lock faceplayer call Common_EventScript_BufferTrendyPhrase - goto_if_set FLAG_RECEIVED_TM36, DewfordTown_Hall_EventScript_ReceivedSludgeBomb + goto_if_set FLAG_RECEIVED_TM_SLUDGE_BOMB, DewfordTown_Hall_EventScript_ReceivedSludgeBomb msgbox DewfordTown_Hall_Text_GiveYouSludgeBomb, MSGBOX_DEFAULT - giveitem ITEM_TM36 + giveitem ITEM_TM_SLUDGE_BOMB goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM36 + setflag FLAG_RECEIVED_TM_SLUDGE_BOMB release end diff --git a/data/maps/FallarborTown_BattleTentLobby/scripts.inc b/data/maps/FallarborTown_BattleTentLobby/scripts.inc index 1bcd04559c..8f705075c7 100644 --- a/data/maps/FallarborTown_BattleTentLobby/scripts.inc +++ b/data/maps/FallarborTown_BattleTentLobby/scripts.inc @@ -15,11 +15,11 @@ FallarborTown_BattleTentLobby_EventScript_TurnPlayerNorth:: end FallarborTown_BattleTentLobby_OnFrame: - map_script_2 VAR_TEMP_0, 0, FallarborTown_BattleTentLobby_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, FallarborTown_BattleTentLobby_EventScript_QuitWithoutSaving - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_PAUSED, FallarborTown_BattleTentLobby_EventScript_ResumeChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_WON, FallarborTown_BattleTentLobby_EventScript_WonChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_LOST, FallarborTown_BattleTentLobby_EventScript_LostChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, FallarborTown_BattleTentLobby_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, FallarborTown_BattleTentLobby_EventScript_QuitWithoutSaving + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_PAUSED, FallarborTown_BattleTentLobby_EventScript_ResumeChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_WON, FallarborTown_BattleTentLobby_EventScript_WonChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST, FallarborTown_BattleTentLobby_EventScript_LostChallenge .2byte 0 FallarborTown_BattleTentLobby_EventScript_GetChallengeStatus:: @@ -31,7 +31,7 @@ FallarborTown_BattleTentLobby_EventScript_QuitWithoutSaving:: msgbox FallarborTown_BattleTentLobby_Text_DidntSaveBeforeQuitting, MSGBOX_DEFAULT closemessage frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0 - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 frontier_set FRONTIER_DATA_LVL_MODE, FRONTIER_LVL_50 releaseall end @@ -59,7 +59,7 @@ FallarborTown_BattleTentLobby_EventScript_GivePrize:: waitfanfare msgbox FallarborTown_BattleTentLobby_Text_AwaitAnotherChallenge2, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -67,7 +67,7 @@ FallarborTown_BattleTentLobby_EventScript_NoRoomForPrize:: msgbox FallarborTown_BattleTentLobby_Text_BagFullReturnForPrize, MSGBOX_DEFAULT waitmessage closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -87,7 +87,7 @@ FallarborTown_BattleTentLobby_EventScript_LostChallenge:: waitse msgbox FallarborTown_BattleTentLobby_Text_AwaitAnotherChallenge2, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -99,7 +99,7 @@ FallarborTown_BattleTentLobby_EventScript_ResumeChallenge:: playse SE_SAVE waitse frontier_set FRONTIER_DATA_PAUSED, FALSE - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto FallarborTown_BattleTentLobby_EventScript_EnterChallenge FallarborTown_BattleTentLobby_EventScript_Attendant:: @@ -140,7 +140,7 @@ FallarborTown_BattleTentLobby_EventScript_TryEnterChallenge:: case MULTI_B_PRESSED, FallarborTown_BattleTentLobby_EventScript_LoadPartyCancelChallenge FallarborTown_BattleTentLobby_EventScript_SaveBeforeChallenge:: - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 frontier_set FRONTIER_DATA_SELECTED_MON_ORDER fallarbortent_init frontier_set FRONTIER_DATA_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING @@ -149,7 +149,7 @@ FallarborTown_BattleTentLobby_EventScript_SaveBeforeChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, FallarborTown_BattleTentLobby_EventScript_CancelChallengeSaveFailed FallarborTown_BattleTentLobby_EventScript_EnterChallenge:: special SavePlayerParty @@ -158,7 +158,7 @@ FallarborTown_BattleTentLobby_EventScript_EnterChallenge:: closemessage call FallarborTown_BattleTentLobby_EventScript_WalkToDoor warp MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR, 2, 7 - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 waitstate end diff --git a/data/maps/FallarborTown_CozmosHouse/scripts.inc b/data/maps/FallarborTown_CozmosHouse/scripts.inc index 61f297e69d..27b03436da 100644 --- a/data/maps/FallarborTown_CozmosHouse/scripts.inc +++ b/data/maps/FallarborTown_CozmosHouse/scripts.inc @@ -4,7 +4,7 @@ FallarborTown_CozmosHouse_MapScripts:: FallarborTown_CozmosHouse_EventScript_ProfCozmo:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM27, FallarborTown_CozmosHouse_EventScript_GaveMeteorite + goto_if_set FLAG_RECEIVED_TM_RETURN, FallarborTown_CozmosHouse_EventScript_GaveMeteorite checkitem ITEM_METEORITE goto_if_eq VAR_RESULT, TRUE, FallarborTown_CozmosHouse_EventScript_PlayerHasMeteorite msgbox FallarborTown_CozmosHouse_Text_MeteoriteWillNeverBeMineNow, MSGBOX_DEFAULT @@ -16,11 +16,11 @@ FallarborTown_CozmosHouse_EventScript_PlayerHasMeteorite:: call_if_set FLAG_TEMP_2, FallarborTown_CozmosHouse_EventScript_AskForMeteorite goto_if_eq VAR_RESULT, NO, FallarborTown_CozmosHouse_EventScript_DeclineGiveMeteorite msgbox FallarborTown_CozmosHouse_Text_PleaseUseThisTM, MSGBOX_DEFAULT - giveitem ITEM_TM27 + giveitem ITEM_TM_RETURN goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull setvar VAR_0x8004, ITEM_METEORITE call Common_EventScript_PlayerHandedOverTheItem - setflag FLAG_RECEIVED_TM27 + setflag FLAG_RECEIVED_TM_RETURN msgbox FallarborTown_CozmosHouse_Text_ReallyGoingToHelpMyResearch, MSGBOX_DEFAULT release end @@ -48,7 +48,7 @@ FallarborTown_CozmosHouse_EventScript_GaveMeteorite:: FallarborTown_CozmosHouse_EventScript_CozmosWife:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM27, FallarborTown_CozmosHouse_EventScript_CozmoIsHappy + goto_if_set FLAG_RECEIVED_TM_RETURN, FallarborTown_CozmosHouse_EventScript_CozmoIsHappy goto_if_set FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY, FallarborTown_CozmosHouse_EventScript_CozmoIsSad msgbox FallarborTown_CozmosHouse_Text_CozmoWentToMeteorFalls, MSGBOX_DEFAULT release diff --git a/data/maps/FieryPath/map.json b/data/maps/FieryPath/map.json index 38b9aff75e..69f5050ad5 100644 --- a/data/maps/FieryPath/map.json +++ b/data/maps/FieryPath/map.json @@ -24,8 +24,8 @@ "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "FieryPath_EventScript_ItemTM06", - "flag": "FLAG_ITEM_FIERY_PATH_TM06" + "script": "FieryPath_EventScript_ItemTMToxic", + "flag": "FLAG_ITEM_FIERY_PATH_TM_TOXIC" }, { "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", diff --git a/data/maps/FortreeCity_Gym/scripts.inc b/data/maps/FortreeCity_Gym/scripts.inc index 1c729bc44e..bb1e32a93a 100644 --- a/data/maps/FortreeCity_Gym/scripts.inc +++ b/data/maps/FortreeCity_Gym/scripts.inc @@ -11,6 +11,7 @@ FortreeCity_Gym_OnWarp: map_script_2 VAR_TEMP_0, VAR_TEMP_0, FortreeCity_Gym_EventScript_InitRotatingGates .2byte 0 +@ NOTE: This rotating gate puzzle makes use of VAR_TEMP_0 - VAR_TEMP_3 FortreeCity_Gym_EventScript_InitRotatingGates:: special RotatingGate_InitPuzzleAndGraphics end @@ -19,7 +20,7 @@ FortreeCity_Gym_EventScript_Winona:: trainerbattle_single TRAINER_WINONA_1, FortreeCity_Gym_Text_WinonaIntro, FortreeCity_Gym_Text_WinonaDefeat, FortreeCity_Gym_EventScript_WinonaDefeated, NO_MUSIC specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, FortreeCity_Gym_EventScript_WinonaRematch - goto_if_unset FLAG_RECEIVED_TM40, FortreeCity_Gym_EventScript_GiveAerialAce2 + goto_if_unset FLAG_RECEIVED_TM_AERIAL_ACE, FortreeCity_Gym_EventScript_GiveAerialAce2 msgbox FortreeCity_Gym_Text_WinonaPostBattle, MSGBOX_DEFAULT release end @@ -48,18 +49,18 @@ FortreeCity_Gym_EventScript_WinonaDefeated:: end FortreeCity_Gym_EventScript_GiveAerialAce2:: - giveitem ITEM_TM40 + giveitem ITEM_TM_AERIAL_ACE goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull msgbox FortreeCity_Gym_Text_ExplainAerialAce, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM40 + setflag FLAG_RECEIVED_TM_AERIAL_ACE release end FortreeCity_Gym_EventScript_GiveAerialAce:: - giveitem ITEM_TM40 + giveitem ITEM_TM_AERIAL_ACE goto_if_eq VAR_RESULT, FALSE, Common_EventScript_BagIsFull msgbox FortreeCity_Gym_Text_ExplainAerialAce, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM40 + setflag FLAG_RECEIVED_TM_AERIAL_ACE return FortreeCity_Gym_EventScript_WinonaRematch:: diff --git a/data/maps/FortreeCity_House2/scripts.inc b/data/maps/FortreeCity_House2/scripts.inc index cdd0fc99f7..a81a7a8e0a 100644 --- a/data/maps/FortreeCity_House2/scripts.inc +++ b/data/maps/FortreeCity_House2/scripts.inc @@ -4,7 +4,7 @@ FortreeCity_House2_MapScripts:: FortreeCity_House2_EventScript_HiddenPowerGiver:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM10, FortreeCity_House2_EventScript_ExplainHiddenPower + goto_if_set FLAG_RECEIVED_TM_HIDDEN_POWER, FortreeCity_House2_EventScript_ExplainHiddenPower call_if_unset FLAG_MET_HIDDEN_POWER_GIVER, FortreeCity_House2_EventScript_Greeting msgbox FortreeCity_House2_Text_CoinInWhichHand, MSGBOX_DEFAULT multichoice 21, 8, MULTI_RIGHTLEFT, TRUE @@ -19,9 +19,9 @@ FortreeCity_House2_EventScript_HiddenPowerGiver:: switch VAR_RESULT case 0, FortreeCity_House2_EventScript_WrongGuess msgbox FortreeCity_House2_Text_YourHiddenPowerHasAwoken, MSGBOX_DEFAULT - giveitem ITEM_TM10 + giveitem ITEM_TM_HIDDEN_POWER goto_if_eq VAR_RESULT, 0, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM10 + setflag FLAG_RECEIVED_TM_HIDDEN_POWER msgbox FortreeCity_House2_Text_ExplainHiddenPower, MSGBOX_DEFAULT release end diff --git a/data/maps/GraniteCave_1F/scripts.inc b/data/maps/GraniteCave_1F/scripts.inc index 1bf81b997b..ab0ccac21c 100644 --- a/data/maps/GraniteCave_1F/scripts.inc +++ b/data/maps/GraniteCave_1F/scripts.inc @@ -4,10 +4,10 @@ GraniteCave_1F_MapScripts:: GraniteCave_1F_EventScript_Hiker:: lock faceplayer - goto_if_set FLAG_RECEIVED_HM05, GraniteCave_1F_EventScript_ReceivedFlash + goto_if_set FLAG_RECEIVED_HM_FLASH, GraniteCave_1F_EventScript_ReceivedFlash msgbox GraniteCave_1F_Text_GetsDarkAheadHereYouGo, MSGBOX_DEFAULT - giveitem ITEM_HM05 - setflag FLAG_RECEIVED_HM05 + giveitem ITEM_HM_FLASH + setflag FLAG_RECEIVED_HM_FLASH msgbox GraniteCave_1F_Text_ExplainFlash, MSGBOX_DEFAULT release end diff --git a/data/maps/GraniteCave_StevensRoom/scripts.inc b/data/maps/GraniteCave_StevensRoom/scripts.inc index 384e648ee2..eb32c26293 100644 --- a/data/maps/GraniteCave_StevensRoom/scripts.inc +++ b/data/maps/GraniteCave_StevensRoom/scripts.inc @@ -11,7 +11,7 @@ GraniteCave_StevensRoom_EventScript_Steven:: call Common_EventScript_PlayerHandedOverTheItem setflag FLAG_DELIVERED_STEVEN_LETTER msgbox GraniteCave_StevensRoom_Text_ThankYouTakeThis, MSGBOX_DEFAULT - giveitem ITEM_TM47 + giveitem ITEM_TM_STEEL_WING call_if_eq VAR_RESULT, FALSE, GraniteCave_StevensRoom_EventScript_BagFull msgbox GraniteCave_StevensRoom_Text_CouldBecomeChampionLetsRegister, MSGBOX_DEFAULT closemessage diff --git a/data/maps/IslandCave/scripts.inc b/data/maps/IslandCave/scripts.inc index d15802aaa8..1bfadb9f2e 100644 --- a/data/maps/IslandCave/scripts.inc +++ b/data/maps/IslandCave/scripts.inc @@ -51,10 +51,10 @@ IslandCave_EventScript_OpenRegiEntrance:: IslandCave_EventScript_CaveEntranceMiddle:: lockall - call_if_set FLAG_TEMP_3, IslandCave_EventScript_ClearSteps + call_if_set FLAG_TEMP_REGICE_PUZZLE_FAILED, IslandCave_EventScript_ClearSteps goto_if_set FLAG_SYS_BRAILLE_REGICE_COMPLETED, IslandCave_EventScript_BigHoleInWall braillemessage IslandCave_Braille_RunLapAroundWall - setflag FLAG_TEMP_2 + setflag FLAG_TEMP_REGICE_PUZZLE_STARTED special ShouldDoBrailleRegicePuzzle goto IslandCave_EventScript_CloseBrailleMsg end @@ -66,10 +66,10 @@ IslandCave_EventScript_BigHoleInWall:: IslandCave_EventScript_CaveEntranceSide:: lockall - call_if_set FLAG_TEMP_3, IslandCave_EventScript_ClearSteps + call_if_set FLAG_TEMP_REGICE_PUZZLE_FAILED, IslandCave_EventScript_ClearSteps braillemessage IslandCave_Braille_RunLapAroundWall goto_if_set FLAG_SYS_BRAILLE_REGICE_COMPLETED, IslandCave_EventScript_CloseBrailleMsg - setflag FLAG_TEMP_2 + setflag FLAG_TEMP_REGICE_PUZZLE_STARTED special ShouldDoBrailleRegicePuzzle goto IslandCave_EventScript_CloseBrailleMsg end @@ -84,7 +84,7 @@ IslandCave_EventScript_ClearSteps:: setvar VAR_REGICE_STEPS_1, 0 setvar VAR_REGICE_STEPS_2, 0 setvar VAR_REGICE_STEPS_3, 0 - clearflag FLAG_TEMP_3 + clearflag FLAG_TEMP_REGICE_PUZZLE_FAILED return IslandCave_EventScript_Regice:: diff --git a/data/maps/LavaridgeTown_Gym_1F/scripts.inc b/data/maps/LavaridgeTown_Gym_1F/scripts.inc index 530d6e9598..b7db13f54a 100644 --- a/data/maps/LavaridgeTown_Gym_1F/scripts.inc +++ b/data/maps/LavaridgeTown_Gym_1F/scripts.inc @@ -52,7 +52,7 @@ LavaridgeTown_Gym_1F_EventScript_Flannery:: trainerbattle_single TRAINER_FLANNERY_1, LavaridgeTown_Gym_1F_Text_FlanneryIntro, LavaridgeTown_Gym_1F_Text_FlanneryDefeat, LavaridgeTown_Gym_1F_EventScript_FlanneryDefeated, NO_MUSIC specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, LavaridgeTown_Gym_1F_EventScript_FlanneryRematch - goto_if_unset FLAG_RECEIVED_TM50, LavaridgeTown_Gym_1F_EventScript_GiveOverheat2 + goto_if_unset FLAG_RECEIVED_TM_OVERHEAT, LavaridgeTown_Gym_1F_EventScript_GiveOverheat2 msgbox LavaridgeTown_Gym_1F_Text_FlanneryPostBattle, MSGBOX_DEFAULT release end @@ -84,18 +84,18 @@ LavaridgeTown_Gym_1F_EventScript_FlanneryDefeated:: end LavaridgeTown_Gym_1F_EventScript_GiveOverheat2:: - giveitem ITEM_TM50 + giveitem ITEM_TM_OVERHEAT goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull msgbox LavaridgeTown_Gym_1F_Text_ExplainOverheat, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM50 + setflag FLAG_RECEIVED_TM_OVERHEAT release end LavaridgeTown_Gym_1F_EventScript_GiveOverheat:: - giveitem ITEM_TM50 + giveitem ITEM_TM_OVERHEAT goto_if_eq VAR_RESULT, FALSE, Common_EventScript_BagIsFull msgbox LavaridgeTown_Gym_1F_Text_ExplainOverheat, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM50 + setflag FLAG_RECEIVED_TM_OVERHEAT return LavaridgeTown_Gym_1F_EventScript_FlanneryRematch:: diff --git a/data/maps/LilycoveCity_DepartmentStore_4F/scripts.inc b/data/maps/LilycoveCity_DepartmentStore_4F/scripts.inc index d176781d6e..760abc600d 100644 --- a/data/maps/LilycoveCity_DepartmentStore_4F/scripts.inc +++ b/data/maps/LilycoveCity_DepartmentStore_4F/scripts.inc @@ -25,10 +25,10 @@ LilycoveCity_DepartmentStore_4F_EventScript_ClerkLeft:: .align 2 LilycoveCity_DepartmentStore_4F_Pokemart_AttackTMs: - .2byte ITEM_TM38 @ Fire Blast - .2byte ITEM_TM25 @ Thunder - .2byte ITEM_TM14 @ Blizzard - .2byte ITEM_TM15 @ Hyper Beam + .2byte ITEM_TM_FIRE_BLAST + .2byte ITEM_TM_THUNDER + .2byte ITEM_TM_BLIZZARD + .2byte ITEM_TM_HYPER_BEAM .2byte ITEM_NONE release end @@ -45,10 +45,10 @@ LilycoveCity_DepartmentStore_4F_EventScript_ClerkRight:: .align 2 LilycoveCity_DepartmentStore_4F_Pokemart_DefenseTMs: - .2byte ITEM_TM17 @ Protect - .2byte ITEM_TM20 @ Safeguard - .2byte ITEM_TM33 @ Reflect - .2byte ITEM_TM16 @ Light Screen + .2byte ITEM_TM_PROTECT + .2byte ITEM_TM_SAFEGUARD + .2byte ITEM_TM_REFLECT + .2byte ITEM_TM_LIGHT_SCREEN .2byte ITEM_NONE release end diff --git a/data/maps/LilycoveCity_House2/scripts.inc b/data/maps/LilycoveCity_House2/scripts.inc index 965d82acfb..5d1bc8eaa8 100644 --- a/data/maps/LilycoveCity_House2/scripts.inc +++ b/data/maps/LilycoveCity_House2/scripts.inc @@ -4,11 +4,11 @@ LilycoveCity_House2_MapScripts:: LilycoveCity_House2_EventScript_FatMan:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM44, LilycoveCity_House2_EventScript_ReceivedRest + goto_if_set FLAG_RECEIVED_TM_REST, LilycoveCity_House2_EventScript_ReceivedRest msgbox LilycoveCity_House2_Text_NotAwakeYetHaveThis, MSGBOX_DEFAULT - giveitem ITEM_TM44 + giveitem ITEM_TM_REST goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM44 + setflag FLAG_RECEIVED_TM_REST msgbox LilycoveCity_House2_Text_SleepIsEssential, MSGBOX_DEFAULT release end diff --git a/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc b/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc index acf80f0e40..0c8a468ab0 100644 --- a/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc +++ b/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc @@ -339,7 +339,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_TakeYourTime:: LittlerootTown_ProfessorBirchsLab_EventScript_GiveCyndaquil:: bufferspeciesname STR_VAR_1, SPECIES_CYNDAQUIL - setvar VAR_TEMP_1, SPECIES_CYNDAQUIL + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_CYNDAQUIL givemon SPECIES_CYNDAQUIL, 5 goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, LittlerootTown_ProfessorBirchsLab_EventScript_SendCyndaquilToParty goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, LittlerootTown_ProfessorBirchsLab_EventScript_SendCyndaquilToPC @@ -380,7 +380,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedCyndaquil:: LittlerootTown_ProfessorBirchsLab_EventScript_GiveTotodile:: bufferspeciesname STR_VAR_1, SPECIES_TOTODILE - setvar VAR_TEMP_1, SPECIES_TOTODILE + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_TOTODILE givemon SPECIES_TOTODILE, 5 goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, LittlerootTown_ProfessorBirchsLab_EventScript_SendTotodileToParty goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, LittlerootTown_ProfessorBirchsLab_EventScript_SendTotodileToPC @@ -421,7 +421,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedTotodile:: LittlerootTown_ProfessorBirchsLab_EventScript_GiveChikorita:: bufferspeciesname STR_VAR_1, SPECIES_CHIKORITA - setvar VAR_TEMP_1, SPECIES_CHIKORITA + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_CHIKORITA givemon SPECIES_CHIKORITA, 5 goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, LittlerootTown_ProfessorBirchsLab_EventScript_SendChikoritaToParty goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, LittlerootTown_ProfessorBirchsLab_EventScript_SendChikoritaToPC diff --git a/data/maps/MauvilleCity/scripts.inc b/data/maps/MauvilleCity/scripts.inc index 2ad39aec1c..9211402705 100644 --- a/data/maps/MauvilleCity/scripts.inc +++ b/data/maps/MauvilleCity/scripts.inc @@ -13,7 +13,7 @@ MauvilleCity_OnTransition: setflag FLAG_SYS_TV_START clearflag FLAG_MAUVILLE_GYM_BARRIERS_STATE setvar VAR_MAUVILLE_GYM_STATE, 0 - call_if_set FLAG_GOT_TM24_FROM_WATTSON, MauvilleCity_EventScript_MoveWattsonBackToGym + call_if_set FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON, MauvilleCity_EventScript_MoveWattsonBackToGym end MauvilleCity_EventScript_MoveWattsonBackToGym:: @@ -418,7 +418,7 @@ MauvilleCity_Movement_ScottExitEast: MauvilleCity_EventScript_Wattson:: lock faceplayer - goto_if_set FLAG_GOT_TM24_FROM_WATTSON, MauvilleCity_EventScript_ReceivedThunderbolt + goto_if_set FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON, MauvilleCity_EventScript_ReceivedThunderbolt goto_if_eq VAR_NEW_MAUVILLE_STATE, 2, MauvilleCity_EventScript_CompletedNewMauville goto_if_set FLAG_GOT_BASEMENT_KEY_FROM_WATTSON, MauvilleCity_EventScript_BegunNewMauville msgbox MauvilleCity_Text_WattsonNeedFavorTakeKey, MSGBOX_DEFAULT @@ -435,9 +435,9 @@ MauvilleCity_EventScript_BegunNewMauville:: MauvilleCity_EventScript_CompletedNewMauville:: msgbox MauvilleCity_Text_WattsonThanksTakeTM, MSGBOX_DEFAULT - giveitem ITEM_TM24 + giveitem ITEM_TM_THUNDERBOLT goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_GOT_TM24_FROM_WATTSON + setflag FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON msgbox MauvilleCity_Text_WattsonYoungTakeCharge, MSGBOX_DEFAULT release end diff --git a/data/maps/MauvilleCity_GameCorner/scripts.inc b/data/maps/MauvilleCity_GameCorner/scripts.inc index b7c8603a33..c9e425be73 100644 --- a/data/maps/MauvilleCity_GameCorner/scripts.inc +++ b/data/maps/MauvilleCity_GameCorner/scripts.inc @@ -2,12 +2,12 @@ MauvilleCity_GameCorner_MapScripts:: .byte 0 @ Game Corner prices - .set TM32_COINS, 1500 - .set TM29_COINS, 3500 - .set TM35_COINS, 4000 - .set TM24_COINS, 4000 - .set TM13_COINS, 4000 - .set DOLL_COINS, 1000 + .set TM_DOUBLE_TEAM_COINS, 1500 + .set TM_PSYCHIC_COINS, 3500 + .set TM_FLAMETHROWER_COINS, 4000 + .set TM_THUNDERBOLT_COINS, 4000 + .set TM_ICE_BEAM_COINS, 4000 + .set DOLL_COINS, 1000 .set COINS_PRICE_50, 1000 .set COINS_PRICE_500, 10000 @@ -236,43 +236,43 @@ MauvilleCity_GameCorner_EventScript_ReturnToChooseTMPrize:: MauvilleCity_GameCorner_EventScript_ChooseTMPrize:: multichoice 12, 0, MULTI_GAME_CORNER_TMS, FALSE switch VAR_RESULT - case 0, MauvilleCity_GameCorner_EventScript_TM32 - case 1, MauvilleCity_GameCorner_EventScript_TM29 - case 2, MauvilleCity_GameCorner_EventScript_TM35 - case 3, MauvilleCity_GameCorner_EventScript_TM24 - case 4, MauvilleCity_GameCorner_EventScript_TM13 + case 0, MauvilleCity_GameCorner_EventScript_TMDoubleTeam + case 1, MauvilleCity_GameCorner_EventScript_TMPsychic + case 2, MauvilleCity_GameCorner_EventScript_TMFlamethrower + case 3, MauvilleCity_GameCorner_EventScript_TMThunderbolt + case 4, MauvilleCity_GameCorner_EventScript_TMIceBeam case 5, MauvilleCity_GameCorner_EventScript_CancelTMSelect goto MauvilleCity_GameCorner_EventScript_CancelTMSelect end -MauvilleCity_GameCorner_EventScript_TM32:: +MauvilleCity_GameCorner_EventScript_TMDoubleTeam:: setvar VAR_TEMP_1, 1 - bufferitemname STR_VAR_1, ITEM_TM32 - setvar VAR_0x8004, ITEM_TM32 + bufferitemname STR_VAR_1, ITEM_TM_DOUBLE_TEAM + setvar VAR_0x8004, ITEM_TM_DOUBLE_TEAM goto MauvilleCity_GameCorner_EventScript_ConfirmTMPrize -MauvilleCity_GameCorner_EventScript_TM29:: +MauvilleCity_GameCorner_EventScript_TMPsychic:: setvar VAR_TEMP_1, 2 - bufferitemname STR_VAR_1, ITEM_TM29 - setvar VAR_0x8004, ITEM_TM29 + bufferitemname STR_VAR_1, ITEM_TM_PSYCHIC + setvar VAR_0x8004, ITEM_TM_PSYCHIC goto MauvilleCity_GameCorner_EventScript_ConfirmTMPrize -MauvilleCity_GameCorner_EventScript_TM35:: +MauvilleCity_GameCorner_EventScript_TMFlamethrower:: setvar VAR_TEMP_1, 3 - bufferitemname STR_VAR_1, ITEM_TM35 - setvar VAR_0x8004, ITEM_TM35 + bufferitemname STR_VAR_1, ITEM_TM_FLAMETHROWER + setvar VAR_0x8004, ITEM_TM_FLAMETHROWER goto MauvilleCity_GameCorner_EventScript_ConfirmTMPrize -MauvilleCity_GameCorner_EventScript_TM24:: +MauvilleCity_GameCorner_EventScript_TMThunderbolt:: setvar VAR_TEMP_1, 4 - bufferitemname STR_VAR_1, ITEM_TM24 - setvar VAR_0x8004, ITEM_TM24 + bufferitemname STR_VAR_1, ITEM_TM_THUNDERBOLT + setvar VAR_0x8004, ITEM_TM_THUNDERBOLT goto MauvilleCity_GameCorner_EventScript_ConfirmTMPrize -MauvilleCity_GameCorner_EventScript_TM13:: +MauvilleCity_GameCorner_EventScript_TMIceBeam:: setvar VAR_TEMP_1, 5 - bufferitemname STR_VAR_1, ITEM_TM13 - setvar VAR_0x8004, ITEM_TM13 + bufferitemname STR_VAR_1, ITEM_TM_ICE_BEAM + setvar VAR_0x8004, ITEM_TM_ICE_BEAM goto MauvilleCity_GameCorner_EventScript_ConfirmTMPrize MauvilleCity_GameCorner_EventScript_ConfirmTMPrize:: @@ -280,72 +280,72 @@ MauvilleCity_GameCorner_EventScript_ConfirmTMPrize:: msgbox MauvilleCity_GameCorner_Text_SoYourChoiceIsTheTMX, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, MauvilleCity_GameCorner_EventScript_CancelTMSelect switch VAR_TEMP_1 - case 1, MauvilleCity_GameCorner_EventScript_BuyTM32 - case 2, MauvilleCity_GameCorner_EventScript_BuyTM29 - case 3, MauvilleCity_GameCorner_EventScript_BuyTM35 - case 4, MauvilleCity_GameCorner_EventScript_BuyTM24 - case 5, MauvilleCity_GameCorner_EventScript_BuyTM13 + case 1, MauvilleCity_GameCorner_EventScript_BuyTMDoubleTeam + case 2, MauvilleCity_GameCorner_EventScript_BuyTMPsychic + case 3, MauvilleCity_GameCorner_EventScript_BuyTMFlamethrower + case 4, MauvilleCity_GameCorner_EventScript_BuyTMThunderbolt + case 5, MauvilleCity_GameCorner_EventScript_BuyTMIceBeam end -MauvilleCity_GameCorner_EventScript_BuyTM32:: +MauvilleCity_GameCorner_EventScript_BuyTMDoubleTeam:: checkcoins VAR_TEMP_2 - goto_if_lt VAR_TEMP_2, TM32_COINS, MauvilleCity_GameCorner_EventScript_NotEnoughCoinsForTM - checkitemspace ITEM_TM32 + goto_if_lt VAR_TEMP_2, TM_DOUBLE_TEAM_COINS, MauvilleCity_GameCorner_EventScript_NotEnoughCoinsForTM + checkitemspace ITEM_TM_DOUBLE_TEAM goto_if_eq VAR_RESULT, FALSE, MauvilleCity_GameCorner_EventScript_NoRoomForTM - removecoins TM32_COINS - additem ITEM_TM32 + removecoins TM_DOUBLE_TEAM_COINS + additem ITEM_TM_DOUBLE_TEAM updatecoinsbox 1, 1 playse SE_SHOP msgbox MauvilleCity_GameCorner_Text_HereYouGo, MSGBOX_DEFAULT goto MauvilleCity_GameCorner_EventScript_ReturnToChooseTMPrize end -MauvilleCity_GameCorner_EventScript_BuyTM29:: +MauvilleCity_GameCorner_EventScript_BuyTMPsychic:: checkcoins VAR_TEMP_2 - goto_if_lt VAR_TEMP_2, TM29_COINS, MauvilleCity_GameCorner_EventScript_NotEnoughCoinsForTM - checkitemspace ITEM_TM29 + goto_if_lt VAR_TEMP_2, TM_PSYCHIC_COINS, MauvilleCity_GameCorner_EventScript_NotEnoughCoinsForTM + checkitemspace ITEM_TM_PSYCHIC goto_if_eq VAR_RESULT, FALSE, MauvilleCity_GameCorner_EventScript_NoRoomForTM - removecoins TM29_COINS - additem ITEM_TM29 + removecoins TM_PSYCHIC_COINS + additem ITEM_TM_PSYCHIC updatecoinsbox 1, 1 playse SE_SHOP msgbox MauvilleCity_GameCorner_Text_HereYouGo, MSGBOX_DEFAULT goto MauvilleCity_GameCorner_EventScript_ReturnToChooseTMPrize end -MauvilleCity_GameCorner_EventScript_BuyTM35:: +MauvilleCity_GameCorner_EventScript_BuyTMFlamethrower:: checkcoins VAR_TEMP_2 - goto_if_lt VAR_TEMP_2, TM35_COINS, MauvilleCity_GameCorner_EventScript_NotEnoughCoinsForTM - checkitemspace ITEM_TM35 + goto_if_lt VAR_TEMP_2, TM_FLAMETHROWER_COINS, MauvilleCity_GameCorner_EventScript_NotEnoughCoinsForTM + checkitemspace ITEM_TM_FLAMETHROWER goto_if_eq VAR_RESULT, FALSE, MauvilleCity_GameCorner_EventScript_NoRoomForTM - removecoins TM35_COINS - additem ITEM_TM35 + removecoins TM_FLAMETHROWER_COINS + additem ITEM_TM_FLAMETHROWER updatecoinsbox 1, 1 playse SE_SHOP msgbox MauvilleCity_GameCorner_Text_HereYouGo, MSGBOX_DEFAULT goto MauvilleCity_GameCorner_EventScript_ReturnToChooseTMPrize end -MauvilleCity_GameCorner_EventScript_BuyTM24:: +MauvilleCity_GameCorner_EventScript_BuyTMThunderbolt:: checkcoins VAR_TEMP_2 - goto_if_lt VAR_TEMP_2, TM24_COINS, MauvilleCity_GameCorner_EventScript_NotEnoughCoinsForTM - checkitemspace ITEM_TM24 + goto_if_lt VAR_TEMP_2, TM_THUNDERBOLT_COINS, MauvilleCity_GameCorner_EventScript_NotEnoughCoinsForTM + checkitemspace ITEM_TM_THUNDERBOLT goto_if_eq VAR_RESULT, FALSE, MauvilleCity_GameCorner_EventScript_NoRoomForTM - removecoins TM24_COINS - additem ITEM_TM24 + removecoins TM_THUNDERBOLT_COINS + additem ITEM_TM_THUNDERBOLT updatecoinsbox 1, 1 playse SE_SHOP msgbox MauvilleCity_GameCorner_Text_HereYouGo, MSGBOX_DEFAULT goto MauvilleCity_GameCorner_EventScript_ReturnToChooseTMPrize end -MauvilleCity_GameCorner_EventScript_BuyTM13:: +MauvilleCity_GameCorner_EventScript_BuyTMIceBeam:: checkcoins VAR_TEMP_2 - goto_if_lt VAR_TEMP_2, TM13_COINS, MauvilleCity_GameCorner_EventScript_NotEnoughCoinsForTM - checkitemspace ITEM_TM13 + goto_if_lt VAR_TEMP_2, TM_ICE_BEAM_COINS, MauvilleCity_GameCorner_EventScript_NotEnoughCoinsForTM + checkitemspace ITEM_TM_ICE_BEAM goto_if_eq VAR_RESULT, FALSE, MauvilleCity_GameCorner_EventScript_NoRoomForTM - removecoins TM13_COINS - additem ITEM_TM13 + removecoins TM_ICE_BEAM_COINS + additem ITEM_TM_ICE_BEAM updatecoinsbox 1, 1 playse SE_SHOP msgbox MauvilleCity_GameCorner_Text_HereYouGo, MSGBOX_DEFAULT diff --git a/data/maps/MauvilleCity_Gym/scripts.inc b/data/maps/MauvilleCity_Gym/scripts.inc index de924d7d93..433c45bf81 100644 --- a/data/maps/MauvilleCity_Gym/scripts.inc +++ b/data/maps/MauvilleCity_Gym/scripts.inc @@ -77,7 +77,7 @@ MauvilleCity_Gym_EventScript_Wattson:: trainerbattle_single TRAINER_WATTSON_1, MauvilleCity_Gym_Text_WattsonIntro, MauvilleCity_Gym_Text_WattsonDefeat, MauvilleCity_Gym_EventScript_WattsonDefeated, NO_MUSIC specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, MauvilleCity_Gym_EventScript_WattsonRematch - goto_if_unset FLAG_RECEIVED_TM34, MauvilleCity_Gym_EventScript_GiveShockWave2 + goto_if_unset FLAG_RECEIVED_TM_SHOCK_WAVE, MauvilleCity_Gym_EventScript_GiveShockWave2 goto_if_eq VAR_NEW_MAUVILLE_STATE, 2, MauvilleCity_Gym_EventScript_CompletedNewMauville msgbox MauvilleCity_Gym_Text_WattsonPostBattle, MSGBOX_DEFAULT release @@ -112,18 +112,18 @@ MauvilleCity_Gym_EventScript_WattsonDefeated:: end MauvilleCity_Gym_EventScript_GiveShockWave2:: - giveitem ITEM_TM34 + giveitem ITEM_TM_SHOCK_WAVE goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull msgbox MauvilleCity_Gym_Text_ExplainShockWave, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM34 + setflag FLAG_RECEIVED_TM_SHOCK_WAVE release end MauvilleCity_Gym_EventScript_GiveShockWave:: - giveitem ITEM_TM34 + giveitem ITEM_TM_SHOCK_WAVE goto_if_eq VAR_RESULT, FALSE, Common_EventScript_BagIsFull msgbox MauvilleCity_Gym_Text_ExplainShockWave, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM34 + setflag FLAG_RECEIVED_TM_SHOCK_WAVE return MauvilleCity_Gym_EventScript_CompletedNewMauville:: diff --git a/data/maps/MauvilleCity_House1/scripts.inc b/data/maps/MauvilleCity_House1/scripts.inc index d0d3481a66..2e4e9abcbc 100644 --- a/data/maps/MauvilleCity_House1/scripts.inc +++ b/data/maps/MauvilleCity_House1/scripts.inc @@ -4,10 +4,10 @@ MauvilleCity_House1_MapScripts:: MauvilleCity_House1_EventScript_RockSmashDude:: lock faceplayer - goto_if_set FLAG_RECEIVED_HM06, MauvilleCity_House1_EventScript_ReceivedRockSmash + goto_if_set FLAG_RECEIVED_HM_ROCK_SMASH, MauvilleCity_House1_EventScript_ReceivedRockSmash msgbox MauvilleCity_House1_Text_ImRockSmashDudeTakeThis, MSGBOX_DEFAULT - giveitem ITEM_HM06 - setflag FLAG_RECEIVED_HM06 + giveitem ITEM_HM_ROCK_SMASH + setflag FLAG_RECEIVED_HM_ROCK_SMASH setflag FLAG_HIDE_ROUTE_111_ROCK_SMASH_TIP_GUY msgbox MauvilleCity_House1_Text_ExplainRockSmash, MSGBOX_DEFAULT release diff --git a/data/maps/MeteorFalls_1F_1R/map.json b/data/maps/MeteorFalls_1F_1R/map.json index 71f1d1cc5b..e0d32c5804 100644 --- a/data/maps/MeteorFalls_1F_1R/map.json +++ b/data/maps/MeteorFalls_1F_1R/map.json @@ -24,8 +24,8 @@ "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "MeteorFalls_1F_1R_EventScript_ItemTM23", - "flag": "FLAG_ITEM_METEOR_FALLS_1F_1R_TM23" + "script": "MeteorFalls_1F_1R_EventScript_ItemTMIronTail", + "flag": "FLAG_ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", diff --git a/data/maps/MeteorFalls_B1F_2R/map.json b/data/maps/MeteorFalls_B1F_2R/map.json index 8d153c4239..79a89874e9 100644 --- a/data/maps/MeteorFalls_B1F_2R/map.json +++ b/data/maps/MeteorFalls_B1F_2R/map.json @@ -24,8 +24,8 @@ "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "MeteorFalls_B1F_2R_EventScript_ItemTM02", - "flag": "FLAG_ITEM_METEOR_FALLS_B1F_2R_TM02" + "script": "MeteorFalls_B1F_2R_EventScript_ItemTMDragonClaw", + "flag": "FLAG_ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW" } ], "warp_events": [ diff --git a/data/maps/MossdeepCity/scripts.inc b/data/maps/MossdeepCity/scripts.inc index 836490cbdd..a03b1db820 100644 --- a/data/maps/MossdeepCity/scripts.inc +++ b/data/maps/MossdeepCity/scripts.inc @@ -20,7 +20,7 @@ MossdeepCity_OnTransition: MossdeepCity_EventScript_PokefanF:: lock faceplayer - goto_if_set FLAG_RECEIVED_HM08, MossdeepCity_EventScript_PokefanFMagmaGone + goto_if_set FLAG_RECEIVED_HM_DIVE, MossdeepCity_EventScript_PokefanFMagmaGone msgbox MossdeepCity_Text_SpaceCenterReceivedLetter, MSGBOX_DEFAULT release end @@ -33,7 +33,7 @@ MossdeepCity_EventScript_PokefanFMagmaGone:: MossdeepCity_EventScript_Sailor:: lock faceplayer - goto_if_set FLAG_RECEIVED_HM08, MossdeepCity_EventScript_SailorMagmaGone + goto_if_set FLAG_RECEIVED_HM_DIVE, MossdeepCity_EventScript_SailorMagmaGone msgbox MossdeepCity_Text_MossdeepTargetedByMagma, MSGBOX_DEFAULT release end diff --git a/data/maps/MossdeepCity_Gym/scripts.inc b/data/maps/MossdeepCity_Gym/scripts.inc index 8892097dee..f2d08c13b1 100644 --- a/data/maps/MossdeepCity_Gym/scripts.inc +++ b/data/maps/MossdeepCity_Gym/scripts.inc @@ -52,7 +52,7 @@ MossdeepCity_Gym_EventScript_TateAndLiza:: trainerbattle_double TRAINER_TATE_AND_LIZA_1, MossdeepCity_Gym_Text_TateAndLizaIntro, MossdeepCity_Gym_Text_TateAndLizaDefeat, MossdeepCity_Gym_Text_TateAndLizaNeedTwoMons, MossdeepCity_Gym_EventScript_TateAndLizaDefeated, NO_MUSIC specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, MossdeepCity_Gym_EventScript_TateAndLizaRematch - goto_if_unset FLAG_RECEIVED_TM04, MossdeepCity_Gym_EventScript_GiveCalmMind2 + goto_if_unset FLAG_RECEIVED_TM_CALM_MIND, MossdeepCity_Gym_EventScript_GiveCalmMind2 msgbox MossdeepCity_Gym_Text_TateAndLizaPostBattle, MSGBOX_DEFAULT release end @@ -90,18 +90,18 @@ MossdeepCity_Gym_EventScript_TateAndLizaDefeated:: end MossdeepCity_Gym_EventScript_GiveCalmMind2:: - giveitem ITEM_TM04 + giveitem ITEM_TM_CALM_MIND goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull msgbox MossdeepCity_Gym_Text_ExplainCalmMind, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM04 + setflag FLAG_RECEIVED_TM_CALM_MIND release end MossdeepCity_Gym_EventScript_GiveCalmMind:: - giveitem ITEM_TM04 + giveitem ITEM_TM_CALM_MIND goto_if_eq VAR_RESULT, FALSE, Common_EventScript_BagIsFull msgbox MossdeepCity_Gym_Text_ExplainCalmMind, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM04 + setflag FLAG_RECEIVED_TM_CALM_MIND return MossdeepCity_Gym_EventScript_TateAndLizaRematch:: diff --git a/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc b/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc index 263b071056..e17af35724 100644 --- a/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc +++ b/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc @@ -229,11 +229,11 @@ MossdeepCity_SpaceCenter_1F_EventScript_Grunt2:: copyobjectxytoperm LOCALID_STAIR_GRUNT switch VAR_FACING case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsWest - #ifdef BUGFIX +#ifdef BUGFIX case DIR_EAST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast - #else +#else case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast - #endif +#endif applymovement LOCALID_STAIR_GRUNT, MossdeepCity_SpaceCenter_1F_Movement_MoveGruntFromStairs waitmovement 0 setvar VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE, 2 diff --git a/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc b/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc index 4a22bf8eea..c82a33e78d 100644 --- a/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc +++ b/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc @@ -320,6 +320,9 @@ MossdeepCity_SpaceCenter_2F_EventScript_DefeatedMaxieTabitha:: setobjectmovementtype LOCALID_SCIENTIST, MOVEMENT_TYPE_WANDER_AROUND addobject LOCALID_SCIENTIST fadescreen FADE_FROM_BLACK +#ifdef BUGFIX + releaseall +#endif end MossdeepCity_SpaceCenter_2F_EventScript_StevenFacePlayer:: diff --git a/data/maps/MossdeepCity_StevensHouse/scripts.inc b/data/maps/MossdeepCity_StevensHouse/scripts.inc index 0470e977a6..0f9255e5b6 100644 --- a/data/maps/MossdeepCity_StevensHouse/scripts.inc +++ b/data/maps/MossdeepCity_StevensHouse/scripts.inc @@ -40,8 +40,8 @@ MossdeepCity_StevensHouse_EventScript_StevenGivesDive:: applymovement LOCALID_STEVEN, MossdeepCity_StevensHouse_Movement_StevenApproachPlayer waitmovement 0 msgbox MossdeepCity_StevensHouse_Text_YouveEarnedHMDive, MSGBOX_DEFAULT - giveitem ITEM_HM08 - setflag FLAG_RECEIVED_HM08 + giveitem ITEM_HM_DIVE + setflag FLAG_RECEIVED_HM_DIVE setflag FLAG_OMIT_DIVE_FROM_STEVEN_LETTER msgbox MossdeepCity_StevensHouse_Text_ExplainDive, MSGBOX_DEFAULT closemessage @@ -85,7 +85,7 @@ MossdeepCity_StevensHouse_EventScript_LeaveBeldum:: end MossdeepCity_StevensHouse_EventScript_GiveBeldum:: - setvar VAR_TEMP_1, SPECIES_BELDUM + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_BELDUM givemon SPECIES_BELDUM, 5 goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, MossdeepCity_StevensHouse_EventScript_SendBeldumParty goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, MossdeepCity_StevensHouse_EventScript_SendBeldumPC @@ -146,8 +146,8 @@ MossdeepCity_StevensHouse_EventScript_Letter:: @ Unused, leftover from RS MossdeepCity_StevensHouse_EventScript_DiveItemBall:: - finditem ITEM_HM08 - setflag FLAG_RECEIVED_HM08 + finditem ITEM_HM_DIVE + setflag FLAG_RECEIVED_HM_DIVE end MossdeepCity_StevensHouse_Text_YouveEarnedHMDive: diff --git a/data/maps/MtPyre_6F/map.json b/data/maps/MtPyre_6F/map.json index 9da33f4bc6..06bd940eac 100644 --- a/data/maps/MtPyre_6F/map.json +++ b/data/maps/MtPyre_6F/map.json @@ -37,8 +37,8 @@ "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "MtPyre_6F_EventScript_ItemTM30", - "flag": "FLAG_ITEM_MT_PYRE_6F_TM30" + "script": "MtPyre_6F_EventScript_ItemTMShadowBall", + "flag": "FLAG_ITEM_MT_PYRE_6F_TM_SHADOW_BALL" }, { "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_M", diff --git a/data/maps/MtPyre_Exterior/map.json b/data/maps/MtPyre_Exterior/map.json index 417a38d977..a65f1259d4 100644 --- a/data/maps/MtPyre_Exterior/map.json +++ b/data/maps/MtPyre_Exterior/map.json @@ -37,8 +37,8 @@ "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "MtPyre_Exterior_EventScript_ItemTM48", - "flag": "FLAG_ITEM_MT_PYRE_EXTERIOR_TM48" + "script": "MtPyre_Exterior_EventScript_ItemTMSkillSwap", + "flag": "FLAG_ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP" } ], "warp_events": [ diff --git a/data/maps/PacifidlogTown_House2/scripts.inc b/data/maps/PacifidlogTown_House2/scripts.inc index 175b477e7a..3acb7583e8 100644 --- a/data/maps/PacifidlogTown_House2/scripts.inc +++ b/data/maps/PacifidlogTown_House2/scripts.inc @@ -38,7 +38,7 @@ PacifidlogTown_House2_EventScript_ClearReceivedFanClubTM:: PacifidlogTown_House2_EventScript_GiveReturn:: msgbox PacifidlogTown_House2_Text_AdoringPokemonTakeThis, MSGBOX_DEFAULT - giveitem ITEM_TM27 + giveitem ITEM_TM_RETURN goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull setflag FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK special SetPacifidlogTMReceivedDay @@ -53,7 +53,7 @@ PacifidlogTown_House2_EventScript_PutInEffort:: PacifidlogTown_House2_EventScript_GiveFrustration:: msgbox PacifidlogTown_House2_Text_ViciousPokemonTakeThis, MSGBOX_DEFAULT - giveitem ITEM_TM21 + giveitem ITEM_TM_FRUSTRATION goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull setflag FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK special SetPacifidlogTMReceivedDay diff --git a/data/maps/PetalburgCity_Gym/scripts.inc b/data/maps/PetalburgCity_Gym/scripts.inc index 836da26bfb..8b107c68ec 100644 --- a/data/maps/PetalburgCity_Gym/scripts.inc +++ b/data/maps/PetalburgCity_Gym/scripts.inc @@ -332,7 +332,7 @@ PetalburgCity_Gym_EventScript_NormanFaceDoorEast:: PetalburgCity_Gym_EventScript_NormanPostBattle:: call PetalburgCity_Gym_EventScript_ShouldGiveEnigmaBerry goto_if_eq VAR_RESULT, TRUE, PetalburgCity_Gym_EventScript_GiveEnigmaBerry - goto_if_unset FLAG_RECEIVED_TM42, PetalburgCity_Gym_EventScript_GiveFacade2 + goto_if_unset FLAG_RECEIVED_TM_FACADE, PetalburgCity_Gym_EventScript_GiveFacade2 goto_if_set FLAG_SYS_GAME_CLEAR, PetalburgCity_Gym_EventScript_NoAmountOfTrainingIsEnough msgbox PetalburgCity_Gym_Text_DadGoingToKeepTraining, MSGBOX_DEFAULT release @@ -405,9 +405,9 @@ PetalburgCity_Gym_EventScript_NormanBattle:: end PetalburgCity_Gym_EventScript_GiveFacade:: - giveitem ITEM_TM42 + giveitem ITEM_TM_FACADE goto_if_eq VAR_RESULT, FALSE, Common_EventScript_BagIsFull - setflag FLAG_RECEIVED_TM42 + setflag FLAG_RECEIVED_TM_FACADE msgbox PetalburgCity_Gym_Text_ExplainFacade, MSGBOX_DEFAULT return diff --git a/data/maps/PetalburgCity_WallysHouse/scripts.inc b/data/maps/PetalburgCity_WallysHouse/scripts.inc index 3a06208a78..f7e2e97828 100644 --- a/data/maps/PetalburgCity_WallysHouse/scripts.inc +++ b/data/maps/PetalburgCity_WallysHouse/scripts.inc @@ -15,14 +15,14 @@ PetalburgCity_WallysHouse_EventScript_PlayerWallysDadFaceEachOther:: end PetalburgCity_WallysHouse_OnFrame: - map_script_2 VAR_PETALBURG_CITY_STATE, 4, PetalburgCity_WallysHouse_EventScript_GiveHM03Surf + map_script_2 VAR_PETALBURG_CITY_STATE, 4, PetalburgCity_WallysHouse_EventScript_GiveHMSurf .2byte 0 -PetalburgCity_WallysHouse_EventScript_GiveHM03Surf:: +PetalburgCity_WallysHouse_EventScript_GiveHMSurf:: lockall msgbox PetalburgCity_WallysHouse_Text_PleaseExcuseUs, MSGBOX_DEFAULT - giveitem ITEM_HM03 - setflag FLAG_RECEIVED_HM03 + giveitem ITEM_HM_SURF + setflag FLAG_RECEIVED_HM_SURF msgbox PetalburgCity_WallysHouse_Text_SurfGoAllSortsOfPlaces, MSGBOX_DEFAULT setvar VAR_PETALBURG_CITY_STATE, 5 releaseall @@ -32,14 +32,14 @@ PetalburgCity_WallysHouse_EventScript_WallysDad:: lock faceplayer goto_if_set FLAG_DEFEATED_WALLY_VICTORY_ROAD, PetalburgCity_WallysHouse_EventScript_DefeatedWallyInVictoryRoad - goto_if_set FLAG_RECEIVED_HM03, PetalburgCity_WallysHouse_EventScript_ReceievedHM03Surf + goto_if_set FLAG_RECEIVED_HM_SURF, PetalburgCity_WallysHouse_EventScript_ReceievedHMSurf goto_if_set FLAG_THANKED_FOR_PLAYING_WITH_WALLY, PetalburgCity_WallysHouse_EventScript_PlayedWithWally msgbox PetalburgCity_WallysHouse_Text_ThanksForPlayingWithWally, MSGBOX_DEFAULT setflag FLAG_THANKED_FOR_PLAYING_WITH_WALLY release end -PetalburgCity_WallysHouse_EventScript_ReceievedHM03Surf:: +PetalburgCity_WallysHouse_EventScript_ReceievedHMSurf:: msgbox PetalburgCity_WallysHouse_Text_WallyIsComingHomeSoon, MSGBOX_DEFAULT release end @@ -57,12 +57,12 @@ PetalburgCity_WallysHouse_EventScript_PlayedWithWally:: PetalburgCity_WallysHouse_EventScript_WallysMom:: lock faceplayer - goto_if_set FLAG_RECEIVED_HM03, PetalburgCity_WallysHouse_EventScript_ReceivedHM03Surf + goto_if_set FLAG_RECEIVED_HM_SURF, PetalburgCity_WallysHouse_EventScript_ReceivedHMSurf msgbox PetalburgCity_WallysHouse_Text_WallyWasReallyHappy, MSGBOX_DEFAULT release end -PetalburgCity_WallysHouse_EventScript_ReceivedHM03Surf:: +PetalburgCity_WallysHouse_EventScript_ReceivedHMSurf:: msgbox PetalburgCity_WallysHouse_Text_WallyLeftWithoutTelling, MSGBOX_DEFAULT release end diff --git a/data/maps/Route104/scripts.inc b/data/maps/Route104/scripts.inc index 68aeb0a212..dfb7675e90 100644 --- a/data/maps/Route104/scripts.inc +++ b/data/maps/Route104/scripts.inc @@ -329,11 +329,11 @@ Route104_EventScript_Woman:: Route104_EventScript_Boy2:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM09, Route104_EventScript_ReceivedBulletSeed + goto_if_set FLAG_RECEIVED_TM_BULLET_SEED, Route104_EventScript_ReceivedBulletSeed msgbox Route104_Text_LikeFillingMouthWithSeedsTakeThis, MSGBOX_DEFAULT - giveitem ITEM_TM09 + giveitem ITEM_TM_BULLET_SEED goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM09 + setflag FLAG_RECEIVED_TM_BULLET_SEED release end diff --git a/data/maps/Route110_TrickHouseEnd/scripts.inc b/data/maps/Route110_TrickHouseEnd/scripts.inc index be8f75e961..9f31d89e4c 100644 --- a/data/maps/Route110_TrickHouseEnd/scripts.inc +++ b/data/maps/Route110_TrickHouseEnd/scripts.inc @@ -109,7 +109,7 @@ Route110_TrickHouseEnd_EventScript_CompletedPuzzle5:: msgbox Route110_TrickHouseEnd_Text_AllNightToMakeMechadolls, MSGBOX_DEFAULT msgbox Route110_TrickHouseEnd_Text_YouHaveEarnedThisReward, MSGBOX_DEFAULT setvar VAR_TRICK_HOUSE_PRIZE_PICKUP, 0 - giveitem ITEM_TM12 + giveitem ITEM_TM_TAUNT call_if_eq VAR_RESULT, FALSE, Route110_TrickHouseEnd_EventScript_BagFull msgbox Route110_TrickHouseEnd_Text_MakeNewTricksToStumpYou, MSGBOX_DEFAULT closemessage diff --git a/data/maps/Route110_TrickHouseEntrance/scripts.inc b/data/maps/Route110_TrickHouseEntrance/scripts.inc index 52327553e3..51135ac339 100644 --- a/data/maps/Route110_TrickHouseEntrance/scripts.inc +++ b/data/maps/Route110_TrickHouseEntrance/scripts.inc @@ -370,7 +370,7 @@ Route110_TrickHouseEntrance_EventScript_GivePuzzle4Reward:: end Route110_TrickHouseEntrance_EventScript_GivePuzzle5Reward:: - giveitem ITEM_TM12 + giveitem ITEM_TM_TAUNT goto_if_eq VAR_RESULT, TRUE, Route110_TrickHouseEntrance_EventScript_GotReward call_if_eq VAR_RESULT, FALSE, Common_EventScript_BagIsFull msgbox Route110_TrickHouseEntrance_Text_DidYouNotComeToClaimReward, MSGBOX_DEFAULT diff --git a/data/maps/Route110_TrickHousePuzzle6/scripts.inc b/data/maps/Route110_TrickHousePuzzle6/scripts.inc index e442d094d5..3a6d221e43 100644 --- a/data/maps/Route110_TrickHousePuzzle6/scripts.inc +++ b/data/maps/Route110_TrickHousePuzzle6/scripts.inc @@ -11,6 +11,7 @@ Route110_TrickHousePuzzle6_OnWarp: map_script_2 VAR_TEMP_0, VAR_TEMP_0, Route110_TrickHousePuzzle6_EventScript_InitPuzzle .2byte 0 +@ NOTE: This rotating gate puzzle makes use of VAR_TEMP_0 - VAR_TEMP_5 Route110_TrickHousePuzzle6_EventScript_InitPuzzle:: special RotatingGate_InitPuzzleAndGraphics end diff --git a/data/maps/Route111/map.json b/data/maps/Route111/map.json index bc476ebaaf..6efa1770e2 100644 --- a/data/maps/Route111/map.json +++ b/data/maps/Route111/map.json @@ -261,8 +261,8 @@ "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "Route111_EventScript_ItemTM37", - "flag": "FLAG_ITEM_ROUTE_111_TM37" + "script": "Route111_EventScript_ItemTMSandstorm", + "flag": "FLAG_ITEM_ROUTE_111_TM_SANDSTORM" }, { "graphics_id": "OBJ_EVENT_GFX_BERRY_TREE", diff --git a/data/maps/Route113/map.json b/data/maps/Route113/map.json index 4c45d904cb..2e5890d656 100644 --- a/data/maps/Route113/map.json +++ b/data/maps/Route113/map.json @@ -450,8 +450,8 @@ "x": 22, "y": 5, "elevation": 3, - "item": "ITEM_TM32", - "flag": "FLAG_HIDDEN_ITEM_ROUTE_113_TM32" + "item": "ITEM_TM_DOUBLE_TEAM", + "flag": "FLAG_HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM" }, { "type": "hidden_item", diff --git a/data/maps/Route114/scripts.inc b/data/maps/Route114/scripts.inc index abf70ea081..db46f7bb80 100644 --- a/data/maps/Route114/scripts.inc +++ b/data/maps/Route114/scripts.inc @@ -43,11 +43,11 @@ Route114_EventScript_ReceivedBerry:: Route114_EventScript_RoarGentleman:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM05, Route114_EventScript_ReceivedRoar + goto_if_set FLAG_RECEIVED_TM_ROAR, Route114_EventScript_ReceivedRoar msgbox Route114_Text_AllMyMonDoesIsRoarTakeThis, MSGBOX_DEFAULT - giveitem ITEM_TM05 + giveitem ITEM_TM_ROAR goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM05 + setflag FLAG_RECEIVED_TM_ROAR msgbox Route114_Text_ExplainRoar, MSGBOX_DEFAULT release end diff --git a/data/maps/Route114_FossilManiacsHouse/scripts.inc b/data/maps/Route114_FossilManiacsHouse/scripts.inc index ba3c0c60e5..2586ea1076 100644 --- a/data/maps/Route114_FossilManiacsHouse/scripts.inc +++ b/data/maps/Route114_FossilManiacsHouse/scripts.inc @@ -9,11 +9,11 @@ Route114_FossilManiacsHouse_OnTransition: Route114_FossilManiacsHouse_EventScript_FossilManiacsBrother:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM28, Route114_FossilManiacsHouse_EventScript_ReceivedDig + goto_if_set FLAG_RECEIVED_TM_DIG, Route114_FossilManiacsHouse_EventScript_ReceivedDig msgbox Route114_FossilManiacsHouse_Text_HaveThisToDigLikeMyBrother, MSGBOX_DEFAULT - giveitem ITEM_TM28 + giveitem ITEM_TM_DIG goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM28 + setflag FLAG_RECEIVED_TM_DIG release end diff --git a/data/maps/Route115/map.json b/data/maps/Route115/map.json index a4143fad30..ee0d71349d 100644 --- a/data/maps/Route115/map.json +++ b/data/maps/Route115/map.json @@ -165,8 +165,8 @@ "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "Route115_EventScript_ItemTM01", - "flag": "FLAG_ITEM_ROUTE_115_TM01" + "script": "Route115_EventScript_ItemTMFocusPunch", + "flag": "FLAG_ITEM_ROUTE_115_TM_FOCUS_PUNCH" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", diff --git a/data/maps/Route119/scripts.inc b/data/maps/Route119/scripts.inc index 94094206c7..6c9767dcb6 100644 --- a/data/maps/Route119/scripts.inc +++ b/data/maps/Route119/scripts.inc @@ -132,8 +132,8 @@ Route119_EventScript_DefeatedBrendan:: end Route119_EventScript_GiveFlyHM:: - giveitem ITEM_HM02 - setflag FLAG_RECEIVED_HM02 + giveitem ITEM_HM_FLY + setflag FLAG_RECEIVED_HM_FLY return Route119_EventScript_RivalExitScottArrive:: diff --git a/data/maps/Route119_WeatherInstitute_2F/scripts.inc b/data/maps/Route119_WeatherInstitute_2F/scripts.inc index 2060cb03c9..e5df03d4a1 100644 --- a/data/maps/Route119_WeatherInstitute_2F/scripts.inc +++ b/data/maps/Route119_WeatherInstitute_2F/scripts.inc @@ -88,7 +88,7 @@ Route119_WeatherInstitute_2F_EventScript_ShellyDefeated:: Route119_WeatherInstitute_2F_EventScript_ReceiveCastform:: msgbox Route119_WeatherInstitute_2F_Text_ThanksPleaseTakePokemon, MSGBOX_DEFAULT - setvar VAR_TEMP_1, SPECIES_CASTFORM + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_CASTFORM givemon SPECIES_CASTFORM, 25, ITEM_MYSTIC_WATER goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, Route119_WeatherInstitute_2F_EventScript_ReceiveCastformParty goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, Route119_WeatherInstitute_2F_EventScript_ReceiveCastformPC diff --git a/data/maps/Route123/scripts.inc b/data/maps/Route123/scripts.inc index fe63661261..92cfa62768 100644 --- a/data/maps/Route123/scripts.inc +++ b/data/maps/Route123/scripts.inc @@ -9,14 +9,14 @@ Route123_OnTransition: Route123_EventScript_GigaDrainGirl:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM19, Route123_EventScript_ReceivedGigaDrain + goto_if_set FLAG_RECEIVED_TM_GIGA_DRAIN, Route123_EventScript_ReceivedGigaDrain msgbox Route123_Text_LoveGrassMonsHaveAny, MSGBOX_DEFAULT special IsGrassTypeInParty goto_if_eq VAR_RESULT, FALSE, Route123_EventScript_NoGrassMons msgbox Route123_Text_YouLikeGrassMonsTooHaveThis, MSGBOX_DEFAULT - giveitem ITEM_TM19 + giveitem ITEM_TM_GIGA_DRAIN goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM19 + setflag FLAG_RECEIVED_TM_GIGA_DRAIN msgbox Route123_Text_CheckTreesWithMyGrassMon, MSGBOX_DEFAULT release end diff --git a/data/maps/Route130/map.json b/data/maps/Route130/map.json index 7b37a10edd..bb79a2bb4a 100644 --- a/data/maps/Route130/map.json +++ b/data/maps/Route130/map.json @@ -62,7 +62,7 @@ "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "BERRY_TREE_ROUTE_130_LIECHI", "script": "BerryTreeScript", - "flag": "FLAG_TEMP_11" + "flag": "FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE" }, { "graphics_id": "OBJ_EVENT_GFX_SWIMMER_M", diff --git a/data/maps/Route130/scripts.inc b/data/maps/Route130/scripts.inc index 7e0ecc8bd1..b5b9227e84 100644 --- a/data/maps/Route130/scripts.inc +++ b/data/maps/Route130/scripts.inc @@ -6,7 +6,8 @@ Route130_OnTransition: call_if_ge VAR_SOOTOPOLIS_CITY_STATE, 4, Route130_EventScript_CheckSetAbnormalWeather specialvar VAR_RESULT, IsMirageIslandPresent goto_if_eq VAR_RESULT, TRUE, Route130_EventScript_SetMirageIslandLayout - setflag FLAG_TEMP_11 +@ Mirage Island isn't currently visible, hide any objects on the island. Only the first flag is actually associated with anything. + setflag FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE setflag FLAG_TEMP_12 setflag FLAG_TEMP_13 setflag FLAG_TEMP_14 diff --git a/data/maps/RustboroCity_CuttersHouse/scripts.inc b/data/maps/RustboroCity_CuttersHouse/scripts.inc index f1d6030761..11cd0f608f 100644 --- a/data/maps/RustboroCity_CuttersHouse/scripts.inc +++ b/data/maps/RustboroCity_CuttersHouse/scripts.inc @@ -4,10 +4,10 @@ RustboroCity_CuttersHouse_MapScripts:: RustboroCity_CuttersHouse_EventScript_Cutter:: lock faceplayer - goto_if_set FLAG_RECEIVED_HM01, RustboroCity_CuttersHouse_EventScript_ExplainCut + goto_if_set FLAG_RECEIVED_HM_CUT, RustboroCity_CuttersHouse_EventScript_ExplainCut msgbox RustboroCity_CuttersHouse_Text_YouCanPutThisHMToGoodUse, MSGBOX_DEFAULT - giveitem ITEM_HM01 - setflag FLAG_RECEIVED_HM01 + giveitem ITEM_HM_CUT + setflag FLAG_RECEIVED_HM_CUT msgbox RustboroCity_CuttersHouse_Text_ExplainCut, MSGBOX_DEFAULT release end diff --git a/data/maps/RustboroCity_DevonCorp_2F/scripts.inc b/data/maps/RustboroCity_DevonCorp_2F/scripts.inc index 747070645c..ba3a259ec3 100644 --- a/data/maps/RustboroCity_DevonCorp_2F/scripts.inc +++ b/data/maps/RustboroCity_DevonCorp_2F/scripts.inc @@ -144,7 +144,7 @@ RustboroCity_DevonCorp_2F_EventScript_AnorithReady:: end RustboroCity_DevonCorp_2F_EventScript_ReceiveLileep:: - setvar VAR_TEMP_1, SPECIES_LILEEP + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_LILEEP givemon SPECIES_LILEEP, 20 goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, RustboroCity_DevonCorp_2F_EventScript_ReceiveLileepParty goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, RustboroCity_DevonCorp_2F_EventScript_ReceiveLileepPC @@ -189,7 +189,7 @@ RustboroCity_DevonCorp_2F_EventScript_FinishReceivingLileep:: end RustboroCity_DevonCorp_2F_EventScript_ReceiveAnorith:: - setvar VAR_TEMP_1, SPECIES_ANORITH + setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_ANORITH givemon SPECIES_ANORITH, 20 goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, RustboroCity_DevonCorp_2F_EventScript_ReceiveAnorithParty goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, RustboroCity_DevonCorp_2F_EventScript_ReceiveAnorithPC diff --git a/data/maps/RustboroCity_Gym/scripts.inc b/data/maps/RustboroCity_Gym/scripts.inc index e1596a9730..53ed0b20be 100644 --- a/data/maps/RustboroCity_Gym/scripts.inc +++ b/data/maps/RustboroCity_Gym/scripts.inc @@ -5,7 +5,7 @@ RustboroCity_Gym_EventScript_Roxanne:: trainerbattle_single TRAINER_ROXANNE_1, RustboroCity_Gym_Text_RoxanneIntro, RustboroCity_Gym_Text_RoxanneDefeat, RustboroCity_Gym_EventScript_RoxanneDefeated, NO_MUSIC specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, RustboroCity_Gym_EventScript_RoxanneRematch - goto_if_unset FLAG_RECEIVED_TM39, RustboroCity_Gym_EventScript_GiveRockTomb + goto_if_unset FLAG_RECEIVED_TM_ROCK_TOMB, RustboroCity_Gym_EventScript_GiveRockTomb msgbox RustboroCity_Gym_Text_RoxannePostBattle, MSGBOX_DEFAULT release end @@ -26,9 +26,9 @@ RustboroCity_Gym_EventScript_RoxanneDefeated:: end RustboroCity_Gym_EventScript_GiveRockTomb:: - giveitem ITEM_TM39 + giveitem ITEM_TM_ROCK_TOMB goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM39 + setflag FLAG_RECEIVED_TM_ROCK_TOMB msgbox RustboroCity_Gym_Text_ExplainRockTomb, MSGBOX_DEFAULT release end diff --git a/data/maps/RusturfTunnel/scripts.inc b/data/maps/RusturfTunnel/scripts.inc index e7eee5817a..a705100956 100644 --- a/data/maps/RusturfTunnel/scripts.inc +++ b/data/maps/RusturfTunnel/scripts.inc @@ -62,8 +62,8 @@ RusturfTunnel_EventScript_ClearTunnelScene:: msgbox RusturfTunnel_Text_YouShatteredBoulderTakeHM, MSGBOX_DEFAULT call_if_eq VAR_TEMP_1, 2, RusturfTunnel_EventScript_WandasBoyfriendApproachPlayer call_if_eq VAR_TEMP_1, 3, RusturfTunnel_EventScript_WandasBoyfriendApproachPlayer - giveitem ITEM_HM04 - setflag FLAG_RECEIVED_HM04 + giveitem ITEM_HM_STRENGTH + setflag FLAG_RECEIVED_HM_STRENGTH msgbox RusturfTunnel_Text_ExplainStrength, MSGBOX_DEFAULT closemessage call_if_eq VAR_TEMP_1, 1, RusturfTunnel_EventScript_BoyfriendApproachWanda1 diff --git a/data/maps/SSTidalCorridor/scripts.inc b/data/maps/SSTidalCorridor/scripts.inc index b39b9a4336..0d425889a7 100644 --- a/data/maps/SSTidalCorridor/scripts.inc +++ b/data/maps/SSTidalCorridor/scripts.inc @@ -124,7 +124,7 @@ SSTidalCorridor_EventScript_ExitSailor:: SSTidalCorridor_EventScript_ExitLilycove:: setrespawn HEAL_LOCATION_LILYCOVE_CITY msgbox SSTidalCorridor_Text_WeveArrived, MSGBOX_DEFAULT - call_if_set FLAG_RECEIVED_TM49, SSTidalCorridor_EventScript_HideSnatchGiver + call_if_set FLAG_RECEIVED_TM_SNATCH, SSTidalCorridor_EventScript_HideSnatchGiver warp MAP_LILYCOVE_CITY_HARBOR, 8, 11 waitstate release @@ -133,7 +133,7 @@ SSTidalCorridor_EventScript_ExitLilycove:: SSTidalCorridor_EventScript_ExitSlateport:: setrespawn HEAL_LOCATION_SLATEPORT_CITY msgbox SSTidalCorridor_Text_WeveArrived, MSGBOX_DEFAULT - call_if_set FLAG_RECEIVED_TM49, SSTidalCorridor_EventScript_HideSnatchGiver + call_if_set FLAG_RECEIVED_TM_SNATCH, SSTidalCorridor_EventScript_HideSnatchGiver warp MAP_SLATEPORT_CITY_HARBOR, 8, 11 waitstate release diff --git a/data/maps/SSTidalRooms/scripts.inc b/data/maps/SSTidalRooms/scripts.inc index c3aa8ff8ab..53596ba838 100644 --- a/data/maps/SSTidalRooms/scripts.inc +++ b/data/maps/SSTidalRooms/scripts.inc @@ -4,11 +4,11 @@ SSTidalRooms_MapScripts:: SSTidalRooms_EventScript_SnatchGiver:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM49, SSTidalRooms_EventScript_ExplainSnatch + goto_if_set FLAG_RECEIVED_TM_SNATCH, SSTidalRooms_EventScript_ExplainSnatch msgbox SSTidalRooms_Text_NotSuspiciousTakeThis, MSGBOX_DEFAULT - giveitem ITEM_TM49 + giveitem ITEM_TM_SNATCH goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM49 + setflag FLAG_RECEIVED_TM_SNATCH msgbox SSTidalRooms_Text_ExplainSnatch, MSGBOX_DEFAULT release end diff --git a/data/maps/SafariZone_Northwest/map.json b/data/maps/SafariZone_Northwest/map.json index 93f3d2a79c..f30ef030a0 100644 --- a/data/maps/SafariZone_Northwest/map.json +++ b/data/maps/SafariZone_Northwest/map.json @@ -48,8 +48,8 @@ "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "SafariZone_Northwest_EventScript_ItemTM22", - "flag": "FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM22" + "script": "SafariZone_Northwest_EventScript_ItemTMSolarBeam", + "flag": "FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM" } ], "warp_events": [], diff --git a/data/maps/ScorchedSlab/map.json b/data/maps/ScorchedSlab/map.json index ca367b9215..5e0380b4e8 100644 --- a/data/maps/ScorchedSlab/map.json +++ b/data/maps/ScorchedSlab/map.json @@ -24,8 +24,8 @@ "movement_range_y": 0, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "ScorchedSlab_EventScript_ItemTM11", - "flag": "FLAG_ITEM_SCORCHED_SLAB_TM11" + "script": "ScorchedSlab_EventScript_ItemTMSunnyDay", + "flag": "FLAG_ITEM_SCORCHED_SLAB_TM_SUNNY_DAY" } ], "warp_events": [ diff --git a/data/maps/SeafloorCavern_Room9/map.json b/data/maps/SeafloorCavern_Room9/map.json index f191941a2b..04fb621df1 100644 --- a/data/maps/SeafloorCavern_Room9/map.json +++ b/data/maps/SeafloorCavern_Room9/map.json @@ -89,8 +89,8 @@ "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "SeafloorCavern_Room9_EventScript_ItemTM26", - "flag": "FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM26" + "script": "SeafloorCavern_Room9_EventScript_ItemTMEarthquake", + "flag": "FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE" }, { "graphics_id": "OBJ_EVENT_GFX_KYOGRE_ASLEEP", diff --git a/data/maps/ShoalCave_LowTideEntranceRoom/scripts.inc b/data/maps/ShoalCave_LowTideEntranceRoom/scripts.inc index 905a9a77a7..80368b1488 100644 --- a/data/maps/ShoalCave_LowTideEntranceRoom/scripts.inc +++ b/data/maps/ShoalCave_LowTideEntranceRoom/scripts.inc @@ -33,9 +33,9 @@ ShoalCave_LowTideEntranceRoom_EventScript_ShellBellExpert:: removeitem ITEM_SHOAL_SALT, 4 removeitem ITEM_SHOAL_SHELL, 4 giveitem ITEM_SHELL_BELL - goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull + goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull @ Never FALSE, we already made sure there will be room in the bag. msgbox ShoalCave_LowTideEntranceRoom_Text_ExplainShellBell, MSGBOX_DEFAULT - setflag FLAG_TEMP_2 + setflag FLAG_TEMP_2 @ Not read. Perhaps meant to stop him from re-explaining the Shell Bell if multiple are received in one sitting. release end diff --git a/data/maps/ShoalCave_LowTideIceRoom/map.json b/data/maps/ShoalCave_LowTideIceRoom/map.json index f87f88227e..dffa6d0de8 100644 --- a/data/maps/ShoalCave_LowTideIceRoom/map.json +++ b/data/maps/ShoalCave_LowTideIceRoom/map.json @@ -24,8 +24,8 @@ "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "ShoalCave_LowTideIceRoom_EventScript_ItemTM07", - "flag": "FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM07" + "script": "ShoalCave_LowTideIceRoom_EventScript_ItemTMHail", + "flag": "FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", diff --git a/data/maps/SlateportCity/scripts.inc b/data/maps/SlateportCity/scripts.inc index 653f405c45..ae3910750e 100644 --- a/data/maps/SlateportCity/scripts.inc +++ b/data/maps/SlateportCity/scripts.inc @@ -566,8 +566,8 @@ SlateportCity_EventScript_PowerTMClerk:: .align 2 SlateportCity_Pokemart_PowerTMs: - .2byte ITEM_TM10 @ Hidden Power - .2byte ITEM_TM43 @ Secret Power + .2byte ITEM_TM_HIDDEN_POWER + .2byte ITEM_TM_SECRET_POWER .2byte ITEM_NONE release end diff --git a/data/maps/SlateportCity_BattleTentLobby/scripts.inc b/data/maps/SlateportCity_BattleTentLobby/scripts.inc index 0d3fae875f..88dd323da0 100644 --- a/data/maps/SlateportCity_BattleTentLobby/scripts.inc +++ b/data/maps/SlateportCity_BattleTentLobby/scripts.inc @@ -15,11 +15,11 @@ SlateportCity_BattleTentLobby_EventScript_TurnPlayerNorth:: end SlateportCity_BattleTentLobby_OnFrame: - map_script_2 VAR_TEMP_0, 0, SlateportCity_BattleTentLobby_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, SlateportCity_BattleTentLobby_EventScript_QuitWithoutSaving - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_PAUSED, SlateportCity_BattleTentLobby_EventScript_ResumeChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_WON, SlateportCity_BattleTentLobby_EventScript_WonChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_LOST, SlateportCity_BattleTentLobby_EventScript_LostChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, SlateportCity_BattleTentLobby_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, SlateportCity_BattleTentLobby_EventScript_QuitWithoutSaving + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_PAUSED, SlateportCity_BattleTentLobby_EventScript_ResumeChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_WON, SlateportCity_BattleTentLobby_EventScript_WonChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST, SlateportCity_BattleTentLobby_EventScript_LostChallenge .2byte 0 SlateportCity_BattleTentLobby_EventScript_GetChallengeStatus:: @@ -31,7 +31,7 @@ SlateportCity_BattleTentLobby_EventScript_QuitWithoutSaving:: msgbox SlateportCity_BattleTentLobby_Text_DidntSaveBeforeQuitting, MSGBOX_DEFAULT closemessage frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0 - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 frontier_set FRONTIER_DATA_LVL_MODE, FRONTIER_LVL_50 releaseall end @@ -73,7 +73,7 @@ SlateportCity_BattleTentLobby_EventScript_LostChallenge:: SlateportCity_BattleTentLobby_EventScript_EndGivePrize:: msgbox SlateportCity_BattleTentLobby_Text_LookForwardToNextVisit, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -85,7 +85,7 @@ SlateportCity_BattleTentLobby_EventScript_ResumeChallenge:: playse SE_SAVE waitse frontier_set FRONTIER_DATA_PAUSED, FALSE - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 setvar VAR_0x8006, 2 goto SlateportCity_BattleTentLobby_EventScript_EnterChallenge @@ -117,7 +117,7 @@ SlateportCity_BattleTentLobby_EventScript_TryEnterChallenge:: case MULTI_B_PRESSED, SlateportCity_BattleTentLobby_EventScript_LoadPartyCancelChallenge SlateportCity_BattleTentLobby_EventScript_SaveBeforeChallenge:: - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 frontier_set FRONTIER_DATA_SELECTED_MON_ORDER slateporttent_init frontier_set FRONTIER_DATA_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING @@ -125,7 +125,7 @@ SlateportCity_BattleTentLobby_EventScript_SaveBeforeChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, SlateportCity_BattleTentLobby_EventScript_CancelChallengeSaveFailed setvar VAR_0x8006, 0 SlateportCity_BattleTentLobby_EventScript_EnterChallenge:: @@ -133,7 +133,7 @@ SlateportCity_BattleTentLobby_EventScript_EnterChallenge:: closemessage call SlateportCity_BattleTentLobby_EventScript_WalkToDoor warp MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR, 2, 7 - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 waitstate end @@ -199,11 +199,11 @@ SlateportCity_BattleTentLobby_Movement_UnusedEnterDoor:: SlateportCity_BattleTentLobby_EventScript_TormentGiver:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM41, SlateportCity_BattleTentLobby_EventScript_ReceivedTorment + goto_if_set FLAG_RECEIVED_TM_TORMENT, SlateportCity_BattleTentLobby_EventScript_ReceivedTorment msgbox SlateportCity_BattleTentLobby_Text_CouldntFindMonForMe, MSGBOX_DEFAULT - giveitem ITEM_TM41 + giveitem ITEM_TM_TORMENT goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM41 + setflag FLAG_RECEIVED_TM_TORMENT msgbox SlateportCity_BattleTentLobby_Text_ExplainTorment, MSGBOX_DEFAULT release end diff --git a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc index 96892f948d..8b464f73ae 100644 --- a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc +++ b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc @@ -151,9 +151,9 @@ SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGrunt:: applymovement LOCALID_FAMILIAR_GRUNT, Common_Movement_Delay48 waitmovement 0 msgbox SlateportCity_OceanicMuseum_1F_Text_RememberMeTakeThis, MSGBOX_DEFAULT - giveitem ITEM_TM46 + giveitem ITEM_TM_THIEF goto_if_eq VAR_RESULT, 0, SlateportCity_OceanicMuseum_1F_EventScript_NoRoomForThief - setflag FLAG_RECEIVED_TM46 + setflag FLAG_RECEIVED_TM_THIEF msgbox SlateportCity_OceanicMuseum_1F_Text_HopeINeverSeeYouAgain, MSGBOX_DEFAULT closemessage goto_if_eq VAR_FACING, DIR_NORTH, SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExitNorth diff --git a/data/maps/SootopolisCity/scripts.inc b/data/maps/SootopolisCity/scripts.inc index 69f74880ec..16e2d03252 100644 --- a/data/maps/SootopolisCity/scripts.inc +++ b/data/maps/SootopolisCity/scripts.inc @@ -1300,7 +1300,7 @@ SootopolisCity_EventScript_Wallace:: lock faceplayer goto_if_eq VAR_SOOTOPOLIS_CITY_STATE, 4, SootopolisCity_EventScript_GoToSkyPillar - goto_if_set FLAG_RECEIVED_HM07, SootopolisCity_EventScript_GoToGym + goto_if_set FLAG_RECEIVED_HM_WATERFALL, SootopolisCity_EventScript_GoToGym goto_if_set FLAG_SOOTOPOLIS_ARCHIE_MAXIE_LEAVE, SootopolisCity_EventScript_GiveWaterfall msgbox SootopolisCity_Text_AquaMagmaDidntMeanHarm, MSGBOX_DEFAULT release @@ -1308,8 +1308,8 @@ SootopolisCity_EventScript_Wallace:: SootopolisCity_EventScript_GiveWaterfall:: msgbox SootopolisCity_Text_ThankYouForHelpAcceptThis, MSGBOX_DEFAULT - giveitem ITEM_HM07 - setflag FLAG_RECEIVED_HM07 + giveitem ITEM_HM_WATERFALL + setflag FLAG_RECEIVED_HM_WATERFALL msgbox SootopolisCity_Text_ExplainWaterfallGoToGym, MSGBOX_DEFAULT closemessage call_if_eq VAR_FACING, DIR_NORTH, SootopolisCity_EventScript_WallaceMoveFromGym diff --git a/data/maps/SootopolisCity_Gym_1F/scripts.inc b/data/maps/SootopolisCity_Gym_1F/scripts.inc index 7f739935b1..5ae8145299 100644 --- a/data/maps/SootopolisCity_Gym_1F/scripts.inc +++ b/data/maps/SootopolisCity_Gym_1F/scripts.inc @@ -83,7 +83,7 @@ SootopolisCity_Gym_1F_EventScript_Juan:: trainerbattle_single TRAINER_JUAN_1, SootopolisCity_Gym_1F_Text_JuanIntro, SootopolisCity_Gym_1F_Text_JuanDefeat, SootopolisCity_Gym_1F_EventScript_JuanDefeated, NO_MUSIC specialvar VAR_RESULT, ShouldTryRematchBattle goto_if_eq VAR_RESULT, TRUE, SootopolisCity_Gym_1F_EventScript_JuanRematch - goto_if_unset FLAG_RECEIVED_TM03, SootopolisCity_Gym_1F_EventScript_GiveWaterPulse2 + goto_if_unset FLAG_RECEIVED_TM_WATER_PULSE, SootopolisCity_Gym_1F_EventScript_GiveWaterPulse2 goto_if_unset FLAG_BADGE06_GET, SootopolisCity_Gym_1F_EventScript_GoGetFortreeBadge msgbox SootopolisCity_Gym_1F_Text_JuanPostBattle, MSGBOX_DEFAULT release @@ -116,17 +116,17 @@ SootopolisCity_Gym_1F_EventScript_JuanDefeated:: end SootopolisCity_Gym_1F_EventScript_GiveWaterPulse:: - giveitem ITEM_TM03 + giveitem ITEM_TM_WATER_PULSE goto_if_eq VAR_RESULT, FALSE, Common_EventScript_BagIsFull msgbox SootopolisCity_Gym_1F_Text_ExplainWaterPulse, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM03 + setflag FLAG_RECEIVED_TM_WATER_PULSE return SootopolisCity_Gym_1F_EventScript_GiveWaterPulse2:: - giveitem ITEM_TM03 + giveitem ITEM_TM_WATER_PULSE goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull msgbox SootopolisCity_Gym_1F_Text_ExplainWaterPulse, MSGBOX_DEFAULT - setflag FLAG_RECEIVED_TM03 + setflag FLAG_RECEIVED_TM_WATER_PULSE release end diff --git a/data/maps/SootopolisCity_House1/scripts.inc b/data/maps/SootopolisCity_House1/scripts.inc index 40f22a9c1f..b298e51d53 100644 --- a/data/maps/SootopolisCity_House1/scripts.inc +++ b/data/maps/SootopolisCity_House1/scripts.inc @@ -4,11 +4,11 @@ SootopolisCity_House1_MapScripts:: SootopolisCity_House1_EventScript_BrickBreakBlackBelt:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM31, SootopolisCity_House1_EventScript_ReceivedBrickBreak + goto_if_set FLAG_RECEIVED_TM_BRICK_BREAK, SootopolisCity_House1_EventScript_ReceivedBrickBreak msgbox SootopolisCity_House1_Text_DevelopedThisTM, MSGBOX_DEFAULT - giveitem ITEM_TM31 + giveitem ITEM_TM_BRICK_BREAK goto_if_eq VAR_RESULT, FALSE, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM31 + setflag FLAG_RECEIVED_TM_BRICK_BREAK msgbox SootopolisCity_House1_Text_ExplainBrickBreak, MSGBOX_DEFAULT release end diff --git a/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc b/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc index a78a6a78ed..f70baac84f 100644 --- a/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc +++ b/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc @@ -15,11 +15,11 @@ VerdanturfTown_BattleTentLobby_EventScript_TurnPlayerNorth:: end VerdanturfTown_BattleTentLobby_OnFrame: - map_script_2 VAR_TEMP_0, 0, VerdanturfTown_BattleTentLobby_EventScript_GetChallengeStatus - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_SAVING, VerdanturfTown_BattleTentLobby_EventScript_QuitWithoutSaving - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_PAUSED, VerdanturfTown_BattleTentLobby_EventScript_ResumeChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_WON, VerdanturfTown_BattleTentLobby_EventScript_WonChallenge - map_script_2 VAR_TEMP_0, CHALLENGE_STATUS_LOST, VerdanturfTown_BattleTentLobby_EventScript_LostChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, 0, VerdanturfTown_BattleTentLobby_EventScript_GetChallengeStatus + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING, VerdanturfTown_BattleTentLobby_EventScript_QuitWithoutSaving + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_PAUSED, VerdanturfTown_BattleTentLobby_EventScript_ResumeChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_WON, VerdanturfTown_BattleTentLobby_EventScript_WonChallenge + map_script_2 VAR_TEMP_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST, VerdanturfTown_BattleTentLobby_EventScript_LostChallenge .2byte 0 VerdanturfTown_BattleTentLobby_EventScript_GetChallengeStatus:: @@ -31,7 +31,7 @@ VerdanturfTown_BattleTentLobby_EventScript_QuitWithoutSaving:: msgbox BattleFrontier_BattlePalaceLobby_Text_FailedToSaveBeforeEndingChallenge, MSGBOX_DEFAULT closemessage frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0 - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 frontier_set FRONTIER_DATA_LVL_MODE, FRONTIER_LVL_50 releaseall end @@ -59,7 +59,7 @@ VerdanturfTown_BattleTentLobby_EventScript_GivePrize:: waitfanfare msgbox VerdanturfTown_BattleTentLobby_Text_ReturnFortified, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -67,7 +67,7 @@ VerdanturfTown_BattleTentLobby_EventScript_NoRoomForPrize:: msgbox BattleFrontier_BattlePalaceLobby_Text_NoSpaceForPrize, MSGBOX_DEFAULT waitmessage closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -87,7 +87,7 @@ VerdanturfTown_BattleTentLobby_EventScript_LostChallenge:: waitse msgbox VerdanturfTown_BattleTentLobby_Text_ReturnFortified, MSGBOX_DEFAULT closemessage - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 releaseall end @@ -100,7 +100,7 @@ VerdanturfTown_BattleTentLobby_EventScript_ResumeChallenge:: playse SE_SAVE waitse frontier_set FRONTIER_DATA_PAUSED, FALSE - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto VerdanturfTown_BattleTentLobby_EventScript_EnterChallenge VerdanturfTown_BattleTentLobby_EventScript_Attendant:: @@ -141,7 +141,7 @@ VerdanturfTown_BattleTentLobby_EventScript_TryEnterChallenge:: case MULTI_B_PRESSED, VerdanturfTown_BattleTentLobby_EventScript_LoadPartyCancelChallenge VerdanturfTown_BattleTentLobby_EventScript_SaveBeforeChallenge:: - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 frontier_set FRONTIER_DATA_SELECTED_MON_ORDER verdanturftent_init frontier_set FRONTIER_DATA_CHALLENGE_STATUS, CHALLENGE_STATUS_SAVING @@ -150,7 +150,7 @@ VerdanturfTown_BattleTentLobby_EventScript_SaveBeforeChallenge:: closemessage delay 2 call Common_EventScript_SaveGame - setvar VAR_TEMP_0, 255 + setvar VAR_TEMP_CHALLENGE_STATUS, 255 goto_if_eq VAR_RESULT, 0, VerdanturfTown_BattleTentLobby_EventScript_CancelChallengeSaveFailed VerdanturfTown_BattleTentLobby_EventScript_EnterChallenge:: special SavePlayerParty @@ -159,7 +159,7 @@ VerdanturfTown_BattleTentLobby_EventScript_EnterChallenge:: closemessage call VerdanturfTown_BattleTentLobby_EventScript_WalkToDoor warp MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR, 2, 7 - setvar VAR_TEMP_0, 0 + setvar VAR_TEMP_CHALLENGE_STATUS, 0 waitstate end @@ -225,11 +225,11 @@ VerdanturfTown_BattleTentLobby_Movement_PlayerEnterDoor: VerdanturfTown_BattleTentLobby_EventScript_AttractGiver:: lock faceplayer - goto_if_set FLAG_RECEIVED_TM45, VerdanturfTown_BattleTentLobby_EventScript_ReceivedAttract + goto_if_set FLAG_RECEIVED_TM_ATTRACT, VerdanturfTown_BattleTentLobby_EventScript_ReceivedAttract msgbox VerdanturfTown_BattleTentLobby_Text_AttractionRunsDeep, MSGBOX_DEFAULT - giveitem ITEM_TM45 + giveitem ITEM_TM_ATTRACT goto_if_eq VAR_RESULT, 0, Common_EventScript_ShowBagIsFull - setflag FLAG_RECEIVED_TM45 + setflag FLAG_RECEIVED_TM_ATTRACT msgbox VerdanturfTown_BattleTentLobby_Text_AttractionMutual, MSGBOX_DEFAULT release end diff --git a/data/maps/VictoryRoad_B1F/map.json b/data/maps/VictoryRoad_B1F/map.json index 6f339a1c25..c6033354ce 100644 --- a/data/maps/VictoryRoad_B1F/map.json +++ b/data/maps/VictoryRoad_B1F/map.json @@ -245,8 +245,8 @@ "movement_range_y": 1, "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", - "script": "VictoryRoad_B1F_EventScript_ItemTM29", - "flag": "FLAG_ITEM_VICTORY_ROAD_B1F_TM29" + "script": "VictoryRoad_B1F_EventScript_ItemTMPsychic", + "flag": "FLAG_ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc index f50ce5322b..e73a39a5dd 100644 --- a/data/script_cmd_table.inc +++ b/data/script_cmd_table.inc @@ -205,8 +205,8 @@ gScriptCmdTable:: .4byte ScrCmd_nop1 @ 0xca .4byte ScrCmd_nop1 @ 0xcb .4byte ScrCmd_nop1 @ 0xcc - .4byte ScrCmd_setmonmodernfatefulencounter @ 0xcd - .4byte ScrCmd_checkmonmodernfatefulencounter @ 0xce + .4byte ScrCmd_setmodernfatefulencounter @ 0xcd + .4byte ScrCmd_checkmodernfatefulencounter @ 0xce .4byte ScrCmd_trywondercardscript @ 0xcf .4byte ScrCmd_nop1 @ 0xd0 .4byte ScrCmd_warpspinenter @ 0xd1 diff --git a/data/scripts/cable_club.inc b/data/scripts/cable_club.inc index 0ab93c4037..e810e354a5 100644 --- a/data/scripts/cable_club.inc +++ b/data/scripts/cable_club.inc @@ -743,37 +743,36 @@ EventScript_TradeCenter_Chair3:: waitstate end -@ VAR_TEMP_1 for below scripts set by ReceiveGiftItem EventScript_RecordCenter_Spot0:: setvar VAR_0x8005, 0 special RecordMixingPlayerSpotTriggered waitstate - goto_if_ne VAR_TEMP_1, ITEM_NONE, RecordCorner_EventScript_ReceivedGiftItem + goto_if_ne VAR_TEMP_RECORD_MIX_GIFT_ITEM, ITEM_NONE, RecordCorner_EventScript_ReceivedGiftItem end EventScript_RecordCenter_Spot1:: setvar VAR_0x8005, 1 special RecordMixingPlayerSpotTriggered waitstate - goto_if_ne VAR_TEMP_1, ITEM_NONE, RecordCorner_EventScript_ReceivedGiftItem + goto_if_ne VAR_TEMP_RECORD_MIX_GIFT_ITEM, ITEM_NONE, RecordCorner_EventScript_ReceivedGiftItem end EventScript_RecordCenter_Spot2:: setvar VAR_0x8005, 2 special RecordMixingPlayerSpotTriggered waitstate - goto_if_ne VAR_TEMP_1, ITEM_NONE, RecordCorner_EventScript_ReceivedGiftItem + goto_if_ne VAR_TEMP_RECORD_MIX_GIFT_ITEM, ITEM_NONE, RecordCorner_EventScript_ReceivedGiftItem end EventScript_RecordCenter_Spot3:: setvar VAR_0x8005, 3 special RecordMixingPlayerSpotTriggered waitstate - goto_if_ne VAR_TEMP_1, ITEM_NONE, RecordCorner_EventScript_ReceivedGiftItem + goto_if_ne VAR_TEMP_RECORD_MIX_GIFT_ITEM, ITEM_NONE, RecordCorner_EventScript_ReceivedGiftItem end RecordCorner_EventScript_ReceivedGiftItem:: - bufferitemname STR_VAR_2, VAR_TEMP_1 + bufferitemname STR_VAR_2, VAR_TEMP_RECORD_MIX_GIFT_ITEM message RecordCorner_Text_PlayerSentOverOneX waitmessage waitbuttonpress @@ -814,7 +813,7 @@ TradeCenter_EventScript_Attendant:: end RecordCorner_EventScript_Attendant:: - goto_if_ne VAR_TEMP_0, 0, RecordCorner_EventScript_AlreadyMixed + goto_if_ne VAR_TEMP_MIXED_RECORDS, 0, RecordCorner_EventScript_AlreadyMixed special Script_FacePlayer message RecordCorner_Text_TakeSeatAndWait waitmessage diff --git a/data/scripts/gabby_and_ty.inc b/data/scripts/gabby_and_ty.inc index e3dbdfd665..260526c4b6 100644 --- a/data/scripts/gabby_and_ty.inc +++ b/data/scripts/gabby_and_ty.inc @@ -202,7 +202,7 @@ GabbyAndTy_EventScript_FirstInterview:: call_if_eq VAR_FACING, DIR_NORTH, GabbyAndTy_EventScript_FacePlayerNorth call_if_eq VAR_FACING, DIR_SOUTH, GabbyAndTy_EventScript_FacePlayerSouth call_if_eq VAR_FACING, DIR_EAST, GabbyAndTy_EventScript_FacePlayerEast - goto_if_set FLAG_TEMP_1, GabbyAndTy_EventScript_KeepingAnEyeOutForYou + goto_if_set FLAG_TEMP_SKIP_GABBY_INTERVIEW, GabbyAndTy_EventScript_KeepingAnEyeOutForYou msgbox GabbyAndTy_Text_WhoAreYouInterview, MSGBOX_YESNO goto GabbyAndTy_EventScript_Interview end @@ -230,7 +230,7 @@ GabbyAndTy_EventScript_RequestInterview:: call_if_eq VAR_FACING, DIR_NORTH, GabbyAndTy_EventScript_FacePlayerNorth call_if_eq VAR_FACING, DIR_SOUTH, GabbyAndTy_EventScript_FacePlayerSouth call_if_eq VAR_FACING, DIR_EAST, GabbyAndTy_EventScript_FacePlayerEast - goto_if_set FLAG_TEMP_1, GabbyAndTy_EventScript_KeepingAnEyeOutForYou + goto_if_set FLAG_TEMP_SKIP_GABBY_INTERVIEW, GabbyAndTy_EventScript_KeepingAnEyeOutForYou specialvar VAR_RESULT, GabbyAndTyGetLastQuote goto_if_eq VAR_RESULT, 0, GabbyAndTy_EventScript_DidntInterviewLastTime msgbox GabbyAndTy_Text_QuoteFromLastInterview, MSGBOX_DEFAULT @@ -295,13 +295,13 @@ GabbyAndTy_EventScript_Interview:: goto_if_eq VAR_RESULT, 0, GabbyAndTy_EventScript_DontGiveUpKeepingEyeOut msgbox GabbyAndTy_Text_PerfectWellBeSeeingYou, MSGBOX_DEFAULT special GabbyAndTyAfterInterview - setflag FLAG_TEMP_1 + setflag FLAG_TEMP_SKIP_GABBY_INTERVIEW release end GabbyAndTy_EventScript_DontGiveUpKeepingEyeOut:: msgbox GabbyAndTy_Text_DontGiveUpKeepingEyeOut, MSGBOX_DEFAULT - setflag FLAG_TEMP_1 + setflag FLAG_TEMP_SKIP_GABBY_INTERVIEW release end diff --git a/data/scripts/item_ball_scripts.inc b/data/scripts/item_ball_scripts.inc index 683c383df5..9b5a2eead3 100644 --- a/data/scripts/item_ball_scripts.inc +++ b/data/scripts/item_ball_scripts.inc @@ -58,8 +58,8 @@ Route110_EventScript_ItemElixir:: finditem ITEM_ELIXIR end -Route111_EventScript_ItemTM37:: - finditem ITEM_TM37 +Route111_EventScript_ItemTMSandstorm:: + finditem ITEM_TM_SANDSTORM end Route111_EventScript_ItemStardust:: @@ -106,8 +106,8 @@ Route115_EventScript_ItemSuperPotion:: finditem ITEM_SUPER_POTION end -Route115_EventScript_ItemTM01:: - finditem ITEM_TM01 +Route115_EventScript_ItemTMFocusPunch:: + finditem ITEM_TM_FOCUS_PUNCH end Route115_EventScript_ItemIron:: @@ -374,12 +374,12 @@ FieryPath_EventScript_ItemFireStone:: finditem ITEM_FIRE_STONE end -FieryPath_EventScript_ItemTM06:: - finditem ITEM_TM06 +FieryPath_EventScript_ItemTMToxic:: + finditem ITEM_TM_TOXIC end -MeteorFalls_1F_1R_EventScript_ItemTM23:: - finditem ITEM_TM23 +MeteorFalls_1F_1R_EventScript_ItemTMIronTail:: + finditem ITEM_TM_IRON_TAIL end MeteorFalls_1F_1R_EventScript_ItemFullHeal:: @@ -394,8 +394,8 @@ MeteorFalls_1F_1R_EventScript_ItemPPUP:: finditem ITEM_PP_UP end -MeteorFalls_B1F_2R_EventScript_ItemTM02:: - finditem ITEM_TM02 +MeteorFalls_B1F_2R_EventScript_ItemTMDragonClaw:: + finditem ITEM_TM_DRAGON_CLAW end NewMauville_Inside_EventScript_ItemUltraBall:: @@ -430,8 +430,8 @@ AbandonedShip_Rooms2_B1F_EventScript_ItemDiveBall:: finditem ITEM_DIVE_BALL end -AbandonedShip_Room_B1F_EventScript_ItemTM13:: - finditem ITEM_TM13 +AbandonedShip_Room_B1F_EventScript_ItemTMIceBeam:: + finditem ITEM_TM_ICE_BEAM end AbandonedShip_Rooms2_1F_EventScript_ItemRevive:: @@ -454,16 +454,16 @@ AbandonedShip_HiddenFloorRooms_EventScript_ItemWaterStone:: finditem ITEM_WATER_STONE end -AbandonedShip_HiddenFloorRooms_EventScript_ItemTM18:: - finditem ITEM_TM18 +AbandonedShip_HiddenFloorRooms_EventScript_ItemTMRainDance:: + finditem ITEM_TM_RAIN_DANCE end -ScorchedSlab_EventScript_ItemTM11:: - finditem ITEM_TM11 +ScorchedSlab_EventScript_ItemTMSunnyDay:: + finditem ITEM_TM_SUNNY_DAY end -SafariZone_Northwest_EventScript_ItemTM22:: - finditem ITEM_TM22 +SafariZone_Northwest_EventScript_ItemTMSolarBeam:: + finditem ITEM_TM_SOLAR_BEAM end SafariZone_North_EventScript_ItemCalcium:: @@ -498,16 +498,16 @@ MtPyre_5F_EventScript_ItemLaxIncense:: finditem ITEM_LAX_INCENSE end -MtPyre_6F_EventScript_ItemTM30:: - finditem ITEM_TM30 +MtPyre_6F_EventScript_ItemTMShadowBall:: + finditem ITEM_TM_SHADOW_BALL end MtPyre_Exterior_EventScript_ItemMaxPotion:: finditem ITEM_MAX_POTION end -MtPyre_Exterior_EventScript_ItemTM48:: - finditem ITEM_TM48 +MtPyre_Exterior_EventScript_ItemTMSkillSwap:: + finditem ITEM_TM_SKILL_SWAP end AquaHideout_B1F_EventScript_ItemMasterBall:: @@ -554,16 +554,16 @@ ShoalCave_LowTideStairsRoom_EventScript_ItemIceHeal:: finditem ITEM_ICE_HEAL end -ShoalCave_LowTideIceRoom_EventScript_ItemTM07:: - finditem ITEM_TM07 +ShoalCave_LowTideIceRoom_EventScript_ItemTMHail:: + finditem ITEM_TM_HAIL end ShoalCave_LowTideIceRoom_EventScript_ItemNeverMeltIce:: finditem ITEM_NEVER_MELT_ICE end -SeafloorCavern_Room9_EventScript_ItemTM26:: - finditem ITEM_TM26 +SeafloorCavern_Room9_EventScript_ItemTMEarthquake:: + finditem ITEM_TM_EARTHQUAKE end Route110_TrickHousePuzzle1_EventScript_ItemOrangeMail:: @@ -610,8 +610,8 @@ VictoryRoad_1F_EventScript_ItemPPUp:: finditem ITEM_PP_UP end -VictoryRoad_B1F_EventScript_ItemTM29:: - finditem ITEM_TM29 +VictoryRoad_B1F_EventScript_ItemTMPsychic:: + finditem ITEM_TM_PSYCHIC end VictoryRoad_B1F_EventScript_ItemFullRestore:: diff --git a/data/scripts/pc_transfer.inc b/data/scripts/pc_transfer.inc index 1204bece36..f279740caa 100644 --- a/data/scripts/pc_transfer.inc +++ b/data/scripts/pc_transfer.inc @@ -15,7 +15,7 @@ Common_EventScript_NameReceivedBoxMon:: Common_EventScript_TransferredToPC:: bufferboxname STR_VAR_1, VAR_PC_BOX_TO_SEND_MON - bufferspeciesname STR_VAR_2, VAR_TEMP_1 + bufferspeciesname STR_VAR_2, VAR_TEMP_TRANSFERRED_SPECIES call_if_unset FLAG_SYS_PC_LANETTE, EventScript_TransferredSomeonesPC call_if_set FLAG_SYS_PC_LANETTE, EventScript_TransferredLanettesPC return diff --git a/data/scripts/safari_zone.inc b/data/scripts/safari_zone.inc index eb6a90abdf..77e795a0eb 100644 --- a/data/scripts/safari_zone.inc +++ b/data/scripts/safari_zone.inc @@ -53,6 +53,9 @@ SafariZone_EventScript_ChoosePokeblock:: special OpenPokeblockCaseOnFeeder waitstate goto_if_ne VAR_RESULT, 0xFFFF, SafariZone_EventScript_PokeblockPlaced +#ifdef BUGFIX + releaseall @ Only gets called from EventScript_PokeBlockFeeder which uses lockall. +#endif end SafariZone_EventScript_PokeblockPlaced:: diff --git a/data/scripts/secret_power_tm.inc b/data/scripts/secret_power_tm.inc index 11a5d5b668..58ddc8ce55 100644 --- a/data/scripts/secret_power_tm.inc +++ b/data/scripts/secret_power_tm.inc @@ -43,7 +43,7 @@ Route111_EventScript_SecretPowerMan:: end Route111_EventScript_GiveSecretPower:: - giveitem ITEM_TM43 + giveitem ITEM_TM_SECRET_POWER goto_if_eq VAR_RESULT, FALSE, Route111_EventScript_NoRoomForSecretPower msgbox Route111_Text_ExplainSecretPower, MSGBOX_DEFAULT closemessage diff --git a/data/scripts/trainer_hill.inc b/data/scripts/trainer_hill.inc index b7f8153514..04bbe05e5a 100644 --- a/data/scripts/trainer_hill.inc +++ b/data/scripts/trainer_hill.inc @@ -13,9 +13,9 @@ TrainerHill_OnWarp: TrainerHill_1F_EventScript_DummyOnWarp:: setvar VAR_TEMP_3, 1 -.ifdef BUGFIX +#ifdef BUGFIX end @ Missing end. By chance, the next byte (0x02 of VAR_TEMP_2) is also the id for the end cmd -.endif +#endif TrainerHill_OnFrame: map_script_2 VAR_TEMP_2, 0, TrainerHill_1F_EventScript_DummyWarpToEntranceCounter diff --git a/gflib/bg.c b/gflib/bg.c index 89f5038246..4ccb95eb6b 100644 --- a/gflib/bg.c +++ b/gflib/bg.c @@ -421,13 +421,11 @@ u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset) if (!IsInvalidBg32(bg)) { - u16 paletteOffset = (sGpuBgConfigs2[bg].basePalette * 0x20) + (destOffset * 2); + u16 paletteOffset = PLTT_OFFSET_4BPP(sGpuBgConfigs2[bg].basePalette) + (destOffset * 2); cursor = RequestDma3Copy(src, (void *)(paletteOffset + BG_PLTT), size, 0); if (cursor == -1) - { return -1; - } } else { diff --git a/gflib/malloc.c b/gflib/malloc.c index d0b9497635..8573611bb9 100644 --- a/gflib/malloc.c +++ b/gflib/malloc.c @@ -1,8 +1,11 @@ #include "global.h" +#include "malloc.h" static void *sHeapStart; static u32 sHeapSize; +ALIGNED(4) EWRAM_DATA u8 gHeap[HEAP_SIZE] = {0}; + #define MALLOC_SYSTEM_ID 0xA3A3 struct MemBlock { @@ -52,18 +55,24 @@ void *AllocInternal(void *heapStart, u32 size) if (size & 3) size = 4 * ((size / 4) + 1); - for (;;) { + for (;;) + { // Loop through the blocks looking for unused block that's big enough. - if (!pos->flag) { + if (!pos->flag) + { foundBlockSize = pos->size; - if (foundBlockSize >= size) { - if (foundBlockSize - size < 2 * sizeof(struct MemBlock)) { + if (foundBlockSize >= size) + { + if (foundBlockSize - size < 2 * sizeof(struct MemBlock)) + { // The block isn't much bigger than the requested size, // so just use it. pos->flag = TRUE; - } else { + } + else + { // The block is significantly bigger than the requested // size, so split the rest into a separate block. foundBlockSize -= sizeof(struct MemBlock); @@ -95,15 +104,18 @@ void *AllocInternal(void *heapStart, u32 size) void FreeInternal(void *heapStart, void *pointer) { - if (pointer) { + if (pointer) + { struct MemBlock *head = (struct MemBlock *)heapStart; struct MemBlock *block = (struct MemBlock *)((u8 *)pointer - sizeof(struct MemBlock)); block->flag = FALSE; // If the freed block isn't the last one, merge with the next block // if it's not in use. - if (block->next != head) { - if (!block->next->flag) { + if (block->next != head) + { + if (!block->next->flag) + { block->size += sizeof(struct MemBlock) + block->next->size; block->next->magic = 0; block->next = block->next->next; @@ -114,8 +126,10 @@ void FreeInternal(void *heapStart, void *pointer) // If the freed block isn't the first one, merge with the previous block // if it's not in use. - if (block != head) { - if (!block->prev->flag) { + if (block != head) + { + if (!block->prev->flag) + { block->prev->next = block->next; if (block->next != head) @@ -132,7 +146,8 @@ void *AllocZeroedInternal(void *heapStart, u32 size) { void *mem = AllocInternal(heapStart, size); - if (mem != NULL) { + if (mem != NULL) + { if (size & 3) size = 4 * ((size / 4) + 1); diff --git a/gflib/malloc.h b/gflib/malloc.h index 851db83a62..72e1a5e1d3 100644 --- a/gflib/malloc.h +++ b/gflib/malloc.h @@ -1,7 +1,6 @@ #ifndef GUARD_ALLOC_H #define GUARD_ALLOC_H -#define HEAP_SIZE 0x1C000 #define FREE_AND_SET_NULL(ptr) \ { \ @@ -11,7 +10,8 @@ #define TRY_FREE_AND_SET_NULL(ptr) if (ptr != NULL) FREE_AND_SET_NULL(ptr) -extern u8 gHeap[]; +#define HEAP_SIZE 0x1C000 +extern u8 gHeap[HEAP_SIZE]; void *Alloc(u32 size); void *AllocZeroed(u32 size); diff --git a/gflib/sprite.c b/gflib/sprite.c index c489eb6a4c..80fba81fe3 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -1600,7 +1600,7 @@ u8 LoadSpritePalette(const struct SpritePalette *palette) else { sSpritePaletteTags[index] = palette->tag; - DoLoadSpritePalette(palette->data, index * 16); + DoLoadSpritePalette(palette->data, PLTT_ID(index)); return index; } } diff --git a/gflib/string_util.c b/gflib/string_util.c index 8d969d1bf5..d515c14cda 100644 --- a/gflib/string_util.c +++ b/gflib/string_util.c @@ -298,7 +298,7 @@ u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 if (state == WRITING_DIGITS) { - char *out = dest++; + u8 *out = dest++; if (digit <= 0xF) c = sDigits[digit]; @@ -309,7 +309,7 @@ u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 } else if (digit != 0 || powerOfSixteen == 1) { - char *out; + u8 *out; state = WRITING_DIGITS; out = dest++; diff --git a/gflib/text.c b/gflib/text.c index 1bded26b5a..bc917c7ced 100644 --- a/gflib/text.c +++ b/gflib/text.c @@ -554,8 +554,7 @@ void DecompressGlyphTile(const void *src_, void *dest_) *(dest++) = ((sFontHalfRowLookupTable[sFontHalfRowOffsets[temp & 0xFF]]) << 16) | (sFontHalfRowLookupTable[sFontHalfRowOffsets[temp >> 8]]); } -// Unused -static u8 GetLastTextColor(u8 colorType) +static u8 UNUSED GetLastTextColor(u8 colorType) { switch (colorType) { @@ -1224,8 +1223,7 @@ static u16 RenderText(struct TextPrinter *textPrinter) return RENDER_FINISH; } -// Unused -static u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing) +static u32 UNUSED GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing) { int i; u8 width; diff --git a/gflib/window.c b/gflib/window.c index 76e863f10e..6f7af457d3 100644 --- a/gflib/window.c +++ b/gflib/window.c @@ -411,7 +411,7 @@ void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u BlitBitmapRect4Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, 0); } -static void BlitBitmapRectToWindowWithColorKey(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 colorKey) +static void UNUSED BlitBitmapRectToWindowWithColorKey(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 colorKey) { struct Bitmap sourceRect; struct Bitmap destRect; diff --git a/graphics/battle_anims/masks/stat3.pal b/graphics/battle_anims/stat_change/accuracy.pal similarity index 100% rename from graphics/battle_anims/masks/stat3.pal rename to graphics/battle_anims/stat_change/accuracy.pal diff --git a/graphics/battle_anims/masks/stat2.pal b/graphics/battle_anims/stat_change/attack.pal similarity index 100% rename from graphics/battle_anims/masks/stat2.pal rename to graphics/battle_anims/stat_change/attack.pal diff --git a/graphics/battle_anims/masks/stat_tilemap_2.bin b/graphics/battle_anims/stat_change/decrease.bin similarity index 100% rename from graphics/battle_anims/masks/stat_tilemap_2.bin rename to graphics/battle_anims/stat_change/decrease.bin diff --git a/graphics/battle_anims/masks/stat1.pal b/graphics/battle_anims/stat_change/defense.pal similarity index 100% rename from graphics/battle_anims/masks/stat1.pal rename to graphics/battle_anims/stat_change/defense.pal diff --git a/graphics/battle_anims/masks/stat6.pal b/graphics/battle_anims/stat_change/evasion.pal similarity index 100% rename from graphics/battle_anims/masks/stat6.pal rename to graphics/battle_anims/stat_change/evasion.pal diff --git a/graphics/battle_anims/masks/stat_tilemap_1.bin b/graphics/battle_anims/stat_change/increase.bin similarity index 100% rename from graphics/battle_anims/masks/stat_tilemap_1.bin rename to graphics/battle_anims/stat_change/increase.bin diff --git a/graphics/battle_anims/masks/stat5.pal b/graphics/battle_anims/stat_change/multiple.pal similarity index 100% rename from graphics/battle_anims/masks/stat5.pal rename to graphics/battle_anims/stat_change/multiple.pal diff --git a/graphics/battle_anims/masks/stat7.pal b/graphics/battle_anims/stat_change/sp_attack.pal similarity index 100% rename from graphics/battle_anims/masks/stat7.pal rename to graphics/battle_anims/stat_change/sp_attack.pal diff --git a/graphics/battle_anims/masks/stat8.pal b/graphics/battle_anims/stat_change/sp_defense.pal similarity index 100% rename from graphics/battle_anims/masks/stat8.pal rename to graphics/battle_anims/stat_change/sp_defense.pal diff --git a/graphics/battle_anims/masks/stat4.pal b/graphics/battle_anims/stat_change/speed.pal similarity index 100% rename from graphics/battle_anims/masks/stat4.pal rename to graphics/battle_anims/stat_change/speed.pal diff --git a/graphics/battle_anims/masks/stat.png b/graphics/battle_anims/stat_change/tiles.png similarity index 100% rename from graphics/battle_anims/masks/stat.png rename to graphics/battle_anims/stat_change/tiles.png diff --git a/graphics/battle_frontier/factory_menu1.png b/graphics/battle_frontier/factory_menu1.png deleted file mode 100644 index 52f073ff30..0000000000 Binary files a/graphics/battle_frontier/factory_menu1.png and /dev/null differ diff --git a/graphics/battle_frontier/factory_menu2.png b/graphics/battle_frontier/factory_menu2.png deleted file mode 100644 index 0d103927e4..0000000000 Binary files a/graphics/battle_frontier/factory_menu2.png and /dev/null differ diff --git a/graphics/battle_frontier/factory_menu.bin b/graphics/battle_frontier/factory_screen/menu.bin similarity index 100% rename from graphics/battle_frontier/factory_menu.bin rename to graphics/battle_frontier/factory_screen/menu.bin diff --git a/graphics/battle_frontier/factory_screen/menu.png b/graphics/battle_frontier/factory_screen/menu.png new file mode 100644 index 0000000000..5271973b31 Binary files /dev/null and b/graphics/battle_frontier/factory_screen/menu.png differ diff --git a/graphics/battle_frontier/tourney.pal b/graphics/battle_frontier/tourney.pal deleted file mode 100644 index eec4c7d71a..0000000000 --- a/graphics/battle_frontier/tourney.pal +++ /dev/null @@ -1,259 +0,0 @@ -JASC-PAL -0100 -256 -0 0 0 -255 172 65 -255 255 131 -222 213 180 -255 255 255 -230 222 222 -197 197 197 -213 57 49 -230 230 213 -255 246 205 -255 82 49 -164 24 0 -0 0 0 -106 106 106 -0 0 0 -0 0 0 -0 0 0 -90 172 131 -106 156 123 -123 222 139 -246 255 255 -0 0 0 -246 255 246 -0 0 0 -0 0 0 -0 0 0 -230 238 246 -222 255 238 -189 238 197 -123 123 123 -115 197 156 -0 0 0 -0 0 0 -197 205 230 -32 115 139 -255 255 255 -222 238 222 -0 0 0 -131 197 139 -0 0 0 -139 156 197 -115 139 189 -0 90 82 -106 164 139 -57 115 90 -189 222 197 -0 0 0 -0 0 0 -0 0 0 -205 205 246 -230 238 230 -213 213 255 -156 156 222 -238 238 255 -189 189 238 -230 230 255 -222 222 255 -197 197 246 -189 189 238 -180 180 230 -172 172 230 -164 164 222 -156 156 222 -0 0 0 -0 0 0 -131 148 180 -213 230 246 -189 189 222 -90 98 115 -230 238 255 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -197 238 222 -255 205 205 -205 222 255 -222 255 255 -246 230 164 -0 0 0 -189 246 180 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -255 255 255 -0 0 0 -0 255 0 -164 180 180 -255 74 0 -246 255 246 -246 255 255 -0 0 0 -246 255 246 -0 0 0 -0 0 0 -0 0 0 -230 238 246 -0 0 0 -189 238 197 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -255 213 106 -255 74 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -246 255 255 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/battle_frontier/tourney_tree.png b/graphics/battle_frontier/tourney_tree.png index f60dd49d36..4dc8cecc13 100644 Binary files a/graphics/battle_frontier/tourney_tree.png and b/graphics/battle_frontier/tourney_tree.png differ diff --git a/graphics/battle_transitions/frontier_logo_center.bin b/graphics/battle_transitions/frontier_logo_center.bin index 7b9d2af284..5247913460 100644 Binary files a/graphics/battle_transitions/frontier_logo_center.bin and b/graphics/battle_transitions/frontier_logo_center.bin differ diff --git a/graphics/berry_fix/gba_small.bin b/graphics/berry_fix/gba_connect.bin similarity index 100% rename from graphics/berry_fix/gba_small.bin rename to graphics/berry_fix/gba_connect.bin diff --git a/graphics/berry_fix/gba_connect.png b/graphics/berry_fix/gba_connect.png new file mode 100644 index 0000000000..78e2925194 Binary files /dev/null and b/graphics/berry_fix/gba_connect.png differ diff --git a/graphics/berry_fix/gba_small.pal b/graphics/berry_fix/gba_small.pal deleted file mode 100644 index 0e177217f5..0000000000 --- a/graphics/berry_fix/gba_small.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -0 0 0 -255 255 255 -32 32 32 -172 172 172 -230 8 8 -255 189 115 -32 156 8 -148 246 148 -49 82 205 -164 197 246 -164 213 90 -238 230 197 -148 197 213 -32 57 98 -106 148 197 -90 106 156 -255 255 255 -164 213 90 -32 32 32 -123 123 205 -255 255 255 -74 74 115 -197 197 197 -98 98 189 -106 106 197 -98 123 57 -131 131 131 -222 41 0 -189 123 41 -180 180 222 -0 0 0 -0 0 0 diff --git a/graphics/berry_fix/gba_small.png b/graphics/berry_fix/gba_small.png deleted file mode 100644 index 3bf1f3e361..0000000000 Binary files a/graphics/berry_fix/gba_small.png and /dev/null differ diff --git a/graphics/berry_fix/gba_transfer.pal b/graphics/berry_fix/gba_transfer.pal deleted file mode 100644 index 0e177217f5..0000000000 --- a/graphics/berry_fix/gba_transfer.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -0 0 0 -255 255 255 -32 32 32 -172 172 172 -230 8 8 -255 189 115 -32 156 8 -148 246 148 -49 82 205 -164 197 246 -164 213 90 -238 230 197 -148 197 213 -32 57 98 -106 148 197 -90 106 156 -255 255 255 -164 213 90 -32 32 32 -123 123 205 -255 255 255 -74 74 115 -197 197 197 -98 98 189 -106 106 197 -98 123 57 -131 131 131 -222 41 0 -189 123 41 -180 180 222 -0 0 0 -0 0 0 diff --git a/graphics/berry_fix/gba_transfer.png b/graphics/berry_fix/gba_transfer.png index 9b7eb5571f..104227f8a7 100644 Binary files a/graphics/berry_fix/gba_transfer.png and b/graphics/berry_fix/gba_transfer.png differ diff --git a/graphics/berry_fix/gba_transfer_error.pal b/graphics/berry_fix/gba_transfer_error.pal deleted file mode 100644 index 0e177217f5..0000000000 --- a/graphics/berry_fix/gba_transfer_error.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -0 0 0 -255 255 255 -32 32 32 -172 172 172 -230 8 8 -255 189 115 -32 156 8 -148 246 148 -49 82 205 -164 197 246 -164 213 90 -238 230 197 -148 197 213 -32 57 98 -106 148 197 -90 106 156 -255 255 255 -164 213 90 -32 32 32 -123 123 205 -255 255 255 -74 74 115 -197 197 197 -98 98 189 -106 106 197 -98 123 57 -131 131 131 -222 41 0 -189 123 41 -180 180 222 -0 0 0 -0 0 0 diff --git a/graphics/berry_fix/gba_transfer_error.png b/graphics/berry_fix/gba_transfer_error.png index d8db4bfb95..2154b1c4d2 100644 Binary files a/graphics/berry_fix/gba_transfer_error.png and b/graphics/berry_fix/gba_transfer_error.png differ diff --git a/graphics/berry_fix/gba_transfer_highlight.pal b/graphics/berry_fix/gba_transfer_highlight.pal deleted file mode 100644 index 0e177217f5..0000000000 --- a/graphics/berry_fix/gba_transfer_highlight.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -0 0 0 -255 255 255 -32 32 32 -172 172 172 -230 8 8 -255 189 115 -32 156 8 -148 246 148 -49 82 205 -164 197 246 -164 213 90 -238 230 197 -148 197 213 -32 57 98 -106 148 197 -90 106 156 -255 255 255 -164 213 90 -32 32 32 -123 123 205 -255 255 255 -74 74 115 -197 197 197 -98 98 189 -106 106 197 -98 123 57 -131 131 131 -222 41 0 -189 123 41 -180 180 222 -0 0 0 -0 0 0 diff --git a/graphics/berry_fix/gba_transfer_highlight.png b/graphics/berry_fix/gba_transfer_highlight.png index 9fb9b6a48b..f1845bdafd 100644 Binary files a/graphics/berry_fix/gba_transfer_highlight.png and b/graphics/berry_fix/gba_transfer_highlight.png differ diff --git a/graphics/berry_fix/logo.pal b/graphics/berry_fix/logo.pal deleted file mode 100644 index 4c76f3f9a8..0000000000 --- a/graphics/berry_fix/logo.pal +++ /dev/null @@ -1,51 +0,0 @@ -JASC-PAL -0100 -48 -0 0 0 -255 255 255 -32 32 32 -172 172 172 -230 8 8 -255 189 115 -32 156 8 -148 246 148 -49 82 205 -164 197 246 -164 213 90 -238 230 197 -148 197 213 -32 57 98 -106 148 197 -90 106 156 -255 255 255 -164 213 90 -32 32 32 -123 123 205 -255 255 255 -74 74 115 -197 197 197 -98 98 189 -106 106 197 -98 123 57 -131 131 131 -222 41 0 -189 123 41 -180 180 222 -0 0 0 -0 0 0 -0 0 0 -255 255 255 -238 238 238 -222 222 230 -205 205 222 -197 197 205 -180 180 197 -164 164 189 -156 156 172 -139 139 164 -123 123 156 -115 115 139 -98 98 131 -82 82 123 -74 74 115 -32 32 32 diff --git a/graphics/berry_fix/logo.png b/graphics/berry_fix/logo.png index 29cda79b0a..189ca97802 100644 Binary files a/graphics/berry_fix/logo.png and b/graphics/berry_fix/logo.png differ diff --git a/graphics/berry_fix/text.pal b/graphics/berry_fix/text.pal new file mode 100644 index 0000000000..28675e904d --- /dev/null +++ b/graphics/berry_fix/text.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 255 255 +255 255 255 +99 99 99 +214 214 206 +230 8 8 +255 189 115 +32 156 8 +148 246 148 +49 82 205 +164 197 246 +255 255 255 +99 99 99 +214 214 206 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/berry_fix/window.pal b/graphics/berry_fix/window.pal deleted file mode 100644 index 0e177217f5..0000000000 --- a/graphics/berry_fix/window.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -0 0 0 -255 255 255 -32 32 32 -172 172 172 -230 8 8 -255 189 115 -32 156 8 -148 246 148 -49 82 205 -164 197 246 -164 213 90 -238 230 197 -148 197 213 -32 57 98 -106 148 197 -90 106 156 -255 255 255 -164 213 90 -32 32 32 -123 123 205 -255 255 255 -74 74 115 -197 197 197 -98 98 189 -106 106 197 -98 123 57 -131 131 131 -222 41 0 -189 123 41 -180 180 222 -0 0 0 -0 0 0 diff --git a/graphics/berry_fix/window.png b/graphics/berry_fix/window.png index 7b57701e35..dd9f3b6af0 100644 Binary files a/graphics/berry_fix/window.png and b/graphics/berry_fix/window.png differ diff --git a/graphics/dodrio_berry_picking/bg.pal b/graphics/dodrio_berry_picking/bg.pal deleted file mode 100644 index c06550002f..0000000000 --- a/graphics/dodrio_berry_picking/bg.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -230 246 255 -82 180 172 -82 205 189 -156 156 131 -106 156 148 -123 123 98 -189 172 98 -189 189 139 -74 172 156 -172 172 131 -74 156 123 -115 115 82 -139 139 106 -164 164 115 -197 197 148 -230 246 255 diff --git a/graphics/dodrio_berry_picking/tree_border.pal b/graphics/dodrio_berry_picking/tree_border.pal deleted file mode 100644 index be2b62cc98..0000000000 --- a/graphics/dodrio_berry_picking/tree_border.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -230 246 255 -246 246 222 -230 230 180 -139 238 139 -246 246 189 -197 246 164 -246 230 197 -230 246 255 -230 213 180 -205 197 164 -148 222 148 -222 238 255 -139 205 139 -213 238 246 -222 246 255 -213 205 164 diff --git a/graphics/fonts/japanese_frlg_female_font.png b/graphics/fonts/japanese_frlg_female.png similarity index 100% rename from graphics/fonts/japanese_frlg_female_font.png rename to graphics/fonts/japanese_frlg_female.png diff --git a/graphics/fonts/japanese_frlg_male_font.png b/graphics/fonts/japanese_frlg_male.png similarity index 100% rename from graphics/fonts/japanese_frlg_male_font.png rename to graphics/fonts/japanese_frlg_male.png diff --git a/graphics/pokeblock/use_screen/graph_data.bin b/graphics/pokeblock/use_screen/graph_data.bin index 5f8f364fc9..75581f46e2 100644 Binary files a/graphics/pokeblock/use_screen/graph_data.bin and b/graphics/pokeblock/use_screen/graph_data.bin differ diff --git a/graphics/pokeblock/use_screen/mon_frame.bin b/graphics/pokeblock/use_screen/mon_frame.bin index 4e7c2d4adc..130dcff29c 100644 Binary files a/graphics/pokeblock/use_screen/mon_frame.bin and b/graphics/pokeblock/use_screen/mon_frame.bin differ diff --git a/graphics/pokedex/bg_hoenn.pal b/graphics/pokedex/bg_hoenn.pal index 569c7821a9..01bd8a3a3d 100644 --- a/graphics/pokedex/bg_hoenn.pal +++ b/graphics/pokedex/bg_hoenn.pal @@ -1,6 +1,6 @@ JASC-PAL 0100 -48 +96 123 131 0 255 255 255 222 222 222 @@ -49,3 +49,51 @@ JASC-PAL 49 139 255 189 156 90 0 0 0 +123 131 0 +255 255 255 +255 238 0 +255 189 0 +255 115 0 +98 98 115 +41 57 65 +41 57 106 +0 0 41 +255 255 255 +238 246 57 +255 0 189 +49 213 74 +24 131 32 +189 156 90 +0 0 0 +123 131 0 +255 255 255 +197 32 32 +189 189 189 +164 164 164 +98 98 115 +41 57 65 +41 57 106 +0 0 41 +255 255 255 +238 246 57 +189 0 0 +74 148 180 +8 90 131 +189 156 90 +0 0 0 +123 131 0 +255 255 255 +197 32 32 +189 189 189 +164 164 164 +98 98 115 +41 57 65 +41 57 106 +0 0 41 +255 255 255 +238 246 57 +255 0 189 +180 205 246 +49 139 255 +189 156 90 +0 0 0 diff --git a/graphics/pokedex/caught_screen.pal b/graphics/pokedex/caught_screen.pal deleted file mode 100644 index 26da98a84c..0000000000 --- a/graphics/pokedex/caught_screen.pal +++ /dev/null @@ -1,51 +0,0 @@ -JASC-PAL -0100 -48 -123 131 0 -255 255 255 -255 238 0 -255 189 0 -255 115 0 -98 98 115 -41 57 65 -41 57 106 -0 0 41 -255 255 255 -238 246 57 -255 0 189 -49 213 74 -24 131 32 -189 156 90 -0 0 0 -123 131 0 -255 255 255 -197 32 32 -189 189 189 -164 164 164 -98 98 115 -41 57 65 -41 57 106 -0 0 41 -255 255 255 -238 246 57 -189 0 0 -74 148 180 -8 90 131 -189 156 90 -0 0 0 -123 131 0 -255 255 255 -197 32 32 -189 189 189 -164 164 164 -98 98 115 -41 57 65 -41 57 106 -0 0 41 -255 255 255 -238 246 57 -255 0 189 -180 205 246 -49 139 255 -189 156 90 -0 0 0 diff --git a/graphics/pokemon/abra/footprint.png b/graphics/pokemon/abra/footprint.png index 42b5e416f3..073c787191 100644 Binary files a/graphics/pokemon/abra/footprint.png and b/graphics/pokemon/abra/footprint.png differ diff --git a/graphics/pokemon/absol/footprint.png b/graphics/pokemon/absol/footprint.png index da4076f780..f6280e1be2 100644 Binary files a/graphics/pokemon/absol/footprint.png and b/graphics/pokemon/absol/footprint.png differ diff --git a/graphics/pokemon/aerodactyl/footprint.png b/graphics/pokemon/aerodactyl/footprint.png index 7c5d3e6c19..b127884a53 100644 Binary files a/graphics/pokemon/aerodactyl/footprint.png and b/graphics/pokemon/aerodactyl/footprint.png differ diff --git a/graphics/pokemon/aggron/footprint.png b/graphics/pokemon/aggron/footprint.png index 3ba6d480ba..7c9d7177c9 100644 Binary files a/graphics/pokemon/aggron/footprint.png and b/graphics/pokemon/aggron/footprint.png differ diff --git a/graphics/pokemon/aipom/footprint.png b/graphics/pokemon/aipom/footprint.png index 67f7f1188b..41d8a4a7cb 100644 Binary files a/graphics/pokemon/aipom/footprint.png and b/graphics/pokemon/aipom/footprint.png differ diff --git a/graphics/pokemon/alakazam/footprint.png b/graphics/pokemon/alakazam/footprint.png index e3c3795cf5..c6d8f6ebe6 100644 Binary files a/graphics/pokemon/alakazam/footprint.png and b/graphics/pokemon/alakazam/footprint.png differ diff --git a/graphics/pokemon/altaria/footprint.png b/graphics/pokemon/altaria/footprint.png index 6c65deae53..3310f5d0d2 100644 Binary files a/graphics/pokemon/altaria/footprint.png and b/graphics/pokemon/altaria/footprint.png differ diff --git a/graphics/pokemon/ampharos/footprint.png b/graphics/pokemon/ampharos/footprint.png index bfc2f80345..6f0cc20f08 100644 Binary files a/graphics/pokemon/ampharos/footprint.png and b/graphics/pokemon/ampharos/footprint.png differ diff --git a/graphics/pokemon/anorith/footprint.png b/graphics/pokemon/anorith/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/anorith/footprint.png and b/graphics/pokemon/anorith/footprint.png differ diff --git a/graphics/pokemon/arbok/footprint.png b/graphics/pokemon/arbok/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/arbok/footprint.png and b/graphics/pokemon/arbok/footprint.png differ diff --git a/graphics/pokemon/arcanine/footprint.png b/graphics/pokemon/arcanine/footprint.png index 96b7f93ae2..994cefce6f 100644 Binary files a/graphics/pokemon/arcanine/footprint.png and b/graphics/pokemon/arcanine/footprint.png differ diff --git a/graphics/pokemon/ariados/footprint.png b/graphics/pokemon/ariados/footprint.png index cee3b1ba5b..e766c18df2 100644 Binary files a/graphics/pokemon/ariados/footprint.png and b/graphics/pokemon/ariados/footprint.png differ diff --git a/graphics/pokemon/armaldo/footprint.png b/graphics/pokemon/armaldo/footprint.png index d12d2e42c0..b6c085f3df 100644 Binary files a/graphics/pokemon/armaldo/footprint.png and b/graphics/pokemon/armaldo/footprint.png differ diff --git a/graphics/pokemon/aron/footprint.png b/graphics/pokemon/aron/footprint.png index fe53cb5ebd..6a87f3c11b 100644 Binary files a/graphics/pokemon/aron/footprint.png and b/graphics/pokemon/aron/footprint.png differ diff --git a/graphics/pokemon/articuno/footprint.png b/graphics/pokemon/articuno/footprint.png index e6e4fa9ef3..b364b5211b 100644 Binary files a/graphics/pokemon/articuno/footprint.png and b/graphics/pokemon/articuno/footprint.png differ diff --git a/graphics/pokemon/azumarill/footprint.png b/graphics/pokemon/azumarill/footprint.png index 904bf941c7..8c47c84304 100644 Binary files a/graphics/pokemon/azumarill/footprint.png and b/graphics/pokemon/azumarill/footprint.png differ diff --git a/graphics/pokemon/azurill/footprint.png b/graphics/pokemon/azurill/footprint.png index 60db8e03b8..0839c9c089 100644 Binary files a/graphics/pokemon/azurill/footprint.png and b/graphics/pokemon/azurill/footprint.png differ diff --git a/graphics/pokemon/bagon/footprint.png b/graphics/pokemon/bagon/footprint.png index 9a93a7564e..aec25f6acb 100644 Binary files a/graphics/pokemon/bagon/footprint.png and b/graphics/pokemon/bagon/footprint.png differ diff --git a/graphics/pokemon/baltoy/footprint.png b/graphics/pokemon/baltoy/footprint.png index 6965dbe60f..a9b0e33c28 100644 Binary files a/graphics/pokemon/baltoy/footprint.png and b/graphics/pokemon/baltoy/footprint.png differ diff --git a/graphics/pokemon/banette/footprint.png b/graphics/pokemon/banette/footprint.png index a15814f2f0..20f6b642e3 100644 Binary files a/graphics/pokemon/banette/footprint.png and b/graphics/pokemon/banette/footprint.png differ diff --git a/graphics/pokemon/barboach/footprint.png b/graphics/pokemon/barboach/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/barboach/footprint.png and b/graphics/pokemon/barboach/footprint.png differ diff --git a/graphics/pokemon/bayleef/footprint.png b/graphics/pokemon/bayleef/footprint.png index 04b375a7a7..031cc59537 100644 Binary files a/graphics/pokemon/bayleef/footprint.png and b/graphics/pokemon/bayleef/footprint.png differ diff --git a/graphics/pokemon/beautifly/footprint.png b/graphics/pokemon/beautifly/footprint.png index 49175cb026..7111a8b703 100644 Binary files a/graphics/pokemon/beautifly/footprint.png and b/graphics/pokemon/beautifly/footprint.png differ diff --git a/graphics/pokemon/beedrill/footprint.png b/graphics/pokemon/beedrill/footprint.png index 5c3f21090f..475d5235a5 100644 Binary files a/graphics/pokemon/beedrill/footprint.png and b/graphics/pokemon/beedrill/footprint.png differ diff --git a/graphics/pokemon/beldum/footprint.png b/graphics/pokemon/beldum/footprint.png index 0554eedfe0..c4be8f0bfb 100644 Binary files a/graphics/pokemon/beldum/footprint.png and b/graphics/pokemon/beldum/footprint.png differ diff --git a/graphics/pokemon/bellossom/footprint.png b/graphics/pokemon/bellossom/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/bellossom/footprint.png and b/graphics/pokemon/bellossom/footprint.png differ diff --git a/graphics/pokemon/bellsprout/footprint.png b/graphics/pokemon/bellsprout/footprint.png index 8fcf4f4f49..6a5edfd619 100644 Binary files a/graphics/pokemon/bellsprout/footprint.png and b/graphics/pokemon/bellsprout/footprint.png differ diff --git a/graphics/pokemon/blastoise/footprint.png b/graphics/pokemon/blastoise/footprint.png index b881f92706..c2d01389b8 100644 Binary files a/graphics/pokemon/blastoise/footprint.png and b/graphics/pokemon/blastoise/footprint.png differ diff --git a/graphics/pokemon/blaziken/footprint.png b/graphics/pokemon/blaziken/footprint.png index cf18a353ab..371621ba45 100644 Binary files a/graphics/pokemon/blaziken/footprint.png and b/graphics/pokemon/blaziken/footprint.png differ diff --git a/graphics/pokemon/blissey/footprint.png b/graphics/pokemon/blissey/footprint.png index 3da3dbf938..ae7a7d533d 100644 Binary files a/graphics/pokemon/blissey/footprint.png and b/graphics/pokemon/blissey/footprint.png differ diff --git a/graphics/pokemon/breloom/footprint.png b/graphics/pokemon/breloom/footprint.png index 98d920669d..7e940a5d7f 100644 Binary files a/graphics/pokemon/breloom/footprint.png and b/graphics/pokemon/breloom/footprint.png differ diff --git a/graphics/pokemon/bulbasaur/footprint.png b/graphics/pokemon/bulbasaur/footprint.png index 8e9ab9c6bd..6dafa96e2b 100644 Binary files a/graphics/pokemon/bulbasaur/footprint.png and b/graphics/pokemon/bulbasaur/footprint.png differ diff --git a/graphics/pokemon/butterfree/footprint.png b/graphics/pokemon/butterfree/footprint.png index b2740e9ccc..c6b4750d30 100644 Binary files a/graphics/pokemon/butterfree/footprint.png and b/graphics/pokemon/butterfree/footprint.png differ diff --git a/graphics/pokemon/cacnea/footprint.png b/graphics/pokemon/cacnea/footprint.png index 00b6a8a7e3..92c2b235a0 100644 Binary files a/graphics/pokemon/cacnea/footprint.png and b/graphics/pokemon/cacnea/footprint.png differ diff --git a/graphics/pokemon/cacturne/footprint.png b/graphics/pokemon/cacturne/footprint.png index 5441f92d6b..a06f75fc9d 100644 Binary files a/graphics/pokemon/cacturne/footprint.png and b/graphics/pokemon/cacturne/footprint.png differ diff --git a/graphics/pokemon/camerupt/footprint.png b/graphics/pokemon/camerupt/footprint.png index 40708b8a1f..81ec621046 100644 Binary files a/graphics/pokemon/camerupt/footprint.png and b/graphics/pokemon/camerupt/footprint.png differ diff --git a/graphics/pokemon/carvanha/footprint.png b/graphics/pokemon/carvanha/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/carvanha/footprint.png and b/graphics/pokemon/carvanha/footprint.png differ diff --git a/graphics/pokemon/cascoon/footprint.png b/graphics/pokemon/cascoon/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/cascoon/footprint.png and b/graphics/pokemon/cascoon/footprint.png differ diff --git a/graphics/pokemon/castform/footprint.png b/graphics/pokemon/castform/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/castform/footprint.png and b/graphics/pokemon/castform/footprint.png differ diff --git a/graphics/pokemon/castform/anim_front_normal_form.png b/graphics/pokemon/castform/normal/anim_front.png similarity index 100% rename from graphics/pokemon/castform/anim_front_normal_form.png rename to graphics/pokemon/castform/normal/anim_front.png diff --git a/graphics/pokemon/castform/back_normal_form.png b/graphics/pokemon/castform/normal/back.png similarity index 100% rename from graphics/pokemon/castform/back_normal_form.png rename to graphics/pokemon/castform/normal/back.png diff --git a/graphics/pokemon/castform/front_normal_form.png b/graphics/pokemon/castform/normal/front.png similarity index 100% rename from graphics/pokemon/castform/front_normal_form.png rename to graphics/pokemon/castform/normal/front.png diff --git a/graphics/pokemon/castform/normal_normal_form.pal b/graphics/pokemon/castform/normal/normal.pal similarity index 100% rename from graphics/pokemon/castform/normal_normal_form.pal rename to graphics/pokemon/castform/normal/normal.pal diff --git a/graphics/pokemon/castform/shiny_normal_form.pal b/graphics/pokemon/castform/normal/shiny.pal similarity index 100% rename from graphics/pokemon/castform/shiny_normal_form.pal rename to graphics/pokemon/castform/normal/shiny.pal diff --git a/graphics/pokemon/castform/anim_front_rainy_form.png b/graphics/pokemon/castform/rainy/anim_front.png similarity index 100% rename from graphics/pokemon/castform/anim_front_rainy_form.png rename to graphics/pokemon/castform/rainy/anim_front.png diff --git a/graphics/pokemon/castform/back_rainy_form.png b/graphics/pokemon/castform/rainy/back.png similarity index 100% rename from graphics/pokemon/castform/back_rainy_form.png rename to graphics/pokemon/castform/rainy/back.png diff --git a/graphics/pokemon/castform/front_rainy_form.png b/graphics/pokemon/castform/rainy/front.png similarity index 100% rename from graphics/pokemon/castform/front_rainy_form.png rename to graphics/pokemon/castform/rainy/front.png diff --git a/graphics/pokemon/castform/normal_rainy_form.pal b/graphics/pokemon/castform/rainy/normal.pal similarity index 100% rename from graphics/pokemon/castform/normal_rainy_form.pal rename to graphics/pokemon/castform/rainy/normal.pal diff --git a/graphics/pokemon/castform/shiny_rainy_form.pal b/graphics/pokemon/castform/rainy/shiny.pal similarity index 100% rename from graphics/pokemon/castform/shiny_rainy_form.pal rename to graphics/pokemon/castform/rainy/shiny.pal diff --git a/graphics/pokemon/castform/anim_front_snowy_form.png b/graphics/pokemon/castform/snowy/anim_front.png similarity index 100% rename from graphics/pokemon/castform/anim_front_snowy_form.png rename to graphics/pokemon/castform/snowy/anim_front.png diff --git a/graphics/pokemon/castform/back_snowy_form.png b/graphics/pokemon/castform/snowy/back.png similarity index 100% rename from graphics/pokemon/castform/back_snowy_form.png rename to graphics/pokemon/castform/snowy/back.png diff --git a/graphics/pokemon/castform/front_snowy_form.png b/graphics/pokemon/castform/snowy/front.png similarity index 100% rename from graphics/pokemon/castform/front_snowy_form.png rename to graphics/pokemon/castform/snowy/front.png diff --git a/graphics/pokemon/castform/normal_snowy_form.pal b/graphics/pokemon/castform/snowy/normal.pal similarity index 100% rename from graphics/pokemon/castform/normal_snowy_form.pal rename to graphics/pokemon/castform/snowy/normal.pal diff --git a/graphics/pokemon/castform/shiny_snowy_form.pal b/graphics/pokemon/castform/snowy/shiny.pal similarity index 100% rename from graphics/pokemon/castform/shiny_snowy_form.pal rename to graphics/pokemon/castform/snowy/shiny.pal diff --git a/graphics/pokemon/castform/anim_front_sunny_form.png b/graphics/pokemon/castform/sunny/anim_front.png similarity index 100% rename from graphics/pokemon/castform/anim_front_sunny_form.png rename to graphics/pokemon/castform/sunny/anim_front.png diff --git a/graphics/pokemon/castform/back_sunny_form.png b/graphics/pokemon/castform/sunny/back.png similarity index 100% rename from graphics/pokemon/castform/back_sunny_form.png rename to graphics/pokemon/castform/sunny/back.png diff --git a/graphics/pokemon/castform/front_sunny_form.png b/graphics/pokemon/castform/sunny/front.png similarity index 100% rename from graphics/pokemon/castform/front_sunny_form.png rename to graphics/pokemon/castform/sunny/front.png diff --git a/graphics/pokemon/castform/normal_sunny_form.pal b/graphics/pokemon/castform/sunny/normal.pal similarity index 100% rename from graphics/pokemon/castform/normal_sunny_form.pal rename to graphics/pokemon/castform/sunny/normal.pal diff --git a/graphics/pokemon/castform/shiny_sunny_form.pal b/graphics/pokemon/castform/sunny/shiny.pal similarity index 100% rename from graphics/pokemon/castform/shiny_sunny_form.pal rename to graphics/pokemon/castform/sunny/shiny.pal diff --git a/graphics/pokemon/caterpie/footprint.png b/graphics/pokemon/caterpie/footprint.png index c1c0058e74..2a1c1f3dd1 100644 Binary files a/graphics/pokemon/caterpie/footprint.png and b/graphics/pokemon/caterpie/footprint.png differ diff --git a/graphics/pokemon/celebi/footprint.png b/graphics/pokemon/celebi/footprint.png index 11aa4301cc..2e75f67937 100644 Binary files a/graphics/pokemon/celebi/footprint.png and b/graphics/pokemon/celebi/footprint.png differ diff --git a/graphics/pokemon/chansey/footprint.png b/graphics/pokemon/chansey/footprint.png index 17893b9fb7..20028e8b74 100644 Binary files a/graphics/pokemon/chansey/footprint.png and b/graphics/pokemon/chansey/footprint.png differ diff --git a/graphics/pokemon/charizard/footprint.png b/graphics/pokemon/charizard/footprint.png index e69f383927..86218af32e 100644 Binary files a/graphics/pokemon/charizard/footprint.png and b/graphics/pokemon/charizard/footprint.png differ diff --git a/graphics/pokemon/charmander/footprint.png b/graphics/pokemon/charmander/footprint.png index 2f7723621e..9f0bcbdd91 100644 Binary files a/graphics/pokemon/charmander/footprint.png and b/graphics/pokemon/charmander/footprint.png differ diff --git a/graphics/pokemon/charmeleon/footprint.png b/graphics/pokemon/charmeleon/footprint.png index 6ec15ee204..87305df5be 100644 Binary files a/graphics/pokemon/charmeleon/footprint.png and b/graphics/pokemon/charmeleon/footprint.png differ diff --git a/graphics/pokemon/chikorita/footprint.png b/graphics/pokemon/chikorita/footprint.png index 3ac4abd9f7..bbb7102f66 100644 Binary files a/graphics/pokemon/chikorita/footprint.png and b/graphics/pokemon/chikorita/footprint.png differ diff --git a/graphics/pokemon/chimecho/footprint.png b/graphics/pokemon/chimecho/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/chimecho/footprint.png and b/graphics/pokemon/chimecho/footprint.png differ diff --git a/graphics/pokemon/chinchou/footprint.png b/graphics/pokemon/chinchou/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/chinchou/footprint.png and b/graphics/pokemon/chinchou/footprint.png differ diff --git a/graphics/pokemon/clamperl/footprint.png b/graphics/pokemon/clamperl/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/clamperl/footprint.png and b/graphics/pokemon/clamperl/footprint.png differ diff --git a/graphics/pokemon/claydol/footprint.png b/graphics/pokemon/claydol/footprint.png index 2f0bca1acc..ce84eba58d 100644 Binary files a/graphics/pokemon/claydol/footprint.png and b/graphics/pokemon/claydol/footprint.png differ diff --git a/graphics/pokemon/clefable/footprint.png b/graphics/pokemon/clefable/footprint.png index 5ff3e19a1d..2f3f60fbdf 100644 Binary files a/graphics/pokemon/clefable/footprint.png and b/graphics/pokemon/clefable/footprint.png differ diff --git a/graphics/pokemon/clefairy/footprint.png b/graphics/pokemon/clefairy/footprint.png index 85c25a5dcc..86276e6d0a 100644 Binary files a/graphics/pokemon/clefairy/footprint.png and b/graphics/pokemon/clefairy/footprint.png differ diff --git a/graphics/pokemon/cleffa/footprint.png b/graphics/pokemon/cleffa/footprint.png index 4bf9339ae5..e085ea10fe 100644 Binary files a/graphics/pokemon/cleffa/footprint.png and b/graphics/pokemon/cleffa/footprint.png differ diff --git a/graphics/pokemon/cloyster/footprint.png b/graphics/pokemon/cloyster/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/cloyster/footprint.png and b/graphics/pokemon/cloyster/footprint.png differ diff --git a/graphics/pokemon/combusken/footprint.png b/graphics/pokemon/combusken/footprint.png index 6b66429d8d..953e0e676a 100644 Binary files a/graphics/pokemon/combusken/footprint.png and b/graphics/pokemon/combusken/footprint.png differ diff --git a/graphics/pokemon/corphish/footprint.png b/graphics/pokemon/corphish/footprint.png index f624724c71..5717fd7f23 100644 Binary files a/graphics/pokemon/corphish/footprint.png and b/graphics/pokemon/corphish/footprint.png differ diff --git a/graphics/pokemon/corsola/footprint.png b/graphics/pokemon/corsola/footprint.png index bae0aaf92d..458777edeb 100644 Binary files a/graphics/pokemon/corsola/footprint.png and b/graphics/pokemon/corsola/footprint.png differ diff --git a/graphics/pokemon/cradily/footprint.png b/graphics/pokemon/cradily/footprint.png index 998229dc76..394b38da09 100644 Binary files a/graphics/pokemon/cradily/footprint.png and b/graphics/pokemon/cradily/footprint.png differ diff --git a/graphics/pokemon/crawdaunt/footprint.png b/graphics/pokemon/crawdaunt/footprint.png index 9169e28071..bedeeb01aa 100644 Binary files a/graphics/pokemon/crawdaunt/footprint.png and b/graphics/pokemon/crawdaunt/footprint.png differ diff --git a/graphics/pokemon/crobat/footprint.png b/graphics/pokemon/crobat/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/crobat/footprint.png and b/graphics/pokemon/crobat/footprint.png differ diff --git a/graphics/pokemon/croconaw/footprint.png b/graphics/pokemon/croconaw/footprint.png index 43da8e68e3..4dec2924f5 100644 Binary files a/graphics/pokemon/croconaw/footprint.png and b/graphics/pokemon/croconaw/footprint.png differ diff --git a/graphics/pokemon/cubone/footprint.png b/graphics/pokemon/cubone/footprint.png index 21deee1a6c..46a6a96595 100644 Binary files a/graphics/pokemon/cubone/footprint.png and b/graphics/pokemon/cubone/footprint.png differ diff --git a/graphics/pokemon/cyndaquil/footprint.png b/graphics/pokemon/cyndaquil/footprint.png index 6413cbaae4..ebdb4a2baa 100644 Binary files a/graphics/pokemon/cyndaquil/footprint.png and b/graphics/pokemon/cyndaquil/footprint.png differ diff --git a/graphics/pokemon/delcatty/footprint.png b/graphics/pokemon/delcatty/footprint.png index 5ff40e5a0d..58035e1ae5 100644 Binary files a/graphics/pokemon/delcatty/footprint.png and b/graphics/pokemon/delcatty/footprint.png differ diff --git a/graphics/pokemon/delibird/footprint.png b/graphics/pokemon/delibird/footprint.png index e7348586ec..56baaef90a 100644 Binary files a/graphics/pokemon/delibird/footprint.png and b/graphics/pokemon/delibird/footprint.png differ diff --git a/graphics/pokemon/deoxys/footprint.png b/graphics/pokemon/deoxys/footprint.png index ea97e4014c..31270c17c1 100644 Binary files a/graphics/pokemon/deoxys/footprint.png and b/graphics/pokemon/deoxys/footprint.png differ diff --git a/graphics/pokemon/dewgong/footprint.png b/graphics/pokemon/dewgong/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/dewgong/footprint.png and b/graphics/pokemon/dewgong/footprint.png differ diff --git a/graphics/pokemon/diglett/footprint.png b/graphics/pokemon/diglett/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/diglett/footprint.png and b/graphics/pokemon/diglett/footprint.png differ diff --git a/graphics/pokemon/ditto/footprint.png b/graphics/pokemon/ditto/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/ditto/footprint.png and b/graphics/pokemon/ditto/footprint.png differ diff --git a/graphics/pokemon/dodrio/footprint.png b/graphics/pokemon/dodrio/footprint.png index 34f85bfb39..045339f23e 100644 Binary files a/graphics/pokemon/dodrio/footprint.png and b/graphics/pokemon/dodrio/footprint.png differ diff --git a/graphics/pokemon/doduo/footprint.png b/graphics/pokemon/doduo/footprint.png index 0710eca523..21ca1be91c 100644 Binary files a/graphics/pokemon/doduo/footprint.png and b/graphics/pokemon/doduo/footprint.png differ diff --git a/graphics/pokemon/donphan/footprint.png b/graphics/pokemon/donphan/footprint.png index 394cf64570..0bb8543ed5 100644 Binary files a/graphics/pokemon/donphan/footprint.png and b/graphics/pokemon/donphan/footprint.png differ diff --git a/graphics/pokemon/dragonair/footprint.png b/graphics/pokemon/dragonair/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/dragonair/footprint.png and b/graphics/pokemon/dragonair/footprint.png differ diff --git a/graphics/pokemon/dragonite/footprint.png b/graphics/pokemon/dragonite/footprint.png index 1f41296b0b..d28f2a5295 100644 Binary files a/graphics/pokemon/dragonite/footprint.png and b/graphics/pokemon/dragonite/footprint.png differ diff --git a/graphics/pokemon/dratini/footprint.png b/graphics/pokemon/dratini/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/dratini/footprint.png and b/graphics/pokemon/dratini/footprint.png differ diff --git a/graphics/pokemon/drowzee/footprint.png b/graphics/pokemon/drowzee/footprint.png index 23293423e8..fcc93432e8 100644 Binary files a/graphics/pokemon/drowzee/footprint.png and b/graphics/pokemon/drowzee/footprint.png differ diff --git a/graphics/pokemon/dugtrio/footprint.png b/graphics/pokemon/dugtrio/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/dugtrio/footprint.png and b/graphics/pokemon/dugtrio/footprint.png differ diff --git a/graphics/pokemon/dunsparce/footprint.png b/graphics/pokemon/dunsparce/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/dunsparce/footprint.png and b/graphics/pokemon/dunsparce/footprint.png differ diff --git a/graphics/pokemon/dusclops/footprint.png b/graphics/pokemon/dusclops/footprint.png index 752ffa353c..86cb1fbc8f 100644 Binary files a/graphics/pokemon/dusclops/footprint.png and b/graphics/pokemon/dusclops/footprint.png differ diff --git a/graphics/pokemon/duskull/footprint.png b/graphics/pokemon/duskull/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/duskull/footprint.png and b/graphics/pokemon/duskull/footprint.png differ diff --git a/graphics/pokemon/dustox/footprint.png b/graphics/pokemon/dustox/footprint.png index f7cc85bf9c..ea2aae4e82 100644 Binary files a/graphics/pokemon/dustox/footprint.png and b/graphics/pokemon/dustox/footprint.png differ diff --git a/graphics/pokemon/eevee/footprint.png b/graphics/pokemon/eevee/footprint.png index 4e4c01c9f5..793daaba52 100644 Binary files a/graphics/pokemon/eevee/footprint.png and b/graphics/pokemon/eevee/footprint.png differ diff --git a/graphics/pokemon/ekans/footprint.png b/graphics/pokemon/ekans/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/ekans/footprint.png and b/graphics/pokemon/ekans/footprint.png differ diff --git a/graphics/pokemon/electabuzz/footprint.png b/graphics/pokemon/electabuzz/footprint.png index b2b4de625b..19608da7a2 100644 Binary files a/graphics/pokemon/electabuzz/footprint.png and b/graphics/pokemon/electabuzz/footprint.png differ diff --git a/graphics/pokemon/electrike/footprint.png b/graphics/pokemon/electrike/footprint.png index 8dd914b35c..03f78314da 100644 Binary files a/graphics/pokemon/electrike/footprint.png and b/graphics/pokemon/electrike/footprint.png differ diff --git a/graphics/pokemon/electrode/footprint.png b/graphics/pokemon/electrode/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/electrode/footprint.png and b/graphics/pokemon/electrode/footprint.png differ diff --git a/graphics/pokemon/elekid/footprint.png b/graphics/pokemon/elekid/footprint.png index 15547931cf..2b072fbaeb 100644 Binary files a/graphics/pokemon/elekid/footprint.png and b/graphics/pokemon/elekid/footprint.png differ diff --git a/graphics/pokemon/entei/footprint.png b/graphics/pokemon/entei/footprint.png index 7336df599d..50470342a1 100644 Binary files a/graphics/pokemon/entei/footprint.png and b/graphics/pokemon/entei/footprint.png differ diff --git a/graphics/pokemon/espeon/footprint.png b/graphics/pokemon/espeon/footprint.png index c7b17a4ad4..0d975c620a 100644 Binary files a/graphics/pokemon/espeon/footprint.png and b/graphics/pokemon/espeon/footprint.png differ diff --git a/graphics/pokemon/exeggcute/footprint.png b/graphics/pokemon/exeggcute/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/exeggcute/footprint.png and b/graphics/pokemon/exeggcute/footprint.png differ diff --git a/graphics/pokemon/exeggutor/footprint.png b/graphics/pokemon/exeggutor/footprint.png index 6df7122f84..706de0bf4e 100644 Binary files a/graphics/pokemon/exeggutor/footprint.png and b/graphics/pokemon/exeggutor/footprint.png differ diff --git a/graphics/pokemon/exploud/footprint.png b/graphics/pokemon/exploud/footprint.png index b27283a141..daecfd459d 100644 Binary files a/graphics/pokemon/exploud/footprint.png and b/graphics/pokemon/exploud/footprint.png differ diff --git a/graphics/pokemon/farfetchd/footprint.png b/graphics/pokemon/farfetchd/footprint.png index 2f08f732d5..cbfca034d5 100644 Binary files a/graphics/pokemon/farfetchd/footprint.png and b/graphics/pokemon/farfetchd/footprint.png differ diff --git a/graphics/pokemon/fearow/footprint.png b/graphics/pokemon/fearow/footprint.png index 04ea7924d5..82302a8043 100644 Binary files a/graphics/pokemon/fearow/footprint.png and b/graphics/pokemon/fearow/footprint.png differ diff --git a/graphics/pokemon/feebas/footprint.png b/graphics/pokemon/feebas/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/feebas/footprint.png and b/graphics/pokemon/feebas/footprint.png differ diff --git a/graphics/pokemon/feraligatr/footprint.png b/graphics/pokemon/feraligatr/footprint.png index efe894289c..d1c37d88de 100644 Binary files a/graphics/pokemon/feraligatr/footprint.png and b/graphics/pokemon/feraligatr/footprint.png differ diff --git a/graphics/pokemon/flaaffy/footprint.png b/graphics/pokemon/flaaffy/footprint.png index d1695ec805..6824d2bb9e 100644 Binary files a/graphics/pokemon/flaaffy/footprint.png and b/graphics/pokemon/flaaffy/footprint.png differ diff --git a/graphics/pokemon/flareon/footprint.png b/graphics/pokemon/flareon/footprint.png index db5d37ed46..aecf35c717 100644 Binary files a/graphics/pokemon/flareon/footprint.png and b/graphics/pokemon/flareon/footprint.png differ diff --git a/graphics/pokemon/flygon/footprint.png b/graphics/pokemon/flygon/footprint.png index 5af877878d..ef9f392cf1 100644 Binary files a/graphics/pokemon/flygon/footprint.png and b/graphics/pokemon/flygon/footprint.png differ diff --git a/graphics/pokemon/forretress/footprint.png b/graphics/pokemon/forretress/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/forretress/footprint.png and b/graphics/pokemon/forretress/footprint.png differ diff --git a/graphics/pokemon/furret/footprint.png b/graphics/pokemon/furret/footprint.png index 225445fb3d..cfbf001140 100644 Binary files a/graphics/pokemon/furret/footprint.png and b/graphics/pokemon/furret/footprint.png differ diff --git a/graphics/pokemon/gardevoir/footprint.png b/graphics/pokemon/gardevoir/footprint.png index fd9f4755bc..cf81cde173 100644 Binary files a/graphics/pokemon/gardevoir/footprint.png and b/graphics/pokemon/gardevoir/footprint.png differ diff --git a/graphics/pokemon/gastly/footprint.png b/graphics/pokemon/gastly/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/gastly/footprint.png and b/graphics/pokemon/gastly/footprint.png differ diff --git a/graphics/pokemon/gengar/footprint.png b/graphics/pokemon/gengar/footprint.png index 0eb8fcebfa..3f806b4007 100644 Binary files a/graphics/pokemon/gengar/footprint.png and b/graphics/pokemon/gengar/footprint.png differ diff --git a/graphics/pokemon/geodude/footprint.png b/graphics/pokemon/geodude/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/geodude/footprint.png and b/graphics/pokemon/geodude/footprint.png differ diff --git a/graphics/pokemon/girafarig/footprint.png b/graphics/pokemon/girafarig/footprint.png index f7af3f622d..86ebcfc5f3 100644 Binary files a/graphics/pokemon/girafarig/footprint.png and b/graphics/pokemon/girafarig/footprint.png differ diff --git a/graphics/pokemon/glalie/footprint.png b/graphics/pokemon/glalie/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/glalie/footprint.png and b/graphics/pokemon/glalie/footprint.png differ diff --git a/graphics/pokemon/gligar/footprint.png b/graphics/pokemon/gligar/footprint.png index 3ca9864f06..e873325878 100644 Binary files a/graphics/pokemon/gligar/footprint.png and b/graphics/pokemon/gligar/footprint.png differ diff --git a/graphics/pokemon/gloom/footprint.png b/graphics/pokemon/gloom/footprint.png index 7e9c265e81..13ca4ee71e 100644 Binary files a/graphics/pokemon/gloom/footprint.png and b/graphics/pokemon/gloom/footprint.png differ diff --git a/graphics/pokemon/golbat/footprint.png b/graphics/pokemon/golbat/footprint.png index 65c126fb3e..ebdf4cafa2 100644 Binary files a/graphics/pokemon/golbat/footprint.png and b/graphics/pokemon/golbat/footprint.png differ diff --git a/graphics/pokemon/goldeen/footprint.png b/graphics/pokemon/goldeen/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/goldeen/footprint.png and b/graphics/pokemon/goldeen/footprint.png differ diff --git a/graphics/pokemon/golduck/footprint.png b/graphics/pokemon/golduck/footprint.png index 63ba752e43..1835eb8678 100644 Binary files a/graphics/pokemon/golduck/footprint.png and b/graphics/pokemon/golduck/footprint.png differ diff --git a/graphics/pokemon/golem/footprint.png b/graphics/pokemon/golem/footprint.png index 8ddc6345cc..c9f6144429 100644 Binary files a/graphics/pokemon/golem/footprint.png and b/graphics/pokemon/golem/footprint.png differ diff --git a/graphics/pokemon/gorebyss/footprint.png b/graphics/pokemon/gorebyss/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/gorebyss/footprint.png and b/graphics/pokemon/gorebyss/footprint.png differ diff --git a/graphics/pokemon/granbull/footprint.png b/graphics/pokemon/granbull/footprint.png index 010b5fb67c..23e71ed4dc 100644 Binary files a/graphics/pokemon/granbull/footprint.png and b/graphics/pokemon/granbull/footprint.png differ diff --git a/graphics/pokemon/graveler/footprint.png b/graphics/pokemon/graveler/footprint.png index c836ad3f4d..c3aacfe36b 100644 Binary files a/graphics/pokemon/graveler/footprint.png and b/graphics/pokemon/graveler/footprint.png differ diff --git a/graphics/pokemon/grimer/footprint.png b/graphics/pokemon/grimer/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/grimer/footprint.png and b/graphics/pokemon/grimer/footprint.png differ diff --git a/graphics/pokemon/groudon/footprint.png b/graphics/pokemon/groudon/footprint.png index cb80ba48d5..a7eaa14c98 100644 Binary files a/graphics/pokemon/groudon/footprint.png and b/graphics/pokemon/groudon/footprint.png differ diff --git a/graphics/pokemon/grovyle/footprint.png b/graphics/pokemon/grovyle/footprint.png index c78ea507c9..149efec284 100644 Binary files a/graphics/pokemon/grovyle/footprint.png and b/graphics/pokemon/grovyle/footprint.png differ diff --git a/graphics/pokemon/growlithe/footprint.png b/graphics/pokemon/growlithe/footprint.png index 2517cdcbad..b9af4c119c 100644 Binary files a/graphics/pokemon/growlithe/footprint.png and b/graphics/pokemon/growlithe/footprint.png differ diff --git a/graphics/pokemon/grumpig/footprint.png b/graphics/pokemon/grumpig/footprint.png index ddff0e5001..deea604340 100644 Binary files a/graphics/pokemon/grumpig/footprint.png and b/graphics/pokemon/grumpig/footprint.png differ diff --git a/graphics/pokemon/gulpin/footprint.png b/graphics/pokemon/gulpin/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/gulpin/footprint.png and b/graphics/pokemon/gulpin/footprint.png differ diff --git a/graphics/pokemon/gyarados/footprint.png b/graphics/pokemon/gyarados/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/gyarados/footprint.png and b/graphics/pokemon/gyarados/footprint.png differ diff --git a/graphics/pokemon/hariyama/footprint.png b/graphics/pokemon/hariyama/footprint.png index ab5d9f3697..4c0cd23d31 100644 Binary files a/graphics/pokemon/hariyama/footprint.png and b/graphics/pokemon/hariyama/footprint.png differ diff --git a/graphics/pokemon/haunter/footprint.png b/graphics/pokemon/haunter/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/haunter/footprint.png and b/graphics/pokemon/haunter/footprint.png differ diff --git a/graphics/pokemon/heracross/footprint.png b/graphics/pokemon/heracross/footprint.png index a740a17c9f..42bc4e3a0c 100644 Binary files a/graphics/pokemon/heracross/footprint.png and b/graphics/pokemon/heracross/footprint.png differ diff --git a/graphics/pokemon/hitmonchan/footprint.png b/graphics/pokemon/hitmonchan/footprint.png index cfd1efd54a..4a185f878a 100644 Binary files a/graphics/pokemon/hitmonchan/footprint.png and b/graphics/pokemon/hitmonchan/footprint.png differ diff --git a/graphics/pokemon/hitmonlee/footprint.png b/graphics/pokemon/hitmonlee/footprint.png index 5051201107..466e6f81b4 100644 Binary files a/graphics/pokemon/hitmonlee/footprint.png and b/graphics/pokemon/hitmonlee/footprint.png differ diff --git a/graphics/pokemon/hitmontop/footprint.png b/graphics/pokemon/hitmontop/footprint.png index ba8c1cca2a..16e5173ce4 100644 Binary files a/graphics/pokemon/hitmontop/footprint.png and b/graphics/pokemon/hitmontop/footprint.png differ diff --git a/graphics/pokemon/ho_oh/footprint.png b/graphics/pokemon/ho_oh/footprint.png index adceb38787..a6cfc377d5 100644 Binary files a/graphics/pokemon/ho_oh/footprint.png and b/graphics/pokemon/ho_oh/footprint.png differ diff --git a/graphics/pokemon/hoothoot/footprint.png b/graphics/pokemon/hoothoot/footprint.png index 1eacf9116c..8be22e121f 100644 Binary files a/graphics/pokemon/hoothoot/footprint.png and b/graphics/pokemon/hoothoot/footprint.png differ diff --git a/graphics/pokemon/hoppip/footprint.png b/graphics/pokemon/hoppip/footprint.png index 0be22ed869..d482d69e5e 100644 Binary files a/graphics/pokemon/hoppip/footprint.png and b/graphics/pokemon/hoppip/footprint.png differ diff --git a/graphics/pokemon/horsea/footprint.png b/graphics/pokemon/horsea/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/horsea/footprint.png and b/graphics/pokemon/horsea/footprint.png differ diff --git a/graphics/pokemon/houndoom/footprint.png b/graphics/pokemon/houndoom/footprint.png index b1f2c80f42..f2ba4670a4 100644 Binary files a/graphics/pokemon/houndoom/footprint.png and b/graphics/pokemon/houndoom/footprint.png differ diff --git a/graphics/pokemon/houndour/footprint.png b/graphics/pokemon/houndour/footprint.png index 3f81614316..bbc1115d75 100644 Binary files a/graphics/pokemon/houndour/footprint.png and b/graphics/pokemon/houndour/footprint.png differ diff --git a/graphics/pokemon/huntail/footprint.png b/graphics/pokemon/huntail/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/huntail/footprint.png and b/graphics/pokemon/huntail/footprint.png differ diff --git a/graphics/pokemon/hypno/footprint.png b/graphics/pokemon/hypno/footprint.png index 51f7349738..173db7238f 100644 Binary files a/graphics/pokemon/hypno/footprint.png and b/graphics/pokemon/hypno/footprint.png differ diff --git a/graphics/pokemon/igglybuff/footprint.png b/graphics/pokemon/igglybuff/footprint.png index bbb7352a60..d24c1760df 100644 Binary files a/graphics/pokemon/igglybuff/footprint.png and b/graphics/pokemon/igglybuff/footprint.png differ diff --git a/graphics/pokemon/illumise/footprint.png b/graphics/pokemon/illumise/footprint.png index 451d532b2f..d39b4f0054 100644 Binary files a/graphics/pokemon/illumise/footprint.png and b/graphics/pokemon/illumise/footprint.png differ diff --git a/graphics/pokemon/ivysaur/footprint.png b/graphics/pokemon/ivysaur/footprint.png index 29206b935e..d837294f9d 100644 Binary files a/graphics/pokemon/ivysaur/footprint.png and b/graphics/pokemon/ivysaur/footprint.png differ diff --git a/graphics/pokemon/jigglypuff/footprint.png b/graphics/pokemon/jigglypuff/footprint.png index 59b5f1171b..b6d981b104 100644 Binary files a/graphics/pokemon/jigglypuff/footprint.png and b/graphics/pokemon/jigglypuff/footprint.png differ diff --git a/graphics/pokemon/jirachi/footprint.png b/graphics/pokemon/jirachi/footprint.png index 856bb5faaf..1153c76dfe 100644 Binary files a/graphics/pokemon/jirachi/footprint.png and b/graphics/pokemon/jirachi/footprint.png differ diff --git a/graphics/pokemon/jolteon/footprint.png b/graphics/pokemon/jolteon/footprint.png index d1e9477b3d..450c3c4953 100644 Binary files a/graphics/pokemon/jolteon/footprint.png and b/graphics/pokemon/jolteon/footprint.png differ diff --git a/graphics/pokemon/jumpluff/footprint.png b/graphics/pokemon/jumpluff/footprint.png index 9cd0f59383..5d01e97d69 100644 Binary files a/graphics/pokemon/jumpluff/footprint.png and b/graphics/pokemon/jumpluff/footprint.png differ diff --git a/graphics/pokemon/jynx/footprint.png b/graphics/pokemon/jynx/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/jynx/footprint.png and b/graphics/pokemon/jynx/footprint.png differ diff --git a/graphics/pokemon/kabuto/footprint.png b/graphics/pokemon/kabuto/footprint.png index 6965dbe60f..a9b0e33c28 100644 Binary files a/graphics/pokemon/kabuto/footprint.png and b/graphics/pokemon/kabuto/footprint.png differ diff --git a/graphics/pokemon/kabutops/footprint.png b/graphics/pokemon/kabutops/footprint.png index 127b741d82..54f193c502 100644 Binary files a/graphics/pokemon/kabutops/footprint.png and b/graphics/pokemon/kabutops/footprint.png differ diff --git a/graphics/pokemon/kadabra/footprint.png b/graphics/pokemon/kadabra/footprint.png index a699f29879..8cbac4eddc 100644 Binary files a/graphics/pokemon/kadabra/footprint.png and b/graphics/pokemon/kadabra/footprint.png differ diff --git a/graphics/pokemon/kakuna/footprint.png b/graphics/pokemon/kakuna/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/kakuna/footprint.png and b/graphics/pokemon/kakuna/footprint.png differ diff --git a/graphics/pokemon/kangaskhan/footprint.png b/graphics/pokemon/kangaskhan/footprint.png index 7753a4a71b..05b12acf93 100644 Binary files a/graphics/pokemon/kangaskhan/footprint.png and b/graphics/pokemon/kangaskhan/footprint.png differ diff --git a/graphics/pokemon/kecleon/footprint.png b/graphics/pokemon/kecleon/footprint.png index 3c69684379..986c726fa0 100644 Binary files a/graphics/pokemon/kecleon/footprint.png and b/graphics/pokemon/kecleon/footprint.png differ diff --git a/graphics/pokemon/kingdra/footprint.png b/graphics/pokemon/kingdra/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/kingdra/footprint.png and b/graphics/pokemon/kingdra/footprint.png differ diff --git a/graphics/pokemon/kingler/footprint.png b/graphics/pokemon/kingler/footprint.png index b75db30dc4..d1db4154e9 100644 Binary files a/graphics/pokemon/kingler/footprint.png and b/graphics/pokemon/kingler/footprint.png differ diff --git a/graphics/pokemon/kirlia/footprint.png b/graphics/pokemon/kirlia/footprint.png index c1c0058e74..2a1c1f3dd1 100644 Binary files a/graphics/pokemon/kirlia/footprint.png and b/graphics/pokemon/kirlia/footprint.png differ diff --git a/graphics/pokemon/koffing/footprint.png b/graphics/pokemon/koffing/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/koffing/footprint.png and b/graphics/pokemon/koffing/footprint.png differ diff --git a/graphics/pokemon/krabby/footprint.png b/graphics/pokemon/krabby/footprint.png index eae28fe5ee..1b70f1bdff 100644 Binary files a/graphics/pokemon/krabby/footprint.png and b/graphics/pokemon/krabby/footprint.png differ diff --git a/graphics/pokemon/kyogre/footprint.png b/graphics/pokemon/kyogre/footprint.png index 8d58ee4621..de1ea4d0d0 100644 Binary files a/graphics/pokemon/kyogre/footprint.png and b/graphics/pokemon/kyogre/footprint.png differ diff --git a/graphics/pokemon/lairon/footprint.png b/graphics/pokemon/lairon/footprint.png index 9a6527c1c9..e465f42d51 100644 Binary files a/graphics/pokemon/lairon/footprint.png and b/graphics/pokemon/lairon/footprint.png differ diff --git a/graphics/pokemon/lanturn/footprint.png b/graphics/pokemon/lanturn/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/lanturn/footprint.png and b/graphics/pokemon/lanturn/footprint.png differ diff --git a/graphics/pokemon/lapras/footprint.png b/graphics/pokemon/lapras/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/lapras/footprint.png and b/graphics/pokemon/lapras/footprint.png differ diff --git a/graphics/pokemon/larvitar/footprint.png b/graphics/pokemon/larvitar/footprint.png index a31e8d7f36..52d2eaab9c 100644 Binary files a/graphics/pokemon/larvitar/footprint.png and b/graphics/pokemon/larvitar/footprint.png differ diff --git a/graphics/pokemon/latias/footprint.png b/graphics/pokemon/latias/footprint.png index 0419630c15..f0f34c5004 100644 Binary files a/graphics/pokemon/latias/footprint.png and b/graphics/pokemon/latias/footprint.png differ diff --git a/graphics/pokemon/latios/footprint.png b/graphics/pokemon/latios/footprint.png index f77d0fa867..7c22956b66 100644 Binary files a/graphics/pokemon/latios/footprint.png and b/graphics/pokemon/latios/footprint.png differ diff --git a/graphics/pokemon/ledian/footprint.png b/graphics/pokemon/ledian/footprint.png index 5c2d6221f6..640bea34cf 100644 Binary files a/graphics/pokemon/ledian/footprint.png and b/graphics/pokemon/ledian/footprint.png differ diff --git a/graphics/pokemon/ledyba/footprint.png b/graphics/pokemon/ledyba/footprint.png index a52ed25606..1ec169c42f 100644 Binary files a/graphics/pokemon/ledyba/footprint.png and b/graphics/pokemon/ledyba/footprint.png differ diff --git a/graphics/pokemon/lickitung/footprint.png b/graphics/pokemon/lickitung/footprint.png index 1f88f23fc6..fb92001035 100644 Binary files a/graphics/pokemon/lickitung/footprint.png and b/graphics/pokemon/lickitung/footprint.png differ diff --git a/graphics/pokemon/lileep/footprint.png b/graphics/pokemon/lileep/footprint.png index ce6b2790e1..ee68853045 100644 Binary files a/graphics/pokemon/lileep/footprint.png and b/graphics/pokemon/lileep/footprint.png differ diff --git a/graphics/pokemon/linoone/footprint.png b/graphics/pokemon/linoone/footprint.png index 8d83166d3e..ff6019b7bc 100644 Binary files a/graphics/pokemon/linoone/footprint.png and b/graphics/pokemon/linoone/footprint.png differ diff --git a/graphics/pokemon/lombre/footprint.png b/graphics/pokemon/lombre/footprint.png index 051e5ab550..333b1c7b44 100644 Binary files a/graphics/pokemon/lombre/footprint.png and b/graphics/pokemon/lombre/footprint.png differ diff --git a/graphics/pokemon/lotad/footprint.png b/graphics/pokemon/lotad/footprint.png index caac6945f1..1e075c103b 100644 Binary files a/graphics/pokemon/lotad/footprint.png and b/graphics/pokemon/lotad/footprint.png differ diff --git a/graphics/pokemon/loudred/footprint.png b/graphics/pokemon/loudred/footprint.png index 604af90004..8468d3ea6c 100644 Binary files a/graphics/pokemon/loudred/footprint.png and b/graphics/pokemon/loudred/footprint.png differ diff --git a/graphics/pokemon/ludicolo/footprint.png b/graphics/pokemon/ludicolo/footprint.png index 23163f358c..e5aa759abc 100644 Binary files a/graphics/pokemon/ludicolo/footprint.png and b/graphics/pokemon/ludicolo/footprint.png differ diff --git a/graphics/pokemon/lugia/footprint.png b/graphics/pokemon/lugia/footprint.png index e6642ed07f..bb807c6dd5 100644 Binary files a/graphics/pokemon/lugia/footprint.png and b/graphics/pokemon/lugia/footprint.png differ diff --git a/graphics/pokemon/lunatone/footprint.png b/graphics/pokemon/lunatone/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/lunatone/footprint.png and b/graphics/pokemon/lunatone/footprint.png differ diff --git a/graphics/pokemon/luvdisc/footprint.png b/graphics/pokemon/luvdisc/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/luvdisc/footprint.png and b/graphics/pokemon/luvdisc/footprint.png differ diff --git a/graphics/pokemon/machamp/footprint.png b/graphics/pokemon/machamp/footprint.png index e562fd08cb..bfccf5bdb0 100644 Binary files a/graphics/pokemon/machamp/footprint.png and b/graphics/pokemon/machamp/footprint.png differ diff --git a/graphics/pokemon/machoke/footprint.png b/graphics/pokemon/machoke/footprint.png index d9009d3e19..5cde0083d5 100644 Binary files a/graphics/pokemon/machoke/footprint.png and b/graphics/pokemon/machoke/footprint.png differ diff --git a/graphics/pokemon/machop/footprint.png b/graphics/pokemon/machop/footprint.png index 8b2808553b..9bb3ae0633 100644 Binary files a/graphics/pokemon/machop/footprint.png and b/graphics/pokemon/machop/footprint.png differ diff --git a/graphics/pokemon/magby/footprint.png b/graphics/pokemon/magby/footprint.png index 655d0ca2b8..45e1a343e0 100644 Binary files a/graphics/pokemon/magby/footprint.png and b/graphics/pokemon/magby/footprint.png differ diff --git a/graphics/pokemon/magcargo/footprint.png b/graphics/pokemon/magcargo/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/magcargo/footprint.png and b/graphics/pokemon/magcargo/footprint.png differ diff --git a/graphics/pokemon/magikarp/footprint.png b/graphics/pokemon/magikarp/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/magikarp/footprint.png and b/graphics/pokemon/magikarp/footprint.png differ diff --git a/graphics/pokemon/magmar/footprint.png b/graphics/pokemon/magmar/footprint.png index 17de53a464..328f67d2ef 100644 Binary files a/graphics/pokemon/magmar/footprint.png and b/graphics/pokemon/magmar/footprint.png differ diff --git a/graphics/pokemon/magnemite/footprint.png b/graphics/pokemon/magnemite/footprint.png index f710e50283..3f8f930cbe 100644 Binary files a/graphics/pokemon/magnemite/footprint.png and b/graphics/pokemon/magnemite/footprint.png differ diff --git a/graphics/pokemon/magneton/footprint.png b/graphics/pokemon/magneton/footprint.png index 00b8b0ebf4..aa37675775 100644 Binary files a/graphics/pokemon/magneton/footprint.png and b/graphics/pokemon/magneton/footprint.png differ diff --git a/graphics/pokemon/makuhita/footprint.png b/graphics/pokemon/makuhita/footprint.png index 3da20ccb31..4f2aca69ec 100644 Binary files a/graphics/pokemon/makuhita/footprint.png and b/graphics/pokemon/makuhita/footprint.png differ diff --git a/graphics/pokemon/manectric/footprint.png b/graphics/pokemon/manectric/footprint.png index 4f4903bf94..a3ab1c56cb 100644 Binary files a/graphics/pokemon/manectric/footprint.png and b/graphics/pokemon/manectric/footprint.png differ diff --git a/graphics/pokemon/mankey/footprint.png b/graphics/pokemon/mankey/footprint.png index f02036af50..4881d17c33 100644 Binary files a/graphics/pokemon/mankey/footprint.png and b/graphics/pokemon/mankey/footprint.png differ diff --git a/graphics/pokemon/mantine/footprint.png b/graphics/pokemon/mantine/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/mantine/footprint.png and b/graphics/pokemon/mantine/footprint.png differ diff --git a/graphics/pokemon/mareep/footprint.png b/graphics/pokemon/mareep/footprint.png index 2913a4c484..8e89572b4a 100644 Binary files a/graphics/pokemon/mareep/footprint.png and b/graphics/pokemon/mareep/footprint.png differ diff --git a/graphics/pokemon/marill/footprint.png b/graphics/pokemon/marill/footprint.png index a09d8f2c01..f70b3ea55d 100644 Binary files a/graphics/pokemon/marill/footprint.png and b/graphics/pokemon/marill/footprint.png differ diff --git a/graphics/pokemon/marowak/footprint.png b/graphics/pokemon/marowak/footprint.png index fbde41d04b..e05d5d0005 100644 Binary files a/graphics/pokemon/marowak/footprint.png and b/graphics/pokemon/marowak/footprint.png differ diff --git a/graphics/pokemon/marshtomp/footprint.png b/graphics/pokemon/marshtomp/footprint.png index 3c232ccad8..6ea1827142 100644 Binary files a/graphics/pokemon/marshtomp/footprint.png and b/graphics/pokemon/marshtomp/footprint.png differ diff --git a/graphics/pokemon/masquerain/footprint.png b/graphics/pokemon/masquerain/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/masquerain/footprint.png and b/graphics/pokemon/masquerain/footprint.png differ diff --git a/graphics/pokemon/mawile/footprint.png b/graphics/pokemon/mawile/footprint.png index 5195fd4df2..8eeae6a81e 100644 Binary files a/graphics/pokemon/mawile/footprint.png and b/graphics/pokemon/mawile/footprint.png differ diff --git a/graphics/pokemon/medicham/footprint.png b/graphics/pokemon/medicham/footprint.png index 804e8c1d85..da5cdd23bd 100644 Binary files a/graphics/pokemon/medicham/footprint.png and b/graphics/pokemon/medicham/footprint.png differ diff --git a/graphics/pokemon/meditite/footprint.png b/graphics/pokemon/meditite/footprint.png index 034cb0df8d..4cf72d9aef 100644 Binary files a/graphics/pokemon/meditite/footprint.png and b/graphics/pokemon/meditite/footprint.png differ diff --git a/graphics/pokemon/meganium/footprint.png b/graphics/pokemon/meganium/footprint.png index 39303ac4fa..1592e145c0 100644 Binary files a/graphics/pokemon/meganium/footprint.png and b/graphics/pokemon/meganium/footprint.png differ diff --git a/graphics/pokemon/meowth/footprint.png b/graphics/pokemon/meowth/footprint.png index 7dc20ada78..d7283ba439 100644 Binary files a/graphics/pokemon/meowth/footprint.png and b/graphics/pokemon/meowth/footprint.png differ diff --git a/graphics/pokemon/metagross/footprint.png b/graphics/pokemon/metagross/footprint.png index 07f91d604f..fd7039efd3 100644 Binary files a/graphics/pokemon/metagross/footprint.png and b/graphics/pokemon/metagross/footprint.png differ diff --git a/graphics/pokemon/metang/footprint.png b/graphics/pokemon/metang/footprint.png index 5b0f8f5b05..a91a3d5329 100644 Binary files a/graphics/pokemon/metang/footprint.png and b/graphics/pokemon/metang/footprint.png differ diff --git a/graphics/pokemon/metapod/footprint.png b/graphics/pokemon/metapod/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/metapod/footprint.png and b/graphics/pokemon/metapod/footprint.png differ diff --git a/graphics/pokemon/mew/footprint.png b/graphics/pokemon/mew/footprint.png index afbba43acc..e380642b80 100644 Binary files a/graphics/pokemon/mew/footprint.png and b/graphics/pokemon/mew/footprint.png differ diff --git a/graphics/pokemon/mewtwo/footprint.png b/graphics/pokemon/mewtwo/footprint.png index 0f7573dd3b..bedffad65d 100644 Binary files a/graphics/pokemon/mewtwo/footprint.png and b/graphics/pokemon/mewtwo/footprint.png differ diff --git a/graphics/pokemon/mightyena/footprint.png b/graphics/pokemon/mightyena/footprint.png index b39af65bc0..f769364351 100644 Binary files a/graphics/pokemon/mightyena/footprint.png and b/graphics/pokemon/mightyena/footprint.png differ diff --git a/graphics/pokemon/milotic/footprint.png b/graphics/pokemon/milotic/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/milotic/footprint.png and b/graphics/pokemon/milotic/footprint.png differ diff --git a/graphics/pokemon/miltank/footprint.png b/graphics/pokemon/miltank/footprint.png index a7162cd211..4f3d0e6968 100644 Binary files a/graphics/pokemon/miltank/footprint.png and b/graphics/pokemon/miltank/footprint.png differ diff --git a/graphics/pokemon/minun/footprint.png b/graphics/pokemon/minun/footprint.png index 1071b8069e..3a2365e168 100644 Binary files a/graphics/pokemon/minun/footprint.png and b/graphics/pokemon/minun/footprint.png differ diff --git a/graphics/pokemon/misdreavus/footprint.png b/graphics/pokemon/misdreavus/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/misdreavus/footprint.png and b/graphics/pokemon/misdreavus/footprint.png differ diff --git a/graphics/pokemon/moltres/footprint.png b/graphics/pokemon/moltres/footprint.png index 3900403bd9..6c590ccda7 100644 Binary files a/graphics/pokemon/moltres/footprint.png and b/graphics/pokemon/moltres/footprint.png differ diff --git a/graphics/pokemon/mr_mime/footprint.png b/graphics/pokemon/mr_mime/footprint.png index cb0aff1a3b..6e8b15e7e6 100644 Binary files a/graphics/pokemon/mr_mime/footprint.png and b/graphics/pokemon/mr_mime/footprint.png differ diff --git a/graphics/pokemon/mudkip/footprint.png b/graphics/pokemon/mudkip/footprint.png index 490db6e257..f06163ae0a 100644 Binary files a/graphics/pokemon/mudkip/footprint.png and b/graphics/pokemon/mudkip/footprint.png differ diff --git a/graphics/pokemon/muk/footprint.png b/graphics/pokemon/muk/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/muk/footprint.png and b/graphics/pokemon/muk/footprint.png differ diff --git a/graphics/pokemon/murkrow/footprint.png b/graphics/pokemon/murkrow/footprint.png index 0f05668344..901413be8f 100644 Binary files a/graphics/pokemon/murkrow/footprint.png and b/graphics/pokemon/murkrow/footprint.png differ diff --git a/graphics/pokemon/natu/footprint.png b/graphics/pokemon/natu/footprint.png index f17821fc00..348068d1c5 100644 Binary files a/graphics/pokemon/natu/footprint.png and b/graphics/pokemon/natu/footprint.png differ diff --git a/graphics/pokemon/nidoking/footprint.png b/graphics/pokemon/nidoking/footprint.png index 577e14f302..c0e6690e10 100644 Binary files a/graphics/pokemon/nidoking/footprint.png and b/graphics/pokemon/nidoking/footprint.png differ diff --git a/graphics/pokemon/nidoqueen/footprint.png b/graphics/pokemon/nidoqueen/footprint.png index c3156e6215..a5b2555929 100644 Binary files a/graphics/pokemon/nidoqueen/footprint.png and b/graphics/pokemon/nidoqueen/footprint.png differ diff --git a/graphics/pokemon/nidoran_f/footprint.png b/graphics/pokemon/nidoran_f/footprint.png index f673df1128..d0111077b5 100644 Binary files a/graphics/pokemon/nidoran_f/footprint.png and b/graphics/pokemon/nidoran_f/footprint.png differ diff --git a/graphics/pokemon/nidoran_m/footprint.png b/graphics/pokemon/nidoran_m/footprint.png index 874c607817..a6b3e3b4ad 100644 Binary files a/graphics/pokemon/nidoran_m/footprint.png and b/graphics/pokemon/nidoran_m/footprint.png differ diff --git a/graphics/pokemon/nidorina/footprint.png b/graphics/pokemon/nidorina/footprint.png index 94553054a5..922ef8dbd1 100644 Binary files a/graphics/pokemon/nidorina/footprint.png and b/graphics/pokemon/nidorina/footprint.png differ diff --git a/graphics/pokemon/nidorino/footprint.png b/graphics/pokemon/nidorino/footprint.png index eaa67b3791..9ab80e766a 100644 Binary files a/graphics/pokemon/nidorino/footprint.png and b/graphics/pokemon/nidorino/footprint.png differ diff --git a/graphics/pokemon/nincada/footprint.png b/graphics/pokemon/nincada/footprint.png index deea05721e..69d2b0491d 100644 Binary files a/graphics/pokemon/nincada/footprint.png and b/graphics/pokemon/nincada/footprint.png differ diff --git a/graphics/pokemon/ninetales/footprint.png b/graphics/pokemon/ninetales/footprint.png index 3f1f0247e5..51eb9f83b8 100644 Binary files a/graphics/pokemon/ninetales/footprint.png and b/graphics/pokemon/ninetales/footprint.png differ diff --git a/graphics/pokemon/ninjask/footprint.png b/graphics/pokemon/ninjask/footprint.png index eacba16dc8..f582fcc058 100644 Binary files a/graphics/pokemon/ninjask/footprint.png and b/graphics/pokemon/ninjask/footprint.png differ diff --git a/graphics/pokemon/noctowl/footprint.png b/graphics/pokemon/noctowl/footprint.png index 89ed409e98..0386b465ac 100644 Binary files a/graphics/pokemon/noctowl/footprint.png and b/graphics/pokemon/noctowl/footprint.png differ diff --git a/graphics/pokemon/nosepass/footprint.png b/graphics/pokemon/nosepass/footprint.png index 9b9ad27082..ad8673add3 100644 Binary files a/graphics/pokemon/nosepass/footprint.png and b/graphics/pokemon/nosepass/footprint.png differ diff --git a/graphics/pokemon/numel/footprint.png b/graphics/pokemon/numel/footprint.png index 6238f94004..f01ad15927 100644 Binary files a/graphics/pokemon/numel/footprint.png and b/graphics/pokemon/numel/footprint.png differ diff --git a/graphics/pokemon/nuzleaf/footprint.png b/graphics/pokemon/nuzleaf/footprint.png index b35288e059..bd9be61709 100644 Binary files a/graphics/pokemon/nuzleaf/footprint.png and b/graphics/pokemon/nuzleaf/footprint.png differ diff --git a/graphics/pokemon/octillery/footprint.png b/graphics/pokemon/octillery/footprint.png index afa1f5433c..2306c5b0be 100644 Binary files a/graphics/pokemon/octillery/footprint.png and b/graphics/pokemon/octillery/footprint.png differ diff --git a/graphics/pokemon/oddish/footprint.png b/graphics/pokemon/oddish/footprint.png index d381752735..e5c7eed223 100644 Binary files a/graphics/pokemon/oddish/footprint.png and b/graphics/pokemon/oddish/footprint.png differ diff --git a/graphics/pokemon/omanyte/footprint.png b/graphics/pokemon/omanyte/footprint.png index f5eb9fdba0..ec2dde19c6 100644 Binary files a/graphics/pokemon/omanyte/footprint.png and b/graphics/pokemon/omanyte/footprint.png differ diff --git a/graphics/pokemon/omastar/footprint.png b/graphics/pokemon/omastar/footprint.png index fdd911ecf7..e587f45031 100644 Binary files a/graphics/pokemon/omastar/footprint.png and b/graphics/pokemon/omastar/footprint.png differ diff --git a/graphics/pokemon/onix/footprint.png b/graphics/pokemon/onix/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/onix/footprint.png and b/graphics/pokemon/onix/footprint.png differ diff --git a/graphics/pokemon/paras/footprint.png b/graphics/pokemon/paras/footprint.png index f8d7574d2e..01abc74f10 100644 Binary files a/graphics/pokemon/paras/footprint.png and b/graphics/pokemon/paras/footprint.png differ diff --git a/graphics/pokemon/parasect/footprint.png b/graphics/pokemon/parasect/footprint.png index e0f1715f2f..ed9221adef 100644 Binary files a/graphics/pokemon/parasect/footprint.png and b/graphics/pokemon/parasect/footprint.png differ diff --git a/graphics/pokemon/pelipper/footprint.png b/graphics/pokemon/pelipper/footprint.png index 54718d259e..bfb9703f55 100644 Binary files a/graphics/pokemon/pelipper/footprint.png and b/graphics/pokemon/pelipper/footprint.png differ diff --git a/graphics/pokemon/persian/footprint.png b/graphics/pokemon/persian/footprint.png index 33f25f0aa8..99a567fc1b 100644 Binary files a/graphics/pokemon/persian/footprint.png and b/graphics/pokemon/persian/footprint.png differ diff --git a/graphics/pokemon/phanpy/footprint.png b/graphics/pokemon/phanpy/footprint.png index 70498b18f6..61eb3ebac3 100644 Binary files a/graphics/pokemon/phanpy/footprint.png and b/graphics/pokemon/phanpy/footprint.png differ diff --git a/graphics/pokemon/pichu/footprint.png b/graphics/pokemon/pichu/footprint.png index 823c7e32d4..62d8245041 100644 Binary files a/graphics/pokemon/pichu/footprint.png and b/graphics/pokemon/pichu/footprint.png differ diff --git a/graphics/pokemon/pidgeot/footprint.png b/graphics/pokemon/pidgeot/footprint.png index 025341554c..ef4ad1a916 100644 Binary files a/graphics/pokemon/pidgeot/footprint.png and b/graphics/pokemon/pidgeot/footprint.png differ diff --git a/graphics/pokemon/pidgeotto/footprint.png b/graphics/pokemon/pidgeotto/footprint.png index c507f72b83..8d9cd78e0d 100644 Binary files a/graphics/pokemon/pidgeotto/footprint.png and b/graphics/pokemon/pidgeotto/footprint.png differ diff --git a/graphics/pokemon/pidgey/footprint.png b/graphics/pokemon/pidgey/footprint.png index 6fe6e42824..3422576bec 100644 Binary files a/graphics/pokemon/pidgey/footprint.png and b/graphics/pokemon/pidgey/footprint.png differ diff --git a/graphics/pokemon/pikachu/footprint.png b/graphics/pokemon/pikachu/footprint.png index a8ee2e4ac9..9145eff5b8 100644 Binary files a/graphics/pokemon/pikachu/footprint.png and b/graphics/pokemon/pikachu/footprint.png differ diff --git a/graphics/pokemon/piloswine/footprint.png b/graphics/pokemon/piloswine/footprint.png index 0b7405eceb..122f3e3529 100644 Binary files a/graphics/pokemon/piloswine/footprint.png and b/graphics/pokemon/piloswine/footprint.png differ diff --git a/graphics/pokemon/pineco/footprint.png b/graphics/pokemon/pineco/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/pineco/footprint.png and b/graphics/pokemon/pineco/footprint.png differ diff --git a/graphics/pokemon/pinsir/footprint.png b/graphics/pokemon/pinsir/footprint.png index ebd22101ee..58c6540633 100644 Binary files a/graphics/pokemon/pinsir/footprint.png and b/graphics/pokemon/pinsir/footprint.png differ diff --git a/graphics/pokemon/plusle/footprint.png b/graphics/pokemon/plusle/footprint.png index 1071b8069e..3a2365e168 100644 Binary files a/graphics/pokemon/plusle/footprint.png and b/graphics/pokemon/plusle/footprint.png differ diff --git a/graphics/pokemon/politoed/footprint.png b/graphics/pokemon/politoed/footprint.png index f97b789949..9499c60ecc 100644 Binary files a/graphics/pokemon/politoed/footprint.png and b/graphics/pokemon/politoed/footprint.png differ diff --git a/graphics/pokemon/poliwag/footprint.png b/graphics/pokemon/poliwag/footprint.png index 04e411726b..adf2d1a6c8 100644 Binary files a/graphics/pokemon/poliwag/footprint.png and b/graphics/pokemon/poliwag/footprint.png differ diff --git a/graphics/pokemon/poliwhirl/footprint.png b/graphics/pokemon/poliwhirl/footprint.png index 14f6c2ea91..e058bb601e 100644 Binary files a/graphics/pokemon/poliwhirl/footprint.png and b/graphics/pokemon/poliwhirl/footprint.png differ diff --git a/graphics/pokemon/poliwrath/footprint.png b/graphics/pokemon/poliwrath/footprint.png index 8f562fcef6..393f8191c8 100644 Binary files a/graphics/pokemon/poliwrath/footprint.png and b/graphics/pokemon/poliwrath/footprint.png differ diff --git a/graphics/pokemon/ponyta/footprint.png b/graphics/pokemon/ponyta/footprint.png index 906ee7a5b5..593b4eae81 100644 Binary files a/graphics/pokemon/ponyta/footprint.png and b/graphics/pokemon/ponyta/footprint.png differ diff --git a/graphics/pokemon/poochyena/footprint.png b/graphics/pokemon/poochyena/footprint.png index c4afe995f0..820645c7cd 100644 Binary files a/graphics/pokemon/poochyena/footprint.png and b/graphics/pokemon/poochyena/footprint.png differ diff --git a/graphics/pokemon/porygon/footprint.png b/graphics/pokemon/porygon/footprint.png index 02243e3bc4..39764c24a4 100644 Binary files a/graphics/pokemon/porygon/footprint.png and b/graphics/pokemon/porygon/footprint.png differ diff --git a/graphics/pokemon/porygon2/footprint.png b/graphics/pokemon/porygon2/footprint.png index f92224af35..40f947b463 100644 Binary files a/graphics/pokemon/porygon2/footprint.png and b/graphics/pokemon/porygon2/footprint.png differ diff --git a/graphics/pokemon/primeape/footprint.png b/graphics/pokemon/primeape/footprint.png index f4c90ee175..76f77d387e 100644 Binary files a/graphics/pokemon/primeape/footprint.png and b/graphics/pokemon/primeape/footprint.png differ diff --git a/graphics/pokemon/psyduck/footprint.png b/graphics/pokemon/psyduck/footprint.png index 4dff448005..fc06dcd4f6 100644 Binary files a/graphics/pokemon/psyduck/footprint.png and b/graphics/pokemon/psyduck/footprint.png differ diff --git a/graphics/pokemon/pupitar/footprint.png b/graphics/pokemon/pupitar/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/pupitar/footprint.png and b/graphics/pokemon/pupitar/footprint.png differ diff --git a/graphics/pokemon/quagsire/footprint.png b/graphics/pokemon/quagsire/footprint.png index d04039763d..5d84baf3d0 100644 Binary files a/graphics/pokemon/quagsire/footprint.png and b/graphics/pokemon/quagsire/footprint.png differ diff --git a/graphics/pokemon/question_mark/footprint.png b/graphics/pokemon/question_mark/footprint.png index 7c4f45eaad..8da752a46b 100644 Binary files a/graphics/pokemon/question_mark/footprint.png and b/graphics/pokemon/question_mark/footprint.png differ diff --git a/graphics/pokemon/quilava/footprint.png b/graphics/pokemon/quilava/footprint.png index 28324dd7c9..46c185bffe 100644 Binary files a/graphics/pokemon/quilava/footprint.png and b/graphics/pokemon/quilava/footprint.png differ diff --git a/graphics/pokemon/qwilfish/footprint.png b/graphics/pokemon/qwilfish/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/qwilfish/footprint.png and b/graphics/pokemon/qwilfish/footprint.png differ diff --git a/graphics/pokemon/raichu/footprint.png b/graphics/pokemon/raichu/footprint.png index 9f2ac3993e..3f631ab874 100644 Binary files a/graphics/pokemon/raichu/footprint.png and b/graphics/pokemon/raichu/footprint.png differ diff --git a/graphics/pokemon/raikou/footprint.png b/graphics/pokemon/raikou/footprint.png index b7081dcd35..b7cd9c7dbf 100644 Binary files a/graphics/pokemon/raikou/footprint.png and b/graphics/pokemon/raikou/footprint.png differ diff --git a/graphics/pokemon/ralts/footprint.png b/graphics/pokemon/ralts/footprint.png index 6965dbe60f..a9b0e33c28 100644 Binary files a/graphics/pokemon/ralts/footprint.png and b/graphics/pokemon/ralts/footprint.png differ diff --git a/graphics/pokemon/rapidash/footprint.png b/graphics/pokemon/rapidash/footprint.png index 3361489fd9..ffa2c80a9f 100644 Binary files a/graphics/pokemon/rapidash/footprint.png and b/graphics/pokemon/rapidash/footprint.png differ diff --git a/graphics/pokemon/raticate/footprint.png b/graphics/pokemon/raticate/footprint.png index 6628cfdd75..e1462e71a4 100644 Binary files a/graphics/pokemon/raticate/footprint.png and b/graphics/pokemon/raticate/footprint.png differ diff --git a/graphics/pokemon/rattata/footprint.png b/graphics/pokemon/rattata/footprint.png index 008b1ddc00..2f8e0312a5 100644 Binary files a/graphics/pokemon/rattata/footprint.png and b/graphics/pokemon/rattata/footprint.png differ diff --git a/graphics/pokemon/rayquaza/footprint.png b/graphics/pokemon/rayquaza/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/rayquaza/footprint.png and b/graphics/pokemon/rayquaza/footprint.png differ diff --git a/graphics/pokemon/regice/footprint.png b/graphics/pokemon/regice/footprint.png index 6965dbe60f..a9b0e33c28 100644 Binary files a/graphics/pokemon/regice/footprint.png and b/graphics/pokemon/regice/footprint.png differ diff --git a/graphics/pokemon/regirock/footprint.png b/graphics/pokemon/regirock/footprint.png index 44da2a57fd..d7a4380a77 100644 Binary files a/graphics/pokemon/regirock/footprint.png and b/graphics/pokemon/regirock/footprint.png differ diff --git a/graphics/pokemon/registeel/footprint.png b/graphics/pokemon/registeel/footprint.png index e191faabc8..7f4ee57970 100644 Binary files a/graphics/pokemon/registeel/footprint.png and b/graphics/pokemon/registeel/footprint.png differ diff --git a/graphics/pokemon/relicanth/footprint.png b/graphics/pokemon/relicanth/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/relicanth/footprint.png and b/graphics/pokemon/relicanth/footprint.png differ diff --git a/graphics/pokemon/remoraid/footprint.png b/graphics/pokemon/remoraid/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/remoraid/footprint.png and b/graphics/pokemon/remoraid/footprint.png differ diff --git a/graphics/pokemon/rhydon/footprint.png b/graphics/pokemon/rhydon/footprint.png index df6d8fced9..cd8a9952d8 100644 Binary files a/graphics/pokemon/rhydon/footprint.png and b/graphics/pokemon/rhydon/footprint.png differ diff --git a/graphics/pokemon/rhyhorn/footprint.png b/graphics/pokemon/rhyhorn/footprint.png index 632b753c24..84e88598c7 100644 Binary files a/graphics/pokemon/rhyhorn/footprint.png and b/graphics/pokemon/rhyhorn/footprint.png differ diff --git a/graphics/pokemon/roselia/footprint.png b/graphics/pokemon/roselia/footprint.png index bedf2ab695..6ea3494a03 100644 Binary files a/graphics/pokemon/roselia/footprint.png and b/graphics/pokemon/roselia/footprint.png differ diff --git a/graphics/pokemon/sableye/footprint.png b/graphics/pokemon/sableye/footprint.png index 204d8da54d..45f0e8bfe9 100644 Binary files a/graphics/pokemon/sableye/footprint.png and b/graphics/pokemon/sableye/footprint.png differ diff --git a/graphics/pokemon/salamence/footprint.png b/graphics/pokemon/salamence/footprint.png index 2440a370fd..b943d07653 100644 Binary files a/graphics/pokemon/salamence/footprint.png and b/graphics/pokemon/salamence/footprint.png differ diff --git a/graphics/pokemon/sandshrew/footprint.png b/graphics/pokemon/sandshrew/footprint.png index 481de0993e..030c4165d7 100644 Binary files a/graphics/pokemon/sandshrew/footprint.png and b/graphics/pokemon/sandshrew/footprint.png differ diff --git a/graphics/pokemon/sandslash/footprint.png b/graphics/pokemon/sandslash/footprint.png index 431ca99be6..231e78e9fa 100644 Binary files a/graphics/pokemon/sandslash/footprint.png and b/graphics/pokemon/sandslash/footprint.png differ diff --git a/graphics/pokemon/sceptile/footprint.png b/graphics/pokemon/sceptile/footprint.png index 1958a47780..fb829943fc 100644 Binary files a/graphics/pokemon/sceptile/footprint.png and b/graphics/pokemon/sceptile/footprint.png differ diff --git a/graphics/pokemon/scizor/footprint.png b/graphics/pokemon/scizor/footprint.png index 00824374ad..9ab66e47e3 100644 Binary files a/graphics/pokemon/scizor/footprint.png and b/graphics/pokemon/scizor/footprint.png differ diff --git a/graphics/pokemon/scyther/footprint.png b/graphics/pokemon/scyther/footprint.png index c6b7730285..e12c46d3c8 100644 Binary files a/graphics/pokemon/scyther/footprint.png and b/graphics/pokemon/scyther/footprint.png differ diff --git a/graphics/pokemon/seadra/footprint.png b/graphics/pokemon/seadra/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/seadra/footprint.png and b/graphics/pokemon/seadra/footprint.png differ diff --git a/graphics/pokemon/seaking/footprint.png b/graphics/pokemon/seaking/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/seaking/footprint.png and b/graphics/pokemon/seaking/footprint.png differ diff --git a/graphics/pokemon/sealeo/footprint.png b/graphics/pokemon/sealeo/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/sealeo/footprint.png and b/graphics/pokemon/sealeo/footprint.png differ diff --git a/graphics/pokemon/seedot/footprint.png b/graphics/pokemon/seedot/footprint.png index 9b41f13eda..ef9f52256b 100644 Binary files a/graphics/pokemon/seedot/footprint.png and b/graphics/pokemon/seedot/footprint.png differ diff --git a/graphics/pokemon/seel/footprint.png b/graphics/pokemon/seel/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/seel/footprint.png and b/graphics/pokemon/seel/footprint.png differ diff --git a/graphics/pokemon/sentret/footprint.png b/graphics/pokemon/sentret/footprint.png index 49ab94c0b5..398cdb4623 100644 Binary files a/graphics/pokemon/sentret/footprint.png and b/graphics/pokemon/sentret/footprint.png differ diff --git a/graphics/pokemon/seviper/footprint.png b/graphics/pokemon/seviper/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/seviper/footprint.png and b/graphics/pokemon/seviper/footprint.png differ diff --git a/graphics/pokemon/sharpedo/footprint.png b/graphics/pokemon/sharpedo/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/sharpedo/footprint.png and b/graphics/pokemon/sharpedo/footprint.png differ diff --git a/graphics/pokemon/shedinja/footprint.png b/graphics/pokemon/shedinja/footprint.png index d4118d5e6e..928f915e96 100644 Binary files a/graphics/pokemon/shedinja/footprint.png and b/graphics/pokemon/shedinja/footprint.png differ diff --git a/graphics/pokemon/shelgon/footprint.png b/graphics/pokemon/shelgon/footprint.png index e2d61b9bc8..5c7a6ab3f0 100644 Binary files a/graphics/pokemon/shelgon/footprint.png and b/graphics/pokemon/shelgon/footprint.png differ diff --git a/graphics/pokemon/shellder/footprint.png b/graphics/pokemon/shellder/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/shellder/footprint.png and b/graphics/pokemon/shellder/footprint.png differ diff --git a/graphics/pokemon/shiftry/footprint.png b/graphics/pokemon/shiftry/footprint.png index 3ea82a3dab..3b3a4f53d3 100644 Binary files a/graphics/pokemon/shiftry/footprint.png and b/graphics/pokemon/shiftry/footprint.png differ diff --git a/graphics/pokemon/shroomish/footprint.png b/graphics/pokemon/shroomish/footprint.png index d3a5986ce4..1187f2d5e7 100644 Binary files a/graphics/pokemon/shroomish/footprint.png and b/graphics/pokemon/shroomish/footprint.png differ diff --git a/graphics/pokemon/shuckle/footprint.png b/graphics/pokemon/shuckle/footprint.png index e26b60bcd3..169bb4cf5b 100644 Binary files a/graphics/pokemon/shuckle/footprint.png and b/graphics/pokemon/shuckle/footprint.png differ diff --git a/graphics/pokemon/shuppet/footprint.png b/graphics/pokemon/shuppet/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/shuppet/footprint.png and b/graphics/pokemon/shuppet/footprint.png differ diff --git a/graphics/pokemon/silcoon/footprint.png b/graphics/pokemon/silcoon/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/silcoon/footprint.png and b/graphics/pokemon/silcoon/footprint.png differ diff --git a/graphics/pokemon/skarmory/footprint.png b/graphics/pokemon/skarmory/footprint.png index 1134fec294..3f0b2d3119 100644 Binary files a/graphics/pokemon/skarmory/footprint.png and b/graphics/pokemon/skarmory/footprint.png differ diff --git a/graphics/pokemon/skiploom/footprint.png b/graphics/pokemon/skiploom/footprint.png index efa7f50342..544ef0ea6d 100644 Binary files a/graphics/pokemon/skiploom/footprint.png and b/graphics/pokemon/skiploom/footprint.png differ diff --git a/graphics/pokemon/skitty/footprint.png b/graphics/pokemon/skitty/footprint.png index 355153dcb5..2e78b5093e 100644 Binary files a/graphics/pokemon/skitty/footprint.png and b/graphics/pokemon/skitty/footprint.png differ diff --git a/graphics/pokemon/slaking/footprint.png b/graphics/pokemon/slaking/footprint.png index c2c20413ba..68e966d7d5 100644 Binary files a/graphics/pokemon/slaking/footprint.png and b/graphics/pokemon/slaking/footprint.png differ diff --git a/graphics/pokemon/slakoth/footprint.png b/graphics/pokemon/slakoth/footprint.png index ec258f41b0..8aedbd79ed 100644 Binary files a/graphics/pokemon/slakoth/footprint.png and b/graphics/pokemon/slakoth/footprint.png differ diff --git a/graphics/pokemon/slowbro/footprint.png b/graphics/pokemon/slowbro/footprint.png index c4f82e4058..0bcb0789c4 100644 Binary files a/graphics/pokemon/slowbro/footprint.png and b/graphics/pokemon/slowbro/footprint.png differ diff --git a/graphics/pokemon/slowking/footprint.png b/graphics/pokemon/slowking/footprint.png index 52593624a2..e85d1307c4 100644 Binary files a/graphics/pokemon/slowking/footprint.png and b/graphics/pokemon/slowking/footprint.png differ diff --git a/graphics/pokemon/slowpoke/footprint.png b/graphics/pokemon/slowpoke/footprint.png index a66ebbc32e..f3330b57f6 100644 Binary files a/graphics/pokemon/slowpoke/footprint.png and b/graphics/pokemon/slowpoke/footprint.png differ diff --git a/graphics/pokemon/slugma/footprint.png b/graphics/pokemon/slugma/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/slugma/footprint.png and b/graphics/pokemon/slugma/footprint.png differ diff --git a/graphics/pokemon/smeargle/footprint.png b/graphics/pokemon/smeargle/footprint.png index b946130cdf..8521b26fea 100644 Binary files a/graphics/pokemon/smeargle/footprint.png and b/graphics/pokemon/smeargle/footprint.png differ diff --git a/graphics/pokemon/smoochum/footprint.png b/graphics/pokemon/smoochum/footprint.png index e901d9334c..15461e49a3 100644 Binary files a/graphics/pokemon/smoochum/footprint.png and b/graphics/pokemon/smoochum/footprint.png differ diff --git a/graphics/pokemon/sneasel/footprint.png b/graphics/pokemon/sneasel/footprint.png index 2159ef3dcf..c3472d32a6 100644 Binary files a/graphics/pokemon/sneasel/footprint.png and b/graphics/pokemon/sneasel/footprint.png differ diff --git a/graphics/pokemon/snorlax/footprint.png b/graphics/pokemon/snorlax/footprint.png index d3d25c4bc8..d7f605b5e0 100644 Binary files a/graphics/pokemon/snorlax/footprint.png and b/graphics/pokemon/snorlax/footprint.png differ diff --git a/graphics/pokemon/snorunt/footprint.png b/graphics/pokemon/snorunt/footprint.png index 14277b5068..31a4ac394f 100644 Binary files a/graphics/pokemon/snorunt/footprint.png and b/graphics/pokemon/snorunt/footprint.png differ diff --git a/graphics/pokemon/snubbull/footprint.png b/graphics/pokemon/snubbull/footprint.png index 443847cdd4..b7eb2028c8 100644 Binary files a/graphics/pokemon/snubbull/footprint.png and b/graphics/pokemon/snubbull/footprint.png differ diff --git a/graphics/pokemon/solrock/footprint.png b/graphics/pokemon/solrock/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/solrock/footprint.png and b/graphics/pokemon/solrock/footprint.png differ diff --git a/graphics/pokemon/spearow/footprint.png b/graphics/pokemon/spearow/footprint.png index 6fe6e42824..3422576bec 100644 Binary files a/graphics/pokemon/spearow/footprint.png and b/graphics/pokemon/spearow/footprint.png differ diff --git a/graphics/pokemon/spheal/footprint.png b/graphics/pokemon/spheal/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/spheal/footprint.png and b/graphics/pokemon/spheal/footprint.png differ diff --git a/graphics/pokemon/spinarak/footprint.png b/graphics/pokemon/spinarak/footprint.png index 6965dbe60f..a9b0e33c28 100644 Binary files a/graphics/pokemon/spinarak/footprint.png and b/graphics/pokemon/spinarak/footprint.png differ diff --git a/graphics/pokemon/spinda/footprint.png b/graphics/pokemon/spinda/footprint.png index 7be943a892..688e1ec1e3 100644 Binary files a/graphics/pokemon/spinda/footprint.png and b/graphics/pokemon/spinda/footprint.png differ diff --git a/graphics/pokemon/spinda/spots/spot_0.png b/graphics/pokemon/spinda/spots/spot_0.png new file mode 100644 index 0000000000..e0a515d77d Binary files /dev/null and b/graphics/pokemon/spinda/spots/spot_0.png differ diff --git a/graphics/pokemon/spinda/spots/spot_1.png b/graphics/pokemon/spinda/spots/spot_1.png new file mode 100644 index 0000000000..0e7fbd399a Binary files /dev/null and b/graphics/pokemon/spinda/spots/spot_1.png differ diff --git a/graphics/pokemon/spinda/spots/spot_2.png b/graphics/pokemon/spinda/spots/spot_2.png new file mode 100644 index 0000000000..9bf72bd8c8 Binary files /dev/null and b/graphics/pokemon/spinda/spots/spot_2.png differ diff --git a/graphics/pokemon/spinda/spots/spot_3.png b/graphics/pokemon/spinda/spots/spot_3.png new file mode 100644 index 0000000000..cf4a96f7d3 Binary files /dev/null and b/graphics/pokemon/spinda/spots/spot_3.png differ diff --git a/graphics/pokemon/spoink/footprint.png b/graphics/pokemon/spoink/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/spoink/footprint.png and b/graphics/pokemon/spoink/footprint.png differ diff --git a/graphics/pokemon/squirtle/footprint.png b/graphics/pokemon/squirtle/footprint.png index 696cd6d421..82e01756ce 100644 Binary files a/graphics/pokemon/squirtle/footprint.png and b/graphics/pokemon/squirtle/footprint.png differ diff --git a/graphics/pokemon/stantler/footprint.png b/graphics/pokemon/stantler/footprint.png index 7f2b0f5325..62e2eb062d 100644 Binary files a/graphics/pokemon/stantler/footprint.png and b/graphics/pokemon/stantler/footprint.png differ diff --git a/graphics/pokemon/starmie/footprint.png b/graphics/pokemon/starmie/footprint.png index c1c0058e74..2a1c1f3dd1 100644 Binary files a/graphics/pokemon/starmie/footprint.png and b/graphics/pokemon/starmie/footprint.png differ diff --git a/graphics/pokemon/staryu/footprint.png b/graphics/pokemon/staryu/footprint.png index c1c0058e74..2a1c1f3dd1 100644 Binary files a/graphics/pokemon/staryu/footprint.png and b/graphics/pokemon/staryu/footprint.png differ diff --git a/graphics/pokemon/steelix/footprint.png b/graphics/pokemon/steelix/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/steelix/footprint.png and b/graphics/pokemon/steelix/footprint.png differ diff --git a/graphics/pokemon/sudowoodo/footprint.png b/graphics/pokemon/sudowoodo/footprint.png index 4ed751a794..560ef5e60e 100644 Binary files a/graphics/pokemon/sudowoodo/footprint.png and b/graphics/pokemon/sudowoodo/footprint.png differ diff --git a/graphics/pokemon/suicune/footprint.png b/graphics/pokemon/suicune/footprint.png index 946c35dd0e..57258fb0c3 100644 Binary files a/graphics/pokemon/suicune/footprint.png and b/graphics/pokemon/suicune/footprint.png differ diff --git a/graphics/pokemon/sunflora/footprint.png b/graphics/pokemon/sunflora/footprint.png index f6de3ca9f5..fbc42e7a60 100644 Binary files a/graphics/pokemon/sunflora/footprint.png and b/graphics/pokemon/sunflora/footprint.png differ diff --git a/graphics/pokemon/sunkern/footprint.png b/graphics/pokemon/sunkern/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/sunkern/footprint.png and b/graphics/pokemon/sunkern/footprint.png differ diff --git a/graphics/pokemon/surskit/footprint.png b/graphics/pokemon/surskit/footprint.png index e4945976fc..bbaf5c68cd 100644 Binary files a/graphics/pokemon/surskit/footprint.png and b/graphics/pokemon/surskit/footprint.png differ diff --git a/graphics/pokemon/swablu/footprint.png b/graphics/pokemon/swablu/footprint.png index 7e71113c3a..747e2caaa8 100644 Binary files a/graphics/pokemon/swablu/footprint.png and b/graphics/pokemon/swablu/footprint.png differ diff --git a/graphics/pokemon/swalot/footprint.png b/graphics/pokemon/swalot/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/swalot/footprint.png and b/graphics/pokemon/swalot/footprint.png differ diff --git a/graphics/pokemon/swampert/footprint.png b/graphics/pokemon/swampert/footprint.png index ed223e641d..65f7d7e67c 100644 Binary files a/graphics/pokemon/swampert/footprint.png and b/graphics/pokemon/swampert/footprint.png differ diff --git a/graphics/pokemon/swellow/footprint.png b/graphics/pokemon/swellow/footprint.png index f44a71c29b..9757114c02 100644 Binary files a/graphics/pokemon/swellow/footprint.png and b/graphics/pokemon/swellow/footprint.png differ diff --git a/graphics/pokemon/swinub/footprint.png b/graphics/pokemon/swinub/footprint.png index fb56709ec6..c1573fe84a 100644 Binary files a/graphics/pokemon/swinub/footprint.png and b/graphics/pokemon/swinub/footprint.png differ diff --git a/graphics/pokemon/taillow/footprint.png b/graphics/pokemon/taillow/footprint.png index dbf5c5c6b4..a54a5c93fe 100644 Binary files a/graphics/pokemon/taillow/footprint.png and b/graphics/pokemon/taillow/footprint.png differ diff --git a/graphics/pokemon/tangela/footprint.png b/graphics/pokemon/tangela/footprint.png index c05d3b4375..2b0c03fa5f 100644 Binary files a/graphics/pokemon/tangela/footprint.png and b/graphics/pokemon/tangela/footprint.png differ diff --git a/graphics/pokemon/tauros/footprint.png b/graphics/pokemon/tauros/footprint.png index 602011c6d6..3ae3a980d1 100644 Binary files a/graphics/pokemon/tauros/footprint.png and b/graphics/pokemon/tauros/footprint.png differ diff --git a/graphics/pokemon/teddiursa/footprint.png b/graphics/pokemon/teddiursa/footprint.png index def88c3233..6e0bdfd171 100644 Binary files a/graphics/pokemon/teddiursa/footprint.png and b/graphics/pokemon/teddiursa/footprint.png differ diff --git a/graphics/pokemon/tentacool/footprint.png b/graphics/pokemon/tentacool/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/tentacool/footprint.png and b/graphics/pokemon/tentacool/footprint.png differ diff --git a/graphics/pokemon/tentacruel/footprint.png b/graphics/pokemon/tentacruel/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/tentacruel/footprint.png and b/graphics/pokemon/tentacruel/footprint.png differ diff --git a/graphics/pokemon/togepi/footprint.png b/graphics/pokemon/togepi/footprint.png index 84e75101b1..cf50fcd8fd 100644 Binary files a/graphics/pokemon/togepi/footprint.png and b/graphics/pokemon/togepi/footprint.png differ diff --git a/graphics/pokemon/togetic/footprint.png b/graphics/pokemon/togetic/footprint.png index b15913fa81..239f42d98d 100644 Binary files a/graphics/pokemon/togetic/footprint.png and b/graphics/pokemon/togetic/footprint.png differ diff --git a/graphics/pokemon/torchic/footprint.png b/graphics/pokemon/torchic/footprint.png index 955afa82ac..4149f9bb1f 100644 Binary files a/graphics/pokemon/torchic/footprint.png and b/graphics/pokemon/torchic/footprint.png differ diff --git a/graphics/pokemon/torkoal/footprint.png b/graphics/pokemon/torkoal/footprint.png index 208f3bb775..35facf20e4 100644 Binary files a/graphics/pokemon/torkoal/footprint.png and b/graphics/pokemon/torkoal/footprint.png differ diff --git a/graphics/pokemon/totodile/footprint.png b/graphics/pokemon/totodile/footprint.png index 2102602737..dd3fd2e209 100644 Binary files a/graphics/pokemon/totodile/footprint.png and b/graphics/pokemon/totodile/footprint.png differ diff --git a/graphics/pokemon/trapinch/footprint.png b/graphics/pokemon/trapinch/footprint.png index c3e6e785b2..be4eeb90ef 100644 Binary files a/graphics/pokemon/trapinch/footprint.png and b/graphics/pokemon/trapinch/footprint.png differ diff --git a/graphics/pokemon/treecko/footprint.png b/graphics/pokemon/treecko/footprint.png index ed3854702e..695c6a891d 100644 Binary files a/graphics/pokemon/treecko/footprint.png and b/graphics/pokemon/treecko/footprint.png differ diff --git a/graphics/pokemon/tropius/footprint.png b/graphics/pokemon/tropius/footprint.png index e6e7e8795a..3aaaaaf673 100644 Binary files a/graphics/pokemon/tropius/footprint.png and b/graphics/pokemon/tropius/footprint.png differ diff --git a/graphics/pokemon/typhlosion/footprint.png b/graphics/pokemon/typhlosion/footprint.png index 1d4492cf13..989b796e5e 100644 Binary files a/graphics/pokemon/typhlosion/footprint.png and b/graphics/pokemon/typhlosion/footprint.png differ diff --git a/graphics/pokemon/tyranitar/footprint.png b/graphics/pokemon/tyranitar/footprint.png index ea12c75b08..c5e6dfdd7f 100644 Binary files a/graphics/pokemon/tyranitar/footprint.png and b/graphics/pokemon/tyranitar/footprint.png differ diff --git a/graphics/pokemon/tyrogue/footprint.png b/graphics/pokemon/tyrogue/footprint.png index 0ef849eb89..66cbd80806 100644 Binary files a/graphics/pokemon/tyrogue/footprint.png and b/graphics/pokemon/tyrogue/footprint.png differ diff --git a/graphics/pokemon/umbreon/footprint.png b/graphics/pokemon/umbreon/footprint.png index a1d897dc37..97ce7db2bc 100644 Binary files a/graphics/pokemon/umbreon/footprint.png and b/graphics/pokemon/umbreon/footprint.png differ diff --git a/graphics/pokemon/unown/footprint.png b/graphics/pokemon/unown/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/unown/footprint.png and b/graphics/pokemon/unown/footprint.png differ diff --git a/graphics/pokemon/ursaring/footprint.png b/graphics/pokemon/ursaring/footprint.png index b1023bd3b7..c27c42e8c5 100644 Binary files a/graphics/pokemon/ursaring/footprint.png and b/graphics/pokemon/ursaring/footprint.png differ diff --git a/graphics/pokemon/vaporeon/footprint.png b/graphics/pokemon/vaporeon/footprint.png index 2b44d4b249..7e40d8198e 100644 Binary files a/graphics/pokemon/vaporeon/footprint.png and b/graphics/pokemon/vaporeon/footprint.png differ diff --git a/graphics/pokemon/venomoth/footprint.png b/graphics/pokemon/venomoth/footprint.png index 6965dbe60f..a9b0e33c28 100644 Binary files a/graphics/pokemon/venomoth/footprint.png and b/graphics/pokemon/venomoth/footprint.png differ diff --git a/graphics/pokemon/venonat/footprint.png b/graphics/pokemon/venonat/footprint.png index 3675945c92..f1f332f81d 100644 Binary files a/graphics/pokemon/venonat/footprint.png and b/graphics/pokemon/venonat/footprint.png differ diff --git a/graphics/pokemon/venusaur/footprint.png b/graphics/pokemon/venusaur/footprint.png index bdef2c818e..188dd96081 100644 Binary files a/graphics/pokemon/venusaur/footprint.png and b/graphics/pokemon/venusaur/footprint.png differ diff --git a/graphics/pokemon/vibrava/footprint.png b/graphics/pokemon/vibrava/footprint.png index fdf76f9f22..b935f853a3 100644 Binary files a/graphics/pokemon/vibrava/footprint.png and b/graphics/pokemon/vibrava/footprint.png differ diff --git a/graphics/pokemon/victreebel/footprint.png b/graphics/pokemon/victreebel/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/victreebel/footprint.png and b/graphics/pokemon/victreebel/footprint.png differ diff --git a/graphics/pokemon/vigoroth/footprint.png b/graphics/pokemon/vigoroth/footprint.png index bc10a72309..8a39db031e 100644 Binary files a/graphics/pokemon/vigoroth/footprint.png and b/graphics/pokemon/vigoroth/footprint.png differ diff --git a/graphics/pokemon/vileplume/footprint.png b/graphics/pokemon/vileplume/footprint.png index 8fd5bdf83d..ba0d3fca8e 100644 Binary files a/graphics/pokemon/vileplume/footprint.png and b/graphics/pokemon/vileplume/footprint.png differ diff --git a/graphics/pokemon/volbeat/footprint.png b/graphics/pokemon/volbeat/footprint.png index 916c59f606..f5df06fdc3 100644 Binary files a/graphics/pokemon/volbeat/footprint.png and b/graphics/pokemon/volbeat/footprint.png differ diff --git a/graphics/pokemon/voltorb/footprint.png b/graphics/pokemon/voltorb/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/voltorb/footprint.png and b/graphics/pokemon/voltorb/footprint.png differ diff --git a/graphics/pokemon/vulpix/footprint.png b/graphics/pokemon/vulpix/footprint.png index a0a655ca61..064b2bcf74 100644 Binary files a/graphics/pokemon/vulpix/footprint.png and b/graphics/pokemon/vulpix/footprint.png differ diff --git a/graphics/pokemon/wailmer/footprint.png b/graphics/pokemon/wailmer/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/wailmer/footprint.png and b/graphics/pokemon/wailmer/footprint.png differ diff --git a/graphics/pokemon/wailord/footprint.png b/graphics/pokemon/wailord/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/wailord/footprint.png and b/graphics/pokemon/wailord/footprint.png differ diff --git a/graphics/pokemon/walrein/footprint.png b/graphics/pokemon/walrein/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/walrein/footprint.png and b/graphics/pokemon/walrein/footprint.png differ diff --git a/graphics/pokemon/wartortle/footprint.png b/graphics/pokemon/wartortle/footprint.png index 4dd1264966..948a3c86a0 100644 Binary files a/graphics/pokemon/wartortle/footprint.png and b/graphics/pokemon/wartortle/footprint.png differ diff --git a/graphics/pokemon/weedle/footprint.png b/graphics/pokemon/weedle/footprint.png index c1c0058e74..2a1c1f3dd1 100644 Binary files a/graphics/pokemon/weedle/footprint.png and b/graphics/pokemon/weedle/footprint.png differ diff --git a/graphics/pokemon/weepinbell/footprint.png b/graphics/pokemon/weepinbell/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/weepinbell/footprint.png and b/graphics/pokemon/weepinbell/footprint.png differ diff --git a/graphics/pokemon/weezing/footprint.png b/graphics/pokemon/weezing/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/weezing/footprint.png and b/graphics/pokemon/weezing/footprint.png differ diff --git a/graphics/pokemon/whiscash/footprint.png b/graphics/pokemon/whiscash/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/whiscash/footprint.png and b/graphics/pokemon/whiscash/footprint.png differ diff --git a/graphics/pokemon/whismur/footprint.png b/graphics/pokemon/whismur/footprint.png index a2ad42b4ca..a3a49ad7c0 100644 Binary files a/graphics/pokemon/whismur/footprint.png and b/graphics/pokemon/whismur/footprint.png differ diff --git a/graphics/pokemon/wigglytuff/footprint.png b/graphics/pokemon/wigglytuff/footprint.png index 68ce8eda38..d563a24174 100644 Binary files a/graphics/pokemon/wigglytuff/footprint.png and b/graphics/pokemon/wigglytuff/footprint.png differ diff --git a/graphics/pokemon/wingull/footprint.png b/graphics/pokemon/wingull/footprint.png index 057b2cefad..26b410ad37 100644 Binary files a/graphics/pokemon/wingull/footprint.png and b/graphics/pokemon/wingull/footprint.png differ diff --git a/graphics/pokemon/wobbuffet/footprint.png b/graphics/pokemon/wobbuffet/footprint.png index 49fa6818d1..b7d2324d23 100644 Binary files a/graphics/pokemon/wobbuffet/footprint.png and b/graphics/pokemon/wobbuffet/footprint.png differ diff --git a/graphics/pokemon/wooper/footprint.png b/graphics/pokemon/wooper/footprint.png index 5e1ba56e61..22911aa46c 100644 Binary files a/graphics/pokemon/wooper/footprint.png and b/graphics/pokemon/wooper/footprint.png differ diff --git a/graphics/pokemon/wurmple/footprint.png b/graphics/pokemon/wurmple/footprint.png index 3ac4abd9f7..bbb7102f66 100644 Binary files a/graphics/pokemon/wurmple/footprint.png and b/graphics/pokemon/wurmple/footprint.png differ diff --git a/graphics/pokemon/wynaut/footprint.png b/graphics/pokemon/wynaut/footprint.png index 4fe4832c08..6b0daca37a 100644 Binary files a/graphics/pokemon/wynaut/footprint.png and b/graphics/pokemon/wynaut/footprint.png differ diff --git a/graphics/pokemon/xatu/footprint.png b/graphics/pokemon/xatu/footprint.png index 44fcad1e3e..52be000084 100644 Binary files a/graphics/pokemon/xatu/footprint.png and b/graphics/pokemon/xatu/footprint.png differ diff --git a/graphics/pokemon/yanma/footprint.png b/graphics/pokemon/yanma/footprint.png index 20b4a00b06..fc45b68cf4 100644 Binary files a/graphics/pokemon/yanma/footprint.png and b/graphics/pokemon/yanma/footprint.png differ diff --git a/graphics/pokemon/zangoose/footprint.png b/graphics/pokemon/zangoose/footprint.png index e07e58ceec..cc43fe9176 100644 Binary files a/graphics/pokemon/zangoose/footprint.png and b/graphics/pokemon/zangoose/footprint.png differ diff --git a/graphics/pokemon/zapdos/footprint.png b/graphics/pokemon/zapdos/footprint.png index 480063a88b..80b07a5b0a 100644 Binary files a/graphics/pokemon/zapdos/footprint.png and b/graphics/pokemon/zapdos/footprint.png differ diff --git a/graphics/pokemon/zigzagoon/footprint.png b/graphics/pokemon/zigzagoon/footprint.png index d7373e0641..421b25991e 100644 Binary files a/graphics/pokemon/zigzagoon/footprint.png and b/graphics/pokemon/zigzagoon/footprint.png differ diff --git a/graphics/pokemon/zubat/footprint.png b/graphics/pokemon/zubat/footprint.png index c7ccf57f37..2449369fd6 100644 Binary files a/graphics/pokemon/zubat/footprint.png and b/graphics/pokemon/zubat/footprint.png differ diff --git a/graphics/spinda_spots/spot_0.bin b/graphics/spinda_spots/spot_0.bin deleted file mode 100644 index 938d1d5923..0000000000 Binary files a/graphics/spinda_spots/spot_0.bin and /dev/null differ diff --git a/graphics/spinda_spots/spot_1.bin b/graphics/spinda_spots/spot_1.bin deleted file mode 100644 index db46b5de4d..0000000000 Binary files a/graphics/spinda_spots/spot_1.bin and /dev/null differ diff --git a/graphics/spinda_spots/spot_2.bin b/graphics/spinda_spots/spot_2.bin deleted file mode 100644 index 3b1bf72143..0000000000 Binary files a/graphics/spinda_spots/spot_2.bin and /dev/null differ diff --git a/graphics/spinda_spots/spot_3.bin b/graphics/spinda_spots/spot_3.bin deleted file mode 100644 index 10c73f9bad..0000000000 Binary files a/graphics/spinda_spots/spot_3.bin and /dev/null differ diff --git a/graphics/unused/.gitignore b/graphics/unused/.gitignore new file mode 100644 index 0000000000..b929a6cae7 --- /dev/null +++ b/graphics/unused/.gitignore @@ -0,0 +1 @@ +redyellowgreen_frame.bin \ No newline at end of file diff --git a/graphics/unused/redyellowgreen_frame.bin b/graphics/unused/redyellowgreen_frame.bin deleted file mode 100644 index 6852998fb8..0000000000 Binary files a/graphics/unused/redyellowgreen_frame.bin and /dev/null differ diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 69fc398d8c..92cc3338dc 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -21,6 +21,7 @@ JPCONTESTGFXDIR := graphics/contest/japanese POKEDEXGFXDIR := graphics/pokedex STARTERGFXDIR := graphics/starter_choose NAMINGGFXDIR := graphics/naming_screen +SPINDAGFXDIR := graphics/pokemon/spinda/spots types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark contest_types := cool beauty cute smart tough @@ -29,34 +30,34 @@ contest_types := cool beauty cute smart tough ### Castform ### -$(CASTFORMGFXDIR)/front.4bpp: $(CASTFORMGFXDIR)/front_normal_form.4bpp \ - $(CASTFORMGFXDIR)/front_sunny_form.4bpp \ - $(CASTFORMGFXDIR)/front_rainy_form.4bpp \ - $(CASTFORMGFXDIR)/front_snowy_form.4bpp +$(CASTFORMGFXDIR)/front.4bpp: $(CASTFORMGFXDIR)/normal/front.4bpp \ + $(CASTFORMGFXDIR)/sunny/front.4bpp \ + $(CASTFORMGFXDIR)/rainy/front.4bpp \ + $(CASTFORMGFXDIR)/snowy/front.4bpp @cat $^ >$@ -$(CASTFORMGFXDIR)/back.4bpp: $(CASTFORMGFXDIR)/back_normal_form.4bpp \ - $(CASTFORMGFXDIR)/back_sunny_form.4bpp \ - $(CASTFORMGFXDIR)/back_rainy_form.4bpp \ - $(CASTFORMGFXDIR)/back_snowy_form.4bpp +$(CASTFORMGFXDIR)/back.4bpp: $(CASTFORMGFXDIR)/normal/back.4bpp \ + $(CASTFORMGFXDIR)/sunny/back.4bpp \ + $(CASTFORMGFXDIR)/rainy/back.4bpp \ + $(CASTFORMGFXDIR)/snowy/back.4bpp @cat $^ >$@ -$(CASTFORMGFXDIR)/anim_front.4bpp: $(CASTFORMGFXDIR)/anim_front_normal_form.4bpp \ - $(CASTFORMGFXDIR)/anim_front_sunny_form.4bpp \ - $(CASTFORMGFXDIR)/anim_front_rainy_form.4bpp \ - $(CASTFORMGFXDIR)/anim_front_snowy_form.4bpp +$(CASTFORMGFXDIR)/anim_front.4bpp: $(CASTFORMGFXDIR)/normal/anim_front.4bpp \ + $(CASTFORMGFXDIR)/sunny/anim_front.4bpp \ + $(CASTFORMGFXDIR)/rainy/anim_front.4bpp \ + $(CASTFORMGFXDIR)/snowy/anim_front.4bpp @cat $^ >$@ -$(CASTFORMGFXDIR)/normal.gbapal: $(CASTFORMGFXDIR)/normal_normal_form.gbapal \ - $(CASTFORMGFXDIR)/normal_sunny_form.gbapal \ - $(CASTFORMGFXDIR)/normal_rainy_form.gbapal \ - $(CASTFORMGFXDIR)/normal_snowy_form.gbapal +$(CASTFORMGFXDIR)/normal.gbapal: $(CASTFORMGFXDIR)/normal/normal.gbapal \ + $(CASTFORMGFXDIR)/sunny/normal.gbapal \ + $(CASTFORMGFXDIR)/rainy/normal.gbapal \ + $(CASTFORMGFXDIR)/snowy/normal.gbapal @cat $^ >$@ -$(CASTFORMGFXDIR)/shiny.gbapal: $(CASTFORMGFXDIR)/shiny_normal_form.gbapal \ - $(CASTFORMGFXDIR)/shiny_sunny_form.gbapal \ - $(CASTFORMGFXDIR)/shiny_rainy_form.gbapal \ - $(CASTFORMGFXDIR)/shiny_snowy_form.gbapal +$(CASTFORMGFXDIR)/shiny.gbapal: $(CASTFORMGFXDIR)/normal/shiny.gbapal \ + $(CASTFORMGFXDIR)/sunny/shiny.gbapal \ + $(CASTFORMGFXDIR)/rainy/shiny.gbapal \ + $(CASTFORMGFXDIR)/snowy/shiny.gbapal @cat $^ >$@ @@ -289,10 +290,10 @@ $(FONTGFXDIR)/short.fwjpnfont: $(FONTGFXDIR)/japanese_short.png $(FONTGFXDIR)/braille.fwjpnfont: $(FONTGFXDIR)/braille.png $(GFX) $< $@ -$(FONTGFXDIR)/frlg_male.fwjpnfont: $(FONTGFXDIR)/japanese_frlg_male_font.png +$(FONTGFXDIR)/frlg_male.fwjpnfont: $(FONTGFXDIR)/japanese_frlg_male.png $(GFX) $< $@ -$(FONTGFXDIR)/frlg_female.fwjpnfont: $(FONTGFXDIR)/japanese_frlg_female_font.png +$(FONTGFXDIR)/frlg_female.fwjpnfont: $(FONTGFXDIR)/japanese_frlg_female.png $(GFX) $< $@ @@ -680,3 +681,15 @@ $(NAMINGGFXDIR)/cursor_squished.4bpp: %.4bpp: %.png $(NAMINGGFXDIR)/cursor_filled.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 5 -Wnum_tiles + +$(SPINDAGFXDIR)/spot_0.1bpp: %.1bpp: %.png + $(GFX) $< $@ -plain -data_width 2 + +$(SPINDAGFXDIR)/spot_1.1bpp: %.1bpp: %.png + $(GFX) $< $@ -plain -data_width 2 + +$(SPINDAGFXDIR)/spot_2.1bpp: %.1bpp: %.png + $(GFX) $< $@ -plain -data_width 2 + +$(SPINDAGFXDIR)/spot_3.1bpp: %.1bpp: %.png + $(GFX) $< $@ -plain -data_width 2 diff --git a/include/battle.h b/include/battle.h index 118d560984..6c4d780186 100644 --- a/include/battle.h +++ b/include/battle.h @@ -54,6 +54,9 @@ #define BATTLE_BUFFER_LINK_SIZE 0x1000 +// Special indicator value for shellBellDmg in SpecialStatus +#define IGNORE_SHELL_BELL 0xFFFF + struct ResourceFlags { u32 flags[MAX_BATTLERS_COUNT]; @@ -133,7 +136,7 @@ struct SpecialStatus u32 ppNotAffectedByPressure:1; u32 faintedHasReplacement:1; u32 focusBanded:1; - s32 dmg; + s32 shellBellDmg; s32 physicalDmg; s32 specialDmg; u8 physicalBattlerId; @@ -392,7 +395,7 @@ struct BattleStruct u8 expGetterBattlerId; u8 unused_5; u8 absentBattlerFlags; - u8 palaceFlags; // First 4 bits are "is < 50% HP and not asleep" for each battler, last 4 bits are selected moves to pass to AI + u8 palaceFlags; // First 4 bits are "is <= 50% HP and not asleep" for each battler, last 4 bits are selected moves to pass to AI u8 field_93; // related to choosing pokemon? u8 wallyBattleState; u8 wallyMovesState; @@ -417,7 +420,7 @@ struct BattleStruct u8 arenaTurnCounter; u8 turnSideTracker; u8 unused_6[3]; - u8 givenExpMons; // Bits for enemy party's pokemon that gave exp to player's party. + u8 givenExpMons; // Bits for enemy party's Pokémon that gave exp to player's party. u8 lastTakenMoveFrom[MAX_BATTLERS_COUNT * MAX_BATTLERS_COUNT * 2]; // a 3-D array [target][attacker][byte] u16 castformPalette[NUM_CASTFORM_FORMS][16]; union { @@ -437,12 +440,17 @@ 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 pokemon. + u8 alreadyStatusedMoveAttempt; // As bits for battlers; For example when using Thunder Wave on an already paralyzed Pokémon. }; -#define F_DYNAMIC_TYPE_1 (1 << 6) -#define F_DYNAMIC_TYPE_2 (1 << 7) -#define DYNAMIC_TYPE_MASK (F_DYNAMIC_TYPE_1 - 1) +// The palaceFlags member of struct BattleStruct contains 1 flag per move to indicate which moves the AI should consider, +// and 1 flag per battler to indicate whether the battler is awake and at <= 50% HP (which affects move choice). +// The assert below is to ensure palaceFlags is large enough to store these flags without overlap. +STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLERS_COUNT + MAX_MON_MOVES, PalaceFlagsTooSmall) + +#define DYNAMIC_TYPE_MASK ((1 << 6) - 1) +#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 GET_MOVE_TYPE(move, typeArg) \ { \ @@ -587,7 +595,7 @@ struct BattleSpriteData struct MonSpritesGfx { - void *firstDecompressed; // ptr to the decompressed sprite of the first pokemon + void *firstDecompressed; // ptr to the decompressed sprite of the first Pokémon union { void *ptr[MAX_BATTLERS_COUNT]; u8 *byte[MAX_BATTLERS_COUNT]; @@ -642,7 +650,7 @@ extern u16 gChosenMove; extern u16 gCalledMove; extern s32 gBattleMoveDamage; extern s32 gHpDealt; -extern s32 gTakenDmg[MAX_BATTLERS_COUNT]; +extern s32 gBideDmg[MAX_BATTLERS_COUNT]; extern u16 gLastUsedItem; extern u8 gLastUsedAbility; extern u8 gBattlerAttacker; @@ -668,7 +676,7 @@ extern u8 gLastHitBy[MAX_BATTLERS_COUNT]; extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT]; extern u8 gMoveResultFlags; extern u32 gHitMarker; -extern u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT]; +extern u8 gBideTarget[MAX_BATTLERS_COUNT]; extern u8 gUnusedFirstBattleVar2; extern u16 gSideStatuses[NUM_BATTLE_SIDES]; extern struct SideTimer gSideTimers[NUM_BATTLE_SIDES]; diff --git a/include/battle_anim.h b/include/battle_anim.h index f99af9059b..455bf5f4cd 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -192,14 +192,26 @@ u8 GetBattlerSpriteDefault_Y(u8 battlerId); u8 GetSubstituteSpriteDefault_Y(u8 battlerId); // battle_anim_status_effects.c -#define STAT_ANIM_PLUS1 15 -#define STAT_ANIM_PLUS2 39 -#define STAT_ANIM_MINUS1 22 -#define STAT_ANIM_MINUS2 46 +#define STAT_ANIM_PLUS1 14 +#define STAT_ANIM_PLUS2 38 +#define STAT_ANIM_MINUS1 21 +#define STAT_ANIM_MINUS2 45 #define STAT_ANIM_MULTIPLE_PLUS1 55 #define STAT_ANIM_MULTIPLE_PLUS2 56 #define STAT_ANIM_MULTIPLE_MINUS1 57 #define STAT_ANIM_MULTIPLE_MINUS2 58 + +enum { + STAT_ANIM_PAL_ATK, + STAT_ANIM_PAL_DEF, + STAT_ANIM_PAL_ACC, + STAT_ANIM_PAL_SPEED, + STAT_ANIM_PAL_EVASION, + STAT_ANIM_PAL_SPATK, + STAT_ANIM_PAL_SPDEF, + STAT_ANIM_PAL_MULTIPLE = 0xFF +}; + void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId); // battle_anim_ground.c diff --git a/include/battle_message.h b/include/battle_message.h index d34d2125a2..d62c260049 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -1,7 +1,11 @@ #ifndef GUARD_BATTLE_MESSAGE_H #define GUARD_BATTLE_MESSAGE_H -#define TEXT_BUFF_ARRAY_COUNT 16 +// This buffer can hold many different things. Some of the things it can hold +// that have explicit sizes are listed below to ensure it can contain them. +#define TEXT_BUFF_ARRAY_COUNT max(16, \ + max(MOVE_NAME_LENGTH + 2, /* +2 to hold the "!" and EOS. */ \ + POKEMON_NAME_LENGTH + 1)) // for 0xFD #define B_TXT_BUFF1 0x0 diff --git a/include/constants/battle.h b/include/constants/battle.h index ac83feb3a0..50c93083f8 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -168,7 +168,7 @@ // Not really sure what a "hitmarker" is. #define HITMARKER_WAKE_UP_CLEAR (1 << 4) // Cleared when waking up. Never set or checked. -#define HITMARKER_SKIP_DMG_TRACK (1 << 5) +#define HITMARKER_IGNORE_BIDE (1 << 5) #define HITMARKER_DESTINYBOND (1 << 6) #define HITMARKER_NO_ANIMATIONS (1 << 7) #define HITMARKER_IGNORE_SUBSTITUTE (1 << 8) @@ -176,7 +176,7 @@ #define HITMARKER_ATTACKSTRING_PRINTED (1 << 10) #define HITMARKER_NO_PPDEDUCT (1 << 11) #define HITMARKER_SWAP_ATTACKER_TARGET (1 << 12) -#define HITMARKER_IGNORE_SAFEGUARD (1 << 13) +#define HITMARKER_STATUS_ABILITY_EFFECT (1 << 13) #define HITMARKER_SYNCHRONISE_EFFECT (1 << 14) #define HITMARKER_RUN (1 << 15) #define HITMARKER_IGNORE_ON_AIR (1 << 16) diff --git a/include/constants/battle_palace.h b/include/constants/battle_palace.h index 8516550892..1d8c2f2dda 100644 --- a/include/constants/battle_palace.h +++ b/include/constants/battle_palace.h @@ -16,12 +16,12 @@ #define PALACE_DATA_WIN_STREAK 1 #define PALACE_DATA_WIN_STREAK_ACTIVE 2 -// Pokemon in Battle Palace have a move "group" type preference depending on nature +// Pokémon in Battle Palace have a move "group" type preference depending on nature #define PALACE_MOVE_GROUP_ATTACK 0 #define PALACE_MOVE_GROUP_DEFENSE 1 #define PALACE_MOVE_GROUP_SUPPORT 2 -// In palace doubles battles pokemon have a target preference depending on nature +// In palace doubles battles Pokémon have a target preference depending on nature #define PALACE_TARGET_STRONGER 0 #define PALACE_TARGET_WEAKER 1 #define PALACE_TARGET_RANDOM 2 diff --git a/include/constants/contest.h b/include/constants/contest.h index 775dcbe62b..905306203a 100644 --- a/include/constants/contest.h +++ b/include/constants/contest.h @@ -6,6 +6,8 @@ #define CONTEST_LAST_APPEAL (CONTEST_NUM_APPEALS - 1) #define MAX_CONTEST_MOVE_HEARTS 8 +#define CONTESTANT_NONE 0xFF + #define LINK_CONTEST_FLAG_IS_LINK (1 << 0) #define LINK_CONTEST_FLAG_IS_WIRELESS (1 << 1) #define LINK_CONTEST_FLAG_HAS_RS_PLAYER (1 << 2) diff --git a/include/constants/field_specials.h b/include/constants/field_specials.h index 6659403313..1e08a47f95 100644 --- a/include/constants/field_specials.h +++ b/include/constants/field_specials.h @@ -62,7 +62,7 @@ #define DEPT_STORE_FLOORNUM_11F 14 #define DEPT_STORE_FLOORNUM_ROOFTOP 15 -// Lilycove Pokemon Trainer Fan Club +// Lilycove Pokémon Trainer Fan Club #define NUM_TRAINER_FAN_CLUB_MEMBERS 8 #define FANCLUB_GOT_FIRST_FANS 7 diff --git a/include/constants/field_weather.h b/include/constants/field_weather.h index e84dbc48c4..fe7eb6a1ae 100644 --- a/include/constants/field_weather.h +++ b/include/constants/field_weather.h @@ -8,6 +8,7 @@ #define NUM_FOG_DIAGONAL_SPRITES 20 #define NUM_SANDSTORM_SPRITES 20 #define NUM_SWIRL_SANDSTORM_SPRITES 5 +#define NUM_SNOWFLAKE_SPRITES 16 // Controls how the weather should be changing the screen palettes. #define WEATHER_PAL_STATE_CHANGING_WEATHER 0 diff --git a/include/constants/flags.h b/include/constants/flags.h index 59bde846c5..8d98e3aa04 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -40,6 +40,7 @@ #define FLAG_TEMP_1E (TEMP_FLAGS_START + 0x1E) #define FLAG_TEMP_1F (TEMP_FLAGS_START + 0x1F) #define TEMP_FLAGS_END FLAG_TEMP_1F +#define NUM_TEMP_FLAGS (TEMP_FLAGS_END - TEMP_FLAGS_START + 1) #define FLAG_UNUSED_0x020 0x20 // Unused Flag #define FLAG_UNUSED_0x021 0x21 // Unused Flag @@ -121,11 +122,11 @@ #define FLAG_UNUSED_0x068 0x68 // Unused Flag #define FLAG_OCEANIC_MUSEUM_MET_REPORTER 0x69 -#define FLAG_RECEIVED_HM04 0x6A -#define FLAG_RECEIVED_HM06 0x6B +#define FLAG_RECEIVED_HM_STRENGTH 0x6A +#define FLAG_RECEIVED_HM_ROCK_SMASH 0x6B #define FLAG_WHITEOUT_TO_LAVARIDGE 0x6C // Set after defeating Flannery, so the player cant white out from poison before receiving Go Goggles -#define FLAG_RECEIVED_HM05 0x6D -#define FLAG_RECEIVED_HM02 0x6E +#define FLAG_RECEIVED_HM_FLASH 0x6D +#define FLAG_RECEIVED_HM_FLY 0x6E #define FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT 0x6F #define FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE 0x70 #define FLAG_UNUSED_RS_LEGENDARY_BATTLE_DONE 0x71 // Unused Flag. Used in R/S to indicate whether player defeated or caught Groudon/Kyogre in Cave of Origin. @@ -138,9 +139,9 @@ #define FLAG_CANCEL_BATTLE_ROOM_CHALLENGE 0x77 #define FLAG_LANDMARK_MIRAGE_TOWER 0x78 -#define FLAG_RECEIVED_TM31 0x79 -#define FLAG_RECEIVED_HM03 0x7A -#define FLAG_RECEIVED_HM08 0x7B +#define FLAG_RECEIVED_TM_BRICK_BREAK 0x79 +#define FLAG_RECEIVED_HM_SURF 0x7A +#define FLAG_RECEIVED_HM_DIVE 0x7B #define FLAG_REGISTER_RIVAL_POKENAV 0x7C #define FLAG_DEFEATED_RIVAL_ROUTE_104 0x7D #define FLAG_DEFEATED_WALLY_VICTORY_ROAD 0x7E @@ -154,7 +155,7 @@ #define FLAG_PENDING_DAYCARE_EGG 0x86 #define FLAG_THANKED_FOR_PLAYING_WITH_WALLY 0x87 #define FLAG_ENABLE_FIRST_WALLY_POKENAV_CALL 0x88 // Set after defeating Wally outside Mauville Gym. Will activate a call later to register Wally. -#define FLAG_RECEIVED_HM01 0x89 +#define FLAG_RECEIVED_HM_CUT 0x89 #define FLAG_SCOTT_CALL_FORTREE_GYM 0x8A // Triggers call from Scott after defeating Winona #define FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY 0x8B #define FLAG_RECEIVED_6_SODA_POP 0x8C @@ -182,14 +183,14 @@ #define FLAG_CUTE_PAINTING_MADE 0xA2 #define FLAG_SMART_PAINTING_MADE 0xA3 #define FLAG_TOUGH_PAINTING_MADE 0xA4 -#define FLAG_RECEIVED_TM39 0xA5 -#define FLAG_RECEIVED_TM08 0xA6 -#define FLAG_RECEIVED_TM34 0xA7 -#define FLAG_RECEIVED_TM50 0xA8 -#define FLAG_RECEIVED_TM42 0xA9 -#define FLAG_RECEIVED_TM40 0xAA -#define FLAG_RECEIVED_TM04 0xAB -#define FLAG_RECEIVED_TM03 0xAC +#define FLAG_RECEIVED_TM_ROCK_TOMB 0xA5 +#define FLAG_RECEIVED_TM_BULK_UP 0xA6 +#define FLAG_RECEIVED_TM_SHOCK_WAVE 0xA7 +#define FLAG_RECEIVED_TM_OVERHEAT 0xA8 +#define FLAG_RECEIVED_TM_FACADE 0xA9 +#define FLAG_RECEIVED_TM_AERIAL_ACE 0xAA +#define FLAG_RECEIVED_TM_CALM_MIND 0xAB +#define FLAG_RECEIVED_TM_WATER_PULSE 0xAC #define FLAG_HIDE_SECRET_BASE_TRAINER 0xAD #define FLAG_DECORATION_1 0xAE #define FLAG_DECORATION_2 0xAF @@ -226,7 +227,7 @@ #define FLAG_ENCOUNTERED_LATIAS_OR_LATIOS 0xCE #define FLAG_MET_ARCHIE_METEOR_FALLS 0xCF #define FLAG_GOT_BASEMENT_KEY_FROM_WATTSON 0xD0 -#define FLAG_GOT_TM24_FROM_WATTSON 0xD1 +#define FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON 0xD1 #define FLAG_FAN_CLUB_STRENGTH_SHARED 0xD2 // Set when you rate the strength of another trainer in Lilycove's Trainer Fan Club. #define FLAG_DEFEATED_RIVAL_RUSTBORO 0xD3 #define FLAG_RECEIVED_RED_OR_BLUE_ORB 0xD4 @@ -248,15 +249,15 @@ #define FLAG_RECEIVED_STARTER_DOLL 0xE2 #define FLAG_RECEIVED_GOOD_ROD 0xE3 #define FLAG_REGI_DOORS_OPENED 0xE4 -#define FLAG_RECEIVED_TM27 0xE5 -#define FLAG_RECEIVED_TM36 0xE6 -#define FLAG_RECEIVED_TM05 0xE7 -#define FLAG_RECEIVED_TM19 0xE8 +#define FLAG_RECEIVED_TM_RETURN 0xE5 +#define FLAG_RECEIVED_TM_SLUDGE_BOMB 0xE6 +#define FLAG_RECEIVED_TM_ROAR 0xE7 +#define FLAG_RECEIVED_TM_GIGA_DRAIN 0xE8 #define FLAG_UNUSED_0x0E9 0xE9 // Unused Flag -#define FLAG_RECEIVED_TM44 0xEA -#define FLAG_RECEIVED_TM45 0xEB +#define FLAG_RECEIVED_TM_REST 0xEA +#define FLAG_RECEIVED_TM_ATTRACT 0xEB #define FLAG_RECEIVED_GLASS_ORNAMENT 0xEC #define FLAG_RECEIVED_SILVER_SHIELD 0xED #define FLAG_RECEIVED_GOLD_SHIELD 0xEE @@ -281,16 +282,16 @@ #define FLAG_RECEIVED_OLD_ROD 0x101 #define FLAG_RECEIVED_COIN_CASE 0x102 #define FLAG_RETURNED_RED_OR_BLUE_ORB 0x103 -#define FLAG_RECEIVED_TM49 0x104 -#define FLAG_RECEIVED_TM28 0x105 -#define FLAG_RECEIVED_TM09 0x106 +#define FLAG_RECEIVED_TM_SNATCH 0x104 +#define FLAG_RECEIVED_TM_DIG 0x105 +#define FLAG_RECEIVED_TM_BULLET_SEED 0x106 #define FLAG_ENTERED_ELITE_FOUR 0x107 -#define FLAG_RECEIVED_TM10 0x108 -#define FLAG_RECEIVED_TM41 0x109 +#define FLAG_RECEIVED_TM_HIDDEN_POWER 0x108 +#define FLAG_RECEIVED_TM_TORMENT 0x109 #define FLAG_RECEIVED_LAVARIDGE_EGG 0x10A #define FLAG_RECEIVED_REVIVED_FOSSIL_MON 0x10B #define FLAG_SECRET_BASE_REGISTRY_ENABLED 0x10C -#define FLAG_RECEIVED_TM46 0x10D +#define FLAG_RECEIVED_TM_THIEF 0x10D #define FLAG_CONTEST_SKETCH_CREATED 0x10E // Set but never read #define FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE 0x10F #define FLAG_RECEIVED_EXP_SHARE 0x110 @@ -333,7 +334,7 @@ #define FLAG_MET_MAXIE_SOOTOPOLIS 0x135 #define FLAG_MET_SCOTT_RUSTBORO 0x136 #define FLAG_WALLACE_GOES_TO_SKY_PILLAR 0x137 // Set after speaking to Wallace within the Cave of Origin. -#define FLAG_RECEIVED_HM07 0x138 +#define FLAG_RECEIVED_HM_WATERFALL 0x138 #define FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS 0x139 #define FLAG_RECEIVED_AURORA_TICKET 0x13A #define FLAG_RECEIVED_MYSTIC_TICKET 0x13B @@ -568,7 +569,7 @@ #define FLAG_HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 0x1B) #define FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET (FLAG_HIDDEN_ITEMS_START + 0x1C) #define FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 0x1D) -#define FLAG_HIDDEN_ITEM_ROUTE_113_TM32 (FLAG_HIDDEN_ITEMS_START + 0x1E) +#define FLAG_HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM (FLAG_HIDDEN_ITEMS_START + 0x1E) #define FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY (FLAG_HIDDEN_ITEMS_START + 0x1F) #define FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY (FLAG_HIDDEN_ITEMS_START + 0x20) #define FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY (FLAG_HIDDEN_ITEMS_START + 0x21) @@ -1053,7 +1054,7 @@ #define FLAG_ITEM_ROUTE_109_PP_UP 0x3ED #define FLAG_ITEM_ROUTE_110_RARE_CANDY 0x3EE #define FLAG_ITEM_ROUTE_110_DIRE_HIT 0x3EF -#define FLAG_ITEM_ROUTE_111_TM37 0x3F0 +#define FLAG_ITEM_ROUTE_111_TM_SANDSTORM 0x3F0 #define FLAG_ITEM_ROUTE_111_STARDUST 0x3F1 #define FLAG_ITEM_ROUTE_111_HP_UP 0x3F2 #define FLAG_ITEM_ROUTE_112_NUGGET 0x3F3 @@ -1062,7 +1063,7 @@ #define FLAG_ITEM_ROUTE_114_RARE_CANDY 0x3F6 #define FLAG_ITEM_ROUTE_114_PROTEIN 0x3F7 #define FLAG_ITEM_ROUTE_115_SUPER_POTION 0x3F8 -#define FLAG_ITEM_ROUTE_115_TM01 0x3F9 +#define FLAG_ITEM_ROUTE_115_TM_FOCUS_PUNCH 0x3F9 #define FLAG_ITEM_ROUTE_115_IRON 0x3FA #define FLAG_ITEM_ROUTE_116_ETHER 0x3FB #define FLAG_ITEM_ROUTE_116_REPEL 0x3FC @@ -1089,7 +1090,7 @@ #define FLAG_ITEM_RUSTBORO_CITY_X_DEFEND 0x411 #define FLAG_ITEM_LILYCOVE_CITY_MAX_REPEL 0x412 #define FLAG_ITEM_MOSSDEEP_CITY_NET_BALL 0x413 -#define FLAG_ITEM_METEOR_FALLS_1F_1R_TM23 0x414 +#define FLAG_ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL 0x414 #define FLAG_ITEM_METEOR_FALLS_1F_1R_FULL_HEAL 0x415 #define FLAG_ITEM_METEOR_FALLS_1F_1R_MOON_STONE 0x416 #define FLAG_ITEM_METEOR_FALLS_1F_1R_PP_UP 0x417 @@ -1119,35 +1120,35 @@ #define FLAG_ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR 0x42F #define FLAG_ITEM_AQUA_HIDEOUT_B2F_NEST_BALL 0x430 #define FLAG_ITEM_MT_PYRE_EXTERIOR_MAX_POTION 0x431 -#define FLAG_ITEM_MT_PYRE_EXTERIOR_TM48 0x432 +#define FLAG_ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP 0x432 #define FLAG_ITEM_NEW_MAUVILLE_ULTRA_BALL 0x433 #define FLAG_ITEM_NEW_MAUVILLE_ESCAPE_ROPE 0x434 #define FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL 0x435 #define FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER 0x436 -#define FLAG_ITEM_SCORCHED_SLAB_TM11 0x437 -#define FLAG_ITEM_METEOR_FALLS_B1F_2R_TM02 0x438 +#define FLAG_ITEM_SCORCHED_SLAB_TM_SUNNY_DAY 0x437 +#define FLAG_ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW 0x438 #define FLAG_ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL 0x439 #define FLAG_ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY 0x43A #define FLAG_ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL 0x43B #define FLAG_ITEM_VICTORY_ROAD_1F_MAX_ELIXIR 0x43C #define FLAG_ITEM_VICTORY_ROAD_1F_PP_UP 0x43D -#define FLAG_ITEM_VICTORY_ROAD_B1F_TM29 0x43E +#define FLAG_ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC 0x43E #define FLAG_ITEM_VICTORY_ROAD_B1F_FULL_RESTORE 0x43F #define FLAG_ITEM_VICTORY_ROAD_B2F_FULL_HEAL 0x440 -#define FLAG_ITEM_MT_PYRE_6F_TM30 0x441 -#define FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM26 0x442 -#define FLAG_ITEM_FIERY_PATH_TM06 0x443 +#define FLAG_ITEM_MT_PYRE_6F_TM_SHADOW_BALL 0x441 +#define FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE 0x442 +#define FLAG_ITEM_FIERY_PATH_TM_TOXIC 0x443 #define FLAG_ITEM_ROUTE_124_RED_SHARD 0x444 #define FLAG_ITEM_ROUTE_124_BLUE_SHARD 0x445 -#define FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM22 0x446 +#define FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM 0x446 #define FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL 0x447 #define FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE 0x448 #define FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL 0x449 -#define FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM13 0x44A +#define FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM 0x44A #define FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE 0x44B #define FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY 0x44C #define FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE 0x44D -#define FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM18 0x44E +#define FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE 0x44E #define FLAG_ITEM_ROUTE_121_CARBOS 0x44F #define FLAG_ITEM_ROUTE_123_ULTRA_BALL 0x450 #define FLAG_ITEM_ROUTE_126_GREEN_SHARD 0x451 @@ -1157,7 +1158,7 @@ #define FLAG_ITEM_ROUTE_123_ELIXIR 0x455 #define FLAG_ITEM_NEW_MAUVILLE_THUNDER_STONE 0x456 #define FLAG_ITEM_FIERY_PATH_FIRE_STONE 0x457 -#define FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM07 0x458 +#define FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL 0x458 #define FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE 0x459 #define FLAG_ITEM_ROUTE_103_GUARD_SPEC 0x45A #define FLAG_ITEM_ROUTE_104_X_ACCURACY 0x45B @@ -1631,6 +1632,7 @@ #define FLAG_UNUSED_0x95E (DAILY_FLAGS_START + 0x3E) // Unused Flag #define FLAG_UNUSED_0x95F (DAILY_FLAGS_START + 0x3F) // Unused Flag #define DAILY_FLAGS_END (FLAG_UNUSED_0x95F + (7 - FLAG_UNUSED_0x95F % 8)) +#define NUM_DAILY_FLAGS (DAILY_FLAGS_END - DAILY_FLAGS_START + 1) #define FLAGS_COUNT (DAILY_FLAGS_END + 1) @@ -1643,5 +1645,12 @@ #define FLAG_STORING_ITEMS_IN_PYRAMID_BAG (SPECIAL_FLAGS_START + 0x4) // FLAG_SPECIAL_FLAG_0x4005 - 0x407F also exist and are unused #define SPECIAL_FLAGS_END (SPECIAL_FLAGS_START + 0x7F) +#define NUM_SPECIAL_FLAGS (SPECIAL_FLAGS_END - SPECIAL_FLAGS_START + 1) + +// Temp flag aliases +#define FLAG_TEMP_SKIP_GABBY_INTERVIEW FLAG_TEMP_1 +#define FLAG_TEMP_REGICE_PUZZLE_STARTED FLAG_TEMP_2 +#define FLAG_TEMP_REGICE_PUZZLE_FAILED FLAG_TEMP_3 +#define FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE FLAG_TEMP_11 #endif // GUARD_CONSTANTS_FLAGS_H diff --git a/include/constants/game_stat.h b/include/constants/game_stat.h index 053e4a8f9e..5796afbaec 100644 --- a/include/constants/game_stat.h +++ b/include/constants/game_stat.h @@ -13,7 +13,7 @@ #define GAME_STAT_TRAINER_BATTLES 9 #define GAME_STAT_ENTERED_HOF 10 #define GAME_STAT_POKEMON_CAPTURES 11 -#define GAME_STAT_FISHING_CAPTURES 12 +#define GAME_STAT_FISHING_ENCOUNTERS 12 #define GAME_STAT_HATCHED_EGGS 13 #define GAME_STAT_EVOLVED_POKEMON 14 #define GAME_STAT_USED_POKECENTER 15 diff --git a/include/constants/global.h b/include/constants/global.h index 34e0cc2830..54ac196e3e 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -2,9 +2,9 @@ #define GUARD_CONSTANTS_GLOBAL_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. -// In Gen 4 only, migrated Pokemon with Diamond, Pearl, or Platinum's ID show as "----------". +// In Gen 4 only, migrated Pokémon with Diamond, Pearl, or Platinum's ID show as "----------". // Gen 5 and up read Diamond, Pearl, or Platinum's ID as "Sinnoh". -// In Gen 4 and up, migrated Pokemon with HeartGold or SoulSilver's ID show the otherwise unused "Johto" string. +// In Gen 4 and up, migrated Pokémon with HeartGold or SoulSilver's ID show the otherwise unused "Johto" string. #define VERSION_SAPPHIRE 1 #define VERSION_RUBY 2 #define VERSION_EMERALD 3 @@ -80,6 +80,7 @@ #define TRAINER_ID_LENGTH 4 #define MAX_MON_MOVES 4 +#define ALL_MOVES_MASK ((1 << MAX_MON_MOVES) - 1) #define CONTESTANT_COUNT 4 #define CONTEST_CATEGORY_COOL 0 @@ -92,6 +93,7 @@ // string lengths #define ITEM_NAME_LENGTH 14 #define POKEMON_NAME_LENGTH 10 +#define POKEMON_NAME_BUFFER_SIZE max(20, POKEMON_NAME_LENGTH + 1) // Frequently used buffer size. Larger than necessary #define PLAYER_NAME_LENGTH 7 #define MAIL_WORDS_COUNT 9 #define EASY_CHAT_BATTLE_WORDS_COUNT 6 diff --git a/include/constants/items.h b/include/constants/items.h index daf129c76f..ed9bfb5ec8 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -23,7 +23,7 @@ #define FIRST_BALL ITEM_MASTER_BALL #define LAST_BALL ITEM_PREMIER_BALL -// Pokemon Items +// Pokémon Items #define ITEM_POTION 13 #define ITEM_ANTIDOTE 14 #define ITEM_BURN_HEAL 15 @@ -381,65 +381,6 @@ #define ITEM_HM07 345 #define ITEM_HM08 346 -#define ITEM_TM01_FOCUS_PUNCH ITEM_TM01 -#define ITEM_TM02_DRAGON_CLAW ITEM_TM02 -#define ITEM_TM03_WATER_PULSE ITEM_TM03 -#define ITEM_TM04_CALM_MIND ITEM_TM04 -#define ITEM_TM05_ROAR ITEM_TM05 -#define ITEM_TM06_TOXIC ITEM_TM06 -#define ITEM_TM07_HAIL ITEM_TM07 -#define ITEM_TM08_BULK_UP ITEM_TM08 -#define ITEM_TM09_BULLET_SEED ITEM_TM09 -#define ITEM_TM10_HIDDEN_POWER ITEM_TM10 -#define ITEM_TM11_SUNNY_DAY ITEM_TM11 -#define ITEM_TM12_TAUNT ITEM_TM12 -#define ITEM_TM13_ICE_BEAM ITEM_TM13 -#define ITEM_TM14_BLIZZARD ITEM_TM14 -#define ITEM_TM15_HYPER_BEAM ITEM_TM15 -#define ITEM_TM16_LIGHT_SCREEN ITEM_TM16 -#define ITEM_TM17_PROTECT ITEM_TM17 -#define ITEM_TM18_RAIN_DANCE ITEM_TM18 -#define ITEM_TM19_GIGA_DRAIN ITEM_TM19 -#define ITEM_TM20_SAFEGUARD ITEM_TM20 -#define ITEM_TM21_FRUSTRATION ITEM_TM21 -#define ITEM_TM22_SOLAR_BEAM ITEM_TM22 -#define ITEM_TM23_IRON_TAIL ITEM_TM23 -#define ITEM_TM24_THUNDERBOLT ITEM_TM24 -#define ITEM_TM25_THUNDER ITEM_TM25 -#define ITEM_TM26_EARTHQUAKE ITEM_TM26 -#define ITEM_TM27_RETURN ITEM_TM27 -#define ITEM_TM28_DIG ITEM_TM28 -#define ITEM_TM29_PSYCHIC ITEM_TM29 -#define ITEM_TM30_SHADOW_BALL ITEM_TM30 -#define ITEM_TM31_BRICK_BREAK ITEM_TM31 -#define ITEM_TM32_DOUBLE_TEAM ITEM_TM32 -#define ITEM_TM33_REFLECT ITEM_TM33 -#define ITEM_TM34_SHOCK_WAVE ITEM_TM34 -#define ITEM_TM35_FLAMETHROWER ITEM_TM35 -#define ITEM_TM36_SLUDGE_BOMB ITEM_TM36 -#define ITEM_TM37_SANDSTORM ITEM_TM37 -#define ITEM_TM38_FIRE_BLAST ITEM_TM38 -#define ITEM_TM39_ROCK_TOMB ITEM_TM39 -#define ITEM_TM40_AERIAL_ACE ITEM_TM40 -#define ITEM_TM41_TORMENT ITEM_TM41 -#define ITEM_TM42_FACADE ITEM_TM42 -#define ITEM_TM43_SECRET_POWER ITEM_TM43 -#define ITEM_TM44_REST ITEM_TM44 -#define ITEM_TM45_ATTRACT ITEM_TM45 -#define ITEM_TM46_THIEF ITEM_TM46 -#define ITEM_TM47_STEEL_WING ITEM_TM47 -#define ITEM_TM48_SKILL_SWAP ITEM_TM48 -#define ITEM_TM49_SNATCH ITEM_TM49 -#define ITEM_TM50_OVERHEAT ITEM_TM50 -#define ITEM_HM01_CUT ITEM_HM01 -#define ITEM_HM02_FLY ITEM_HM02 -#define ITEM_HM03_SURF ITEM_HM03 -#define ITEM_HM04_STRENGTH ITEM_HM04 -#define ITEM_HM05_FLASH ITEM_HM05 -#define ITEM_HM06_ROCK_SMASH ITEM_HM06 -#define ITEM_HM07_WATERFALL ITEM_HM07 -#define ITEM_HM08_DIVE ITEM_HM08 - // Unknown #define ITEM_15B 347 #define ITEM_15C 348 @@ -535,7 +476,7 @@ #define ITEM_B_USE_MEDICINE 1 #define ITEM_B_USE_OTHER 2 -// Check if the item is one that can be used on a Pokemon. +// Check if the item is one that can be used on a Pokémon. #define ITEM_HAS_EFFECT(item) ((item) >= ITEM_POTION && (item) <= MAX_BERRY_INDEX) #endif // GUARD_CONSTANTS_ITEMS_H diff --git a/include/constants/metatile_labels.h b/include/constants/metatile_labels.h index c2c018761a..3b63d80f84 100644 --- a/include/constants/metatile_labels.h +++ b/include/constants/metatile_labels.h @@ -9,18 +9,6 @@ #define METATILE_BattleDome_Door_Lobby 0x209 #define METATILE_BattleDome_Door_PreBattleRoom 0x20A -// gTileset_BattleFrontierOutsideEast -#define METATILE_BattleFrontierOutsideEast_Door 0x3FC -#define METATILE_BattleFrontierOutsideEast_Door_BattleArena 0x291 -#define METATILE_BattleFrontierOutsideEast_Door_BattleTower 0x329 -#define METATILE_BattleFrontierOutsideEast_Door_Sliding 0x396 - -// gTileset_BattleFrontierOutsideWest -#define METATILE_BattleFrontierOutsideWest_Door 0x3FC -#define METATILE_BattleFrontierOutsideWest_Door_BattleDome 0x28A -#define METATILE_BattleFrontierOutsideWest_Door_BattleFactory 0x263 -#define METATILE_BattleFrontierOutsideWest_Door_Sliding 0x396 - // gTileset_BattleFrontier #define METATILE_BattleFrontier_CorridorOpenDoor_Bottom 0x20F #define METATILE_BattleFrontier_CorridorOpenDoor_Top 0x207 @@ -36,6 +24,18 @@ #define METATILE_BattleFrontier_Elevator_Top1 0x32A #define METATILE_BattleFrontier_Elevator_Top2 0x32B +// gTileset_BattleFrontierOutsideEast +#define METATILE_BattleFrontierOutsideEast_Door 0x3FC +#define METATILE_BattleFrontierOutsideEast_Door_BattleArena 0x291 +#define METATILE_BattleFrontierOutsideEast_Door_BattleTower 0x329 +#define METATILE_BattleFrontierOutsideEast_Door_Sliding 0x396 + +// gTileset_BattleFrontierOutsideWest +#define METATILE_BattleFrontierOutsideWest_Door 0x3FC +#define METATILE_BattleFrontierOutsideWest_Door_BattleDome 0x28A +#define METATILE_BattleFrontierOutsideWest_Door_BattleFactory 0x263 +#define METATILE_BattleFrontierOutsideWest_Door_Sliding 0x396 + // gTileset_BattlePalace #define METATILE_BattlePalace_Door 0x219 @@ -272,6 +272,18 @@ #define METATILE_Lavaridge_NormalGrass 0x206 #define METATILE_Lavaridge_RockWall 0x274 +// gTileset_Lilycove +#define METATILE_Lilycove_Door 0x246 +#define METATILE_Lilycove_Door_DeptStore 0x30C +#define METATILE_Lilycove_Door_SafariZone 0x32D +#define METATILE_Lilycove_Door_Wooden 0x28E +#define METATILE_Lilycove_Wailmer0 0x290 +#define METATILE_Lilycove_Wailmer0_Alt 0x298 +#define METATILE_Lilycove_Wailmer1 0x291 +#define METATILE_Lilycove_Wailmer1_Alt 0x299 +#define METATILE_Lilycove_Wailmer2 0x2A0 +#define METATILE_Lilycove_Wailmer3 0x2A1 + // gTileset_LilycoveMuseum #define METATILE_LilycoveMuseum_Painting0_Left 0x25A #define METATILE_LilycoveMuseum_Painting0_Right 0x25B @@ -284,17 +296,31 @@ #define METATILE_LilycoveMuseum_Painting4_Left 0x262 #define METATILE_LilycoveMuseum_Painting4_Right 0x263 -// gTileset_Lilycove -#define METATILE_Lilycove_Door 0x246 -#define METATILE_Lilycove_Door_DeptStore 0x30C -#define METATILE_Lilycove_Door_SafariZone 0x32D -#define METATILE_Lilycove_Door_Wooden 0x28E -#define METATILE_Lilycove_Wailmer0 0x290 -#define METATILE_Lilycove_Wailmer0_Alt 0x298 -#define METATILE_Lilycove_Wailmer1 0x291 -#define METATILE_Lilycove_Wailmer1_Alt 0x299 -#define METATILE_Lilycove_Wailmer2 0x2A0 -#define METATILE_Lilycove_Wailmer3 0x2A1 +// gTileset_Mauville +#define METATILE_Mauville_DeepSand_BottomMid 0x259 +#define METATILE_Mauville_DeepSand_Center 0x251 +#define METATILE_Mauville_Door 0x2AC +#define METATILE_Mauville_Door_BattleTent 0x3D4 +#define METATILE_Mauville_Door_CyclingRoad 0x289 +#define METATILE_Mauville_Door_Verdanturf 0x3A1 +#define METATILE_Mauville_MirageTower_Tile0 0x3D8 +#define METATILE_Mauville_MirageTower_Tile1 0x3D9 +#define METATILE_Mauville_MirageTower_Tile10 0x3E4 +#define METATILE_Mauville_MirageTower_Tile11 0x3E5 +#define METATILE_Mauville_MirageTower_Tile2 0x3DA +#define METATILE_Mauville_MirageTower_Tile3 0x3E0 +#define METATILE_Mauville_MirageTower_Tile4 0x3E1 +#define METATILE_Mauville_MirageTower_Tile5 0x3E2 +#define METATILE_Mauville_MirageTower_Tile6 0x3E8 +#define METATILE_Mauville_MirageTower_Tile7 0x3E9 +#define METATILE_Mauville_MirageTower_Tile8 0x3EA +#define METATILE_Mauville_MirageTower_Tile9 0x3F0 +#define METATILE_Mauville_MirageTower_TileA 0x3F1 +#define METATILE_Mauville_MirageTower_TileB 0x3F2 +#define METATILE_Mauville_MirageTower_TileC 0x3DB +#define METATILE_Mauville_MirageTower_TileD 0x3DC +#define METATILE_Mauville_MirageTower_TileE 0x3DD +#define METATILE_Mauville_MirageTower_TileF 0x3E3 // gTileset_MauvilleGym #define METATILE_MauvilleGym_FloorTile 0x21A @@ -325,38 +351,16 @@ #define METATILE_MauvilleGym_RedBeamV1_On 0x241 #define METATILE_MauvilleGym_RedBeamV2_On 0x249 -// gTileset_Mauville -#define METATILE_Mauville_DeepSand_BottomMid 0x259 -#define METATILE_Mauville_DeepSand_Center 0x251 -#define METATILE_Mauville_Door 0x2AC -#define METATILE_Mauville_Door_BattleTent 0x3D4 -#define METATILE_Mauville_Door_CyclingRoad 0x289 -#define METATILE_Mauville_Door_Verdanturf 0x3A1 -#define METATILE_Mauville_MirageTower_Tile0 0x3D8 -#define METATILE_Mauville_MirageTower_Tile1 0x3D9 -#define METATILE_Mauville_MirageTower_Tile10 0x3E4 -#define METATILE_Mauville_MirageTower_Tile11 0x3E5 -#define METATILE_Mauville_MirageTower_Tile2 0x3DA -#define METATILE_Mauville_MirageTower_Tile3 0x3E0 -#define METATILE_Mauville_MirageTower_Tile4 0x3E1 -#define METATILE_Mauville_MirageTower_Tile5 0x3E2 -#define METATILE_Mauville_MirageTower_Tile6 0x3E8 -#define METATILE_Mauville_MirageTower_Tile7 0x3E9 -#define METATILE_Mauville_MirageTower_Tile8 0x3EA -#define METATILE_Mauville_MirageTower_Tile9 0x3F0 -#define METATILE_Mauville_MirageTower_TileA 0x3F1 -#define METATILE_Mauville_MirageTower_TileB 0x3F2 -#define METATILE_Mauville_MirageTower_TileC 0x3DB -#define METATILE_Mauville_MirageTower_TileD 0x3DC -#define METATILE_Mauville_MirageTower_TileE 0x3DD -#define METATILE_Mauville_MirageTower_TileF 0x3E3 - // gTileset_MeteorFalls #define METATILE_MeteorFalls_CaveEntrance_Bottom 0x24E #define METATILE_MeteorFalls_CaveEntrance_Left 0x24D #define METATILE_MeteorFalls_CaveEntrance_Right 0x24F #define METATILE_MeteorFalls_CaveEntrance_Top 0x246 +// gTileset_Mossdeep +#define METATILE_Mossdeep_Door 0x2A1 +#define METATILE_Mossdeep_Door_SpaceCenter 0x2ED + // gTileset_MossdeepGameCorner #define METATILE_MossdeepGameCorner_CounterClosed_Bottom 0x232 #define METATILE_MossdeepGameCorner_CounterClosed_Top 0x22A @@ -366,10 +370,6 @@ // gTileset_MossdeepGym #define METATILE_MossdeepGym_YellowArrow_Right 0x250 -// gTileset_Mossdeep -#define METATILE_Mossdeep_Door 0x2A1 -#define METATILE_Mossdeep_Door_SpaceCenter 0x2ED - // gTileset_Pacifidlog #define METATILE_Pacifidlog_Door 0x21A #define METATILE_Pacifidlog_FloatingLogs_HorizontalLeft 0x250 @@ -388,6 +388,11 @@ #define METATILE_Pacifidlog_SubmergedLogs_VerticalBottom 0x262 #define METATILE_Pacifidlog_SubmergedLogs_VerticalTop 0x25A +// gTileset_Petalburg +#define METATILE_Petalburg_Door_BirchsLab 0x249 +#define METATILE_Petalburg_Door_Littleroot 0x248 +#define METATILE_Petalburg_Door_Oldale 0x287 + // gTileset_PetalburgGym #define METATILE_PetalburgGym_Door 0x224 #define METATILE_PetalburgGym_RoomEntrance_Left 0x210 @@ -398,11 +403,6 @@ #define METATILE_PetalburgGym_SlidingDoor_Frame3 0x21B #define METATILE_PetalburgGym_SlidingDoor_Frame4 0x21C -// gTileset_Petalburg -#define METATILE_Petalburg_Door_BirchsLab 0x249 -#define METATILE_Petalburg_Door_Littleroot 0x248 -#define METATILE_Petalburg_Door_Oldale 0x287 - // gTileset_PokemonCenter #define METATILE_PokemonCenter_CounterBarrier 0x25D #define METATILE_PokemonCenter_Door_CableClub 0x264 @@ -431,14 +431,6 @@ #define METATILE_PokemonCenter_Floor_ShadowTop 0x21E #define METATILE_PokemonCenter_Floor_ShadowTop_Alt 0x2DC -// gTileset_RSMossdeepGym -#define METATILE_RSMossdeepGym_RedArrow_Down 0x205 -#define METATILE_RSMossdeepGym_RedArrow_Left 0x20C -#define METATILE_RSMossdeepGym_RedArrow_Right 0x204 -#define METATILE_RSMossdeepGym_RedArrow_Up 0x20D -#define METATILE_RSMossdeepGym_Switch_Down 0x239 -#define METATILE_RSMossdeepGym_Switch_Up 0x238 - // gTileset_Rustboro #define METATILE_Rustboro_Door_Gray 0x21F #define METATILE_Rustboro_Door_Tan 0x22F @@ -726,11 +718,6 @@ #define METATILE_Slateport_Door 0x2DC #define METATILE_Slateport_Door_BattleTent 0x393 -// gTileset_SootopolisGym -#define METATILE_SootopolisGym_Ice_Broken 0x206 -#define METATILE_SootopolisGym_Ice_Cracked 0x20E -#define METATILE_SootopolisGym_Stairs 0x207 - // gTileset_Sootopolis #define METATILE_Sootopolis_Door 0x21E #define METATILE_Sootopolis_Door_Closed 0x248 @@ -738,6 +725,11 @@ #define METATILE_Sootopolis_GymDoor_Closed 0x250 #define METATILE_Sootopolis_RoughWater 0x290 +// gTileset_SootopolisGym +#define METATILE_SootopolisGym_Ice_Broken 0x206 +#define METATILE_SootopolisGym_Ice_Cracked 0x20E +#define METATILE_SootopolisGym_Stairs 0x207 + // gTileset_TrainerHill #define METATILE_TrainerHill_CounterDoor 0x334 #define METATILE_TrainerHill_Door_Elevator_Lobby 0x32C @@ -787,4 +779,12 @@ #define METATILE_Underwater_FloorShadow 0x228 #define METATILE_Underwater_RockWall 0x21E +// Other +#define METATILE_RSMossdeepGym_RedArrow_Down 0x205 +#define METATILE_RSMossdeepGym_RedArrow_Left 0x20C +#define METATILE_RSMossdeepGym_RedArrow_Right 0x204 +#define METATILE_RSMossdeepGym_RedArrow_Up 0x20D +#define METATILE_RSMossdeepGym_Switch_Down 0x239 +#define METATILE_RSMossdeepGym_Switch_Up 0x238 + #endif // GUARD_METATILE_LABELS_H diff --git a/include/constants/pokedex.h b/include/constants/pokedex.h index 7ee1b3760e..c9c51623e5 100644 --- a/include/constants/pokedex.h +++ b/include/constants/pokedex.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONSTANTS_POKEDEX_H #define GUARD_CONSTANTS_POKEDEX_H -// National Pokedex order +// National Pokédex order enum { NATIONAL_DEX_NONE, // Kanto @@ -425,7 +425,7 @@ enum { #define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI #define NATIONAL_DEX_COUNT NATIONAL_DEX_DEOXYS -// Hoenn Pokedex order +// Hoenn Pokédex order enum { HOENN_DEX_NONE, HOENN_DEX_TREECKO, @@ -631,7 +631,7 @@ enum { HOENN_DEX_JIRACHI, HOENN_DEX_DEOXYS, // End of Hoenn Dex (see HOENN_DEX_COUNT) - // Here below have values but are excluded from the Pokedex + // Here below have values but are excluded from the Pokédex HOENN_DEX_BULBASAUR, HOENN_DEX_IVYSAUR, HOENN_DEX_VENUSAUR, diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index e515378d4c..0d6a20e2b9 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONSTANTS_POKEMON_H #define GUARD_CONSTANTS_POKEMON_H -// Pokemon types +// Pokémon types #define TYPE_NONE 255 #define TYPE_NORMAL 0 #define TYPE_FIGHTING 1 @@ -23,27 +23,27 @@ #define TYPE_DARK 17 #define NUMBER_OF_MON_TYPES 18 -// Pokemon egg groups -#define EGG_GROUP_NONE 0 -#define EGG_GROUP_MONSTER 1 -#define EGG_GROUP_WATER_1 2 -#define EGG_GROUP_BUG 3 -#define EGG_GROUP_FLYING 4 -#define EGG_GROUP_FIELD 5 -#define EGG_GROUP_FAIRY 6 -#define EGG_GROUP_GRASS 7 -#define EGG_GROUP_HUMAN_LIKE 8 -#define EGG_GROUP_WATER_3 9 -#define EGG_GROUP_MINERAL 10 -#define EGG_GROUP_AMORPHOUS 11 -#define EGG_GROUP_WATER_2 12 -#define EGG_GROUP_DITTO 13 -#define EGG_GROUP_DRAGON 14 -#define EGG_GROUP_UNDISCOVERED 15 +// Pokémon egg groups +#define EGG_GROUP_NONE 0 +#define EGG_GROUP_MONSTER 1 +#define EGG_GROUP_WATER_1 2 +#define EGG_GROUP_BUG 3 +#define EGG_GROUP_FLYING 4 +#define EGG_GROUP_FIELD 5 +#define EGG_GROUP_FAIRY 6 +#define EGG_GROUP_GRASS 7 +#define EGG_GROUP_HUMAN_LIKE 8 +#define EGG_GROUP_WATER_3 9 +#define EGG_GROUP_MINERAL 10 +#define EGG_GROUP_AMORPHOUS 11 +#define EGG_GROUP_WATER_2 12 +#define EGG_GROUP_DITTO 13 +#define EGG_GROUP_DRAGON 14 +#define EGG_GROUP_NO_EGGS_DISCOVERED 15 -#define EGG_GROUPS_PER_MON 2 +#define EGG_GROUPS_PER_MON 2 -// Pokemon natures +// Pokémon natures #define NATURE_HARDY 0 #define NATURE_LONELY 1 #define NATURE_BRAVE 2 @@ -71,7 +71,7 @@ #define NATURE_QUIRKY 24 #define NUM_NATURES 25 -// Pokemon Stats +// Pokémon Stats #define STAT_HP 0 #define STAT_ATK 1 #define STAT_DEF 2 @@ -220,7 +220,7 @@ #define GROWTH_FAST 4 #define GROWTH_SLOW 5 -// Body colors for pokedex search +// Body colors for Pokédex search #define BODY_COLOR_RED 0 #define BODY_COLOR_BLUE 1 #define BODY_COLOR_YELLOW 2 @@ -263,7 +263,7 @@ #define MON_PIC_HEIGHT 64 #define MON_PIC_SIZE (MON_PIC_WIDTH * MON_PIC_HEIGHT / 2) -// Most pokemon have 2 frames (a default and an alternate for their animation). +// Most Pokémon have 2 frames (a default and an alternate for their animation). // There are 4 exceptions: // - Castform has 4 frames, 1 for each form // - Deoxys has 2 frames, 1 for each form diff --git a/include/constants/pokemon_icon.h b/include/constants/pokemon_icon.h new file mode 100644 index 0000000000..d57d5111a9 --- /dev/null +++ b/include/constants/pokemon_icon.h @@ -0,0 +1,6 @@ +#ifndef GUARD_CONSTANTS_POKEMON_ICON_H +#define GUARD_CONSTANTS_POKEMON_ICON_H + +#define POKE_ICON_BASE_PAL_TAG 56000 + +#endif // GUARD_CONSTANTS_POKEMON_ICON_H diff --git a/include/constants/tms_hms.h b/include/constants/tms_hms.h new file mode 100644 index 0000000000..03fb934139 --- /dev/null +++ b/include/constants/tms_hms.h @@ -0,0 +1,70 @@ +#ifndef GUARD_CONSTANTS_TMS_HMS_H +#define GUARD_CONSTANTS_TMS_HMS_H + +#define FOREACH_TM(F) \ + F(FOCUS_PUNCH) \ + F(DRAGON_CLAW) \ + F(WATER_PULSE) \ + F(CALM_MIND) \ + F(ROAR) \ + F(TOXIC) \ + F(HAIL) \ + F(BULK_UP) \ + F(BULLET_SEED) \ + F(HIDDEN_POWER) \ + F(SUNNY_DAY) \ + F(TAUNT) \ + F(ICE_BEAM) \ + F(BLIZZARD) \ + F(HYPER_BEAM) \ + F(LIGHT_SCREEN) \ + F(PROTECT) \ + F(RAIN_DANCE) \ + F(GIGA_DRAIN) \ + F(SAFEGUARD) \ + F(FRUSTRATION) \ + F(SOLAR_BEAM) \ + F(IRON_TAIL) \ + F(THUNDERBOLT) \ + F(THUNDER) \ + F(EARTHQUAKE) \ + F(RETURN) \ + F(DIG) \ + F(PSYCHIC) \ + F(SHADOW_BALL) \ + F(BRICK_BREAK) \ + F(DOUBLE_TEAM) \ + F(REFLECT) \ + F(SHOCK_WAVE) \ + F(FLAMETHROWER) \ + F(SLUDGE_BOMB) \ + F(SANDSTORM) \ + F(FIRE_BLAST) \ + F(ROCK_TOMB) \ + F(AERIAL_ACE) \ + F(TORMENT) \ + F(FACADE) \ + F(SECRET_POWER) \ + F(REST) \ + F(ATTRACT) \ + F(THIEF) \ + F(STEEL_WING) \ + F(SKILL_SWAP) \ + F(SNATCH) \ + F(OVERHEAT) + +#define FOREACH_HM(F) \ + F(CUT) \ + F(FLY) \ + F(SURF) \ + F(STRENGTH) \ + F(FLASH) \ + F(ROCK_SMASH) \ + F(WATERFALL) \ + F(DIVE) + +#define FOREACH_TMHM(F) \ + FOREACH_TM(F) \ + FOREACH_HM(F) + +#endif diff --git a/include/constants/trainer_hill.h b/include/constants/trainer_hill.h index e0f660b6f0..610cb81c68 100644 --- a/include/constants/trainer_hill.h +++ b/include/constants/trainer_hill.h @@ -55,7 +55,7 @@ #define TRAINER_HILL_OTID 0x10000000 // The full map of each Trainer Hill floor is 16x21. -// The first 5x21 at the top is the entrance/exit area, +// The first 16x5 at the top is the entrance/exit area, // and the remaining 16x16 is the randomized portion of // the room where the trainers are. #define HILL_FLOOR_WIDTH 16 diff --git a/include/constants/tv.h b/include/constants/tv.h index 13ec88ecdc..1b629fb039 100644 --- a/include/constants/tv.h +++ b/include/constants/tv.h @@ -170,7 +170,7 @@ #define NUM_SECRET_BASE_FLAGS 32 // by definition, bitfield of 2 u16s -// TV Show states for Pokemon Contest Live Updates +// TV Show states for Pokémon Contest Live Updates #define CONTESTLIVE_STATE_INTRO 0 #define CONTESTLIVE_STATE_WON_BOTH_ROUNDS 1 #define CONTESTLIVE_STATE_BETTER_ROUND2 2 diff --git a/include/constants/vars.h b/include/constants/vars.h index e0b08f4475..e79919c329 100644 --- a/include/constants/vars.h +++ b/include/constants/vars.h @@ -9,7 +9,7 @@ #define VAR_TEMP_0 (TEMP_VARS_START + 0x0) #define VAR_TEMP_1 (TEMP_VARS_START + 0x1) #define VAR_TEMP_2 (TEMP_VARS_START + 0x2) -#define VAR_TEMP_3 (TEMP_VARS_START + 0x3) +#define VAR_TEMP_3 (TEMP_VARS_START + 0x3) // Note: Used when the player checks a TV #define VAR_TEMP_4 (TEMP_VARS_START + 0x4) #define VAR_TEMP_5 (TEMP_VARS_START + 0x5) #define VAR_TEMP_6 (TEMP_VARS_START + 0x6) @@ -23,6 +23,7 @@ #define VAR_TEMP_E (TEMP_VARS_START + 0xE) #define VAR_TEMP_F (TEMP_VARS_START + 0xF) #define TEMP_VARS_END VAR_TEMP_F +#define NUM_TEMP_VARS (TEMP_VARS_END - TEMP_VARS_START + 1) // object gfx id vars // These 0x10 vars are used to dynamically control a map object's sprite. @@ -310,4 +311,17 @@ // cutscenes nor call a wait command. Used for weather effects in vanilla. #define TRIGGER_RUN_IMMEDIATELY 0 +// Temp var aliases +#define VAR_TEMP_CHALLENGE_STATUS VAR_TEMP_0 + +#define VAR_TEMP_MIXED_RECORDS VAR_TEMP_0 +#define VAR_TEMP_RECORD_MIX_GIFT_ITEM VAR_TEMP_1 + +#define VAR_TEMP_PLAYING_PYRAMID_MUSIC VAR_TEMP_E + +#define VAR_TEMP_FRONTIER_TUTOR_SELECTION VAR_TEMP_D +#define VAR_TEMP_FRONTIER_TUTOR_ID VAR_TEMP_E + +#define VAR_TEMP_TRANSFERRED_SPECIES VAR_TEMP_1 + #endif // GUARD_CONSTANTS_VARS_H diff --git a/include/contest.h b/include/contest.h index d0630a8011..9328188b97 100644 --- a/include/contest.h +++ b/include/contest.h @@ -209,7 +209,7 @@ struct ContestantStatus u8 comboAppealBonus; u8 repeatJam; u8 nextTurnOrder; // turn position - u8 attentionLevel; // How much the Pokemon "stood out" + u8 attentionLevel; // How much the Pokémon "stood out" u8 contestantAnimTarget; }; diff --git a/include/credits.h b/include/credits.h index 2e8c7e0c3c..43f26c3744 100644 --- a/include/credits.h +++ b/include/credits.h @@ -1,7 +1,7 @@ #ifndef GUARD_CREDITS_H #define GUARD_CREDITS_H -extern EWRAM_DATA bool8 gHasHallOfFameRecords; +extern bool8 gHasHallOfFameRecords; void CB2_StartCreditsSequence(void); diff --git a/include/decompress.h b/include/decompress.h index 5e33665b72..18340d54b2 100644 --- a/include/decompress.h +++ b/include/decompress.h @@ -3,7 +3,7 @@ #include "sprite.h" -extern u8 gDecompressionBuffer[0x4000]; +extern u8 ALIGNED(4) gDecompressionBuffer[0x4000]; void LZDecompressWram(const u32 *src, void *dest); void LZDecompressVram(const u32 *src, void *dest); diff --git a/include/decoration.h b/include/decoration.h index b00dd42f12..db0f337f4d 100644 --- a/include/decoration.h +++ b/include/decoration.h @@ -53,8 +53,8 @@ struct Decoration }; extern const struct Decoration gDecorations[]; -extern EWRAM_DATA u8 *gCurDecorationItems; -extern EWRAM_DATA u8 gCurDecorationIndex; +extern u8 *gCurDecorationItems; +extern u8 gCurDecorationIndex; void InitDecorationContextItems(void); void DoSecretBaseDecorationMenu(u8 taskId); diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 01269cdb5e..2a273b7991 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -71,6 +71,12 @@ enum ReflectionTypes #define GROUND_EFFECT_FLAG_HOT_SPRINGS (1 << 18) #define GROUND_EFFECT_FLAG_SEAWEED (1 << 19) +// Sprite data for the CameraObject functions +#define sCamera_FollowSpriteId data[0] +#define sCamera_State data[1] +#define sCamera_MoveX data[2] +#define sCamera_MoveY data[3] + struct StepAnimTable { const union AnimCmd *const *anims; @@ -123,7 +129,7 @@ u8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup); u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation); u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *); void SetSpritePosToMapCoords(s16 mapX, s16 mapY, s16 *destX, s16 *destY); -void CameraObjectReset1(void); +void CameraObjectReset(void); void ObjectEventSetGraphicsId(struct ObjectEvent *, u8 graphicsId); void ObjectEventTurn(struct ObjectEvent *, u8 direction); void ObjectEventTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction); @@ -211,7 +217,7 @@ u16 GetObjectPaletteTag(u8 palSlot); void UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible); s16 GetFigure8XOffset(s16 idx); s16 GetFigure8YOffset(s16 idx); -void CameraObjectReset2(void); +void CameraObjectFreeze(void); u8 GetObjectEventBerryTreeId(u8 objectEventId); void SetBerryTreeJustPicked(u8 mapId, u8 mapNumber, u8 mapGroup); bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup); diff --git a/include/gba/defines.h b/include/gba/defines.h index 82caf56e68..fa3a30fd6e 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -27,14 +27,12 @@ #define IWRAM_START 0x03000000 #define IWRAM_END (IWRAM_START + 0x8000) -#define PLTT 0x5000000 -#define PLTT_SIZE 0x400 - -#define BG_PLTT PLTT -#define BG_PLTT_SIZE 0x200 - -#define OBJ_PLTT (PLTT + 0x200) +#define PLTT 0x5000000 +#define BG_PLTT PLTT +#define BG_PLTT_SIZE 0x200 +#define OBJ_PLTT (PLTT + BG_PLTT_SIZE) #define OBJ_PLTT_SIZE 0x200 +#define PLTT_SIZE (BG_PLTT_SIZE + OBJ_PLTT_SIZE) #define VRAM 0x6000000 #define VRAM_SIZE 0x18000 @@ -64,14 +62,23 @@ #define ROM_HEADER_SIZE 0xC0 +// Dimensions of a tile in pixels +#define TILE_WIDTH 8 +#define TILE_HEIGHT 8 + +// Dimensions of the GBA screen in pixels #define DISPLAY_WIDTH 240 #define DISPLAY_HEIGHT 160 -#define DISPLAY_TILE_WIDTH (DISPLAY_WIDTH / 8) -#define DISPLAY_TILE_HEIGHT (DISPLAY_HEIGHT / 8) +// Dimensions of the GBA screen in tiles +#define DISPLAY_TILE_WIDTH (DISPLAY_WIDTH / TILE_WIDTH) +#define DISPLAY_TILE_HEIGHT (DISPLAY_HEIGHT / TILE_HEIGHT) -#define TILE_SIZE_4BPP 32 -#define TILE_SIZE_8BPP 64 +// Size of different tile formats in bytes +#define TILE_SIZE(bpp)((bpp) * TILE_WIDTH * TILE_HEIGHT / 8) +#define TILE_SIZE_1BPP TILE_SIZE(1) // 8 +#define TILE_SIZE_4BPP TILE_SIZE(4) // 32 +#define TILE_SIZE_8BPP TILE_SIZE(8) // 64 #define TILE_OFFSET_4BPP(n) ((n) * TILE_SIZE_4BPP) #define TILE_OFFSET_8BPP(n) ((n) * TILE_SIZE_8BPP) diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 148ce31db4..53021185e3 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -707,7 +707,7 @@ #define R_BUTTON 0x0100 #define L_BUTTON 0x0200 #define KEYS_MASK 0x03FF -#define KEY_INTR_ENABLE 0x0400 +#define KEY_INTR_ENABLE 0x4000 #define KEY_OR_INTR 0x0000 #define KEY_AND_INTR 0x8000 #define DPAD_ANY ((DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h index 40a25ba059..fc8205efd9 100644 --- a/include/gba/m4a_internal.h +++ b/include/gba/m4a_internal.h @@ -213,7 +213,7 @@ struct SoundInfo ExtVolPitFunc ExtVolPit; u8 gap2[16]; struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS]; - s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2]; + s8 ALIGNED(4) pcmBuffer[PCM_DMA_BUF_SIZE * 2]; }; struct SongHeader diff --git a/include/gba/macro.h b/include/gba/macro.h index 3b35a19464..5239cd4c87 100644 --- a/include/gba/macro.h +++ b/include/gba/macro.h @@ -1,7 +1,7 @@ #ifndef GUARD_GBA_MACRO_H #define GUARD_GBA_MACRO_H -#define CPU_FILL(value, dest, size, bit) \ +#define CPU_FILL_UNCHECKED(value, dest, size, bit) \ { \ vu##bit tmp = (vu##bit)(value); \ CpuSet((void *)&tmp, \ @@ -9,10 +9,33 @@ CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size)/(bit/8) & 0x1FFFFF)); \ } +#if MODERN +#define CPU_FILL(value, dest, size, bit) \ + do \ + { \ + _Static_assert(_Alignof(dest) >= (bit / 8), "destination potentially unaligned"); \ + CPU_FILL_UNCHECKED(value, dest, size, bit); \ + } while (0) +#else +#define CPU_FILL(value, dest, size, bit) CPU_FILL_UNCHECKED(value, dest, size, bit) +#endif + #define CpuFill16(value, dest, size) CPU_FILL(value, dest, size, 16) #define CpuFill32(value, dest, size) CPU_FILL(value, dest, size, 32) -#define CPU_COPY(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size)/(bit/8) & 0x1FFFFF)) +#define CPU_COPY_UNCHECKED(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size)/(bit/8) & 0x1FFFFF)) + +#if MODERN +#define CPU_COPY(src, dest, size, bit) \ + do \ + { \ + _Static_assert(_Alignof(src) >= (bit / 8), "source potentially unaligned"); \ + _Static_assert(_Alignof(dest) >= (bit / 8), "destination potentially unaligned"); \ + CPU_COPY_UNCHECKED(src, dest, size, bit); \ + } while (0) +#else +#define CPU_COPY(src, dest, size, bit) CPU_COPY_UNCHECKED(src, dest, size, bit) +#endif #define CpuCopy16(src, dest, size) CPU_COPY(src, dest, size, 16) #define CpuCopy32(src, dest, size) CPU_COPY(src, dest, size, 32) @@ -31,7 +54,7 @@ #define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF)) -#define DmaSet(dmaNum, src, dest, control) \ +#define DmaSetUnchecked(dmaNum, src, dest, control) \ { \ vu32 *dmaRegs = (vu32 *)REG_ADDR_DMA##dmaNum; \ dmaRegs[0] = (vu32)(src); \ @@ -40,7 +63,21 @@ dmaRegs[2]; \ } -#define DMA_FILL(dmaNum, value, dest, size, bit) \ +#if MODERN +// NOTE: Assumes 16-bit DMAs. +#define DmaSet(dmaNum, src, dest, control) \ + do \ + { \ + _Static_assert(_Alignof(src) >= __builtin_choose_expr(__builtin_constant_p(control), ((control) & (DMA_32BIT << 16)) ? 4 : 2, 2), "source potentially unaligned"); \ + _Static_assert(_Alignof(dest) >= __builtin_choose_expr(__builtin_constant_p(control), ((control) & (DMA_32BIT << 16)) ? 4 : 2, 2), "destination potentially unaligned"); \ + DmaSetUnchecked(dmaNum, src, dest, control); \ + } while (0) +#else +#define DmaSet(dmaNum, src, dest, control) \ + DmaSetUnchecked(dmaNum, src, dest, control) +#endif + +#define DMA_FILL_UNCHECKED(dmaNum, value, dest, size, bit) \ { \ vu##bit tmp = (vu##bit)(value); \ DmaSet(dmaNum, \ @@ -50,6 +87,17 @@ | ((size)/(bit/8))); \ } +#if MODERN +#define DMA_FILL(dmaNum, value, dest, size, bit) \ + do \ + { \ + _Static_assert(_Alignof(dest) >= (bit / 8), "destination potentially unaligned"); \ + DMA_FILL_UNCHECKED(dmaNum, value, dest, size, bit); \ + } while (0) +#else +#define DMA_FILL(dmaNum, value, dest, size, bit) DMA_FILL_UNCHECKED(dmaNum, value, dest, size, bit) +#endif + #define DmaFill16(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 16) #define DmaFill32(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 32) @@ -58,23 +106,46 @@ // unit size (2 or 4 bytes) and then combined with the DMA control flags using a // bitwise OR operation. -#define DMA_CLEAR(dmaNum, dest, size, bit) \ +#define DMA_CLEAR_UNCHECKED(dmaNum, dest, size, bit) \ { \ vu##bit *_dest = (vu##bit *)(dest); \ u32 _size = size; \ DmaFill##bit(dmaNum, 0, _dest, _size); \ } +#if MODERN +#define DMA_CLEAR(dmaNum, dest, size, bit) \ + do \ + { \ + _Static_assert(_Alignof(dest) >= (bit / 8), "destination potentially unaligned"); \ + DMA_CLEAR_UNCHECKED(dmaNum, dest, size, bit); \ + } while (0) +#else +#define DMA_CLEAR(dmaNum, dest, size, bit) DMA_CLEAR_UNCHECKED(dmaNum, dest, size, bit) +#endif + #define DmaClear16(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 16) #define DmaClear32(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 32) -#define DMA_COPY(dmaNum, src, dest, size, bit) \ +#define DMA_COPY_UNCHECKED(dmaNum, src, dest, size, bit) \ DmaSet(dmaNum, \ src, \ dest, \ (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 \ | ((size)/(bit/8))) +#if MODERN +#define DMA_COPY(dmaNum, src, dest, size, bit) \ + do \ + { \ + _Static_assert(_Alignof(src) >= (bit / 8), "source potentially unaligned"); \ + _Static_assert(_Alignof(dest) >= (bit / 8), "destination potentially unaligned"); \ + DMA_COPY_UNCHECKED(dmaNum, src, dest, size, bit); \ + } while (0) +#else +#define DMA_COPY(dmaNum, src, dest, size, bit) DMA_COPY_UNCHECKED(dmaNum, src, dest, size, bit) +#endif + #define DmaCopy16(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 16) #define DmaCopy32(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 32) diff --git a/include/gba/syscall.h b/include/gba/syscall.h index 56cd4ba587..c922084d5f 100644 --- a/include/gba/syscall.h +++ b/include/gba/syscall.h @@ -27,10 +27,32 @@ u16 ArcTan2(s16 x, s16 y); void CpuSet(const void *src, void *dest, u32 control); +#if MODERN +// NOTE: Assumes 16-bit CpuSets unless control is a constant and has +// CPU_SET_32BIT set. +#define CpuSet(src, dest, control) \ + do \ + { \ + _Static_assert(_Alignof(src) >= __builtin_choose_expr(__builtin_constant_p(control), ((control) & CPU_SET_32BIT) ? 4 : 2, 2), "source potentially unaligned"); \ + _Static_assert(_Alignof(dest) >= __builtin_choose_expr(__builtin_constant_p(control), ((control) & CPU_SET_32BIT) ? 4 : 2, 2), "destination potentially unaligned"); \ + CpuSet(src, dest, control); \ + } while (0) +#endif + #define CPU_FAST_SET_SRC_FIXED 0x01000000 void CpuFastSet(const void *src, void *dest, u32 control); +#if MODERN +#define CpuFastSet(src, dest, control) \ + do \ + { \ + _Static_assert(_Alignof(src) >= 4, "source potentially unaligned"); \ + _Static_assert(_Alignof(dest) >= 4, "destination potentially unaligned"); \ + CpuFastSet(src, dest, control); \ + } while (0) +#endif + void BgAffineSet(struct BgAffineSrcData *src, struct BgAffineDstData *dest, s32 count); void ObjAffineSet(struct ObjAffineSrcData *src, void *dest, s32 count, s32 offset); diff --git a/include/global.h b/include/global.h index 184abdbe4c..658af43da7 100644 --- a/include/global.h +++ b/include/global.h @@ -20,7 +20,6 @@ #define BLOCK_CROSS_JUMP asm(""); // to help in decompiling -#define asm_comment(x) asm volatile("@ -- " x " -- ") #define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided") #define NAKED __attribute__((naked)) @@ -81,11 +80,17 @@ // Used in cases where division by 0 can occur in the retail version. // Avoids invalid opcodes on some emulators, and the otherwise UB. #ifdef UBFIX -#define SAFE_DIV(a, b) ((b) ? (a) / (b) : 0) +#define SAFE_DIV(a, b) (((b) != 0) ? (a) / (b) : 0) #else #define SAFE_DIV(a, b) ((a) / (b)) #endif +// The below macro does a%n, but (to match) will switch to a&(n-1) if n is a power of 2. +// There are cases where GF does a&(n-1) where we would really like to have a%n, because +// if n is changed to a value that isn't a power of 2 then a&(n-1) is unlikely to work as +// intended, and a%n for powers of 2 isn't always optimized to use &. +#define MOD(a, n)(((n) & ((n)-1)) ? ((a) % (n)) : ((a) & ((n)-1))) + // Extracts the upper 16 bits of a 32-bit number #define HIHALF(n) (((n) & 0xFFFF0000) >> 16) @@ -130,11 +135,18 @@ #define ROUND_BITS_TO_BYTES(numBits) DIV_ROUND_UP(numBits, 8) // NUM_DEX_FLAG_BYTES allocates more flags than it needs to, as NUM_SPECIES includes the "old unown" -// values that don't appear in the Pokedex. NATIONAL_DEX_COUNT does not include these values. +// values that don't appear in the Pokédex. NATIONAL_DEX_COUNT does not include these values. #define NUM_DEX_FLAG_BYTES ROUND_BITS_TO_BYTES(NUM_SPECIES) #define NUM_FLAG_BYTES ROUND_BITS_TO_BYTES(FLAGS_COUNT) #define NUM_TRENDY_SAYING_BYTES ROUND_BITS_TO_BYTES(NUM_TRENDY_SAYINGS) +// This returns the number of arguments passed to it (up to 8). +#define NARG_8(...) NARG_8_(_, ##__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#define NARG_8_(_, a, b, c, d, e, f, g, h, N, ...) N + +#define CAT(a, b) CAT_(a, b) +#define CAT_(a, b) a ## b + // This produces an error at compile-time if expr is zero. // It looks like file.c:line: size of array `id' is negative #define STATIC_ASSERT(expr, id) typedef char id[(expr) ? 1 : -1]; @@ -508,7 +520,7 @@ struct SaveBlock2 /*0x90*/ u8 filler_90[0x8]; /*0x98*/ struct Time localTimeOffset; /*0xA0*/ struct Time lastBerryTreeUpdate; - /*0xA8*/ u32 gcnLinkFlags; // Read by Pokemon Colosseum/XD + /*0xA8*/ u32 gcnLinkFlags; // Read by Pokémon Colosseum/XD /*0xAC*/ u32 encryptionKey; /*0xB0*/ struct PlayersApprentice playerApprentice; /*0xDC*/ struct Apprentice apprentices[APPRENTICE_COUNT]; @@ -839,7 +851,7 @@ struct WaldaPhrase struct TrainerNameRecord { u32 trainerId; - u8 trainerName[PLAYER_NAME_LENGTH + 1]; + u8 ALIGNED(2) trainerName[PLAYER_NAME_LENGTH + 1]; }; struct TrainerHillSave diff --git a/include/global.tv.h b/include/global.tv.h index 3729562cd6..9c3902e7cc 100644 --- a/include/global.tv.h +++ b/include/global.tv.h @@ -113,17 +113,17 @@ typedef union // size = 0x24 struct { /*0x00*/ u8 kind; /*0x01*/ bool8 active; - /*0x02*/ u8 trainerName[PLAYER_NAME_LENGTH + 1]; + /*0x02*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x0A*/ u16 species; - /*0x0C*/ u8 pokemonName[8]; + /*0x0C*/ u8 opponentName[PLAYER_NAME_LENGTH + 1]; /*0x14*/ u16 defeatedSpecies; /*0x16*/ u16 numFights; /*0x18*/ u16 words[1]; /*0x1A*/ u8 btLevel; /*0x1B*/ u8 interviewResponse; /*0x1C*/ bool8 wonTheChallenge; - /*0x1D*/ u8 language; - /*0x1E*/ u8 pokemonNameLanguage; + /*0x1D*/ u8 playerLanguage; + /*0x1E*/ u8 opponentLanguage; /*0x1F*/ //u8 padding; } bravoTrainerTower; diff --git a/include/graphics.h b/include/graphics.h index 135eaa95e3..9e2fb79539 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -32,7 +32,7 @@ extern const u32 gBallGfx_Premier[]; extern const u32 gBallPal_Premier[]; extern const u32 gOpenPokeballGfx[]; -// pokemon gfx +// Pokémon gfx extern const u32 gMonFrontPic_Bulbasaur[]; extern const u32 gMonPalette_Bulbasaur[]; extern const u32 gMonBackPic_Bulbasaur[]; @@ -881,13 +881,13 @@ extern const u32 gMonShinyPalette_Starmie[]; extern const u32 gMonStillFrontPic_Starmie[]; extern const u8 gMonIcon_Starmie[]; extern const u8 gMonFootprint_Starmie[]; -extern const u32 gMonFrontPic_Mrmime[]; -extern const u32 gMonPalette_Mrmime[]; -extern const u32 gMonBackPic_Mrmime[]; -extern const u32 gMonShinyPalette_Mrmime[]; -extern const u32 gMonStillFrontPic_Mrmime[]; -extern const u8 gMonIcon_Mrmime[]; -extern const u8 gMonFootprint_Mrmime[]; +extern const u32 gMonFrontPic_MrMime[]; +extern const u32 gMonPalette_MrMime[]; +extern const u32 gMonBackPic_MrMime[]; +extern const u32 gMonShinyPalette_MrMime[]; +extern const u32 gMonStillFrontPic_MrMime[]; +extern const u8 gMonIcon_MrMime[]; +extern const u8 gMonFootprint_MrMime[]; extern const u32 gMonFrontPic_Scyther[]; extern const u32 gMonPalette_Scyther[]; extern const u32 gMonBackPic_Scyther[]; @@ -3186,9 +3186,9 @@ extern const u16 gWallClockFemale_Pal[]; extern const u32 gWallClockStart_Tilemap[]; extern const u32 gWallClockView_Tilemap[]; -extern const u32 gBerryFixGameboy_Gfx[]; -extern const u32 gBerryFixGameboy_Tilemap[]; -extern const u16 gBerryFixGameboy_Pal[]; +extern const u32 gBerryFixGbaConnect_Gfx[]; +extern const u32 gBerryFixGbaConnect_Tilemap[]; +extern const u16 gBerryFixGbaConnect_Pal[]; extern const u32 gBerryFixGameboyLogo_Gfx[]; extern const u32 gBerryFixGameboyLogo_Tilemap[]; extern const u16 gBerryFixGameboyLogo_Pal[]; @@ -3282,7 +3282,7 @@ extern const u32 gBattleTerrainPalette_StadiumGlacia[]; extern const u32 gBattleTerrainPalette_StadiumDrake[]; extern const u32 gBattleTerrainPalette_StadiumWallace[]; -// pokedex +// Pokédex extern const u32 gPokedexInterface_Gfx[]; extern const u16 gPokedexBgHoenn_Pal[]; extern const u32 gPokedexMenu_Gfx[]; @@ -3893,7 +3893,7 @@ extern const u32 gIntroGroudon_Gfx[]; extern const u32 gIntroGroudon_Tilemap[]; extern const u32 gIntroLegendBg_Gfx[]; extern const u32 gIntroGroudonBg_Tilemap[]; -extern const u8 gIntro3Bg_Pal[0x200]; +extern const u8 ALIGNED(2) gIntro3Bg_Pal[0x200]; extern const u32 gIntroKyogre_Gfx[]; extern const u32 gIntroKyogre_Tilemap[]; extern const u32 gIntroKyogreBg_Tilemap[]; @@ -4005,7 +4005,7 @@ extern const u32 gBerryPalette_Starf[]; extern const u32 gBerryPic_Enigma[]; extern const u32 gBerryPalette_Enigma[]; -//pokenav +//PokéNav extern const u16 gPokenavCondition_Pal[]; extern const u32 gPokenavCondition_Gfx[]; extern const u32 gPokenavCondition_Tilemap[]; @@ -4769,17 +4769,18 @@ extern const u32 gMetalShineTilemap[]; extern const u32 gBattleAnimMaskImage_Curse[]; extern const u32 gBattleAnimMaskTilemap_Curse[]; -extern const u32 gBattleStatMask_Gfx[]; -extern const u32 gBattleStatMask1_Tilemap[]; -extern const u32 gBattleStatMask2_Tilemap[]; -extern const u32 gBattleStatMask1_Pal[]; -extern const u32 gBattleStatMask2_Pal[]; -extern const u32 gBattleStatMask3_Pal[]; -extern const u32 gBattleStatMask4_Pal[]; -extern const u32 gBattleStatMask5_Pal[]; -extern const u32 gBattleStatMask6_Pal[]; -extern const u32 gBattleStatMask7_Pal[]; -extern const u32 gBattleStatMask8_Pal[]; + +extern const u32 gStatAnim_Gfx[]; +extern const u32 gStatAnim_Increase_Tilemap[]; +extern const u32 gStatAnim_Decrease_Tilemap[]; +extern const u32 gStatAnim_Defense_Pal[]; +extern const u32 gStatAnim_Attack_Pal[]; +extern const u32 gStatAnim_Accuracy_Pal[]; +extern const u32 gStatAnim_Speed_Pal[]; +extern const u32 gStatAnim_Multiple_Pal[]; +extern const u32 gStatAnim_Evasion_Pal[]; +extern const u32 gStatAnim_SpAttack_Pal[]; +extern const u32 gStatAnim_SpDefense_Pal[]; extern const u32 gContestInterfaceGfx[]; extern const u32 gContestAudienceGfx[]; @@ -4878,11 +4879,11 @@ extern const u16 gSlotMachineReelTimePikachu_Pal[]; extern const u32 gBattleAnimBgTilemap_Sandstorm[]; extern const u32 gBattleAnimBgImage_Sandstorm[]; -// Pokedex Area Screen +// Pokédex Area Screen extern const u32 gPokedexAreaScreenAreaUnknown_Gfx[]; extern const u16 gPokedexAreaScreenAreaUnknown_Pal[]; -// Pokemon Storage System +// Pokémon Storage System extern const u32 gStorageSystemMenu_Gfx[]; extern const u16 gStorageSystemPartyMenu_Pal[]; extern const u32 gStorageSystemPartyMenu_Tilemap[]; @@ -5010,7 +5011,7 @@ extern const u32 gBerryCrush_Crusher_Gfx[]; extern const u16 gBerryCrush_Crusher_Pal[]; extern const u32 gBerryCrush_TextWindows_Tilemap[]; -// Pokenav +// PokéNav extern const u32 gPokenavMessageBox_Gfx[]; extern const u32 gPokenavMessageBox_Tilemap[]; extern const u16 gPokenavMessageBox_Pal[]; @@ -5018,9 +5019,9 @@ extern const u32 gPokenavOptions_Gfx[]; extern const u16 gPokenavOptions_Pal[]; // Battle Factory Screen -extern const u8 gFrontierFactorySelectMenu_Gfx[]; -extern const u8 gFrontierFactorySelectMenu_Tilemap[]; -extern const u16 gFrontierFactorySelectMenu_Pal[]; +extern const u16 gFrontierFactoryMenu_Gfx[34 * TILE_SIZE_4BPP / 2]; +extern const u16 gFrontierFactoryMenu_Tilemap[]; +extern const u16 gFrontierFactoryMenu_Pal[]; // Object event pals extern const u16 gObjectEventPal_Brendan[]; diff --git a/include/item.h b/include/item.h index c964e7628a..af8ff8b9d0 100644 --- a/include/item.h +++ b/include/item.h @@ -2,6 +2,8 @@ #define GUARD_ITEM_H #include "constants/item.h" +#include "constants/items.h" +#include "constants/tms_hms.h" typedef void (*ItemUseFunc)(u8); @@ -74,4 +76,25 @@ u8 ItemId_GetBattleUsage(u16 itemId); ItemUseFunc ItemId_GetBattleFunc(u16 itemId); u8 ItemId_GetSecondaryId(u16 itemId); +/* Expands to: + * enum + * { + * ITEM_TM_FOCUS_PUNCH, + * ... + * ITEM_HM_CUT, + * ... + * }; */ +#define ENUM_TM(id) CAT(ITEM_TM_, id), +#define ENUM_HM(id) CAT(ITEM_HM_, id), +enum +{ + ENUM_TM_START_ = ITEM_TM01 - 1, + FOREACH_TM(ENUM_TM) + + ENUM_HM_START_ = ITEM_HM01 - 1, + FOREACH_HM(ENUM_HM) +}; +#undef ENUM_TM +#undef ENUM_HM + #endif // GUARD_ITEM_H diff --git a/include/item_menu.h b/include/item_menu.h index ce03cdacb8..09ddd729c4 100644 --- a/include/item_menu.h +++ b/include/item_menu.h @@ -78,7 +78,7 @@ struct BagMenu u8 numShownItems[POCKETS_COUNT]; s16 graphicsLoadState; u8 unused2[14]; - u8 pocketNameBuffer[32][32]; + u8 ALIGNED(4) pocketNameBuffer[32][32]; u8 unused3[4]; }; diff --git a/include/librfu.h b/include/librfu.h index 0026adecea..6b0bd97c71 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -329,7 +329,7 @@ struct RfuIntrStruct { union RfuPacket rxPacketAlloc; union RfuPacket txPacketAlloc; - u8 block1[0x960]; // size of librfu_intr.s binary + u8 ALIGNED(2) block1[0x960]; // size of librfu_intr.s binary struct STWIStatus block2; }; diff --git a/include/link.h b/include/link.h index f27cddc620..66dd5fecd2 100644 --- a/include/link.h +++ b/include/link.h @@ -238,7 +238,7 @@ struct BlockRequest }; extern struct Link gLink; -extern u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; +extern u16 ALIGNED(4) gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; extern u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE]; extern u16 gLinkType; extern u32 gLinkStatus; diff --git a/include/mon_markings.h b/include/mon_markings.h index fda7ad5630..dbb53f8e82 100644 --- a/include/mon_markings.h +++ b/include/mon_markings.h @@ -18,7 +18,7 @@ struct MonMarkingsMenu struct Sprite *textSprite; const u8 *frameTiles; const u16 *framePalette; - u8 windowSpriteTiles[0x1000]; + u8 ALIGNED(2) windowSpriteTiles[0x1000]; u8 unused[0x80]; u8 tileLoadState; }; diff --git a/include/palette.h b/include/palette.h index 29723ef6c8..15c92cc2a7 100644 --- a/include/palette.h +++ b/include/palette.h @@ -6,8 +6,7 @@ #define gPaletteFade_delay (gPaletteFade.multipurpose2) // normal and hardware fade #define gPaletteFade_submode (gPaletteFade.multipurpose2) // fast fade -#define PLTT_BUFFER_SIZE 0x200 -#define PLTT_DECOMP_BUFFER_SIZE (PLTT_BUFFER_SIZE * 2) +#define PLTT_BUFFER_SIZE (PLTT_SIZE / sizeof(u16)) #define PALETTE_FADE_STATUS_DELAY 2 #define PALETTE_FADE_STATUS_ACTIVE 1 @@ -55,9 +54,9 @@ struct PaletteFadeControl extern struct PaletteFadeControl gPaletteFade; extern u32 gPlttBufferTransferPending; -extern u8 gPaletteDecompressionBuffer[]; -extern u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE]; -extern u16 gPlttBufferFaded[PLTT_BUFFER_SIZE]; +extern u8 ALIGNED(4) gPaletteDecompressionBuffer[]; +extern u16 ALIGNED(4) gPlttBufferUnfaded[PLTT_BUFFER_SIZE]; +extern u16 ALIGNED(4) gPlttBufferFaded[PLTT_BUFFER_SIZE]; void LoadCompressedPalette(const u32 *src, u16 offset, u16 size); void LoadPalette(const void *src, u16 offset, u16 size); diff --git a/include/pokeball.h b/include/pokeball.h index 1149791b86..2f003c4079 100644 --- a/include/pokeball.h +++ b/include/pokeball.h @@ -34,7 +34,7 @@ extern const struct SpriteTemplate gBallSpriteTemplates[]; #define POKEBALL_OPPONENT_SENDOUT 0xFE u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow); -void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes, u16 species); +void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriority, u8 delay, u32 fadePalettes, u16 species); u8 CreateTradePokeballSprite(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 delay, u32 fadePalettes); void StartHealthboxSlideIn(u8 battler); void DoHitAnimHealthboxEffect(u8 battler); diff --git a/include/pokemon.h b/include/pokemon.h index 54b4841f7e..6d08f48746 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -202,7 +202,8 @@ struct BoxPokemon u8 isBadEgg:1; u8 hasSpecies:1; u8 isEgg:1; - u8 unused:5; + u8 blockBoxRS:1; // Unused, but Pokémon Box Ruby & Sapphire will refuse to deposit a Pokémon with this flag set + u8 unused:4; u8 otName[PLAYER_NAME_LENGTH]; u8 markings; u16 checksum; @@ -436,12 +437,17 @@ void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition); void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition); void SetMultiuseSpriteTemplateToTrainerFront(u16 trainerPicId, u8 battlerPosition); -// These are full type signatures for GetMonData() and GetBoxMonData(), -// but they are not used since some code erroneously omits the third arg. -// u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data); -// u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data); -u32 GetMonData(); -u32 GetBoxMonData(); +/* GameFreak called Get(Box)MonData with either 2 or 3 arguments, for + * type safety we have a Get(Box)MonData macro which dispatches to + * either Get(Box)MonData2 or Get(Box)MonData3 based on the number of + * arguments. The two functions are aliases of each other, but they + * differ for matching purposes in the caller's codegen. */ +#define GetMonData(...) CAT(GetMonData, NARG_8(__VA_ARGS__))(__VA_ARGS__) +#define GetBoxMonData(...) CAT(GetBoxMonData, NARG_8(__VA_ARGS__))(__VA_ARGS__) +u32 GetMonData3(struct Pokemon *mon, s32 field, u8 *data); +u32 GetMonData2(struct Pokemon *mon, s32 field); +u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data); +u32 GetBoxMonData2(struct BoxPokemon *boxMon, s32 field); void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg); void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg); diff --git a/include/pokemon_summary_screen.h b/include/pokemon_summary_screen.h index b026baa533..df9e477524 100755 --- a/include/pokemon_summary_screen.h +++ b/include/pokemon_summary_screen.h @@ -14,7 +14,7 @@ void ShowPokemonSummaryScreenHandleDeoxys(u8 mode, struct BoxPokemon *mons, u8 m u8 GetMoveSlotToReplace(void); void SummaryScreen_SetAnimDelayTaskId(u8 taskId); -// The Pokemon Summary Screen can operate in different modes. Certain features, +// The Pokémon Summary Screen can operate in different modes. Certain features, // such as move re-ordering, are available in the different modes. enum PokemonSummaryScreenMode { diff --git a/include/pokenav.h b/include/pokenav.h index c6a8bb253e..174c338e27 100644 --- a/include/pokenav.h +++ b/include/pokenav.h @@ -65,8 +65,8 @@ struct PokenavMonList enum { POKENAV_MODE_NORMAL, // Chosen from Start menu. - POKENAV_MODE_FORCE_CALL_READY, // Pokenav tutorial before calling Mr. Stone - POKENAV_MODE_FORCE_CALL_EXIT, // Pokenav tutorial after calling Mr. Stone + POKENAV_MODE_FORCE_CALL_READY, // PokéNav tutorial before calling Mr. Stone + POKENAV_MODE_FORCE_CALL_EXIT, // PokéNav tutorial after calling Mr. Stone }; enum @@ -232,8 +232,8 @@ enum [CHECK_PAGE_INTRO_2] = gText_MatchCall##name##_Intro2} -// Pokenav Function IDs -// Indices into the LoopedTask tables for each of the main Pokenav features +// PokéNav Function IDs +// Indices into the LoopedTask tables for each of the main PokéNav features enum RegionMapFuncIds { diff --git a/include/scanline_effect.h b/include/scanline_effect.h index ae534d9699..80d9df764d 100644 --- a/include/scanline_effect.h +++ b/include/scanline_effect.h @@ -37,7 +37,7 @@ struct ScanlineEffect extern struct ScanlineEffect gScanlineEffect; -extern u16 gScanlineEffectRegBuffers[2][0x3C0]; +extern u16 ALIGNED(4) gScanlineEffectRegBuffers[2][0x3C0]; void ScanlineEffect_Stop(void); void ScanlineEffect_Clear(void); diff --git a/include/script_menu.h b/include/script_menu.h index 36b66bf987..734c717cff 100644 --- a/include/script_menu.h +++ b/include/script_menu.h @@ -1,6 +1,8 @@ #ifndef GUARD_SCRIPT_MENU_H #define GUARD_SCRIPT_MENU_H +#include "constants/script_menu.h" + extern const u8 *const gStdStrings[]; bool8 ScriptMenu_Multichoice(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBPress); diff --git a/include/shop.h b/include/shop.h index 7fd7669ea5..6644ba0aa0 100644 --- a/include/shop.h +++ b/include/shop.h @@ -1,7 +1,7 @@ #ifndef GUARD_SHOP_H #define GUARD_SHOP_H -extern EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3]; +extern struct ItemSlot gMartPurchaseHistory[3]; void CreatePokemartMenu(const u16 *); void CreateDecorationShop1Menu(const u16 *); diff --git a/include/siirtc.h b/include/siirtc.h index de4fd634df..ad13fc62f3 100644 --- a/include/siirtc.h +++ b/include/siirtc.h @@ -9,6 +9,10 @@ #define SIIRTCINFO_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode #define SIIRTCINFO_POWER 0x80 // power on or power failure occurred +#define HOURS_PER_DAY 24 +#define MINUTES_PER_HOUR 60 +#define SECONDS_PER_MINUTE 60 + enum { MONTH_JAN = 1, @@ -22,7 +26,8 @@ enum MONTH_SEP, MONTH_OCT, MONTH_NOV, - MONTH_DEC + MONTH_DEC, + MONTH_COUNT = MONTH_DEC }; struct SiiRtcInfo diff --git a/include/strings.h b/include/strings.h index eeada2b943..3215f70c88 100644 --- a/include/strings.h +++ b/include/strings.h @@ -519,7 +519,7 @@ extern const u8 gText_Speed[]; extern const u8 gText_Dash[]; extern const u8 gText_Plus[]; -//pokedex text +//Pokédex text extern const u8 gText_CryOf[]; extern const u8 gText_SizeComparedTo[]; extern const u8 gText_PokedexRegistration[]; @@ -1121,7 +1121,7 @@ extern const u8 gTrickHouse_Mechadoll_Six2[]; extern const u8 gTrickHouse_Mechadoll_Seven2[]; extern const u8 gTrickHouse_Mechadoll_Eight2[]; -// Pokedex strings +// Pokédex strings extern const u8 gText_SearchForPkmnBasedOnParameters[]; extern const u8 gText_SwitchPokedexListings[]; extern const u8 gText_ReturnToPokedex[]; @@ -2874,7 +2874,7 @@ extern const u8 gText_WantToPlayAgain[]; extern const u8 gText_CommunicationStandby3[]; extern const u8 gText_SomeoneDroppedOut[]; -// Pokemon jump +// Pokémon jump extern const u8 gText_WantToPlayAgain2[]; extern const u8 gText_SomeoneDroppedOut2[]; extern const u8 gText_CommunicationStandby4[]; @@ -2949,7 +2949,7 @@ extern const u8 gText_CutenessContest[]; extern const u8 gText_SmartnessContest[]; extern const u8 gText_ToughnessContest[]; -// Pokenav Match Call +// PokéNav Match Call extern const u8 gText_CallCantBeMadeHere[]; extern const u8 gText_NumberRegistered[]; extern const u8 gText_NumberOfBattles[]; @@ -2959,7 +2959,7 @@ extern const u8 gText_Call[]; extern const u8 gText_Check[]; extern const u8 gText_Cancel6[]; -// Pokenav Menu Handler +// PokéNav Menu Handler extern const u8 gText_CheckMapOfHoenn[]; extern const u8 gText_CheckPokemonInDetail[]; extern const u8 gText_CallRegisteredTrainer[]; @@ -2976,7 +2976,7 @@ extern const u8 gText_FindToughPokemon[]; extern const u8 gText_ReturnToConditionMenu[]; extern const u8 gText_NoRibbonWinners[]; -// Pokenav +// PokéNav extern const u8 gText_NumberIndex[]; extern const u8 gText_RibbonsF700[]; diff --git a/ld_script.txt b/ld_script.ld similarity index 99% rename from ld_script.txt rename to ld_script.ld index bd9d7c4a35..c4abf075f8 100644 --- a/ld_script.txt +++ b/ld_script.ld @@ -3,6 +3,13 @@ ENTRY(Start) gNumMusicPlayers = 4; gMaxLines = 0; +MEMORY +{ + EWRAM (rwx) : ORIGIN = 0x2000000, LENGTH = 256K + IWRAM (rwx) : ORIGIN = 0x3000000, LENGTH = 32K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 32M +} + /* Modify the following load addresses as needed to make more room. Alternately, delete both the declarations below and their references further down to get rid of the gaps. */ @@ -10,28 +17,20 @@ __anim_mon_load_address = 0x8b00000; __gfx_load_address = 0x8c00000; SECTIONS { - . = 0x2000000; - ewram (NOLOAD) : + ewram 0x2000000 (NOLOAD) : ALIGN(4) { - gHeap = .; - - . = 0x1C000; - INCLUDE "sym_ewram.ld" - src/*.o(.ewram_data); - gflib/*.o(.ewram_data); + src/*.o(ewram_data); + gflib/*.o(ewram_data); *libc.a:impure.o(.data); *libc.a:locale.o(.data); *libc.a:mallocr.o(.data); - . = 0x40000; - } + } > EWRAM - . = 0x3000000; - - iwram (NOLOAD) : + iwram 0x3000000 (NOLOAD) : ALIGN(4) { /* .bss starts at 0x3000000 */ @@ -46,10 +45,9 @@ SECTIONS { /* COMMON starts at 0x30022A8 */ INCLUDE "sym_common.ld" *libc.a:sbrkr.o(COMMON); - end = .; - . = 0x8000; - } + } > IWRAM + /* BEGIN ROM DATA */ . = 0x8000000; .text : @@ -343,7 +341,7 @@ SECTIONS { src/gym_leader_rematch.o(.text); src/battle_transition_frontier.o(.text); src/international_string_util.o(.text); - } =0 + } > ROM =0 script_data : ALIGN(4) @@ -356,7 +354,7 @@ SECTIONS { data/battle_ai_scripts.o(script_data); data/contest_ai_scripts.o(script_data); data/mystery_event_script_cmd_table.o(script_data); - } =0 + } > ROM =0 lib_text : ALIGN(4) @@ -440,7 +438,7 @@ SECTIONS { *libc.a:libcfunc.o(.text); *libc.a:lseekr.o(.text); *libc.a:readr.o(.text); - } =0 + } > ROM =0 .rodata : ALIGN(4) @@ -705,7 +703,7 @@ SECTIONS { data/mystery_gift.o(.rodata); src/m4a_tables.o(.rodata); data/sound_data.o(.rodata); - } =0 + } > ROM =0 song_data : ALIGN(4) @@ -1240,7 +1238,7 @@ SECTIONS { sound/songs/midi/ph_nurse_blend.o(.rodata); sound/songs/midi/ph_nurse_held.o(.rodata); sound/songs/midi/ph_nurse_solo.o(.rodata); - } =0 + } > ROM =0 lib_rodata : SUBALIGN(4) @@ -1293,7 +1291,7 @@ SECTIONS { *libc.a:lseekr.o(.rodata); *libc.a:readr.o(.rodata); src/libisagbprn.o(.rodata); - } =0 + } > ROM =0 multiboot_data : ALIGN(4) @@ -1301,19 +1299,19 @@ SECTIONS { data/multiboot_ereader.o(.rodata); data/multiboot_berry_glitch_fix.o(.rodata); data/multiboot_pokemon_colosseum.o(.rodata); - } =0 + } > ROM =0 anim_mon_front_pic_data __anim_mon_load_address : ALIGN(4) { src/anim_mon_front_pics.o(.rodata); - } =0 + } > ROM =0 gfx_data __gfx_load_address : ALIGN(4) { src/graphics.o(.rodata); - } =0 + } > ROM =0 extra : ALIGN(4) @@ -1323,7 +1321,7 @@ SECTIONS { src/*.o(.rodata); gflib/*.o(.rodata); data/*.o(.rodata); - } = 0 + } > ROM = 0 /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning diff --git a/ld_script_modern.txt b/ld_script_modern.ld similarity index 89% rename from ld_script_modern.txt rename to ld_script_modern.ld index 549d040e1e..4ccbfbaa0f 100644 --- a/ld_script_modern.txt +++ b/ld_script_modern.ld @@ -3,46 +3,40 @@ ENTRY(Start) gNumMusicPlayers = 4; gMaxLines = 0; -SECTIONS { - . = 0x2000000; - - ewram (NOLOAD) : - ALIGN(4) - { - gHeap = .; - - . = 0x1C000; - - src/*.o(ewram_data); - gflib/*.o(ewram_data); - - . = 0x40000; +MEMORY +{ + EWRAM (rwx) : ORIGIN = 0x2000000, LENGTH = 256K + IWRAM (rwx) : ORIGIN = 0x3000000, LENGTH = 32K + ROM (rx) : ORIGIN = 0x8000000, LENGTH = 32M } - . = 0x3000000; +SECTIONS { - iwram (NOLOAD) : + ewram 0x2000000 (NOLOAD) : + ALIGN(4) + { + src/*.o(ewram_data); + gflib/*.o(ewram_data); + } > EWRAM + + iwram 0x3000000 (NOLOAD) : ALIGN(4) { - /* .bss starts at 0x3000000 */ src/*.o(.bss); gflib/*.o(.bss); data/*.o(.bss); *libc.a:*.o(.bss*); *libnosys.a:*.o(.bss*); - /* .bss.code starts at 0x3001AA8 */ src/m4a.o(.bss.code); - /* COMMON starts at 0x30022A8 */ src/*.o(COMMON); gflib/*.o(COMMON); *libc.a:*.o(COMMON); *libnosys.a:*.o(COMMON); - end = .; - . = 0x8000; - } + } > IWRAM + /* BEGIN ROM DATA */ . = 0x8000000; .text : @@ -55,13 +49,13 @@ SECTIONS { gflib/*.o(.text*); src/*.o(.text*); asm/*.o(.text*); - } =0 + } > ROM =0 script_data : ALIGN(4) { data/*.o(script_data); - } =0 + } > ROM =0 lib_text : ALIGN(4) @@ -82,7 +76,7 @@ SECTIONS { *libc.a:*.o(.text*); *libnosys.a:*.o(.text*); src/libisagbprn.o(.text); - } =0 + } > ROM =0 .rodata : ALIGN(4) @@ -90,13 +84,13 @@ SECTIONS { src/*.o(.rodata*); gflib/*.o(.rodata*); data/*.o(.rodata*); - } =0 + } > ROM =0 song_data : ALIGN(4) { sound/songs/*.o(.rodata); - } =0 + } > ROM =0 lib_rodata : SUBALIGN(4) @@ -121,19 +115,19 @@ SECTIONS { data/multiboot_ereader.o(.rodata); data/multiboot_berry_glitch_fix.o(.rodata); data/multiboot_pokemon_colosseum.o(.rodata); - } =0 + } > ROM =0 anim_mon_front_pic_data : ALIGN(4) { src/anim_mon_front_pics.o(.rodata); - } =0 + } > ROM =0 gfx_data : ALIGN(4) { src/graphics.o(.rodata); - } =0 + } > ROM =0 /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning diff --git a/src/AgbRfu_LinkManager.c b/src/AgbRfu_LinkManager.c index 747a6c7849..e4ee377f7b 100644 --- a/src/AgbRfu_LinkManager.c +++ b/src/AgbRfu_LinkManager.c @@ -229,7 +229,7 @@ u8 rfu_LMAN_CHILD_connectParent(u16 parentId, u16 connect_period) return 0; } -static void rfu_LMAN_PARENT_stopWaitLinkRecoveryAndDisconnect(u8 bm_targetSlot) +static void UNUSED rfu_LMAN_PARENT_stopWaitLinkRecoveryAndDisconnect(u8 bm_targetSlot) { u8 i; @@ -1295,7 +1295,7 @@ void rfu_LMAN_setMSCCallback(void (*MSC_callback_p)(u16)) rfu_setMSCCallback(rfu_LMAN_MSC_callback); } -static void rfu_LMAN_setLMANCallback(void (*func)(u8, u8)) +static void UNUSED rfu_LMAN_setLMANCallback(void (*func)(u8, u8)) { lman.LMAN_callback = func; } @@ -1315,7 +1315,7 @@ u8 rfu_LMAN_setLinkRecovery(u8 enable_flag, u16 recovery_period) return 0; } -static u8 rfu_LMAN_setNIFailCounterLimit(u16 NI_failCounter_limit) +static u8 UNUSED rfu_LMAN_setNIFailCounterLimit(u16 NI_failCounter_limit) { if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag) { @@ -1327,7 +1327,7 @@ static u8 rfu_LMAN_setNIFailCounterLimit(u16 NI_failCounter_limit) return 0; } -static u8 rfu_LMAN_setFastSearchParent(u8 enable_flag) +static u8 UNUSED rfu_LMAN_setFastSearchParent(u8 enable_flag) { if (lman.state == LMAN_STATE_START_SEARCH_PARENT || lman.state == LMAN_STATE_POLL_SEARCH_PARENT || lman.state == LMAN_STATE_END_SEARCH_PARENT) { diff --git a/src/anim_mon_front_pics.c b/src/anim_mon_front_pics.c index e36cf3492d..de70146078 100644 --- a/src/anim_mon_front_pics.c +++ b/src/anim_mon_front_pics.c @@ -123,7 +123,7 @@ const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/anim_fro const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp.lz"); const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp.lz"); const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp.lz"); -const u32 gMonFrontPic_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/anim_front.4bpp.lz"); +const u32 gMonFrontPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/anim_front.4bpp.lz"); const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp.lz"); const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp.lz"); const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp.lz"); diff --git a/src/apprentice.c b/src/apprentice.c index 89017de33a..2280412fe7 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -346,11 +346,10 @@ static u16 GetRandomAlternateMove(u8 monId) learnset = gLevelUpLearnsets[species]; j = 0; - // Despite being open level, level up moves are only read up to level 60 if (PLAYER_APPRENTICE.lvlMode == APPRENTICE_LVL_MODE_50) - level = 50; + level = FRONTIER_MAX_LEVEL_50; else // == APPRENTICE_LVL_MODE_OPEN - level = 60; + level = 60; // Despite being open level, level up moves are only read up to level 60 for (j = 0; learnset[j] != LEVEL_UP_END; j++) { @@ -464,7 +463,7 @@ static void GetLatestLearnedMoves(u16 species, u16 *moves) const u16 *learnset; if (PLAYER_APPRENTICE.lvlMode == APPRENTICE_LVL_MODE_50) - level = 50; + level = FRONTIER_MAX_LEVEL_50; else // == APPRENTICE_LVL_MODE_OPEN level = 60; @@ -624,6 +623,9 @@ static void CreateApprenticeMenu(u8 menu) default: left = 0; top = 0; +#ifdef UBFIX + return; +#endif break; } @@ -666,11 +668,12 @@ static void Task_ChooseAnswer(u8 taskId) case MENU_NOTHING_CHOSEN: return; case MENU_B_PRESSED: + // Only ever true. Answering Apprentice questions is required. if (tNoBButton) return; PlaySE(SE_SELECT); - gSpecialVar_Result = 0x7F; + gSpecialVar_Result = MULTI_B_PRESSED; break; default: gSpecialVar_Result = input; @@ -1278,8 +1281,7 @@ const u8 *GetApprenticeNameInLanguage(u32 apprenticeId, s32 language) } } -// Functionally unused -static void Task_SwitchToFollowupFuncAfterButtonPress(u8 taskId) +static void UNUSED Task_SwitchToFollowupFuncAfterButtonPress(u8 taskId) { if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) SwitchTaskToFollowupFunc(taskId); @@ -1302,8 +1304,7 @@ static void ExecuteFuncAfterButtonPress(void (*func)(void)) gTasks[taskId].data[1] = (u32)(func) >> 16; } -// Unused -static void ExecuteFollowupFuncAfterButtonPress(TaskFunc task) +static void UNUSED ExecuteFollowupFuncAfterButtonPress(TaskFunc task) { u8 taskId = CreateTask(Task_SwitchToFollowupFuncAfterButtonPress, 1); SetTaskFuncWithFollowupFunc(taskId, Task_SwitchToFollowupFuncAfterButtonPress, task); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 2152be374a..4cb4c51654 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -13,16 +13,13 @@ #include "constants/abilities.h" #include "constants/battle_ai.h" #include "constants/battle_move_effects.h" +#include "constants/items.h" #include "constants/moves.h" -#define AI_ACTION_DONE 0x0001 -#define AI_ACTION_FLEE 0x0002 -#define AI_ACTION_WATCH 0x0004 -#define AI_ACTION_DO_NOT_ATTACK 0x0008 -#define AI_ACTION_UNK5 0x0010 -#define AI_ACTION_UNK6 0x0020 -#define AI_ACTION_UNK7 0x0040 -#define AI_ACTION_UNK8 0x0080 +#define AI_ACTION_DONE (1 << 0) +#define AI_ACTION_FLEE (1 << 1) +#define AI_ACTION_WATCH (1 << 2) +#define AI_ACTION_DO_NOT_ATTACK (1 << 3) #define AI_THINKING_STRUCT ((struct AI_ThinkingStruct *)(gBattleResources->ai)) #define BATTLE_HISTORY ((struct BattleHistory *)(gBattleResources->battleHistory)) @@ -283,7 +280,6 @@ static const u16 sIgnoredPowerfulMoveEffects[] = IGNORED_MOVES_END }; -// code void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves) { s32 i; @@ -302,7 +298,7 @@ void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves) { for (i = 0; i < MAX_TRAINER_ITEMS; i++) { - if (gTrainers[gTrainerBattleOpponent_A].items[i] != 0) + if (gTrainers[gTrainerBattleOpponent_A].items[i] != ITEM_NONE) { BATTLE_HISTORY->trainerItems[BATTLE_HISTORY->itemsNo] = gTrainers[gTrainerBattleOpponent_A].items[i]; BATTLE_HISTORY->itemsNo++; @@ -482,9 +478,9 @@ static u8 ChooseMoveOrAction_Doubles(void) else { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) - BattleAI_SetupAIData(gBattleStruct->palaceFlags >> 4); + BattleAI_SetupAIData(gBattleStruct->palaceFlags >> MAX_BATTLERS_COUNT); else - BattleAI_SetupAIData((1 << MAX_MON_MOVES) - 1); + BattleAI_SetupAIData(ALL_MOVES_MASK); gBattlerTarget = i; @@ -1396,7 +1392,7 @@ static void Cmd_get_ability(void) } else { - AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1]; // AI can't actually reach this part since no pokemon has ability 2 and no ability 1. + AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1]; // AI can't actually reach this part since no Pokémon has ability 2 and no ability 1. } } else @@ -1449,7 +1445,7 @@ static void Cmd_check_ability(void) } else { - ability = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1]; // AI can't actually reach this part since no pokemon has ability 2 and no ability 1. + ability = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1]; // AI can't actually reach this part since no Pokémon has ability 2 and no ability 1. } } else @@ -1461,9 +1457,9 @@ static void Cmd_check_ability(void) if (ability == 0) AI_THINKING_STRUCT->funcResult = 2; // Unable to answer. else if (ability == gAIScriptPtr[2]) - AI_THINKING_STRUCT->funcResult = 1; // Pokemon has the ability we wanted to check. + AI_THINKING_STRUCT->funcResult = 1; // Pokémon has the ability we wanted to check. else - AI_THINKING_STRUCT->funcResult = 0; // Pokemon doesn't have the ability we wanted to check. + AI_THINKING_STRUCT->funcResult = 0; // Pokémon doesn't have the ability we wanted to check. gAIScriptPtr += 3; } @@ -1488,7 +1484,13 @@ static void Cmd_get_highest_type_effectiveness(void) if (gCurrentMove != MOVE_NONE) { + // TypeCalc does not assign to gMoveResultFlags, Cmd_typecalc does + // This makes the check for gMoveResultFlags below always fail +#ifdef BUGFIX + gMoveResultFlags = TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); +#else TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); +#endif if (gBattleMoveDamage == 120) // Super effective STAB. gBattleMoveDamage = AI_EFFECTIVENESS_x2; @@ -1523,7 +1525,16 @@ static void Cmd_if_type_effectiveness(void) gBattleMoveDamage = AI_EFFECTIVENESS_x1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; + // TypeCalc does not assign to gMoveResultFlags, Cmd_typecalc does + // This makes the check for gMoveResultFlags below always fail + // This is how you get the "dual non-immunity" glitch, where AI + // will use ineffective moves on immune pokémon if the second type + // has a non-neutral, non-immune effectiveness +#ifdef BUGFIX + gMoveResultFlags = TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); +#else TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); +#endif if (gBattleMoveDamage == 120) // Super effective STAB. gBattleMoveDamage = AI_EFFECTIVENESS_x2; @@ -2256,7 +2267,7 @@ static void AIStackPushVar(const u8 *var) gBattleResources->AI_ScriptsStack->ptr[gBattleResources->AI_ScriptsStack->size++] = var; } -static void AIStackPushVar_cursor(void) +static void UNUSED AIStackPushVar_cursor(void) { gBattleResources->AI_ScriptsStack->ptr[gBattleResources->AI_ScriptsStack->size++] = gAIScriptPtr; } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 5789a3ff6f..5ef15b627a 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -51,7 +51,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) if (gBattleMons[GetBattlerAtPosition(opposingPosition)].ability != ABILITY_WONDER_GUARD) return FALSE; - // Check if Pokemon has a super effective move. + // Check if Pokémon has a super effective move. for (opposingBattler = GetBattlerAtPosition(opposingPosition), i = 0; i < MAX_MON_MOVES; i++) { move = gBattleMons[gActiveBattler].moves[i]; @@ -81,7 +81,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) else party = gEnemyParty; - // Find a Pokemon in the party that has a super effective move. + // Find a Pokémon in the party that has a super effective move. for (i = firstId; i < lastId; i++) { if (GetMonData(&party[i], MON_DATA_HP) == 0) @@ -113,7 +113,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) } } - return FALSE; // There is not a single Pokemon in the party that has a super effective move against a mon with Wonder Guard. + return FALSE; // There is not a single Pokémon in the party that has a super effective move against a mon with Wonder Guard. } static bool8 FindMonThatAbsorbsOpponentsMove(void) @@ -687,7 +687,7 @@ u8 GetMostSuitableMonToSwitchInto(void) invalidMons = 0; - while (invalidMons != 0x3F) // All mons are invalid. + while (invalidMons != (1 << PARTY_SIZE) - 1) // All mons are invalid. { bestDmg = TYPE_MUL_NO_EFFECT; bestMonId = PARTY_SIZE; @@ -741,7 +741,7 @@ u8 GetMostSuitableMonToSwitchInto(void) } else { - invalidMons = 0x3F; // No viable mon to switch. + invalidMons = (1 << PARTY_SIZE) - 1; // No viable mon to switch. } } @@ -862,7 +862,7 @@ static bool8 ShouldUseItem(void) shouldUse = TRUE; break; case AI_ITEM_HEAL_HP: - paramOffset = GetItemEffectParamOffset(item, 4, 4); + paramOffset = GetItemEffectParamOffset(item, 4, ITEM4_HEAL_HP); if (paramOffset == 0) break; if (gBattleMons[gActiveBattler].hp == 0) @@ -935,7 +935,7 @@ static bool8 ShouldUseItem(void) { BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_ITEM, 0); *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2) = item; - gBattleResources->battleHistory->trainerItems[i] = 0; + gBattleResources->battleHistory->trainerItems[i] = ITEM_NONE; return shouldUse; } } diff --git a/src/battle_anim.c b/src/battle_anim.c index 2f5d515c02..e6e049c370 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -824,27 +824,15 @@ static void Task_UpdateMonBg(u8 taskId) if (!gTasks[taskId].t2_InBg2) { - u16 *src; - u16 *dst; - gBattle_BG1_X = x + gTasks[taskId].t2_BgX; gBattle_BG1_Y = y + gTasks[taskId].t2_BgY; - - src = &gPlttBufferFaded[0x100 + battlerId * 16]; - dst = &gPlttBufferFaded[0x100 + animBg.paletteId * 16 - 256]; - CpuCopy32(src, dst, 32); + CpuCopy32(&gPlttBufferFaded[OBJ_PLTT_ID(battlerId)], &gPlttBufferFaded[BG_PLTT_ID(animBg.paletteId)], PLTT_SIZE_4BPP); } else { - u16 *src; - u16 *dst; - gBattle_BG2_X = x + gTasks[taskId].t2_BgX; gBattle_BG2_Y = y + gTasks[taskId].t2_BgY; - - src = &gPlttBufferFaded[0x100 + battlerId * 16]; - dst = &gPlttBufferFaded[0x100 - 112]; - CpuCopy32(src, dst, 32); + CpuCopy32(&gPlttBufferFaded[OBJ_PLTT_ID(battlerId)], &gPlttBufferFaded[BG_PLTT_ID(9)], PLTT_SIZE_4BPP); } } diff --git a/src/battle_anim_bug.c b/src/battle_anim_bug.c index 377665684a..a5875a376f 100644 --- a/src/battle_anim_bug.c +++ b/src/battle_anim_bug.c @@ -443,7 +443,7 @@ static void AnimMissileArc_Step(struct Sprite *sprite) else { s16 tempData[8]; - u16 *data = sprite->data; + s16 *data = sprite->data; u16 x1 = sprite->x; s16 x2 = sprite->x2; u16 y1 = sprite->y; diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 0ee894085e..3a558969b5 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -1045,10 +1045,10 @@ const struct SpriteTemplate gSilverWindSmallSparkSpriteTemplate = const u16 gMagicalLeafBlendColors[] = { - RGB(31, 0, 0), + RGB_RED, RGB(31, 19, 0), - RGB(31, 31, 0), - RGB(0, 31, 0), + RGB_YELLOW, + RGB_GREEN, RGB(5, 14, 31), RGB(22, 10, 31), RGB(22, 21, 31), @@ -1971,10 +1971,10 @@ const struct SpriteTemplate gWavyMusicNotesSpriteTemplate = const u16 gParticlesColorBlendTable[][6] = { - {ANIM_TAG_MUSIC_NOTES, RGB(31, 31, 31), RGB(31, 26, 28), RGB(31, 22, 26), RGB(31, 17, 24), RGB(31, 13, 22)}, - {ANIM_TAG_BENT_SPOON, RGB(31, 31, 31), RGB(25, 31, 26), RGB(20, 31, 21), RGB(15, 31, 16), RGB(10, 31, 12)}, - {ANIM_TAG_SPHERE_TO_CUBE, RGB(31, 31, 31), RGB(31, 31, 24), RGB(31, 31, 17), RGB(31, 31, 10), RGB(31, 31, 3)}, - {ANIM_TAG_LARGE_FRESH_EGG, RGB(31, 31, 31), RGB(26, 28, 31), RGB(21, 26, 31), RGB(16, 24, 31), RGB(12, 22, 31)}, + {ANIM_TAG_MUSIC_NOTES, RGB_WHITE, RGB(31, 26, 28), RGB(31, 22, 26), RGB(31, 17, 24), RGB(31, 13, 22)}, + {ANIM_TAG_BENT_SPOON, RGB_WHITE, RGB(25, 31, 26), RGB(20, 31, 21), RGB(15, 31, 16), RGB(10, 31, 12)}, + {ANIM_TAG_SPHERE_TO_CUBE, RGB_WHITE, RGB(31, 31, 24), RGB(31, 31, 17), RGB(31, 31, 10), RGB(31, 31, 3)}, + {ANIM_TAG_LARGE_FRESH_EGG, RGB_WHITE, RGB(26, 28, 31), RGB(21, 26, 31), RGB(16, 24, 31), RGB(12, 22, 31)}, }; const struct SpriteTemplate gFastFlyingMusicNotesSpriteTemplate = @@ -2765,7 +2765,7 @@ static void AnimConstrictBinding(struct Sprite *sprite) static void AnimConstrictBinding_Step1(struct Sprite *sprite) { - u8 spriteId; + u8 UNUSED spriteId; if ((u16)gBattleAnimArgs[7] == 0xFFFF) { @@ -2778,7 +2778,7 @@ static void AnimConstrictBinding_Step1(struct Sprite *sprite) static void AnimConstrictBinding_Step2(struct Sprite *sprite) { - u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); + u8 UNUSED spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); if (!sprite->data[2]) sprite->data[0] += 11; else @@ -3578,13 +3578,13 @@ static void AnimFlyingParticle(struct Sprite *sprite) { sprite->data[4] = 0; sprite->data[2] = gBattleAnimArgs[3]; - sprite->x = 0xFFF0; + sprite->x = -16; } else { sprite->data[4] = 1; sprite->data[2] = -gBattleAnimArgs[3]; - sprite->x = 0x100; + sprite->x = DISPLAY_WIDTH + 16; } sprite->data[1] = gBattleAnimArgs[1]; @@ -3623,7 +3623,7 @@ static void AnimFlyingParticle_Step(struct Sprite *sprite) sprite->data[0] = (sprite->data[3] * a) & 0xFF; if (!sprite->data[4]) { - if (sprite->x2 + sprite->x <= 0xF7) + if (sprite->x2 + sprite->x < DISPLAY_WIDTH + 8) return; } else @@ -3884,7 +3884,7 @@ static void AnimSlice_Step(struct Sprite *sprite) } } -static void UnusedFlickerAnim(struct Sprite *sprite) +static void UNUSED UnusedFlickerAnim(struct Sprite *sprite) { if (sprite->data[2] > 1) { @@ -3963,7 +3963,7 @@ static void AnimProtect(struct Sprite *sprite) sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[2] = (IndexOfSpritePaletteTag(ANIM_TAG_PROTECT) << 4) + 0x100; + sprite->data[2] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_PROTECT)); sprite->data[7] = 16; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7])); @@ -4343,7 +4343,7 @@ static void AnimLockOnTarget_Step4(struct Sprite *sprite) sprite->data[1] = 0; } - BlendPalettes(GetBattlePalettesMask(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE), sprite->data[1], RGB(31, 31, 31)); + BlendPalettes(GetBattlePalettesMask(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE), sprite->data[1], RGB_WHITE); if (sprite->data[1] == 16) { int pal; @@ -4734,7 +4734,7 @@ static void AnimFalseSwipeSlice(struct Sprite *sprite) static void AnimFalseSwipePositionedSlice(struct Sprite *sprite) { - sprite->x = sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + 0xFFD0 + gBattleAnimArgs[0]; + sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) - 48 + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); StartSpriteAnim(sprite, 1); sprite->data[0] = 0; @@ -4917,8 +4917,7 @@ void AnimTask_Conversion2AlphaBlend(u8 taskId) } } -// Unused -static void AnimTask_HideBattlersHealthbox(u8 taskId) +static void UNUSED AnimTask_HideBattlersHealthbox(u8 taskId) { u8 i; for (i = 0; i < gBattlersCount; i++) @@ -4933,8 +4932,7 @@ static void AnimTask_HideBattlersHealthbox(u8 taskId) DestroyAnimVisualTask(taskId); } -// Unused -static void AnimTask_ShowBattlersHealthbox(u8 taskId) +static void UNUSED AnimTask_ShowBattlersHealthbox(u8 taskId) { u8 i; for (i = 0; i < gBattlersCount; i++) @@ -5178,7 +5176,7 @@ void AnimTask_DoubleTeam(u8 taskId) for (i = 1; i < 16; i++) gPlttBufferUnfaded[r3 + i] = gPlttBufferUnfaded[r4 + i]; - BlendPalette(r3, 16, 11, RGB(0, 0, 0)); + BlendPalette(r3, 16, 11, RGB_BLACK); task->data[3] = 0; i = 0; while (i < 2 && (obj = CloneBattlerSpriteWithBlend(0)) >= 0) @@ -5251,7 +5249,7 @@ void AnimTask_MusicNotesRainbowBlend(u8 taskId) index = IndexOfSpritePaletteTag(gParticlesColorBlendTable[0][0]); if (index != 0xFF) { - index = (index << 4) + 0x100; + index = OBJ_PLTT_ID(index); for (i = 1; i < ARRAY_COUNT(gParticlesColorBlendTable[0]); i++) gPlttBufferFaded[index + i] = gParticlesColorBlendTable[0][i]; } @@ -5261,7 +5259,7 @@ void AnimTask_MusicNotesRainbowBlend(u8 taskId) index = AllocSpritePalette(gParticlesColorBlendTable[j][0]); if (index != 0xFF) { - index = (index << 4) + 0x100; + index = OBJ_PLTT_ID(index); for (i = 1; i < ARRAY_COUNT(gParticlesColorBlendTable[0]); i++) gPlttBufferFaded[index + i] = gParticlesColorBlendTable[j][i]; } diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c old mode 100755 new mode 100644 index 13cfc1b4ea..3d2e72cacb --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -1751,7 +1751,7 @@ void AnimTask_AirCutterProjectile(u8 taskId) static void AnimVoidLines(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, FALSE); - sprite->data[0] = 0x100 + (IndexOfSpritePaletteTag(sVoidLinesSpriteTemplate.paletteTag) << 4); + sprite->data[0] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(sVoidLinesSpriteTemplate.paletteTag)); sprite->callback = AnimVoidLines_Step; } @@ -2551,8 +2551,8 @@ static void AnimPencil_Step(struct Sprite *sprite) static void AnimBlendThinRing(struct Sprite *sprite) { u8 battler = 0; - u16 sp0 = 0; - u16 sp1 = 0; + s16 x = 0; + s16 y = 0; u8 r4; if (gBattleAnimArgs[2] == 0) @@ -2563,16 +2563,16 @@ static void AnimBlendThinRing(struct Sprite *sprite) r4 = gBattleAnimArgs[3] ^ 1; if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler))) { - SetAverageBattlerPositions(battler, r4, &sp0, &sp1); + SetAverageBattlerPositions(battler, r4, &x, &y); if (r4 == 0) r4 = GetBattlerSpriteCoord(battler, BATTLER_COORD_X); else r4 = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2); if (GetBattlerSide(battler) != B_SIDE_PLAYER) - gBattleAnimArgs[0] -= (sp0 - r4) - gBattleAnimArgs[0]; // This is weird. + gBattleAnimArgs[0] -= (x - r4) - gBattleAnimArgs[0]; // This is weird. else - gBattleAnimArgs[0] = sp0 - r4; + gBattleAnimArgs[0] = x - r4; } sprite->callback = AnimSpriteOnMonPos; @@ -3114,7 +3114,7 @@ static void AnimTask_FakeOut_Step2(u8 taskId) { gTasks[taskId].data[11] = 0x88; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_LIGHTEN); - BlendPalettes(GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), 16, RGB(31, 31, 31)); + BlendPalettes(GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), 16, RGB_WHITE); } else if (gTasks[taskId].data[10] > 4) { @@ -3673,7 +3673,6 @@ static void AnimTask_UproarDistortion_Step(u8 taskId) static void AnimJaggedMusicNote(struct Sprite *sprite) { - int var1; u8 battler = !gBattleAnimArgs[0] ? gBattleAnimAttacker : gBattleAnimTarget; if (GetBattlerSide(battler) == B_SIDE_OPPONENT) @@ -3684,16 +3683,8 @@ static void AnimJaggedMusicNote(struct Sprite *sprite) sprite->data[0] = 0; sprite->data[1] = (u16)sprite->x << 3; sprite->data[2] = (u16)sprite->y << 3; - - var1 = gBattleAnimArgs[1] << 3; - if (var1 < 0) - var1 += 7; - sprite->data[3] = var1 >> 3; - - var1 = gBattleAnimArgs[2] << 3; - if (var1 < 0) - var1 += 7; - sprite->data[4] = var1 >> 3; + sprite->data[3] = (gBattleAnimArgs[1] << 3) / 8; + sprite->data[4] = (gBattleAnimArgs[2] << 3) / 8; sprite->oam.tileNum += gBattleAnimArgs[3] * 16; sprite->callback = AnimJaggedMusicNote_Step; diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index ca0beabd32..6b169c5430 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -1383,11 +1383,11 @@ static void SetPsychicBackground_Step(u8 taskId) if (++gTasks[taskId].data[5] == 4) { - lastColor = gPlttBufferFaded[paletteIndex * 16 + 11]; + lastColor = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 11]; for (i = 10; i > 0; i--) - gPlttBufferFaded[paletteIndex * 16 + i + 1] = gPlttBufferFaded[paletteIndex * 16 + i]; + gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i + 1] = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i]; - gPlttBufferFaded[paletteIndex * 16 + 1] = lastColor; + gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 1] = lastColor; gTasks[taskId].data[5] = 0; } @@ -1409,15 +1409,15 @@ static void FadeScreenToWhite_Step(u8 taskId) if (++gTasks[taskId].data[5] == 4) { - lastColor = gPlttBufferFaded[paletteIndex * 16 + 11]; + lastColor = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 11]; for (i = 10; i > 0; i--) - gPlttBufferFaded[paletteIndex * 16 + i + 1] = gPlttBufferFaded[paletteIndex * 16 + i]; - gPlttBufferFaded[paletteIndex * 16 + 1] = lastColor; + gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i + 1] = gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + i]; + gPlttBufferFaded[BG_PLTT_ID(paletteIndex) + 1] = lastColor; - lastColor = gPlttBufferUnfaded[paletteIndex * 16 + 11]; + lastColor = gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + 11]; for (i = 10; i > 0; i--) - gPlttBufferUnfaded[paletteIndex * 16 + i + 1] = gPlttBufferUnfaded[paletteIndex * 16 + i]; - gPlttBufferUnfaded[paletteIndex * 16 + 1] = lastColor; + gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + i + 1] = gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + i]; + gPlttBufferUnfaded[BG_PLTT_ID(paletteIndex) + 1] = lastColor; gTasks[taskId].data[5] = 0; } @@ -1428,8 +1428,7 @@ static void FadeScreenToWhite_Step(u8 taskId) static void AnimSpikes(struct Sprite *sprite) { - u16 x; - u16 y; + s16 x, y; InitSpritePosToAnimAttacker(sprite, TRUE); SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &x, &y); @@ -3056,7 +3055,7 @@ static void AnimFlatterConfetti(struct Sprite *sprite) if (sprite->data[2] == ANIM_ATTACKER) sprite->x = -8; else - sprite->x = 248; + sprite->x = DISPLAY_WIDTH + 8; sprite->y = 104; sprite->callback = AnimFlatterConfetti_Step; @@ -3414,8 +3413,8 @@ static void AnimTask_AcidArmor_Step(u8 taskId) var0 *= 2; while (var0 >= 0) { - gScanlineEffectRegBuffers[0][var0] = bgX + 240; - gScanlineEffectRegBuffers[1][var0] = bgX + 240; + gScanlineEffectRegBuffers[0][var0] = bgX + DISPLAY_WIDTH; + gScanlineEffectRegBuffers[1][var0] = bgX + DISPLAY_WIDTH; var0 -= 2; } @@ -3896,7 +3895,7 @@ static void AnimTask_FacadeColorBlend_Step(u8 taskId) } else { - BlendPalette(gTasks[taskId].data[2], 16, 0, RGB(0, 0, 0)); + BlendPalette(gTasks[taskId].data[2], 16, 0, RGB_BLACK); DestroyAnimVisualTask(taskId); } } @@ -4758,8 +4757,8 @@ static void AnimMeteorMashStar_Step(struct Sprite *sprite) // arg 4: duration static void AnimMeteorMashStar(struct Sprite *sprite) { - s16 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); // unused local variable - s16 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); // unused local variable + s16 UNUSED y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + s16 UNUSED x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER || IsContest()) { diff --git a/src/battle_anim_fight.c b/src/battle_anim_fight.c index 764a951ef8..cbefb41f1e 100644 --- a/src/battle_anim_fight.c +++ b/src/battle_anim_fight.c @@ -493,7 +493,7 @@ static void AnimFistOrFootRandomPos(struct Sprite *sprite) y *= -1; if (GET_BATTLER_SIDE2(battler) == B_SIDE_PLAYER) - y += 0xFFF0; + y -= 16; sprite->x += x; sprite->y += y; diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index 746e3bdd73..c5e59a65af 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -388,17 +388,17 @@ static void AnimTask_AnimateGustTornadoPalette_Step(u8 taskId) { gTasks[taskId].data[10] = 0; data2 = gTasks[taskId].data[2]; - temp = gPlttBufferFaded[16 * data2 + 0x108]; + temp = gPlttBufferFaded[OBJ_PLTT_ID(data2) + 8]; i = 7; - base = data2 * 16; + base = PLTT_ID(data2); do { - gPlttBufferFaded[base + 0x101 + i] = gPlttBufferFaded[base + 0x100 + i]; + gPlttBufferFaded[base + OBJ_PLTT_OFFSET + 1 + i] = gPlttBufferFaded[base + OBJ_PLTT_OFFSET + i]; i--; } while (i > 0); - gPlttBufferFaded[base + 0x101] = temp; + gPlttBufferFaded[base + OBJ_PLTT_OFFSET + 1] = temp; } if (--gTasks[taskId].data[0] == 0) @@ -1220,8 +1220,7 @@ void AnimSkyAttackBird_Step(struct Sprite *sprite) DestroySpriteAndMatrix(sprite); } -// Unused -static void AnimTask_SetAttackerVisibility(u8 taskId) +static void UNUSED AnimTask_SetAttackerVisibility(u8 taskId) { if (gBattleAnimArgs[0] == 0) { diff --git a/src/battle_anim_ghost.c b/src/battle_anim_ghost.c index 9b74fdada3..d6afd4c304 100644 --- a/src/battle_anim_ghost.c +++ b/src/battle_anim_ghost.c @@ -627,12 +627,14 @@ static void AnimTask_SpiteTargetShadow_Step1(u8 taskId) task->data[2] = 0; task->data[3] = 16; task->data[13] = GetAnimBattlerSpriteId(ANIM_TARGET); - task->data[4] = (gSprites[task->data[13]].oam.paletteNum + 16) * 16; - if (position == 1) { + task->data[4] = OBJ_PLTT_ID2(gSprites[task->data[13]].oam.paletteNum); + if (position == 1) + { u16 mask = DISPCNT_BG1_ON; mask2 = mask; } - else { + else + { u16 mask = DISPCNT_BG2_ON; mask2 = mask; } @@ -1005,7 +1007,7 @@ static void AnimTask_CurseStretchingBlackBg_Step1(u8 taskId) top = 0; bottom = 112; selectedPalettes = GetBattlePalettesMask(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE); - BeginNormalPaletteFade(selectedPalettes, 0, 16, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(selectedPalettes, 0, 16, 16, RGB_BLACK); gTasks[taskId].func = AnimTask_CurseStretchingBlackBg_Step2; } diff --git a/src/battle_anim_ground.c b/src/battle_anim_ground.c index 7b810b56c2..d6d8137bcd 100644 --- a/src/battle_anim_ground.c +++ b/src/battle_anim_ground.c @@ -481,10 +481,10 @@ static void SetDigScanlineEffect(u8 useBG1, s16 y, s16 endY) y++; } - while (y < 160) + while (y < DISPLAY_HEIGHT) { - gScanlineEffectRegBuffers[0][y] = bgX + 240; - gScanlineEffectRegBuffers[1][y] = bgX + 240; + gScanlineEffectRegBuffers[0][y] = bgX + DISPLAY_WIDTH; + gScanlineEffectRegBuffers[1][y] = bgX + DISPLAY_WIDTH; y++; } diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index f870ff4f87..273721e162 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -1305,11 +1305,11 @@ static void MovePoisonGasCloud(struct Sprite *sprite) sprite->data[3] = sprite->y += sprite->y2; sprite->data[4] = sprite->y + 4; if (IsContest()) - sprite->data[2] = -0x10; + sprite->data[2] = -16; else if (GET_BATTLER_SIDE2(gBattleAnimTarget) != B_SIDE_PLAYER) - sprite->data[2] = 0x100; + sprite->data[2] = DISPLAY_WIDTH + 16; else - sprite->data[2] = -0x10; + sprite->data[2] = -16; sprite->data[7]++; sprite->x2 = sprite->y2 = 0; diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index 247aba1a42..4c8e79cb9f 100644 --- a/src/battle_anim_mon_movement.c +++ b/src/battle_anim_mon_movement.c @@ -535,7 +535,7 @@ static void SlideMonToOriginalPos_Step(struct Sprite *sprite) } // Linearly translates a mon to a target offset. The horizontal offset -// is mirrored for the opponent's pokemon, and the vertical offset +// is mirrored for the opponent's Pokémon, and the vertical offset // is only mirrored if arg 3 is set to 1. // arg 0: 0 = attacker, 1 = target // arg 1: target x pixel offset diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index ac38c5e474..d28ec804fe 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -77,7 +77,7 @@ static const u8 sCastformBackSpriteYCoords[NUM_CASTFORM_FORMS] = [CASTFORM_ICE] = 0, }; -// Placeholders for pokemon sprites to be created for a move animation effect (e.g. Role Play / Snatch) +// Placeholders for Pokémon sprites to be created for a move animation effect (e.g. Role Play / Snatch) #define TAG_MOVE_EFFECT_MON_1 55125 #define TAG_MOVE_EFFECT_MON_2 55126 @@ -485,9 +485,8 @@ void TranslateSpriteInGrowingCircle(struct Sprite *sprite) } } -// Unused // Exact shape depends on arguments. Can move in a figure-8-like pattern, or circular, etc. -static void TranslateSpriteInLissajousCurve(struct Sprite *sprite) +static void UNUSED TranslateSpriteInLissajousCurve(struct Sprite *sprite) { if (sprite->sDuration) { @@ -639,8 +638,7 @@ static void TranslateSpriteLinearFixedPointIconFrame(struct Sprite *sprite) UpdateMonIconFrame(sprite); } -// Unused -static void TranslateSpriteToBattleTargetPos(struct Sprite *sprite) +static void UNUSED TranslateSpriteToBattleTargetPos(struct Sprite *sprite) { sprite->sStartX = sprite->x + sprite->x2; sprite->sStartY = sprite->y + sprite->y2; @@ -707,8 +705,7 @@ void DestroySpriteAndMatrix(struct Sprite *sprite) DestroyAnimSprite(sprite); } -// Unused -static void TranslateSpriteToBattleAttackerPos(struct Sprite *sprite) +static void UNUSED TranslateSpriteToBattleAttackerPos(struct Sprite *sprite) { sprite->sStartX = sprite->x + sprite->x2; sprite->sStartY = sprite->y + sprite->y2; @@ -723,8 +720,7 @@ static void TranslateSpriteToBattleAttackerPos(struct Sprite *sprite) #undef sStartY #undef sTargetY -// Unused -static void EndUnkPaletteAnim(struct Sprite *sprite) +static void UNUSED EndUnkPaletteAnim(struct Sprite *sprite) { PaletteStruct_ResetById(sprite->data[5]); DestroySpriteAndMatrix(sprite); @@ -1103,8 +1099,7 @@ void StartAnimLinearTranslation(struct Sprite *sprite) sprite->callback(sprite); } -// Unused -static void StartAnimLinearTranslation_SetCornerVecX(struct Sprite *sprite) +static void UNUSED StartAnimLinearTranslation_SetCornerVecX(struct Sprite *sprite) { sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; @@ -1382,18 +1377,17 @@ void SetGrayscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor) struct PlttData *originalColor; struct PlttData *destColor; u16 average; - - paletteNum *= 16; + u16 paletteOffset = PLTT_ID(paletteNum); if (!restoreOriginalColor) { for (i = 0; i < 16; i++) { - originalColor = (struct PlttData *)&gPlttBufferUnfaded[paletteNum + i]; + originalColor = (struct PlttData *)&gPlttBufferUnfaded[paletteOffset + i]; average = originalColor->r + originalColor->g + originalColor->b; average /= 3; - destColor = (struct PlttData *)&gPlttBufferFaded[paletteNum + i]; + destColor = (struct PlttData *)&gPlttBufferFaded[paletteOffset + i]; destColor->r = average; destColor->g = average; destColor->b = average; @@ -1401,7 +1395,7 @@ void SetGrayscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor) } else { - CpuCopy32(&gPlttBufferUnfaded[paletteNum], &gPlttBufferFaded[paletteNum], 32); + CpuCopy32(&gPlttBufferUnfaded[paletteOffset], &gPlttBufferFaded[paletteOffset], PLTT_SIZE_4BPP); } } @@ -1513,8 +1507,7 @@ u8 GetSpritePalIdxByBattler(u8 battler) return battler; } -// Unused -static u8 GetSpritePalIdxByPosition(u8 position) +static u8 UNUSED GetSpritePalIdxByPosition(u8 position) { return GetBattlerAtPosition(position); } @@ -2013,8 +2006,7 @@ void AnimTask_GetFrustrationPowerLevel(u8 taskId) DestroyAnimVisualTask(taskId); } -// Unused -static void SetPriorityForVisibleBattlers(u8 priority) +static void UNUSED SetPriorityForVisibleBattlers(u8 priority) { if (IsBattlerSpriteVisible(gBattleAnimTarget)) gSprites[gBattlerSpriteIds[gBattleAnimTarget]].oam.priority = priority; @@ -2093,7 +2085,7 @@ u8 GetBattlerSpriteBGPriorityRank(u8 battlerId) return 1; } -// Create pokemon sprite to be used for a move animation effect (e.g. Role Play / Snatch) +// Create Pokémon sprite to be used for a move animation effect (e.g. Role Play / Snatch) u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 id, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, bool32 ignoreDeoxysForm) { u8 spriteId; diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c index 1c90a3d641..94bbb6ee4e 100644 --- a/src/battle_anim_normal.c +++ b/src/battle_anim_normal.c @@ -709,7 +709,7 @@ static void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId) if (!gPaletteFade.active) { selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16); - BeginNormalPaletteFade(selectedPalettes, 0, 0, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(selectedPalettes, 0, 0, 0, RGB_BLACK); DestroyAnimVisualTask(taskId); } } diff --git a/src/battle_anim_poison.c b/src/battle_anim_poison.c index d9a15c835c..bfe1fc835f 100644 --- a/src/battle_anim_poison.c +++ b/src/battle_anim_poison.c @@ -59,15 +59,7 @@ static const union AnimCmd sAnim_SludgeBombHit[] = static const union AnimCmd *const sAnims_PoisonProjectile[] = { sAnim_PoisonProjectile, -}; - -static const union AnimCmd *const sAnims_AcidPoisonDroplet[] = -{ sAnim_AcidPoisonDroplet, -}; - -static const union AnimCmd *const sAnims_SludgeBombHit[] = -{ sAnim_SludgeBombHit, }; @@ -122,7 +114,7 @@ const struct SpriteTemplate gSludgeBombHitParticleSpriteTemplate = .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, - .anims = sAnims_SludgeBombHit, + .anims = &sAnims_PoisonProjectile[2], .images = NULL, .affineAnims = sAffineAnims_SludgeBombHit, .callback = AnimSludgeBombHitParticle, @@ -145,7 +137,7 @@ const struct SpriteTemplate gAcidPoisonDropletSpriteTemplate = .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, - .anims = sAnims_AcidPoisonDroplet, + .anims = &sAnims_PoisonProjectile[1], .images = NULL, .affineAnims = gAffineAnims_Droplet, .callback = AnimAcidPoisonDroplet, diff --git a/src/battle_anim_psychic.c b/src/battle_anim_psychic.c index 978d14c4cd..f7bc6e31ae 100644 --- a/src/battle_anim_psychic.c +++ b/src/battle_anim_psychic.c @@ -468,7 +468,7 @@ static void AnimDefensiveWall(struct Sprite *sprite) sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; } - sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16; + sprite->data[0] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(gBattleAnimArgs[2])); if (isContest) { diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index f9253675ca..bb8c3aa2f6 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -558,7 +558,6 @@ void AnimTask_Rollout(u8 taskId) { u16 var0, var1, var2, var3; u8 rolloutCounter; - int var5; s16 pan1, pan2; struct Task *task; @@ -582,13 +581,7 @@ void AnimTask_Rollout(u8 taskId) task->data[11] = 0; task->data[9] = 0; task->data[12] = 1; - - var5 = task->data[8]; - if (var5 < 0) - var5 += 7; - - task->data[10] = (var5 >> 3) - 1; - + task->data[10] = (task->data[8] / 8) - 1; task->data[2] = var0 * 8; task->data[3] = var1 * 8; task->data[4] = ((var2 - var0) * 8) / task->data[8]; diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index 4e6b3a3402..cc04843b7f 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -270,8 +270,7 @@ static const struct SpriteTemplate sFlashingCircleImpactSpriteTemplate = .callback = AnimFlashingCircleImpact, }; -// Unused -static u8 Task_FlashingCircleImpacts(u8 battlerId, bool8 red) +static u8 UNUSED Task_FlashingCircleImpacts(u8 battlerId, bool8 red) { u8 battlerSpriteId = gBattlerSpriteIds[battlerId]; u8 taskId = CreateTask(Task_UpdateFlashingCircleImpacts, 10); @@ -424,10 +423,10 @@ static void AnimTask_FrozenIceCube_Step2(u8 taskId) { u16 temp; - temp = gPlttBufferFaded[0x100 + palIndex * 16 + 13]; - gPlttBufferFaded[0x100 + palIndex * 16 + 13] = gPlttBufferFaded[0x100 + palIndex * 16 + 14]; - gPlttBufferFaded[0x100 + palIndex * 16 + 14] = gPlttBufferFaded[0x100 + palIndex * 16 + 15]; - gPlttBufferFaded[0x100 + palIndex * 16 + 15] = temp; + temp = gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 13]; + gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 13] = gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 14]; + gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 14] = gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 15]; + gPlttBufferFaded[OBJ_PLTT_ID(palIndex) + 15] = temp; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3]++; @@ -480,8 +479,6 @@ static void AnimTask_FrozenIceCube_Step4(u8 taskId) } } -#define CASE(by, stat) case (STAT_ANIM_##by + stat - 1) - void AnimTask_StatsChange(u8 taskId) { bool16 goesDown = FALSE; @@ -490,42 +487,42 @@ void AnimTask_StatsChange(u8 taskId) switch (gBattleSpritesDataPtr->animationData->animArg) { - CASE(PLUS1, STAT_ATK): goesDown = FALSE; animStatId = 0; break; - CASE(PLUS1, STAT_DEF): goesDown = FALSE; animStatId = 1; break; - CASE(PLUS1, STAT_SPEED): goesDown = FALSE; animStatId = 3; break; - CASE(PLUS1, STAT_SPATK): goesDown = FALSE; animStatId = 5; break; - CASE(PLUS1, STAT_SPDEF): goesDown = FALSE; animStatId = 6; break; - CASE(PLUS1, STAT_ACC): goesDown = FALSE; animStatId = 2; break; - CASE(PLUS1, STAT_EVASION): goesDown = FALSE; animStatId = 4; break; + case STAT_ANIM_PLUS1 + STAT_ATK: goesDown = FALSE; animStatId = STAT_ANIM_PAL_ATK; break; + case STAT_ANIM_PLUS1 + STAT_DEF: goesDown = FALSE; animStatId = STAT_ANIM_PAL_DEF; break; + case STAT_ANIM_PLUS1 + STAT_SPEED: goesDown = FALSE; animStatId = STAT_ANIM_PAL_SPEED; break; + case STAT_ANIM_PLUS1 + STAT_SPATK: goesDown = FALSE; animStatId = STAT_ANIM_PAL_SPATK; break; + case STAT_ANIM_PLUS1 + STAT_SPDEF: goesDown = FALSE; animStatId = STAT_ANIM_PAL_SPDEF; break; + case STAT_ANIM_PLUS1 + STAT_ACC: goesDown = FALSE; animStatId = STAT_ANIM_PAL_ACC; break; + case STAT_ANIM_PLUS1 + STAT_EVASION: goesDown = FALSE; animStatId = STAT_ANIM_PAL_EVASION; break; - CASE(MINUS1, STAT_ATK): goesDown = TRUE; animStatId = 0; break; - CASE(MINUS1, STAT_DEF): goesDown = TRUE; animStatId = 1; break; - CASE(MINUS1, STAT_SPEED): goesDown = TRUE; animStatId = 3; break; - CASE(MINUS1, STAT_SPATK): goesDown = TRUE; animStatId = 5; break; - CASE(MINUS1, STAT_SPDEF): goesDown = TRUE; animStatId = 6; break; - CASE(MINUS1, STAT_ACC): goesDown = TRUE; animStatId = 2; break; - CASE(MINUS1, STAT_EVASION): goesDown = TRUE; animStatId = 4; break; + case STAT_ANIM_MINUS1 + STAT_ATK: goesDown = TRUE; animStatId = STAT_ANIM_PAL_ATK; break; + case STAT_ANIM_MINUS1 + STAT_DEF: goesDown = TRUE; animStatId = STAT_ANIM_PAL_DEF; break; + case STAT_ANIM_MINUS1 + STAT_SPEED: goesDown = TRUE; animStatId = STAT_ANIM_PAL_SPEED; break; + case STAT_ANIM_MINUS1 + STAT_SPATK: goesDown = TRUE; animStatId = STAT_ANIM_PAL_SPATK; break; + case STAT_ANIM_MINUS1 + STAT_SPDEF: goesDown = TRUE; animStatId = STAT_ANIM_PAL_SPDEF; break; + case STAT_ANIM_MINUS1 + STAT_ACC: goesDown = TRUE; animStatId = STAT_ANIM_PAL_ACC; break; + case STAT_ANIM_MINUS1 + STAT_EVASION: goesDown = TRUE; animStatId = STAT_ANIM_PAL_EVASION; break; - CASE(PLUS2, STAT_ATK): goesDown = FALSE; animStatId = 0; sharply = TRUE; break; - CASE(PLUS2, STAT_DEF): goesDown = FALSE; animStatId = 1; sharply = TRUE; break; - CASE(PLUS2, STAT_SPEED): goesDown = FALSE; animStatId = 3; sharply = TRUE; break; - CASE(PLUS2, STAT_SPATK): goesDown = FALSE; animStatId = 5; sharply = TRUE; break; - CASE(PLUS2, STAT_SPDEF): goesDown = FALSE; animStatId = 6; sharply = TRUE; break; - CASE(PLUS2, STAT_ACC): goesDown = FALSE; animStatId = 2; sharply = TRUE; break; - CASE(PLUS2, STAT_EVASION): goesDown = FALSE; animStatId = 4; sharply = TRUE; break; + case STAT_ANIM_PLUS2 + STAT_ATK: goesDown = FALSE; animStatId = STAT_ANIM_PAL_ATK; sharply = TRUE; break; + case STAT_ANIM_PLUS2 + STAT_DEF: goesDown = FALSE; animStatId = STAT_ANIM_PAL_DEF; sharply = TRUE; break; + case STAT_ANIM_PLUS2 + STAT_SPEED: goesDown = FALSE; animStatId = STAT_ANIM_PAL_SPEED; sharply = TRUE; break; + case STAT_ANIM_PLUS2 + STAT_SPATK: goesDown = FALSE; animStatId = STAT_ANIM_PAL_SPATK; sharply = TRUE; break; + case STAT_ANIM_PLUS2 + STAT_SPDEF: goesDown = FALSE; animStatId = STAT_ANIM_PAL_SPDEF; sharply = TRUE; break; + case STAT_ANIM_PLUS2 + STAT_ACC: goesDown = FALSE; animStatId = STAT_ANIM_PAL_ACC; sharply = TRUE; break; + case STAT_ANIM_PLUS2 + STAT_EVASION: goesDown = FALSE; animStatId = STAT_ANIM_PAL_EVASION; sharply = TRUE; break; - CASE(MINUS2, STAT_ATK): goesDown = TRUE; animStatId = 0; sharply = TRUE; break; - CASE(MINUS2, STAT_DEF): goesDown = TRUE; animStatId = 1; sharply = TRUE; break; - CASE(MINUS2, STAT_SPEED): goesDown = TRUE; animStatId = 3; sharply = TRUE; break; - CASE(MINUS2, STAT_SPATK): goesDown = TRUE; animStatId = 5; sharply = TRUE; break; - CASE(MINUS2, STAT_SPDEF): goesDown = TRUE; animStatId = 6; sharply = TRUE; break; - CASE(MINUS2, STAT_ACC): goesDown = TRUE; animStatId = 2; sharply = TRUE; break; - CASE(MINUS2, STAT_EVASION): goesDown = TRUE; animStatId = 4; sharply = TRUE; break; + case STAT_ANIM_MINUS2 + STAT_ATK: goesDown = TRUE; animStatId = STAT_ANIM_PAL_ATK; sharply = TRUE; break; + case STAT_ANIM_MINUS2 + STAT_DEF: goesDown = TRUE; animStatId = STAT_ANIM_PAL_DEF; sharply = TRUE; break; + case STAT_ANIM_MINUS2 + STAT_SPEED: goesDown = TRUE; animStatId = STAT_ANIM_PAL_SPEED; sharply = TRUE; break; + case STAT_ANIM_MINUS2 + STAT_SPATK: goesDown = TRUE; animStatId = STAT_ANIM_PAL_SPATK; sharply = TRUE; break; + case STAT_ANIM_MINUS2 + STAT_SPDEF: goesDown = TRUE; animStatId = STAT_ANIM_PAL_SPDEF; sharply = TRUE; break; + case STAT_ANIM_MINUS2 + STAT_ACC: goesDown = TRUE; animStatId = STAT_ANIM_PAL_ACC; sharply = TRUE; break; + case STAT_ANIM_MINUS2 + STAT_EVASION: goesDown = TRUE; animStatId = STAT_ANIM_PAL_EVASION; sharply = TRUE; break; - case STAT_ANIM_MULTIPLE_PLUS1: goesDown = FALSE; animStatId = 0xFF; sharply = FALSE; break; - case STAT_ANIM_MULTIPLE_PLUS2: goesDown = FALSE; animStatId = 0xFF; sharply = TRUE; break; - case STAT_ANIM_MULTIPLE_MINUS1: goesDown = TRUE; animStatId = 0xFF; sharply = FALSE; break; - case STAT_ANIM_MULTIPLE_MINUS2: goesDown = TRUE; animStatId = 0xFF; sharply = TRUE; break; + case STAT_ANIM_MULTIPLE_PLUS1: goesDown = FALSE; animStatId = STAT_ANIM_PAL_MULTIPLE; sharply = FALSE; break; + case STAT_ANIM_MULTIPLE_PLUS2: goesDown = FALSE; animStatId = STAT_ANIM_PAL_MULTIPLE; sharply = TRUE; break; + case STAT_ANIM_MULTIPLE_MINUS1: goesDown = TRUE; animStatId = STAT_ANIM_PAL_MULTIPLE; sharply = FALSE; break; + case STAT_ANIM_MULTIPLE_MINUS2: goesDown = TRUE; animStatId = STAT_ANIM_PAL_MULTIPLE; sharply = TRUE; break; default: DestroyAnimVisualTask(taskId); @@ -534,11 +531,11 @@ void AnimTask_StatsChange(u8 taskId) gBattleAnimArgs[0] = goesDown; gBattleAnimArgs[1] = animStatId; - gBattleAnimArgs[2] = 0; - gBattleAnimArgs[3] = 0; + gBattleAnimArgs[2] = FALSE; // Whether it's the target, rather than attacker + gBattleAnimArgs[3] = FALSE; // Whether it hits multiple battlers gBattleAnimArgs[4] = sharply; gTasks[taskId].func = InitStatsChangeAnimation; - InitStatsChangeAnimation(taskId); + gTasks[taskId].func(taskId); } #undef CASE diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index 7a7a423834..8296126f14 100755 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -384,7 +384,7 @@ const u16 gBallOpenFadeColors[] = [BALL_PREMIER] = RGB(31, 9, 10), // Garbage data - RGB(0, 0, 0), + RGB_BLACK, RGB(1, 16, 0), RGB(3, 0, 1), RGB(1, 8, 0), @@ -1309,12 +1309,12 @@ static void SpriteCB_Ball_Capture_Step(struct Sprite *sprite) if (sprite->sTimer == 40) { PlaySE(SE_RG_BALL_CLICK); - BlendPalettes(0x10000 << sprite->oam.paletteNum, 6, RGB(0, 0, 0)); + BlendPalettes(0x10000 << sprite->oam.paletteNum, 6, RGB_BLACK); MakeCaptureStars(sprite); } else if (sprite->sTimer == 60) { - BeginNormalPaletteFade(0x10000 << sprite->oam.paletteNum, 2, 6, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(0x10000 << sprite->oam.paletteNum, 2, 6, 0, RGB_BLACK); } else if (sprite->sTimer == 95) { @@ -1352,7 +1352,7 @@ static void SpriteCB_Ball_FadeOut(struct Sprite *sprite) SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); paletteIndex = IndexOfSpritePaletteTag(sprite->template->paletteTag); - BeginNormalPaletteFade(1 << (paletteIndex + 0x10), 0, 0, 16, RGB(31, 31, 31)); + BeginNormalPaletteFade(1 << (paletteIndex + 0x10), 0, 0, 16, RGB_WHITE); sprite->sState++; break; case 1: @@ -2041,7 +2041,7 @@ u8 LaunchBallFadeMonTask(bool8 unfadeLater, u8 spritePalNum, u32 selectedPalette gTasks[taskId].func = Task_FadeMon_ToNormal; } - BeginNormalPaletteFade(selectedPalettes, 0, 0, 16, RGB(31, 31, 31)); + BeginNormalPaletteFade(selectedPalettes, 0, 0, 16, RGB_WHITE); return taskId; } @@ -2117,7 +2117,7 @@ void AnimTask_SwapMonSpriteToFromSubstitute(u8 taskId) gTasks[taskId].data[0] &= 0xFF; x = gSprites[spriteId].x + gSprites[spriteId].x2 + 32; - if (x > 304) + if (x > DISPLAY_WIDTH + 64) gTasks[taskId].data[10]++; break; case 1: @@ -2386,11 +2386,11 @@ static void SpriteCB_ShinyStars_Diagonal(struct Sprite *sprite) void AnimTask_LoadPokeblockGfx(u8 taskId) { - u8 paletteIndex; + u8 UNUSED paletteIndex; LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[ANIM_TAG_POKEBLOCK - ANIM_SPRITES_START]); LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[ANIM_TAG_POKEBLOCK - ANIM_SPRITES_START]); - paletteIndex = IndexOfSpritePaletteTag(ANIM_TAG_POKEBLOCK); // unused + paletteIndex = IndexOfSpritePaletteTag(ANIM_TAG_POKEBLOCK); DestroyAnimVisualTask(taskId); } diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index d8e1e7baa3..18a599a4c1 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -16,7 +16,7 @@ struct AnimStatsChangeData { u8 battler1; u8 battler2; - u8 higherPriority; + bool8 hidBattler2; s16 data[8]; u16 species; }; @@ -69,6 +69,9 @@ void AnimTask_BlendBattleAnimPalExclude(u8 taskId) selectedPalettes = 0; // fall through case ANIM_ATTACKER: +#ifdef UBFIX + default: +#endif animBattlers[0] = gBattleAnimAttacker; break; case 3: @@ -133,10 +136,10 @@ void AnimTask_SetCamouflageBlend(u8 taskId) gBattleAnimArgs[4] = RGB(14, 9, 3); break; case BATTLE_TERRAIN_BUILDING: - gBattleAnimArgs[4] = RGB(31, 31, 31); + gBattleAnimArgs[4] = RGB_WHITE; break; case BATTLE_TERRAIN_PLAIN: - gBattleAnimArgs[4] = RGB(31, 31, 31); + gBattleAnimArgs[4] = RGB_WHITE; break; } @@ -388,12 +391,33 @@ static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId) } } +// Defines for data array in sAnimStatsChangeData +#define aDecrease data[0] +#define aAnimStatId data[1] +#define aIsTarget data[2] +#define aMultipleBattlers data[3] // Always false. Changes for multiple battlers are instead run sequentially. +#define aSharply data[4] + +// Task data defines for InitStatsChangeAnimation +#define tAnimSpriteId1 data[0] +#define tVelocity data[1] +#define tMultipleBattlers data[2] +#define tAnimSpriteId2 data[3] +#define tTargetBlend data[4] +#define tWaitTime data[5] +#define tHidBattler2 data[6] +#define tBattler2SpriteId data[7] +#define tWaitTimer data[10] +#define tFadeTimer data[11] +#define tBlend data[12] +#define tState data[15] + void InitStatsChangeAnimation(u8 taskId) { u8 i; sAnimStatsChangeData = AllocZeroed(sizeof(struct AnimStatsChangeData)); - for (i = 0; i < 8; i++) + for (i = 0; i < ARRAY_COUNT(sAnimStatsChangeData->data); i++) sAnimStatsChangeData->data[i] = gBattleAnimArgs[i]; gTasks[taskId].func = StatsChangeAnimation_Step1; @@ -401,21 +425,19 @@ void InitStatsChangeAnimation(u8 taskId) static void StatsChangeAnimation_Step1(u8 taskId) { - if (sAnimStatsChangeData->data[2] == 0) + if (!sAnimStatsChangeData->aIsTarget) sAnimStatsChangeData->battler1 = gBattleAnimAttacker; else sAnimStatsChangeData->battler1 = gBattleAnimTarget; sAnimStatsChangeData->battler2 = BATTLE_PARTNER(sAnimStatsChangeData->battler1); - if (IsContest() || (sAnimStatsChangeData->data[3] && !IsBattlerSpriteVisible(sAnimStatsChangeData->battler2))) - sAnimStatsChangeData->data[3] = 0; + if (IsContest() || (sAnimStatsChangeData->aMultipleBattlers && !IsBattlerSpriteVisible(sAnimStatsChangeData->battler2))) + sAnimStatsChangeData->aMultipleBattlers = FALSE; gBattle_WIN0H = 0; gBattle_WIN0V = 0; - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR - | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR - | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL | WININ_WIN1_ALL); + SetGpuReg(REG_OFFSET_WINOUT, (WINOUT_WIN01_ALL & ~WINOUT_WIN01_BG1) | WINOUT_WINOBJ_ALL); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); @@ -424,16 +446,17 @@ static void StatsChangeAnimation_Step1(u8 taskId) if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); - if (IsDoubleBattle() && sAnimStatsChangeData->data[3] == 0) + if (IsDoubleBattle() && !sAnimStatsChangeData->aMultipleBattlers) { if (GetBattlerPosition(sAnimStatsChangeData->battler1) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(sAnimStatsChangeData->battler1) == B_POSITION_PLAYER_LEFT) { if (IsBattlerSpriteVisible(sAnimStatsChangeData->battler2) == TRUE) { - gSprites[gBattlerSpriteIds[sAnimStatsChangeData->battler2]].oam.priority -= 1; + // Push the battler not being animated back so it doesn't receive the animation. + gSprites[gBattlerSpriteIds[sAnimStatsChangeData->battler2]].oam.priority--; SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); - sAnimStatsChangeData->higherPriority = 1; + sAnimStatsChangeData->hidBattler2 = TRUE; } } } @@ -462,79 +485,80 @@ static void StatsChangeAnimation_Step2(u8 taskId) spriteId2 = 0; battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1]; spriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species); - if (sAnimStatsChangeData->data[3]) + if (sAnimStatsChangeData->aMultipleBattlers) { battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2]; spriteId2 = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species); } GetBattleAnimBg1Data(&animBgData); - if (sAnimStatsChangeData->data[0] == 0) - AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleStatMask1_Tilemap, FALSE); + if (!sAnimStatsChangeData->aDecrease) + AnimLoadCompressedBgTilemapHandleContest(&animBgData, gStatAnim_Increase_Tilemap, FALSE); else - AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleStatMask2_Tilemap, FALSE); + AnimLoadCompressedBgTilemapHandleContest(&animBgData, gStatAnim_Decrease_Tilemap, FALSE); - AnimLoadCompressedBgGfx(animBgData.bgId, gBattleStatMask_Gfx, animBgData.tilesOffset); - switch (sAnimStatsChangeData->data[1]) + AnimLoadCompressedBgGfx(animBgData.bgId, gStatAnim_Gfx, animBgData.tilesOffset); + switch (sAnimStatsChangeData->aAnimStatId) { - case 0: - LoadCompressedPalette(gBattleStatMask2_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); + case STAT_ANIM_PAL_ATK: + LoadCompressedPalette(gStatAnim_Attack_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; - case 1: - LoadCompressedPalette(gBattleStatMask1_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); + case STAT_ANIM_PAL_DEF: + LoadCompressedPalette(gStatAnim_Defense_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; - case 2: - LoadCompressedPalette(gBattleStatMask3_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); + case STAT_ANIM_PAL_ACC: + LoadCompressedPalette(gStatAnim_Accuracy_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; - case 3: - LoadCompressedPalette(gBattleStatMask4_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); + case STAT_ANIM_PAL_SPEED: + LoadCompressedPalette(gStatAnim_Speed_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; - case 4: - LoadCompressedPalette(gBattleStatMask6_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); + case STAT_ANIM_PAL_EVASION: + LoadCompressedPalette(gStatAnim_Evasion_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; - case 5: - LoadCompressedPalette(gBattleStatMask7_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); + case STAT_ANIM_PAL_SPATK: + LoadCompressedPalette(gStatAnim_SpAttack_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; - case 6: - LoadCompressedPalette(gBattleStatMask8_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); + case STAT_ANIM_PAL_SPDEF: + LoadCompressedPalette(gStatAnim_SpDefense_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; default: - LoadCompressedPalette(gBattleStatMask5_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); + // case STAT_ANIM_PAL_MULTIPLE: + LoadCompressedPalette(gStatAnim_Multiple_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); break; } gBattle_BG1_X = 0; gBattle_BG1_Y = 0; - if (sAnimStatsChangeData->data[0] == 1) + if (sAnimStatsChangeData->aDecrease == TRUE) { gBattle_BG1_X = 64; - gTasks[taskId].data[1] = -3; + gTasks[taskId].tVelocity = -3; } else { - gTasks[taskId].data[1] = 3; + gTasks[taskId].tVelocity = 3; } - if (sAnimStatsChangeData->data[4] == 0) + if (!sAnimStatsChangeData->aSharply) { - gTasks[taskId].data[4] = 10; - gTasks[taskId].data[5] = 20; + gTasks[taskId].tTargetBlend = 10; + gTasks[taskId].tWaitTime = 20; } else { - gTasks[taskId].data[4] = 13; - gTasks[taskId].data[5] = 30; + gTasks[taskId].tTargetBlend = 13; + gTasks[taskId].tWaitTime = 30; } - gTasks[taskId].data[0] = spriteId; - gTasks[taskId].data[2] = sAnimStatsChangeData->data[3]; - gTasks[taskId].data[3] = spriteId2; - gTasks[taskId].data[6] = sAnimStatsChangeData->higherPriority; - gTasks[taskId].data[7] = gBattlerSpriteIds[sAnimStatsChangeData->battler2]; + gTasks[taskId].tAnimSpriteId1 = spriteId; + gTasks[taskId].tMultipleBattlers = sAnimStatsChangeData->aMultipleBattlers; + gTasks[taskId].tAnimSpriteId2 = spriteId2; + gTasks[taskId].tHidBattler2 = sAnimStatsChangeData->hidBattler2; + gTasks[taskId].tBattler2SpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2]; gTasks[taskId].func = StatsChangeAnimation_Step3; - if (sAnimStatsChangeData->data[0] == 0) + if (!sAnimStatsChangeData->aDecrease) PlaySE12WithPanning(SE_M_STAT_INCREASE, BattleAnimAdjustPanning2(SOUND_PAN_ATTACKER)); else PlaySE12WithPanning(SE_M_STAT_DECREASE, BattleAnimAdjustPanning2(SOUND_PAN_ATTACKER)); @@ -542,44 +566,46 @@ static void StatsChangeAnimation_Step2(u8 taskId) static void StatsChangeAnimation_Step3(u8 taskId) { - gBattle_BG1_Y += gTasks[taskId].data[1]; + gBattle_BG1_Y += gTasks[taskId].tVelocity; - switch (gTasks[taskId].data[15]) + switch (gTasks[taskId].tState) { case 0: - if (gTasks[taskId].data[11]++ > 0) + // Fade in + if (gTasks[taskId].tFadeTimer++ > 0) { - gTasks[taskId].data[11] = 0; - gTasks[taskId].data[12]++; - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); - if (gTasks[taskId].data[12] == gTasks[taskId].data[4]) - gTasks[taskId].data[15]++; + gTasks[taskId].tFadeTimer = 0; + gTasks[taskId].tBlend++; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlend, 16 - gTasks[taskId].tBlend)); + if (gTasks[taskId].tBlend == gTasks[taskId].tTargetBlend) + gTasks[taskId].tState++; } break; case 1: - if (++gTasks[taskId].data[10] == gTasks[taskId].data[5]) - gTasks[taskId].data[15]++; + // Wait + if (++gTasks[taskId].tWaitTimer == gTasks[taskId].tWaitTime) + gTasks[taskId].tState++; break; case 2: - if (gTasks[taskId].data[11]++ > 0) + // Fade out + if (gTasks[taskId].tFadeTimer++ > 0) { - gTasks[taskId].data[11] = 0; - gTasks[taskId].data[12]--; - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); - if (gTasks[taskId].data[12] == 0) + gTasks[taskId].tFadeTimer = 0; + gTasks[taskId].tBlend--; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlend, 16 - gTasks[taskId].tBlend)); + if (gTasks[taskId].tBlend == 0) { ResetBattleAnimBg(FALSE); - gTasks[taskId].data[15]++; + gTasks[taskId].tState++; } } break; case 3: + // Reset gBattle_WIN0H = 0; gBattle_WIN0V = 0; - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR - | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR - | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL | WININ_WIN1_ALL); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_ALL | WINOUT_WINOBJ_ALL); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); @@ -587,12 +613,14 @@ static void StatsChangeAnimation_Step3(u8 taskId) SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); - DestroySprite(&gSprites[gTasks[taskId].data[0]]); - if (gTasks[taskId].data[2]) - DestroySprite(&gSprites[gTasks[taskId].data[3]]); - if (gTasks[taskId].data[6] == 1) - gSprites[gTasks[taskId].data[7]].oam.priority++; + DestroySprite(&gSprites[gTasks[taskId].tAnimSpriteId1]); + if (gTasks[taskId].tMultipleBattlers) + DestroySprite(&gSprites[gTasks[taskId].tAnimSpriteId2]); + + // Restore battler 2's priority + if (gTasks[taskId].tHidBattler2 == TRUE) + gSprites[gTasks[taskId].tBattler2SpriteId].oam.priority++; FREE_AND_SET_NULL(sAnimStatsChangeData); DestroyAnimVisualTask(taskId); @@ -600,6 +628,24 @@ static void StatsChangeAnimation_Step3(u8 taskId) } } +#undef aDecrease +#undef aAnimStatId +#undef aIsTarget +#undef aMultipleBattlers +#undef aSharply +#undef tAnimSpriteId1 +#undef tVelocity +#undef tMultipleBattlers +#undef tAnimSpriteId2 +#undef tTargetBlend +#undef tWaitTime +#undef tHidBattler2 +#undef tBattler2SpriteId +#undef tWaitTimer +#undef tFadeTimer +#undef tBlend +#undef tState + void AnimTask_Flash(u8 taskId) { u32 selectedPalettes = GetBattleMonSpritePalettesMask(1, 1, 1, 1); @@ -663,7 +709,7 @@ static void SetPalettesToColor(u32 selectedPalettes, u16 color) { if (selectedPalettes & 1) { - u16 curOffset = i * 16; + u16 curOffset = PLTT_ID(i); u16 paletteOffset = curOffset; while (curOffset < paletteOffset + 16) { @@ -763,7 +809,7 @@ void AnimTask_SetAllNonAttackersInvisiblity(u8 taskId) DestroyAnimVisualTask(taskId); } -void StartMonScrollingBgMask(u8 taskId, int unused, u16 scrollSpeed, u8 battler, bool8 includePartner, u8 numFadeSteps, u8 fadeStepDelay, u8 duration, const u32 *gfx, const u32 *tilemap, const u32 *palette) +void StartMonScrollingBgMask(u8 taskId, int UNUSED unused, u16 scrollSpeed, u8 battler, bool8 includePartner, u8 numFadeSteps, u8 fadeStepDelay, u8 duration, const u32 *gfx, const u32 *tilemap, const u32 *palette) { u16 species; u8 spriteId, spriteId2; @@ -932,7 +978,7 @@ void AnimTask_CopyPalUnfadedToBackup(u8 taskId) paletteIndex = gBattleAnimTarget + 16; } - memcpy(&gMonSpritesGfxPtr->buffer[gBattleAnimArgs[1] * 16], &gPlttBufferUnfaded[paletteIndex * 16], 32); + memcpy(&gMonSpritesGfxPtr->buffer[gBattleAnimArgs[1] * 16], &gPlttBufferUnfaded[PLTT_ID(paletteIndex)], PLTT_SIZE_4BPP); DestroyAnimVisualTask(taskId); } @@ -959,7 +1005,7 @@ void AnimTask_CopyPalUnfadedFromBackup(u8 taskId) paletteIndex = gBattleAnimTarget + 16; } - memcpy(&gPlttBufferUnfaded[paletteIndex * 16], &gMonSpritesGfxPtr->buffer[gBattleAnimArgs[1] * 16], 32); + memcpy(&gPlttBufferUnfaded[PLTT_ID(paletteIndex)], &gMonSpritesGfxPtr->buffer[gBattleAnimArgs[1] * 16], PLTT_SIZE_4BPP); DestroyAnimVisualTask(taskId); } @@ -986,7 +1032,7 @@ void AnimTask_CopyPalFadedToUnfaded(u8 taskId) paletteIndex = gBattleAnimTarget + 16; } - memcpy(&gPlttBufferUnfaded[paletteIndex * 16], &gPlttBufferFaded[paletteIndex * 16], 32); + memcpy(&gPlttBufferUnfaded[PLTT_ID(paletteIndex)], &gPlttBufferFaded[PLTT_ID(paletteIndex)], PLTT_SIZE_4BPP); DestroyAnimVisualTask(taskId); } diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index 117dd3b88c..dc793f70a5 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -619,7 +619,7 @@ static void AnimAuroraBeamRings_Step(struct Sprite *sprite) void AnimTask_RotateAuroraRingColors(u8 taskId) { gTasks[taskId].data[0] = gBattleAnimArgs[0]; - gTasks[taskId].data[2] = IndexOfSpritePaletteTag(ANIM_TAG_RAINBOW_RINGS) * 16 + 256; + gTasks[taskId].data[2] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(ANIM_TAG_RAINBOW_RINGS)); gTasks[taskId].func = AnimTask_RotateAuroraRingColors_Step; } @@ -887,12 +887,12 @@ static void AnimTask_CreateSurfWave_Step1(u8 taskId) gTasks[taskId].data[2] += gTasks[taskId].data[1]; if (++gTasks[taskId].data[5] == 4) { - rgbBuffer = gPlttBufferFaded[animBg.paletteId * 16 + 7]; + rgbBuffer = gPlttBufferFaded[BG_PLTT_ID(animBg.paletteId) + 7]; for (i = 6; i != 0; i--) { - gPlttBufferFaded[animBg.paletteId * 16 + 1 + i] = gPlttBufferFaded[animBg.paletteId * 16 + 1 + i - 1]; // 1 + i - 1 is needed to match for some bizarre reason + gPlttBufferFaded[BG_PLTT_ID(animBg.paletteId) + 1 + i] = gPlttBufferFaded[BG_PLTT_ID(animBg.paletteId) + 1 + i - 1]; // 1 + i - 1 is needed to match for some bizarre reason } - gPlttBufferFaded[animBg.paletteId * 16 + 1] = rgbBuffer; + gPlttBufferFaded[BG_PLTT_ID(animBg.paletteId) + 1] = rgbBuffer; gTasks[taskId].data[5] = 0; } if (++gTasks[taskId].data[6] > 1) diff --git a/src/battle_arena.c b/src/battle_arena.c index ed0fa2550a..ed3cf16dfd 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -651,8 +651,7 @@ void BattleArena_DeductSkillPoints(u8 battler, u16 stringId) } } -// Unused -static void UpdateHPAtStart(u8 battler) +static void UNUSED UpdateHPAtStart(u8 battler) { u16 *hpAtStart = gBattleStruct->arenaStartHp; @@ -737,7 +736,7 @@ static void SetArenaData(void) static void SaveArenaChallenge(void) { gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; - VarSet(VAR_TEMP_0, 0); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; SaveGameFrontier(); } diff --git a/src/battle_bg.c b/src/battle_bg.c index b7c2b1494c..05073db96d 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -21,6 +21,7 @@ #include "trig.h" #include "window.h" #include "constants/map_types.h" +#include "constants/rgb.h" #include "constants/songs.h" #include "constants/trainers.h" @@ -691,9 +692,9 @@ static const struct BattleBackground sBattleTerrainTable[] = }, }; -static void CB2_UnusedBattleInit(void); +static void UNUSED CB2_UnusedBattleInit(void); -static void UnusedBattleInit(void) +static void UNUSED UnusedBattleInit(void) { u8 spriteId; @@ -703,7 +704,7 @@ static void UnusedBattleInit(void) SetMainCallback2(CB2_UnusedBattleInit); } -static void CB2_UnusedBattleInit(void) +static void UNUSED CB2_UnusedBattleInit(void) { AnimateSprites(); BuildOamBuffer(); @@ -1071,7 +1072,7 @@ void InitLinkBattleVsScreen(u8 taskId) break; case 1: palId = AllocSpritePalette(TAG_VS_LETTERS); - gPlttBufferUnfaded[palId * 16 + 0x10F] = gPlttBufferFaded[palId * 16 + 0x10F] = 0x7FFF; + gPlttBufferUnfaded[OBJ_PLTT_ID(palId) + 15] = gPlttBufferFaded[OBJ_PLTT_ID(palId) + 15] = RGB_WHITE; gBattleStruct->linkBattleVsSpriteId_V = CreateSprite(&sVsLetter_V_SpriteTemplate, 111, 80, 0); gBattleStruct->linkBattleVsSpriteId_S = CreateSprite(&sVsLetter_S_SpriteTemplate, 129, 80, 0); gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = TRUE; diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 0f1ce1b17f..236db2a428 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -529,7 +529,7 @@ static void LinkOpponentBufferExecCompleted(void) static void LinkOpponentHandleGetMonData(void) { - u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data + u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two Pokémon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; @@ -556,7 +556,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; - u8 nickname[20]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; u8 *src; s16 data16; u32 data32; diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 3b2e014253..7a437b958c 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -423,7 +423,7 @@ static void CompleteOnFinishedBattleAnimation(void) static void LinkPartnerHandleGetMonData(void) { - u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data + u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two Pokémon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; @@ -450,7 +450,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; - u8 nickname[20]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; u8 *src; s16 data16; u32 data32; diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 8246a6f80f..dc3652b457 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -534,7 +534,7 @@ static void OpponentBufferExecCompleted(void) static void OpponentHandleGetMonData(void) { - u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data + u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two Pokémon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; @@ -561,7 +561,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; - u8 nickname[20]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; u8 *src; s16 data16; u32 data32; @@ -1555,7 +1555,7 @@ static void OpponentHandleChooseMove(void) if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER)) { - BattleAI_SetupAIData(0xF); + BattleAI_SetupAIData(ALL_MOVES_MASK); chosenMoveId = BattleAI_ChooseMoveOrAction(); switch (chosenMoveId) @@ -1588,7 +1588,7 @@ static void OpponentHandleChooseMove(void) u16 move; do { - chosenMoveId = Random() & 3; + chosenMoveId = MOD(Random(), MAX_MON_MOVES); move = moveInfo->moves[chosenMoveId]; } while (move == MOVE_NONE); @@ -2007,7 +2007,7 @@ static void OpponentHandleEndLinkBattle(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) { - gMain.inBattle = 0; + gMain.inBattle = FALSE; gMain.callback1 = gPreBattleCallback1; SetMainCallback2(gMain.savedCallback); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 3d0531325e..8e09d126c9 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -329,7 +329,7 @@ static void HandleInputChooseAction(void) } } -static void UnusedEndBounceEffect(void) +static void UNUSED UnusedEndBounceEffect(void) { EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); EndBounceEffect(gActiveBattler, BOUNCE_MON); @@ -614,7 +614,7 @@ static void HandleInputChooseMove(void) } } -static u32 HandleMoveInputUnused(void) +static u32 UNUSED HandleMoveInputUnused(void) { u32 var = 0; @@ -981,12 +981,12 @@ static void Intro_TryShinyAnimShowHealthbox(void) bool32 bgmRestored = FALSE; bool32 battlerAnimsDone = FALSE; - // Start shiny animation if applicable for 1st pokemon + // Start shiny animation if applicable for 1st Pokémon if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - // Start shiny animation if applicable for 2nd pokemon + // Start shiny animation if applicable for 2nd Pokémon if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) TryShinyAnimation(BATTLE_PARTNER(gActiveBattler), &gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); @@ -1581,7 +1581,7 @@ static void PrintLinkStandbyMsg(void) static void PlayerHandleGetMonData(void) { - u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data + u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two Pokémon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; @@ -1608,7 +1608,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; - u8 nickname[20]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; u8 *src; s16 data16; u32 data32; diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 5b08a2c529..307eeca26a 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -607,7 +607,7 @@ static void CompleteOnFinishedBattleAnimation(void) static void PlayerPartnerHandleGetMonData(void) { - u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data + u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two Pokémon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; @@ -634,7 +634,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; - u8 nickname[20]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; u8 *src; s16 data16; u32 data32; @@ -1515,7 +1515,7 @@ static void PlayerPartnerHandleChooseMove(void) u8 chosenMoveId; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleBufferA[gActiveBattler][4]); - BattleAI_SetupAIData(0xF); + BattleAI_SetupAIData(ALL_MOVES_MASK); chosenMoveId = BattleAI_ChooseMoveOrAction(); if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 872a61c0e7..7cb5839bc5 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -186,7 +186,7 @@ static void CompleteOnBattlerSpriteCallbackDummy(void) RecordedOpponentBufferExecCompleted(); } -static void CompleteOnBankSpriteCallbackDummy2(void) +static void UNUSED CompleteOnBankSpriteCallbackDummy2(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) RecordedOpponentBufferExecCompleted(); @@ -515,7 +515,7 @@ static void RecordedOpponentBufferExecCompleted(void) static void RecordedOpponentHandleGetMonData(void) { - u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data + u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two Pokémon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; @@ -542,7 +542,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; - u8 nickname[20]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; u8 *src; s16 data16; u32 data32; diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index d23aaa8b04..5a7be7f347 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -498,7 +498,7 @@ static void CompleteOnFinishedBattleAnimation(void) static void RecordedPlayerHandleGetMonData(void) { - u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data + u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two Pokémon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; @@ -525,7 +525,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; - u8 nickname[20]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; u8 *src; s16 data16; u32 data32; diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 5e8ef2d286..157bb6954c 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -147,7 +147,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) = [CONTROLLER_TERMINATOR_NOP] = SafariCmdEnd }; -static void SpriteCB_Null4(void) +static void UNUSED SpriteCB_Null4(void) { } @@ -307,7 +307,7 @@ static void SafariBufferExecCompleted(void) } } -static void CompleteOnFinishedStatusAnimation(void) +static void UNUSED CompleteOnFinishedStatusAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) SafariBufferExecCompleted(); diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index ca81677f20..67950b8965 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -161,7 +161,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) = [CONTROLLER_TERMINATOR_NOP] = WallyCmdEnd }; -static void SpriteCB_Null7(void) +static void UNUSED SpriteCB_Null7(void) { } @@ -417,7 +417,7 @@ static void WallyBufferExecCompleted(void) } } -static void CompleteOnFinishedStatusAnimation(void) +static void UNUSED CompleteOnFinishedStatusAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) WallyBufferExecCompleted(); @@ -425,7 +425,7 @@ static void CompleteOnFinishedStatusAnimation(void) static void WallyHandleGetMonData(void) { - u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data + u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two Pokémon, trying to get more will result in overwriting data u32 size = 0; u8 monToCheck; s32 i; @@ -452,7 +452,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; - u8 nickname[20]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; u8 *src; s16 data16; u32 data32; diff --git a/src/battle_controllers.c b/src/battle_controllers.c index b93e65fdc0..2ba5d4329d 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -905,8 +905,7 @@ void BtlController_EmitGetMonData(u8 bufferId, u8 requestId, u8 monToCheck) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -// Unused -static void BtlController_EmitGetRawMonData(u8 bufferId, u8 monId, u8 bytes) +static void UNUSED BtlController_EmitGetRawMonData(u8 bufferId, u8 monId, u8 bytes) { sBattleBuffersTransferData[0] = CONTROLLER_GETRAWMONDATA; sBattleBuffersTransferData[1] = monId; @@ -927,8 +926,7 @@ void BtlController_EmitSetMonData(u8 bufferId, u8 requestId, u8 monToCheck, u8 b PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 3 + bytes); } -// Unused -static void BtlController_EmitSetRawMonData(u8 bufferId, u8 monId, u8 bytes, void *data) +static void UNUSED BtlController_EmitSetRawMonData(u8 bufferId, u8 monId, u8 bytes, void *data) { s32 i; @@ -1001,8 +999,7 @@ void BtlController_EmitFaintAnimation(u8 bufferId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -// Unused -static void BtlController_EmitPaletteFade(u8 bufferId) +static void UNUSED BtlController_EmitPaletteFade(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_PALETTEFADE; sBattleBuffersTransferData[1] = CONTROLLER_PALETTEFADE; @@ -1011,8 +1008,7 @@ static void BtlController_EmitPaletteFade(u8 bufferId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -// Unused -static void BtlController_EmitSuccessBallThrowAnim(u8 bufferId) +static void UNUSED BtlController_EmitSuccessBallThrowAnim(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_SUCCESSBALLTHROWANIM; sBattleBuffersTransferData[1] = CONTROLLER_SUCCESSBALLTHROWANIM; @@ -1028,8 +1024,7 @@ void BtlController_EmitBallThrowAnim(u8 bufferId, u8 caseId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } -// Unused -static void BtlController_EmitPause(u8 bufferId, u8 toWait, void *data) +static void UNUSED BtlController_EmitPause(u8 bufferId, u8 toWait, void *data) { s32 i; @@ -1188,8 +1183,7 @@ void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 slotId, u8 abili PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 8); // Only 7 bytes were written. } -// Unused -static void BtlController_EmitCmd23(u8 bufferId) +static void UNUSED BtlController_EmitCmd23(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_23; sBattleBuffersTransferData[1] = CONTROLLER_23; @@ -1243,8 +1237,7 @@ void BtlController_EmitStatusAnimation(u8 bufferId, bool8 status2, u32 status) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 6); } -// Unused -static void BtlController_EmitStatusXor(u8 bufferId, u8 b) +static void UNUSED BtlController_EmitStatusXor(u8 bufferId, u8 b) { sBattleBuffersTransferData[0] = CONTROLLER_STATUSXOR; sBattleBuffersTransferData[1] = b; @@ -1264,8 +1257,7 @@ void BtlController_EmitDataTransfer(u8 bufferId, u16 size, void *data) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 4); } -// Unused -static void BtlController_EmitDMA3Transfer(u8 bufferId, void *dst, u16 size, void *data) +static void UNUSED BtlController_EmitDMA3Transfer(u8 bufferId, void *dst, u16 size, void *data) { s32 i; @@ -1281,8 +1273,7 @@ static void BtlController_EmitDMA3Transfer(u8 bufferId, void *dst, u16 size, voi PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 7); } -// Unused -static void BtlController_EmitPlayBGM(u8 bufferId, u16 songId, void *data) +static void UNUSED BtlController_EmitPlayBGM(u8 bufferId, u16 songId, void *data) { s32 i; @@ -1297,8 +1288,7 @@ static void BtlController_EmitPlayBGM(u8 bufferId, u16 songId, void *data) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, songId + 3); } -// Unused -static void BtlController_EmitCmd32(u8 bufferId, u16 size, void *data) +static void UNUSED BtlController_EmitCmd32(u8 bufferId, u16 size, void *data) { s32 i; @@ -1348,8 +1338,7 @@ void BtlController_EmitOneReturnValue_Duplicate(u8 bufferId, u16 ret) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -// Unused -static void BtlController_EmitClearUnkVar(u8 bufferId) +static void UNUSED BtlController_EmitClearUnkVar(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_CLEARUNKVAR; sBattleBuffersTransferData[1] = CONTROLLER_CLEARUNKVAR; @@ -1358,16 +1347,14 @@ static void BtlController_EmitClearUnkVar(u8 bufferId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -// Unused -static void BtlController_EmitSetUnkVar(u8 bufferId, u8 b) +static void UNUSED BtlController_EmitSetUnkVar(u8 bufferId, u8 b) { sBattleBuffersTransferData[0] = CONTROLLER_SETUNKVAR; sBattleBuffersTransferData[1] = b; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } -// Unused -static void BtlController_EmitClearUnkFlag(u8 bufferId) +static void UNUSED BtlController_EmitClearUnkFlag(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_CLEARUNKFLAG; sBattleBuffersTransferData[1] = CONTROLLER_CLEARUNKFLAG; @@ -1376,8 +1363,7 @@ static void BtlController_EmitClearUnkFlag(u8 bufferId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -// Unused -static void BtlController_EmitToggleUnkFlag(u8 bufferId) +static void UNUSED BtlController_EmitToggleUnkFlag(u8 bufferId) { sBattleBuffersTransferData[0] = CONTROLLER_TOGGLEUNKFLAG; sBattleBuffersTransferData[1] = CONTROLLER_TOGGLEUNKFLAG; diff --git a/src/battle_dome.c b/src/battle_dome.c index 32a43c3d94..68cae14a6e 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -40,6 +40,8 @@ #include "constants/battle_frontier.h" #include "constants/rgb.h" +#define TAG_BUTTONS 0 + // Enough space to hold 2 match info cards worth of trainers and their parties #define NUM_INFOCARD_SPRITES ((FRONTIER_PARTY_SIZE + 1) * 4) #define NUM_INFOCARD_TRAINERS 2 @@ -56,7 +58,7 @@ struct TourneyTreeLineSection { u8 x; u8 y; - u16 src; + u16 tile; }; #define DOME_TRAINERS gSaveBlock2Ptr->frontier.domeTrainers @@ -904,14 +906,14 @@ static const struct ScanlineEffectParams sTourneyTreeScanlineEffectParams = static const struct CompressedSpriteSheet sTourneyTreeButtonsSpriteSheet[] = { - {gDomeTourneyTreeButtons_Gfx, 0x0600, 0x0000}, + {.data = gDomeTourneyTreeButtons_Gfx, .size = 0x0600, .tag = TAG_BUTTONS}, {}, }; // Unused static const struct CompressedSpritePalette sTourneyTreeButtonsSpritePal[] = { - {gDomeTourneyTreeButtons_Pal, 0x0000}, + {.data = gDomeTourneyTreeButtons_Pal, .tag = TAG_BUTTONS}, {}, }; @@ -1004,7 +1006,7 @@ static const union AnimCmd * const sSpriteAnimTable_TourneyTreePokeball[] = // Sprite template for the pokeballs on the tourney tree that act as buttons to view a trainer/match info card static const struct SpriteTemplate sTourneyTreePokeballSpriteTemplate = { - .tileTag = 0x0000, + .tileTag = TAG_BUTTONS, .paletteTag = TAG_NONE, .oam = &sOamData_TourneyTreePokeball, .anims = sSpriteAnimTable_TourneyTreePokeball, @@ -1033,7 +1035,7 @@ static const union AnimCmd * const sSpriteAnimTable_TourneyTreeCancelButton[] = static const struct SpriteTemplate sCancelButtonSpriteTemplate = { - .tileTag = 0x0000, + .tileTag = TAG_BUTTONS, .paletteTag = TAG_NONE, .oam = &sOamData_TourneyTreeCloseButton, .anims = sSpriteAnimTable_TourneyTreeCancelButton, @@ -1062,7 +1064,7 @@ static const union AnimCmd * const sSpriteAnimTable_TourneyTreeExitButton[] = static const struct SpriteTemplate sExitButtonSpriteTemplate = { - .tileTag = 0x0000, + .tileTag = TAG_BUTTONS, .paletteTag = TAG_NONE, .oam = &sOamData_TourneyTreeCloseButton, .anims = sSpriteAnimTable_TourneyTreeExitButton, @@ -1109,7 +1111,7 @@ static const union AnimCmd * const sSpriteAnimTable_HorizontalScrollArrow[] = static const struct SpriteTemplate sHorizontalScrollArrowSpriteTemplate = { - .tileTag = 0x0000, + .tileTag = TAG_BUTTONS, .paletteTag = TAG_NONE, .oam = &sOamData_HorizontalScrollArrow, .anims = sSpriteAnimTable_HorizontalScrollArrow, @@ -1120,7 +1122,7 @@ static const struct SpriteTemplate sHorizontalScrollArrowSpriteTemplate = static const struct SpriteTemplate sVerticalScrollArrowSpriteTemplate = { - .tileTag = 0x0000, + .tileTag = TAG_BUTTONS, .paletteTag = TAG_NONE, .oam = &sOamData_VerticalScrollArrow, .anims = sSpriteAnimTable_VerticalScrollArrow, @@ -1482,589 +1484,617 @@ static const u8 sTourneyTreePokeballCoords[DOME_TOURNAMENT_TRAINERS_COUNT + DOME {120, 89}, // Final match }; +// Tile values from tourney_tree.png for the highlighted lines of the tourney tree. +// These tiles will be used to replace the existing, unhighlighted line tiles on the tourney tree tilemap. +#define LINE_PAL (6 << 12) +#define LINE_H (LINE_PAL | 0x21) // Horizontal +#define LINE_CORNER_R (LINE_PAL | 0x23) // Horizontal into a right-side vertical +#define LINE_CORNER_L (LINE_PAL | 0x25) // Horizontal into a left-side vertical +#define LINE_V_R (LINE_PAL | 0x27) // Right-side vertical +#define LINE_V_L (LINE_PAL | 0x29) // Left-side vertical +#define LINE_H_BOTTOM (LINE_PAL | 0x2B) // Horizontal on the bottom of the tree +#define LINE_H_LOGO1 (LINE_PAL | 0x2C) // Horizontal, logo behind +#define LINE_H_LOGO2 (LINE_PAL | 0x2D) // Horizontal, logo behind +#define LINE_H_LOGO3 (LINE_PAL | 0x2E) // Horizontal, logo behind +#define LINE_H_LOGO4 (LINE_PAL | 0x2F) // Horizontal, logo behind +#define LINE_V_R_LOGO1 (LINE_PAL | 0x30) // Right-side vertical, logo behind +#define LINE_V_R_LOGO2 (LINE_PAL | 0x31) // Right-side vertical, logo behind +#define LINE_V_R_LOGO3 (LINE_PAL | 0x32) // Right-side vertical, logo behind +#define LINE_V_R_LOGO4 (LINE_PAL | 0x33) // Right-side vertical, logo behind +#define LINE_V_L_LOGO1 (LINE_PAL | 0x35) // Left-side vertical, logo behind +#define LINE_V_L_LOGO2 (LINE_PAL | 0x36) // Left-side vertical, logo behind +#define LINE_V_L_LOGO3 (LINE_PAL | 0x37) // Left-side vertical, logo behind +#define LINE_V_L_LOGO4 (LINE_PAL | 0x38) // Left-side vertical, logo behind +#define LINE_V_R_HALF_LOGO (LINE_PAL | 0x3B) // Right-side vertical, half lit from the top, logo behind +#define LINE_V_L_HALF_LOGO (LINE_PAL | 0x3C) // Left-side vertical, half lit from the top, logo behind +#define LINE_CORNER_R_HALF (LINE_PAL | 0x43) // Lit horizontal, unlit right-side vertical +#define LINE_CORNER_L_HALF (LINE_PAL | 0x45) // Lit horizontal, unlit left-side vertical +#define LINE_V_R_HALF (LINE_PAL | 0x47) // Right-side vertical, half lit from the top +#define LINE_V_L_HALF (LINE_PAL | 0x49) // Left-side vertical, half lit from the top + // Each of these line sections define the position of the advancement line on the tourney tree for the victor of that round // The trainers here are numbered by tourney ID (rank/seed) and ordered according to where they start on the tourney tree -#define LINESECTION_ROUND1_TRAINER1(lastSrc) \ - {.src = 0x6021, .y = 0x04, .x = 0x09}, \ - {.src = 0x6023, .y = 0x04, .x = 0x0a}, \ - {.src = 0x6047, .y = 0x05, .x = 0x0a}, \ - {.src = lastSrc, .y = 0x05, .x = 0x0b}, +#define LINESECTION_ROUND1_TRAINER1(lastTile) \ + {.tile = LINE_H, .y = 4, .x = 9}, \ + {.tile = LINE_CORNER_R, .y = 4, .x = 10}, \ + {.tile = LINE_V_R_HALF, .y = 5, .x = 10}, \ + {.tile = lastTile, .y = 5, .x = 11}, -#define LINESECTION_ROUND1_TRAINER9(lastSrc) \ - {.src = 0x6021, .y = 0x06, .x = 0x09}, \ - {.src = 0x6021, .y = 0x06, .x = 0x0a}, \ - {.src = 0x6027, .y = 0x05, .x = 0x0a}, \ - {.src = lastSrc, .y = 0x05, .x = 0x0b}, +#define LINESECTION_ROUND1_TRAINER9(lastTile) \ + {.tile = LINE_H, .y = 6, .x = 9}, \ + {.tile = LINE_H, .y = 6, .x = 10}, \ + {.tile = LINE_V_R, .y = 5, .x = 10}, \ + {.tile = lastTile, .y = 5, .x = 11}, -#define LINESECTION_ROUND1_TRAINER13(lastSrc) \ - {.src = 0x6021, .y = 0x08, .x = 0x09}, \ - {.src = 0x6023, .y = 0x08, .x = 0x0a}, \ - {.src = 0x6047, .y = 0x09, .x = 0x0a}, \ - {.src = lastSrc, .y = 0x09, .x = 0x0b}, +#define LINESECTION_ROUND1_TRAINER13(lastTile) \ + {.tile = LINE_H, .y = 8, .x = 9}, \ + {.tile = LINE_CORNER_R, .y = 8, .x = 10}, \ + {.tile = LINE_V_R_HALF, .y = 9, .x = 10}, \ + {.tile = lastTile, .y = 9, .x = 11}, -#define LINESECTION_ROUND1_TRAINER5(lastSrc) \ - {.src = 0x6021, .y = 0x0a, .x = 0x09}, \ - {.src = 0x6021, .y = 0x0a, .x = 0x0a}, \ - {.src = 0x6027, .y = 0x09, .x = 0x0a}, \ - {.src = lastSrc, .y = 0x09, .x = 0x0b}, +#define LINESECTION_ROUND1_TRAINER5(lastTile) \ + {.tile = LINE_H, .y = 10, .x = 9}, \ + {.tile = LINE_H, .y = 10, .x = 10}, \ + {.tile = LINE_V_R, .y = 9, .x = 10}, \ + {.tile = lastTile, .y = 9, .x = 11}, -#define LINESECTION_ROUND1_TRAINER8(lastSrc) \ - {.src = 0x6021, .y = 0x0c, .x = 0x09}, \ - {.src = 0x6023, .y = 0x0c, .x = 0x0a}, \ - {.src = 0x6047, .y = 0x0d, .x = 0x0a}, \ - {.src = lastSrc, .y = 0x0d, .x = 0x0b}, +#define LINESECTION_ROUND1_TRAINER8(lastTile) \ + {.tile = LINE_H, .y = 12, .x = 9}, \ + {.tile = LINE_CORNER_R, .y = 12, .x = 10}, \ + {.tile = LINE_V_R_HALF, .y = 13, .x = 10}, \ + {.tile = lastTile, .y = 13, .x = 11}, -#define LINESECTION_ROUND1_TRAINER16(lastSrc) \ - {.src = 0x6021, .y = 0x0e, .x = 0x09}, \ - {.src = 0x6021, .y = 0x0e, .x = 0x0a}, \ - {.src = 0x6027, .y = 0x0d, .x = 0x0a}, \ - {.src = lastSrc, .y = 0x0d, .x = 0x0b}, +#define LINESECTION_ROUND1_TRAINER16(lastTile) \ + {.tile = LINE_H, .y = 14, .x = 9}, \ + {.tile = LINE_H, .y = 14, .x = 10}, \ + {.tile = LINE_V_R, .y = 13, .x = 10}, \ + {.tile = lastTile, .y = 13, .x = 11}, -#define LINESECTION_ROUND1_TRAINER12(lastSrc) \ - {.src = 0x6021, .y = 0x10, .x = 0x09}, \ - {.src = 0x6023, .y = 0x10, .x = 0x0a}, \ - {.src = 0x6047, .y = 0x11, .x = 0x0a}, \ - {.src = lastSrc, .y = 0x11, .x = 0x0b}, +#define LINESECTION_ROUND1_TRAINER12(lastTile) \ + {.tile = LINE_H, .y = 16, .x = 9}, \ + {.tile = LINE_CORNER_R, .y = 16, .x = 10}, \ + {.tile = LINE_V_R_HALF, .y = 17, .x = 10}, \ + {.tile = lastTile, .y = 17, .x = 11}, -#define LINESECTION_ROUND1_TRAINER4(lastSrc) \ - {.src = 0x602b, .y = 0x12, .x = 0x09}, \ - {.src = 0x602b, .y = 0x12, .x = 0x0a}, \ - {.src = 0x6027, .y = 0x11, .x = 0x0a}, \ - {.src = lastSrc, .y = 0x11, .x = 0x0b}, +#define LINESECTION_ROUND1_TRAINER4(lastTile) \ + {.tile = LINE_H_BOTTOM, .y = 18, .x = 9}, \ + {.tile = LINE_H_BOTTOM, .y = 18, .x = 10}, \ + {.tile = LINE_V_R, .y = 17, .x = 10}, \ + {.tile = lastTile, .y = 17, .x = 11}, -#define LINESECTION_ROUND1_TRAINER3(lastSrc) \ - {.src = 0x6021, .y = 0x04, .x = 0x14}, \ - {.src = 0x6025, .y = 0x04, .x = 0x13}, \ - {.src = 0x6049, .y = 0x05, .x = 0x13}, \ - {.src = lastSrc, .y = 0x05, .x = 0x12}, +#define LINESECTION_ROUND1_TRAINER3(lastTile) \ + {.tile = LINE_H, .y = 4, .x = 20}, \ + {.tile = LINE_CORNER_L, .y = 4, .x = 19}, \ + {.tile = LINE_V_L_HALF, .y = 5, .x = 19}, \ + {.tile = lastTile, .y = 5, .x = 18}, -#define LINESECTION_ROUND1_TRAINER11(lastSrc) \ - {.src = 0x6021, .y = 0x06, .x = 0x14}, \ - {.src = 0x6021, .y = 0x06, .x = 0x13}, \ - {.src = 0x6029, .y = 0x05, .x = 0x13}, \ - {.src = lastSrc, .y = 0x05, .x = 0x12}, +#define LINESECTION_ROUND1_TRAINER11(lastTile) \ + {.tile = LINE_H, .y = 6, .x = 20}, \ + {.tile = LINE_H, .y = 6, .x = 19}, \ + {.tile = LINE_V_L, .y = 5, .x = 19}, \ + {.tile = lastTile, .y = 5, .x = 18}, -#define LINESECTION_ROUND1_TRAINER15(lastSrc) \ - {.src = 0x6021, .y = 0x08, .x = 0x14}, \ - {.src = 0x6025, .y = 0x08, .x = 0x13}, \ - {.src = 0x6049, .y = 0x09, .x = 0x13}, \ - {.src = lastSrc, .y = 0x09, .x = 0x12}, +#define LINESECTION_ROUND1_TRAINER15(lastTile) \ + {.tile = LINE_H, .y = 8, .x = 20}, \ + {.tile = LINE_CORNER_L, .y = 8, .x = 19}, \ + {.tile = LINE_V_L_HALF, .y = 9, .x = 19}, \ + {.tile = lastTile, .y = 9, .x = 18}, -#define LINESECTION_ROUND1_TRAINER7(lastSrc) \ - {.src = 0x6021, .y = 0x0a, .x = 0x14}, \ - {.src = 0x6021, .y = 0x0a, .x = 0x13}, \ - {.src = 0x6029, .y = 0x09, .x = 0x13}, \ - {.src = lastSrc, .y = 0x09, .x = 0x12}, +#define LINESECTION_ROUND1_TRAINER7(lastTile) \ + {.tile = LINE_H, .y = 10, .x = 20}, \ + {.tile = LINE_H, .y = 10, .x = 19}, \ + {.tile = LINE_V_L, .y = 9, .x = 19}, \ + {.tile = lastTile, .y = 9, .x = 18}, -#define LINESECTION_ROUND1_TRAINER6(lastSrc) \ - {.src = 0x6021, .y = 0x0c, .x = 0x14}, \ - {.src = 0x6025, .y = 0x0c, .x = 0x13}, \ - {.src = 0x6049, .y = 0x0d, .x = 0x13}, \ - {.src = lastSrc, .y = 0x0d, .x = 0x12}, +#define LINESECTION_ROUND1_TRAINER6(lastTile) \ + {.tile = LINE_H, .y = 12, .x = 20}, \ + {.tile = LINE_CORNER_L, .y = 12, .x = 19}, \ + {.tile = LINE_V_L_HALF, .y = 13, .x = 19}, \ + {.tile = lastTile, .y = 13, .x = 18}, -#define LINESECTION_ROUND1_TRAINER14(lastSrc) \ - {.src = 0x6021, .y = 0x0e, .x = 0x14}, \ - {.src = 0x6021, .y = 0x0e, .x = 0x13}, \ - {.src = 0x6029, .y = 0x0d, .x = 0x13}, \ - {.src = lastSrc, .y = 0x0d, .x = 0x12}, +#define LINESECTION_ROUND1_TRAINER14(lastTile) \ + {.tile = LINE_H, .y = 14, .x = 20}, \ + {.tile = LINE_H, .y = 14, .x = 19}, \ + {.tile = LINE_V_L, .y = 13, .x = 19}, \ + {.tile = lastTile, .y = 13, .x = 18}, -#define LINESECTION_ROUND1_TRAINER10(lastSrc) \ - {.src = 0x6021, .y = 0x10, .x = 0x14}, \ - {.src = 0x6025, .y = 0x10, .x = 0x13}, \ - {.src = 0x6049, .y = 0x11, .x = 0x13}, \ - {.src = lastSrc, .y = 0x11, .x = 0x12}, +#define LINESECTION_ROUND1_TRAINER10(lastTile) \ + {.tile = LINE_H, .y = 16, .x = 20}, \ + {.tile = LINE_CORNER_L, .y = 16, .x = 19}, \ + {.tile = LINE_V_L_HALF, .y = 17, .x = 19}, \ + {.tile = lastTile, .y = 17, .x = 18}, -#define LINESECTION_ROUND1_TRAINER2(lastSrc) \ - {.src = 0x602b, .y = 0x12, .x = 0x14}, \ - {.src = 0x602b, .y = 0x12, .x = 0x13}, \ - {.src = 0x6029, .y = 0x11, .x = 0x13}, \ - {.src = lastSrc, .y = 0x11, .x = 0x12}, +#define LINESECTION_ROUND1_TRAINER2(lastTile) \ + {.tile = LINE_H_BOTTOM, .y = 18, .x = 20}, \ + {.tile = LINE_H_BOTTOM, .y = 18, .x = 19}, \ + {.tile = LINE_V_L, .y = 17, .x = 19}, \ + {.tile = lastTile, .y = 17, .x = 18}, -#define LINESECTION_ROUND2_MATCH1(lastSrc) \ - {.src = 0x6027, .y = 0x06, .x = 0x0b}, \ - {.src = 0x6047, .y = 0x07, .x = 0x0b}, \ - {.src = lastSrc, .y = 0x07, .x = 0x0c}, +#define LINESECTION_ROUND2_MATCH1(lastTile) \ + {.tile = LINE_V_R, .y = 6, .x = 11}, \ + {.tile = LINE_V_R_HALF, .y = 7, .x = 11}, \ + {.tile = lastTile, .y = 7, .x = 12}, -#define LINESECTION_ROUND2_MATCH2(lastSrc) \ - {.src = 0x6027, .y = 0x08, .x = 0x0b}, \ - {.src = 0x6027, .y = 0x07, .x = 0x0b}, \ - {.src = lastSrc, .y = 0x07, .x = 0x0c}, +#define LINESECTION_ROUND2_MATCH2(lastTile) \ + {.tile = LINE_V_R, .y = 8, .x = 11}, \ + {.tile = LINE_V_R, .y = 7, .x = 11}, \ + {.tile = lastTile, .y = 7, .x = 12}, -#define LINESECTION_ROUND2_MATCH3(lastSrc) \ - {.src = 0x6027, .y = 0x0e, .x = 0x0b}, \ - {.src = 0x6047, .y = 0x0f, .x = 0x0b}, \ - {.src = lastSrc, .y = 0x0f, .x = 0x0c}, +#define LINESECTION_ROUND2_MATCH3(lastTile) \ + {.tile = LINE_V_R, .y = 14, .x = 11}, \ + {.tile = LINE_V_R_HALF, .y = 15, .x = 11}, \ + {.tile = lastTile, .y = 15, .x = 12}, -#define LINESECTION_ROUND2_MATCH4(lastSrc) \ - {.src = 0x6027, .y = 0x10, .x = 0x0b}, \ - {.src = 0x6027, .y = 0x0f, .x = 0x0b}, \ - {.src = lastSrc, .y = 0x0f, .x = 0x0c}, +#define LINESECTION_ROUND2_MATCH4(lastTile) \ + {.tile = LINE_V_R, .y = 16, .x = 11}, \ + {.tile = LINE_V_R, .y = 15, .x = 11}, \ + {.tile = lastTile, .y = 15, .x = 12}, -#define LINESECTION_ROUND2_MATCH5(lastSrc) \ - {.src = 0x6029, .y = 0x06, .x = 0x12}, \ - {.src = 0x6049, .y = 0x07, .x = 0x12}, \ - {.src = lastSrc, .y = 0x07, .x = 0x11}, +#define LINESECTION_ROUND2_MATCH5(lastTile) \ + {.tile = LINE_V_L, .y = 6, .x = 18}, \ + {.tile = LINE_V_L_HALF, .y = 7, .x = 18}, \ + {.tile = lastTile, .y = 7, .x = 17}, -#define LINESECTION_ROUND2_MATCH6(lastSrc) \ - {.src = 0x6029, .y = 0x08, .x = 0x12}, \ - {.src = 0x6029, .y = 0x07, .x = 0x12}, \ - {.src = lastSrc, .y = 0x07, .x = 0x11}, +#define LINESECTION_ROUND2_MATCH6(lastTile) \ + {.tile = LINE_V_L, .y = 8, .x = 18}, \ + {.tile = LINE_V_L, .y = 7, .x = 18}, \ + {.tile = lastTile, .y = 7, .x = 17}, -#define LINESECTION_ROUND2_MATCH7(lastSrc) \ - {.src = 0x6029, .y = 0x0e, .x = 0x12}, \ - {.src = 0x6049, .y = 0x0f, .x = 0x12}, \ - {.src = lastSrc, .y = 0x0f, .x = 0x11}, +#define LINESECTION_ROUND2_MATCH7(lastTile) \ + {.tile = LINE_V_L, .y = 14, .x = 18}, \ + {.tile = LINE_V_L_HALF, .y = 15, .x = 18}, \ + {.tile = lastTile, .y = 15, .x = 17}, -#define LINESECTION_ROUND2_MATCH8(lastSrc) \ - {.src = 0x6029, .y = 0x10, .x = 0x12}, \ - {.src = 0x6029, .y = 0x0f, .x = 0x12}, \ - {.src = lastSrc, .y = 0x0f, .x = 0x11}, +#define LINESECTION_ROUND2_MATCH8(lastTile) \ + {.tile = LINE_V_L, .y = 16, .x = 18}, \ + {.tile = LINE_V_L, .y = 15, .x = 18}, \ + {.tile = lastTile, .y = 15, .x = 17}, -#define LINESECTION_SEMIFINAL_TOP_LEFT \ - {.src = 0x6027, .y = 0x08, .x = 0x0c}, \ - {.src = 0x6027, .y = 0x09, .x = 0x0c}, \ - {.src = 0x6027, .y = 0x0a, .x = 0x0c}, \ - {.src = 0x603b, .y = 0x0b, .x = 0x0c}, +#define LINESECTION_SEMIFINAL_TOP_LEFT \ + {.tile = LINE_V_R, .y = 8, .x = 12}, \ + {.tile = LINE_V_R, .y = 9, .x = 12}, \ + {.tile = LINE_V_R, .y = 10, .x = 12}, \ + {.tile = LINE_V_R_HALF_LOGO, .y = 11, .x = 12}, -#define LINESECTION_SEMIFINAL_BOTTOM_LEFT \ - {.src = 0x6033, .y = 0x0e, .x = 0x0c}, \ - {.src = 0x6032, .y = 0x0d, .x = 0x0c}, \ - {.src = 0x6031, .y = 0x0c, .x = 0x0c}, \ - {.src = 0x6030, .y = 0x0b, .x = 0x0c}, +#define LINESECTION_SEMIFINAL_BOTTOM_LEFT \ + {.tile = LINE_V_R_LOGO4, .y = 14, .x = 12}, \ + {.tile = LINE_V_R_LOGO3, .y = 13, .x = 12}, \ + {.tile = LINE_V_R_LOGO2, .y = 12, .x = 12}, \ + {.tile = LINE_V_R_LOGO1, .y = 11, .x = 12}, -#define LINESECTION_SEMIFINAL_TOP_RIGHT \ - {.src = 0x6029, .y = 0x08, .x = 0x11}, \ - {.src = 0x6029, .y = 0x09, .x = 0x11}, \ - {.src = 0x6029, .y = 0x0a, .x = 0x11}, \ - {.src = 0x603c, .y = 0x0b, .x = 0x11}, +#define LINESECTION_SEMIFINAL_TOP_RIGHT \ + {.tile = LINE_V_L, .y = 8, .x = 17}, \ + {.tile = LINE_V_L, .y = 9, .x = 17}, \ + {.tile = LINE_V_L, .y = 10, .x = 17}, \ + {.tile = LINE_V_L_HALF_LOGO, .y = 11, .x = 17}, #define LINESECTION_SEMIFINAL_BOTTOM_RIGHT \ - {.src = 0x6038, .y = 0x0e, .x = 0x11}, \ - {.src = 0x6037, .y = 0x0d, .x = 0x11}, \ - {.src = 0x6036, .y = 0x0c, .x = 0x11}, \ - {.src = 0x6035, .y = 0x0b, .x = 0x11}, + {.tile = LINE_V_L_LOGO4, .y = 14, .x = 17}, \ + {.tile = LINE_V_L_LOGO3, .y = 13, .x = 17}, \ + {.tile = LINE_V_L_LOGO2, .y = 12, .x = 17}, \ + {.tile = LINE_V_L_LOGO1, .y = 11, .x = 17}, -#define LINESECTION_FINAL_LEFT \ - {.src = 0x602c, .y = 0x0b, .x = 0x0d}, \ - {.src = 0x602d, .y = 0x0b, .x = 0x0e}, +#define LINESECTION_FINAL_LEFT \ + {.tile = LINE_H_LOGO1, .y = 11, .x = 13}, \ + {.tile = LINE_H_LOGO2, .y = 11, .x = 14}, -#define LINESECTION_FINAL_RIGHT \ - {.src = 0x602f, .y = 0x0b, .x = 0x10}, \ - {.src = 0x602e, .y = 0x0b, .x = 0x0f}, +#define LINESECTION_FINAL_RIGHT \ + {.tile = LINE_H_LOGO4, .y = 11, .x = 16}, \ + {.tile = LINE_H_LOGO3, .y = 11, .x = 15}, static const struct TourneyTreeLineSection sLineSectionTrainer1Round1[] = { - LINESECTION_ROUND1_TRAINER1(0x6043) + LINESECTION_ROUND1_TRAINER1(LINE_CORNER_R_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer1Round2[] = { - LINESECTION_ROUND1_TRAINER1(0x6023) - LINESECTION_ROUND2_MATCH1(0x6043) + LINESECTION_ROUND1_TRAINER1(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH1(LINE_CORNER_R_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer1Semifinal[] = { - LINESECTION_ROUND1_TRAINER1(0x6023) - LINESECTION_ROUND2_MATCH1(0x6023) + LINESECTION_ROUND1_TRAINER1(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH1(LINE_CORNER_R) LINESECTION_SEMIFINAL_TOP_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer1Final[] = { - LINESECTION_ROUND1_TRAINER1(0x6023) - LINESECTION_ROUND2_MATCH1(0x6023) + LINESECTION_ROUND1_TRAINER1(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH1(LINE_CORNER_R) LINESECTION_SEMIFINAL_TOP_LEFT LINESECTION_FINAL_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer9Round1[] = { - LINESECTION_ROUND1_TRAINER9(0x6043) + LINESECTION_ROUND1_TRAINER9(LINE_CORNER_R_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer9Round2[] = { - LINESECTION_ROUND1_TRAINER9(0x6023) - LINESECTION_ROUND2_MATCH1(0x6043) + LINESECTION_ROUND1_TRAINER9(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH1(LINE_CORNER_R_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer9Semifinal[] = { - LINESECTION_ROUND1_TRAINER9(0x6023) - LINESECTION_ROUND2_MATCH1(0x6023) + LINESECTION_ROUND1_TRAINER9(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH1(LINE_CORNER_R) LINESECTION_SEMIFINAL_TOP_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer9Final[] = { - LINESECTION_ROUND1_TRAINER9(0x6023) - LINESECTION_ROUND2_MATCH1(0x6023) + LINESECTION_ROUND1_TRAINER9(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH1(LINE_CORNER_R) LINESECTION_SEMIFINAL_TOP_LEFT LINESECTION_FINAL_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer13Round1[] = { - LINESECTION_ROUND1_TRAINER13(0x6021) + LINESECTION_ROUND1_TRAINER13(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer13Round2[] = { - LINESECTION_ROUND1_TRAINER13(0x6021) - LINESECTION_ROUND2_MATCH2(0x6043) + LINESECTION_ROUND1_TRAINER13(LINE_H) + LINESECTION_ROUND2_MATCH2(LINE_CORNER_R_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer13Semifinal[] = { - LINESECTION_ROUND1_TRAINER13(0x6021) - LINESECTION_ROUND2_MATCH2(0x6023) + LINESECTION_ROUND1_TRAINER13(LINE_H) + LINESECTION_ROUND2_MATCH2(LINE_CORNER_R) LINESECTION_SEMIFINAL_TOP_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer13Final[] = { - LINESECTION_ROUND1_TRAINER13(0x6021) - LINESECTION_ROUND2_MATCH2(0x6023) + LINESECTION_ROUND1_TRAINER13(LINE_H) + LINESECTION_ROUND2_MATCH2(LINE_CORNER_R) LINESECTION_SEMIFINAL_TOP_LEFT LINESECTION_FINAL_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer5Round1[] = { - LINESECTION_ROUND1_TRAINER5(0x6021) + LINESECTION_ROUND1_TRAINER5(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer5Round2[] = { - LINESECTION_ROUND1_TRAINER5(0x6021) - LINESECTION_ROUND2_MATCH2(0x6043) + LINESECTION_ROUND1_TRAINER5(LINE_H) + LINESECTION_ROUND2_MATCH2(LINE_CORNER_R_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer5Semifinal[] = { - LINESECTION_ROUND1_TRAINER5(0x6021) - LINESECTION_ROUND2_MATCH2(0x6023) + LINESECTION_ROUND1_TRAINER5(LINE_H) + LINESECTION_ROUND2_MATCH2(LINE_CORNER_R) LINESECTION_SEMIFINAL_TOP_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer5Final[] = { - LINESECTION_ROUND1_TRAINER5(0x6021) - LINESECTION_ROUND2_MATCH2(0x6023) + LINESECTION_ROUND1_TRAINER5(LINE_H) + LINESECTION_ROUND2_MATCH2(LINE_CORNER_R) LINESECTION_SEMIFINAL_TOP_LEFT LINESECTION_FINAL_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer8Round1[] = { - LINESECTION_ROUND1_TRAINER8(0x6043) + LINESECTION_ROUND1_TRAINER8(LINE_CORNER_R_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer8Round2[] = { - LINESECTION_ROUND1_TRAINER8(0x6023) - LINESECTION_ROUND2_MATCH3(0x6021) + LINESECTION_ROUND1_TRAINER8(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH3(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer8Semifinal[] = { - LINESECTION_ROUND1_TRAINER8(0x6023) - LINESECTION_ROUND2_MATCH3(0x6021) + LINESECTION_ROUND1_TRAINER8(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH3(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer8Final[] = { - LINESECTION_ROUND1_TRAINER8(0x6023) - LINESECTION_ROUND2_MATCH3(0x6021) + LINESECTION_ROUND1_TRAINER8(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH3(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_LEFT LINESECTION_FINAL_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer16Round1[] = { - LINESECTION_ROUND1_TRAINER16(0x6043) + LINESECTION_ROUND1_TRAINER16(LINE_CORNER_R_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer16Round2[] = { - LINESECTION_ROUND1_TRAINER16(0x6023) - LINESECTION_ROUND2_MATCH3(0x6021) + LINESECTION_ROUND1_TRAINER16(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH3(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer16Semifinal[] = { - LINESECTION_ROUND1_TRAINER16(0x6023) - LINESECTION_ROUND2_MATCH3(0x6021) + LINESECTION_ROUND1_TRAINER16(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH3(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer16Final[] = { - LINESECTION_ROUND1_TRAINER16(0x6023) - LINESECTION_ROUND2_MATCH3(0x6021) + LINESECTION_ROUND1_TRAINER16(LINE_CORNER_R) + LINESECTION_ROUND2_MATCH3(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_LEFT LINESECTION_FINAL_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer12Round1[] = { - LINESECTION_ROUND1_TRAINER12(0x6021) + LINESECTION_ROUND1_TRAINER12(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer12Round2[] = { - LINESECTION_ROUND1_TRAINER12(0x6021) - LINESECTION_ROUND2_MATCH4(0x6021) + LINESECTION_ROUND1_TRAINER12(LINE_H) + LINESECTION_ROUND2_MATCH4(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer12Semifinal[] = { - LINESECTION_ROUND1_TRAINER12(0x6021) - LINESECTION_ROUND2_MATCH4(0x6021) + LINESECTION_ROUND1_TRAINER12(LINE_H) + LINESECTION_ROUND2_MATCH4(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer12Final[] = { - LINESECTION_ROUND1_TRAINER12(0x6021) - LINESECTION_ROUND2_MATCH4(0x6021) + LINESECTION_ROUND1_TRAINER12(LINE_H) + LINESECTION_ROUND2_MATCH4(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_LEFT LINESECTION_FINAL_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer4Round1[] = { - LINESECTION_ROUND1_TRAINER4(0x6021) + LINESECTION_ROUND1_TRAINER4(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer4Round2[] = { - LINESECTION_ROUND1_TRAINER4(0x6021) - LINESECTION_ROUND2_MATCH4(0x6021) + LINESECTION_ROUND1_TRAINER4(LINE_H) + LINESECTION_ROUND2_MATCH4(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer4Semifinal[] = { - LINESECTION_ROUND1_TRAINER4(0x6021) - LINESECTION_ROUND2_MATCH4(0x6021) + LINESECTION_ROUND1_TRAINER4(LINE_H) + LINESECTION_ROUND2_MATCH4(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer4Final[] = { - LINESECTION_ROUND1_TRAINER4(0x6021) - LINESECTION_ROUND2_MATCH4(0x6021) + LINESECTION_ROUND1_TRAINER4(LINE_H) + LINESECTION_ROUND2_MATCH4(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_LEFT LINESECTION_FINAL_LEFT }; static const struct TourneyTreeLineSection sLineSectionTrainer3Round1[] = { - LINESECTION_ROUND1_TRAINER3(0x6045) + LINESECTION_ROUND1_TRAINER3(LINE_CORNER_L_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer3Round2[] = { - LINESECTION_ROUND1_TRAINER3(0x6025) - LINESECTION_ROUND2_MATCH5(0x6045) + LINESECTION_ROUND1_TRAINER3(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH5(LINE_CORNER_L_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer3Semifinal[] = { - LINESECTION_ROUND1_TRAINER3(0x6025) - LINESECTION_ROUND2_MATCH5(0x6025) + LINESECTION_ROUND1_TRAINER3(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH5(LINE_CORNER_L) LINESECTION_SEMIFINAL_TOP_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer3Final[] = { - LINESECTION_ROUND1_TRAINER3(0x6025) - LINESECTION_ROUND2_MATCH5(0x6025) + LINESECTION_ROUND1_TRAINER3(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH5(LINE_CORNER_L) LINESECTION_SEMIFINAL_TOP_RIGHT LINESECTION_FINAL_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer11Round1[] = { - LINESECTION_ROUND1_TRAINER11(0x6045) + LINESECTION_ROUND1_TRAINER11(LINE_CORNER_L_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer11Round2[] = { - LINESECTION_ROUND1_TRAINER11(0x6025) - LINESECTION_ROUND2_MATCH5(0x6045) + LINESECTION_ROUND1_TRAINER11(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH5(LINE_CORNER_L_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer11Semifinal[] = { - LINESECTION_ROUND1_TRAINER11(0x6025) - LINESECTION_ROUND2_MATCH5(0x6025) + LINESECTION_ROUND1_TRAINER11(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH5(LINE_CORNER_L) LINESECTION_SEMIFINAL_TOP_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer11Final[] = { - LINESECTION_ROUND1_TRAINER11(0x6025) - LINESECTION_ROUND2_MATCH5(0x6025) + LINESECTION_ROUND1_TRAINER11(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH5(LINE_CORNER_L) LINESECTION_SEMIFINAL_TOP_RIGHT LINESECTION_FINAL_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer15Round1[] = { - LINESECTION_ROUND1_TRAINER15(0x6021) + LINESECTION_ROUND1_TRAINER15(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer15Round2[] = { - LINESECTION_ROUND1_TRAINER15(0x6021) - LINESECTION_ROUND2_MATCH6(0x6045) + LINESECTION_ROUND1_TRAINER15(LINE_H) + LINESECTION_ROUND2_MATCH6(LINE_CORNER_L_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer15Semifinal[] = { - LINESECTION_ROUND1_TRAINER15(0x6021) - LINESECTION_ROUND2_MATCH6(0x6025) + LINESECTION_ROUND1_TRAINER15(LINE_H) + LINESECTION_ROUND2_MATCH6(LINE_CORNER_L) LINESECTION_SEMIFINAL_TOP_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer15Final[] = { - LINESECTION_ROUND1_TRAINER15(0x6021) - LINESECTION_ROUND2_MATCH6(0x6025) + LINESECTION_ROUND1_TRAINER15(LINE_H) + LINESECTION_ROUND2_MATCH6(LINE_CORNER_L) LINESECTION_SEMIFINAL_TOP_RIGHT LINESECTION_FINAL_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer7Round1[] = { - LINESECTION_ROUND1_TRAINER7(0x6021) + LINESECTION_ROUND1_TRAINER7(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer7Round2[] = { - LINESECTION_ROUND1_TRAINER7(0x6021) - LINESECTION_ROUND2_MATCH6(0x6045) + LINESECTION_ROUND1_TRAINER7(LINE_H) + LINESECTION_ROUND2_MATCH6(LINE_CORNER_L_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer7Semifinal[] = { - LINESECTION_ROUND1_TRAINER7(0x6021) - LINESECTION_ROUND2_MATCH6(0x6025) + LINESECTION_ROUND1_TRAINER7(LINE_H) + LINESECTION_ROUND2_MATCH6(LINE_CORNER_L) LINESECTION_SEMIFINAL_TOP_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer7Final[] = { - LINESECTION_ROUND1_TRAINER7(0x6021) - LINESECTION_ROUND2_MATCH6(0x6025) + LINESECTION_ROUND1_TRAINER7(LINE_H) + LINESECTION_ROUND2_MATCH6(LINE_CORNER_L) LINESECTION_SEMIFINAL_TOP_RIGHT LINESECTION_FINAL_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer6Round1[] = { - LINESECTION_ROUND1_TRAINER6(0x6045) + LINESECTION_ROUND1_TRAINER6(LINE_CORNER_L_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer6Round2[] = { - LINESECTION_ROUND1_TRAINER6(0x6025) - LINESECTION_ROUND2_MATCH7(0x6021) + LINESECTION_ROUND1_TRAINER6(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH7(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer6Semifinal[] = { - LINESECTION_ROUND1_TRAINER6(0x6025) - LINESECTION_ROUND2_MATCH7(0x6021) + LINESECTION_ROUND1_TRAINER6(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH7(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer6Final[] = { - LINESECTION_ROUND1_TRAINER6(0x6025) - LINESECTION_ROUND2_MATCH7(0x6021) + LINESECTION_ROUND1_TRAINER6(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH7(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_RIGHT LINESECTION_FINAL_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer14Round1[] = { - LINESECTION_ROUND1_TRAINER14(0x6045) + LINESECTION_ROUND1_TRAINER14(LINE_CORNER_L_HALF) }; static const struct TourneyTreeLineSection sLineSectionTrainer14Round2[] = { - LINESECTION_ROUND1_TRAINER14(0x6025) - LINESECTION_ROUND2_MATCH7(0x6021) + LINESECTION_ROUND1_TRAINER14(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH7(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer14Semifinal[] = { - LINESECTION_ROUND1_TRAINER14(0x6025) - LINESECTION_ROUND2_MATCH7(0x6021) + LINESECTION_ROUND1_TRAINER14(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH7(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer14Final[] = { - LINESECTION_ROUND1_TRAINER14(0x6025) - LINESECTION_ROUND2_MATCH7(0x6021) + LINESECTION_ROUND1_TRAINER14(LINE_CORNER_L) + LINESECTION_ROUND2_MATCH7(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_RIGHT LINESECTION_FINAL_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer10Round1[] = { - LINESECTION_ROUND1_TRAINER10(0x6021) + LINESECTION_ROUND1_TRAINER10(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer10Round2[] = { - LINESECTION_ROUND1_TRAINER10(0x6021) - LINESECTION_ROUND2_MATCH8(0x6021) + LINESECTION_ROUND1_TRAINER10(LINE_H) + LINESECTION_ROUND2_MATCH8(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer10Semifinal[] = { - LINESECTION_ROUND1_TRAINER10(0x6021) - LINESECTION_ROUND2_MATCH8(0x6021) + LINESECTION_ROUND1_TRAINER10(LINE_H) + LINESECTION_ROUND2_MATCH8(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer10Final[] = { - LINESECTION_ROUND1_TRAINER10(0x6021) - LINESECTION_ROUND2_MATCH8(0x6021) + LINESECTION_ROUND1_TRAINER10(LINE_H) + LINESECTION_ROUND2_MATCH8(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_RIGHT LINESECTION_FINAL_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer2Round1[] = { - LINESECTION_ROUND1_TRAINER2(0x6021) + LINESECTION_ROUND1_TRAINER2(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer2Round2[] = { - LINESECTION_ROUND1_TRAINER2(0x6021) - LINESECTION_ROUND2_MATCH8(0x6021) + LINESECTION_ROUND1_TRAINER2(LINE_H) + LINESECTION_ROUND2_MATCH8(LINE_H) }; static const struct TourneyTreeLineSection sLineSectionTrainer2Semifinal[] = { - LINESECTION_ROUND1_TRAINER2(0x6021) - LINESECTION_ROUND2_MATCH8(0x6021) + LINESECTION_ROUND1_TRAINER2(LINE_H) + LINESECTION_ROUND2_MATCH8(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_RIGHT }; static const struct TourneyTreeLineSection sLineSectionTrainer2Final[] = { - LINESECTION_ROUND1_TRAINER2(0x6021) - LINESECTION_ROUND2_MATCH8(0x6021) + LINESECTION_ROUND1_TRAINER2(LINE_H) + LINESECTION_ROUND2_MATCH8(LINE_H) LINESECTION_SEMIFINAL_BOTTOM_RIGHT LINESECTION_FINAL_RIGHT }; @@ -2558,7 +2588,7 @@ static void CreateDomeOpponentMon(u8 monPartyId, u16 tournamentTrainerId, u8 tou #ifdef BUGFIX u8 fixedIv = GetDomeTrainerMonIvs(DOME_TRAINERS[tournamentTrainerId].trainerId); #else - u8 fixedIv = GetDomeTrainerMonIvs(tournamentTrainerId); // BUG: Using the wrong ID. As a result, all Pokemon have ivs of 3. + u8 fixedIv = GetDomeTrainerMonIvs(tournamentTrainerId); // BUG: Using the wrong ID. As a result, all Pokémon have ivs of 3. #endif u8 level = SetFacilityPtrsGetLevel(); CreateMonWithEVSpreadNatureOTID(&gEnemyParty[monPartyId], @@ -2620,13 +2650,13 @@ static void CreateDomeOpponentMons(u16 tournamentTrainerId) } } -// Returns a bitmask representing which 2 of the trainer's 3 pokemon to select. +// Returns a bitmask representing which 2 of the trainer's 3 Pokémon to select. // The choice is calculated solely depending on the type effectiveness of their -// movesets against the player's pokemon. +// movesets against the player's Pokémon. // There is a 50% chance of either a "good" or "bad" selection mode being used. // In the good mode movesets are preferred which are more effective against the -// player, and in the bad mode the opposite is true. If all 3 pokemon tie, the -// other mode will be tried. If they tie again, the pokemon selection is random. +// player, and in the bad mode the opposite is true. If all 3 Pokémon tie, the +// other mode will be tried. If they tie again, the Pokémon selection is random. int GetDomeTrainerSelectedMons(u16 tournamentTrainerId) { int selectedMonBits; @@ -2990,7 +3020,7 @@ static void SetDomeOpponentGraphicsId(void) static void SaveDomeChallenge(void) { gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; - VarSet(VAR_TEMP_0, 0); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; SaveGameFrontier(); } @@ -4807,7 +4837,7 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo) if (lost[1]) gSprites[sInfoCard->spriteIds[1 + arrId]].oam.paletteNum = 3; - // Draw left trainer's pokemon icons. + // Draw left trainer's Pokémon icons. for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { if (trainerIds[0] == TRAINER_PLAYER) @@ -4847,7 +4877,7 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo) } } - // Draw right trainer's pokemon icons. + // Draw right trainer's Pokémon icons. for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { if (trainerIds[1] == TRAINER_PLAYER) @@ -5198,7 +5228,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun int movePower = 0; SetFacilityPtrsGetLevel(); - // Calc move points of all 4 moves for all 3 pokemon hitting all 3 target mons. + // Calc move points of all 4 moves for all 3 Pokémon hitting all 3 target mons. for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { for (j = 0; j < MAX_MON_MOVES; j++) @@ -5538,7 +5568,7 @@ static void DrawTourneyAdvancementLine(u8 tournamentId, u8 roundId) const struct TourneyTreeLineSection *lineSection = sTourneyTreeLineSections[tournamentId][roundId]; for (i = 0; i < sTourneyTreeLineSectionArrayCounts[tournamentId][roundId]; i++) - CopyToBgTilemapBufferRect_ChangePalette(1, &lineSection[i].src, lineSection[i].x, lineSection[i].y, 1, 1, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, &lineSection[i].tile, lineSection[i].x, lineSection[i].y, 1, 1, 17); CopyBgTilemapBufferToVram(1); } diff --git a/src/battle_factory.c b/src/battle_factory.c index eac9f0403e..faed16ebb0 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -269,7 +269,7 @@ static void SetBattleFactoryData(void) static void SaveFactoryChallenge(void) { gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; - VarSet(VAR_TEMP_0, 0); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; SaveGameFrontier(); } @@ -337,7 +337,7 @@ static void GenerateOpponentMons(void) if (gFacilityTrainerMons[monId].species == SPECIES_UNOWN) continue; - // Ensure none of the opponent's pokemon are the same as the potential rental pokemon for the player + // Ensure none of the opponent's Pokémon are the same as the potential rental Pokémon for the player for (j = 0; j < (int)ARRAY_COUNT(gSaveBlock2Ptr->frontier.rentalMons); j++) { if (gFacilityTrainerMons[monId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.rentalMons[j].monId].species) @@ -346,7 +346,7 @@ static void GenerateOpponentMons(void) if (j != (int)ARRAY_COUNT(gSaveBlock2Ptr->frontier.rentalMons)) continue; - // "High tier" pokemon are only allowed on open level mode + // "High tier" Pokémon are only allowed on open level mode if (lvlMode == FRONTIER_LVL_50 && monId > FRONTIER_MONS_HIGH_TIER) continue; @@ -525,13 +525,13 @@ static void GenerateInitialRentalMons(void) gFacilityTrainers = gBattleFrontierTrainers; for (i = 0; i < PARTY_SIZE; i++) { - species[i] = 0; + species[i] = SPECIES_NONE; monIds[i] = 0; - heldItems[i] = 0; + heldItems[i] = ITEM_NONE; } lvlMode = gSaveBlock2Ptr->frontier.lvlMode; battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; + challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / FRONTIER_STAGES_PER_CHALLENGE; if (VarGet(VAR_FRONTIER_BATTLE_MODE) == FRONTIER_MODE_DOUBLES) factoryBattleMode = FRONTIER_MODE_DOUBLES; else @@ -554,7 +554,7 @@ static void GenerateInitialRentalMons(void) i = 0; while (i != PARTY_SIZE) { - if (i < rentalRank) // The more times the player has rented, the more initial rentals are generated from a better set of pokemon + if (i < rentalRank) // The more times the player has rented, the more initial rentals are generated from a better set of Pokémon monId = GetFactoryMonId(factoryLvlMode, challengeNum, TRUE); else monId = GetFactoryMonId(factoryLvlMode, challengeNum, FALSE); @@ -562,7 +562,7 @@ static void GenerateInitialRentalMons(void) if (gFacilityTrainerMons[monId].species == SPECIES_UNOWN) continue; - // Cannot have two pokemon of the same species. + // Cannot have two Pokémon of the same species. for (j = firstMonId; j < firstMonId + i; j++) { u16 existingMonId = monIds[j]; @@ -582,7 +582,7 @@ static void GenerateInitialRentalMons(void) // Cannot have two same held items. for (j = firstMonId; j < firstMonId + i; j++) { - if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]) + if (heldItems[j] != ITEM_NONE && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]) { if (gFacilityTrainerMons[monId].species == currSpecies) currSpecies = SPECIES_NONE; @@ -741,8 +741,15 @@ u8 GetFactoryMonFixedIV(u8 challengeNum, bool8 isLastBattle) u8 ivSet; bool8 useHigherIV = isLastBattle ? TRUE : FALSE; - if (challengeNum > 8) - ivSet = 7; +// The Factory has an out-of-bounds access when generating the rental draft for round 9 (challengeNum==8), +// or the "elevated" rentals from round 8 (challengeNum+1==8) +// This happens to land on a number higher than 31, which is interpreted as "random IVs" +#ifdef BUGFIX + if (challengeNum >= ARRAY_COUNT(sFixedIVTable)) +#else + if (challengeNum > ARRAY_COUNT(sFixedIVTable)) +#endif + ivSet = ARRAY_COUNT(sFixedIVTable) - 1; else ivSet = challengeNum; @@ -761,7 +768,7 @@ void FillFactoryBrainParty(void) u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; + u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / FRONTIER_STAGES_PER_CHALLENGE; fixedIV = GetFactoryMonFixedIV(challengeNum + 2, FALSE); monLevel = SetFacilityPtrsGetLevel(); i = 0; @@ -890,7 +897,7 @@ u32 GetAiScriptsInBattleFactory(void) else { int battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - int challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; + int challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / FRONTIER_STAGES_PER_CHALLENGE; if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) return AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY; diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c index 16f702c72c..0533d1e2a3 100644 --- a/src/battle_factory_screen.c +++ b/src/battle_factory_screen.c @@ -28,21 +28,25 @@ #include "strings.h" #include "graphics.h" #include "constants/battle_frontier.h" +#include "constants/battle_tent.h" #include "constants/songs.h" #include "constants/rgb.h" -// Select_ refers to the first Pokemon selection screen where you choose your initial 3 rental Pokemon. -// Swap_ refers to the subsequent selection screens where you can swap a Pokemon with one from the beaten trainer +// Select_ refers to the first Pokémon selection screen where you choose your initial 3 rental Pokémon. +// Swap_ refers to the subsequent selection screens where you can swap a Pokémon with one from the beaten trainer // Note that, generally, "Action" will refer to the immediate actions that can be taken on each screen, -// i.e. selecting a pokemon or selecting the Cancel button +// i.e. selecting a Pokémon or selecting the Cancel button // The "Options menu" will refer to the popup menu that shows when some actions have been selected -#define SWAP_PLAYER_SCREEN 0 // The screen where the player selects which of their pokemon to swap away -#define SWAP_ENEMY_SCREEN 1 // The screen where the player selects which new pokemon from the defeated party to swap for +#define SWAP_PLAYER_SCREEN 0 // The screen where the player selects which of their Pokémon to swap away +#define SWAP_ENEMY_SCREEN 1 // The screen where the player selects which new Pokémon from the defeated party to swap for #define SELECTABLE_MONS_COUNT 6 +#define PALNUM_FADE_TEXT 14 +#define PALNUM_TEXT 15 + enum { PALTAG_BALL_GRAY = 100, PALTAG_BALL_SELECTED, @@ -85,7 +89,7 @@ struct FactorySelectableMon { u16 monId; u16 ballSpriteId; - u8 selectedId; // 0 - not selected, 1 - first pokemon, 2 - second pokemon, 3 - third pokemon + u8 selectedId; // 0 - not selected, 1 - first Pokémon, 2 - second Pokémon, 3 - third Pokémon struct Pokemon monData; }; @@ -268,7 +272,7 @@ static const u8 sActionHighlightMiddle_Gfx[] = INCBIN_U8( "graphics/battle_front static const u8 sActionHighlightRight_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/action_highlight_right.4bpp"); static const u8 sMonPicBgAnim_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/mon_pic_bg_anim.4bpp"); static const u8 sMonPicBg_Tilemap[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/mon_pic_bg.bin"); -static const u8 sMonPicBg_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/mon_pic_bg.4bpp"); +static const u16 sMonPicBg_Gfx[] = INCBIN_U16("graphics/battle_frontier/factory_screen/mon_pic_bg.4bpp"); static const u16 sMonPicBg_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_screen/mon_pic_bg.gbapal"); static const struct SpriteSheet sSelect_SpriteSheets[] = @@ -350,7 +354,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .tilemapTop = 2, .width = 12, .height = 2, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x0001, }, [SELECT_WIN_SPECIES] = { @@ -359,7 +363,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .tilemapTop = 2, .width = 11, .height = 2, - .paletteNum = 14, + .paletteNum = PALNUM_FADE_TEXT, .baseBlock = 0x0019, }, [SELECT_WIN_INFO] = { @@ -368,7 +372,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .tilemapTop = 15, .width = 20, .height = 3, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x002f, }, [SELECT_WIN_OPTIONS] = { @@ -377,7 +381,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .tilemapTop = 14, .width = 8, .height = 6, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x006b, }, [SELECT_WIN_YES_NO] = { @@ -386,7 +390,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .tilemapTop = 14, .width = 8, .height = 4, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x009b, }, [SELECT_WIN_MON_CATEGORY] = { @@ -395,7 +399,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .tilemapTop = 0, .width = 15, .height = 2, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x00bb, }, DUMMY_WIN_TEMPLATE, @@ -634,7 +638,11 @@ static const struct SpriteSheet sSwap_SpriteSheets[] = {sMenuHighlightRight_Gfx, sizeof(sMenuHighlightRight_Gfx), GFXTAG_MENU_HIGHLIGHT_RIGHT}, {sActionBoxLeft_Gfx, sizeof(sActionBoxLeft_Gfx), GFXTAG_ACTION_BOX_LEFT}, {sActionBoxRight_Gfx, sizeof(sActionBoxRight_Gfx), GFXTAG_ACTION_BOX_RIGHT}, - {sActionHighlightLeft_Gfx, 0x100, GFXTAG_ACTION_HIGHLIGHT_LEFT}, +#ifdef BUGFIX + {sActionHighlightLeft_Gfx, sizeof(sActionHighlightLeft_Gfx), GFXTAG_ACTION_HIGHLIGHT_LEFT}, +#else + {sActionHighlightLeft_Gfx, 8 * TILE_SIZE_4BPP, /* Incorrect size */ GFXTAG_ACTION_HIGHLIGHT_LEFT}, +#endif {sActionHighlightMiddle_Gfx, sizeof(sActionHighlightMiddle_Gfx), GFXTAG_ACTION_HIGHLIGHT_MIDDLE}, {sActionHighlightRight_Gfx, sizeof(sActionHighlightRight_Gfx), GFXTAG_ACTION_HIGHLIGHT_RIGHT}, {sMonPicBgAnim_Gfx, sizeof(sMonPicBgAnim_Gfx), GFXTAG_MON_PIC_BG_ANIM}, @@ -945,7 +953,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .tilemapTop = 2, .width = 12, .height = 2, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x0001, }, [SWAP_WIN_SPECIES] = { @@ -954,7 +962,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .tilemapTop = 2, .width = 11, .height = 2, - .paletteNum = 14, + .paletteNum = PALNUM_FADE_TEXT, .baseBlock = 0x0019, }, [SWAP_WIN_INFO] = { @@ -963,7 +971,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .tilemapTop = 15, .width = 20, .height = 3, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x002f, }, [SWAP_WIN_OPTIONS] = { @@ -972,7 +980,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .tilemapTop = 14, .width = 9, .height = 6, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x006b, }, [SWAP_WIN_YES_NO] = { @@ -981,7 +989,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .tilemapTop = 14, .width = 8, .height = 4, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x00a1, }, [SWAP_WIN_ACTION_FADE] = { @@ -990,7 +998,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .tilemapTop = 15, .width = 9, .height = 5, - .paletteNum = 14, + .paletteNum = PALNUM_FADE_TEXT, .baseBlock = 0x006b, }, [SWAP_WIN_UNUSED] = { @@ -999,7 +1007,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .tilemapTop = 2, .width = 4, .height = 2, - .paletteNum = 14, + .paletteNum = PALNUM_FADE_TEXT, .baseBlock = 0x00c1, }, [SWAP_WIN_SPECIES_AT_FADE] = { @@ -1008,7 +1016,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .tilemapTop = 2, .width = 11, .height = 2, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x00c9, }, [SWAP_WIN_MON_CATEGORY] = { @@ -1017,7 +1025,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .tilemapTop = 0, .width = 15, .height = 2, - .paletteNum = 15, + .paletteNum = PALNUM_TEXT, .baseBlock = 0x00df, }, DUMMY_WIN_TEMPLATE, @@ -1052,7 +1060,7 @@ static void SpriteCB_Pokeball(struct Sprite *sprite) { if (sprite->oam.paletteNum == IndexOfSpritePaletteTag(PALTAG_BALL_SELECTED)) { - // Pokeball selected, do rocking animation + // Poké Ball selected, do rocking animation if (sprite->animEnded) { if (sprite->data[0] != 0) @@ -1076,7 +1084,7 @@ static void SpriteCB_Pokeball(struct Sprite *sprite) } else { - // Pokeball not selected, remain still + // Poké Ball not selected, remain still StartSpriteAnimIfDifferent(sprite, 0); } } @@ -1142,8 +1150,12 @@ static void CB2_InitSelectScreen(void) gMain.state++; break; case 1: - sSelectMenuTilesetBuffer = Alloc(0x440); - sSelectMonPicBgTilesetBuffer = AllocZeroed(0x440); + sSelectMenuTilesetBuffer = Alloc(sizeof(gFrontierFactoryMenu_Gfx)); +#ifdef BUGFIX + sSelectMonPicBgTilesetBuffer = AllocZeroed(sizeof(sMonPicBg_Gfx)); +#else + sSelectMonPicBgTilesetBuffer = AllocZeroed(sizeof(gFrontierFactoryMenu_Gfx)); // Incorrect size +#endif sSelectMenuTilemapBuffer = Alloc(BG_SCREEN_SIZE); sSelectMonPicBgTilemapBuffer = AllocZeroed(BG_SCREEN_SIZE); ChangeBgX(0, 0, BG_COORD_SET); @@ -1169,21 +1181,21 @@ static void CB2_InitSelectScreen(void) ResetSpriteData(); ResetTasks(); FreeAllSpritePalettes(); - CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSelectMenuTilesetBuffer, 0x440); - CpuCopy16(sMonPicBg_Gfx, sSelectMonPicBgTilesetBuffer, 0x60); - LoadBgTiles(1, sSelectMenuTilesetBuffer, 0x440, 0); - LoadBgTiles(3, sSelectMonPicBgTilesetBuffer, 0x60, 0); - CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSelectMenuTilemapBuffer, BG_SCREEN_SIZE); + CpuCopy16(gFrontierFactoryMenu_Gfx, sSelectMenuTilesetBuffer, sizeof(gFrontierFactoryMenu_Gfx)); + CpuCopy16(sMonPicBg_Gfx, sSelectMonPicBgTilesetBuffer, sizeof(sMonPicBg_Gfx)); + LoadBgTiles(1, sSelectMenuTilesetBuffer, sizeof(gFrontierFactoryMenu_Gfx), 0); + LoadBgTiles(3, sSelectMonPicBgTilesetBuffer, sizeof(sMonPicBg_Gfx), 0); + CpuCopy16(gFrontierFactoryMenu_Tilemap, sSelectMenuTilemapBuffer, BG_SCREEN_SIZE); LoadBgTilemap(1, sSelectMenuTilemapBuffer, BG_SCREEN_SIZE, 0); - LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 2 * PLTT_SIZE_4BPP); - LoadPalette(sSelectText_Pal, BG_PLTT_ID(15), PLTT_SIZEOF(4)); - LoadPalette(sSelectText_Pal, BG_PLTT_ID(14), PLTT_SIZEOF(5)); + LoadPalette(gFrontierFactoryMenu_Pal, 0, 2 * PLTT_SIZE_4BPP); + LoadPalette(sSelectText_Pal, BG_PLTT_ID(PALNUM_TEXT), PLTT_SIZEOF(4)); + LoadPalette(sSelectText_Pal, BG_PLTT_ID(PALNUM_FADE_TEXT), PLTT_SIZEOF(5)); #ifdef UBFIX if (sFactorySelectScreen && sFactorySelectScreen->fromSummaryScreen) #else if (sFactorySelectScreen->fromSummaryScreen == TRUE) #endif - gPlttBufferUnfaded[228] = sFactorySelectScreen->speciesNameColorBackup; + gPlttBufferUnfaded[BG_PLTT_ID(PALNUM_FADE_TEXT) + 4] = sFactorySelectScreen->speciesNameColorBackup; LoadPalette(sMonPicBg_Pal, BG_PLTT_ID(2), PLTT_SIZEOF(2)); gMain.state++; break; @@ -1449,7 +1461,7 @@ static void Select_Task_OpenSummaryScreen(u8 taskId) switch (gTasks[taskId].tState) { case STATE_SUMMARY_FADE: - gPlttBufferUnfaded[228] = gPlttBufferFaded[228]; + gPlttBufferUnfaded[BG_PLTT_ID(PALNUM_FADE_TEXT) + 4] = gPlttBufferFaded[BG_PLTT_ID(PALNUM_FADE_TEXT) + 4]; BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].tState = STATE_SUMMARY_CLEAN; break; @@ -1468,7 +1480,7 @@ static void Select_Task_OpenSummaryScreen(u8 taskId) } break; case STATE_SUMMARY_SHOW: - sFactorySelectScreen->speciesNameColorBackup = gPlttBufferUnfaded[228]; + sFactorySelectScreen->speciesNameColorBackup = gPlttBufferUnfaded[BG_PLTT_ID(PALNUM_FADE_TEXT) + 4]; DestroyTask(taskId); sFactorySelectScreen->fromSummaryScreen = TRUE; currMonId = sFactorySelectScreen->cursorPos; @@ -1509,7 +1521,7 @@ static void Select_Task_Exit(u8 taskId) } } -// Handles the Yes/No prompt when confirming the 3 selected rental pokemon +// Handles the Yes/No prompt when confirming the 3 selected rental Pokémon static void Select_Task_HandleYesNo(u8 taskId) { if (sFactorySelectScreen->monPicAnimating == TRUE) @@ -1531,14 +1543,14 @@ static void Select_Task_HandleYesNo(u8 taskId) PlaySE(SE_SELECT); if (sFactorySelectScreen->yesNoCursorPos == 0) { - // Selected Yes, confirmed selected pokemon + // Selected Yes, confirmed selected Pokémon Select_HideChosenMons(); gTasks[taskId].tState = 0; gTasks[taskId].func = Select_Task_Exit; } else { - // Selected No, continue choosing pokemon + // Selected No, continue choosing Pokémon Select_ErasePopupMenu(SELECT_WIN_YES_NO); Select_DeclineChosenMons(); sFactorySelectScreen->fadeSpeciesNameActive = TRUE; @@ -1548,7 +1560,7 @@ static void Select_Task_HandleYesNo(u8 taskId) } else if (JOY_NEW(B_BUTTON)) { - // Pressed B, Continue choosing pokemon + // Pressed B, Continue choosing Pokémon PlaySE(SE_SELECT); Select_ErasePopupMenu(SELECT_WIN_YES_NO); Select_DeclineChosenMons(); @@ -1570,7 +1582,7 @@ static void Select_Task_HandleYesNo(u8 taskId) } } -// Handles the popup menu that shows when a pokemon is selected +// Handles the popup menu that shows when a Pokémon is selected static void Select_Task_HandleMenu(u8 taskId) { switch (gTasks[taskId].tState) @@ -1641,8 +1653,8 @@ static void Select_Task_HandleMenu(u8 taskId) { if (sFactorySelectScreen->fromSummaryScreen == TRUE) { - gPlttBufferFaded[228] = sFactorySelectScreen->speciesNameColorBackup; - gPlttBufferUnfaded[228] = gPlttBufferUnfaded[244]; + gPlttBufferFaded[BG_PLTT_ID(PALNUM_FADE_TEXT) + 4] = sFactorySelectScreen->speciesNameColorBackup; + gPlttBufferUnfaded[BG_PLTT_ID(PALNUM_FADE_TEXT) + 4] = gPlttBufferUnfaded[BG_PLTT_ID(PALNUM_TEXT) + 4]; } sFactorySelectScreen->fromSummaryScreen = FALSE; gTasks[taskId].tState = STATE_MENU_HANDLE_INPUT; @@ -1735,9 +1747,9 @@ static void CreateFrontierFactorySelectableMons(u8 firstMonId) gFacilityTrainerMons = gBattleFrontierMons; if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50) - level = 100; + level = FRONTIER_MAX_LEVEL_OPEN; else - level = 50; + level = FRONTIER_MAX_LEVEL_50; rentalRank = GetNumPastRentalsRank(battleMode, lvlMode); otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId); @@ -1769,7 +1781,7 @@ static void CreateSlateportTentSelectableMons(u8 firstMonId) { u8 i, j; u8 ivs = 0; - u8 level = 30; + u8 level = TENT_MIN_LEVEL; u8 friendship = 0; u32 otId = 0; @@ -1993,7 +2005,7 @@ static void Select_PrintMonCategory(void) FillWindowPixelBuffer(SELECT_WIN_MON_CATEGORY, PIXEL_FILL(0)); species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL); CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text); - x = GetStringRightAlignXOffset(FONT_NORMAL, text, 0x76); + x = GetStringRightAlignXOffset(FONT_NORMAL, text, 118); AddTextPrinterParameterized(SELECT_WIN_MON_CATEGORY, FONT_NORMAL, text, x, 1, 0, NULL); CopyWindowToVram(SELECT_WIN_MON_CATEGORY, COPYWIN_GFX); } @@ -2290,7 +2302,7 @@ static void Select_Task_FadeSpeciesName(u8 taskId) else sFactorySelectScreen->fadeSpeciesNameCoeff++; } - BlendPalettes(0x4000, sFactorySelectScreen->fadeSpeciesNameCoeff, 0); + BlendPalettes(1 << PALNUM_FADE_TEXT, sFactorySelectScreen->fadeSpeciesNameCoeff, 0); if (sFactorySelectScreen->fadeSpeciesNameCoeff > 5) { sFactorySelectScreen->fadeSpeciesNameFadeOut = FALSE; @@ -2388,7 +2400,7 @@ static void Swap_Task_OpenSummaryScreen(u8 taskId) case STATE_SUMMARY_SHOW: DestroyTask(taskId); sFactorySwapScreen->fromSummaryScreen = TRUE; - sFactorySwapScreen->speciesNameColorBackup = gPlttBufferUnfaded[244]; + sFactorySwapScreen->speciesNameColorBackup = gPlttBufferUnfaded[BG_PLTT_ID(PALNUM_TEXT) + 4]; ShowPokemonSummaryScreen(SUMMARY_MODE_NORMAL, gPlayerParty, sFactorySwapScreen->cursorPos, FRONTIER_PARTY_SIZE - 1, CB2_InitSwapScreen); break; } @@ -2403,7 +2415,7 @@ static void Swap_Task_Exit(u8 taskId) { case 0: // Set return value for script - // TRUE if player kept their current pokemon + // TRUE if player kept their current Pokémon if (sFactorySwapScreen->monSwapped == TRUE) { gTasks[taskId].tState++; @@ -2618,7 +2630,7 @@ static void Swap_Task_HandleMenu(u8 taskId) } } -// Handles input on the two main swap screens (choosing a current pokeon to get rid of, and choosing a new pokemon to receive) +// Handles input on the two main swap screens (choosing a current pokeon to get rid of, and choosing a new Pokémon to receive) static void Swap_Task_HandleChooseMons(u8 taskId) { switch (gTasks[taskId].tState) @@ -2633,7 +2645,7 @@ static void Swap_Task_HandleChooseMons(u8 taskId) case STATE_CHOOSE_MONS_HANDLE_INPUT: if (JOY_NEW(A_BUTTON)) { - // Run whatever action is currently selected (a pokeball, the Cancel button, etc.) + // Run whatever action is currently selected (a Poké Ball, the Cancel button, etc.) PlaySE(SE_SELECT); sFactorySwapScreen->fadeSpeciesNameActive = FALSE; Swap_PrintMonSpeciesAtFade(); @@ -2709,7 +2721,7 @@ static void Swap_Task_FadeSpeciesName(u8 taskId) else sFactorySwapScreen->fadeSpeciesNameCoeff++; } - BlendPalettes(0x4000, sFactorySwapScreen->fadeSpeciesNameCoeff, 0); + BlendPalettes(1 << PALNUM_FADE_TEXT, sFactorySwapScreen->fadeSpeciesNameCoeff, 0); if (sFactorySwapScreen->fadeSpeciesNameCoeff > 5) { sFactorySwapScreen->fadeSpeciesNameFadeOut = FALSE; @@ -2748,7 +2760,7 @@ static void Swap_Task_FadeOutSpeciesName(u8 taskId) gTasks[taskId].tState++; break; case 1: - LoadPalette(&gPlttBufferUnfaded[BG_PLTT_ID(15)], BG_PLTT_ID(14), PLTT_SIZEOF(5)); + LoadPalette(&gPlttBufferUnfaded[BG_PLTT_ID(PALNUM_TEXT)], BG_PLTT_ID(PALNUM_FADE_TEXT), PLTT_SIZEOF(5)); gTasks[taskId].tState++; break; case 2: @@ -2761,10 +2773,10 @@ static void Swap_Task_FadeOutSpeciesName(u8 taskId) if (sFactorySwapScreen->fadeSpeciesNameCoeffDelay > 3) { sFactorySwapScreen->fadeSpeciesNameCoeffDelay = 0; - gPlttBufferUnfaded[244] = gPlttBufferFaded[228]; + gPlttBufferUnfaded[BG_PLTT_ID(PALNUM_TEXT) + 4] = gPlttBufferFaded[BG_PLTT_ID(PALNUM_FADE_TEXT) + 4]; sFactorySwapScreen->fadeSpeciesNameCoeff++; } - BlendPalettes(0x4000, sFactorySwapScreen->fadeSpeciesNameCoeff, 0); + BlendPalettes(1 << PALNUM_FADE_TEXT, sFactorySwapScreen->fadeSpeciesNameCoeff, 0); break; } } @@ -2994,7 +3006,7 @@ static void Swap_Task_ScreenInfoTransitionOut(u8 taskId) switch (gTasks[taskId].tState) { case 0: - LoadPalette(sSwapText_Pal, BG_PLTT_ID(14), sizeof(sSwapText_Pal)); + LoadPalette(sSwapText_Pal, BG_PLTT_ID(PALNUM_FADE_TEXT), sizeof(sSwapText_Pal)); Swap_PrintActionStrings(); PutWindowTilemap(SWAP_WIN_ACTION_FADE); gTasks[taskId].tState++; @@ -3004,7 +3016,7 @@ static void Swap_Task_ScreenInfoTransitionOut(u8 taskId) gTasks[taskId].tState++; break; case 2: - BeginNormalPaletteFade(0x4000, 0, 0, 16, sPokeballGray_Pal[37]); + BeginNormalPaletteFade(1 << PALNUM_FADE_TEXT, 0, 0, 16, sPokeballGray_Pal[37]); gTasks[taskId].tState++; break; case 3: @@ -3125,14 +3137,14 @@ static void Swap_Task_ScreenInfoTransitionIn(u8 taskId) if (gTasks[taskId].tSlideFinishedPkmn == TRUE && gTasks[taskId].tSlideFinishedCancel == TRUE) { - gPlttBufferFaded[226] = sPokeballGray_Pal[37]; + gPlttBufferFaded[BG_PLTT_ID(PALNUM_FADE_TEXT) + 2] = sPokeballGray_Pal[37]; Swap_PrintActionStrings(); PutWindowTilemap(SWAP_WIN_ACTION_FADE); gTasks[taskId].tState++; } break; case 3: - BeginNormalPaletteFade(0x4000, 0, 16, 0, sPokeballGray_Pal[37]); + BeginNormalPaletteFade(1 << PALNUM_FADE_TEXT, 0, 16, 0, sPokeballGray_Pal[37]); gTasks[taskId].tState++; break; case 4: @@ -3275,8 +3287,12 @@ static void CB2_InitSwapScreen(void) gMain.state++; break; case 1: - sSwapMenuTilesetBuffer = Alloc(0x440); - sSwapMonPicBgTilesetBuffer = AllocZeroed(0x440); + sSwapMenuTilesetBuffer = Alloc(sizeof(gFrontierFactoryMenu_Gfx)); +#ifdef BUGFIX + sSwapMonPicBgTilesetBuffer = AllocZeroed(sizeof(sMonPicBg_Gfx)); +#else + sSwapMonPicBgTilesetBuffer = AllocZeroed(sizeof(gFrontierFactoryMenu_Gfx)); // Incorrect size +#endif sSwapMenuTilemapBuffer = Alloc(BG_SCREEN_SIZE); sSwapMonPicBgTilemapBuffer = AllocZeroed(BG_SCREEN_SIZE); ChangeBgX(0, 0, BG_COORD_SET); @@ -3303,15 +3319,15 @@ static void CB2_InitSwapScreen(void) ResetTasks(); FreeAllSpritePalettes(); ResetAllPicSprites(); - CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSwapMenuTilesetBuffer, 0x440); - CpuCopy16(sMonPicBg_Gfx, sSwapMonPicBgTilesetBuffer, 0x60); - LoadBgTiles(1, sSwapMenuTilesetBuffer, 0x440, 0); - LoadBgTiles(3, sSwapMonPicBgTilesetBuffer, 0x60, 0); - CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSwapMenuTilemapBuffer, BG_SCREEN_SIZE); + CpuCopy16(gFrontierFactoryMenu_Gfx, sSwapMenuTilesetBuffer, sizeof(gFrontierFactoryMenu_Gfx)); + CpuCopy16(sMonPicBg_Gfx, sSwapMonPicBgTilesetBuffer, sizeof(sMonPicBg_Gfx)); + LoadBgTiles(1, sSwapMenuTilesetBuffer, sizeof(gFrontierFactoryMenu_Gfx), 0); + LoadBgTiles(3, sSwapMonPicBgTilesetBuffer, sizeof(sMonPicBg_Gfx), 0); + CpuCopy16(gFrontierFactoryMenu_Tilemap, sSwapMenuTilemapBuffer, BG_SCREEN_SIZE); LoadBgTilemap(1, sSwapMenuTilemapBuffer, BG_SCREEN_SIZE, 0); - LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 2 * PLTT_SIZE_4BPP); - LoadPalette(sSwapText_Pal, BG_PLTT_ID(15), sizeof(sSwapText_Pal)); - LoadPalette(sSwapText_Pal, BG_PLTT_ID(14), sizeof(sSwapText_Pal)); + LoadPalette(gFrontierFactoryMenu_Pal, 0, 2 * PLTT_SIZE_4BPP); + LoadPalette(sSwapText_Pal, BG_PLTT_ID(PALNUM_TEXT), sizeof(sSwapText_Pal)); + LoadPalette(sSwapText_Pal, BG_PLTT_ID(PALNUM_FADE_TEXT), sizeof(sSwapText_Pal)); LoadPalette(sMonPicBg_Pal, BG_PLTT_ID(2), PLTT_SIZEOF(2)); gMain.state++; break; @@ -3537,7 +3553,7 @@ static void Swap_HandleActionCursorChange(u8 cursorId) { if (cursorId < FRONTIER_PARTY_SIZE) { - // Cursor is on one of the pokemon + // Cursor is on one of the Pokémon gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE; Swap_HideActionButtonHighlights(); gSprites[sFactorySwapScreen->cursorSpriteId].x = gSprites[sFactorySwapScreen->ballSpriteIds[cursorId]].x; @@ -3808,7 +3824,7 @@ static void Swap_PrintYesNoOptions(void) static void Swap_PrintActionString(const u8 *str, u32 y, u32 windowId) { - s32 x = GetStringRightAlignXOffset(FONT_SMALL, str, 0x46); + s32 x = GetStringRightAlignXOffset(FONT_SMALL, str, 70); AddTextPrinterParameterized3(windowId, FONT_SMALL, x, y, sSwapMenuOptionsTextColors, 0, str); } @@ -3864,10 +3880,10 @@ static void Swap_PrintMonSpeciesAtFade(void) CpuCopy16(sSwapText_Pal, pal, 8); if (!sFactorySwapScreen->fromSummaryScreen) - pal[4] = gPlttBufferFaded[228]; + pal[4] = gPlttBufferFaded[BG_PLTT_ID(PALNUM_FADE_TEXT) + 4]; else pal[4] = sFactorySwapScreen->speciesNameColorBackup; - LoadPalette(pal, BG_PLTT_ID(15), sizeof(sSwapText_Pal)); + LoadPalette(pal, BG_PLTT_ID(PALNUM_TEXT), sizeof(sSwapText_Pal)); PutWindowTilemap(SWAP_WIN_SPECIES_AT_FADE); FillWindowPixelBuffer(SWAP_WIN_SPECIES_AT_FADE, PIXEL_FILL(0)); @@ -3895,8 +3911,8 @@ static void Swap_PrintMonSpeciesForTransition(void) u16 species; u8 x; - LoadPalette(sSwapText_Pal, BG_PLTT_ID(14), sizeof(sSwapText_Pal)); - CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(15)], &gPlttBufferFaded[BG_PLTT_ID(14)], PLTT_SIZEOF(5)); + LoadPalette(sSwapText_Pal, BG_PLTT_ID(PALNUM_FADE_TEXT), sizeof(sSwapText_Pal)); + CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(PALNUM_TEXT)], &gPlttBufferFaded[BG_PLTT_ID(PALNUM_FADE_TEXT)], PLTT_SIZEOF(5)); if (sFactorySwapScreen->cursorPos >= FRONTIER_PARTY_SIZE) { @@ -3936,7 +3952,7 @@ static void Swap_PrintMonCategory(void) else species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text); - x = GetStringRightAlignXOffset(FONT_NORMAL, text, 0x76); + x = GetStringRightAlignXOffset(FONT_NORMAL, text, 118); AddTextPrinterParameterized(SWAP_WIN_MON_CATEGORY, FONT_NORMAL, text, x, 1, 0, NULL); CopyWindowToVram(SWAP_WIN_MON_CATEGORY, COPYWIN_GFX); } diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 0b5796487c..a17ebcb5ab 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -105,7 +105,7 @@ void FreeBattleSpritesData(void) FREE_AND_SET_NULL(gBattleSpritesDataPtr); } -// Pokemon chooses move to use in Battle Palace rather than player +// Pokémon chooses move to use in Battle Palace rather than player u16 ChooseMoveAndTargetInBattlePalace(void) { s32 i, var1, var2; @@ -121,9 +121,9 @@ u16 ChooseMoveAndTargetInBattlePalace(void) #define selectedGroup percent #define selectedMoves var2 #define moveTarget var1 - #define validMoveFlags var1 - #define numValidMoveGroups var2 - #define validMoveGroup var2 + #define numMovesPerGroup var1 + #define numMultipleMoveGroups var2 + #define randSelectGroup var2 // If battler is < 50% HP and not asleep, use second set of move group likelihoods // otherwise use first set @@ -157,45 +157,60 @@ u16 ChooseMoveAndTargetInBattlePalace(void) // Pass selected moves to AI, pick one if (selectedMoves != 0) { - gBattleStruct->palaceFlags &= 0xF; - gBattleStruct->palaceFlags |= (selectedMoves << 4); + // Lower 4 bits of palaceFlags are flags for each battler. + // Clear the rest of palaceFlags, then set the selected moves in the upper 4 bits. + gBattleStruct->palaceFlags &= (1 << MAX_BATTLERS_COUNT) - 1; + gBattleStruct->palaceFlags |= (selectedMoves << MAX_BATTLERS_COUNT); BattleAI_SetupAIData(selectedMoves); chosenMoveId = BattleAI_ChooseMoveOrAction(); } - // If no moves matched the selected group, pick a new move from groups the pokemon has + // If no moves matched the selected group, pick a new move from groups the Pokémon has // In this case the AI is not checked again, so the choice may be worse // If a move is chosen this way, there's a 50% chance that it will be unable to use it anyway if (chosenMoveId == -1) { - if (unusableMovesBits != 0xF) + if (unusableMovesBits != ALL_MOVES_MASK) { - validMoveFlags = 0, numValidMoveGroups = 0; + numMovesPerGroup = 0, numMultipleMoveGroups = 0; for (i = 0; i < MAX_MON_MOVES; i++) { - // validMoveFlags is used here as a bitfield for which moves can be used for each move group type - // first 4 bits are for attack (1 for each move), then 4 bits for defense, and 4 for support + // Count the number of usable moves the battler has in each move group. + // The totals will be stored separately in 3 groups of 4 bits each in numMovesPerGroup. if (GetBattlePalaceMoveGroup(moveInfo->moves[i]) == PALACE_MOVE_GROUP_ATTACK && !(gBitTable[i] & unusableMovesBits)) - validMoveFlags += (1 << 0); + numMovesPerGroup += (1 << 0); if (GetBattlePalaceMoveGroup(moveInfo->moves[i]) == PALACE_MOVE_GROUP_DEFENSE && !(gBitTable[i] & unusableMovesBits)) - validMoveFlags += (1 << 4); + numMovesPerGroup += (1 << 4); if (GetBattlePalaceMoveGroup(moveInfo->moves[i]) == PALACE_MOVE_GROUP_SUPPORT && !(gBitTable[i] & unusableMovesBits)) - validMoveFlags += (1 << 8); + numMovesPerGroup += (1 << 8); } - // Count the move groups the pokemon has - if ((validMoveFlags & 0xF) > 1) - numValidMoveGroups++; - if ((validMoveFlags & 0xF0) > 0x1F) - numValidMoveGroups++; - if ((validMoveFlags & 0xF0) > 0x1FF) - numValidMoveGroups++; + // Count the number of move groups for which the battler has at least 2 usable moves. + // This is a roundabout way to determine if there is a move group that should be + // preferred, because it has multiple move options and the others do not. + // The condition intended to check the total for the Support group is accidentally + // checking the Defense total, and is never true. As a result the preferences for + // random move selection here will skew away from the Support move group. + if ((numMovesPerGroup & 0xF) >= 2) + numMultipleMoveGroups++; + if ((numMovesPerGroup & (0xF << 4)) >= (2 << 4)) + numMultipleMoveGroups++; +#ifdef BUGFIX + if ((numMovesPerGroup & (0xF << 8)) >= (2 << 8)) +#else + if ((numMovesPerGroup & (0xF << 4)) >= (2 << 8)) +#endif + numMultipleMoveGroups++; - // If more than 1 possible move group, or no possible move groups - // then choose move randomly - if (numValidMoveGroups > 1 || numValidMoveGroups == 0) + // By this point we already know the battler only has usable moves from at most 2 of the 3 move groups, + // because they had no usable moves from the move group that was selected based on Nature. + // + // The below condition is effectively 'numMultipleMoveGroups != 1'. + // There is no stand-out group with multiple moves to choose from, so we pick randomly. + // Note that because of the bug above the battler may actually have any number of Support moves. + if (numMultipleMoveGroups > 1 || numMultipleMoveGroups == 0) { do { @@ -204,27 +219,36 @@ u16 ChooseMoveAndTargetInBattlePalace(void) chosenMoveId = i; } while (chosenMoveId == -1); } - // Otherwise randomly choose move of only available move group else { - if ((validMoveFlags & 0xF) > 1) - validMoveGroup = PALACE_MOVE_GROUP_ATTACK; - if ((validMoveFlags & 0xF0) > 0x1F) - validMoveGroup = PALACE_MOVE_GROUP_DEFENSE; - if ((validMoveFlags & 0xF0) > 0x1FF) - validMoveGroup = PALACE_MOVE_GROUP_SUPPORT; + // The battler has just 1 move group with multiple move options to choose from. + // Choose a move randomly from this group. + + // Same bug as the previous set of conditions (the condition for Support is never true). + // This bug won't cause a softlock below, because if Support is the only group with multiple + // moves then it won't have been counted, and the 'numMultipleMoveGroups == 0' above will be true. + if ((numMovesPerGroup & 0xF) >= 2) + randSelectGroup = PALACE_MOVE_GROUP_ATTACK; + if ((numMovesPerGroup & (0xF << 4)) >= (2 << 4)) + randSelectGroup = PALACE_MOVE_GROUP_DEFENSE; +#ifdef BUGFIX + if ((numMovesPerGroup & (0xF << 8)) >= (2 << 8)) +#else + if ((numMovesPerGroup & (0xF << 4)) >= (2 << 8)) +#endif + randSelectGroup = PALACE_MOVE_GROUP_SUPPORT; do { i = Random() % MAX_MON_MOVES; - if (!(gBitTable[i] & unusableMovesBits) && validMoveGroup == GetBattlePalaceMoveGroup(moveInfo->moves[i])) + if (!(gBitTable[i] & unusableMovesBits) && randSelectGroup == GetBattlePalaceMoveGroup(moveInfo->moves[i])) chosenMoveId = i; } while (chosenMoveId == -1); } - // If a move was selected (and in this case was not from the Nature-chosen group) - // then there's a 50% chance it won't be used anyway - if (Random() % 100 > 49) + // Because the selected move was not from the Nature-chosen move group there's a 50% chance + // that it will be unable to use it. This could have been checked earlier to avoid the above work. + if (Random() % 100 >= 50) { gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; return 0; @@ -232,6 +256,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void) } else { + // All the battler's moves were flagged as unusable. gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE; return 0; } @@ -264,9 +289,9 @@ u16 ChooseMoveAndTargetInBattlePalace(void) #undef selectedGroup #undef selectedMoves #undef moveTarget -#undef validMoveFlags -#undef numValidMoveGroups -#undef validMoveGroup +#undef numMovesPerGroup +#undef numMultipleMoveGroups +#undef randSelectGroup static u8 GetBattlePalaceMoveGroup(u16 move) { @@ -332,7 +357,7 @@ static u16 GetBattlePalaceTarget(void) return BATTLE_OPPOSITE(gActiveBattler) << 8; } -// Wait for the pokemon to finish appearing out from the pokeball on send out +// Wait for the Pokémon to finish appearing out from the Poké Ball on send out void SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite) { u8 spriteId = sprite->data[1]; @@ -353,7 +378,7 @@ void SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite) } } -static void UnusedDoBattleSpriteAffineAnim(struct Sprite *sprite, bool8 pointless) +static void UNUSED UnusedDoBattleSpriteAffineAnim(struct Sprite *sprite, bool8 pointless) { sprite->animPaused = TRUE; sprite->callback = SpriteCallbackDummy; @@ -598,7 +623,7 @@ void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId) if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16)); + CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16)); } } @@ -661,12 +686,11 @@ void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId) if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16)); + CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16)); } } -// Unused -static void BattleGfxSfxDummy1(void) +static void UNUSED BattleGfxSfxDummy1(void) { } @@ -909,7 +933,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 castform) if (gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies != SPECIES_NONE) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16)); + CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16)); } gSprites[gBattlerSpriteIds[battlerAtk]].y = GetBattlerSpriteDefault_Y(battlerAtk); } @@ -978,7 +1002,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 castform) } BlendPalette(paletteOffset, 16, 6, RGB_WHITE); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16)); + CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16)); if (!IsContest()) { diff --git a/src/battle_interface.c b/src/battle_interface.c index bc86ede4ac..a417be4a72 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -841,8 +841,7 @@ static void Debug_DrawNumber(s16 number, u16 *dest, bool8 unk) } } -// Unused -static void Debug_DrawNumberPair(s16 number1, s16 number2, u16 *dest) +static void UNUSED Debug_DrawNumberPair(s16 number1, s16 number2, u16 *dest) { dest[4] = 0x1E; Debug_DrawNumber(number2, dest, FALSE); @@ -2059,7 +2058,7 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) pltAdder += battlerId + 12; FillPalette(sStatusIconColors[statusPalId], OBJ_PLTT_OFFSET + pltAdder, PLTT_SIZEOF(1)); - CpuCopy16(gPlttBufferUnfaded + OBJ_PLTT_OFFSET + pltAdder, (u16 *)OBJ_PLTT + pltAdder, PLTT_SIZEOF(1)); + CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_OFFSET + pltAdder], (u16 *)OBJ_PLTT + pltAdder, PLTT_SIZEOF(1)); CpuCopy32(statusGfxPtr, (void *)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * TILE_SIZE_4BPP), 96); if (IsDoubleBattle() == TRUE || GetBattlerSide(battlerId) == B_SIDE_OPPONENT) { @@ -2459,9 +2458,8 @@ static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 return filledPixels; } -// Unused // These two functions seem as if they were made for testing the health bar. -static s16 Debug_TestHealthBar(struct TestingBar *barInfo, s32 *currValue, u16 *dest, s32 unused) +static s16 UNUSED Debug_TestHealthBar(struct TestingBar *barInfo, s32 *currValue, u16 *dest, s32 unused) { s16 ret, var; diff --git a/src/battle_intro.c b/src/battle_intro.c index 42fe659746..571c5e85a2 100644 --- a/src/battle_intro.c +++ b/src/battle_intro.c @@ -182,7 +182,7 @@ static void BattleIntroSlide1(u8 taskId) if ((gBattle_WIN0V & 0xFF00) == 0x3000) { gTasks[taskId].tState++; - gTasks[taskId].data[2] = 240; + gTasks[taskId].data[2] = DISPLAY_WIDTH; gTasks[taskId].data[3] = 32; gIntroSlideFlags &= ~1; } @@ -196,12 +196,12 @@ static void BattleIntroSlide1(u8 taskId) { if (gTasks[taskId].tTerrain == BATTLE_TERRAIN_LONG_GRASS) { - if (gBattle_BG1_Y != 0xFFB0) + if (gBattle_BG1_Y != (u16)(-80)) gBattle_BG1_Y -= 2; } else { - if (gBattle_BG1_Y != 0xFFC8) + if (gBattle_BG1_Y != (u16)(-56)) gBattle_BG1_Y -= 1; } } @@ -213,13 +213,13 @@ static void BattleIntroSlide1(u8 taskId) gTasks[taskId].data[2] -= 2; // Scanline settings have already been set in CB2_InitBattleInternal() - for (i = 0; i < 80; i++) + for (i = 0; i < DISPLAY_HEIGHT / 2; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2]; - for (; i < 160; i++) + for (; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = -gTasks[taskId].data[2]; - if (!gTasks[taskId].data[2]) + if (gTasks[taskId].data[2] == 0) { gScanlineEffect.state = 3; gTasks[taskId].tState++; @@ -290,7 +290,7 @@ static void BattleIntroSlide2(u8 taskId) if ((gBattle_WIN0V & 0xFF00) == 0x3000) { gTasks[taskId].tState++; - gTasks[taskId].data[2] = 240; + gTasks[taskId].data[2] = DISPLAY_WIDTH; gTasks[taskId].data[3] = 32; gTasks[taskId].data[5] = 1; gIntroSlideFlags &= ~1; @@ -322,13 +322,13 @@ static void BattleIntroSlide2(u8 taskId) gTasks[taskId].data[2] -= 2; // Scanline settings have already been set in CB2_InitBattleInternal() - for (i = 0; i < 80; i++) + for (i = 0; i < DISPLAY_HEIGHT / 2; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2]; - for (; i < 160; i++) + for (; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = -gTasks[taskId].data[2]; - if (!gTasks[taskId].data[2]) + if (gTasks[taskId].data[2] == 0) { gScanlineEffect.state = 3; gTasks[taskId].tState++; @@ -383,7 +383,7 @@ static void BattleIntroSlide3(u8 taskId) if ((gBattle_WIN0V & 0xFF00) == 0x3000) { gTasks[taskId].tState++; - gTasks[taskId].data[2] = 240; + gTasks[taskId].data[2] = DISPLAY_WIDTH; gTasks[taskId].data[3] = 32; gTasks[taskId].data[5] = 1; gIntroSlideFlags &= ~1; @@ -410,13 +410,13 @@ static void BattleIntroSlide3(u8 taskId) gTasks[taskId].data[2] -= 2; // Scanline settings have already been set in CB2_InitBattleInternal() - for (i = 0; i < 80; i++) + for (i = 0; i < DISPLAY_HEIGHT / 2; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2]; - for (; i < 160; i++) + for (; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = -gTasks[taskId].data[2]; - if (!gTasks[taskId].data[2]) + if (gTasks[taskId].data[2] == 0) { gScanlineEffect.state = 3; gTasks[taskId].tState++; @@ -479,7 +479,7 @@ static void BattleIntroSlideLink(u8 taskId) if ((gBattle_WIN0V & 0xFF00) == 0x3000) { gTasks[taskId].tState++; - gTasks[taskId].data[2] = 240; + gTasks[taskId].data[2] = DISPLAY_WIDTH; gTasks[taskId].data[3] = 32; gIntroSlideFlags &= ~1; } @@ -492,13 +492,13 @@ static void BattleIntroSlideLink(u8 taskId) gTasks[taskId].data[2] -= 2; // Scanline settings have already been set in CB2_InitBattleInternal() - for (i = 0; i < 80; i++) + for (i = 0; i < DISPLAY_HEIGHT / 2; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2]; - for (; i < 160; i++) + for (; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = -gTasks[taskId].data[2]; - if (!gTasks[taskId].data[2]) + if (gTasks[taskId].data[2] == 0) { gScanlineEffect.state = 3; gTasks[taskId].tState++; @@ -544,7 +544,7 @@ static void BattleIntroSlidePartner(u8 taskId) if ((gBattle_WIN0V & 0xFF00) == 0x2000) { gTasks[taskId].tState++; - gTasks[taskId].data[2] = 240; + gTasks[taskId].data[2] = DISPLAY_WIDTH; gIntroSlideFlags &= ~1; } break; @@ -557,7 +557,7 @@ static void BattleIntroSlidePartner(u8 taskId) gBattle_BG1_X = gTasks[taskId].data[2]; gBattle_BG2_X = -gTasks[taskId].data[2]; - if (!gTasks[taskId].data[2]) + if (gTasks[taskId].data[2] == 0) gTasks[taskId].tState++; break; case 4: @@ -602,7 +602,7 @@ void DrawBattlerOnBg(int bgId, u8 x, u8 y, u8 battlerPosition, u8 paletteId, u8 LoadBgTilemap(bgId, tilemap, BG_SCREEN_SIZE, 0); } -static void DrawBattlerOnBgDMA(u8 x, u8 y, u8 battlerPosition, u8 arg3, u8 paletteId, u16 arg5, u8 arg6, u8 arg7) +static void UNUSED DrawBattlerOnBgDMA(u8 x, u8 y, u8 battlerPosition, u8 arg3, u8 paletteId, u16 arg5, u8 arg6, u8 arg7) { int i, j, offset; diff --git a/src/battle_main.c b/src/battle_main.c index b8fea024ee..c19089deb0 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -170,7 +170,7 @@ EWRAM_DATA u16 gChosenMove = 0; EWRAM_DATA u16 gCalledMove = 0; EWRAM_DATA s32 gBattleMoveDamage = 0; EWRAM_DATA s32 gHpDealt = 0; -EWRAM_DATA s32 gTakenDmg[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA s32 gBideDmg[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastUsedItem = 0; EWRAM_DATA u8 gLastUsedAbility = 0; EWRAM_DATA u8 gBattlerAttacker = 0; @@ -197,7 +197,7 @@ EWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gMoveResultFlags = 0; EWRAM_DATA u32 gHitMarker = 0; EWRAM_DATA static u8 sUnusedBattlersArray[MAX_BATTLERS_COUNT] = {0}; -EWRAM_DATA u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA u8 gBideTarget[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gUnusedFirstBattleVar2 = 0; // Never read EWRAM_DATA u16 gSideStatuses[NUM_BATTLE_SIDES] = {0}; EWRAM_DATA struct SideTimer gSideTimers[NUM_BATTLE_SIDES] = {0}; @@ -644,19 +644,16 @@ static void CB2_InitBattleInternal(void) gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1); ScanlineEffect_Clear(); - i = 0; - while (i < 80) + for (i = 0; i < DISPLAY_HEIGHT / 2; i++) { gScanlineEffectRegBuffers[0][i] = 0xF0; gScanlineEffectRegBuffers[1][i] = 0xF0; - i++; } - while (i < 160) + for (; i < DISPLAY_HEIGHT; i++) { gScanlineEffectRegBuffers[0][i] = 0xFF10; gScanlineEffectRegBuffers[1][i] = 0xFF10; - i++; } ScanlineEffect_SetParams(sIntroScanlineParams16Bit); @@ -2076,8 +2073,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir return gTrainers[trainerNum].partySize; } -// Unused -static void HBlankCB_Battle(void) +static void UNUSED HBlankCB_Battle(void) { if (REG_VCOUNT < DISPLAY_HEIGHT && REG_VCOUNT >= 111) SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_SCREENBASE(24) | BGCNT_TXT256x512); @@ -2713,8 +2709,7 @@ void SpriteCallbackDummy_2(struct Sprite *sprite) #define sNumFlickers data[3] #define sDelay data[4] -// Unused -static void SpriteCB_InitFlicker(struct Sprite *sprite) +static void UNUSED SpriteCB_InitFlicker(struct Sprite *sprite) { sprite->sNumFlickers = 6; sprite->sDelay = 1; @@ -2869,8 +2864,7 @@ static void SpriteCB_BattleSpriteSlideLeft(struct Sprite *sprite) } } -// Unused -static void SetIdleSpriteCallback(struct Sprite *sprite) +static void UNUSED SetIdleSpriteCallback(struct Sprite *sprite) { sprite->callback = SpriteCB_Idle; } @@ -3692,8 +3686,7 @@ static void BattleIntroRecordMonsToDex(void) } } -// Unused -static void BattleIntroSkipRecordMonsToDex(void) +static void UNUSED BattleIntroSkipRecordMonsToDex(void) { if (gBattleControllerExecFlags == 0) gBattleMainFunc = BattleIntroPrintPlayerSendsOut; @@ -3796,8 +3789,7 @@ static void BattleIntroPlayer1SendsOutMonAnimation(void) gBattleMainFunc = TryDoEventsBeforeFirstTurn; } -// Unused -static void BattleIntroSwitchInPlayerMons(void) +static void UNUSED BattleIntroSwitchInPlayerMons(void) { if (gBattleControllerExecFlags == 0) { diff --git a/src/battle_message.c b/src/battle_message.c index f02e38f134..e50fcff3de 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1323,7 +1323,8 @@ const u8 gText_Draw[] = _("{HIGHLIGHT TRANSPARENT}Draw"); static const u8 sText_SpaceIs[] = _(" is"); static const u8 sText_ApostropheS[] = _("'s"); -// For displaying names of invalid moves +// For displaying names of invalid moves. +// This is large enough that the text for TYPE_ELECTRIC will exceed TEXT_BUFF_ARRAY_COUNT. static const u8 sATypeMove_Table[NUMBER_OF_MON_TYPES][17] = { [TYPE_NORMAL] = _("a NORMAL move"), @@ -1472,7 +1473,7 @@ static const u16 sGrammarMoveUsedTable[] = MOVE_COVET, 0 }; -static const u8 sDummyWeirdStatusString[] = {EOS, EOS, EOS, EOS, EOS, EOS, EOS, EOS, 0, 0}; +static const u8 sText_EmptyStatus[] = _("$$$$$$$"); static const struct BattleWindowText sTextOnWindowsInfo_Normal[] = { @@ -2151,7 +2152,7 @@ void BufferStringBattle(u16 stringID) } } break; - case STRINGID_USEDMOVE: // pokemon used a move msg + case STRINGID_USEDMOVE: // Pokémon used a move msg ChooseMoveUsedParticle(gBattleTextBuff1); // buff1 doesn't appear in the string, leftover from japanese move names if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT) @@ -2259,10 +2260,10 @@ static const u8 *TryGetStatusString(u8 *src) u32 chars1, chars2; u8 *statusPtr; - memcpy(status, sDummyWeirdStatusString, 8); + memcpy(status, sText_EmptyStatus, min(ARRAY_COUNT(status), ARRAY_COUNT(sText_EmptyStatus))); statusPtr = status; - for (i = 0; i < 8; i++) + for (i = 0; i < ARRAY_COUNT(status); i++) { if (*src == EOS) break; // one line required to match -g *statusPtr = *src; @@ -2304,11 +2305,16 @@ static const u8 *TryGetStatusString(u8 *src) StringGet_Nickname(text); \ toCpy = text; +// Ensure the defined length for an item name can contain the full defined length of a berry name. +// This ensures that custom Enigma Berry names will fit in the text buffer at the top of BattleStringExpandPlaceholders. +STATIC_ASSERT(BERRY_NAME_LENGTH + ARRAY_COUNT(sText_BerrySuffix) <= ITEM_NAME_LENGTH, BerryNameTooLong); + u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) { u32 dstID = 0; // if they used dstID, why not use srcID as well? const u8 *toCpy = NULL; - u8 text[30]; + // This buffer may hold either the name of a trainer, Pokémon, or item. + u8 text[max(max(max(32, TRAINER_NAME_LENGTH + 1), POKEMON_NAME_LENGTH + 1), ITEM_NAME_LENGTH)]; u8 multiplayerId; s32 i; @@ -2753,7 +2759,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) { u32 srcID = 1; u32 value = 0; - u8 text[12]; + u8 nickname[POKEMON_NAME_LENGTH + 1]; u16 hword; *dst = EOS; @@ -2793,7 +2799,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) case B_BUFF_MON_NICK_WITH_PREFIX: // poke nick with prefix if (GetBattlerSide(src[srcID + 1]) == B_SIDE_PLAYER) { - GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, text); + GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, nickname); } else { @@ -2802,10 +2808,10 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) else StringAppend(dst, sText_WildPkmnPrefix); - GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, text); + GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, nickname); } - StringGet_Nickname(text); - StringAppend(dst, text); + StringGet_Nickname(nickname); + StringAppend(dst, nickname); srcID += 3; break; case B_BUFF_STAT: // stats @@ -3025,11 +3031,11 @@ void SetPpNumbersPaletteInMoveSelection(void) u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBattler]], chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBattler]]); - gPlttBufferUnfaded[92] = palPtr[(var * 2) + 0]; - gPlttBufferUnfaded[91] = palPtr[(var * 2) + 1]; + gPlttBufferUnfaded[BG_PLTT_ID(5) + 12] = palPtr[(var * 2) + 0]; + gPlttBufferUnfaded[BG_PLTT_ID(5) + 11] = palPtr[(var * 2) + 1]; - CpuCopy16(&gPlttBufferUnfaded[92], &gPlttBufferFaded[92], sizeof(u16)); - CpuCopy16(&gPlttBufferUnfaded[91], &gPlttBufferFaded[91], sizeof(u16)); + CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(5) + 12], &gPlttBufferFaded[BG_PLTT_ID(5) + 12], PLTT_SIZEOF(1)); + CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(5) + 11], &gPlttBufferFaded[BG_PLTT_ID(5) + 11], PLTT_SIZEOF(1)); } u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp) diff --git a/src/battle_palace.c b/src/battle_palace.c index 0fa65200a6..a521acea2b 100644 --- a/src/battle_palace.c +++ b/src/battle_palace.c @@ -181,7 +181,7 @@ static void IncrementPalaceStreak(void) static void SavePalaceChallenge(void) { gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; - VarSet(VAR_TEMP_0, 0); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; SaveGameFrontier(); } diff --git a/src/battle_pike.c b/src/battle_pike.c index 462ae4f383..ba24e58ae7 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -708,7 +708,7 @@ static void ClearInWildMonRoom(void) static void SavePikeChallenge(void) { gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; - VarSet(VAR_TEMP_0, 0); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; SaveMapView(); TrySavingData(SAVE_LINK); @@ -1097,8 +1097,7 @@ static u16 GetNPCRoomGraphicsId(void) return sNPCTable[sNpcId].graphicsId; } -// Unused -static u8 GetInWildMonRoom(void) +static bool8 UNUSED GetInWildMonRoom(void) { return sInWildMonRoom; } @@ -1267,6 +1266,10 @@ static void TryHealMons(u8 healCount) for (i = 0; i < FRONTIER_PARTY_SIZE; i++) indices[i] = i; + + // Only 'healCount' number of Pokémon will be healed. + // The order in which they're (attempted to be) healed is random, + // and determined by performing 10 random swaps to this index array. for (k = 0; k < 10; k++) { u8 temp; @@ -1423,6 +1426,7 @@ static void PrepareTwoTrainers(void) gFacilityTrainers = gBattleFrontierTrainers; do { + // Pick the 1st trainer, making sure it's not one that's been encountered yet in this challenge. trainerId = GetRandomScaledFrontierTrainerId(challengeNum, 1); for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1; i++) { @@ -1438,6 +1442,7 @@ static void PrepareTwoTrainers(void) do { + // Pick the 2nd trainer, making sure it's not one that's been encountered yet in this challenge. trainerId = GetRandomScaledFrontierTrainerId(challengeNum, 1); for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++) { diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 84a439037d..b4bb3cacca 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -38,6 +38,8 @@ #include "constants/moves.h" #include "constants/trainers.h" +#define NUM_LAYOUT_OFFSETS 8 + extern const struct MapLayout *const gMapLayouts[]; struct PyramidWildMon @@ -55,7 +57,7 @@ struct PyramidFloorTemplate u8 itemPositions; u8 trainerPositions; u8 runMultiplier; - u8 layoutOffsets[8]; + u8 layoutOffsets[NUM_LAYOUT_OFFSETS]; }; struct PyramidTrainerEncounterMusic @@ -929,7 +931,7 @@ static void SetBattlePyramidData(void) static void SavePyramidChallenge(void) { gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; - VarSet(VAR_TEMP_0, 0); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; SaveMapView(); TrySavingData(SAVE_LINK); @@ -1185,7 +1187,7 @@ static void Task_SetPyramidFloorPalette(u8 taskId) { if (gPaletteFade.active) { - CpuCopy16(gBattlePyramidFloor_Pal[gSaveBlock2Ptr->frontier.curChallengeBattleNum], &gPlttBufferUnfaded[96], 32); + CpuCopy16(gBattlePyramidFloor_Pal[gSaveBlock2Ptr->frontier.curChallengeBattleNum], &gPlttBufferUnfaded[BG_PLTT_ID(6)], PLTT_SIZE_4BPP); DestroyTask(taskId); } } @@ -1439,7 +1441,7 @@ void PausePyramidChallenge(void) { RestorePyramidPlayerParty(); gSaveBlock2Ptr->frontier.challengeStatus = CHALLENGE_STATUS_PAUSED; - VarSet(VAR_TEMP_E, 0); + VarSet(VAR_TEMP_PLAYING_PYRAMID_MUSIC, 0); LoadPlayerParty(); } } @@ -1477,8 +1479,7 @@ u8 GetTrainerEncounterMusicIdInBattlePyramid(u16 trainerId) return TRAINER_ENCOUNTER_MUSIC_MALE; } -// Unused -static void BattlePyramidRetireChallenge(void) +static void UNUSED BattlePyramidRetireChallenge(void) { ScriptContext_SetupScript(BattlePyramid_Retire); } @@ -1902,7 +1903,7 @@ static void GetPyramidFloorLayoutOffsets(u8 *layoutOffsets) for (i = 0; i < NUM_PYRAMID_FLOOR_SQUARES; i++) { - layoutOffsets[i] = sPyramidFloorTemplates[id].layoutOffsets[rand & 0x7]; + layoutOffsets[i] = sPyramidFloorTemplates[id].layoutOffsets[MOD(rand, NUM_LAYOUT_OFFSETS)]; rand >>= 3; if (i == 7) { diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c index d580cf6800..bf9a7704b1 100644 --- a/src/battle_pyramid_bag.c +++ b/src/battle_pyramid_bag.c @@ -174,12 +174,12 @@ enum { static const struct MenuAction sMenuActions[] = { - [ACTION_USE_FIELD] = { gMenuText_Use, BagAction_UseOnField }, - [ACTION_TOSS] = { gMenuText_Toss, BagAction_Toss }, - [ACTION_GIVE] = { gMenuText_Give, BagAction_Give }, - [ACTION_CANCEL] = { gText_Cancel2, BagAction_Cancel }, - [ACTION_USE_BATTLE] = { gMenuText_Use, BagAction_UseInBattle }, - [ACTION_DUMMY] = { gText_EmptyString2, NULL }, + [ACTION_USE_FIELD] = { gMenuText_Use, {BagAction_UseOnField} }, + [ACTION_TOSS] = { gMenuText_Toss, {BagAction_Toss} }, + [ACTION_GIVE] = { gMenuText_Give, {BagAction_Give} }, + [ACTION_CANCEL] = { gText_Cancel2, {BagAction_Cancel} }, + [ACTION_USE_BATTLE] = { gMenuText_Use, {BagAction_UseInBattle} }, + [ACTION_DUMMY] = { gText_EmptyString2, {NULL} }, }; static const u8 sMenuActionIds_Field[] = {ACTION_USE_FIELD, ACTION_GIVE, ACTION_TOSS, ACTION_CANCEL}; @@ -382,8 +382,8 @@ void CB2_PyramidBagMenuFromStartMenu(void) GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_FIELD, CB2_ReturnToFieldWithOpenMenu); } -// Unused, CB2_BagMenuFromBattle is used instead -static void OpenBattlePyramidBagInBattle(void) +// CB2_BagMenuFromBattle is used instead +static void UNUSED OpenBattlePyramidBagInBattle(void) { GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_BATTLE, CB2_SetUpReshowBattleScreenAfterMenu2); } @@ -1468,8 +1468,7 @@ static void DrawTossNumberWindow(u8 windowId) ScheduleBgCopyTilemapToVram(1); } -// Unused -static u8 GetMenuActionWindowId(u8 windowArrayId) +static u8 UNUSED GetMenuActionWindowId(u8 windowArrayId) { return gPyramidBagMenu->windowIds[windowArrayId]; } diff --git a/src/battle_records.c b/src/battle_records.c index 4463a9ebfc..edc48d8202 100644 --- a/src/battle_records.c +++ b/src/battle_records.c @@ -444,7 +444,7 @@ static void LoadTrainerHillRecordsWindowGfx(u8 bgId) { LoadBgTiles(bgId, sTrainerHillWindowTileset, sizeof(sTrainerHillWindowTileset), 0); CopyToBgTilemapBufferRect(bgId, sTrainerHillWindowTilemap, 0, 0, 0x20, 0x20); - LoadPalette(sTrainerHillWindowPalette, BG_PLTT_ID(0), PLTT_SIZE_4BPP); + LoadPalette(sTrainerHillWindowPalette, BG_PLTT_ID(0), sizeof(sTrainerHillWindowPalette)); } static void VblankCB_TrainerHillRecords(void) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d12477bea8..49279bdb9c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -811,11 +811,11 @@ static const u16 sRarePickupItems[] = ITEM_FULL_RESTORE, ITEM_ETHER, ITEM_WHITE_HERB, - ITEM_TM44_REST, + ITEM_TM_REST, ITEM_ELIXIR, - ITEM_TM01_FOCUS_PUNCH, + ITEM_TM_FOCUS_PUNCH, ITEM_LEFTOVERS, - ITEM_TM26_EARTHQUAKE, + ITEM_TM_EARTHQUAKE, }; static const u8 sPickupProbabilities[] = @@ -849,7 +849,7 @@ static const u8 sBallCatchBonuses[] = // In Battle Palace, moves are chosen based on the pokemons nature rather than by the player // Moves are grouped into "Attack", "Defense", or "Support" (see PALACE_MOVE_GROUP_*) // Each nature has a certain percent chance of selecting a move from a particular group -// and a separate percent chance for each group when below 50% HP +// and a separate percent chance for each group when at or below 50% HP // The table below doesn't list percentages for Support because you can subtract the other two // Support percentages are listed in comments off to the side instead #define PALACE_STYLE(atk, def, atkLow, defLow) {atk, atk + def, atkLow, atkLow + defLow} @@ -1650,7 +1650,7 @@ static inline void ApplyRandomDmgMultiplier(void) } } -static void Unused_ApplyRandomDmgMultiplier(void) +static void UNUSED Unused_ApplyRandomDmgMultiplier(void) { ApplyRandomDmgMultiplier(); } @@ -1836,6 +1836,7 @@ static void Cmd_healthbarupdate(void) gBattlescriptCurrInstr += 2; } +// Update the active battler's HP and various HP trackers (Substitute, Bide, etc.) static void Cmd_datahpupdate(void) { u32 moveType; @@ -1843,9 +1844,13 @@ static void Cmd_datahpupdate(void) if (gBattleControllerExecFlags) return; + // moveType will be used later to record for Counter/Mirror Coat whether this was physical or special damage. + // For moves with a dynamic type that have F_DYNAMIC_TYPE_IGNORE_PHYSICALITY set (in vanilla, just Hidden Power) this will ignore + // the dynamic type and use the move's base type instead, meaning (as a Normal type) Hidden Power will only ever trigger Counter. + // It also means that Hidden Power Fire is unable to defrost targets. if (gBattleStruct->dynamicMoveType == 0) moveType = gBattleMoves[gCurrentMove].type; - else if (!(gBattleStruct->dynamicMoveType & F_DYNAMIC_TYPE_1)) + else if (!(gBattleStruct->dynamicMoveType & F_DYNAMIC_TYPE_IGNORE_PHYSICALITY)) moveType = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; else moveType = gBattleMoves[gCurrentMove].type; @@ -1855,23 +1860,26 @@ static void Cmd_datahpupdate(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { + // Target has an active Substitute, deal damage to that instead. if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage) { - if (gSpecialStatuses[gActiveBattler].dmg == 0) - gSpecialStatuses[gActiveBattler].dmg = gBattleMoveDamage; + if (gSpecialStatuses[gActiveBattler].shellBellDmg == 0) + gSpecialStatuses[gActiveBattler].shellBellDmg = gBattleMoveDamage; gDisableStructs[gActiveBattler].substituteHP -= gBattleMoveDamage; gHpDealt = gBattleMoveDamage; } else { - if (gSpecialStatuses[gActiveBattler].dmg == 0) - gSpecialStatuses[gActiveBattler].dmg = gDisableStructs[gActiveBattler].substituteHP; + // Substitute has less HP than the damage dealt, set its HP to 0. + if (gSpecialStatuses[gActiveBattler].shellBellDmg == 0) + gSpecialStatuses[gActiveBattler].shellBellDmg = gDisableStructs[gActiveBattler].substituteHP; gHpDealt = gDisableStructs[gActiveBattler].substituteHP; gDisableStructs[gActiveBattler].substituteHP = 0; } - // check substitute fading + if (gDisableStructs[gActiveBattler].substituteHP == 0) { + // Substitute fades gBattlescriptCurrInstr += 2; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SubstituteFade; @@ -1881,28 +1889,30 @@ static void Cmd_datahpupdate(void) else { gHitMarker &= ~HITMARKER_IGNORE_SUBSTITUTE; - if (gBattleMoveDamage < 0) // hp goes up + if (gBattleMoveDamage < 0) { - gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; + // Negative damage is HP gain + gBattleMons[gActiveBattler].hp += -gBattleMoveDamage; if (gBattleMons[gActiveBattler].hp > gBattleMons[gActiveBattler].maxHP) gBattleMons[gActiveBattler].hp = gBattleMons[gActiveBattler].maxHP; - } - else // hp goes down + else { - if (gHitMarker & HITMARKER_SKIP_DMG_TRACK) + if (gHitMarker & HITMARKER_IGNORE_BIDE) { - gHitMarker &= ~HITMARKER_SKIP_DMG_TRACK; + gHitMarker &= ~HITMARKER_IGNORE_BIDE; } else { - gTakenDmg[gActiveBattler] += gBattleMoveDamage; + // Record damage/attacker for Bide + gBideDmg[gActiveBattler] += gBattleMoveDamage; if (gBattlescriptCurrInstr[1] == BS_TARGET) - gTakenDmgByBattler[gActiveBattler] = gBattlerAttacker; + gBideTarget[gActiveBattler] = gBattlerAttacker; else - gTakenDmgByBattler[gActiveBattler] = gBattlerTarget; + gBideTarget[gActiveBattler] = gBattlerTarget; } + // Deal damage to the battler if (gBattleMons[gActiveBattler].hp > gBattleMoveDamage) { gBattleMons[gActiveBattler].hp -= gBattleMoveDamage; @@ -1914,11 +1924,16 @@ static void Cmd_datahpupdate(void) gBattleMons[gActiveBattler].hp = 0; } - if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) - gSpecialStatuses[gActiveBattler].dmg = gHpDealt; + // Record damage for Shell Bell + if (gSpecialStatuses[gActiveBattler].shellBellDmg == 0 && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) + gSpecialStatuses[gActiveBattler].shellBellDmg = gHpDealt; + // 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_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE) && gCurrentMove != MOVE_PAIN_SPLIT) { + // Record physical damage/attacker for Counter gProtectStructs[gActiveBattler].physicalDmg = gHpDealt; gSpecialStatuses[gActiveBattler].physicalDmg = gHpDealt; if (gBattlescriptCurrInstr[1] == BS_TARGET) @@ -1934,6 +1949,7 @@ static void Cmd_datahpupdate(void) } else if (!IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_PASSIVE_DAMAGE)) { + // Record special damage/attacker for Mirror Coat gProtectStructs[gActiveBattler].specialDmg = gHpDealt; gSpecialStatuses[gActiveBattler].specialDmg = gHpDealt; if (gBattlescriptCurrInstr[1] == BS_TARGET) @@ -1949,15 +1965,18 @@ static void Cmd_datahpupdate(void) } } gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE; + + // Send updated HP BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); MarkBattlerForControllerExec(gActiveBattler); } } else { + // MOVE_RESULT_NO_EFFECT was set gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gSpecialStatuses[gActiveBattler].dmg == 0) - gSpecialStatuses[gActiveBattler].dmg = 0xFFFF; + if (gSpecialStatuses[gActiveBattler].shellBellDmg == 0) + gSpecialStatuses[gActiveBattler].shellBellDmg = IGNORE_SHELL_BELL; } gBattlescriptCurrInstr += 2; } @@ -2227,11 +2246,11 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleScripting.battler = gBattlerAttacker; } - if (gBattleMons[gEffectBattler].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + if (gBattleMons[gEffectBattler].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) INCREMENT_RESET_RETURN - if (gSideStatuses[GET_BATTLER_SIDE(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + if (gSideStatuses[GET_BATTLER_SIDE(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) INCREMENT_RESET_RETURN @@ -2281,10 +2300,10 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; - gHitMarker &= ~HITMARKER_IGNORE_SAFEGUARD; + gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; } else { @@ -2293,7 +2312,7 @@ void SetMoveEffect(bool8 primary, u8 certain) RESET_RETURN } if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) - && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -2322,10 +2341,10 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BRNPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; - gHitMarker &= ~HITMARKER_IGNORE_SAFEGUARD; + gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; } else { @@ -2334,7 +2353,7 @@ void SetMoveEffect(bool8 primary, u8 certain) RESET_RETURN } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE) - && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -2378,10 +2397,10 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PRLZPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; - gHitMarker &= ~HITMARKER_IGNORE_SAFEGUARD; + gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; } else { @@ -2406,10 +2425,10 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; - gHitMarker &= ~HITMARKER_IGNORE_SAFEGUARD; + gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; } else { @@ -2418,7 +2437,7 @@ void SetMoveEffect(bool8 primary, u8 certain) RESET_RETURN } if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) - && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -2461,10 +2480,10 @@ void SetMoveEffect(bool8 primary, u8 certain) BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].status1), &gBattleMons[gEffectBattler].status1); MarkBattlerForControllerExec(gActiveBattler); - if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED_BY_ABILITY; - gHitMarker &= ~HITMARKER_IGNORE_SAFEGUARD; + gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; } else { @@ -3347,7 +3366,7 @@ static void Cmd_getexp(void) if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterMonId])) { - // check if the pokemon doesn't belong to the player + // check if the Pokémon doesn't belong to the player if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gBattleStruct->expGetterMonId >= 3) { i = STRINGID_EMPTYSTRING4; @@ -4061,16 +4080,16 @@ static void Cmd_setgraphicalstatchangevalues(void) switch (GET_STAT_BUFF_VALUE2(gBattleScripting.statChanger)) { case SET_STAT_BUFF_VALUE(1): // +1 - value = STAT_ANIM_PLUS1; + value = STAT_ANIM_PLUS1 + 1; break; case SET_STAT_BUFF_VALUE(2): // +2 - value = STAT_ANIM_PLUS2; + value = STAT_ANIM_PLUS2 + 1; break; case SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE: // -1 - value = STAT_ANIM_MINUS1; + value = STAT_ANIM_MINUS1 + 1; break; case SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE: // -2 - value = STAT_ANIM_MINUS2; + value = STAT_ANIM_MINUS2 + 1; break; } gBattleScripting.animArg1 = GET_STAT_BUFF_ID(gBattleScripting.statChanger) + value - 1; @@ -4092,9 +4111,9 @@ static void Cmd_playstatchangeanimation(void) { s16 startingStatAnimId; if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) - startingStatAnimId = STAT_ANIM_MINUS2 - 1; + startingStatAnimId = STAT_ANIM_MINUS2; else - startingStatAnimId = STAT_ANIM_MINUS1 - 1; + startingStatAnimId = STAT_ANIM_MINUS1; while (statsToCheck != 0) { @@ -4136,9 +4155,9 @@ static void Cmd_playstatchangeanimation(void) { s16 startingStatAnimId; if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) - startingStatAnimId = STAT_ANIM_PLUS2 - 1; + startingStatAnimId = STAT_ANIM_PLUS2; else - startingStatAnimId = STAT_ANIM_PLUS1 - 1; + startingStatAnimId = STAT_ANIM_PLUS1; while (statsToCheck != 0) { @@ -4429,7 +4448,7 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; - case MOVEEND_NEXT_TARGET: // For moves hitting two opposing Pokemon. + case MOVEEND_NEXT_TARGET: // For moves hitting two opposing Pokémon. if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !gProtectStructs[gBattlerAttacker].chargingTurn && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) @@ -6013,7 +6032,7 @@ static void InitLevelUpBanner(void) gBattle_BG2_Y = 0; gBattle_BG2_X = LEVEL_UP_BANNER_START; - LoadPalette(sLevelUpBanner_Pal, BG_PLTT_ID(6), PLTT_SIZE_4BPP); + LoadPalette(sLevelUpBanner_Pal, BG_PLTT_ID(6), sizeof(sLevelUpBanner_Pal)); CopyToWindowPixelBuffer(B_WIN_LEVEL_UP_BANNER, sLevelUpBanner_Gfx, 0, 0); PutWindowTilemap(B_WIN_LEVEL_UP_BANNER); CopyWindowToVram(B_WIN_LEVEL_UP_BANNER, COPYWIN_FULL); @@ -7092,7 +7111,7 @@ static void Cmd_setbide(void) { gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gBattlerAttacker] = gCurrentMove; - gTakenDmg[gBattlerAttacker] = 0; + gBideDmg[gBattlerAttacker] = 0; gBattleMons[gBattlerAttacker].status2 |= STATUS2_BIDE_TURN(2); gBattlescriptCurrInstr++; @@ -7251,7 +7270,7 @@ static void Cmd_forcerandomswitch(void) lastMonId = PARTY_SIZE; monsCount = PARTY_SIZE; minNeeded = 1; - battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; // there is only one pokemon out in single battles + battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; // there is only one Pokémon out in single battles battler1PartyId = gBattlerPartyIndexes[gBattlerTarget]; } @@ -7350,7 +7369,7 @@ static void Cmd_tryconversiontypechange(void) { do { - while ((moveChecked = Random() & (MAX_MON_MOVES - 1)) >= validMoves); + while ((moveChecked = MOD(Random(), MAX_MON_MOVES)) >= validMoves); moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type; @@ -7742,7 +7761,7 @@ static void Cmd_setsubstitute(void) } else { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; // one bit value will only work for pokemon which max hp can go to 1020(which is more than possible in games) + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; // one bit value will only work for Pokémon which max hp can go to 1020(which is more than possible in games) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -7812,9 +7831,18 @@ static void Cmd_metronome(void) { s32 i; + #if MOVES_COUNT < 512 + // Original GF method of move selection is to pick a random + // number between 1-511. 355-511 are not valid moves, so if it + // picks in this range it retries. If MOVES_COUNT exceeds 511 we + // instead use a simpler solution. gCurrentMove = (Random() & 0x1FF) + 1; if (gCurrentMove >= MOVES_COUNT) continue; + #else + // Just pick a valid move value (between 1 and MOVES_COUNT-1) + gCurrentMove = (Random() % (MOVES_COUNT - 1)) + 1; + #endif for (i = 0; i < MAX_MON_MOVES; i++); // ? @@ -7975,7 +8003,7 @@ static void Cmd_painsplitdmgcalc(void) storeLoc[3] = (painSplitHp & 0xFF000000) >> 24; gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp - hpDiff; - gSpecialStatuses[gBattlerTarget].dmg = 0xFFFF; + gSpecialStatuses[gBattlerTarget].shellBellDmg = IGNORE_SHELL_BELL; gBattlescriptCurrInstr += 5; } @@ -8170,7 +8198,7 @@ static void Cmd_trychoosesleeptalkmove(void) } unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~MOVE_LIMITATION_PP); - if (unusableMovesBits == (1 << MAX_MON_MOVES) - 1) // all 4 moves cannot be chosen + if (unusableMovesBits == ALL_MOVES_MASK) // all 4 moves cannot be chosen { gBattlescriptCurrInstr += 5; } @@ -8180,7 +8208,7 @@ static void Cmd_trychoosesleeptalkmove(void) do { - movePosition = Random() & (MAX_MON_MOVES - 1); + movePosition = MOD(Random(), MAX_MON_MOVES); } while ((gBitTable[movePosition] & unusableMovesBits)); gCalledMove = gBattleMons[gBattlerAttacker].moves[movePosition]; @@ -8813,7 +8841,7 @@ static void Cmd_hiddenpowercalc(void) gBattleStruct->dynamicMoveType = ((NUMBER_OF_MON_TYPES - 3) * typeBits) / 63 + 1; if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY) gBattleStruct->dynamicMoveType++; - gBattleStruct->dynamicMoveType |= F_DYNAMIC_TYPE_1 | F_DYNAMIC_TYPE_2; + gBattleStruct->dynamicMoveType |= F_DYNAMIC_TYPE_IGNORE_PHYSICALITY | F_DYNAMIC_TYPE_SET; gBattlescriptCurrInstr++; } @@ -9114,7 +9142,7 @@ static void Cmd_tryswapitems(void) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } - // can't swap if two pokemon don't have an item + // can't swap if two Pokémon don't have an item // or if either of them is an enigma berry or a mail else if ((gBattleMons[gBattlerAttacker].item == ITEM_NONE && gBattleMons[gBattlerTarget].item == ITEM_NONE) || gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY @@ -9690,15 +9718,15 @@ static void Cmd_setweatherballtype(void) if (gBattleWeather & B_WEATHER_ANY) gBattleScripting.dmgMultiplier = 2; if (gBattleWeather & B_WEATHER_RAIN) - *(&gBattleStruct->dynamicMoveType) = TYPE_WATER | F_DYNAMIC_TYPE_2; + *(&gBattleStruct->dynamicMoveType) = TYPE_WATER | F_DYNAMIC_TYPE_SET; else if (gBattleWeather & B_WEATHER_SANDSTORM) - *(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | F_DYNAMIC_TYPE_2; + *(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | F_DYNAMIC_TYPE_SET; else if (gBattleWeather & B_WEATHER_SUN) - *(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | F_DYNAMIC_TYPE_2; + *(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | F_DYNAMIC_TYPE_SET; else if (gBattleWeather & B_WEATHER_HAIL) - *(&gBattleStruct->dynamicMoveType) = TYPE_ICE | F_DYNAMIC_TYPE_2; + *(&gBattleStruct->dynamicMoveType) = TYPE_ICE | F_DYNAMIC_TYPE_SET; else - *(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | F_DYNAMIC_TYPE_2; + *(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | F_DYNAMIC_TYPE_SET; } gBattlescriptCurrInstr++; diff --git a/src/battle_setup.c b/src/battle_setup.c index cc1ad70fed..e87ce6dd27 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -108,7 +108,7 @@ EWRAM_DATA static u8 *sTrainerBBattleScriptRetAddr = NULL; EWRAM_DATA static bool8 sShouldCheckTrainerBScript = FALSE; EWRAM_DATA static u8 sNoOfPossibleTrainerRetScripts = 0; -// The first transition is used if the enemy pokemon are lower level than our pokemon. +// The first transition is used if the enemy Pokémon are lower level than our Pokémon. // Otherwise, the second transition is used. static const u8 sBattleTransitionTable_Wild[][2] = { @@ -407,7 +407,7 @@ static void DoStandardWildBattle(void) gBattleTypeFlags = 0; if (InBattlePyramid()) { - VarSet(VAR_TEMP_E, 0); + VarSet(VAR_TEMP_PLAYING_PYRAMID_MUSIC, 0); gBattleTypeFlags |= BATTLE_TYPE_PYRAMID; } CreateBattleStartTask(GetWildBattleTransition(), 0); @@ -845,7 +845,7 @@ static u8 GetTrainerBattleTransition(void) return B_TRANSITION_AQUA; if (gTrainers[gTrainerBattleOpponent_A].doubleBattle == TRUE) - minPartyCount = 2; // double battles always at least have 2 pokemon. + minPartyCount = 2; // double battles always at least have 2 Pokémon. else minPartyCount = 1; @@ -1248,7 +1248,7 @@ static void SetBattledTrainersFlags(void) FlagSet(GetTrainerAFlag()); } -static void SetBattledTrainerFlag(void) +static void UNUSED SetBattledTrainerFlag(void) { FlagSet(GetTrainerAFlag()); } @@ -1277,7 +1277,7 @@ void BattleSetup_StartTrainerBattle(void) if (InBattlePyramid()) { - VarSet(VAR_TEMP_E, 0); + VarSet(VAR_TEMP_PLAYING_PYRAMID_MUSIC, 0); gBattleTypeFlags |= BATTLE_TYPE_PYRAMID; if (gNoOfApproachingTrainers == 2) diff --git a/src/battle_tent.c b/src/battle_tent.c index e51ac38a5a..c003affebe 100644 --- a/src/battle_tent.c +++ b/src/battle_tent.c @@ -140,7 +140,7 @@ static void BufferVerdanturfTentTrainerIntro(void) static void SaveVerdanturfTentChallenge(void) { gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; - VarSet(VAR_TEMP_0, 0); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; SaveGameFrontier(); } @@ -190,7 +190,7 @@ static void SetFallarborTentPrize(void) static void SaveFallarborTentChallenge(void) { gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; - VarSet(VAR_TEMP_0, 0); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; SaveGameFrontier(); } @@ -245,7 +245,7 @@ static void SetSlateportTentPrize(void) static void SaveSlateportTentChallenge(void) { gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; - VarSet(VAR_TEMP_0, 0); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; SaveGameFrontier(); } @@ -309,11 +309,10 @@ static void GenerateInitialRentalMons(void) i = 0; while (i != PARTY_SIZE) { - // Cannot have two pokemon of the same species. + // Cannot have two Pokémon of the same species. monSetId = Random() % NUM_SLATEPORT_TENT_MONS; for (j = firstMonId; j < firstMonId + i; j++) { - u16 monId = monIds[j]; if (monIds[j] == monSetId) break; if (species[j] == gFacilityTrainerMons[monSetId].species) @@ -391,7 +390,7 @@ static void GenerateOpponentMons(void) { sRandMonId = monSet[Random() % numMons]; - // Ensure none of the opponent's pokemon are the same as the potential rental pokemon for the player + // Ensure none of the opponent's Pokémon are the same as the potential rental Pokémon for the player for (j = 0; j < (int)ARRAY_COUNT(gSaveBlock2Ptr->frontier.rentalMons); j++) { if (gFacilityTrainerMons[sRandMonId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.rentalMons[j].monId].species) diff --git a/src/battle_tower.c b/src/battle_tower.c index 8838b5f2d2..ec6019afb0 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1129,8 +1129,7 @@ u16 GetRandomScaledFrontierTrainerId(u8 challengeNum, u8 battleNum) return trainerId; } -// Unused -static void GetRandomScaledFrontierTrainerIdRange(u8 challengeNum, u8 battleNum, u16 *trainerIdPtr, u8 *rangePtr) +static void UNUSED GetRandomScaledFrontierTrainerIdRange(u8 challengeNum, u8 battleNum, u16 *trainerIdPtr, u8 *rangePtr) { u16 trainerId, range; @@ -1681,8 +1680,8 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) } // Regular battle frontier trainer. - // Attempt to fill the trainer's party with random Pokemon until 3 have been - // successfully chosen. The trainer's party may not have duplicate pokemon species + // Attempt to fill the trainer's party with random Pokémon until 3 have been + // successfully chosen. The trainer's party may not have duplicate Pokémon species // or duplicate held items. for (bfMonCount = 0; monSet[bfMonCount] != 0xFFFF; bfMonCount++) ; @@ -1692,12 +1691,12 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) { u16 monId = monSet[Random() % bfMonCount]; - // "High tier" pokemon are only allowed on open level mode + // "High tier" Pokémon are only allowed on open level mode // 20 is not a possible value for level here if ((level == FRONTIER_MAX_LEVEL_50 || level == 20) && monId > FRONTIER_MONS_HIGH_TIER) continue; - // Ensure this pokemon species isn't a duplicate. + // Ensure this Pokémon species isn't a duplicate. for (j = 0; j < i + firstMonId; j++) { if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monId].species) @@ -1716,7 +1715,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) if (j != i + firstMonId) continue; - // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary + // Ensure this exact Pokémon index isn't a duplicate. This check doesn't seem necessary // because the species and held items were already checked directly above. for (j = 0; j < i; j++) { @@ -1728,7 +1727,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) chosenMonIndices[i] = monId; - // Place the chosen pokemon into the trainer's party. + // Place the chosen Pokémon into the trainer's party. CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monId].species, level, @@ -1738,7 +1737,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) otID); friendship = MAX_FRIENDSHIP; - // Give the chosen pokemon its specified moves. + // Give the chosen Pokémon its specified moves. for (j = 0; j < MAX_MON_MOVES; j++) { SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monId].moves[j], j); @@ -1749,14 +1748,14 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_FRIENDSHIP, &friendship); SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]); - // The pokemon was successfully added to the trainer's party, so it's safe to move on to + // The Pokémon was successfully added to the trainer's party, so it's safe to move on to // the next party slot. i++; } } // Probably an early draft before the 'CreateApprenticeMon' was written. -static void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId) +static void UNUSED Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId) { s32 i, j; u8 friendship = MAX_FRIENDSHIP; @@ -1805,7 +1804,7 @@ u16 GetRandomFrontierMonFromSet(u16 trainerId) do { - // "High tier" pokemon are only allowed on open level mode + // "High tier" Pokémon are only allowed on open level mode // 20 is not a possible value for level here monId = monSet[Random() % numMons]; } while((level == FRONTIER_MAX_LEVEL_50 || level == 20) && monId > FRONTIER_MONS_HIGH_TIER); @@ -1832,12 +1831,14 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) if (trainerId < FRONTIER_TRAINERS_COUNT) { - u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; - u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); // By mistake Battle Tower's Level 50 challenge number is used to determine the IVs for Battle Factory. #ifdef BUGFIX + u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / FRONTIER_STAGES_PER_CHALLENGE; #else + u8 UNUSED lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); u8 challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][FRONTIER_LVL_50] / FRONTIER_STAGES_PER_CHALLENGE; #endif if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < FRONTIER_STAGES_PER_CHALLENGE - 1) @@ -2200,7 +2201,7 @@ static void SaveTowerChallenge(void) SaveBattleTowerRecord(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; - VarSet(VAR_TEMP_0, 0); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; SaveGameFrontier(); } @@ -2278,7 +2279,7 @@ static void LoadMultiPartnerCandidatesData(void) u32 lvlMode, battleMode; s32 challengeNum; u32 species1, species2; - u32 level; + u32 UNUSED level; struct ObjectEventTemplate *objEventTemplates; objEventTemplates = gSaveBlock1Ptr->objectEventTemplates; @@ -2453,15 +2454,15 @@ static void GetPotentialPartnerMoveAndSpecies(u16 trainerId, u16 monId) // These partners can be an NPC or a former/record-mixed Apprentice // When talked to, their response consists of: // PARTNER_MSGID_INTRO - A greeting -// PARTNER_MSGID_MON1 - Naming one pokemon on their team, and a move it has -// PARTNER_MSGID_MON2_ASK - Naming a second pokemon on their team, a move it has, and asking if they'd like to be their partner +// PARTNER_MSGID_MON1 - Naming one Pokémon on their team, and a move it has +// PARTNER_MSGID_MON2_ASK - Naming a second Pokémon on their team, a move it has, and asking if they'd like to be their partner // PARTNER_MSGID_ACCEPT - If the player agrees to be their partner // PARTNER_MSGID_REJECT - If the player declines to be their partner static void ShowPartnerCandidateMessage(void) { s32 i, j, partnerId; s32 monId; - s32 level = SetFacilityPtrsGetLevel(); + s32 UNUSED level = SetFacilityPtrsGetLevel(); u16 winStreak = GetCurrentFacilityWinStreak(); s32 challengeNum = winStreak / FRONTIER_STAGES_PER_CHALLENGE; s32 k = gSpecialVar_LastTalked - 2; @@ -2772,7 +2773,7 @@ static void AwardBattleTowerRibbons(void) #ifdef BUGFIX struct RibbonCounter ribbons[MAX_FRONTIER_PARTY_SIZE]; #else - struct RibbonCounter ribbons[3]; // BUG: 4 Pokemon can receive ribbons in a double battle mode. + struct RibbonCounter ribbons[3]; // BUG: 4 Pokémon can receive ribbons in a double battle mode. #endif u8 ribbonType = 0; u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; @@ -2823,7 +2824,7 @@ static void AwardBattleTowerRibbons(void) // This is a leftover debugging function that is used to populate the E-Reader // trainer with the player's current data. -static void FillEReaderTrainerWithPlayerData(void) +static void UNUSED FillEReaderTrainerWithPlayerData(void) { struct BattleTowerEReaderTrainer *ereaderTrainer = &gSaveBlock2Ptr->frontier.ereaderTrainer; s32 i, j; @@ -2981,7 +2982,7 @@ static void FillPartnerParty(u16 trainerId) #ifdef BUGFIX j, #else - i, // BUG: personality was stored in the 'j' variable. As a result, Steven's pokemon do not have the intended natures. + i, // BUG: personality was stored in the 'j' variable. As a result, Steven's Pokémon do not have the intended natures. #endif OT_ID_PRESET, STEVEN_OTID); for (j = 0; j < PARTY_SIZE; j++) @@ -3175,7 +3176,7 @@ void CalcApprenticeChecksum(struct Apprentice *apprentice) s32 i; apprentice->checksum = 0; - for (i = 0; i < (sizeof(struct Apprentice) - 4) / 4; i++) + for (i = 0; i < offsetof(struct Apprentice, checksum) / sizeof(u32); i++) apprentice->checksum += ((u32 *)apprentice)[i]; } @@ -3183,7 +3184,7 @@ static void ClearApprentice(struct Apprentice *apprentice) { s32 i; - for (i = 0; i < (sizeof(struct Apprentice)) / 4; i++) + for (i = 0; i < sizeof(struct Apprentice) / sizeof(u32); i++) ((u32 *)apprentice)[i] = 0; ResetApprenticeStruct(apprentice); } @@ -3196,7 +3197,7 @@ static void ValidateApprenticesChecksums(void) { u32 *data = (u32 *) &gSaveBlock2Ptr->apprentices[i]; u32 checksum = 0; - for (j = 0; j < (sizeof(struct Apprentice) - 4) / 4; j++) + for (j = 0; j < offsetof(struct Apprentice, checksum) / sizeof(u32); j++) checksum += data[j]; if (gSaveBlock2Ptr->apprentices[i].checksum != checksum) ClearApprentice(&gSaveBlock2Ptr->apprentices[i]); @@ -3408,7 +3409,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) { u16 monId = monSet[Random() % bfMonCount]; - // Ensure this pokemon species isn't a duplicate. + // Ensure this Pokémon species isn't a duplicate. for (j = 0; j < i + firstMonId; j++) { if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monId].species) @@ -3427,7 +3428,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) if (j != i + firstMonId) continue; - // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary + // Ensure this exact Pokémon index isn't a duplicate. This check doesn't seem necessary // because the species and held items were already checked directly above. for (j = 0; j < i; j++) { @@ -3439,7 +3440,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) chosenMonIndices[i] = monId; - // Place the chosen pokemon into the trainer's party. + // Place the chosen Pokémon into the trainer's party. CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monId].species, level, @@ -3449,7 +3450,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) otID); friendship = MAX_FRIENDSHIP; - // Give the chosen pokemon its specified moves. + // Give the chosen Pokémon its specified moves. for (j = 0; j < MAX_MON_MOVES; j++) { SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monId].moves[j], j); @@ -3460,7 +3461,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_FRIENDSHIP, &friendship); SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]); - // The pokemon was successfully added to the trainer's party, so it's safe to move on to + // The Pokémon was successfully added to the trainer's party, so it's safe to move on to // the next party slot. i++; } @@ -3506,7 +3507,7 @@ bool32 ValidateBattleTowerRecord(u8 recordId) // unused u32 *record = (u32 *)(&gSaveBlock2Ptr->frontier.towerRecords[recordId]); u32 checksum = 0; u32 hasData = 0; - for (i = 0; i < (sizeof(struct EmeraldBattleTowerRecord) - 4) / 4; i++) // - 4, because of the last fjeld bejng the checksum jtself. + for (i = 0; i < offsetof(struct EmeraldBattleTowerRecord, checksum) / sizeof(u32); i++) { checksum += record[i]; hasData |= record[i]; diff --git a/src/battle_transition.c b/src/battle_transition.c index 4066f72e58..11f9cddf4b 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -779,7 +779,7 @@ static const TransitionStateFunc sTransitionIntroFuncs[] = static const struct SpriteFrameImage sSpriteImage_Pokeball[] = { - sPokeball_Gfx, sizeof(sPokeball_Gfx) + {sPokeball_Gfx, sizeof(sPokeball_Gfx)} }; static const union AnimCmd sSpriteAnim_Pokeball[] = @@ -841,12 +841,12 @@ static const struct OamData sOam_UnusedBrendanLass = static const struct SpriteFrameImage sImageTable_UnusedBrendan[] = { - sUnusedBrendan_Gfx, sizeof(sUnusedBrendan_Gfx) + {sUnusedBrendan_Gfx, sizeof(sUnusedBrendan_Gfx)} }; static const struct SpriteFrameImage sImageTable_UnusedLass[] = { - sUnusedLass_Gfx, sizeof(sUnusedLass_Gfx) + {sUnusedLass_Gfx, sizeof(sUnusedLass_Gfx)} }; static const union AnimCmd sSpriteAnim_UnusedBrendanLass[] = @@ -1017,8 +1017,7 @@ static void CB2_TestBattleTransition(void) UpdatePaletteFade(); } -// Unused -static void TestBattleTransition(u8 transitionId) +static void UNUSED TestBattleTransition(u8 transitionId) { sTestingTransitionId = transitionId; SetMainCallback2(CB2_TestBattleTransition); @@ -1069,7 +1068,7 @@ static void Task_BattleTransition(u8 taskId) static bool8 Transition_StartIntro(struct Task *task) { SetWeatherScreenFadeOut(); - CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, sizeof(gPlttBufferUnfaded)); + CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); if (sTasks_Intro[task->tTransitionId] != NULL) { CreateTask(sTasks_Intro[task->tTransitionId], 4); @@ -4498,7 +4497,7 @@ static bool8 FrontierSquares_Shrink(struct Task *task) switch (task->tShrinkState) { case 0: - for (i = 250; i < 255; i++) + for (i = BG_PLTT_ID(15) + 10; i < BG_PLTT_ID(15) + 15; i++) { gPlttBufferUnfaded[i] = RGB_BLACK; gPlttBufferFaded[i] = RGB_BLACK; diff --git a/src/battle_transition_frontier.c b/src/battle_transition_frontier.c index 2527211296..417bd96d63 100644 --- a/src/battle_transition_frontier.c +++ b/src/battle_transition_frontier.c @@ -46,7 +46,7 @@ static bool8 CirclesSymmetricSpiralInSeq_End(struct Task *task); #define PALTAG_LOGO_CIRCLES 0x2E90 static const u32 sLogoCenter_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.4bpp.lz"); -static const u32 sLogoCenter_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.bin"); +static const u32 sLogoCenter_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.bin.lz"); static const u32 sLogoCircles_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_circles.4bpp.lz"); static const u16 sLogo_Pal[] = INCBIN_U16("graphics/battle_transitions/frontier_logo_circles.gbapal"); diff --git a/src/battle_tv.c b/src/battle_tv.c index b9008b47a7..e9f518f605 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -526,7 +526,7 @@ static const u16 *const sPointsArray[] = }; // Points will always be calculated for these messages -// even if current pokemon does not have corresponding move +// even if current Pokémon does not have corresponding move static const u16 sSpecialBattleStrings[] = { STRINGID_PKMNPERISHCOUNTFELL, STRINGID_PKMNWISHCAMETRUE, STRINGID_PKMNLOSTPPGRUDGE, diff --git a/src/battle_util.c b/src/battle_util.c index 68a5b6adaa..d79c61b382 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -342,7 +342,11 @@ void HandleAction_UseItem(void) gBattleCommunication[MULTISTRING_CHOOSER] = AI_HEAL_CONFUSION; if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & (1 << AI_HEAL_CONFUSION)) { - if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 0x3E) + if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & ((1 << AI_HEAL_PARALYSIS) + | (1 << AI_HEAL_FREEZE) + | (1 << AI_HEAL_BURN) + | (1 << AI_HEAL_POISON) + | (1 << AI_HEAL_SLEEP))) gBattleCommunication[MULTISTRING_CHOOSER] = AI_HEAL_SLEEP; } else @@ -374,7 +378,7 @@ void HandleAction_UseItem(void) gBattleTextBuff1[2]++; } - gBattleScripting.animArg1 = gBattleTextBuff1[2] + 14; + gBattleScripting.animArg1 = gBattleTextBuff1[2] + STAT_ANIM_PLUS1; gBattleScripting.animArg2 = 0; } break; @@ -645,7 +649,7 @@ void HandleAction_NothingIsFainted(void) gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR + | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_IGNORE_ON_AIR | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_PASSIVE_DAMAGE | HITMARKER_OBEYS | HITMARKER_WAKE_UP_CLEAR | HITMARKER_SYNCHRONISE_EFFECT | HITMARKER_CHARGING | HITMARKER_NEVER_SET); @@ -658,7 +662,7 @@ void HandleAction_ActionFinished(void) gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; SpecialStatusesClear(); gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR + | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_IGNORE_ON_AIR | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_PASSIVE_DAMAGE | HITMARKER_OBEYS | HITMARKER_WAKE_UP_CLEAR | HITMARKER_SYNCHRONISE_EFFECT | HITMARKER_CHARGING | HITMARKER_NEVER_SET); @@ -823,8 +827,7 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker) } } -// Unused -static void MarkAllBattlersForControllerExec(void) +static void UNUSED MarkAllBattlersForControllerExec(void) { int i; @@ -1106,7 +1109,6 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) return unusableMoves; } -#define ALL_MOVES_MASK ((1 << MAX_MON_MOVES) - 1) bool8 AreAllMovesUnusable(void) { u8 unusable = CheckMoveLimitations(gActiveBattler, 0, MOVE_LIMITATIONS_ALL); @@ -1123,7 +1125,6 @@ bool8 AreAllMovesUnusable(void) return (unusable == ALL_MOVES_MASK); } -#undef ALL_MOVES_MASK u8 GetImprisonedMovesCount(u8 battlerId, u16 move) { @@ -1447,7 +1448,7 @@ u8 DoBattlerEndTurnEffects(void) { u8 effect = 0; - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) { gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; @@ -1544,7 +1545,7 @@ u8 DoBattlerEndTurnEffects(void) if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBattler].hp != 0) { // R/S does not perform this sleep check, which causes the nightmare effect to - // persist even after the affected Pokemon has been awakened by Shed Skin. + // persist even after the affected Pokémon has been awakened by Shed Skin. if (gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; @@ -1624,7 +1625,7 @@ u8 DoBattlerEndTurnEffects(void) } if (gBattlerAttacker != gBattlersCount) { - effect = 2; // a pokemon was awaken + effect = 2; // a Pokémon was awaken break; } else @@ -1684,7 +1685,7 @@ u8 DoBattlerEndTurnEffects(void) if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i]) break; } - if (i == MAX_MON_MOVES) // pokemon does not have the disabled move anymore + if (i == MAX_MON_MOVES) // Pokémon does not have the disabled move anymore { gDisableStructs[gActiveBattler].disabledMove = MOVE_NONE; gDisableStructs[gActiveBattler].disableTimer = 0; @@ -1701,7 +1702,7 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_ENCORE: // encore if (gDisableStructs[gActiveBattler].encoreTimer != 0) { - if (gBattleMons[gActiveBattler].moves[gDisableStructs[gActiveBattler].encoredMovePos] != gDisableStructs[gActiveBattler].encoredMove) // pokemon does not have the encored move anymore + if (gBattleMons[gActiveBattler].moves[gDisableStructs[gActiveBattler].encoredMovePos] != gDisableStructs[gActiveBattler].encoredMove) // Pokémon does not have the encored move anymore { gDisableStructs[gActiveBattler].encoredMove = MOVE_NONE; gDisableStructs[gActiveBattler].encoreTimer = 0; @@ -1760,13 +1761,13 @@ u8 DoBattlerEndTurnEffects(void) return effect; } } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); return 0; } bool8 HandleWishPerishSongOnTurnEnd(void) { - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); + gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); switch (gBattleStruct->wishPerishSongState) { @@ -1795,7 +1796,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void) gBattlerTarget = gActiveBattler; gBattlerAttacker = gWishFutureKnock.futureSightAttacker[gActiveBattler]; gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBattler]; - gSpecialStatuses[gBattlerTarget].dmg = 0xFFFF; + gSpecialStatuses[gBattlerTarget].shellBellDmg = IGNORE_SHELL_BELL; BattleScriptExecute(BattleScript_MonTookFutureAttack); if (gWishFutureKnock.futureSightCounter[gActiveBattler] == 0 @@ -1866,7 +1867,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void) break; } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_SKIP_DMG_TRACK); + gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); return FALSE; } @@ -2211,11 +2212,11 @@ u8 AtkCanceller_UnableToUseMove(void) { // This is removed in FRLG and Emerald for some reason //gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; - if (gTakenDmg[gBattlerAttacker]) + if (gBideDmg[gBattlerAttacker]) { gCurrentMove = MOVE_BIDE; - *bideDmg = gTakenDmg[gBattlerAttacker] * 2; - gBattlerTarget = gTakenDmgByBattler[gBattlerAttacker]; + *bideDmg = gBideDmg[gBattlerAttacker] * 2; + gBattlerTarget = gBideTarget[gBattlerAttacker]; if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); gBattlescriptCurrInstr = BattleScript_BideAttack; @@ -2625,7 +2626,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattleMons[battler].statStages[STAT_SPEED] < MAX_STAT_STAGE && gDisableStructs[battler].isFirstTurn != 2) { gBattleMons[battler].statStages[STAT_SPEED]++; - gBattleScripting.animArg1 = 14 + STAT_SPEED; + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_SPEED; gBattleScripting.animArg2 = 0; BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); gBattleScripting.battler = battler; @@ -2771,16 +2772,17 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { do { + // Pick either MOVE_EFFECT_SLEEP, MOVE_EFFECT_POISON or MOVE_EFFECT_BURN gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); - + // Replace MOVE_EFFECT_BURN with MOVE_EFFECT_PARALYSIS if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN) - gBattleCommunication[MOVE_EFFECT_BYTE] += 2; // 5 MOVE_EFFECT_PARALYSIS + gBattleCommunication[MOVE_EFFECT_BYTE] += (MOVE_EFFECT_PARALYSIS - MOVE_EFFECT_BURN); gBattleCommunication[MOVE_EFFECT_BYTE] += MOVE_EFFECT_AFFECTS_USER; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; @@ -2795,7 +2797,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; @@ -2810,7 +2812,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; @@ -2825,7 +2827,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; @@ -2961,7 +2963,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleScripting.battler = gBattlerTarget; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; @@ -2977,7 +2979,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleScripting.battler = gBattlerAttacker; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; @@ -3001,7 +3003,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) { u8 target2; - side = BATTLE_OPPOSITE(GetBattlerPosition(i)) & BIT_SIDE; // side of the opposing pokemon + side = BATTLE_OPPOSITE(GetBattlerPosition(i)) & BIT_SIDE; // side of the opposing Pokémon target1 = GetBattlerAtPosition(side); target2 = GetBattlerAtPosition(side + BIT_FLANK); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) @@ -3229,7 +3231,7 @@ enum PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); \ gEffectBattler = battlerId; \ SET_STATCHANGER(stat, 1, FALSE); \ - gBattleScripting.animArg1 = 14 + (stat); \ + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + (stat); \ gBattleScripting.animArg2 = 0; \ BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); \ effect = ITEM_STATS_CHANGE; \ @@ -3240,8 +3242,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) int i = 0; u8 effect = ITEM_NO_EFFECT; u8 changedPP = 0; - u8 battlerHoldEffect, atkHoldEffect, defHoldEffect; - u8 battlerHoldEffectParam, atkHoldEffectParam, defHoldEffectParam; + u8 battlerHoldEffect, atkHoldEffect, UNUSED defHoldEffect; + u8 battlerHoldEffectParam, atkHoldEffectParam, UNUSED defHoldEffectParam; u16 atkItem, defItem; gLastUsedItem = gBattleMons[battlerId].item; @@ -3415,7 +3417,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); // Only the Attack stat-up berry has this gEffectBattler = battlerId; SET_STATCHANGER(STAT_ATK, 1, FALSE); - gBattleScripting.animArg1 = 14 + STAT_ATK; + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_ATK; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; @@ -3470,7 +3472,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gEffectBattler = battlerId; SET_STATCHANGER(i + 1, 2, FALSE); - gBattleScripting.animArg1 = 0x21 + i + 6; + gBattleScripting.animArg1 = STAT_ANIM_PLUS2 + (i + 1); gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; @@ -3767,8 +3769,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; case HOLD_EFFECT_SHELL_BELL: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gSpecialStatuses[gBattlerTarget].dmg != 0 - && gSpecialStatuses[gBattlerTarget].dmg != 0xFFFF + && gSpecialStatuses[gBattlerTarget].shellBellDmg != 0 + && gSpecialStatuses[gBattlerTarget].shellBellDmg != IGNORE_SHELL_BELL && gBattlerAttacker != gBattlerTarget && gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP && gBattleMons[gBattlerAttacker].hp != 0) @@ -3776,10 +3778,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gLastUsedItem = atkItem; gPotentialItemEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerAttacker; - gBattleMoveDamage = (gSpecialStatuses[gBattlerTarget].dmg / atkHoldEffectParam) * -1; + gBattleMoveDamage = (gSpecialStatuses[gBattlerTarget].shellBellDmg / atkHoldEffectParam) * -1; if (gBattleMoveDamage == 0) gBattleMoveDamage = -1; - gSpecialStatuses[gBattlerTarget].dmg = 0; + gSpecialStatuses[gBattlerTarget].shellBellDmg = 0; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret; effect++; @@ -3950,11 +3952,11 @@ u8 IsMonDisobedient(void) if (calc < obedienceLevel) { calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], MOVE_LIMITATIONS_ALL); - if (calc == 0xF) // all moves cannot be used + if (calc == ALL_MOVES_MASK) // all moves cannot be used { // 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] = Random() & (NUM_LOAF_STRINGS - 1); + gBattleCommunication[MULTISTRING_CHOOSER] = MOD(Random(), NUM_LOAF_STRINGS); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; return 1; } @@ -3962,7 +3964,7 @@ u8 IsMonDisobedient(void) { do { - gCurrMovePos = gChosenMovePos = Random() & (MAX_MON_MOVES - 1); + gCurrMovePos = gChosenMovePos = MOD(Random(), MAX_MON_MOVES); } while (gBitTable[gCurrMovePos] & calc); gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; @@ -4005,7 +4007,7 @@ u8 IsMonDisobedient(void) { // 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] = Random() & (NUM_LOAF_STRINGS - 1); + gBattleCommunication[MULTISTRING_CHOOSER] = MOD(Random(), NUM_LOAF_STRINGS); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; return 1; } diff --git a/src/berry_blender.c b/src/berry_blender.c index cf0de017fa..a5102d48fb 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -916,14 +916,14 @@ static const u8 sBlackPokeblockFlavorFlags[] = { (1 << FLAVOR_SOUR) | (1 << FLAVOR_SWEET) | (1 << FLAVOR_SPICY), }; -static const u8 sUnused[] = -{ - 0xfe, 0x02, 0x02, 0xce, 0xd0, 0x37, 0x44, 0x07, 0x1f, 0x0c, 0x10, - 0x00, 0xff, 0xfe, 0x91, 0x72, 0xce, 0xd0, 0x37, 0x44, 0x07, 0x1f, - 0x0c, 0x10, 0x00, 0xff, 0x06, 0x27, 0x02, 0xff, 0x00, 0x0c, 0x48, - 0x02, 0xff, 0x00, 0x01, 0x1f, 0x02, 0xff, 0x00, 0x16, 0x37, 0x02, - 0xff, 0x00, 0x0d, 0x50, 0x4b, 0x02, 0xff, 0x06, 0x06, 0x06, 0x06, - 0x05, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02 +static const u8 sJPText_GoodTvReady[] = _("\nいいTVができました "); // Unused +static const u8 sJPText_BadTvReady[] = _("\nダメTVができました "); // Unused +static const u8 sJPText_Flavors[][5] = {_("からい"), _("しぶい"), _("あまい"), _("にがい"), _("すっぱい")}; // Unused + +static const u8 sUnused[] = { + 6, 6, 6, 6, 5, + 3, 3, 3, 2, 2, + 3, 3, 3, 3, 2 }; static const struct WindowTemplate sBlenderRecordWindowTemplate = @@ -1033,11 +1033,12 @@ static void InitBerryBlenderWindows(void) s32 i; DeactivateAllTextPrinters(); - for (i = 0; i < 5; i++) + // Initialize only the main text windows (player names and message box; excludes results screen) + for (i = 0; i < WIN_RESULTS; i++) FillWindowPixelBuffer(i, PIXEL_FILL(0)); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, DISPLAY_TILE_WIDTH, DISPLAY_TILE_HEIGHT); - Menu_LoadStdPalAt(0xE0); + Menu_LoadStdPalAt(BG_PLTT_ID(14)); } } @@ -1907,7 +1908,7 @@ static void Task_HandleOpponent1(u8 taskId) static void Task_HandleOpponent2(u8 taskId) { u32 var1 = (sBerryBlender->arrowPos + 0x1800) & 0xFFFF; - u32 arrowId = sBerryBlender->playerIdToArrowId[2] & 0xFF; + u8 arrowId = sBerryBlender->playerIdToArrowId[2]; if ((var1 >> 8) > sArrowHitRangeStart[arrowId] + 20 && (var1 >> 8) < sArrowHitRangeStart[arrowId] + 40) { if (!gTasks[taskId].tDidInput) @@ -1924,11 +1925,9 @@ static void Task_HandleOpponent2(u8 taskId) } else { - u8 value; if (rand > 65) gRecvCmds[2][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; - value = rand - 41; - if (value < 25) + if (rand > 40 && rand <= 65) gRecvCmds[2][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; if (rand < 10) CreateOpponentMissTask(2, 5); @@ -1952,7 +1951,7 @@ static void Task_HandleOpponent2(u8 taskId) static void Task_HandleOpponent3(u8 taskId) { u32 var1 = (sBerryBlender->arrowPos + 0x1800) & 0xFFFF; - u32 arrowId = sBerryBlender->playerIdToArrowId[3] & 0xFF; + u8 arrowId = sBerryBlender->playerIdToArrowId[3]; if ((var1 >> 8) > sArrowHitRangeStart[arrowId] + 20 && (var1 >> 8) < sArrowHitRangeStart[arrowId] + 40) { if (gTasks[taskId].data[0] == 0) @@ -1970,16 +1969,9 @@ static void Task_HandleOpponent3(u8 taskId) else { if (rand > 60) - { gRecvCmds[3][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; - } - else - { - s8 value = rand - 56; // makes me wonder what the original code was - u8 value2 = value; - if (value2 < 5) - gRecvCmds[3][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; - } + else if (rand > 55 && rand <= 60) + gRecvCmds[3][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; if (rand < 5) CreateOpponentMissTask(3, 5); } @@ -2049,7 +2041,8 @@ static void UpdateSpeedFromHit(u16 cmd) switch (cmd) { case LINKCMD_BLENDER_SCORE_BEST: - if (sBerryBlender->speed < 1500) { + if (sBerryBlender->speed < 1500) + { sBerryBlender->speed += (384 / sNumPlayersToSpeedDivisor[sBerryBlender->numPlayers]); } else @@ -2376,8 +2369,7 @@ static void Debug_SetMaxRPMStage(s16 value) sDebug_MaxRPMStage = value; } -// Unused -static s16 Debug_GetMaxRPMStage(void) +static s16 UNUSED Debug_GetMaxRPMStage(void) { return sDebug_MaxRPMStage; } @@ -2387,8 +2379,7 @@ static void Debug_SetGameTimeStage(s16 value) sDebug_GameTimeStage = value; } -// Unued -static s16 Debug_GetGameTimeStage(void) +static s16 UNUSED Debug_GetGameTimeStage(void) { return sDebug_GameTimeStage; } @@ -2500,8 +2491,7 @@ static void CalculatePokeblock(struct BlenderBerry *berries, struct Pokeblock *p flavors[i] = sPokeblockFlavors[i]; } -// Unused -static void Debug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 numPlayers, u8 *flavors, u16 maxRPM) +static void UNUSED Debug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 numPlayers, u8 *flavors, u16 maxRPM) { CalculatePokeblock(berries, pokeblock, numPlayers, flavors, maxRPM); } @@ -3108,10 +3098,10 @@ static void DrawBlenderCenter(struct BgAffineSrcData *dest) { struct BgAffineSrcData affineSrc; - affineSrc.texX = 0x7800; - affineSrc.texY = 0x5000; - affineSrc.scrX = 0x78 - sBerryBlender->bg_X; - affineSrc.scrY = 0x50 - sBerryBlender->bg_Y; + affineSrc.texX = (DISPLAY_WIDTH / 2) << 8; + affineSrc.texY = (DISPLAY_HEIGHT / 2) << 8; + affineSrc.scrX = DISPLAY_WIDTH / 2 - sBerryBlender->bg_X; + affineSrc.scrY = DISPLAY_HEIGHT / 2 - sBerryBlender->bg_Y; affineSrc.sx = sBerryBlender->centerScale; affineSrc.sy = sBerryBlender->centerScale; affineSrc.alpha = sBerryBlender->arrowPos; @@ -3470,7 +3460,7 @@ static bool8 PrintBlendingResults(void) struct Pokeblock pokeblock; u8 flavors[FLAVOR_COUNT + 1]; u8 text[40]; - u16 berryIds[4]; // unused + u16 UNUSED berryIds[4]; switch (sBerryBlender->mainState) { @@ -3865,6 +3855,9 @@ static void Blender_AddTextPrinter(u8 windowId, const u8 *string, u8 x, u8 y, s3 { case 0: case 3: +#ifdef UBFIX + default: +#endif txtColor[0] = TEXT_COLOR_WHITE; txtColor[1] = TEXT_COLOR_DARK_GRAY; txtColor[2] = TEXT_COLOR_LIGHT_GRAY; diff --git a/src/berry_crush.c b/src/berry_crush.c old mode 100755 new mode 100644 index 812ca19344..05e708162d --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -1062,7 +1062,7 @@ static void BerryCrush_SetVBlankCB(void) SetVBlankCallback(VBlankCB); } -static void BerryCrush_InitVBlankCB(void) +static void UNUSED BerryCrush_InitVBlankCB(void) { SetVBlankCallback(NULL); } @@ -1373,7 +1373,6 @@ static void CreateBerrySprites(struct BerryCrushGame *game, struct BerryCrushGam u8 spriteId; s16 distance, var1; s16 *data; - s32 amplitude; s16 speed; u32 var2; @@ -1395,11 +1394,7 @@ static void CreateBerrySprites(struct BerryCrushGame *game, struct BerryCrushGam sYAccel = 32; sBitfield = 112; // Setting bits in MASK_TARGET_Y distance = gfx->playerCoords[i]->berryXDest - gfx->playerCoords[i]->berryXOffset; - amplitude = distance; - if (distance < 0) - amplitude += 3; - - sAmplitude = amplitude >> 2; + sAmplitude = distance / 4; distance *= 128; var2 = speed + 32; var2 = var2 / 2; @@ -2898,13 +2893,13 @@ static u32 Cmd_FinishGame(struct BerryCrushGame *game, u8 *args) case 0: game->gameState = STATE_FINISHED; PlaySE(SE_M_STRENGTH); - BlendPalettes(PALETTES_ALL, 8, RGB(31, 31, 0)); + BlendPalettes(PALETTES_ALL, 8, RGB_YELLOW); game->gfx.counter = 2; break; case 1: if (--game->gfx.counter != (u8)-1) return 0; - BlendPalettes(PALETTES_ALL, 0, RGB(31, 31, 0)); + BlendPalettes(PALETTES_ALL, 0, RGB_YELLOW); game->gfx.vibrationIdx = 4; game->gfx.counter = 0; game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0]; @@ -2955,13 +2950,13 @@ static u32 Cmd_HandleTimeUp(struct BerryCrushGame *game, u8 *args) case 0: game->gameState = STATE_TIMES_UP; PlaySE(SE_FAILURE); - BlendPalettes(PALETTES_ALL, 8, RGB(31, 0, 0)); + BlendPalettes(PALETTES_ALL, 8, RGB_RED); game->gfx.counter = 4; break; case 1: if (--game->gfx.counter != (u8)-1) return 0; - BlendPalettes(PALETTES_ALL, 0, RGB(31, 0, 0)); + BlendPalettes(PALETTES_ALL, 0, RGB_RED); game->gfx.counter = 0; break; case 2: diff --git a/src/berry_fix_graphics.c b/src/berry_fix_graphics.c index b37645d4c2..80510a4ce1 100644 --- a/src/berry_fix_graphics.c +++ b/src/berry_fix_graphics.c @@ -8,9 +8,9 @@ static const struct { const u16 *pltt; } sBerryFixGraphics[] = { { - gBerryFixGameboy_Gfx, - gBerryFixGameboy_Tilemap, - gBerryFixGameboy_Pal + gBerryFixGbaConnect_Gfx, + gBerryFixGbaConnect_Tilemap, + gBerryFixGbaConnect_Pal }, { gBerryFixGameboyLogo_Gfx, gBerryFixGameboyLogo_Tilemap, @@ -34,8 +34,8 @@ static const struct { } }; -// Unused. See berry_fix_program.c -static void LoadBerryFixGraphics(u32 idx) +// See berry_fix_program.c +static void UNUSED LoadBerryFixGraphics(u32 idx) { REG_DISPCNT = 0; REG_BG0HOFS = 0; @@ -43,7 +43,7 @@ static void LoadBerryFixGraphics(u32 idx) REG_BLDCNT = 0; LZ77UnCompVram(sBerryFixGraphics[idx].gfx, (void *)BG_CHAR_ADDR(0)); LZ77UnCompVram(sBerryFixGraphics[idx].tilemap, (void *)BG_SCREEN_ADDR(31)); - CpuCopy16(sBerryFixGraphics[idx].pltt, (void *)PLTT, 0x200); - REG_BG0CNT = 0x1f00; + CpuCopy16(sBerryFixGraphics[idx].pltt, (void *)BG_PLTT, BG_PLTT_SIZE); + REG_BG0CNT = BGCNT_SCREENBASE(31); REG_DISPCNT = DISPCNT_BG0_ON; } diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index af21bb929a..5900cb298a 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -117,13 +117,7 @@ static const struct WindowTemplate sBerryFixWindowTemplates[] = { DUMMY_WIN_TEMPLATE }; -static const u16 sBerryFixPalColors[] = { - RGB_WHITE, RGB_WHITE, RGB(12, 12, 12), RGB(26, 26, 25), - RGB(28, 1, 1), RGB(31, 23, 14), RGB(4, 19, 1), RGB(18, 30, 18), - RGB(6, 10, 25), RGB(20, 24, 30), RGB_WHITE, RGB(12, 12, 12), - RGB(26, 26, 25), RGB_BLACK, RGB_BLACK, RGB_BLACK -}; - +static const u16 ALIGNED(4) sText_Pal[] = INCBIN_U16("graphics/berry_fix/text.gbapal"); static const u8 sBerryProgramTextColors[] = {TEXT_DYNAMIC_COLOR_1, TEXT_DYNAMIC_COLOR_2, TEXT_DYNAMIC_COLOR_3}; static const u8 sGameTitleTextColors[] = { TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_1, TEXT_DYNAMIC_COLOR_4}; @@ -152,9 +146,9 @@ static const struct { const u16 *palette; } sBerryFixGraphics[] = { [SCENE_ENSURE_CONNECT] = { - gBerryFixGameboy_Gfx, - gBerryFixGameboy_Tilemap, - gBerryFixGameboy_Pal + gBerryFixGbaConnect_Gfx, + gBerryFixGbaConnect_Tilemap, + gBerryFixGbaConnect_Pal }, [SCENE_TURN_OFF_POWER] = { gBerryFixGameboyLogo_Gfx, @@ -304,7 +298,7 @@ static void BerryFix_GpuSet(void) InitWindows(sBerryFixWindowTemplates); DeactivateAllTextPrinters(); - DmaCopy32(3, sBerryFixPalColors, BG_PLTT + 0x1E0, sizeof(sBerryFixPalColors)); + DmaCopy32(3, sText_Pal, BG_PLTT + PLTT_OFFSET_4BPP(15), sizeof(sText_Pal)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP); FillWindowPixelBuffer(WIN_GAME_NAMES, PIXEL_FILL(0)); FillWindowPixelBuffer(WIN_TURN_OFF_TITLE, PIXEL_FILL(0)); @@ -374,7 +368,9 @@ static void BerryFix_SetScene(int scene) CopyBgTilemapBufferToVram(0); LZ77UnCompVram(sBerryFixGraphics[scene].gfx, (void *)BG_CHAR_ADDR(1)); LZ77UnCompVram(sBerryFixGraphics[scene].tilemap, (void *)BG_SCREEN_ADDR(31)); - CpuCopy32(sBerryFixGraphics[scene].palette, (void *)BG_PLTT, 0x100); + // These palettes range in size from 32-48 colors, so the below is interpreting whatever + // follows the palette (by default, the corresponding tiles) as the remaining 80-96. + CpuCopy32(sBerryFixGraphics[scene].palette, (void *)BG_PLTT, PLTT_SIZEOF(128)); ShowBg(0); ShowBg(1); } diff --git a/src/berry_powder.c b/src/berry_powder.c index 7066f9d95c..4a9fa421d3 100755 --- a/src/berry_powder.c +++ b/src/berry_powder.c @@ -15,8 +15,7 @@ static EWRAM_DATA u8 sBerryPowderVendorWindowId = 0; -// Unused -static const struct BgTemplate sBerryPowderBgTemplates[] = +static const struct BgTemplate UNUSED sBerryPowderBgTemplates[] = { { .bg = 0, @@ -57,10 +56,9 @@ static const struct BgTemplate sBerryPowderBgTemplates[] = }; // ? Part of the BG templates? -static const u32 sUnknown[] = {0xFF, 0x00}; +static const u32 UNUSED sUnknown[] = {0xFF, 0x00}; -// Unused -static const struct WindowTemplate sBerryPowderWindowTemplates[] = +static const struct WindowTemplate UNUSED sBerryPowderWindowTemplates[] = { { .bg = 0, @@ -177,7 +175,7 @@ bool8 GiveBerryPowder(u32 amountToAdd) } } -static bool8 TakeBerryPowder_(u32 cost) +static bool8 UNUSED TakeBerryPowder_(u32 cost) { u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount; if (!HasEnoughBerryPowder_(cost)) diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c index e43d686001..415f22e59e 100644 --- a/src/berry_tag_screen.c +++ b/src/berry_tag_screen.c @@ -310,6 +310,8 @@ static void HandleInitBackgrounds(void) ShowBg(3); } +#define BG_TILE 0x42 + static bool8 LoadBerryTagGfx(void) { u16 i; @@ -333,15 +335,16 @@ static bool8 LoadBerryTagGfx(void) sBerryTag->gfxState++; break; case 3: + // Palette of the bg tiles changes depending on the player's gender if (gSaveBlock2Ptr->playerGender == MALE) { for (i = 0; i < ARRAY_COUNT(sBerryTag->tilemapBuffers[1]); i++) - sBerryTag->tilemapBuffers[1][i] = 0x4042; + sBerryTag->tilemapBuffers[1][i] = (4 << 12) | BG_TILE; } else { for (i = 0; i < ARRAY_COUNT(sBerryTag->tilemapBuffers[1]); i++) - sBerryTag->tilemapBuffers[1][i] = 0x5042; + sBerryTag->tilemapBuffers[1][i] = (5 << 12) | BG_TILE; } sBerryTag->gfxState++; break; @@ -367,7 +370,7 @@ static void HandleInitWindows(void) InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); - LoadPalette(sFontPalette, BG_PLTT_ID(15), PLTT_SIZE_4BPP); + LoadPalette(sFontPalette, BG_PLTT_ID(15), sizeof(sFontPalette)); for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++) PutWindowTilemap(i); ScheduleBgCopyTilemapToVram(0); @@ -545,6 +548,9 @@ static void Task_HandleInput(u8 taskId) } } +#define tBerryY data[0] +#define tBgOp data[1] + static void TryChangeDisplayedBerry(u8 taskId, s8 toMove) { s16 *data = gTasks[taskId].data; @@ -553,11 +559,11 @@ static void TryChangeDisplayedBerry(u8 taskId, s8 toMove) if (newPocketPosition < ITEM_TO_BERRY(MAX_BERRY_INDEX) && BagGetItemIdByPocketPosition(POCKET_BERRIES, newPocketPosition) != ITEM_NONE) { if (toMove < 0) - data[1] = 2; + tBgOp = BG_COORD_SUB; else - data[1] = 1; + tBgOp = BG_COORD_ADD; - data[0] = 0; + tBerryY = 0; PlaySE(SE_SELECT); HandleBagCursorPositionChange(toMove); gTasks[taskId].func = Task_DisplayAnotherBerry; @@ -586,101 +592,103 @@ static void HandleBagCursorPositionChange(s8 toMove) sBerryTag->berryId = ItemIdToBerryType(BagGetItemIdByPocketPosition(POCKET_BERRIES, *scrollPos + *cursorPos)); } +#define DISPLAY_SPEED 16 + static void Task_DisplayAnotherBerry(u8 taskId) { u16 i; - s16 posY; + s16 y; s16 *data = gTasks[taskId].data; - data[0] += 0x10; - data[0] &= 0xFF; + tBerryY += DISPLAY_SPEED; + tBerryY &= 0xFF; - if (data[1] == 1) + if (tBgOp == BG_COORD_ADD) { - switch (data[0]) + switch (tBerryY) { - case 0x30: + case 3 * DISPLAY_SPEED: FillWindowPixelBuffer(WIN_BERRY_NAME, PIXEL_FILL(0)); break; - case 0x40: + case 4 * DISPLAY_SPEED: PrintBerryNumberAndName(); break; - case 0x50: + case 5 * DISPLAY_SPEED: DestroyBerrySprite(); CreateBerrySprite(); break; - case 0x60: + case 6 * DISPLAY_SPEED: FillWindowPixelBuffer(WIN_SIZE_FIRM, PIXEL_FILL(0)); break; - case 0x70: + case 7 * DISPLAY_SPEED: PrintBerrySize(); break; - case 0x80: + case 8 * DISPLAY_SPEED: PrintBerryFirmness(); break; - case 0x90: + case 9 * DISPLAY_SPEED: SetFlavorCirclesVisiblity(); break; - case 0xA0: + case 10 * DISPLAY_SPEED: FillWindowPixelBuffer(WIN_DESC, PIXEL_FILL(0)); break; - case 0xB0: + case 11 * DISPLAY_SPEED: PrintBerryDescription1(); break; - case 0xC0: + case 12 * DISPLAY_SPEED: PrintBerryDescription2(); break; } } - else + else // BG_COORD_SUB { - switch (data[0]) + switch (tBerryY) { - case 0x30: + case 3 * DISPLAY_SPEED: FillWindowPixelBuffer(WIN_DESC, PIXEL_FILL(0)); break; - case 0x40: + case 4 * DISPLAY_SPEED: PrintBerryDescription2(); break; - case 0x50: + case 5 * DISPLAY_SPEED: PrintBerryDescription1(); break; - case 0x60: + case 6 * DISPLAY_SPEED: SetFlavorCirclesVisiblity(); break; - case 0x70: + case 7 * DISPLAY_SPEED: FillWindowPixelBuffer(WIN_SIZE_FIRM, PIXEL_FILL(0)); break; - case 0x80: + case 8 * DISPLAY_SPEED: PrintBerryFirmness(); break; - case 0x90: + case 9 * DISPLAY_SPEED: PrintBerrySize(); break; - case 0xA0: + case 10 * DISPLAY_SPEED: DestroyBerrySprite(); CreateBerrySprite(); break; - case 0xB0: + case 11 * DISPLAY_SPEED: FillWindowPixelBuffer(WIN_BERRY_NAME, PIXEL_FILL(0)); break; - case 0xC0: + case 12 * DISPLAY_SPEED: PrintBerryNumberAndName(); break; } } - if (data[1] == 1) - posY = -data[0]; + if (tBgOp == BG_COORD_ADD) + y = -tBerryY; else - posY = data[0]; + y = tBerryY; - gSprites[sBerryTag->berrySpriteId].y2 = posY; + gSprites[sBerryTag->berrySpriteId].y2 = y; for (i = 0; i < FLAVOR_COUNT; i++) - gSprites[sBerryTag->flavorCircleIds[i]].y2 = posY; + gSprites[sBerryTag->flavorCircleIds[i]].y2 = y; - ChangeBgY(1, 0x1000, data[1]); - ChangeBgY(2, 0x1000, data[1]); + ChangeBgY(1, 0x1000, tBgOp); + ChangeBgY(2, 0x1000, tBgOp); - if (data[0] == 0) + if (tBerryY == 0) gTasks[taskId].func = Task_HandleInput; } diff --git a/src/birch_pc.c b/src/birch_pc.c index 1f0ab23498..8256a1378b 100644 --- a/src/birch_pc.c +++ b/src/birch_pc.c @@ -20,7 +20,7 @@ bool16 ScriptGetPokedexInfo(void) return IsNationalPokedexEnabled(); } -// This shows your Hoenn Pokedex rating and not your National Dex. +// This shows your Hoenn Pokédex rating and not your National Dex. const u8 *GetPokedexRatingText(u16 count) { if (count < 10) diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c index 3487428495..7863f3cc11 100644 --- a/src/braille_puzzles.c +++ b/src/braille_puzzles.c @@ -256,7 +256,7 @@ static void DoBrailleRegisteelEffect(void) } // theory: another commented out DoBrailleWait and Task_BrailleWait. -static void DoBrailleWait(void) +static void UNUSED DoBrailleWait(void) { } @@ -278,6 +278,8 @@ bool8 FldEff_UsePuzzleEffect(void) return FALSE; } +// The puzzle to unlock Regice's cave requires the player to interact with the braille message on the back wall, +// step on every space on the perimeter of the cave (and only those spaces) then return to the back wall. bool8 ShouldDoBrailleRegicePuzzle(void) { u8 i; @@ -287,9 +289,11 @@ bool8 ShouldDoBrailleRegicePuzzle(void) { if (FlagGet(FLAG_SYS_BRAILLE_REGICE_COMPLETED)) return FALSE; - if (FlagGet(FLAG_TEMP_2) == FALSE) + // Set when the player interacts with the braille message + if (FlagGet(FLAG_TEMP_REGICE_PUZZLE_STARTED) == FALSE) return FALSE; - if (FlagGet(FLAG_TEMP_3) == TRUE) + // Cleared when the player interacts with the braille message + if (FlagGet(FLAG_TEMP_REGICE_PUZZLE_FAILED) == TRUE) return FALSE; for (i = 0; i < ARRAY_COUNT(sRegicePathCoords); i++) @@ -298,8 +302,7 @@ bool8 ShouldDoBrailleRegicePuzzle(void) u8 yPos = sRegicePathCoords[i][1]; if (gSaveBlock1Ptr->pos.x == xPos && gSaveBlock1Ptr->pos.y == yPos) { - u16 varValue; - + // Player is standing on a correct space, set the corresponding bit if (i < 16) { u16 val = VarGet(VAR_REGICE_STEPS_1); @@ -319,11 +322,11 @@ bool8 ShouldDoBrailleRegicePuzzle(void) VarSet(VAR_REGICE_STEPS_3, val); } - varValue = VarGet(VAR_REGICE_STEPS_1); - if (varValue != 0xFFFF || VarGet(VAR_REGICE_STEPS_2) != 0xFFFF || VarGet(VAR_REGICE_STEPS_3) != 0xF) + // Make sure a full lap has been completed. There are 36 steps in a lap, so 16+16+4 bits to check across the 3 vars. + if (VarGet(VAR_REGICE_STEPS_1) != 0xFFFF || VarGet(VAR_REGICE_STEPS_2) != 0xFFFF || VarGet(VAR_REGICE_STEPS_3) != 0xF) return FALSE; - // This final check is redundant. + // A lap has been completed, the puzzle is complete when the player returns to the braille message. if (gSaveBlock1Ptr->pos.x == 8 && gSaveBlock1Ptr->pos.y == 21) return TRUE; else @@ -331,8 +334,9 @@ bool8 ShouldDoBrailleRegicePuzzle(void) } } - FlagSet(FLAG_TEMP_3); - FlagClear(FLAG_TEMP_2); + // Player stepped on an incorrect space, puzzle failed. + FlagSet(FLAG_TEMP_REGICE_PUZZLE_FAILED); + FlagClear(FLAG_TEMP_REGICE_PUZZLE_STARTED); } return FALSE; diff --git a/src/cable_car.c b/src/cable_car.c index 7d18df7b7f..8a666a536e 100644 --- a/src/cable_car.c +++ b/src/cable_car.c @@ -237,7 +237,7 @@ void CableCar(void) { LockPlayerFieldControls(); CreateTask(Task_LoadCableCar, 1); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); } static void CB2_LoadCableCar(void) @@ -341,7 +341,7 @@ static void CB2_LoadCableCar(void) gMain.state++; break; case 8: - BeginNormalPaletteFade(PALETTES_ALL, 3, 16, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 3, 16, 0, RGB_BLACK); FadeInNewBGM(MUS_CABLE_CAR, 1); SetBgRegs(TRUE); gMain.state++; @@ -459,7 +459,7 @@ static void Task_CableCar(u8 taskId) if (sCableCar->timer == 570) { sCableCar->state = 3; - BeginNormalPaletteFade(PALETTES_ALL, 3, 0, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 3, 0, 16, RGB_BLACK); FadeOutBGM(4); } break; diff --git a/src/cable_club.c b/src/cable_club.c index 913a1b7287..5305326589 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -195,8 +195,7 @@ static bool32 CheckSioErrored(u8 taskId) return FALSE; } -// Unused -static void Task_DelayedBlockRequest(u8 taskId) +static void UNUSED Task_DelayedBlockRequest(u8 taskId) { gTasks[taskId].data[0]++; if (gTasks[taskId].data[0] == 10) @@ -725,7 +724,7 @@ void TryContestEModeLinkup(void) u8 CreateTask_ReestablishCableClubLink(void) { if (FuncIsActiveTask(Task_ReestablishLink) != FALSE) - return 0xFF; + return TASK_NONE; switch (gSpecialVar_0x8004) { @@ -1166,14 +1165,13 @@ void PlayerEnteredTradeSeat(void) CreateTask_EnterCableClubSeat(Task_StartWiredTrade); } -// Unused -static void CreateTask_StartWiredTrade(void) +static void UNUSED CreateTask_StartWiredTrade(void) { CreateTask(Task_StartWiredTrade, 80); } -// Unused, implemented in Ruby/Sapphire -void Script_StartWiredTrade(void) +// Implemented in Ruby/Sapphire +void UNUSED Script_StartWiredTrade(void) { // CreateTask_StartWiredTrade(); // ScriptContext_Stop(); @@ -1189,10 +1187,9 @@ void ColosseumPlayerSpotTriggered(void) CreateTask_EnterCableClubSeat(Task_StartWiredCableClubBattle); } -// Unused -static void CreateTask_EnterCableClubSeatNoFollowup(void) +static UNUSED void CreateTask_EnterCableClubSeatNoFollowup(void) { - u8 taskId = CreateTask(Task_EnterCableClubSeat, 80); + u8 UNUSED taskId = CreateTask(Task_EnterCableClubSeat, 80); ScriptContext_Stop(); } @@ -1262,8 +1259,7 @@ static void Task_WaitExitToScript(u8 taskId) } } -// Unused -static void ExitLinkToScript(u8 taskId) +static void UNUSED ExitLinkToScript(u8 taskId) { SetCloseLinkCallback(); gTasks[taskId].func = Task_WaitExitToScript; diff --git a/src/contest.c b/src/contest.c index 8a1847f111..8f0ad7fbfe 100644 --- a/src/contest.c +++ b/src/contest.c @@ -194,7 +194,7 @@ static void SwapMoveDescAndContestTilemaps(void); #define CONTESTANT_TEXT_COLOR_START 10 enum { -// The "{Pokemon Name} / {Trainer Name}" windows. +// The "{Pokémon Name} / {Trainer Name}" windows. WIN_CONTESTANT0_NAME, WIN_CONTESTANT1_NAME, WIN_CONTESTANT2_NAME, @@ -1076,10 +1076,10 @@ static void LoadContestPalettes(void) { s32 i; - LoadPalette(sText_Pal, BG_PLTT_ID(15), PLTT_SIZE_4BPP); + LoadPalette(sText_Pal, BG_PLTT_ID(15), sizeof(sText_Pal)); SetBackdropFromColor(RGB_BLACK); for (i = 10; i < 14; i++) - LoadPalette(gPlttBufferUnfaded + BG_PLTT_ID(15) + 1, BG_PLTT_ID(15) + i, PLTT_SIZEOF(1)); + LoadPalette(&gPlttBufferUnfaded[BG_PLTT_ID(15) + 1], BG_PLTT_ID(15) + i, PLTT_SIZEOF(1)); FillPalette(RGB(31, 17, 31), BG_PLTT_ID(15) + 3, PLTT_SIZEOF(1)); } @@ -1112,10 +1112,10 @@ static void InitContestResources(void) for (i = 0; i < CONTESTANT_COUNT; i++) { - eContestantStatus[i].nextTurnOrder = 0xFF; + eContestantStatus[i].nextTurnOrder = CONTESTANT_NONE; eContest.prevTurnOrder[i] = gContestantTurnOrder[i]; } - // Calling this here while all the nextTurnOrder values are 0xFF will actually + // Calling this here while all the nextTurnOrder values are CONTESTANT_NONE will actually // just reverse the turn order. ApplyNextTurnOrder(); memset(gContestResources->tv, 0, sizeof(*gContestResources->tv) * CONTESTANT_COUNT); @@ -1301,8 +1301,8 @@ static void Task_ReadyStartLinkContest(u8 taskId) static bool8 SetupContestGraphics(u8 *stateVar) { - u16 tempPalette1[16]; - u16 tempPalette2[16]; + u16 ALIGNED(4) tempPalette1[16]; + u16 ALIGNED(4) tempPalette2[16]; switch (*stateVar) { @@ -1331,10 +1331,10 @@ static bool8 SetupContestGraphics(u8 *stateVar) break; case 5: LoadCompressedPalette(gContestInterfaceAudiencePalette, BG_PLTT_OFFSET, BG_PLTT_SIZE); - CpuCopy32(gPlttBufferUnfaded + BG_PLTT_ID(8), tempPalette1, PLTT_SIZE_4BPP); - CpuCopy32(gPlttBufferUnfaded + BG_PLTT_ID(5 + gContestPlayerMonIndex), tempPalette2, PLTT_SIZE_4BPP); - CpuCopy32(tempPalette2, gPlttBufferUnfaded + BG_PLTT_ID(8), PLTT_SIZE_4BPP); - CpuCopy32(tempPalette1, gPlttBufferUnfaded + BG_PLTT_ID(5 + gContestPlayerMonIndex), PLTT_SIZE_4BPP); + CpuCopy32(&gPlttBufferUnfaded[BG_PLTT_ID(8)], tempPalette1, PLTT_SIZE_4BPP); + CpuCopy32(&gPlttBufferUnfaded[BG_PLTT_ID(5 + gContestPlayerMonIndex)], tempPalette2, PLTT_SIZE_4BPP); + CpuCopy32(tempPalette2, &gPlttBufferUnfaded[BG_PLTT_ID(8)], PLTT_SIZE_4BPP); + CpuCopy32(tempPalette1, &gPlttBufferUnfaded[BG_PLTT_ID(5 + gContestPlayerMonIndex)], PLTT_SIZE_4BPP); DmaCopy32Defvars(3, gPlttBufferUnfaded, eContestTempSave.cachedWindowPalettes, sizeof(eContestTempSave.cachedWindowPalettes)); LoadContestPalettes(); break; @@ -1475,7 +1475,7 @@ static void Task_DisplayAppealNumberText(u8 taskId) gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; ContestDebugDoPrint(); - DmaCopy32Defvars(3, gPlttBufferUnfaded, eContestTempSave.cachedPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2); + DmaCopy32Defvars(3, gPlttBufferUnfaded, eContestTempSave.cachedPlttBufferUnfaded, PLTT_SIZE); ConvertIntToDecimalStringN(gStringVar1, eContest.appealNumber + 1, STR_CONV_MODE_LEFT_ALIGN, 1); if (!Contest_IsMonsTurnDisabled(gContestPlayerMonIndex)) StringCopy(gDisplayedStringBattle, gText_AppealNumWhichMoveWillBePlayed); @@ -1674,8 +1674,8 @@ static void Task_HideMoveSelectScreen(u8 taskId) } Contest_SetBgCopyFlags(0); // This seems to be a bug; it should have just copied PLTT_BUFFER_SIZE. - DmaCopy32Defvars(3, gPlttBufferFaded, eContestTempSave.cachedPlttBufferFaded, PLTT_BUFFER_SIZE * 2); - LoadPalette(eContestTempSave.cachedPlttBufferUnfaded, 0, PLTT_BUFFER_SIZE * 2); + DmaCopy32Defvars(3, gPlttBufferFaded, eContestTempSave.cachedPlttBufferFaded, PLTT_SIZE); + LoadPalette(eContestTempSave.cachedPlttBufferUnfaded, 0, PLTT_SIZE); gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 0; gTasks[taskId].func = Task_HideApplauseMeterForAppealStart; @@ -2561,7 +2561,7 @@ static void Task_WaitForHeartSliders(u8 taskId) static void Task_RestorePlttBufferUnfaded(u8 taskId) { - DmaCopy32Defvars(3, eContestTempSave.cachedPlttBufferUnfaded, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2); + DmaCopy32Defvars(3, eContestTempSave.cachedPlttBufferUnfaded, gPlttBufferUnfaded, PLTT_SIZE); gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 2; gTasks[taskId].func = Task_WaitPrintRoundResult; @@ -2775,7 +2775,7 @@ static bool8 IsPlayerLinkLeader(void) void CreateContestMonFromParty(u8 partyIndex) { - u8 name[20]; + u8 name[max(PLAYER_NAME_LENGTH + 1, POKEMON_NAME_BUFFER_SIZE)]; u16 heldItem; s16 cool; s16 beauty; @@ -2785,10 +2785,8 @@ void CreateContestMonFromParty(u8 partyIndex) StringCopy(name, gSaveBlock2Ptr->playerName); if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) - { StripPlayerNameForLinkContest(name); - } - memcpy(gContestMons[gContestPlayerMonIndex].trainerName, name, 8); + memcpy(gContestMons[gContestPlayerMonIndex].trainerName, name, PLAYER_NAME_LENGTH + 1); if (gSaveBlock2Ptr->playerGender == MALE) gContestMons[gContestPlayerMonIndex].trainerGfxId = OBJ_EVENT_GFX_LINK_BRENDAN; else @@ -2891,7 +2889,7 @@ void SetContestants(u8 contestType, u8 rank) opponents[opponentsCount++] = i; } } - opponents[opponentsCount] = 0xFF; + opponents[opponentsCount] = CONTESTANT_NONE; // Choose three random opponents from the list for (i = 0; i < CONTESTANT_COUNT - 1; i++) @@ -2900,7 +2898,7 @@ void SetContestants(u8 contestType, u8 rank) s32 j; gContestMons[i] = gContestOpponents[opponents[rnd]]; - for (j = rnd; opponents[j] != 0xFF; j++) + for (j = rnd; opponents[j] != CONTESTANT_NONE; j++) opponents[j] = opponents[j + 1]; opponentsCount--; } @@ -2940,7 +2938,7 @@ void SetLinkAIContestants(u8 contestType, u8 rank, bool32 isPostgame) || (contestType == CONTEST_CATEGORY_TOUGH && gContestOpponents[i].aiPool_Tough)) opponents[opponentsCount++] = i; } - opponents[opponentsCount] = 0xFF; + opponents[opponentsCount] = CONTESTANT_NONE; // Fill remaining contestant slots with random AI opponents from the list for (i = 0; i < CONTESTANT_COUNT - gNumLinkContestPlayers; i++) @@ -2950,7 +2948,7 @@ void SetLinkAIContestants(u8 contestType, u8 rank, bool32 isPostgame) gContestMons[gNumLinkContestPlayers + i] = gContestOpponents[opponents[rnd]]; StripPlayerNameForLinkContest(gContestMons[gNumLinkContestPlayers + i].trainerName); StripMonNameForLinkContest(gContestMons[gNumLinkContestPlayers + i].nickname, GAME_LANGUAGE); - for (j = rnd; opponents[j] != 0xFF; j++) + for (j = rnd; opponents[j] != CONTESTANT_NONE; j++) opponents[j] = opponents[j + 1]; opponentsCount--; } @@ -3253,8 +3251,7 @@ static void DrawMoveEffectSymbol(u16 move, u8 contestant) } } -// Unused -static void DrawMoveEffectSymbols(void) +static void UNUSED DrawMoveEffectSymbols(void) { s32 i; @@ -3437,11 +3434,11 @@ static void RankContestants(void) // For each contestant, find the best rank with their point total. // Normally, each point total is different, and this will output the - // rankings as expected. However, if two pokemon are tied, then they + // rankings as expected. However, if two Pokémon are tied, then they // both get the best rank for that point total. // // For example if the point totals are [100, 80, 80, 50], the ranks will - // be [1, 2, 2, 4]. The pokemon with a point total of 80 stop looking + // be [1, 2, 2, 4]. The Pokémon with a point total of 80 stop looking // when they see the first 80 in the array, so they both share the '2' // rank. for (i = 0; i < CONTESTANT_COUNT; i++) @@ -4068,14 +4065,14 @@ static void UpdateBlendTaskContestantData(u8 contestant) palOffset1 = contestant + 5; DmaCopy16Defvars(3, - gPlttBufferUnfaded + palOffset1 * 16 + 10, - gPlttBufferFaded + palOffset1 * 16 + 10, - 2); - palOffset2 = (contestant + 5) * 16 + 12 + contestant; + &gPlttBufferUnfaded[PLTT_ID(palOffset1) + 10], + &gPlttBufferFaded[PLTT_ID(palOffset1) + 10], + PLTT_SIZEOF(1)); + palOffset2 = PLTT_ID(contestant + 5) + 12 + contestant; DmaCopy16Defvars(3, - gPlttBufferUnfaded + palOffset2, - gPlttBufferFaded + palOffset2, - 2); + &gPlttBufferUnfaded[palOffset2], + &gPlttBufferFaded[palOffset2], + PLTT_SIZEOF(1)); } // See comments on CreateUnusedBlendTask @@ -4223,8 +4220,7 @@ static void SpriteCB_EndBlinkContestantBox(struct Sprite *sprite) ResetBlendForContestantBoxBlink(); } -// Unused. -static void ContestDebugTogglePointTotal(void) +static void UNUSED ContestDebugTogglePointTotal(void) { if(eContestDebugMode == CONTEST_DEBUG_MODE_PRINT_POINT_TOTAL) eContestDebugMode = CONTEST_DEBUG_MODE_OFF; @@ -4370,7 +4366,7 @@ void SortContestants(bool8 useRanking) // Note that ranking is calculated so that shared places still take up a ranking // space. A ranking like [1, 2, 2, 3] is not possible; it would be [1, 2, 2, 4] // instead. - memset(scratch, 0xFF, sizeof(scratch)); + memset(scratch, CONTESTANT_NONE, sizeof(scratch)); for (i = 0; i < CONTESTANT_COUNT; i++) { u8 j = eContestantStatus[i].ranking; @@ -4378,7 +4374,7 @@ void SortContestants(bool8 useRanking) while (1) { u8 *ptr = &scratch[j]; - if (*ptr == 0xFF) + if (*ptr == CONTESTANT_NONE) { *ptr = i; gContestantTurnOrder[i] = j; @@ -4594,10 +4590,10 @@ void MakeContestantNervous(u8 p) // ContestantStatus::nextTurnOrder field of each contestant. The remaining // turns are assigned such that the turn order will reverse. // -// For example, if no pokemon have a defined nextTurnOrder, then the 4th +// For example, if no Pokémon have a defined nextTurnOrder, then the 4th // will become 1st, the 3rd will become 2nd, etc. // -// Note: This function assumes that multiple pokemon cannot have the same +// Note: This function assumes that multiple Pokémon cannot have the same // nextTurnOrder value. static void ApplyNextTurnOrder(void) { @@ -4636,7 +4632,7 @@ static void ApplyNextTurnOrder(void) // First, look for the first unassigned contestant. for (j = 0; j < CONTESTANT_COUNT; j++) { - if (!isContestantOrdered[j] && eContestantStatus[j].nextTurnOrder == 0xFF) + if (!isContestantOrdered[j] && eContestantStatus[j].nextTurnOrder == CONTESTANT_NONE) { nextContestant = j; j++; @@ -4647,7 +4643,7 @@ static void ApplyNextTurnOrder(void) // Then, look for a better candidate, with a higher turn order. for (; j < CONTESTANT_COUNT; j++) { - if (!isContestantOrdered[j] && eContestantStatus[j].nextTurnOrder == 0xFF + if (!isContestantOrdered[j] && eContestantStatus[j].nextTurnOrder == CONTESTANT_NONE && gContestantTurnOrder[nextContestant] > gContestantTurnOrder[j]) nextContestant = j; } @@ -4661,7 +4657,7 @@ static void ApplyNextTurnOrder(void) for (i = 0; i < CONTESTANT_COUNT; i++) { eContestAppealResults.turnOrder[i] = newTurnOrder[i]; - eContestantStatus[i].nextTurnOrder = 0xFF; + eContestantStatus[i].nextTurnOrder = CONTESTANT_NONE; eContestantStatus[i].turnOrderMod = 0; gContestantTurnOrder[i] = newTurnOrder[i]; } @@ -4878,15 +4874,13 @@ static void Task_ShowAndUpdateApplauseMeter(u8 taskId) } } -// Unused. -static void HideApplauseMeterNoAnim(void) +static void UNUSED HideApplauseMeterNoAnim(void) { gSprites[eContest.applauseMeterSpriteId].x2 = 0; gSprites[eContest.applauseMeterSpriteId].invisible = FALSE; } -// Unused. -static void ShowApplauseMeterNoAnim(void) +static void UNUSED ShowApplauseMeterNoAnim(void) { gSprites[eContest.applauseMeterSpriteId].invisible = TRUE; } @@ -6020,8 +6014,10 @@ static u8 GetMonNicknameLanguage(u8 *nickname) if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN) return GAME_LANGUAGE; - if (StringLength(nickname) < PLAYER_NAME_LENGTH - 1) + if (StringLength(nickname) <= 5) { + // Name is short enough that it might be Japanese. + // Make sure all the character values are valid latin name characters. while (*nickname != EOS) { if ((*nickname >= CHAR_A && *nickname <= CHAR_z) @@ -6039,12 +6035,18 @@ static u8 GetMonNicknameLanguage(u8 *nickname) || *nickname == CHAR_DBL_QUOTE_LEFT || *nickname == CHAR_DBL_QUOTE_RIGHT || *nickname == CHAR_SGL_QUOTE_LEFT - || *nickname == CHAR_DBL_QUOTE_LEFT) // Most likely a typo, CHAR_SGL_QUOTE_RIGHT should be here instead. +#ifdef BUGFIX + || *nickname == CHAR_SGL_QUOTE_RIGHT +#else + || *nickname == CHAR_DBL_QUOTE_LEFT // Most likely a typo, CHAR_SGL_QUOTE_RIGHT should be here instead. +#endif + ) { nickname++; } else { + // Invalid latin name character, assume the name was Japanese. ret = LANGUAGE_JAPANESE; break; } @@ -6101,7 +6103,7 @@ void StripPlayerAndMonNamesForLinkContest(struct ContestPokemon *mon, s32 langua name = mon->trainerName; if (language == LANGUAGE_JAPANESE) { - name[PLAYER_NAME_LENGTH] = EOS; + name[7] = EOS; name[6] = name[4]; name[5] = name[3]; name[4] = name[2]; diff --git a/src/contest_ai.c b/src/contest_ai.c index 7aeba828a6..a4bb5b4549 100644 --- a/src/contest_ai.c +++ b/src/contest_ai.c @@ -6,6 +6,8 @@ #include "contest_effect.h" #include "constants/moves.h" +#define AI_ACTION_DONE (1 << 0) + extern const u8 *gAIScriptPtr; extern const u8 *gContestAI_ScriptsTable[]; @@ -324,7 +326,7 @@ u8 ContestAI_GetActionToUse(void) { // Randomly choose a move index. If it's the move // with the highest (or tied highest) score, return - u8 moveIdx = Random() & (MAX_MON_MOVES - 1); // % MAX_MON_MOVES doesn't match + u8 moveIdx = MOD(Random(), MAX_MON_MOVES); u8 score = eContestAI.moveScores[moveIdx]; int i; for (i = 0; i < MAX_MON_MOVES; i++) @@ -362,9 +364,9 @@ static void ContestAI_DoAIProcessing(void) else { eContestAI.moveScores[eContestAI.nextMoveIndex] = 0; // don't consider a move that doesn't exist. - eContestAI.aiAction |= 1; + eContestAI.aiAction |= AI_ACTION_DONE; } - if (eContestAI.aiAction & 1) + if (eContestAI.aiAction & AI_ACTION_DONE) { eContestAI.nextMoveIndex++; if (eContestAI.nextMoveIndex < MAX_MON_MOVES) @@ -372,7 +374,7 @@ static void ContestAI_DoAIProcessing(void) else // aiState = CONTESTAI_FINISHED eContestAI.aiState++; - eContestAI.aiAction &= 0xFE; // TODO: Define action flags + eContestAI.aiAction &= ~AI_ACTION_DONE; } break; } @@ -1667,7 +1669,7 @@ static void ContestAICmd_call(void) static void ContestAICmd_end(void) { if (!AIStackPop()) - eContestAI.aiAction |= 1; + eContestAI.aiAction |= AI_ACTION_DONE; } static void AIStackPushVar(const u8 *ptr) diff --git a/src/contest_effect.c b/src/contest_effect.c index 864805a54f..24de8e1692 100644 --- a/src/contest_effect.c +++ b/src/contest_effect.c @@ -138,7 +138,8 @@ static void ContestEffect_StartleFrontMon(void) u8 idx = 0; u8 a = eContestAppealResults.contestant; - if (eContestAppealResults.turnOrder[a] != 0) { + if (eContestAppealResults.turnOrder[a] != 0) + { int i; for (i = 0; i < CONTESTANT_COUNT; i++) @@ -147,7 +148,7 @@ static void ContestEffect_StartleFrontMon(void) break; } eContestAppealResults.jamQueue[0] = i; - eContestAppealResults.jamQueue[1] = 0xFF; + eContestAppealResults.jamQueue[1] = CONTESTANT_NONE; idx = WasAtLeastOneOpponentJammed(); } if (idx == 0) @@ -171,7 +172,7 @@ static void ContestEffect_StartlePrevMons(void) eContestAppealResults.jamQueue[j++] = i; } - eContestAppealResults.jamQueue[j] = 0xFF; + eContestAppealResults.jamQueue[j] = CONTESTANT_NONE; idx = WasAtLeastOneOpponentJammed(); } if (idx == 0) @@ -214,7 +215,7 @@ static void ContestEffect_StartlePrevMons2(void) u8 rval, jam; eContestAppealResults.jamQueue[0] = i; - eContestAppealResults.jamQueue[1] = 0xFF; + eContestAppealResults.jamQueue[1] = CONTESTANT_NONE; rval = Random() % 10; if (rval == 0) @@ -291,7 +292,7 @@ static void ContestEffect_StartleMonWithJudgesAttention(void) else eContestAppealResults.jam = 10; eContestAppealResults.jamQueue[0] = i; - eContestAppealResults.jamQueue[1] = 0xFF; + eContestAppealResults.jamQueue[1] = CONTESTANT_NONE; if (WasAtLeastOneOpponentJammed()) numStartled++; } @@ -396,7 +397,7 @@ static void ContestEffect_MakeFollowingMonsNervous(void) s16 oddsMod[CONTESTANT_COUNT]; s16 odds[CONTESTANT_COUNT]; - memset(contestantIds, 0xFF, ARRAY_COUNT(contestantIds)); + memset(contestantIds, CONTESTANT_NONE, ARRAY_COUNT(contestantIds)); for (i = 0, numAfter = 0; i < CONTESTANT_COUNT; i++) { if (eContestAppealResults.turnOrder[eContestAppealResults.contestant] < eContestAppealResults.turnOrder[i] && @@ -434,7 +435,7 @@ static void ContestEffect_MakeFollowingMonsNervous(void) } if (odds[0] != 0) { - for (i = 0; contestantIds[i] != 0xFF; i++) + for (i = 0; contestantIds[i] != CONTESTANT_NONE; i++) { if (Random() % 100 < odds[i] + oddsMod[contestantIds[i]]) { @@ -507,7 +508,7 @@ static void ContestEffect_BadlyStartlesMonsInGoodCondition(void) else eContestAppealResults.jam = 10; eContestAppealResults.jamQueue[0] = i; - eContestAppealResults.jamQueue[1] = 0xFF; + eContestAppealResults.jamQueue[1] = CONTESTANT_NONE; if (WasAtLeastOneOpponentJammed()) numHit++; } @@ -758,7 +759,7 @@ static void ContestEffect_NextAppealEarlier(void) for (i = 0; i < CONTESTANT_COUNT; i++) turnOrder[i] = eContestantStatus[i].nextTurnOrder; - turnOrder[eContestAppealResults.contestant] = 0xFF; + turnOrder[eContestAppealResults.contestant] = CONTESTANT_NONE; for (i = 0; i < CONTESTANT_COUNT; i++) { @@ -800,7 +801,7 @@ static void ContestEffect_NextAppealLater(void) for (i = 0; i < CONTESTANT_COUNT; i++) turnOrder[i] = eContestantStatus[i].nextTurnOrder; - turnOrder[eContestAppealResults.contestant] = 0xFF; + turnOrder[eContestAppealResults.contestant] = CONTESTANT_NONE; for (i = CONTESTANT_COUNT - 1; i > -1; i--) { @@ -858,12 +859,12 @@ static void ContestEffect_ScrambleNextTurnOrder(void) for (j = 0; j < CONTESTANT_COUNT; j++) { - if (unselectedContestants[j] != 0xFF) + if (unselectedContestants[j] != CONTESTANT_NONE) { if (rval == 0) { turnOrder[j] = i; - unselectedContestants[j] = 0xFF; + unselectedContestants[j] = CONTESTANT_NONE; break; } else @@ -909,7 +910,7 @@ static void ContestEffect_BadlyStartleMonsWithGoodAppeals(void) else eContestAppealResults.jam = 10; eContestAppealResults.jamQueue[0] = i; - eContestAppealResults.jamQueue[1] = 0xFF; + eContestAppealResults.jamQueue[1] = CONTESTANT_NONE; if (WasAtLeastOneOpponentJammed()) numJammed++; } @@ -977,7 +978,7 @@ static void JamByMoveCategory(u8 category) else eContestAppealResults.jam = 10; eContestAppealResults.jamQueue[0] = i; - eContestAppealResults.jamQueue[1] = 0xFF; + eContestAppealResults.jamQueue[1] = CONTESTANT_NONE; if (WasAtLeastOneOpponentJammed()) numJammed++; } @@ -1016,7 +1017,7 @@ static bool8 WasAtLeastOneOpponentJammed(void) s16 jamBuffer[CONTESTANT_COUNT] = {0}; int i; - for (i = 0; eContestAppealResults.jamQueue[i] != 0xFF; i++) + for (i = 0; eContestAppealResults.jamQueue[i] != CONTESTANT_NONE; i++) { u8 contestant = eContestAppealResults.jamQueue[i]; if (CanUnnerveContestant(contestant)) diff --git a/src/contest_painting.c b/src/contest_painting.c index a1a8a51975..30ca51c966 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -248,7 +248,7 @@ static void HoldContestPainting(void) if ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON))) { sHoldState++; - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); } if (sVarsInitialized) diff --git a/src/contest_util.c b/src/contest_util.c index 4c9e63c0b8..e0e80a7091 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -456,7 +456,7 @@ static void LoadContestResultsBgGfx(void) CopyToBgTilemapBuffer(2, gContestResults_Interface_Tilemap, 0, 0); CopyToBgTilemapBuffer(0, gContestResults_WinnerBanner_Tilemap, 0, 0); LoadContestResultsTitleBarTilemaps(); - LoadCompressedPalette(gContestResults_Pal, BG_PLTT_ID(0), 16 * PLTT_SIZE_4BPP); + LoadCompressedPalette(gContestResults_Pal, BG_PLTT_OFFSET, BG_PLTT_SIZE); LoadPalette(sResultsTextWindow_Pal, BG_PLTT_ID(15), sizeof(sResultsTextWindow_Pal)); for (i = 0; i < CONTESTANT_COUNT; i++) @@ -2011,7 +2011,7 @@ void GiveMonContestRibbon(void) { case CONTEST_CATEGORY_COOL: ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + if (ribbonData <= gSpecialVar_ContestRank && ribbonData <= CONTEST_RANK_MASTER) { ribbonData++; SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON, &ribbonData); @@ -2021,7 +2021,7 @@ void GiveMonContestRibbon(void) break; case CONTEST_CATEGORY_BEAUTY: ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + if (ribbonData <= gSpecialVar_ContestRank && ribbonData <= CONTEST_RANK_MASTER) { ribbonData++; SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON, &ribbonData); @@ -2031,7 +2031,7 @@ void GiveMonContestRibbon(void) break; case CONTEST_CATEGORY_CUTE: ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + if (ribbonData <= gSpecialVar_ContestRank && ribbonData <= CONTEST_RANK_MASTER) { ribbonData++; SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON, &ribbonData); @@ -2041,7 +2041,7 @@ void GiveMonContestRibbon(void) break; case CONTEST_CATEGORY_SMART: ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + if (ribbonData <= gSpecialVar_ContestRank && ribbonData <= CONTEST_RANK_MASTER) { ribbonData++; SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON, &ribbonData); @@ -2051,7 +2051,7 @@ void GiveMonContestRibbon(void) break; case CONTEST_CATEGORY_TOUGH: ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + if (ribbonData <= gSpecialVar_ContestRank && ribbonData <= CONTEST_RANK_MASTER) { ribbonData++; SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON, &ribbonData); diff --git a/src/credits.c b/src/credits.c index bf636f74f6..c433baf1d1 100644 --- a/src/credits.c +++ b/src/credits.c @@ -63,12 +63,12 @@ enum { struct CreditsData { - u16 monToShow[NUM_MON_SLIDES]; // List of Pokemon species ids that will show during the credits + u16 monToShow[NUM_MON_SLIDES]; // List of Pokémon species ids that will show during the credits u16 imgCounter; //how many mon images have been shown u16 nextImgPos; //if the next image spawns left/center/right u16 currShownMon; //index into monToShow - u16 numMonToShow; //number of pokemon to show, always NUM_MON_SLIDES after determine function - u16 caughtMonIds[NATIONAL_DEX_COUNT]; //temporary location to hold a condensed array of all caught pokemon + u16 numMonToShow; //number of Pokémon to show, always NUM_MON_SLIDES after determine function + u16 caughtMonIds[NATIONAL_DEX_COUNT]; //temporary location to hold a condensed array of all caught Pokémon u16 numCaughtMon; //count of filled spaces in caughtMonIds u16 unused[7]; }; @@ -80,7 +80,7 @@ struct CreditsEntry const u8 *text; }; -static EWRAM_DATA s16 sUnkVar = 0; // Never read, only set to 0 +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 @@ -1370,7 +1370,7 @@ static void SpriteCB_Player(struct Sprite *sprite) break; case 4: StartSpriteAnimIfDifferent(sprite, 0); - if (sprite->x > 120) + if (sprite->x > DISPLAY_WIDTH / 2) sprite->x--; break; case 5: @@ -1555,8 +1555,8 @@ static void DeterminePokemonToShow(void) u16 dexNum; u16 j; - // Go through the Pokedex, and anything that has gotten caught we put into our massive array. - // This basically packs all of the caught pokemon into the front of the array + // Go through the Pokédex, and anything that has gotten caught we put into our massive array. + // This basically packs all of the caught Pokémon into the front of the array for (dexNum = 1, j = 0; dexNum < NATIONAL_DEX_COUNT; dexNum++) { if (GetSetPokedexFlag(dexNum, FLAG_GET_CAUGHT)) @@ -1570,14 +1570,14 @@ static void DeterminePokemonToShow(void) for (dexNum = j; dexNum < NATIONAL_DEX_COUNT; dexNum++) sCreditsData->caughtMonIds[dexNum] = NATIONAL_DEX_NONE; - // Cap the number of pokemon we care about to NUM_MON_SLIDES, the max we show in the credits scene (-1 for the starter) + // Cap the number of Pokémon we care about to NUM_MON_SLIDES, the max we show in the credits scene (-1 for the starter) sCreditsData->numCaughtMon = j; if (sCreditsData->numCaughtMon < NUM_MON_SLIDES) sCreditsData->numMonToShow = j; else sCreditsData->numMonToShow = NUM_MON_SLIDES; - // Loop through our list of caught pokemon and select randomly from it to fill the images to show + // Loop through our list of caught Pokémon and select randomly from it to fill the images to show j = 0; do { @@ -1598,7 +1598,7 @@ static void DeterminePokemonToShow(void) } while (sCreditsData->numCaughtMon != 0 && j < NUM_MON_SLIDES); - // If we don't have enough pokemon in the dex to fill everything, copy the selected mon into the end of the array, so it loops + // If we don't have enough Pokémon in the dex to fill everything, copy the selected mon into the end of the array, so it loops if (sCreditsData->numMonToShow < NUM_MON_SLIDES) { for (j = sCreditsData->numMonToShow, page = 0; j < NUM_MON_SLIDES; j++) @@ -1609,7 +1609,7 @@ static void DeterminePokemonToShow(void) if (page == sCreditsData->numMonToShow) page = 0; } - // Ensure the last pokemon is our starter + // Ensure the last Pokémon is our starter sCreditsData->monToShow[NUM_MON_SLIDES - 1] = starter; } else @@ -1617,7 +1617,7 @@ static void DeterminePokemonToShow(void) // Check to see if our starter has already appeared in this list, break if it has for (dexNum = 0; sCreditsData->monToShow[dexNum] != starter && dexNum < NUM_MON_SLIDES; dexNum++); - // If it has, swap it with the last pokemon, to ensure our starter is the last image + // If it has, swap it with the last Pokémon, to ensure our starter is the last image if (dexNum < sCreditsData->numMonToShow - 1) { sCreditsData->monToShow[dexNum] = sCreditsData->monToShow[NUM_MON_SLIDES-1]; @@ -1625,7 +1625,7 @@ static void DeterminePokemonToShow(void) } else { - // Ensure the last pokemon is our starter + // Ensure the last Pokémon is our starter sCreditsData->monToShow[NUM_MON_SLIDES - 1] = starter; } } diff --git a/src/data.c b/src/data.c index 350927f86d..bde609be1d 100644 --- a/src/data.c +++ b/src/data.c @@ -16,100 +16,100 @@ static const u32 sMinigameDigitsThin_Gfx[] = INCBIN_U32("graphics/link/minigame_ const struct SpriteFrameImage gBattlerPicTable_PlayerLeft[] = { - BATTLER_OFFSET(0), MON_PIC_SIZE, - BATTLER_OFFSET(1), MON_PIC_SIZE, - BATTLER_OFFSET(2), MON_PIC_SIZE, - BATTLER_OFFSET(3), MON_PIC_SIZE, + {BATTLER_OFFSET(0), MON_PIC_SIZE}, + {BATTLER_OFFSET(1), MON_PIC_SIZE}, + {BATTLER_OFFSET(2), MON_PIC_SIZE}, + {BATTLER_OFFSET(3), MON_PIC_SIZE}, }; const struct SpriteFrameImage gBattlerPicTable_OpponentLeft[] = { - BATTLER_OFFSET(4), MON_PIC_SIZE, - BATTLER_OFFSET(5), MON_PIC_SIZE, - BATTLER_OFFSET(6), MON_PIC_SIZE, - BATTLER_OFFSET(7), MON_PIC_SIZE, + {BATTLER_OFFSET(4), MON_PIC_SIZE}, + {BATTLER_OFFSET(5), MON_PIC_SIZE}, + {BATTLER_OFFSET(6), MON_PIC_SIZE}, + {BATTLER_OFFSET(7), MON_PIC_SIZE}, }; const struct SpriteFrameImage gBattlerPicTable_PlayerRight[] = { - BATTLER_OFFSET(8), MON_PIC_SIZE, - BATTLER_OFFSET(9), MON_PIC_SIZE, - BATTLER_OFFSET(10), MON_PIC_SIZE, - BATTLER_OFFSET(11), MON_PIC_SIZE, + {BATTLER_OFFSET(8), MON_PIC_SIZE}, + {BATTLER_OFFSET(9), MON_PIC_SIZE}, + {BATTLER_OFFSET(10), MON_PIC_SIZE}, + {BATTLER_OFFSET(11), MON_PIC_SIZE}, }; const struct SpriteFrameImage gBattlerPicTable_OpponentRight[] = { - BATTLER_OFFSET(12), MON_PIC_SIZE, - BATTLER_OFFSET(13), MON_PIC_SIZE, - BATTLER_OFFSET(14), MON_PIC_SIZE, - BATTLER_OFFSET(15), MON_PIC_SIZE, + {BATTLER_OFFSET(12), MON_PIC_SIZE}, + {BATTLER_OFFSET(13), MON_PIC_SIZE}, + {BATTLER_OFFSET(14), MON_PIC_SIZE}, + {BATTLER_OFFSET(15), MON_PIC_SIZE}, }; const struct SpriteFrameImage gTrainerBackPicTable_Brendan[] = { - gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE, - gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE, - gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE, - gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE, + {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, }; const struct SpriteFrameImage gTrainerBackPicTable_May[] = { - gTrainerBackPic_May + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE, - gTrainerBackPic_May + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE, - gTrainerBackPic_May + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE, - gTrainerBackPic_May + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE, + {gTrainerBackPic_May + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, + {gTrainerBackPic_May + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, + {gTrainerBackPic_May + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, + {gTrainerBackPic_May + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, }; const struct SpriteFrameImage gTrainerBackPicTable_Red[] = { - gTrainerBackPic_Red + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE, - gTrainerBackPic_Red + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE, - gTrainerBackPic_Red + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE, - gTrainerBackPic_Red + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE, - gTrainerBackPic_Red + TRAINER_PIC_SIZE * 4, TRAINER_PIC_SIZE, + {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 4, TRAINER_PIC_SIZE}, }; const struct SpriteFrameImage gTrainerBackPicTable_Leaf[] = { - gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE, - gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE, - gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE, - gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE, - gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 4, TRAINER_PIC_SIZE, + {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 4, TRAINER_PIC_SIZE}, }; const struct SpriteFrameImage gTrainerBackPicTable_RubySapphireBrendan[] = { - gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE, - gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE, - gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE, - gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE, + {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, + {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, + {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, + {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, }; const struct SpriteFrameImage gTrainerBackPicTable_RubySapphireMay[] = { - gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE, - gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE, - gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE, - gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE, + {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, + {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, + {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, + {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, }; const struct SpriteFrameImage gTrainerBackPicTable_Wally[] = { - gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE, - gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE, - gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE, - gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE, + {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, }; const struct SpriteFrameImage gTrainerBackPicTable_Steven[] = { - gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE, - gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE, - gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE, - gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE, + {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, + {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, }; static const union AnimCmd sAnim_GeneralFrame0[] = diff --git a/src/data/battle_frontier/battle_frontier_trainer_mons.h b/src/data/battle_frontier/battle_frontier_trainer_mons.h index 625a602658..f0a203d56d 100644 --- a/src/data/battle_frontier/battle_frontier_trainer_mons.h +++ b/src/data/battle_frontier/battle_frontier_trainer_mons.h @@ -4172,7 +4172,7 @@ FRONTIER_MON_##lastmon##_10,\ -1 -// The strong Psychic M/F trainers all use the below pokemon +// The strong Psychic M/F trainers all use the below Pokémon // Additionally they use 1 of 3 legendary trios, and Latios or Latias depending on gender #define FRONTIER_MONS_PSYCHIC_2(lati, legend1, legend2, legend3) \ FRONTIER_MON_WOBBUFFET_1, \ diff --git a/src/data/contest_opponents.h b/src/data/contest_opponents.h index 7c3aad3151..d8241c4f0c 100644 --- a/src/data/contest_opponents.h +++ b/src/data/contest_opponents.h @@ -138,11 +138,14 @@ enum { #define CONTEST_AI_SET_20 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_12 | CONTEST_AI_DUMMY_25) #define CONTEST_AI_SET_21 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_7 | CONTEST_AI_DUMMY_25) +// All AI contestants have the same trainer ID +#define CONTEST_AI_TRAINER_ID 0xFFFF + const struct ContestWinner gDefaultContestWinners[] = { [CONTEST_WINNER_HALL_1 - 1] = { .personality = 0, - .trainerId = 0xFFFF, + .trainerId = CONTEST_AI_TRAINER_ID, .species = SPECIES_ELECTRIKE, .contestCategory = CONTEST_CATEGORY_CUTE, .monName = _("ELECTER"), @@ -151,7 +154,7 @@ const struct ContestWinner gDefaultContestWinners[] = }, [CONTEST_WINNER_HALL_2 - 1] = { .personality = 0, - .trainerId = 0xFFFF, + .trainerId = CONTEST_AI_TRAINER_ID, .species = SPECIES_TROPIUS, .contestCategory = CONTEST_CATEGORY_COOL, .monName = _("TROPO"), @@ -160,7 +163,7 @@ const struct ContestWinner gDefaultContestWinners[] = }, [CONTEST_WINNER_HALL_3 - 1] = { .personality = 0, - .trainerId = 0xFFFF, + .trainerId = CONTEST_AI_TRAINER_ID, .species = SPECIES_XATU, .contestCategory = CONTEST_CATEGORY_BEAUTY, .monName = _("TUXA"), @@ -169,7 +172,7 @@ const struct ContestWinner gDefaultContestWinners[] = }, [CONTEST_WINNER_HALL_4 - 1] = { .personality = 0, - .trainerId = 0xFFFF, + .trainerId = CONTEST_AI_TRAINER_ID, .species = SPECIES_PLUSLE, .contestCategory = CONTEST_CATEGORY_TOUGH, .monName = _("PULSE"), @@ -178,7 +181,7 @@ const struct ContestWinner gDefaultContestWinners[] = }, [CONTEST_WINNER_HALL_5 - 1] = { .personality = 0, - .trainerId = 0xFFFF, + .trainerId = CONTEST_AI_TRAINER_ID, .species = SPECIES_SHUPPET, .contestCategory = CONTEST_CATEGORY_SMART, .monName = _("SHUPUP"), @@ -187,7 +190,7 @@ const struct ContestWinner gDefaultContestWinners[] = }, [CONTEST_WINNER_HALL_6 - 1] = { .personality = 0, - .trainerId = 0xFFFF, + .trainerId = CONTEST_AI_TRAINER_ID, .species = SPECIES_ZANGOOSE, .contestCategory = CONTEST_CATEGORY_COOL, .monName = _("GOOZAN"), @@ -196,7 +199,7 @@ const struct ContestWinner gDefaultContestWinners[] = }, [CONTEST_WINNER_HALL_UNUSED_1 - 1] = { .personality = 0, - .trainerId = 0xFFFF, + .trainerId = CONTEST_AI_TRAINER_ID, .species = SPECIES_LOUDRED, .contestCategory = CONTEST_CATEGORY_BEAUTY, .monName = _("LOUDED"), @@ -205,7 +208,7 @@ const struct ContestWinner gDefaultContestWinners[] = }, [CONTEST_WINNER_HALL_UNUSED_2 - 1] = { .personality = 0, - .trainerId = 0xFFFF, + .trainerId = CONTEST_AI_TRAINER_ID, .species = SPECIES_DELCATTY, .contestCategory = CONTEST_CATEGORY_CUTE, .monName = _("KITSY"), @@ -242,7 +245,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 4, .sheen = 50, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_EDITH] = { .species = SPECIES_ILLUMISE, @@ -270,7 +273,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 2, .sheen = 60, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_EVAN] = { .species = SPECIES_DUSTOX, @@ -298,7 +301,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 4, .sheen = 70, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KELSEY] = { .species = SPECIES_SEEDOT, @@ -326,7 +329,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 7, .sheen = 80, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MADISON] = { .species = SPECIES_TAILLOW, @@ -354,7 +357,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 4, .sheen = 90, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RAYMOND] = { .species = SPECIES_NINCADA, @@ -382,7 +385,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 8, .sheen = 100, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_GRANT] = { .species = SPECIES_SHROOMISH, @@ -410,7 +413,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 2, .sheen = 50, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_PAIGE] = { .species = SPECIES_SPHEAL, @@ -438,7 +441,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 10, .sheen = 60, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ALEC] = { .species = SPECIES_SLAKOTH, @@ -466,7 +469,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 18, .sheen = 70, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SYDNEY] = { .species = SPECIES_WHISMUR, @@ -494,7 +497,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 7, .sheen = 80, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MORRIS] = { .species = SPECIES_MAKUHITA, @@ -522,7 +525,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 1, .sheen = 90, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MARIAH] = { .species = SPECIES_ARON, @@ -550,7 +553,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 2, .sheen = 100, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RUSSELL] = { .species = SPECIES_CROBAT, @@ -578,7 +581,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 10, .sheen = 50, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MELANIE] = { .species = SPECIES_GULPIN, @@ -606,7 +609,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 5, .sheen = 60, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CHANCE] = { .species = SPECIES_MANECTRIC, @@ -634,7 +637,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 1, .sheen = 70, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AGATHA] = { .species = SPECIES_BULBASAUR, @@ -662,7 +665,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 4, .sheen = 50, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_BEAU] = { .species = SPECIES_BUTTERFREE, @@ -690,7 +693,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 4, .sheen = 60, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KAY] = { .species = SPECIES_PIDGEOTTO, @@ -718,7 +721,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 3, .sheen = 70, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CALE] = { .species = SPECIES_DIGLETT, @@ -746,7 +749,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 10, .sheen = 80, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CAITLIN] = { .species = SPECIES_POLIWAG, @@ -774,7 +777,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 10, .sheen = 90, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_COLBY] = { .species = SPECIES_TOTODILE, @@ -802,7 +805,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 5, .sheen = 100, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KYLIE] = { .species = SPECIES_LEDYBA, @@ -830,7 +833,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 2, .sheen = 90, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LIAM] = { .species = SPECIES_DELIBIRD, @@ -858,7 +861,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 3, .sheen = 80, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MILO] = { .species = SPECIES_LARVITAR, @@ -886,7 +889,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 10, .sheen = 70, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KARINA] = { .species = SPECIES_ROSELIA, @@ -914,7 +917,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 20, .sheen = 100, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_BOBBY] = { .species = SPECIES_DODRIO, @@ -942,7 +945,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 35, .sheen = 110, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CLAIRE] = { .species = SPECIES_TRAPINCH, @@ -970,7 +973,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 25, .sheen = 120, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_WILLIE] = { .species = SPECIES_CACNEA, @@ -998,7 +1001,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 25, .sheen = 130, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CASSIDY] = { .species = SPECIES_SANDSLASH, @@ -1026,7 +1029,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 100, .sheen = 140, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MORGAN] = { .species = SPECIES_BALTOY, @@ -1054,7 +1057,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 35, .sheen = 150, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SUMMER] = { .species = SPECIES_MEDICHAM, @@ -1082,7 +1085,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 40, .sheen = 100, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MILES] = { .species = SPECIES_SPINDA, @@ -1110,7 +1113,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 25, .sheen = 110, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AUDREY] = { .species = SPECIES_SWABLU, @@ -1138,7 +1141,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 25, .sheen = 120, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AVERY] = { .species = SPECIES_SPOINK, @@ -1166,7 +1169,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 30, .sheen = 130, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ARIANA] = { .species = SPECIES_KECLEON, @@ -1194,7 +1197,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 35, .sheen = 140, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ASHTON] = { .species = SPECIES_GOLDEEN, @@ -1222,7 +1225,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 25, .sheen = 150, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SANDRA] = { .species = SPECIES_BARBOACH, @@ -1250,7 +1253,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 15, .sheen = 100, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CARSON] = { .species = SPECIES_SKARMORY, @@ -1278,7 +1281,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 20, .sheen = 110, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KATRINA] = { .species = SPECIES_LOTAD, @@ -1306,7 +1309,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 75, .sheen = 120, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LUKE] = { .species = SPECIES_SLOWBRO, @@ -1334,7 +1337,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 20, .sheen = 100, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RAUL] = { .species = SPECIES_FARFETCHD, @@ -1362,7 +1365,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 20, .sheen = 110, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JADA] = { .species = SPECIES_SEEL, @@ -1390,7 +1393,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 20, .sheen = 120, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ZEEK] = { .species = SPECIES_DROWZEE, @@ -1418,7 +1421,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 45, .sheen = 130, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DIEGO] = { .species = SPECIES_HITMONCHAN, @@ -1446,7 +1449,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 45, .sheen = 140, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ALIYAH] = { .species = SPECIES_BLISSEY, @@ -1474,7 +1477,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 20, .sheen = 150, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_NATALIA] = { .species = SPECIES_ELEKID, @@ -1502,7 +1505,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 25, .sheen = 140, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DEVIN] = { .species = SPECIES_SNUBBULL, @@ -1530,7 +1533,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 20, .sheen = 130, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_TYLOR] = { .species = SPECIES_MISDREAVUS, @@ -1558,7 +1561,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 20, .sheen = 120, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RONNIE] = { .species = SPECIES_LAIRON, @@ -1586,7 +1589,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 90, .sheen = 200, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CLAUDIA] = { .species = SPECIES_SHIFTRY, @@ -1614,7 +1617,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 70, .sheen = 210, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ELIAS] = { .species = SPECIES_NINJASK, @@ -1642,7 +1645,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 70, .sheen = 220, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JADE] = { .species = SPECIES_SWELLOW, @@ -1670,7 +1673,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 40, .sheen = 230, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_FRANCIS] = { .species = SPECIES_MIGHTYENA, @@ -1698,7 +1701,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 70, .sheen = 240, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ALISHA] = { .species = SPECIES_BEAUTIFLY, @@ -1726,7 +1729,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 100, .sheen = 250, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SAUL] = { .species = SPECIES_SEAKING, @@ -1754,7 +1757,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 90, .sheen = 200, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_FELICIA] = { .species = SPECIES_CASTFORM, @@ -1782,7 +1785,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 65, .sheen = 210, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_EMILIO] = { .species = SPECIES_MACHOKE, @@ -1810,7 +1813,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 50, .sheen = 220, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KARLA] = { .species = SPECIES_LOMBRE, @@ -1838,7 +1841,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 70, .sheen = 230, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DARRYL] = { .species = SPECIES_SEVIPER, @@ -1866,7 +1869,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 100, .sheen = 240, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SELENA] = { .species = SPECIES_WAILMER, @@ -1894,7 +1897,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 30, .sheen = 250, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_NOEL] = { .species = SPECIES_MAGIKARP, @@ -1922,7 +1925,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 160, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LACEY] = { .species = SPECIES_LUNATONE, @@ -1950,7 +1953,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 50, .sheen = 210, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CORBIN] = { .species = SPECIES_ABSOL, @@ -1978,7 +1981,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 35, .sheen = 220, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_GRACIE] = { .species = SPECIES_EXEGGUTOR, @@ -2006,7 +2009,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 80, .sheen = 200, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_COLTIN] = { .species = SPECIES_CUBONE, @@ -2034,7 +2037,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 100, .sheen = 210, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ELLIE] = { .species = SPECIES_HITMONLEE, @@ -2062,7 +2065,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 100, .sheen = 220, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MARCUS] = { .species = SPECIES_SQUIRTLE, @@ -2090,7 +2093,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 95, .sheen = 230, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KIARA] = { .species = SPECIES_KANGASKHAN, @@ -2118,7 +2121,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 100, .sheen = 240, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_BRYCE] = { .species = SPECIES_PINECO, @@ -2146,7 +2149,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 80, .sheen = 250, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JAMIE] = { .species = SPECIES_DUNSPARCE, @@ -2174,7 +2177,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 110, .sheen = 240, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JORGE] = { .species = SPECIES_HOUNDOOM, @@ -2202,7 +2205,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 80, .sheen = 230, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DEVON] = { .species = SPECIES_MILTANK, @@ -2230,7 +2233,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 40, .sheen = 220, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JUSTINA] = { .species = SPECIES_GYARADOS, @@ -2258,7 +2261,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 160, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_RALPH] = { .species = SPECIES_LOUDRED, @@ -2286,7 +2289,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 160, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_ROSA] = { .species = SPECIES_SKITTY, @@ -2314,7 +2317,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 60, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KEATON] = { .species = SPECIES_SLAKING, @@ -2342,7 +2345,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 150, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MAYRA] = { .species = SPECIES_ALTARIA, @@ -2370,7 +2373,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 90, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LAMAR] = { .species = SPECIES_KIRLIA, @@ -2398,7 +2401,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 80, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_AUBREY] = { .species = SPECIES_BELLOSSOM, @@ -2426,7 +2429,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 40, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_NIGEL] = { .species = SPECIES_SABLEYE, @@ -2454,7 +2457,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 160, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CAMILLE] = { .species = SPECIES_NATU, @@ -2482,7 +2485,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 170, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_DEON] = { .species = SPECIES_SHARPEDO, @@ -2510,7 +2513,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 100, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JANELLE] = { .species = SPECIES_LUVDISC, @@ -2538,7 +2541,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 190, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_HEATH] = { .species = SPECIES_HERACROSS, @@ -2566,7 +2569,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 140, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SASHA] = { .species = SPECIES_ELECTRODE, @@ -2594,7 +2597,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 50, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_FRANKIE] = { .species = SPECIES_PICHU, @@ -2622,7 +2625,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 120, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_HELEN] = { .species = SPECIES_WOBBUFFET, @@ -2650,7 +2653,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 210, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CAMILE] = { .species = SPECIES_GENGAR, @@ -2678,7 +2681,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 180, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_MARTIN] = { .species = SPECIES_PORYGON, @@ -2706,7 +2709,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 130, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_SERGIO] = { .species = SPECIES_DRAGONITE, @@ -2734,7 +2737,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 150, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_KAILEY] = { .species = SPECIES_MEOWTH, @@ -2762,7 +2765,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 80, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_PERLA] = { .species = SPECIES_JYNX, @@ -2790,7 +2793,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 120, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_CLARA] = { .species = SPECIES_TOGEPI, @@ -2818,7 +2821,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 80, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_JAKOB] = { .species = SPECIES_ESPEON, @@ -2846,7 +2849,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 150, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_TREY] = { .species = SPECIES_SLOWKING, @@ -2874,7 +2877,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 170, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, }, [CONTEST_OPPONENT_LANE] = { .species = SPECIES_URSARING, @@ -2902,7 +2905,7 @@ const struct ContestPokemon gContestOpponents[] = .tough = 190, .sheen = 255, .personality = 0, - .otId = 0xFFFF + .otId = CONTEST_AI_TRAINER_ID, } }; diff --git a/src/data/credits.h b/src/data/credits.h index 3ae2b1d3be..3b92ae26f7 100644 --- a/src/data/credits.h +++ b/src/data/credits.h @@ -221,565 +221,565 @@ static const u8 sCreditsText_MotoyasuTojima[] = _("Motoyasu Toji static const u8 sCreditsText_NicolaPrattBarlow[] = _("Nicola Pratt-Barlow"); static const u8 sCreditsText_ShellieDow[] = _("Shellie Dow"); static const u8 sCreditsText_ErikJohnson[] = _("Erik Johnson"); -static const struct CreditsEntry sCreditsEntry_EmptyString[] = { 0, FALSE, sCreditsText_EmptyString}; -static const struct CreditsEntry sCreditsEntry_PkmnEmeraldVersion[] = { 7, TRUE, sCreditsText_PkmnEmeraldVersion}; -static const struct CreditsEntry sCreditsEntry_Credits[] = {11, TRUE, sCreditsText_Credits}; -static const struct CreditsEntry sCreditsEntry_ExecutiveDirector[] = { 8, TRUE, sCreditsText_ExecutiveDirector}; -static const struct CreditsEntry sCreditsEntry_Director[] = {12, TRUE, sCreditsText_Director}; -static const struct CreditsEntry sCreditsEntry_ArtDirector[] = {10, TRUE, sCreditsText_ArtDirector}; -static const struct CreditsEntry sCreditsEntry_BattleDirector[] = {10, TRUE, sCreditsText_BattleDirector}; -static const struct CreditsEntry sCreditsEntry_MainProgrammer[] = {10, TRUE, sCreditsText_MainProgrammer}; -static const struct CreditsEntry sCreditsEntry_BattleSystemPgrms[] = { 8, TRUE, sCreditsText_BattleSystemPgrms}; -static const struct CreditsEntry sCreditsEntry_FieldSystemPgrms[] = { 7, TRUE, sCreditsText_FieldSystemPgrms}; -static const struct CreditsEntry sCreditsEntry_Programmers[] = {12, TRUE, sCreditsText_Programmers}; -static const struct CreditsEntry sCreditsEntry_MainGraphicDesigner[] = { 7, TRUE, sCreditsText_MainGraphicDesigner}; -static const struct CreditsEntry sCreditsEntry_GraphicDesigners[] = { 9, TRUE, sCreditsText_GraphicDesigners}; -static const struct CreditsEntry sCreditsEntry_PkmnDesigners[] = {10, TRUE, sCreditsText_PkmnDesigners}; -static const struct CreditsEntry sCreditsEntry_MusicComposition[] = {13, TRUE, sCreditsText_MusicComposition}; -static const struct CreditsEntry sCreditsEntry_SoundEffectsAndPkmnVoices[] = { 4, TRUE, sCreditsText_SoundEffectsAndPkmnVoices}; -static const struct CreditsEntry sCreditsEntry_GameDesigners[] = {11, TRUE, sCreditsText_GameDesigners}; -static const struct CreditsEntry sCreditsEntry_ScenarioPlot[] = {11, TRUE, sCreditsText_ScenarioPlot}; -static const struct CreditsEntry sCreditsEntry_Scenario[] = {13, TRUE, sCreditsText_Scenario}; -static const struct CreditsEntry sCreditsEntry_ScriptDesigners[] = {10, TRUE, sCreditsText_ScriptDesigners}; -static const struct CreditsEntry sCreditsEntry_MapDesigners[] = {11, TRUE, sCreditsText_MapDesigners}; -static const struct CreditsEntry sCreditsEntry_MapDataDesigners[] = { 9, TRUE, sCreditsText_MapDataDesigners}; -static const struct CreditsEntry sCreditsEntry_ParametricDesigners[] = { 9, TRUE, sCreditsText_ParametricDesigners}; -static const struct CreditsEntry sCreditsEntry_PokedexText[] = {11, TRUE, sCreditsText_PokedexText}; -static const struct CreditsEntry sCreditsEntry_EnvAndToolPgrms[] = { 6, TRUE, sCreditsText_EnvAndToolPgrms}; -static const struct CreditsEntry sCreditsEntry_NCLProductTesting[] = {11, TRUE, sCreditsText_NCLProductTesting}; -static const struct CreditsEntry sCreditsEntry_SpecialThanks[] = {10, TRUE, sCreditsText_SpecialThanks}; -static const struct CreditsEntry sCreditsEntry_Coordinators[] = {11, TRUE, sCreditsText_Coordinators}; -static const struct CreditsEntry sCreditsEntry_Producers[] = {11, TRUE, sCreditsText_Producers}; -static const struct CreditsEntry sCreditsEntry_ExecProducers[] = { 7, TRUE, sCreditsText_ExecProducers}; -static const struct CreditsEntry sCreditsEntry_InfoSupervisors[] = {10, TRUE, sCreditsText_InfoSupervisors}; -static const struct CreditsEntry sCreditsEntry_TaskManagers[] = { 8, TRUE, sCreditsText_TaskManagers}; -static const struct CreditsEntry sCreditsEntry_BrailleCodeCheck[] = {10, TRUE, sCreditsText_BrailleCodeCheck}; -static const struct CreditsEntry sCreditsEntry_WorldDirector[] = {10, TRUE, sCreditsText_WorldDirector}; -static const struct CreditsEntry sCreditsEntry_BattleFrontierData[] = { 8, TRUE, sCreditsText_BattleFrontierData}; -static const struct CreditsEntry sCreditsEntry_SupportProgrammers[] = {10, TRUE, sCreditsText_SupportProgrammers}; -static const struct CreditsEntry sCreditsEntry_Artwork[] = {12, TRUE, sCreditsText_Artwork}; -static const struct CreditsEntry sCreditsEntry_LeadProgrammer[] = {10, TRUE, sCreditsText_LeadProgrammer}; -static const struct CreditsEntry sCreditsEntry_LeadGraphicArtist[] = { 9, TRUE, sCreditsText_LeadGraphicArtist}; -static const struct CreditsEntry sCreditsEntry_SatoshiTajiri[] = {11, FALSE, sCreditsText_SatoshiTajiri}; -static const struct CreditsEntry sCreditsEntry_JunichiMasuda[] = {11, FALSE, sCreditsText_JunichiMasuda}; -static const struct CreditsEntry sCreditsEntry_KenSugimori[] = {11, FALSE, sCreditsText_KenSugimori}; -static const struct CreditsEntry sCreditsEntry_ShigekiMorimoto[] = {11, FALSE, sCreditsText_ShigekiMorimoto}; -static const struct CreditsEntry sCreditsEntry_TetsuyaWatanabe[] = {11, FALSE, sCreditsText_TetsuyaWatanabe}; -static const struct CreditsEntry sCreditsEntry_HisashiSogabe[] = {11, FALSE, sCreditsText_HisashiSogabe}; -static const struct CreditsEntry sCreditsEntry_SosukeTamada[] = {11, FALSE, sCreditsText_SosukeTamada}; -static const struct CreditsEntry sCreditsEntry_AkitoMori[] = {11, FALSE, sCreditsText_AkitoMori}; -static const struct CreditsEntry sCreditsEntry_KeitaKagaya[] = {11, FALSE, sCreditsText_KeitaKagaya}; -static const struct CreditsEntry sCreditsEntry_YoshinoriMatsuda[] = {11, FALSE, sCreditsText_YoshinoriMatsuda}; -static const struct CreditsEntry sCreditsEntry_HiroyukiNakamura[] = {11, FALSE, sCreditsText_HiroyukiNakamura}; -static const struct CreditsEntry sCreditsEntry_MasaoTaya[] = {11, FALSE, sCreditsText_MasaoTaya}; -static const struct CreditsEntry sCreditsEntry_SatoshiNohara[] = {11, FALSE, sCreditsText_SatoshiNohara}; -static const struct CreditsEntry sCreditsEntry_TomomichiOhta[] = {11, FALSE, sCreditsText_TomomichiOhta}; -static const struct CreditsEntry sCreditsEntry_MiyukiIwasawa[] = {11, FALSE, sCreditsText_MiyukiIwasawa}; -static const struct CreditsEntry sCreditsEntry_TakenoriOhta[] = {11, FALSE, sCreditsText_TakenoriOhta}; -static const struct CreditsEntry sCreditsEntry_HironobuYoshida[] = {11, FALSE, sCreditsText_HironobuYoshida}; -static const struct CreditsEntry sCreditsEntry_MotofumiFujiwara[] = {11, FALSE, sCreditsText_MotofumiFujiwara}; -static const struct CreditsEntry sCreditsEntry_SatoshiOhta[] = {11, FALSE, sCreditsText_SatoshiOhta}; -static const struct CreditsEntry sCreditsEntry_AsukaIwashita[] = {11, FALSE, sCreditsText_AsukaIwashita}; -static const struct CreditsEntry sCreditsEntry_AimiTomita[] = {11, FALSE, sCreditsText_AimiTomita}; -static const struct CreditsEntry sCreditsEntry_TakaoUnno[] = {11, FALSE, sCreditsText_TakaoUnno}; -static const struct CreditsEntry sCreditsEntry_KanakoEo[] = {11, FALSE, sCreditsText_KanakoEo}; -static const struct CreditsEntry sCreditsEntry_JunOkutani[] = {11, FALSE, sCreditsText_JunOkutani}; -static const struct CreditsEntry sCreditsEntry_AtsukoNishida[] = {11, FALSE, sCreditsText_AtsukoNishida}; -static const struct CreditsEntry sCreditsEntry_MuneoSaito[] = {11, FALSE, sCreditsText_MuneoSaito}; -static const struct CreditsEntry sCreditsEntry_RenaYoshikawa[] = {11, FALSE, sCreditsText_RenaYoshikawa}; -static const struct CreditsEntry sCreditsEntry_GoIchinose[] = {11, FALSE, sCreditsText_GoIchinose}; -static const struct CreditsEntry sCreditsEntry_MorikazuAoki[] = {11, FALSE, sCreditsText_MorikazuAoki}; -static const struct CreditsEntry sCreditsEntry_KojiNishino[] = {11, FALSE, sCreditsText_KojiNishino}; -static const struct CreditsEntry sCreditsEntry_KenjiMatsushima[] = {11, FALSE, sCreditsText_KenjiMatsushima}; -static const struct CreditsEntry sCreditsEntry_TetsujiOhta[] = {11, FALSE, sCreditsText_TetsujiOhta}; -static const struct CreditsEntry sCreditsEntry_HitomiSato[] = {11, FALSE, sCreditsText_HitomiSato}; -static const struct CreditsEntry sCreditsEntry_TakeshiKawachimaru[] = {11, FALSE, sCreditsText_TakeshiKawachimaru}; -static const struct CreditsEntry sCreditsEntry_TeruyukiShimoyamada[] = {11, FALSE, sCreditsText_TeruyukiShimoyamada}; -static const struct CreditsEntry sCreditsEntry_ShigeruOhmori[] = {11, FALSE, sCreditsText_ShigeruOhmori}; -static const struct CreditsEntry sCreditsEntry_TadashiTakahashi[] = {11, FALSE, sCreditsText_TadashiTakahashi}; -static const struct CreditsEntry sCreditsEntry_ToshinobuMatsumiya[] = {11, FALSE, sCreditsText_ToshinobuMatsumiya}; -static const struct CreditsEntry sCreditsEntry_AkihitoTomisawa[] = {11, FALSE, sCreditsText_AkihitoTomisawa}; -static const struct CreditsEntry sCreditsEntry_HirokiEnomoto[] = {11, FALSE, sCreditsText_HirokiEnomoto}; -static const struct CreditsEntry sCreditsEntry_KazuyukiTerada[] = {11, FALSE, sCreditsText_KazuyukiTerada}; -static const struct CreditsEntry sCreditsEntry_YuriSakurai[] = {11, FALSE, sCreditsText_YuriSakurai}; -static const struct CreditsEntry sCreditsEntry_HiromiSagawa[] = {11, FALSE, sCreditsText_HiromiSagawa}; -static const struct CreditsEntry sCreditsEntry_KenjiTominaga[] = {11, FALSE, sCreditsText_KenjiTominaga}; -static const struct CreditsEntry sCreditsEntry_YoshioTajiri[] = {11, FALSE, sCreditsText_YoshioTajiri}; -static const struct CreditsEntry sCreditsEntry_TeikoSasaki[] = {11, FALSE, sCreditsText_TeikoSasaki}; -static const struct CreditsEntry sCreditsEntry_SachikoHamano[] = {11, FALSE, sCreditsText_SachikoHamano}; -static const struct CreditsEntry sCreditsEntry_ChieMatsumiya[] = {11, FALSE, sCreditsText_ChieMatsumiya}; -static const struct CreditsEntry sCreditsEntry_AkikoShinozaki[] = {11, FALSE, sCreditsText_AkikoShinozaki}; -static const struct CreditsEntry sCreditsEntry_AstukoFujii[] = {11, FALSE, sCreditsText_AstukoFujii}; -static const struct CreditsEntry sCreditsEntry_NozomuSaito[] = {11, FALSE, sCreditsText_NozomuSaito}; -static const struct CreditsEntry sCreditsEntry_KenkichiToyama[] = {11, FALSE, sCreditsText_KenkichiToyama}; -static const struct CreditsEntry sCreditsEntry_SuguruNakatsui[] = {11, FALSE, sCreditsText_SuguruNakatsui}; -static const struct CreditsEntry sCreditsEntry_YumiFunasaka[] = {11, FALSE, sCreditsText_YumiFunasaka}; -static const struct CreditsEntry sCreditsEntry_NaokoYanase[] = {11, FALSE, sCreditsText_NaokoYanase}; -static const struct CreditsEntry sCreditsEntry_NCLSuperMarioClub[] = {11, FALSE, sCreditsText_NCLSuperMarioClub}; -static const struct CreditsEntry sCreditsEntry_AtsushiTada[] = {11, FALSE, sCreditsText_AtsushiTada}; -static const struct CreditsEntry sCreditsEntry_TakahiroOhnishi[] = {11, FALSE, sCreditsText_TakahiroOhnishi}; -static const struct CreditsEntry sCreditsEntry_NorihideOkamura[] = {11, FALSE, sCreditsText_NorihideOkamura}; -static const struct CreditsEntry sCreditsEntry_HiroNakamura[] = {11, FALSE, sCreditsText_HiroNakamura}; -static const struct CreditsEntry sCreditsEntry_HiroyukiUesugi[] = {11, FALSE, sCreditsText_HiroyukiUesugi}; -static const struct CreditsEntry sCreditsEntry_TerukiMurakawa[] = {11, FALSE, sCreditsText_TerukiMurakawa}; -static const struct CreditsEntry sCreditsEntry_AkiraKinashi[] = {11, FALSE, sCreditsText_AkiraKinashi}; -static const struct CreditsEntry sCreditsEntry_MichikoTakizawa[] = {11, FALSE, sCreditsText_MichikoTakizawa}; -static const struct CreditsEntry sCreditsEntry_MakikoTakada[] = {11, FALSE, sCreditsText_MakikoTakada}; -static const struct CreditsEntry sCreditsEntry_TakanaoKondo[] = {11, FALSE, sCreditsText_TakanaoKondo}; -static const struct CreditsEntry sCreditsEntry_AiMashima[] = {11, FALSE, sCreditsText_AiMashima}; -static const struct CreditsEntry sCreditsEntry_GakujiNomoto[] = {11, FALSE, sCreditsText_GakujiNomoto}; -static const struct CreditsEntry sCreditsEntry_TakehiroIzushi[] = {11, FALSE, sCreditsText_TakehiroIzushi}; -static const struct CreditsEntry sCreditsEntry_HitoshiYamagami[] = {11, FALSE, sCreditsText_HitoshiYamagami}; -static const struct CreditsEntry sCreditsEntry_KyokoWatanabe[] = {11, FALSE, sCreditsText_KyokoWatanabe}; -static const struct CreditsEntry sCreditsEntry_TakaoNakano[] = {11, FALSE, sCreditsText_TakaoNakano}; -static const struct CreditsEntry sCreditsEntry_HiroyukiJinnai[] = {11, FALSE, sCreditsText_HiroyukiJinnai}; -static const struct CreditsEntry sCreditsEntry_HiroakiTsuru[] = {11, FALSE, sCreditsText_HiroakiTsuru}; -static const struct CreditsEntry sCreditsEntry_TsunekazIshihara[] = {11, FALSE, sCreditsText_TsunekazIshihara}; -static const struct CreditsEntry sCreditsEntry_SatoruIwata[] = {11, FALSE, sCreditsText_SatoruIwata}; -static const struct CreditsEntry sCreditsEntry_KazuyaSuyama[] = {11, FALSE, sCreditsText_KazuyaSuyama}; -static const struct CreditsEntry sCreditsEntry_SatoshiMitsuhara[] = {11, FALSE, sCreditsText_SatoshiMitsuhara}; -static const struct CreditsEntry sCreditsEntry_JapanBrailleLibrary[] = { 9, FALSE, sCreditsText_JapanBrailleLibrary}; -static const struct CreditsEntry sCreditsEntry_TomotakaKomura[] = {11, FALSE, sCreditsText_TomotakaKomura}; -static const struct CreditsEntry sCreditsEntry_MikikoOhhashi[] = {11, FALSE, sCreditsText_MikikoOhhashi}; -static const struct CreditsEntry sCreditsEntry_DaisukeHoshino[] = {11, FALSE, sCreditsText_DaisukeHoshino}; -static const struct CreditsEntry sCreditsEntry_KenjiroIto[] = {11, FALSE, sCreditsText_KenjiroIto}; -static const struct CreditsEntry sCreditsEntry_RuiKawaguchi[] = {11, FALSE, sCreditsText_RuiKawaguchi}; -static const struct CreditsEntry sCreditsEntry_ShunsukeKohori[] = {11, FALSE, sCreditsText_ShunsukeKohori}; -static const struct CreditsEntry sCreditsEntry_SachikoNakamichi[] = {11, FALSE, sCreditsText_SachikoNakamichi}; -static const struct CreditsEntry sCreditsEntry_FujikoNomura[] = {11, FALSE, sCreditsText_FujikoNomura}; -static const struct CreditsEntry sCreditsEntry_KazukiYoshihara[] = {11, FALSE, sCreditsText_KazukiYoshihara}; -static const struct CreditsEntry sCreditsEntry_RetsujiNomoto[] = {11, FALSE, sCreditsText_RetsujiNomoto}; -static const struct CreditsEntry sCreditsEntry_AzusaTajima[] = {11, FALSE, sCreditsText_AzusaTajima}; -static const struct CreditsEntry sCreditsEntry_ShusakuEgami[] = {11, FALSE, sCreditsText_ShusakuEgami}; -static const struct CreditsEntry sCreditsEntry_PackageAndManual[] = { 0, TRUE, sCreditsText_PackageAndManual}; -static const struct CreditsEntry sCreditsEntry_EnglishVersion[] = { 0, TRUE, sCreditsText_EnglishVersion}; -static const struct CreditsEntry sCreditsEntry_Translator[] = { 0, TRUE, sCreditsText_Translator}; -static const struct CreditsEntry sCreditsEntry_TextEditor[] = { 0, TRUE, sCreditsText_TextEditor}; -static const struct CreditsEntry sCreditsEntry_NCLCoordinator[] = { 0, TRUE, sCreditsText_NCLCoordinator}; -static const struct CreditsEntry sCreditsEntry_GraphicDesigner[] = { 0, TRUE, sCreditsText_GraphicDesigner}; -static const struct CreditsEntry sCreditsEntry_NOAProductTesting[] = { 0, TRUE, sCreditsText_NOAProductTesting}; -static const struct CreditsEntry sCreditsEntry_HideyukiNakajima[] = { 0, FALSE, sCreditsText_HideyukiNakajima}; -static const struct CreditsEntry sCreditsEntry_HidenoriSaeki[] = { 0, FALSE, sCreditsText_HidenoriSaeki}; -static const struct CreditsEntry sCreditsEntry_YokoWatanabe[] = { 0, FALSE, sCreditsText_YokoWatanabe}; -static const struct CreditsEntry sCreditsEntry_SakaeKimura[] = { 0, FALSE, sCreditsText_SakaeKimura}; -static const struct CreditsEntry sCreditsEntry_ChiakiShinkai[] = { 0, FALSE, sCreditsText_ChiakiShinkai}; -static const struct CreditsEntry sCreditsEntry_SethMcMahill[] = { 0, FALSE, sCreditsText_SethMcMahill}; -static const struct CreditsEntry sCreditsEntry_NobOgasawara[] = { 0, FALSE, sCreditsText_NobOgasawara}; -static const struct CreditsEntry sCreditsEntry_TeresaLillygren[] = { 0, FALSE, sCreditsText_TeresaLillygren}; -static const struct CreditsEntry sCreditsEntry_KimikoNakamichi[] = { 0, FALSE, sCreditsText_KimikoNakamichi}; -static const struct CreditsEntry sCreditsEntry_SouichiYamamoto[] = { 0, FALSE, sCreditsText_SouichiYamamoto}; -static const struct CreditsEntry sCreditsEntry_YuichiroIto[] = { 0, FALSE, sCreditsText_YuichiroIto}; -static const struct CreditsEntry sCreditsEntry_ThomasHertzog[] = { 0, FALSE, sCreditsText_ThomasHertzog}; -static const struct CreditsEntry sCreditsEntry_MikaKurosawa[] = { 0, FALSE, sCreditsText_MikaKurosawa}; -static const struct CreditsEntry sCreditsEntry_NationalFederationBlind[] = { 0, FALSE, sCreditsText_NationalFederationBlind}; -static const struct CreditsEntry sCreditsEntry_PatriciaAMaurer[] = { 0, FALSE, sCreditsText_PatriciaAMaurer}; -static const struct CreditsEntry sCreditsEntry_EuropeanBlindUnion[] = { 0, FALSE, sCreditsText_EuropeanBlindUnion}; -static const struct CreditsEntry sCreditsEntry_AustralianBrailleAuthority[] = { 0, FALSE, sCreditsText_AustralianBrailleAuthority}; -static const struct CreditsEntry sCreditsEntry_RoyalNewZealandFederationBlind[] = { 0, FALSE, sCreditsText_RoyalNewZealandFederationBlind}; -static const struct CreditsEntry sCreditsEntry_MotoyasuTojima[] = { 0, FALSE, sCreditsText_MotoyasuTojima}; -static const struct CreditsEntry sCreditsEntry_NicolaPrattBarlow[] = { 0, FALSE, sCreditsText_NicolaPrattBarlow}; -static const struct CreditsEntry sCreditsEntry_ShellieDow[] = { 0, FALSE, sCreditsText_ShellieDow}; -static const struct CreditsEntry sCreditsEntry_ErikJohnson[] = { 0, FALSE, sCreditsText_ErikJohnson}; +static const struct CreditsEntry sCreditsEntry_EmptyString = { 0, FALSE, sCreditsText_EmptyString}; +static const struct CreditsEntry sCreditsEntry_PkmnEmeraldVersion = { 7, TRUE, sCreditsText_PkmnEmeraldVersion}; +static const struct CreditsEntry sCreditsEntry_Credits = {11, TRUE, sCreditsText_Credits}; +static const struct CreditsEntry sCreditsEntry_ExecutiveDirector = { 8, TRUE, sCreditsText_ExecutiveDirector}; +static const struct CreditsEntry sCreditsEntry_Director = {12, TRUE, sCreditsText_Director}; +static const struct CreditsEntry sCreditsEntry_ArtDirector = {10, TRUE, sCreditsText_ArtDirector}; +static const struct CreditsEntry sCreditsEntry_BattleDirector = {10, TRUE, sCreditsText_BattleDirector}; +static const struct CreditsEntry sCreditsEntry_MainProgrammer = {10, TRUE, sCreditsText_MainProgrammer}; +static const struct CreditsEntry sCreditsEntry_BattleSystemPgrms = { 8, TRUE, sCreditsText_BattleSystemPgrms}; +static const struct CreditsEntry sCreditsEntry_FieldSystemPgrms = { 7, TRUE, sCreditsText_FieldSystemPgrms}; +static const struct CreditsEntry sCreditsEntry_Programmers = {12, TRUE, sCreditsText_Programmers}; +static const struct CreditsEntry sCreditsEntry_MainGraphicDesigner = { 7, TRUE, sCreditsText_MainGraphicDesigner}; +static const struct CreditsEntry sCreditsEntry_GraphicDesigners = { 9, TRUE, sCreditsText_GraphicDesigners}; +static const struct CreditsEntry sCreditsEntry_PkmnDesigners = {10, TRUE, sCreditsText_PkmnDesigners}; +static const struct CreditsEntry sCreditsEntry_MusicComposition = {13, TRUE, sCreditsText_MusicComposition}; +static const struct CreditsEntry sCreditsEntry_SoundEffectsAndPkmnVoices = { 4, TRUE, sCreditsText_SoundEffectsAndPkmnVoices}; +static const struct CreditsEntry sCreditsEntry_GameDesigners = {11, TRUE, sCreditsText_GameDesigners}; +static const struct CreditsEntry sCreditsEntry_ScenarioPlot = {11, TRUE, sCreditsText_ScenarioPlot}; +static const struct CreditsEntry sCreditsEntry_Scenario = {13, TRUE, sCreditsText_Scenario}; +static const struct CreditsEntry sCreditsEntry_ScriptDesigners = {10, TRUE, sCreditsText_ScriptDesigners}; +static const struct CreditsEntry sCreditsEntry_MapDesigners = {11, TRUE, sCreditsText_MapDesigners}; +static const struct CreditsEntry sCreditsEntry_MapDataDesigners = { 9, TRUE, sCreditsText_MapDataDesigners}; +static const struct CreditsEntry sCreditsEntry_ParametricDesigners = { 9, TRUE, sCreditsText_ParametricDesigners}; +static const struct CreditsEntry sCreditsEntry_PokedexText = {11, TRUE, sCreditsText_PokedexText}; +static const struct CreditsEntry sCreditsEntry_EnvAndToolPgrms = { 6, TRUE, sCreditsText_EnvAndToolPgrms}; +static const struct CreditsEntry sCreditsEntry_NCLProductTesting = {11, TRUE, sCreditsText_NCLProductTesting}; +static const struct CreditsEntry sCreditsEntry_SpecialThanks = {10, TRUE, sCreditsText_SpecialThanks}; +static const struct CreditsEntry sCreditsEntry_Coordinators = {11, TRUE, sCreditsText_Coordinators}; +static const struct CreditsEntry sCreditsEntry_Producers = {11, TRUE, sCreditsText_Producers}; +static const struct CreditsEntry sCreditsEntry_ExecProducers = { 7, TRUE, sCreditsText_ExecProducers}; +static const struct CreditsEntry sCreditsEntry_InfoSupervisors = {10, TRUE, sCreditsText_InfoSupervisors}; +static const struct CreditsEntry sCreditsEntry_TaskManagers = { 8, TRUE, sCreditsText_TaskManagers}; +static const struct CreditsEntry sCreditsEntry_BrailleCodeCheck = {10, TRUE, sCreditsText_BrailleCodeCheck}; +static const struct CreditsEntry sCreditsEntry_WorldDirector = {10, TRUE, sCreditsText_WorldDirector}; +static const struct CreditsEntry sCreditsEntry_BattleFrontierData = { 8, TRUE, sCreditsText_BattleFrontierData}; +static const struct CreditsEntry sCreditsEntry_SupportProgrammers = {10, TRUE, sCreditsText_SupportProgrammers}; +static const struct CreditsEntry sCreditsEntry_Artwork = {12, TRUE, sCreditsText_Artwork}; +static const struct CreditsEntry sCreditsEntry_LeadProgrammer = {10, TRUE, sCreditsText_LeadProgrammer}; +static const struct CreditsEntry sCreditsEntry_LeadGraphicArtist = { 9, TRUE, sCreditsText_LeadGraphicArtist}; +static const struct CreditsEntry sCreditsEntry_SatoshiTajiri = {11, FALSE, sCreditsText_SatoshiTajiri}; +static const struct CreditsEntry sCreditsEntry_JunichiMasuda = {11, FALSE, sCreditsText_JunichiMasuda}; +static const struct CreditsEntry sCreditsEntry_KenSugimori = {11, FALSE, sCreditsText_KenSugimori}; +static const struct CreditsEntry sCreditsEntry_ShigekiMorimoto = {11, FALSE, sCreditsText_ShigekiMorimoto}; +static const struct CreditsEntry sCreditsEntry_TetsuyaWatanabe = {11, FALSE, sCreditsText_TetsuyaWatanabe}; +static const struct CreditsEntry sCreditsEntry_HisashiSogabe = {11, FALSE, sCreditsText_HisashiSogabe}; +static const struct CreditsEntry sCreditsEntry_SosukeTamada = {11, FALSE, sCreditsText_SosukeTamada}; +static const struct CreditsEntry sCreditsEntry_AkitoMori = {11, FALSE, sCreditsText_AkitoMori}; +static const struct CreditsEntry sCreditsEntry_KeitaKagaya = {11, FALSE, sCreditsText_KeitaKagaya}; +static const struct CreditsEntry sCreditsEntry_YoshinoriMatsuda = {11, FALSE, sCreditsText_YoshinoriMatsuda}; +static const struct CreditsEntry sCreditsEntry_HiroyukiNakamura = {11, FALSE, sCreditsText_HiroyukiNakamura}; +static const struct CreditsEntry sCreditsEntry_MasaoTaya = {11, FALSE, sCreditsText_MasaoTaya}; +static const struct CreditsEntry sCreditsEntry_SatoshiNohara = {11, FALSE, sCreditsText_SatoshiNohara}; +static const struct CreditsEntry sCreditsEntry_TomomichiOhta = {11, FALSE, sCreditsText_TomomichiOhta}; +static const struct CreditsEntry sCreditsEntry_MiyukiIwasawa = {11, FALSE, sCreditsText_MiyukiIwasawa}; +static const struct CreditsEntry sCreditsEntry_TakenoriOhta = {11, FALSE, sCreditsText_TakenoriOhta}; +static const struct CreditsEntry sCreditsEntry_HironobuYoshida = {11, FALSE, sCreditsText_HironobuYoshida}; +static const struct CreditsEntry sCreditsEntry_MotofumiFujiwara = {11, FALSE, sCreditsText_MotofumiFujiwara}; +static const struct CreditsEntry sCreditsEntry_SatoshiOhta = {11, FALSE, sCreditsText_SatoshiOhta}; +static const struct CreditsEntry sCreditsEntry_AsukaIwashita = {11, FALSE, sCreditsText_AsukaIwashita}; +static const struct CreditsEntry sCreditsEntry_AimiTomita = {11, FALSE, sCreditsText_AimiTomita}; +static const struct CreditsEntry sCreditsEntry_TakaoUnno = {11, FALSE, sCreditsText_TakaoUnno}; +static const struct CreditsEntry sCreditsEntry_KanakoEo = {11, FALSE, sCreditsText_KanakoEo}; +static const struct CreditsEntry sCreditsEntry_JunOkutani = {11, FALSE, sCreditsText_JunOkutani}; +static const struct CreditsEntry sCreditsEntry_AtsukoNishida = {11, FALSE, sCreditsText_AtsukoNishida}; +static const struct CreditsEntry sCreditsEntry_MuneoSaito = {11, FALSE, sCreditsText_MuneoSaito}; +static const struct CreditsEntry sCreditsEntry_RenaYoshikawa = {11, FALSE, sCreditsText_RenaYoshikawa}; +static const struct CreditsEntry sCreditsEntry_GoIchinose = {11, FALSE, sCreditsText_GoIchinose}; +static const struct CreditsEntry sCreditsEntry_MorikazuAoki = {11, FALSE, sCreditsText_MorikazuAoki}; +static const struct CreditsEntry sCreditsEntry_KojiNishino = {11, FALSE, sCreditsText_KojiNishino}; +static const struct CreditsEntry sCreditsEntry_KenjiMatsushima = {11, FALSE, sCreditsText_KenjiMatsushima}; +static const struct CreditsEntry sCreditsEntry_TetsujiOhta = {11, FALSE, sCreditsText_TetsujiOhta}; +static const struct CreditsEntry sCreditsEntry_HitomiSato = {11, FALSE, sCreditsText_HitomiSato}; +static const struct CreditsEntry sCreditsEntry_TakeshiKawachimaru = {11, FALSE, sCreditsText_TakeshiKawachimaru}; +static const struct CreditsEntry sCreditsEntry_TeruyukiShimoyamada = {11, FALSE, sCreditsText_TeruyukiShimoyamada}; +static const struct CreditsEntry sCreditsEntry_ShigeruOhmori = {11, FALSE, sCreditsText_ShigeruOhmori}; +static const struct CreditsEntry sCreditsEntry_TadashiTakahashi = {11, FALSE, sCreditsText_TadashiTakahashi}; +static const struct CreditsEntry sCreditsEntry_ToshinobuMatsumiya = {11, FALSE, sCreditsText_ToshinobuMatsumiya}; +static const struct CreditsEntry sCreditsEntry_AkihitoTomisawa = {11, FALSE, sCreditsText_AkihitoTomisawa}; +static const struct CreditsEntry sCreditsEntry_HirokiEnomoto = {11, FALSE, sCreditsText_HirokiEnomoto}; +static const struct CreditsEntry sCreditsEntry_KazuyukiTerada = {11, FALSE, sCreditsText_KazuyukiTerada}; +static const struct CreditsEntry sCreditsEntry_YuriSakurai = {11, FALSE, sCreditsText_YuriSakurai}; +static const struct CreditsEntry sCreditsEntry_HiromiSagawa = {11, FALSE, sCreditsText_HiromiSagawa}; +static const struct CreditsEntry sCreditsEntry_KenjiTominaga = {11, FALSE, sCreditsText_KenjiTominaga}; +static const struct CreditsEntry sCreditsEntry_YoshioTajiri = {11, FALSE, sCreditsText_YoshioTajiri}; +static const struct CreditsEntry sCreditsEntry_TeikoSasaki = {11, FALSE, sCreditsText_TeikoSasaki}; +static const struct CreditsEntry sCreditsEntry_SachikoHamano = {11, FALSE, sCreditsText_SachikoHamano}; +static const struct CreditsEntry sCreditsEntry_ChieMatsumiya = {11, FALSE, sCreditsText_ChieMatsumiya}; +static const struct CreditsEntry sCreditsEntry_AkikoShinozaki = {11, FALSE, sCreditsText_AkikoShinozaki}; +static const struct CreditsEntry sCreditsEntry_AstukoFujii = {11, FALSE, sCreditsText_AstukoFujii}; +static const struct CreditsEntry sCreditsEntry_NozomuSaito = {11, FALSE, sCreditsText_NozomuSaito}; +static const struct CreditsEntry sCreditsEntry_KenkichiToyama = {11, FALSE, sCreditsText_KenkichiToyama}; +static const struct CreditsEntry sCreditsEntry_SuguruNakatsui = {11, FALSE, sCreditsText_SuguruNakatsui}; +static const struct CreditsEntry sCreditsEntry_YumiFunasaka = {11, FALSE, sCreditsText_YumiFunasaka}; +static const struct CreditsEntry sCreditsEntry_NaokoYanase = {11, FALSE, sCreditsText_NaokoYanase}; +static const struct CreditsEntry sCreditsEntry_NCLSuperMarioClub = {11, FALSE, sCreditsText_NCLSuperMarioClub}; +static const struct CreditsEntry sCreditsEntry_AtsushiTada = {11, FALSE, sCreditsText_AtsushiTada}; +static const struct CreditsEntry sCreditsEntry_TakahiroOhnishi = {11, FALSE, sCreditsText_TakahiroOhnishi}; +static const struct CreditsEntry sCreditsEntry_NorihideOkamura = {11, FALSE, sCreditsText_NorihideOkamura}; +static const struct CreditsEntry sCreditsEntry_HiroNakamura = {11, FALSE, sCreditsText_HiroNakamura}; +static const struct CreditsEntry sCreditsEntry_HiroyukiUesugi = {11, FALSE, sCreditsText_HiroyukiUesugi}; +static const struct CreditsEntry sCreditsEntry_TerukiMurakawa = {11, FALSE, sCreditsText_TerukiMurakawa}; +static const struct CreditsEntry sCreditsEntry_AkiraKinashi = {11, FALSE, sCreditsText_AkiraKinashi}; +static const struct CreditsEntry sCreditsEntry_MichikoTakizawa = {11, FALSE, sCreditsText_MichikoTakizawa}; +static const struct CreditsEntry sCreditsEntry_MakikoTakada = {11, FALSE, sCreditsText_MakikoTakada}; +static const struct CreditsEntry sCreditsEntry_TakanaoKondo = {11, FALSE, sCreditsText_TakanaoKondo}; +static const struct CreditsEntry sCreditsEntry_AiMashima = {11, FALSE, sCreditsText_AiMashima}; +static const struct CreditsEntry sCreditsEntry_GakujiNomoto = {11, FALSE, sCreditsText_GakujiNomoto}; +static const struct CreditsEntry sCreditsEntry_TakehiroIzushi = {11, FALSE, sCreditsText_TakehiroIzushi}; +static const struct CreditsEntry sCreditsEntry_HitoshiYamagami = {11, FALSE, sCreditsText_HitoshiYamagami}; +static const struct CreditsEntry sCreditsEntry_KyokoWatanabe = {11, FALSE, sCreditsText_KyokoWatanabe}; +static const struct CreditsEntry sCreditsEntry_TakaoNakano = {11, FALSE, sCreditsText_TakaoNakano}; +static const struct CreditsEntry sCreditsEntry_HiroyukiJinnai = {11, FALSE, sCreditsText_HiroyukiJinnai}; +static const struct CreditsEntry sCreditsEntry_HiroakiTsuru = {11, FALSE, sCreditsText_HiroakiTsuru}; +static const struct CreditsEntry sCreditsEntry_TsunekazIshihara = {11, FALSE, sCreditsText_TsunekazIshihara}; +static const struct CreditsEntry sCreditsEntry_SatoruIwata = {11, FALSE, sCreditsText_SatoruIwata}; +static const struct CreditsEntry sCreditsEntry_KazuyaSuyama = {11, FALSE, sCreditsText_KazuyaSuyama}; +static const struct CreditsEntry sCreditsEntry_SatoshiMitsuhara = {11, FALSE, sCreditsText_SatoshiMitsuhara}; +static const struct CreditsEntry sCreditsEntry_JapanBrailleLibrary = { 9, FALSE, sCreditsText_JapanBrailleLibrary}; +static const struct CreditsEntry sCreditsEntry_TomotakaKomura = {11, FALSE, sCreditsText_TomotakaKomura}; +static const struct CreditsEntry sCreditsEntry_MikikoOhhashi = {11, FALSE, sCreditsText_MikikoOhhashi}; +static const struct CreditsEntry sCreditsEntry_DaisukeHoshino = {11, FALSE, sCreditsText_DaisukeHoshino}; +static const struct CreditsEntry sCreditsEntry_KenjiroIto = {11, FALSE, sCreditsText_KenjiroIto}; +static const struct CreditsEntry sCreditsEntry_RuiKawaguchi = {11, FALSE, sCreditsText_RuiKawaguchi}; +static const struct CreditsEntry sCreditsEntry_ShunsukeKohori = {11, FALSE, sCreditsText_ShunsukeKohori}; +static const struct CreditsEntry sCreditsEntry_SachikoNakamichi = {11, FALSE, sCreditsText_SachikoNakamichi}; +static const struct CreditsEntry sCreditsEntry_FujikoNomura = {11, FALSE, sCreditsText_FujikoNomura}; +static const struct CreditsEntry sCreditsEntry_KazukiYoshihara = {11, FALSE, sCreditsText_KazukiYoshihara}; +static const struct CreditsEntry sCreditsEntry_RetsujiNomoto = {11, FALSE, sCreditsText_RetsujiNomoto}; +static const struct CreditsEntry sCreditsEntry_AzusaTajima = {11, FALSE, sCreditsText_AzusaTajima}; +static const struct CreditsEntry sCreditsEntry_ShusakuEgami = {11, FALSE, sCreditsText_ShusakuEgami}; +static const struct CreditsEntry sCreditsEntry_PackageAndManual = { 0, TRUE, sCreditsText_PackageAndManual}; +static const struct CreditsEntry sCreditsEntry_EnglishVersion = { 0, TRUE, sCreditsText_EnglishVersion}; +static const struct CreditsEntry sCreditsEntry_Translator = { 0, TRUE, sCreditsText_Translator}; +static const struct CreditsEntry sCreditsEntry_TextEditor = { 0, TRUE, sCreditsText_TextEditor}; +static const struct CreditsEntry sCreditsEntry_NCLCoordinator = { 0, TRUE, sCreditsText_NCLCoordinator}; +static const struct CreditsEntry sCreditsEntry_GraphicDesigner = { 0, TRUE, sCreditsText_GraphicDesigner}; +static const struct CreditsEntry sCreditsEntry_NOAProductTesting = { 0, TRUE, sCreditsText_NOAProductTesting}; +static const struct CreditsEntry sCreditsEntry_HideyukiNakajima = { 0, FALSE, sCreditsText_HideyukiNakajima}; +static const struct CreditsEntry sCreditsEntry_HidenoriSaeki = { 0, FALSE, sCreditsText_HidenoriSaeki}; +static const struct CreditsEntry sCreditsEntry_YokoWatanabe = { 0, FALSE, sCreditsText_YokoWatanabe}; +static const struct CreditsEntry sCreditsEntry_SakaeKimura = { 0, FALSE, sCreditsText_SakaeKimura}; +static const struct CreditsEntry sCreditsEntry_ChiakiShinkai = { 0, FALSE, sCreditsText_ChiakiShinkai}; +static const struct CreditsEntry sCreditsEntry_SethMcMahill = { 0, FALSE, sCreditsText_SethMcMahill}; +static const struct CreditsEntry sCreditsEntry_NobOgasawara = { 0, FALSE, sCreditsText_NobOgasawara}; +static const struct CreditsEntry sCreditsEntry_TeresaLillygren = { 0, FALSE, sCreditsText_TeresaLillygren}; +static const struct CreditsEntry sCreditsEntry_KimikoNakamichi = { 0, FALSE, sCreditsText_KimikoNakamichi}; +static const struct CreditsEntry sCreditsEntry_SouichiYamamoto = { 0, FALSE, sCreditsText_SouichiYamamoto}; +static const struct CreditsEntry sCreditsEntry_YuichiroIto = { 0, FALSE, sCreditsText_YuichiroIto}; +static const struct CreditsEntry sCreditsEntry_ThomasHertzog = { 0, FALSE, sCreditsText_ThomasHertzog}; +static const struct CreditsEntry sCreditsEntry_MikaKurosawa = { 0, FALSE, sCreditsText_MikaKurosawa}; +static const struct CreditsEntry sCreditsEntry_NationalFederationBlind = { 0, FALSE, sCreditsText_NationalFederationBlind}; +static const struct CreditsEntry sCreditsEntry_PatriciaAMaurer = { 0, FALSE, sCreditsText_PatriciaAMaurer}; +static const struct CreditsEntry sCreditsEntry_EuropeanBlindUnion = { 0, FALSE, sCreditsText_EuropeanBlindUnion}; +static const struct CreditsEntry sCreditsEntry_AustralianBrailleAuthority = { 0, FALSE, sCreditsText_AustralianBrailleAuthority}; +static const struct CreditsEntry sCreditsEntry_RoyalNewZealandFederationBlind = { 0, FALSE, sCreditsText_RoyalNewZealandFederationBlind}; +static const struct CreditsEntry sCreditsEntry_MotoyasuTojima = { 0, FALSE, sCreditsText_MotoyasuTojima}; +static const struct CreditsEntry sCreditsEntry_NicolaPrattBarlow = { 0, FALSE, sCreditsText_NicolaPrattBarlow}; +static const struct CreditsEntry sCreditsEntry_ShellieDow = { 0, FALSE, sCreditsText_ShellieDow}; +static const struct CreditsEntry sCreditsEntry_ErikJohnson = { 0, FALSE, sCreditsText_ErikJohnson}; -#define _ sCreditsEntry_EmptyString +#define _ &sCreditsEntry_EmptyString static const struct CreditsEntry *const sCreditsEntryPointerTable[PAGE_COUNT][ENTRIES_PER_PAGE] = { [PAGE_TITLE] = { _, - sCreditsEntry_PkmnEmeraldVersion, - sCreditsEntry_Credits, + &sCreditsEntry_PkmnEmeraldVersion, + &sCreditsEntry_Credits, _, _ }, [PAGE_DIRECTOR] = { _, - sCreditsEntry_Director, - sCreditsEntry_ShigekiMorimoto, + &sCreditsEntry_Director, + &sCreditsEntry_ShigekiMorimoto, _, _, }, [PAGE_ART_DIRECTOR] = { _, - sCreditsEntry_ArtDirector, - sCreditsEntry_KenSugimori, + &sCreditsEntry_ArtDirector, + &sCreditsEntry_KenSugimori, _, _, }, [PAGE_WORLD_DIRECTOR] = { _, - sCreditsEntry_WorldDirector, - sCreditsEntry_JunichiMasuda, + &sCreditsEntry_WorldDirector, + &sCreditsEntry_JunichiMasuda, _, _, }, [PAGE_LEAD_PROGRAMMER] = { - sCreditsEntry_LeadProgrammer, - sCreditsEntry_HisashiSogabe, - sCreditsEntry_LeadGraphicArtist, - sCreditsEntry_MotofumiFujiwara, + &sCreditsEntry_LeadProgrammer, + &sCreditsEntry_HisashiSogabe, + &sCreditsEntry_LeadGraphicArtist, + &sCreditsEntry_MotofumiFujiwara, _, }, [PAGE_PROGRAMMERS_1] = { - sCreditsEntry_Programmers, - sCreditsEntry_HisashiSogabe, - sCreditsEntry_TomomichiOhta, - sCreditsEntry_NozomuSaito, - sCreditsEntry_EmptyString, + &sCreditsEntry_Programmers, + &sCreditsEntry_HisashiSogabe, + &sCreditsEntry_TomomichiOhta, + &sCreditsEntry_NozomuSaito, + _, }, [PAGE_PROGRAMMERS_2] = { - sCreditsEntry_Programmers, - sCreditsEntry_AkitoMori, - sCreditsEntry_HiroyukiNakamura, - sCreditsEntry_MasaoTaya, + &sCreditsEntry_Programmers, + &sCreditsEntry_AkitoMori, + &sCreditsEntry_HiroyukiNakamura, + &sCreditsEntry_MasaoTaya, _, }, [PAGE_PROGRAMMERS_3] = { - sCreditsEntry_Programmers, - sCreditsEntry_SatoshiNohara, - sCreditsEntry_MiyukiIwasawa, - sCreditsEntry_YoshinoriMatsuda, - sCreditsEntry_KeitaKagaya, + &sCreditsEntry_Programmers, + &sCreditsEntry_SatoshiNohara, + &sCreditsEntry_MiyukiIwasawa, + &sCreditsEntry_YoshinoriMatsuda, + &sCreditsEntry_KeitaKagaya, }, [PAGE_PROGRAMMERS_4] = { - sCreditsEntry_Programmers, - sCreditsEntry_TetsuyaWatanabe, - sCreditsEntry_SosukeTamada, - sCreditsEntry_TakenoriOhta, + &sCreditsEntry_Programmers, + &sCreditsEntry_TetsuyaWatanabe, + &sCreditsEntry_SosukeTamada, + &sCreditsEntry_TakenoriOhta, _, }, [PAGE_GRAPHIC_DESIGNERS_1] = { _, - sCreditsEntry_GraphicDesigners, - sCreditsEntry_MotofumiFujiwara, - sCreditsEntry_SatoshiOhta, + &sCreditsEntry_GraphicDesigners, + &sCreditsEntry_MotofumiFujiwara, + &sCreditsEntry_SatoshiOhta, _, }, [PAGE_GRAPHIC_DESIGNERS_2] = { - sCreditsEntry_GraphicDesigners, - sCreditsEntry_KenkichiToyama, - sCreditsEntry_AsukaIwashita, - sCreditsEntry_TakaoUnno, + &sCreditsEntry_GraphicDesigners, + &sCreditsEntry_KenkichiToyama, + &sCreditsEntry_AsukaIwashita, + &sCreditsEntry_TakaoUnno, _, }, [PAGE_GRAPHIC_DESIGNERS_3] = { - sCreditsEntry_GraphicDesigners, - sCreditsEntry_KenSugimori, - sCreditsEntry_HironobuYoshida, - sCreditsEntry_AimiTomita, - sCreditsEntry_KanakoEo, + &sCreditsEntry_GraphicDesigners, + &sCreditsEntry_KenSugimori, + &sCreditsEntry_HironobuYoshida, + &sCreditsEntry_AimiTomita, + &sCreditsEntry_KanakoEo, }, [PAGE_MUSIC_COMPOSITION] = { - sCreditsEntry_MusicComposition, - sCreditsEntry_GoIchinose, - sCreditsEntry_JunichiMasuda, - sCreditsEntry_MorikazuAoki, - sCreditsEntry_HitomiSato, + &sCreditsEntry_MusicComposition, + &sCreditsEntry_GoIchinose, + &sCreditsEntry_JunichiMasuda, + &sCreditsEntry_MorikazuAoki, + &sCreditsEntry_HitomiSato, }, [PAGE_SOUND_EFFECTS] = { _, - sCreditsEntry_SoundEffectsAndPkmnVoices, - sCreditsEntry_GoIchinose, - sCreditsEntry_MorikazuAoki, + &sCreditsEntry_SoundEffectsAndPkmnVoices, + &sCreditsEntry_GoIchinose, + &sCreditsEntry_MorikazuAoki, _, }, [PAGE_GAME_DESIGNERS_1] = { - sCreditsEntry_GameDesigners, - sCreditsEntry_ShigekiMorimoto, - sCreditsEntry_TeruyukiShimoyamada, - sCreditsEntry_TakeshiKawachimaru, - sCreditsEntry_AkihitoTomisawa, + &sCreditsEntry_GameDesigners, + &sCreditsEntry_ShigekiMorimoto, + &sCreditsEntry_TeruyukiShimoyamada, + &sCreditsEntry_TakeshiKawachimaru, + &sCreditsEntry_AkihitoTomisawa, }, [PAGE_GAME_DESIGNERS_2] = { - sCreditsEntry_GameDesigners, - sCreditsEntry_SuguruNakatsui, - sCreditsEntry_TetsujiOhta, - sCreditsEntry_HitomiSato, - sCreditsEntry_KenjiMatsushima, + &sCreditsEntry_GameDesigners, + &sCreditsEntry_SuguruNakatsui, + &sCreditsEntry_TetsujiOhta, + &sCreditsEntry_HitomiSato, + &sCreditsEntry_KenjiMatsushima, }, [PAGE_GAME_DESIGNERS_3] = { - sCreditsEntry_GameDesigners, - sCreditsEntry_JunichiMasuda, - sCreditsEntry_KojiNishino, - sCreditsEntry_ShigeruOhmori, - sCreditsEntry_TadashiTakahashi, + &sCreditsEntry_GameDesigners, + &sCreditsEntry_JunichiMasuda, + &sCreditsEntry_KojiNishino, + &sCreditsEntry_ShigeruOhmori, + &sCreditsEntry_TadashiTakahashi, }, [PAGE_SCENARIO_PLOT] = { - sCreditsEntry_ScenarioPlot, - sCreditsEntry_AkihitoTomisawa, - sCreditsEntry_JunichiMasuda, - sCreditsEntry_KojiNishino, + &sCreditsEntry_ScenarioPlot, + &sCreditsEntry_AkihitoTomisawa, + &sCreditsEntry_JunichiMasuda, + &sCreditsEntry_KojiNishino, _, }, [PAGE_SCENARIO] = { - sCreditsEntry_Scenario, - sCreditsEntry_AkihitoTomisawa, - sCreditsEntry_HitomiSato, - sCreditsEntry_ToshinobuMatsumiya, + &sCreditsEntry_Scenario, + &sCreditsEntry_AkihitoTomisawa, + &sCreditsEntry_HitomiSato, + &sCreditsEntry_ToshinobuMatsumiya, _, }, [PAGE_SCRIPT_DESIGNERS] = { - sCreditsEntry_ScriptDesigners, - sCreditsEntry_TomomichiOhta, - sCreditsEntry_SatoshiNohara, + &sCreditsEntry_ScriptDesigners, + &sCreditsEntry_TomomichiOhta, + &sCreditsEntry_SatoshiNohara, _, _, }, [PAGE_MAP_DESIGNERS] = { - sCreditsEntry_MapDesigners, - sCreditsEntry_SuguruNakatsui, - sCreditsEntry_TeruyukiShimoyamada, - sCreditsEntry_ShigeruOhmori, - sCreditsEntry_TetsujiOhta, + &sCreditsEntry_MapDesigners, + &sCreditsEntry_SuguruNakatsui, + &sCreditsEntry_TeruyukiShimoyamada, + &sCreditsEntry_ShigeruOhmori, + &sCreditsEntry_TetsujiOhta, }, [PAGE_BATTLE_FRONTIER_DATA] = { _, - sCreditsEntry_BattleFrontierData, - sCreditsEntry_TetsujiOhta, + &sCreditsEntry_BattleFrontierData, + &sCreditsEntry_TetsujiOhta, _, _, }, [PAGE_PARAMETRIC_DESIGNERS] = { - sCreditsEntry_ParametricDesigners, - sCreditsEntry_TeruyukiShimoyamada, - sCreditsEntry_ShigekiMorimoto, - sCreditsEntry_TetsujiOhta, - sCreditsEntry_KojiNishino, + &sCreditsEntry_ParametricDesigners, + &sCreditsEntry_TeruyukiShimoyamada, + &sCreditsEntry_ShigekiMorimoto, + &sCreditsEntry_TetsujiOhta, + &sCreditsEntry_KojiNishino, }, [PAGE_POKEDEX_TEXT] = { _, - sCreditsEntry_PokedexText, - sCreditsEntry_KenjiMatsushima, + &sCreditsEntry_PokedexText, + &sCreditsEntry_KenjiMatsushima, _, _, }, [PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_1] = { - sCreditsEntry_EnvAndToolPgrms, - sCreditsEntry_HisashiSogabe, - sCreditsEntry_SosukeTamada, - sCreditsEntry_HiroyukiNakamura, - sCreditsEntry_AkitoMori, + &sCreditsEntry_EnvAndToolPgrms, + &sCreditsEntry_HisashiSogabe, + &sCreditsEntry_SosukeTamada, + &sCreditsEntry_HiroyukiNakamura, + &sCreditsEntry_AkitoMori, }, [PAGE_PKMN_DESIGNERS_1] = { - sCreditsEntry_PkmnDesigners, - sCreditsEntry_KenSugimori, - sCreditsEntry_MotofumiFujiwara, - sCreditsEntry_ShigekiMorimoto, + &sCreditsEntry_PkmnDesigners, + &sCreditsEntry_KenSugimori, + &sCreditsEntry_MotofumiFujiwara, + &sCreditsEntry_ShigekiMorimoto, _, }, [PAGE_PKMN_DESIGNERS_2] = { - sCreditsEntry_PkmnDesigners, - sCreditsEntry_HironobuYoshida, - sCreditsEntry_SatoshiOhta, - sCreditsEntry_AsukaIwashita, + &sCreditsEntry_PkmnDesigners, + &sCreditsEntry_HironobuYoshida, + &sCreditsEntry_SatoshiOhta, + &sCreditsEntry_AsukaIwashita, _, }, [PAGE_PKMN_DESIGNERS_3] = { - sCreditsEntry_PkmnDesigners, - sCreditsEntry_TakaoUnno, - sCreditsEntry_KanakoEo, - sCreditsEntry_AimiTomita, + &sCreditsEntry_PkmnDesigners, + &sCreditsEntry_TakaoUnno, + &sCreditsEntry_KanakoEo, + &sCreditsEntry_AimiTomita, _, }, [PAGE_PKMN_DESIGNERS_4] = { - sCreditsEntry_PkmnDesigners, - sCreditsEntry_AtsukoNishida, - sCreditsEntry_MuneoSaito, - sCreditsEntry_RenaYoshikawa, - sCreditsEntry_JunOkutani, + &sCreditsEntry_PkmnDesigners, + &sCreditsEntry_AtsukoNishida, + &sCreditsEntry_MuneoSaito, + &sCreditsEntry_RenaYoshikawa, + &sCreditsEntry_JunOkutani, }, [PAGE_SUPPORT_PROGRAMMERS] = { _, - sCreditsEntry_SupportProgrammers, - sCreditsEntry_SatoshiMitsuhara, - sCreditsEntry_DaisukeHoshino, + &sCreditsEntry_SupportProgrammers, + &sCreditsEntry_SatoshiMitsuhara, + &sCreditsEntry_DaisukeHoshino, _, }, [PAGE_NCL_PRODUCT_TESTING] = { _, - sCreditsEntry_NCLProductTesting, - sCreditsEntry_NCLSuperMarioClub, + &sCreditsEntry_NCLProductTesting, + &sCreditsEntry_NCLSuperMarioClub, _, _, }, [PAGE_PACKAGE_AND_MANUAL] = { _, - sCreditsEntry_PackageAndManual, - sCreditsEntry_KenSugimori, + &sCreditsEntry_PackageAndManual, + &sCreditsEntry_KenSugimori, _, _, }, [PAGE_SPECIAL_THANKS_1] = { _, - sCreditsEntry_SpecialThanks, - sCreditsEntry_KenjiTominaga, - sCreditsEntry_HirokiEnomoto, + &sCreditsEntry_SpecialThanks, + &sCreditsEntry_KenjiTominaga, + &sCreditsEntry_HirokiEnomoto, _, }, [PAGE_SPECIAL_THANKS_2] = { - sCreditsEntry_SpecialThanks, - sCreditsEntry_KazuyaSuyama, - sCreditsEntry_KenjiroIto, - sCreditsEntry_MichikoTakizawa, - sCreditsEntry_MakikoTakada, + &sCreditsEntry_SpecialThanks, + &sCreditsEntry_KazuyaSuyama, + &sCreditsEntry_KenjiroIto, + &sCreditsEntry_MichikoTakizawa, + &sCreditsEntry_MakikoTakada, }, [PAGE_SPECIAL_THANKS_3] = { - sCreditsEntry_SpecialThanks, - sCreditsEntry_MikikoOhhashi, - sCreditsEntry_TakanaoKondo, - sCreditsEntry_RuiKawaguchi, + &sCreditsEntry_SpecialThanks, + &sCreditsEntry_MikikoOhhashi, + &sCreditsEntry_TakanaoKondo, + &sCreditsEntry_RuiKawaguchi, _, }, [PAGE_SPECIAL_THANKS_4] = { - sCreditsEntry_SpecialThanks, - sCreditsEntry_TakahiroOhnishi, - sCreditsEntry_NorihideOkamura, - sCreditsEntry_ShunsukeKohori, + &sCreditsEntry_SpecialThanks, + &sCreditsEntry_TakahiroOhnishi, + &sCreditsEntry_NorihideOkamura, + &sCreditsEntry_ShunsukeKohori, _, }, [PAGE_INFORMATION_SUPERVISORS] = { - sCreditsEntry_InfoSupervisors, - sCreditsEntry_KazuyukiTerada, - sCreditsEntry_YuriSakurai, - sCreditsEntry_YumiFunasaka, - sCreditsEntry_NaokoYanase, + &sCreditsEntry_InfoSupervisors, + &sCreditsEntry_KazuyukiTerada, + &sCreditsEntry_YuriSakurai, + &sCreditsEntry_YumiFunasaka, + &sCreditsEntry_NaokoYanase, }, [PAGE_ARTWORK_1] = { _, - sCreditsEntry_Artwork, - sCreditsEntry_SachikoNakamichi, - sCreditsEntry_FujikoNomura, + &sCreditsEntry_Artwork, + &sCreditsEntry_SachikoNakamichi, + &sCreditsEntry_FujikoNomura, _, }, [PAGE_ARTWORK_2] = { _, - sCreditsEntry_Artwork, - sCreditsEntry_HideyukiNakajima, - sCreditsEntry_HidenoriSaeki, + &sCreditsEntry_Artwork, + &sCreditsEntry_HideyukiNakajima, + &sCreditsEntry_HidenoriSaeki, _, }, [PAGE_ARTWORK_3] = { - sCreditsEntry_Artwork, - sCreditsEntry_YokoWatanabe, - sCreditsEntry_SakaeKimura, - sCreditsEntry_ChiakiShinkai, + &sCreditsEntry_Artwork, + &sCreditsEntry_YokoWatanabe, + &sCreditsEntry_SakaeKimura, + &sCreditsEntry_ChiakiShinkai, _, }, [PAGE_COORDINATORS] = { - sCreditsEntry_Coordinators, - sCreditsEntry_KazukiYoshihara, - sCreditsEntry_AkiraKinashi, - sCreditsEntry_RetsujiNomoto, + &sCreditsEntry_Coordinators, + &sCreditsEntry_KazukiYoshihara, + &sCreditsEntry_AkiraKinashi, + &sCreditsEntry_RetsujiNomoto, _, }, [PAGE_ENGLISH_VERSION] = { _, - sCreditsEntry_EnglishVersion, - sCreditsEntry_HiroNakamura, - sCreditsEntry_SethMcMahill, + &sCreditsEntry_EnglishVersion, + &sCreditsEntry_HiroNakamura, + &sCreditsEntry_SethMcMahill, _, }, [PAGE_TRANSLATOR] = { _, - sCreditsEntry_Translator, - sCreditsEntry_NobOgasawara, + &sCreditsEntry_Translator, + &sCreditsEntry_NobOgasawara, _, _, }, [PAGE_TEXT_EDITOR] = { _, - sCreditsEntry_TextEditor, - sCreditsEntry_TeresaLillygren, + &sCreditsEntry_TextEditor, + &sCreditsEntry_TeresaLillygren, _, _, }, [PAGE_NCL_COORDINATOR] = { _, - sCreditsEntry_NCLCoordinator, - sCreditsEntry_KimikoNakamichi, + &sCreditsEntry_NCLCoordinator, + &sCreditsEntry_KimikoNakamichi, _, _, }, [PAGE_PROGRAMMERS_5] = { - sCreditsEntry_Programmers, - sCreditsEntry_TerukiMurakawa, - sCreditsEntry_SouichiYamamoto, - sCreditsEntry_YuichiroIto, - sCreditsEntry_AkiraKinashi, + &sCreditsEntry_Programmers, + &sCreditsEntry_TerukiMurakawa, + &sCreditsEntry_SouichiYamamoto, + &sCreditsEntry_YuichiroIto, + &sCreditsEntry_AkiraKinashi, }, [PAGE_GRAPHIC_DESIGNER] = { _, - sCreditsEntry_GraphicDesigner, - sCreditsEntry_AkiraKinashi, + &sCreditsEntry_GraphicDesigner, + &sCreditsEntry_AkiraKinashi, _, _, }, [PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_2] = { - sCreditsEntry_EnvAndToolPgrms, - sCreditsEntry_TerukiMurakawa, - sCreditsEntry_SouichiYamamoto, - sCreditsEntry_KimikoNakamichi, + &sCreditsEntry_EnvAndToolPgrms, + &sCreditsEntry_TerukiMurakawa, + &sCreditsEntry_SouichiYamamoto, + &sCreditsEntry_KimikoNakamichi, _, }, [PAGE_NOA_TESTING] = { - sCreditsEntry_NOAProductTesting, - sCreditsEntry_ThomasHertzog, - sCreditsEntry_ErikJohnson, - sCreditsEntry_MikaKurosawa, + &sCreditsEntry_NOAProductTesting, + &sCreditsEntry_ThomasHertzog, + &sCreditsEntry_ErikJohnson, + &sCreditsEntry_MikaKurosawa, _, }, [PAGE_BRAILLE_CODE_CHECK_1] = { - sCreditsEntry_BrailleCodeCheck, - sCreditsEntry_NationalFederationBlind, - sCreditsEntry_PatriciaAMaurer, - sCreditsEntry_JapanBrailleLibrary, - sCreditsEntry_EuropeanBlindUnion, + &sCreditsEntry_BrailleCodeCheck, + &sCreditsEntry_NationalFederationBlind, + &sCreditsEntry_PatriciaAMaurer, + &sCreditsEntry_JapanBrailleLibrary, + &sCreditsEntry_EuropeanBlindUnion, }, [PAGE_BRAILLE_CODE_CHECK_2] = { _, - sCreditsEntry_BrailleCodeCheck, - sCreditsEntry_AustralianBrailleAuthority, - sCreditsEntry_RoyalNewZealandFederationBlind, + &sCreditsEntry_BrailleCodeCheck, + &sCreditsEntry_AustralianBrailleAuthority, + &sCreditsEntry_RoyalNewZealandFederationBlind, _, }, [PAGE_SPECIAL_THANKS_5] = { - sCreditsEntry_SpecialThanks, - sCreditsEntry_HiroyukiUesugi, - sCreditsEntry_MotoyasuTojima, - sCreditsEntry_NicolaPrattBarlow, - sCreditsEntry_ShellieDow, + &sCreditsEntry_SpecialThanks, + &sCreditsEntry_HiroyukiUesugi, + &sCreditsEntry_MotoyasuTojima, + &sCreditsEntry_NicolaPrattBarlow, + &sCreditsEntry_ShellieDow, }, [PAGE_TASK_MANAGERS] = { _, - sCreditsEntry_TaskManagers, - sCreditsEntry_AzusaTajima, - sCreditsEntry_ShusakuEgami, + &sCreditsEntry_TaskManagers, + &sCreditsEntry_AzusaTajima, + &sCreditsEntry_ShusakuEgami, _, }, [PAGE_PRODUCERS] = { - sCreditsEntry_Producers, - sCreditsEntry_HiroyukiJinnai, - sCreditsEntry_HitoshiYamagami, - sCreditsEntry_GakujiNomoto, - sCreditsEntry_HiroakiTsuru, + &sCreditsEntry_Producers, + &sCreditsEntry_HiroyukiJinnai, + &sCreditsEntry_HitoshiYamagami, + &sCreditsEntry_GakujiNomoto, + &sCreditsEntry_HiroakiTsuru, }, [PAGE_EXECUTIVE_DIRECTOR] = { _, - sCreditsEntry_ExecutiveDirector, - sCreditsEntry_SatoshiTajiri, + &sCreditsEntry_ExecutiveDirector, + &sCreditsEntry_SatoshiTajiri, _, _, }, [PAGE_EXECUTIVE_PRODUCERS_1] = { _, - sCreditsEntry_ExecProducers, - sCreditsEntry_SatoruIwata, + &sCreditsEntry_ExecProducers, + &sCreditsEntry_SatoruIwata, _, _, }, [PAGE_EXECUTIVE_PRODUCERS_2] = { _, - sCreditsEntry_ExecProducers, - sCreditsEntry_TsunekazIshihara, + &sCreditsEntry_ExecProducers, + &sCreditsEntry_TsunekazIshihara, _, _, }, diff --git a/src/data/graphics/berry_fix.h b/src/data/graphics/berry_fix.h index 07e2cbf51c..0c26f7e92b 100644 --- a/src/data/graphics/berry_fix.h +++ b/src/data/graphics/berry_fix.h @@ -1,6 +1,6 @@ -const u16 gBerryFixGameboy_Pal[] = INCBIN_U16("graphics/berry_fix/gba_small.gbapal"); -const u32 gBerryFixGameboy_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_small.4bpp.lz"); -const u32 gBerryFixGameboy_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_small.bin.lz"); +const u16 gBerryFixGbaConnect_Pal[] = INCBIN_U16("graphics/berry_fix/gba_connect.gbapal"); +const u32 gBerryFixGbaConnect_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_connect.4bpp.lz"); +const u32 gBerryFixGbaConnect_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_connect.bin.lz"); const u16 gBerryFixGameboyLogo_Pal[] = INCBIN_U16("graphics/berry_fix/logo.gbapal"); const u32 gBerryFixGameboyLogo_Gfx[] = INCBIN_U32("graphics/berry_fix/logo.4bpp.lz"); diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index f69fafec84..fdd9fd87cc 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -845,12 +845,12 @@ const u32 gMonShinyPalette_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/shin const u8 gMonIcon_Starmie[] = INCBIN_U8("graphics/pokemon/starmie/icon.4bpp"); const u8 gMonFootprint_Starmie[] = INCBIN_U8("graphics/pokemon/starmie/footprint.1bpp"); -const u32 gMonStillFrontPic_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/front.4bpp.lz"); -const u32 gMonPalette_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/normal.gbapal.lz"); -const u32 gMonBackPic_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/back.4bpp.lz"); -const u32 gMonShinyPalette_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/shiny.gbapal.lz"); -const u8 gMonIcon_Mrmime[] = INCBIN_U8("graphics/pokemon/mr_mime/icon.4bpp"); -const u8 gMonFootprint_Mrmime[] = INCBIN_U8("graphics/pokemon/mr_mime/footprint.1bpp"); +const u32 gMonStillFrontPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/front.4bpp.lz"); +const u32 gMonPalette_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/normal.gbapal.lz"); +const u32 gMonBackPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/back.4bpp.lz"); +const u32 gMonShinyPalette_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/shiny.gbapal.lz"); +const u8 gMonIcon_MrMime[] = INCBIN_U8("graphics/pokemon/mr_mime/icon.4bpp"); +const u8 gMonFootprint_MrMime[] = INCBIN_U8("graphics/pokemon/mr_mime/footprint.1bpp"); const u32 gMonStillFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/front.4bpp.lz"); const u32 gMonPalette_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/normal.gbapal.lz"); diff --git a/src/data/items.h b/src/data/items.h index 072ec1bf5e..27326e07f9 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -3513,10 +3513,10 @@ const struct Item gItems[] = // TMs/HMs - [ITEM_TM01_FOCUS_PUNCH] = + [ITEM_TM_FOCUS_PUNCH] = { .name = _("TM01"), - .itemId = ITEM_TM01_FOCUS_PUNCH, + .itemId = ITEM_TM01, .price = 3000, .description = sTM01Desc, .pocket = POCKET_TM_HM, @@ -3524,10 +3524,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM02_DRAGON_CLAW] = + [ITEM_TM_DRAGON_CLAW] = { .name = _("TM02"), - .itemId = ITEM_TM02_DRAGON_CLAW, + .itemId = ITEM_TM02, .price = 3000, .description = sTM02Desc, .pocket = POCKET_TM_HM, @@ -3535,10 +3535,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM03_WATER_PULSE] = + [ITEM_TM_WATER_PULSE] = { .name = _("TM03"), - .itemId = ITEM_TM03_WATER_PULSE, + .itemId = ITEM_TM03, .price = 3000, .description = sTM03Desc, .pocket = POCKET_TM_HM, @@ -3546,10 +3546,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM04_CALM_MIND] = + [ITEM_TM_CALM_MIND] = { .name = _("TM04"), - .itemId = ITEM_TM04_CALM_MIND, + .itemId = ITEM_TM04, .price = 3000, .description = sTM04Desc, .pocket = POCKET_TM_HM, @@ -3557,10 +3557,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM05_ROAR] = + [ITEM_TM_ROAR] = { .name = _("TM05"), - .itemId = ITEM_TM05_ROAR, + .itemId = ITEM_TM05, .price = 1000, .description = sTM05Desc, .pocket = POCKET_TM_HM, @@ -3568,10 +3568,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM06_TOXIC] = + [ITEM_TM_TOXIC] = { .name = _("TM06"), - .itemId = ITEM_TM06_TOXIC, + .itemId = ITEM_TM06, .price = 3000, .description = sTM06Desc, .pocket = POCKET_TM_HM, @@ -3579,10 +3579,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM07_HAIL] = + [ITEM_TM_HAIL] = { .name = _("TM07"), - .itemId = ITEM_TM07_HAIL, + .itemId = ITEM_TM07, .price = 3000, .description = sTM07Desc, .pocket = POCKET_TM_HM, @@ -3590,10 +3590,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM08_BULK_UP] = + [ITEM_TM_BULK_UP] = { .name = _("TM08"), - .itemId = ITEM_TM08_BULK_UP, + .itemId = ITEM_TM08, .price = 3000, .description = sTM08Desc, .pocket = POCKET_TM_HM, @@ -3601,10 +3601,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM09_BULLET_SEED] = + [ITEM_TM_BULLET_SEED] = { .name = _("TM09"), - .itemId = ITEM_TM09_BULLET_SEED, + .itemId = ITEM_TM09, .price = 3000, .description = sTM09Desc, .pocket = POCKET_TM_HM, @@ -3612,10 +3612,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM10_HIDDEN_POWER] = + [ITEM_TM_HIDDEN_POWER] = { .name = _("TM10"), - .itemId = ITEM_TM10_HIDDEN_POWER, + .itemId = ITEM_TM10, .price = 3000, .description = sTM10Desc, .pocket = POCKET_TM_HM, @@ -3623,10 +3623,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM11_SUNNY_DAY] = + [ITEM_TM_SUNNY_DAY] = { .name = _("TM11"), - .itemId = ITEM_TM11_SUNNY_DAY, + .itemId = ITEM_TM11, .price = 2000, .description = sTM11Desc, .pocket = POCKET_TM_HM, @@ -3634,10 +3634,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM12_TAUNT] = + [ITEM_TM_TAUNT] = { .name = _("TM12"), - .itemId = ITEM_TM12_TAUNT, + .itemId = ITEM_TM12, .price = 3000, .description = sTM12Desc, .pocket = POCKET_TM_HM, @@ -3645,10 +3645,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM13_ICE_BEAM] = + [ITEM_TM_ICE_BEAM] = { .name = _("TM13"), - .itemId = ITEM_TM13_ICE_BEAM, + .itemId = ITEM_TM13, .price = 3000, .description = sTM13Desc, .pocket = POCKET_TM_HM, @@ -3656,10 +3656,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM14_BLIZZARD] = + [ITEM_TM_BLIZZARD] = { .name = _("TM14"), - .itemId = ITEM_TM14_BLIZZARD, + .itemId = ITEM_TM14, .price = 5500, .description = sTM14Desc, .pocket = POCKET_TM_HM, @@ -3667,10 +3667,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM15_HYPER_BEAM] = + [ITEM_TM_HYPER_BEAM] = { .name = _("TM15"), - .itemId = ITEM_TM15_HYPER_BEAM, + .itemId = ITEM_TM15, .price = 7500, .description = sTM15Desc, .pocket = POCKET_TM_HM, @@ -3678,10 +3678,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM16_LIGHT_SCREEN] = + [ITEM_TM_LIGHT_SCREEN] = { .name = _("TM16"), - .itemId = ITEM_TM16_LIGHT_SCREEN, + .itemId = ITEM_TM16, .price = 3000, .description = sTM16Desc, .pocket = POCKET_TM_HM, @@ -3689,10 +3689,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM17_PROTECT] = + [ITEM_TM_PROTECT] = { .name = _("TM17"), - .itemId = ITEM_TM17_PROTECT, + .itemId = ITEM_TM17, .price = 3000, .description = sTM17Desc, .pocket = POCKET_TM_HM, @@ -3700,10 +3700,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM18_RAIN_DANCE] = + [ITEM_TM_RAIN_DANCE] = { .name = _("TM18"), - .itemId = ITEM_TM18_RAIN_DANCE, + .itemId = ITEM_TM18, .price = 2000, .description = sTM18Desc, .pocket = POCKET_TM_HM, @@ -3711,10 +3711,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM19_GIGA_DRAIN] = + [ITEM_TM_GIGA_DRAIN] = { .name = _("TM19"), - .itemId = ITEM_TM19_GIGA_DRAIN, + .itemId = ITEM_TM19, .price = 3000, .description = sTM19Desc, .pocket = POCKET_TM_HM, @@ -3722,10 +3722,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM20_SAFEGUARD] = + [ITEM_TM_SAFEGUARD] = { .name = _("TM20"), - .itemId = ITEM_TM20_SAFEGUARD, + .itemId = ITEM_TM20, .price = 3000, .description = sTM20Desc, .pocket = POCKET_TM_HM, @@ -3733,10 +3733,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM21_FRUSTRATION] = + [ITEM_TM_FRUSTRATION] = { .name = _("TM21"), - .itemId = ITEM_TM21_FRUSTRATION, + .itemId = ITEM_TM21, .price = 1000, .description = sTM21Desc, .pocket = POCKET_TM_HM, @@ -3744,10 +3744,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM22_SOLAR_BEAM] = + [ITEM_TM_SOLAR_BEAM] = { .name = _("TM22"), - .itemId = ITEM_TM22_SOLAR_BEAM, + .itemId = ITEM_TM22, .price = 3000, .description = sTM22Desc, .pocket = POCKET_TM_HM, @@ -3755,10 +3755,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM23_IRON_TAIL] = + [ITEM_TM_IRON_TAIL] = { .name = _("TM23"), - .itemId = ITEM_TM23_IRON_TAIL, + .itemId = ITEM_TM23, .price = 3000, .description = sTM23Desc, .pocket = POCKET_TM_HM, @@ -3766,10 +3766,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM24_THUNDERBOLT] = + [ITEM_TM_THUNDERBOLT] = { .name = _("TM24"), - .itemId = ITEM_TM24_THUNDERBOLT, + .itemId = ITEM_TM24, .price = 3000, .description = sTM24Desc, .pocket = POCKET_TM_HM, @@ -3777,10 +3777,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM25_THUNDER] = + [ITEM_TM_THUNDER] = { .name = _("TM25"), - .itemId = ITEM_TM25_THUNDER, + .itemId = ITEM_TM25, .price = 5500, .description = sTM25Desc, .pocket = POCKET_TM_HM, @@ -3788,10 +3788,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM26_EARTHQUAKE] = + [ITEM_TM_EARTHQUAKE] = { .name = _("TM26"), - .itemId = ITEM_TM26_EARTHQUAKE, + .itemId = ITEM_TM26, .price = 3000, .description = sTM26Desc, .pocket = POCKET_TM_HM, @@ -3799,10 +3799,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM27_RETURN] = + [ITEM_TM_RETURN] = { .name = _("TM27"), - .itemId = ITEM_TM27_RETURN, + .itemId = ITEM_TM27, .price = 1000, .description = sTM27Desc, .pocket = POCKET_TM_HM, @@ -3810,10 +3810,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM28_DIG] = + [ITEM_TM_DIG] = { .name = _("TM28"), - .itemId = ITEM_TM28_DIG, + .itemId = ITEM_TM28, .price = 2000, .description = sTM28Desc, .pocket = POCKET_TM_HM, @@ -3821,10 +3821,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM29_PSYCHIC] = + [ITEM_TM_PSYCHIC] = { .name = _("TM29"), - .itemId = ITEM_TM29_PSYCHIC, + .itemId = ITEM_TM29, .price = 2000, .description = sTM29Desc, .pocket = POCKET_TM_HM, @@ -3832,10 +3832,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM30_SHADOW_BALL] = + [ITEM_TM_SHADOW_BALL] = { .name = _("TM30"), - .itemId = ITEM_TM30_SHADOW_BALL, + .itemId = ITEM_TM30, .price = 3000, .description = sTM30Desc, .pocket = POCKET_TM_HM, @@ -3843,10 +3843,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM31_BRICK_BREAK] = + [ITEM_TM_BRICK_BREAK] = { .name = _("TM31"), - .itemId = ITEM_TM31_BRICK_BREAK, + .itemId = ITEM_TM31, .price = 3000, .description = sTM31Desc, .pocket = POCKET_TM_HM, @@ -3854,10 +3854,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM32_DOUBLE_TEAM] = + [ITEM_TM_DOUBLE_TEAM] = { .name = _("TM32"), - .itemId = ITEM_TM32_DOUBLE_TEAM, + .itemId = ITEM_TM32, .price = 2000, .description = sTM32Desc, .pocket = POCKET_TM_HM, @@ -3865,10 +3865,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM33_REFLECT] = + [ITEM_TM_REFLECT] = { .name = _("TM33"), - .itemId = ITEM_TM33_REFLECT, + .itemId = ITEM_TM33, .price = 3000, .description = sTM33Desc, .pocket = POCKET_TM_HM, @@ -3876,10 +3876,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM34_SHOCK_WAVE] = + [ITEM_TM_SHOCK_WAVE] = { .name = _("TM34"), - .itemId = ITEM_TM34_SHOCK_WAVE, + .itemId = ITEM_TM34, .price = 3000, .description = sTM34Desc, .pocket = POCKET_TM_HM, @@ -3887,10 +3887,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM35_FLAMETHROWER] = + [ITEM_TM_FLAMETHROWER] = { .name = _("TM35"), - .itemId = ITEM_TM35_FLAMETHROWER, + .itemId = ITEM_TM35, .price = 3000, .description = sTM35Desc, .pocket = POCKET_TM_HM, @@ -3898,10 +3898,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM36_SLUDGE_BOMB] = + [ITEM_TM_SLUDGE_BOMB] = { .name = _("TM36"), - .itemId = ITEM_TM36_SLUDGE_BOMB, + .itemId = ITEM_TM36, .price = 1000, .description = sTM36Desc, .pocket = POCKET_TM_HM, @@ -3909,10 +3909,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM37_SANDSTORM] = + [ITEM_TM_SANDSTORM] = { .name = _("TM37"), - .itemId = ITEM_TM37_SANDSTORM, + .itemId = ITEM_TM37, .price = 2000, .description = sTM37Desc, .pocket = POCKET_TM_HM, @@ -3920,10 +3920,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM38_FIRE_BLAST] = + [ITEM_TM_FIRE_BLAST] = { .name = _("TM38"), - .itemId = ITEM_TM38_FIRE_BLAST, + .itemId = ITEM_TM38, .price = 5500, .description = sTM38Desc, .pocket = POCKET_TM_HM, @@ -3931,10 +3931,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM39_ROCK_TOMB] = + [ITEM_TM_ROCK_TOMB] = { .name = _("TM39"), - .itemId = ITEM_TM39_ROCK_TOMB, + .itemId = ITEM_TM39, .price = 3000, .description = sTM39Desc, .pocket = POCKET_TM_HM, @@ -3942,10 +3942,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM40_AERIAL_ACE] = + [ITEM_TM_AERIAL_ACE] = { .name = _("TM40"), - .itemId = ITEM_TM40_AERIAL_ACE, + .itemId = ITEM_TM40, .price = 3000, .description = sTM40Desc, .pocket = POCKET_TM_HM, @@ -3953,10 +3953,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM41_TORMENT] = + [ITEM_TM_TORMENT] = { .name = _("TM41"), - .itemId = ITEM_TM41_TORMENT, + .itemId = ITEM_TM41, .price = 3000, .description = sTM41Desc, .pocket = POCKET_TM_HM, @@ -3964,10 +3964,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM42_FACADE] = + [ITEM_TM_FACADE] = { .name = _("TM42"), - .itemId = ITEM_TM42_FACADE, + .itemId = ITEM_TM42, .price = 3000, .description = sTM42Desc, .pocket = POCKET_TM_HM, @@ -3975,10 +3975,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM43_SECRET_POWER] = + [ITEM_TM_SECRET_POWER] = { .name = _("TM43"), - .itemId = ITEM_TM43_SECRET_POWER, + .itemId = ITEM_TM43, .price = 3000, .description = sTM43Desc, .pocket = POCKET_TM_HM, @@ -3986,10 +3986,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM44_REST] = + [ITEM_TM_REST] = { .name = _("TM44"), - .itemId = ITEM_TM44_REST, + .itemId = ITEM_TM44, .price = 3000, .description = sTM44Desc, .pocket = POCKET_TM_HM, @@ -3997,10 +3997,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM45_ATTRACT] = + [ITEM_TM_ATTRACT] = { .name = _("TM45"), - .itemId = ITEM_TM45_ATTRACT, + .itemId = ITEM_TM45, .price = 3000, .description = sTM45Desc, .pocket = POCKET_TM_HM, @@ -4008,10 +4008,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM46_THIEF] = + [ITEM_TM_THIEF] = { .name = _("TM46"), - .itemId = ITEM_TM46_THIEF, + .itemId = ITEM_TM46, .price = 3000, .description = sTM46Desc, .pocket = POCKET_TM_HM, @@ -4019,10 +4019,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM47_STEEL_WING] = + [ITEM_TM_STEEL_WING] = { .name = _("TM47"), - .itemId = ITEM_TM47_STEEL_WING, + .itemId = ITEM_TM47, .price = 3000, .description = sTM47Desc, .pocket = POCKET_TM_HM, @@ -4030,10 +4030,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM48_SKILL_SWAP] = + [ITEM_TM_SKILL_SWAP] = { .name = _("TM48"), - .itemId = ITEM_TM48_SKILL_SWAP, + .itemId = ITEM_TM48, .price = 3000, .description = sTM48Desc, .pocket = POCKET_TM_HM, @@ -4041,10 +4041,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM49_SNATCH] = + [ITEM_TM_SNATCH] = { .name = _("TM49"), - .itemId = ITEM_TM49_SNATCH, + .itemId = ITEM_TM49, .price = 3000, .description = sTM49Desc, .pocket = POCKET_TM_HM, @@ -4052,10 +4052,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_TM50_OVERHEAT] = + [ITEM_TM_OVERHEAT] = { .name = _("TM50"), - .itemId = ITEM_TM50_OVERHEAT, + .itemId = ITEM_TM50, .price = 3000, .description = sTM50Desc, .pocket = POCKET_TM_HM, @@ -4063,10 +4063,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_HM01_CUT] = + [ITEM_HM_CUT] = { .name = _("HM01"), - .itemId = ITEM_HM01_CUT, + .itemId = ITEM_HM01, .price = 0, .description = sHM01Desc, .importance = 1, @@ -4075,10 +4075,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_HM02_FLY] = + [ITEM_HM_FLY] = { .name = _("HM02"), - .itemId = ITEM_HM02_FLY, + .itemId = ITEM_HM02, .price = 0, .description = sHM02Desc, .importance = 1, @@ -4087,10 +4087,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_HM03_SURF] = + [ITEM_HM_SURF] = { .name = _("HM03"), - .itemId = ITEM_HM03_SURF, + .itemId = ITEM_HM03, .price = 0, .description = sHM03Desc, .importance = 1, @@ -4099,10 +4099,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_HM04_STRENGTH] = + [ITEM_HM_STRENGTH] = { .name = _("HM04"), - .itemId = ITEM_HM04_STRENGTH, + .itemId = ITEM_HM04, .price = 0, .description = sHM04Desc, .importance = 1, @@ -4111,10 +4111,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_HM05_FLASH] = + [ITEM_HM_FLASH] = { .name = _("HM05"), - .itemId = ITEM_HM05_FLASH, + .itemId = ITEM_HM05, .price = 0, .description = sHM05Desc, .importance = 1, @@ -4123,10 +4123,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_HM06_ROCK_SMASH] = + [ITEM_HM_ROCK_SMASH] = { .name = _("HM06"), - .itemId = ITEM_HM06_ROCK_SMASH, + .itemId = ITEM_HM06, .price = 0, .description = sHM06Desc, .importance = 1, @@ -4135,10 +4135,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_HM07_WATERFALL] = + [ITEM_HM_WATERFALL] = { .name = _("HM07"), - .itemId = ITEM_HM07_WATERFALL, + .itemId = ITEM_HM07, .price = 0, .description = sHM07Desc, .importance = 1, @@ -4147,10 +4147,10 @@ const struct Item gItems[] = .fieldUseFunc = ItemUseOutOfBattle_TMHM, }, - [ITEM_HM08_DIVE] = + [ITEM_HM_DIVE] = { .name = _("HM08"), - .itemId = ITEM_HM08_DIVE, + .itemId = ITEM_HM08, .price = 0, .description = sHM08Desc, .importance = 1, diff --git a/src/data/lilycove_lady.h b/src/data/lilycove_lady.h index 4a3a7a7194..fdfb83478f 100644 --- a/src/data/lilycove_lady.h +++ b/src/data/lilycove_lady.h @@ -279,7 +279,7 @@ static const u16 sQuizLadyPrizes[] = ITEM_BELUE_BERRY, ITEM_DURIN_BERRY, ITEM_LUXURY_BALL, - ITEM_TM15_HYPER_BEAM, + ITEM_TM_HYPER_BEAM, ITEM_BIG_PEARL, ITEM_STAR_PIECE, ITEM_RARE_CANDY, diff --git a/src/data/party_menu.h b/src/data/party_menu.h index 420bea9eb3..555f91f793 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -64,7 +64,7 @@ static const struct PartyMenuBoxInfoRects sPartyBoxInfoRects[] = // Each layout array has an array for each of the 6 party slots // The array for each slot has the sprite coords of its various sprites in the following order -// Pokemon icon (x, y), held item (x, y), status condition (x, y), menu pokeball (x, y) +// Pokémon icon (x, y), held item (x, y), status condition (x, y), menu Poké Ball (x, y) static const u8 sPartyMenuSpriteCoords[PARTY_LAYOUT_COUNT][PARTY_SIZE][4 * 2] = { [PARTY_LAYOUT_SINGLE] = @@ -907,7 +907,7 @@ static const struct CompressedSpritePalette sSpritePalette_MenuPokeball = gPartyMenuPokeball_Pal, TAG_POKEBALL }; -// Used for the pokeball sprite on each party slot / Cancel button +// Used for the Poké Ball sprite on each party slot / Cancel button static const struct SpriteTemplate sSpriteTemplate_MenuPokeball = { .tileTag = TAG_POKEBALL, @@ -1122,64 +1122,17 @@ static const u8 *const sUnused_StatStrings[] = gText_Speed2 }; +/* Expands to: + * static const u16 sTMHMMoves[] = + * { + * MOVE_FOCUS_PUNCH, + * ... + * MOVE_CUT, + * ... + * }; */ +#define TMHM_MOVE(id) CAT(MOVE_, id), static const u16 sTMHMMoves[] = { - [ITEM_TM01 - ITEM_TM01] = MOVE_FOCUS_PUNCH, - [ITEM_TM02 - ITEM_TM01] = MOVE_DRAGON_CLAW, - [ITEM_TM03 - ITEM_TM01] = MOVE_WATER_PULSE, - [ITEM_TM04 - ITEM_TM01] = MOVE_CALM_MIND, - [ITEM_TM05 - ITEM_TM01] = MOVE_ROAR, - [ITEM_TM06 - ITEM_TM01] = MOVE_TOXIC, - [ITEM_TM07 - ITEM_TM01] = MOVE_HAIL, - [ITEM_TM08 - ITEM_TM01] = MOVE_BULK_UP, - [ITEM_TM09 - ITEM_TM01] = MOVE_BULLET_SEED, - [ITEM_TM10 - ITEM_TM01] = MOVE_HIDDEN_POWER, - [ITEM_TM11 - ITEM_TM01] = MOVE_SUNNY_DAY, - [ITEM_TM12 - ITEM_TM01] = MOVE_TAUNT, - [ITEM_TM13 - ITEM_TM01] = MOVE_ICE_BEAM, - [ITEM_TM14 - ITEM_TM01] = MOVE_BLIZZARD, - [ITEM_TM15 - ITEM_TM01] = MOVE_HYPER_BEAM, - [ITEM_TM16 - ITEM_TM01] = MOVE_LIGHT_SCREEN, - [ITEM_TM17 - ITEM_TM01] = MOVE_PROTECT, - [ITEM_TM18 - ITEM_TM01] = MOVE_RAIN_DANCE, - [ITEM_TM19 - ITEM_TM01] = MOVE_GIGA_DRAIN, - [ITEM_TM20 - ITEM_TM01] = MOVE_SAFEGUARD, - [ITEM_TM21 - ITEM_TM01] = MOVE_FRUSTRATION, - [ITEM_TM22 - ITEM_TM01] = MOVE_SOLAR_BEAM, - [ITEM_TM23 - ITEM_TM01] = MOVE_IRON_TAIL, - [ITEM_TM24 - ITEM_TM01] = MOVE_THUNDERBOLT, - [ITEM_TM25 - ITEM_TM01] = MOVE_THUNDER, - [ITEM_TM26 - ITEM_TM01] = MOVE_EARTHQUAKE, - [ITEM_TM27 - ITEM_TM01] = MOVE_RETURN, - [ITEM_TM28 - ITEM_TM01] = MOVE_DIG, - [ITEM_TM29 - ITEM_TM01] = MOVE_PSYCHIC, - [ITEM_TM30 - ITEM_TM01] = MOVE_SHADOW_BALL, - [ITEM_TM31 - ITEM_TM01] = MOVE_BRICK_BREAK, - [ITEM_TM32 - ITEM_TM01] = MOVE_DOUBLE_TEAM, - [ITEM_TM33 - ITEM_TM01] = MOVE_REFLECT, - [ITEM_TM34 - ITEM_TM01] = MOVE_SHOCK_WAVE, - [ITEM_TM35 - ITEM_TM01] = MOVE_FLAMETHROWER, - [ITEM_TM36 - ITEM_TM01] = MOVE_SLUDGE_BOMB, - [ITEM_TM37 - ITEM_TM01] = MOVE_SANDSTORM, - [ITEM_TM38 - ITEM_TM01] = MOVE_FIRE_BLAST, - [ITEM_TM39 - ITEM_TM01] = MOVE_ROCK_TOMB, - [ITEM_TM40 - ITEM_TM01] = MOVE_AERIAL_ACE, - [ITEM_TM41 - ITEM_TM01] = MOVE_TORMENT, - [ITEM_TM42 - ITEM_TM01] = MOVE_FACADE, - [ITEM_TM43 - ITEM_TM01] = MOVE_SECRET_POWER, - [ITEM_TM44 - ITEM_TM01] = MOVE_REST, - [ITEM_TM45 - ITEM_TM01] = MOVE_ATTRACT, - [ITEM_TM46 - ITEM_TM01] = MOVE_THIEF, - [ITEM_TM47 - ITEM_TM01] = MOVE_STEEL_WING, - [ITEM_TM48 - ITEM_TM01] = MOVE_SKILL_SWAP, - [ITEM_TM49 - ITEM_TM01] = MOVE_SNATCH, - [ITEM_TM50 - ITEM_TM01] = MOVE_OVERHEAT, - [ITEM_HM01 - ITEM_TM01] = MOVE_CUT, - [ITEM_HM02 - ITEM_TM01] = MOVE_FLY, - [ITEM_HM03 - ITEM_TM01] = MOVE_SURF, - [ITEM_HM04 - ITEM_TM01] = MOVE_STRENGTH, - [ITEM_HM05 - ITEM_TM01] = MOVE_FLASH, - [ITEM_HM06 - ITEM_TM01] = MOVE_ROCK_SMASH, - [ITEM_HM07 - ITEM_TM01] = MOVE_WATERFALL, - [ITEM_HM08 - ITEM_TM01] = MOVE_DIVE, + FOREACH_TMHM(TMHM_MOVE) }; +#undef TMHM_MOVE diff --git a/src/data/pointillism_points.h b/src/data/pointillism_points.h index 708f5c02e6..9d19d13140 100644 --- a/src/data/pointillism_points.h +++ b/src/data/pointillism_points.h @@ -2,7 +2,7 @@ #define GET_POINT_COLOR_TYPE(bits) (((bits) >> 1) & 3) #define GET_POINT_DELTA(bits) (((bits) >> 3) & 7) -#define PT(x, y, delta, colorType, offsetDownLeft) x, y, (delta << 3) | (colorType << 1) | offsetDownLeft +#define PT(x, y, delta, colorType, offsetDownLeft) {x, y, (delta << 3) | (colorType << 1) | offsetDownLeft} static const u8 sPointillismPoints[][3] = { PT( 0, 29, 3, 2, FALSE), diff --git a/src/data/pokemon/experience_tables.h b/src/data/pokemon/experience_tables.h index 15bcadeb29..8f50e10918 100644 --- a/src/data/pokemon/experience_tables.h +++ b/src/data/pokemon/experience_tables.h @@ -1,5 +1,5 @@ -#define SQUARE(n)(n * n) -#define CUBE(n)(n * n * n) +#define SQUARE(n)((n) * (n)) +#define CUBE(n)((n) * (n) * (n)) #define EXP_SLOW(n)((5 * CUBE(n)) / 4) // (5 * (n)^3) / 4 #define EXP_FAST(n)((4 * CUBE(n)) / 5) // (4 * (n)^3) / 5 diff --git a/src/data/pokemon/level_up_learnset_pointers.h b/src/data/pokemon/level_up_learnset_pointers.h index 5ac7b3bd74..661458ce38 100644 --- a/src/data/pokemon/level_up_learnset_pointers.h +++ b/src/data/pokemon/level_up_learnset_pointers.h @@ -122,7 +122,7 @@ const u16 *const gLevelUpLearnsets[NUM_SPECIES] = [SPECIES_SEAKING] = sSeakingLevelUpLearnset, [SPECIES_STARYU] = sStaryuLevelUpLearnset, [SPECIES_STARMIE] = sStarmieLevelUpLearnset, - [SPECIES_MR_MIME] = sMrmimeLevelUpLearnset, + [SPECIES_MR_MIME] = sMrMimeLevelUpLearnset, [SPECIES_SCYTHER] = sScytherLevelUpLearnset, [SPECIES_JYNX] = sJynxLevelUpLearnset, [SPECIES_ELECTABUZZ] = sElectabuzzLevelUpLearnset, diff --git a/src/data/pokemon/level_up_learnsets.h b/src/data/pokemon/level_up_learnsets.h index c78b9ef0a7..212b969a70 100644 --- a/src/data/pokemon/level_up_learnsets.h +++ b/src/data/pokemon/level_up_learnsets.h @@ -1681,7 +1681,7 @@ static const u16 sStarmieLevelUpLearnset[] = { LEVEL_UP_END }; -static const u16 sMrmimeLevelUpLearnset[] = { +static const u16 sMrMimeLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_BARRIER), LEVEL_UP_MOVE( 5, MOVE_CONFUSION), LEVEL_UP_MOVE( 9, MOVE_SUBSTITUTE), diff --git a/src/data/pokemon/pokedex_entries.h b/src/data/pokemon/pokedex_entries.h index 007c73248e..8a15a18567 100644 --- a/src/data/pokemon/pokedex_entries.h +++ b/src/data/pokemon/pokedex_entries.h @@ -1469,7 +1469,7 @@ const struct PokedexEntry gPokedexEntries[] = .categoryName = _("BARRIER"), .height = 13, .weight = 545, - .description = gMrmimePokedexText, + .description = gMrMimePokedexText, .pokemonScale = 258, .pokemonOffset = 6, .trainerScale = 256, diff --git a/src/data/pokemon/pokedex_orders.h b/src/data/pokemon/pokedex_orders.h index 55b0abcea8..aa09948ec0 100644 --- a/src/data/pokemon/pokedex_orders.h +++ b/src/data/pokemon/pokedex_orders.h @@ -25,7 +25,7 @@ const u16 gPokedexOrder_Alphabetical[] = NATIONAL_DEX_OLD_UNOWN_X, NATIONAL_DEX_OLD_UNOWN_Y, NATIONAL_DEX_OLD_UNOWN_Z, - // Actual pokemon start here. + // Actual Pokémon start here. NATIONAL_DEX_ABRA, NATIONAL_DEX_ABSOL, NATIONAL_DEX_AERODACTYL, diff --git a/src/data/pokemon/pokedex_text.h b/src/data/pokemon/pokedex_text.h index 0daf7fc86c..ec4a831f86 100644 --- a/src/data/pokemon/pokedex_text.h +++ b/src/data/pokemon/pokedex_text.h @@ -730,7 +730,7 @@ const u8 gStarmiePokedexText[] = _( "reflections of stars that twinkled on\n" "gentle waves at night."); -const u8 gMrmimePokedexText[] = _( +const u8 gMrMimePokedexText[] = _( "A MR. MIME is a master of pantomime. It can\n" "convince others that something unseeable\n" "actually exists. Once believed, the\n" diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 2ef0629b52..fbd3bcba2a 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -2,34 +2,34 @@ // 255 (MON_GENDERLESS) is reserved for genderless Pokémon. #define PERCENT_FEMALE(percent) min(254, ((percent * 255) / 100)) -#define OLD_UNOWN_SPECIES_INFO \ - { \ - .baseHP = 50, \ - .baseAttack = 150, \ - .baseDefense = 50, \ - .baseSpeed = 150, \ - .baseSpAttack = 150, \ - .baseSpDefense = 50, \ - .types = { TYPE_NORMAL, TYPE_NORMAL}, \ - .catchRate = 3, \ - .expYield = 1, \ - .evYield_HP = 2, \ - .evYield_Attack = 2, \ - .evYield_Defense = 2, \ - .evYield_Speed = 2, \ - .evYield_SpAttack = 2, \ - .evYield_SpDefense = 2, \ - .itemCommon = ITEM_NONE, \ - .itemRare = ITEM_NONE, \ - .genderRatio = MON_GENDERLESS, \ - .eggCycles = 120, \ - .friendship = 0, \ - .growthRate = GROWTH_MEDIUM_FAST, \ - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED, }, \ - .abilities = {ABILITY_NONE, ABILITY_NONE}, \ - .safariZoneFleeRate = 0, \ - .bodyColor = BODY_COLOR_BLACK, \ - .noFlip = FALSE, \ +#define OLD_UNOWN_SPECIES_INFO \ + { \ + .baseHP = 50, \ + .baseAttack = 150, \ + .baseDefense = 50, \ + .baseSpeed = 150, \ + .baseSpAttack = 150, \ + .baseSpDefense = 50, \ + .types = { TYPE_NORMAL, TYPE_NORMAL}, \ + .catchRate = 3, \ + .expYield = 1, \ + .evYield_HP = 2, \ + .evYield_Attack = 2, \ + .evYield_Defense = 2, \ + .evYield_Speed = 2, \ + .evYield_SpAttack = 2, \ + .evYield_SpDefense = 2, \ + .itemCommon = ITEM_NONE, \ + .itemRare = ITEM_NONE, \ + .genderRatio = MON_GENDERLESS, \ + .eggCycles = 120, \ + .friendship = 0, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED, }, \ + .abilities = {ABILITY_NONE, ABILITY_NONE}, \ + .safariZoneFleeRate = 0, \ + .bodyColor = BODY_COLOR_BLACK, \ + .noFlip = FALSE, \ } const struct SpeciesInfo gSpeciesInfo[] = @@ -929,7 +929,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_POISON_POINT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, @@ -959,7 +959,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_POISON_POINT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, @@ -4349,7 +4349,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, @@ -4379,7 +4379,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, @@ -4409,7 +4409,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, @@ -4529,7 +4529,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, @@ -4559,7 +4559,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 100, .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_SYNCHRONIZE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, @@ -5189,7 +5189,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 10, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_STATIC, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, @@ -5219,7 +5219,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 10, .friendship = 140, .growthRate = GROWTH_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, @@ -5249,7 +5249,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 10, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_CUTE_CHARM, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, @@ -5279,7 +5279,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 10, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_HUSTLE, ABILITY_SERENE_GRACE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, @@ -6059,7 +6059,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 40, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLACK, @@ -7109,7 +7109,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 25, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_GUTS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PURPLE, @@ -7169,7 +7169,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 25, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_OBLIVIOUS, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_PINK, @@ -7199,7 +7199,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 25, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_STATIC, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, @@ -7229,7 +7229,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 25, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_FLAME_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, @@ -7319,7 +7319,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, @@ -7349,7 +7349,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, @@ -7379,7 +7379,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, @@ -7499,7 +7499,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_WHITE, @@ -7529,7 +7529,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, @@ -7559,7 +7559,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 100, .growthRate = GROWTH_MEDIUM_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_NATURAL_CURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, @@ -9829,7 +9829,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 10, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_THICK_FAT, ABILITY_HUGE_POWER}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, @@ -10129,7 +10129,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_SHADOW_TAG, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, @@ -11359,7 +11359,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, @@ -11389,7 +11389,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, @@ -11419,7 +11419,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 80, .friendship = 35, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_CLEAR_BODY, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, @@ -11449,7 +11449,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_DRIZZLE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, @@ -11479,7 +11479,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_DROUGHT, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, @@ -11509,7 +11509,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_AIR_LOCK, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GREEN, @@ -11539,7 +11539,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 90, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, @@ -11569,7 +11569,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 90, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_LEVITATE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BLUE, @@ -11599,7 +11599,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 100, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_SERENE_GRACE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, @@ -11629,7 +11629,7 @@ const struct SpeciesInfo gSpeciesInfo[] = .eggCycles = 120, .friendship = 0, .growthRate = GROWTH_SLOW, - .eggGroups = { EGG_GROUP_UNDISCOVERED, EGG_GROUP_UNDISCOVERED }, + .eggGroups = { EGG_GROUP_NO_EGGS_DISCOVERED, EGG_GROUP_NO_EGGS_DISCOVERED }, .abilities = {ABILITY_PRESSURE, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_RED, diff --git a/src/data/pokemon/tmhm_learnsets.h b/src/data/pokemon/tmhm_learnsets.h index cb42d7c6fc..4357cdd1a3 100644 --- a/src/data/pokemon/tmhm_learnsets.h +++ b/src/data/pokemon/tmhm_learnsets.h @@ -1,9388 +1,10183 @@ -#define TMHM_LEARNSET(moves) {(u32)(moves), ((u64)(moves) >> 32)} -#define TMHM(tmhm) ((u64)1 << (ITEM_##tmhm - ITEM_TM01_FOCUS_PUNCH)) - -// This table determines which TMs and HMs a species is capable of learning. -// Each entry is a 64-bit bit array spread across two 32-bit values, with -// each bit corresponding to a TM or HM. -const u32 gTMHMLearnsets[][2] = +/* Expands to: + * struct TMHMLearnset + * { + * u32 FOCUS_PUNCH:1; + * ... + * u32 CUT:1; + * ... + * }; */ +#define TMHM_LEARN(id) u32 id:1; +struct TMHMLearnset { - [SPECIES_NONE] = TMHM_LEARNSET(0), - - [SPECIES_BULBASAUR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_IVYSAUR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_VENUSAUR] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CHARMANDER] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM02_DRAGON_CLAW) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CHARMELEON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM02_DRAGON_CLAW) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CHARIZARD] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM02_DRAGON_CLAW) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM47_STEEL_WING) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT) - | TMHM(HM02_FLY) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SQUIRTLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_WARTORTLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_BLASTOISE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_CATERPIE] = TMHM_LEARNSET(0), - - [SPECIES_METAPOD] = TMHM_LEARNSET(0), - - [SPECIES_BUTTERFREE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM05_FLASH)), - - [SPECIES_WEEDLE] = TMHM_LEARNSET(0), - - [SPECIES_KAKUNA] = TMHM_LEARNSET(0), - - [SPECIES_BEEDRILL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_PIDGEY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_PIDGEOTTO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_PIDGEOT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_RATTATA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_RATICATE] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SPEAROW] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_FEAROW] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_EKANS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH)), - - [SPECIES_ARBOK] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH)), - - [SPECIES_PIKACHU] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_RAICHU] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SANDSHREW] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SANDSLASH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_NIDORAN_F] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_NIDORINA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_NIDOQUEEN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_NIDORAN_M] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_NIDORINO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_NIDOKING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CLEFAIRY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH)), - - [SPECIES_CLEFABLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH)), - - [SPECIES_VULPIX] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT)), - - [SPECIES_NINETALES] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT)), - - [SPECIES_JIGGLYPUFF] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH)), - - [SPECIES_WIGGLYTUFF] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH)), - - [SPECIES_ZUBAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(TM49_SNATCH)), - - [SPECIES_GOLBAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(TM49_SNATCH)), - - [SPECIES_ODDISH] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_GLOOM] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_VILEPLUME] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_PARAS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_PARASECT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_VENONAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM05_FLASH)), - - [SPECIES_VENOMOTH] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM05_FLASH)), - - [SPECIES_DIGLETT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_DUGTRIO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MEOWTH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_PERSIAN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_PSYDUCK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_GOLDUCK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_MANKEY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_PRIMEAPE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_GROWLITHE] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_ARCANINE] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_POLIWAG] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_POLIWHIRL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_POLIWRATH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_ABRA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_KADABRA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_ALAKAZAM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_MACHOP] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MACHOKE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MACHAMP] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_BELLSPROUT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_WEEPINBELL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_VICTREEBEL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_TENTACOOL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_TENTACRUEL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_GEODUDE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_GRAVELER] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_GOLEM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_PONYTA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH)), - - [SPECIES_RAPIDASH] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH)), - - [SPECIES_SLOWPOKE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM08_DIVE)), - - [SPECIES_SLOWBRO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM08_DIVE)), - - [SPECIES_MAGNEMITE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM05_FLASH)), - - [SPECIES_MAGNETON] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM05_FLASH)), - - [SPECIES_FARFETCHD] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM01_CUT) - | TMHM(HM02_FLY)), - - [SPECIES_DODUO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_DODRIO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_SEEL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_DEWGONG] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_GRIMER] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF)), - - [SPECIES_MUK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SHELLDER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM08_DIVE)), - - [SPECIES_CLOYSTER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM08_DIVE)), - - [SPECIES_GASTLY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH)), - - [SPECIES_HAUNTER] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH)), - - [SPECIES_GENGAR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_ONIX] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_DROWZEE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_HYPNO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_KRABBY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM08_DIVE)), - - [SPECIES_KINGLER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM08_DIVE)), - - [SPECIES_VOLTORB] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM12_TAUNT) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_ELECTRODE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_EXEGGCUTE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH)), - - [SPECIES_EXEGGUTOR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH)), - - [SPECIES_CUBONE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MAROWAK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_HITMONLEE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_HITMONCHAN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_LICKITUNG] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_KOFFING] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_WEEZING] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_RHYHORN] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_RHYDON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CHANSEY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_TANGELA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_KANGASKHAN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_HORSEA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SEADRA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_GOLDEEN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SEAKING] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_STARYU] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM03_SURF) - | TMHM(HM05_FLASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_STARMIE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM03_SURF) - | TMHM(HM05_FLASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_MR_MIME] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_SCYTHER] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM01_CUT) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_JYNX] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM05_FLASH)), - - [SPECIES_ELECTABUZZ] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MAGMAR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_PINSIR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_TAUROS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MAGIKARP] = TMHM_LEARNSET(0), - - [SPECIES_GYARADOS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_LAPRAS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_DITTO] = TMHM_LEARNSET(0), - - [SPECIES_EEVEE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT)), - - [SPECIES_VAPOREON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_JOLTEON] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_FLAREON] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT)), - - [SPECIES_PORYGON] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_OMANYTE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_OMASTAR] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_KABUTO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL)), - - [SPECIES_KABUTOPS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_AERODACTYL] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SNORLAX] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH)), - - [SPECIES_ARTICUNO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_ZAPDOS] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MOLTRES] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM47_STEEL_WING) - | TMHM(TM50_OVERHEAT) - | TMHM(HM02_FLY) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_DRATINI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL)), - - [SPECIES_DRAGONAIR] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL)), - - [SPECIES_DRAGONITE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM02_DRAGON_CLAW) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM47_STEEL_WING) - | TMHM(HM01_CUT) - | TMHM(HM02_FLY) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_MEWTWO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MEW] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM02_DRAGON_CLAW) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM08_BULK_UP) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT) - | TMHM(HM02_FLY) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_CHIKORITA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_BAYLEEF] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MEGANIUM] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CYNDAQUIL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT)), - - [SPECIES_QUILAVA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_TYPHLOSION] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_TOTODILE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_CROCONAW] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_FERALIGATR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM02_DRAGON_CLAW) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SENTRET] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF)), - - [SPECIES_FURRET] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_HOOTHOOT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY) - | TMHM(HM05_FLASH)), - - [SPECIES_NOCTOWL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY) - | TMHM(HM05_FLASH)), - - [SPECIES_LEDYBA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_LEDIAN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_SPINARAK] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_ARIADOS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_CROBAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(TM49_SNATCH) - | TMHM(HM02_FLY)), - - [SPECIES_CHINCHOU] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM05_FLASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_LANTURN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM05_FLASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_PICHU] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_CLEFFA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_IGGLYBUFF] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_TOGEPI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_TOGETIC] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_NATU] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM05_FLASH)), - - [SPECIES_XATU] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM02_FLY) - | TMHM(HM05_FLASH)), - - [SPECIES_MAREEP] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_FLAAFFY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_AMPHAROS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_BELLOSSOM] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_MARILL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_AZUMARILL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SUDOWOODO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_POLITOED] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_HOPPIP] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_SKIPLOOM] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_JUMPLUFF] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_AIPOM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SUNKERN] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_SUNFLORA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_YANMA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM05_FLASH)), - - [SPECIES_WOOPER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_QUAGSIRE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_ESPEON] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_UMBREON] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM49_SNATCH) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_MURKROW] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(TM49_SNATCH) - | TMHM(HM02_FLY)), - - [SPECIES_SLOWKING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM08_DIVE)), - - [SPECIES_MISDREAVUS] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_UNOWN] = TMHM_LEARNSET(0), - - [SPECIES_WOBBUFFET] = TMHM_LEARNSET(0), - - [SPECIES_GIRAFARIG] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_PINECO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM37_SANDSTORM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_FORRETRESS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM37_SANDSTORM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_DUNSPARCE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_GLIGAR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_STEELIX] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SNUBBULL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_GRANBULL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_QWILFISH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SCIZOR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SHUCKLE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_HERACROSS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SNEASEL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_TEDDIURSA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_URSARING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SLUGMA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MAGCARGO] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SWINUB] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_PILOSWINE] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CORSOLA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_REMORAID] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_OCTILLERY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_DELIBIRD] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM02_FLY)), - - [SPECIES_MANTINE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SKARMORY] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM01_CUT) - | TMHM(HM02_FLY) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_HOUNDOUR] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(TM50_OVERHEAT) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_HOUNDOOM] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_KINGDRA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_PHANPY] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_DONPHAN] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_PORYGON2] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_STANTLER] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM05_FLASH)), - - [SPECIES_SMEARGLE] = TMHM_LEARNSET(0), - - [SPECIES_TYROGUE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_HITMONTOP] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SMOOCHUM] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM05_FLASH)), - - [SPECIES_ELEKID] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MAGBY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MILTANK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_BLISSEY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_RAIKOU] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_ENTEI] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SUICUNE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM37_SANDSTORM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_LARVITAR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_PUPITAR] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_TYRANITAR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM02_DRAGON_CLAW) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_LUGIA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM47_STEEL_WING) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM02_FLY) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_HO_OH] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM47_STEEL_WING) - | TMHM(TM50_OVERHEAT) - | TMHM(HM02_FLY) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CELEBI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_OLD_UNOWN_B] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_C] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_D] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_E] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_F] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_G] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_H] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_I] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_J] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_K] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_L] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_M] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_N] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_O] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_P] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_Q] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_R] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_S] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_T] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_U] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_V] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_W] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_X] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_Y] = TMHM_LEARNSET(0), - - [SPECIES_OLD_UNOWN_Z] = TMHM_LEARNSET(0), - - [SPECIES_TREECKO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_GROVYLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SCEPTILE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM02_DRAGON_CLAW) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_TORCHIC] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_COMBUSKEN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_BLAZIKEN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MUDKIP] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_MARSHTOMP] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SWAMPERT] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_POOCHYENA] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MIGHTYENA] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_ZIGZAGOON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_LINOONE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_WURMPLE] = TMHM_LEARNSET(0), - - [SPECIES_SILCOON] = TMHM_LEARNSET(0), - - [SPECIES_BEAUTIFLY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_CASCOON] = TMHM_LEARNSET(0), - - [SPECIES_DUSTOX] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_LOTAD] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM05_FLASH)), - - [SPECIES_LOMBRE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_LUDICOLO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SEEDOT] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_NUZLEAF] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SHIFTRY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_NINCADA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_NINJASK] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_SHEDINJA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM46_THIEF) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_TAILLOW] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_SWELLOW] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_SHROOMISH] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_BRELOOM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM49_SNATCH) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SPINDA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_WINGULL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_PELIPPER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY) - | TMHM(HM03_SURF)), - - [SPECIES_SURSKIT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_MASQUERAIN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_WAILMER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_WAILORD] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SKITTY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_DELCATTY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_KECLEON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_BALTOY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM05_FLASH)), - - [SPECIES_CLAYDOL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_NOSEPASS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_TORKOAL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SABLEYE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_BARBOACH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_WHISCASH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_LUVDISC] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_CORPHISH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL)), - - [SPECIES_CRAWDAUNT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_FEEBAS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_MILOTIC] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_CARVANHA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SHARPEDO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_TRAPINCH] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_VIBRAVA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_FLYGON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MAKUHITA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_HARIYAMA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_ELECTRIKE] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH)), - - [SPECIES_MANECTRIC] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH)), - - [SPECIES_NUMEL] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CAMERUPT] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SPHEAL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_SEALEO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_WALREIN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_CACNEA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_CACTURNE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH)), - - [SPECIES_SNORUNT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_GLALIE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_LUNATONE] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM05_FLASH)), - - [SPECIES_SOLROCK] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM50_OVERHEAT) - | TMHM(HM05_FLASH)), - - [SPECIES_AZURILL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL)), - - [SPECIES_SPOINK] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_GRUMPIG] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_PLUSLE] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_MINUN] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM05_FLASH)), - - [SPECIES_MAWILE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MEDITITE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_MEDICHAM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SWABLU] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY)), - - [SPECIES_ALTARIA] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM47_STEEL_WING) - | TMHM(HM02_FLY) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_WYNAUT] = TMHM_LEARNSET(0), - - [SPECIES_DUSKULL] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_DUSCLOPS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_ROSELIA] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM05_FLASH)), - - [SPECIES_SLAKOTH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_VIGOROTH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SLAKING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_GULPIN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SWALOT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_TROPIUS] = TMHM_LEARNSET(TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM47_STEEL_WING) - | TMHM(HM01_CUT) - | TMHM(HM02_FLY) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_WHISMUR] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT)), - - [SPECIES_LOUDRED] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_EXPLOUD] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM50_OVERHEAT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CLAMPERL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_HUNTAIL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM49_SNATCH) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_GOREBYSS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_ABSOL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SHUPPET] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_BANETTE] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_SEVIPER] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM49_SNATCH) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_ZANGOOSE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_RELICANTH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM03_SURF) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_ARON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_LAIRON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_AGGRON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM02_DRAGON_CLAW) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CASTFORM] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_VOLBEAT] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_ILLUMISE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(HM05_FLASH)), - - [SPECIES_LILEEP] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT)), - - [SPECIES_CRADILY] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM09_BULLET_SEED) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM19_GIGA_DRAIN) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_ANORITH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_ARMALDO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_RALTS] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_KIRLIA] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_GARDEVOIR] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM46_THIEF) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), - - [SPECIES_BAGON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SHELGON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_SALAMENCE] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM47_STEEL_WING) - | TMHM(HM01_CUT) - | TMHM(HM02_FLY) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_BELDUM] = TMHM_LEARNSET(0), - - [SPECIES_METANG] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_METAGROSS] = TMHM_LEARNSET(TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM36_SLUDGE_BOMB) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_REGIROCK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_REGICE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_REGISTEEL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_KYOGRE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM07_HAIL) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_GROUDON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM28_DIG) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM50_OVERHEAT) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_RAYQUAZA] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM08_BULK_UP) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM14_BLIZZARD) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM23_IRON_TAIL) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM35_FLAMETHROWER) - | TMHM(TM37_SANDSTORM) - | TMHM(TM38_FIRE_BLAST) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM50_OVERHEAT) - | TMHM(HM02_FLY) - | TMHM(HM03_SURF) - | TMHM(HM04_STRENGTH) - | TMHM(HM06_ROCK_SMASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_LATIAS] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM47_STEEL_WING) - | TMHM(HM01_CUT) - | TMHM(HM02_FLY) - | TMHM(HM03_SURF) - | TMHM(HM05_FLASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_LATIOS] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM05_ROAR) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM26_EARTHQUAKE) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM47_STEEL_WING) - | TMHM(HM01_CUT) - | TMHM(HM02_FLY) - | TMHM(HM03_SURF) - | TMHM(HM05_FLASH) - | TMHM(HM07_WATERFALL) - | TMHM(HM08_DIVE)), - - [SPECIES_JIRACHI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM37_SANDSTORM) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM48_SKILL_SWAP) - | TMHM(HM05_FLASH)), - - [SPECIES_DEOXYS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH) - | TMHM(TM03_WATER_PULSE) - | TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM13_ICE_BEAM) - | TMHM(TM15_HYPER_BEAM) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM22_SOLAR_BEAM) - | TMHM(TM24_THUNDERBOLT) - | TMHM(TM25_THUNDER) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM31_BRICK_BREAK) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM39_ROCK_TOMB) - | TMHM(TM40_AERIAL_ACE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM01_CUT) - | TMHM(HM04_STRENGTH) - | TMHM(HM05_FLASH) - | TMHM(HM06_ROCK_SMASH)), - - [SPECIES_CHIMECHO] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND) - | TMHM(TM06_TOXIC) - | TMHM(TM10_HIDDEN_POWER) - | TMHM(TM11_SUNNY_DAY) - | TMHM(TM12_TAUNT) - | TMHM(TM16_LIGHT_SCREEN) - | TMHM(TM17_PROTECT) - | TMHM(TM18_RAIN_DANCE) - | TMHM(TM20_SAFEGUARD) - | TMHM(TM21_FRUSTRATION) - | TMHM(TM27_RETURN) - | TMHM(TM29_PSYCHIC) - | TMHM(TM30_SHADOW_BALL) - | TMHM(TM32_DOUBLE_TEAM) - | TMHM(TM33_REFLECT) - | TMHM(TM34_SHOCK_WAVE) - | TMHM(TM41_TORMENT) - | TMHM(TM42_FACADE) - | TMHM(TM43_SECRET_POWER) - | TMHM(TM44_REST) - | TMHM(TM45_ATTRACT) - | TMHM(TM48_SKILL_SWAP) - | TMHM(TM49_SNATCH) - | TMHM(HM05_FLASH)), + FOREACH_TMHM(TMHM_LEARN) +}; +#undef TMHM_LEARN + +const union { + struct TMHMLearnset learnset; + u32 as_u32s[sizeof(struct TMHMLearnset) / sizeof(u32)]; +} gTMHMLearnsets[NUM_SPECIES] = +{ + [SPECIES_NONE] = {}, + + [SPECIES_BULBASAUR] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_IVYSAUR] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_VENUSAUR] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CHARMANDER] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .DRAGON_CLAW = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CHARMELEON] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .DRAGON_CLAW = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CHARIZARD] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .DRAGON_CLAW = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STEEL_WING = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + .FLY = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SQUIRTLE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_WARTORTLE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_BLASTOISE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_CATERPIE] = { .learnset = { + } }, + + [SPECIES_METAPOD] = { .learnset = { + } }, + + [SPECIES_BUTTERFREE] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_WEEDLE] = { .learnset = { + } }, + + [SPECIES_KAKUNA] = { .learnset = { + } }, + + [SPECIES_BEEDRILL] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_PIDGEY] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_PIDGEOTTO] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_PIDGEOT] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_RATTATA] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_RATICATE] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SPEAROW] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_FEAROW] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_EKANS] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + } }, + + [SPECIES_ARBOK] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + } }, + + [SPECIES_PIKACHU] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_RAICHU] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SANDSHREW] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SANDSLASH] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_NIDORAN_F] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SLUDGE_BOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_NIDORINA] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SLUDGE_BOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_NIDOQUEEN] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_NIDORAN_M] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_NIDORINO] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_NIDOKING] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CLEFAIRY] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_CLEFABLE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_VULPIX] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + } }, + + [SPECIES_NINETALES] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + } }, + + [SPECIES_JIGGLYPUFF] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_WIGGLYTUFF] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_ZUBAT] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .SNATCH = TRUE, + } }, + + [SPECIES_GOLBAT] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .SNATCH = TRUE, + } }, + + [SPECIES_ODDISH] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_GLOOM] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_VILEPLUME] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_PARAS] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_PARASECT] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_VENONAT] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_VENOMOTH] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_DIGLETT] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_DUGTRIO] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MEOWTH] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_PERSIAN] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_PSYDUCK] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_GOLDUCK] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_MANKEY] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_PRIMEAPE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_GROWLITHE] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_ARCANINE] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_POLIWAG] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_POLIWHIRL] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_POLIWRATH] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_ABRA] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_KADABRA] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_ALAKAZAM] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_MACHOP] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MACHOKE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MACHAMP] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_BELLSPROUT] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_WEEPINBELL] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_VICTREEBEL] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_TENTACOOL] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_TENTACRUEL] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_GEODUDE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_GRAVELER] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_GOLEM] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_PONYTA] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + } }, + + [SPECIES_RAPIDASH] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + } }, + + [SPECIES_SLOWPOKE] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SKILL_SWAP = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SLOWBRO] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SKILL_SWAP = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_MAGNEMITE] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_MAGNETON] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_FARFETCHD] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .CUT = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_DODUO] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_DODRIO] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_SEEL] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_DEWGONG] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_GRIMER] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + } }, + + [SPECIES_MUK] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SHELLDER] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_CLOYSTER] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_GASTLY] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + } }, + + [SPECIES_HAUNTER] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + } }, + + [SPECIES_GENGAR] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_ONIX] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_DROWZEE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_HYPNO] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_KRABBY] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_KINGLER] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_VOLTORB] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .TAUNT = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_ELECTRODE] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_EXEGGCUTE] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_EXEGGUTOR] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_CUBONE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MAROWAK] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_HITMONLEE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_HITMONCHAN] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_LICKITUNG] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_KOFFING] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FIRE_BLAST = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_WEEZING] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FIRE_BLAST = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_RHYHORN] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_RHYDON] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CHANSEY] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_TANGELA] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_KANGASKHAN] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_HORSEA] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SEADRA] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_GOLDEEN] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SEAKING] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_STARYU] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SURF = TRUE, + .FLASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_STARMIE] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SKILL_SWAP = TRUE, + .SURF = TRUE, + .FLASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_MR_MIME] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_SCYTHER] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .CUT = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_JYNX] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_ELECTABUZZ] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MAGMAR] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_PINSIR] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_TAUROS] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MAGIKARP] = { .learnset = { + } }, + + [SPECIES_GYARADOS] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_LAPRAS] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_DITTO] = { .learnset = { + } }, + + [SPECIES_EEVEE] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + } }, + + [SPECIES_VAPOREON] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_JOLTEON] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_FLAREON] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + } }, + + [SPECIES_PORYGON] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_OMANYTE] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_OMASTAR] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_KABUTO] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + } }, + + [SPECIES_KABUTOPS] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_AERODACTYL] = { .learnset = { + .DRAGON_CLAW = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SNORLAX] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + } }, + + [SPECIES_ARTICUNO] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_ZAPDOS] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MOLTRES] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .STEEL_WING = TRUE, + .OVERHEAT = TRUE, + .FLY = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_DRATINI] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + } }, + + [SPECIES_DRAGONAIR] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + } }, + + [SPECIES_DRAGONITE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .DRAGON_CLAW = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STEEL_WING = TRUE, + .CUT = TRUE, + .FLY = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_MEWTWO] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MEW] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .DRAGON_CLAW = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .BULK_UP = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + .FLY = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_CHIKORITA] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_BAYLEEF] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MEGANIUM] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CYNDAQUIL] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + } }, + + [SPECIES_QUILAVA] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_TYPHLOSION] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_TOTODILE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_CROCONAW] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_FERALIGATR] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .DRAGON_CLAW = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SENTRET] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + } }, + + [SPECIES_FURRET] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_HOOTHOOT] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_NOCTOWL] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_LEDYBA] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_LEDIAN] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_SPINARAK] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_ARIADOS] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_CROBAT] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .SNATCH = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_CHINCHOU] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .FLASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_LANTURN] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .FLASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_PICHU] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_CLEFFA] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_IGGLYBUFF] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_TOGEPI] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_TOGETIC] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_NATU] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .SKILL_SWAP = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_XATU] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .SKILL_SWAP = TRUE, + .FLY = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_MAREEP] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_FLAAFFY] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_AMPHAROS] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_BELLOSSOM] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_MARILL] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_AZUMARILL] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SUDOWOODO] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_POLITOED] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_HOPPIP] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_SKIPLOOM] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_JUMPLUFF] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_AIPOM] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SUNKERN] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_SUNFLORA] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_YANMA] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_WOOPER] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_QUAGSIRE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_ESPEON] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SKILL_SWAP = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_UMBREON] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SNATCH = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_MURKROW] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .SNATCH = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_SLOWKING] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SKILL_SWAP = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_MISDREAVUS] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_UNOWN] = { .learnset = { + } }, + + [SPECIES_WOBBUFFET] = { .learnset = { + } }, + + [SPECIES_GIRAFARIG] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_PINECO] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SANDSTORM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_FORRETRESS] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SANDSTORM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_DUNSPARCE] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_GLIGAR] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_STEELIX] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SNUBBULL] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FIRE_BLAST = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_GRANBULL] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_QWILFISH] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SCIZOR] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SHUCKLE] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_HERACROSS] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SNEASEL] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_TEDDIURSA] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_URSARING] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SLUGMA] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MAGCARGO] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SWINUB] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_PILOSWINE] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CORSOLA] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_REMORAID] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_OCTILLERY] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_DELIBIRD] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_MANTINE] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SKARMORY] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .CUT = TRUE, + .FLY = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_HOUNDOUR] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FIRE_BLAST = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .OVERHEAT = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_HOUNDOOM] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FIRE_BLAST = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_KINGDRA] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_PHANPY] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_DONPHAN] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_PORYGON2] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_STANTLER] = { .learnset = { + .CALM_MIND = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_SMEARGLE] = { .learnset = { + } }, + + [SPECIES_TYROGUE] = { .learnset = { + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_HITMONTOP] = { .learnset = { + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SMOOCHUM] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_ELEKID] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MAGBY] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MILTANK] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_BLISSEY] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_RAIKOU] = { .learnset = { + .CALM_MIND = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_ENTEI] = { .learnset = { + .CALM_MIND = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SUICUNE] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SANDSTORM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_LARVITAR] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_PUPITAR] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_TYRANITAR] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .DRAGON_CLAW = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_LUGIA] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .STEEL_WING = TRUE, + .SKILL_SWAP = TRUE, + .FLY = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_HO_OH] = { .learnset = { + .CALM_MIND = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .STEEL_WING = TRUE, + .OVERHEAT = TRUE, + .FLY = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CELEBI] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SKILL_SWAP = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_OLD_UNOWN_B] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_C] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_D] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_E] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_F] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_G] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_H] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_I] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_J] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_K] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_L] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_M] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_N] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_O] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_P] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_Q] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_R] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_S] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_T] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_U] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_V] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_W] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_X] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_Y] = { .learnset = { + } }, + + [SPECIES_OLD_UNOWN_Z] = { .learnset = { + } }, + + [SPECIES_TREECKO] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_GROVYLE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SCEPTILE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .DRAGON_CLAW = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_TORCHIC] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_COMBUSKEN] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_BLAZIKEN] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MUDKIP] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_MARSHTOMP] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SWAMPERT] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_POOCHYENA] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MIGHTYENA] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_ZIGZAGOON] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_LINOONE] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_WURMPLE] = { .learnset = { + } }, + + [SPECIES_SILCOON] = { .learnset = { + } }, + + [SPECIES_BEAUTIFLY] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_CASCOON] = { .learnset = { + } }, + + [SPECIES_DUSTOX] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_LOTAD] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_LOMBRE] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_LUDICOLO] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SEEDOT] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_NUZLEAF] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SHIFTRY] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_NINCADA] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_NINJASK] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_SHEDINJA] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .THIEF = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_TAILLOW] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_SWELLOW] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_SHROOMISH] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_BRELOOM] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SNATCH = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SPINDA] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_WINGULL] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_PELIPPER] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + .SURF = TRUE, + } }, + + [SPECIES_SURSKIT] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_MASQUERAIN] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_WAILMER] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_WAILORD] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SKITTY] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_DELCATTY] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_KECLEON] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_BALTOY] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SKILL_SWAP = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_CLAYDOL] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SKILL_SWAP = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_NOSEPASS] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_TORKOAL] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SABLEYE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_BARBOACH] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_WHISCASH] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_LUVDISC] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_CORPHISH] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + } }, + + [SPECIES_CRAWDAUNT] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_FEEBAS] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_MILOTIC] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_CARVANHA] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SHARPEDO] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_TRAPINCH] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_VIBRAVA] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_FLYGON] = { .learnset = { + .DRAGON_CLAW = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MAKUHITA] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_HARIYAMA] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_ELECTRIKE] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_MANECTRIC] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_NUMEL] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CAMERUPT] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SPHEAL] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_SEALEO] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_WALREIN] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_CACNEA] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_CACTURNE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_SNORUNT] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_GLALIE] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_LUNATONE] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SKILL_SWAP = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_SOLROCK] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SKILL_SWAP = TRUE, + .OVERHEAT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_AZURILL] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + } }, + + [SPECIES_SPOINK] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_GRUMPIG] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_PLUSLE] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_MINUN] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_MAWILE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MEDITITE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_MEDICHAM] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SWABLU] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + } }, + + [SPECIES_ALTARIA] = { .learnset = { + .DRAGON_CLAW = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STEEL_WING = TRUE, + .FLY = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_WYNAUT] = { .learnset = { + } }, + + [SPECIES_DUSKULL] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_DUSCLOPS] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_ROSELIA] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_SLAKOTH] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_VIGOROTH] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SLAKING] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_GULPIN] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SWALOT] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_TROPIUS] = { .learnset = { + .ROAR = TRUE, + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STEEL_WING = TRUE, + .CUT = TRUE, + .FLY = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_WHISMUR] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + } }, + + [SPECIES_LOUDRED] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_EXPLOUD] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .OVERHEAT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CLAMPERL] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_HUNTAIL] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SNATCH = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_GOREBYSS] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_ABSOL] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SHUPPET] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_BANETTE] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_SEVIPER] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .SLUDGE_BOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SNATCH = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_ZANGOOSE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_RELICANTH] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SURF = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_ARON] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_LAIRON] = { .learnset = { + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_AGGRON] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .DRAGON_CLAW = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CASTFORM] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_VOLBEAT] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_ILLUMISE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_LILEEP] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + } }, + + [SPECIES_CRADILY] = { .learnset = { + .TOXIC = TRUE, + .BULLET_SEED = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .GIGA_DRAIN = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DOUBLE_TEAM = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_ANORITH] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_ARMALDO] = { .learnset = { + .WATER_PULSE = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_RALTS] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_KIRLIA] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_GARDEVOIR] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .THIEF = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_BAGON] = { .learnset = { + .DRAGON_CLAW = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SHELGON] = { .learnset = { + .DRAGON_CLAW = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_SALAMENCE] = { .learnset = { + .DRAGON_CLAW = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .IRON_TAIL = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .FLAMETHROWER = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STEEL_WING = TRUE, + .CUT = TRUE, + .FLY = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_BELDUM] = { .learnset = { + } }, + + [SPECIES_METANG] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_METAGROSS] = { .learnset = { + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SLUDGE_BOMB = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_REGIROCK] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_REGICE] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_REGISTEEL] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_KYOGRE] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HAIL = TRUE, + .HIDDEN_POWER = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .ROCK_TOMB = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_GROUDON] = { .learnset = { + .DRAGON_CLAW = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .DIG = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .OVERHEAT = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_RAYQUAZA] = { .learnset = { + .DRAGON_CLAW = TRUE, + .WATER_PULSE = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .BULK_UP = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .BLIZZARD = TRUE, + .HYPER_BEAM = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .IRON_TAIL = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .SHOCK_WAVE = TRUE, + .FLAMETHROWER = TRUE, + .SANDSTORM = TRUE, + .FIRE_BLAST = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .OVERHEAT = TRUE, + .FLY = TRUE, + .SURF = TRUE, + .STRENGTH = TRUE, + .ROCK_SMASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_LATIAS] = { .learnset = { + .DRAGON_CLAW = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STEEL_WING = TRUE, + .CUT = TRUE, + .FLY = TRUE, + .SURF = TRUE, + .FLASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_LATIOS] = { .learnset = { + .DRAGON_CLAW = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .ROAR = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .ICE_BEAM = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .EARTHQUAKE = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .STEEL_WING = TRUE, + .CUT = TRUE, + .FLY = TRUE, + .SURF = TRUE, + .FLASH = TRUE, + .WATERFALL = TRUE, + .DIVE = TRUE, + } }, + + [SPECIES_JIRACHI] = { .learnset = { + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .SANDSTORM = TRUE, + .AERIAL_ACE = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SKILL_SWAP = TRUE, + .FLASH = TRUE, + } }, + + [SPECIES_DEOXYS] = { .learnset = { + .FOCUS_PUNCH = TRUE, + .WATER_PULSE = TRUE, + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .ICE_BEAM = TRUE, + .HYPER_BEAM = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .SOLAR_BEAM = TRUE, + .THUNDERBOLT = TRUE, + .THUNDER = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .BRICK_BREAK = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .ROCK_TOMB = TRUE, + .AERIAL_ACE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .CUT = TRUE, + .STRENGTH = TRUE, + .FLASH = TRUE, + .ROCK_SMASH = TRUE, + } }, + + [SPECIES_CHIMECHO] = { .learnset = { + .CALM_MIND = TRUE, + .TOXIC = TRUE, + .HIDDEN_POWER = TRUE, + .SUNNY_DAY = TRUE, + .TAUNT = TRUE, + .LIGHT_SCREEN = TRUE, + .PROTECT = TRUE, + .RAIN_DANCE = TRUE, + .SAFEGUARD = TRUE, + .FRUSTRATION = TRUE, + .RETURN = TRUE, + .PSYCHIC = TRUE, + .SHADOW_BALL = TRUE, + .DOUBLE_TEAM = TRUE, + .REFLECT = TRUE, + .SHOCK_WAVE = TRUE, + .TORMENT = TRUE, + .FACADE = TRUE, + .SECRET_POWER = TRUE, + .REST = TRUE, + .ATTRACT = TRUE, + .SKILL_SWAP = TRUE, + .SNATCH = TRUE, + .FLASH = TRUE, + } }, }; diff --git a/src/data/pokemon_graphics/back_pic_table.h b/src/data/pokemon_graphics/back_pic_table.h index 9a98927aac..1a51f9ccdd 100644 --- a/src/data/pokemon_graphics/back_pic_table.h +++ b/src/data/pokemon_graphics/back_pic_table.h @@ -122,7 +122,7 @@ const struct CompressedSpriteSheet gMonBackPicTable[] = SPECIES_SPRITE(SEAKING, gMonBackPic_Seaking), SPECIES_SPRITE(STARYU, gMonBackPic_Staryu), SPECIES_SPRITE(STARMIE, gMonBackPic_Starmie), - SPECIES_SPRITE(MR_MIME, gMonBackPic_Mrmime), + SPECIES_SPRITE(MR_MIME, gMonBackPic_MrMime), SPECIES_SPRITE(SCYTHER, gMonBackPic_Scyther), SPECIES_SPRITE(JYNX, gMonBackPic_Jynx), SPECIES_SPRITE(ELECTABUZZ, gMonBackPic_Electabuzz), diff --git a/src/data/pokemon_graphics/footprint_table.h b/src/data/pokemon_graphics/footprint_table.h index 86ca067901..d63e33e5b7 100644 --- a/src/data/pokemon_graphics/footprint_table.h +++ b/src/data/pokemon_graphics/footprint_table.h @@ -122,7 +122,7 @@ const u8 *const gMonFootprintTable[] = [SPECIES_SEAKING] = gMonFootprint_Seaking, [SPECIES_STARYU] = gMonFootprint_Staryu, [SPECIES_STARMIE] = gMonFootprint_Starmie, - [SPECIES_MR_MIME] = gMonFootprint_Mrmime, + [SPECIES_MR_MIME] = gMonFootprint_MrMime, [SPECIES_SCYTHER] = gMonFootprint_Scyther, [SPECIES_JYNX] = gMonFootprint_Jynx, [SPECIES_ELECTABUZZ] = gMonFootprint_Electabuzz, diff --git a/src/data/pokemon_graphics/front_pic_table.h b/src/data/pokemon_graphics/front_pic_table.h index 82af860d30..acb0bba252 100644 --- a/src/data/pokemon_graphics/front_pic_table.h +++ b/src/data/pokemon_graphics/front_pic_table.h @@ -122,7 +122,7 @@ const struct CompressedSpriteSheet gMonFrontPicTable[] = SPECIES_SPRITE(SEAKING, gMonFrontPic_Seaking), SPECIES_SPRITE(STARYU, gMonFrontPic_Staryu), SPECIES_SPRITE(STARMIE, gMonFrontPic_Starmie), - SPECIES_SPRITE(MR_MIME, gMonFrontPic_Mrmime), + SPECIES_SPRITE(MR_MIME, gMonFrontPic_MrMime), SPECIES_SPRITE(SCYTHER, gMonFrontPic_Scyther), SPECIES_SPRITE(JYNX, gMonFrontPic_Jynx), SPECIES_SPRITE(ELECTABUZZ, gMonFrontPic_Electabuzz), diff --git a/src/data/pokemon_graphics/palette_table.h b/src/data/pokemon_graphics/palette_table.h index 35edcc76c1..8bdfd2dbd9 100644 --- a/src/data/pokemon_graphics/palette_table.h +++ b/src/data/pokemon_graphics/palette_table.h @@ -122,7 +122,7 @@ const struct CompressedSpritePalette gMonPaletteTable[] = SPECIES_PAL(SEAKING, gMonPalette_Seaking), SPECIES_PAL(STARYU, gMonPalette_Staryu), SPECIES_PAL(STARMIE, gMonPalette_Starmie), - SPECIES_PAL(MR_MIME, gMonPalette_Mrmime), + SPECIES_PAL(MR_MIME, gMonPalette_MrMime), SPECIES_PAL(SCYTHER, gMonPalette_Scyther), SPECIES_PAL(JYNX, gMonPalette_Jynx), SPECIES_PAL(ELECTABUZZ, gMonPalette_Electabuzz), diff --git a/src/data/pokemon_graphics/shiny_palette_table.h b/src/data/pokemon_graphics/shiny_palette_table.h index 8b1cfcaaca..1db14d864a 100644 --- a/src/data/pokemon_graphics/shiny_palette_table.h +++ b/src/data/pokemon_graphics/shiny_palette_table.h @@ -122,7 +122,7 @@ const struct CompressedSpritePalette gMonShinyPaletteTable[] = SPECIES_SHINY_PAL(SEAKING, gMonShinyPalette_Seaking), SPECIES_SHINY_PAL(STARYU, gMonShinyPalette_Staryu), SPECIES_SHINY_PAL(STARMIE, gMonShinyPalette_Starmie), - SPECIES_SHINY_PAL(MR_MIME, gMonShinyPalette_Mrmime), + SPECIES_SHINY_PAL(MR_MIME, gMonShinyPalette_MrMime), SPECIES_SHINY_PAL(SCYTHER, gMonShinyPalette_Scyther), SPECIES_SHINY_PAL(JYNX, gMonShinyPalette_Jynx), SPECIES_SHINY_PAL(ELECTABUZZ, gMonShinyPalette_Electabuzz), diff --git a/src/data/pokemon_graphics/still_front_pic_table.h b/src/data/pokemon_graphics/still_front_pic_table.h index 985a3aa2fd..9a77855ab4 100644 --- a/src/data/pokemon_graphics/still_front_pic_table.h +++ b/src/data/pokemon_graphics/still_front_pic_table.h @@ -122,7 +122,7 @@ const struct CompressedSpriteSheet gMonStillFrontPicTable[] = SPECIES_SPRITE(SEAKING, gMonStillFrontPic_Seaking), SPECIES_SPRITE(STARYU, gMonStillFrontPic_Staryu), SPECIES_SPRITE(STARMIE, gMonStillFrontPic_Starmie), - SPECIES_SPRITE(MR_MIME, gMonStillFrontPic_Mrmime), + SPECIES_SPRITE(MR_MIME, gMonStillFrontPic_MrMime), SPECIES_SPRITE(SCYTHER, gMonStillFrontPic_Scyther), SPECIES_SPRITE(JYNX, gMonStillFrontPic_Jynx), SPECIES_SPRITE(ELECTABUZZ, gMonStillFrontPic_Electabuzz), diff --git a/src/data/trade.h b/src/data/trade.h index ef7e9231de..ba49f4b874 100644 --- a/src/data/trade.h +++ b/src/data/trade.h @@ -372,8 +372,8 @@ static const u8 *const sActionTexts[] = static const struct MenuAction sSelectTradeMonActions[] = { - {sText_Summary2, Task_DrawSelectionSummary}, - {sText_Trade2, Task_DrawSelectionTrade} + {sText_Summary2, {Task_DrawSelectionSummary}}, + {sText_Trade2, {Task_DrawSelectionTrade}} }; static const u8 *const sMessages[] = diff --git a/src/daycare.c b/src/daycare.c index c3f4dd9906..5ebe255b39 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -93,16 +93,14 @@ static const u8 sJapaneseEggNickname[] = _("タマゴ"); // "tamago" ("egg" in J u8 *GetMonNickname2(struct Pokemon *mon, u8 *dest) { - u8 nickname[POKEMON_NAME_LENGTH * 2]; - + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; GetMonData(mon, MON_DATA_NICKNAME, nickname); return StringCopy_Nickname(dest, nickname); } u8 *GetBoxMonNickname(struct BoxPokemon *mon, u8 *dest) { - u8 nickname[POKEMON_NAME_LENGTH * 2]; - + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; GetBoxMonData(mon, MON_DATA_NICKNAME, nickname); return StringCopy_Nickname(dest, nickname); } @@ -195,10 +193,10 @@ void StoreSelectedPokemonInDaycare(void) StorePokemonInEmptyDaycareSlot(&gPlayerParty[monId], &gSaveBlock1Ptr->daycare); } -// Shifts the second daycare pokemon slot into the first slot. +// Shifts the second daycare Pokémon slot into the first slot. static void ShiftDaycareSlots(struct DayCare *daycare) { - // This condition is only satisfied when the player takes out the first pokemon from the daycare. + // This condition is only satisfied when the player takes out the first Pokémon from the daycare. if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != SPECIES_NONE && GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) == SPECIES_NONE) { @@ -333,7 +331,7 @@ void GetDaycareCost(void) gSpecialVar_0x8005 = GetDaycareCostForMon(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004); } -static void Debug_AddDaycareSteps(u16 numSteps) +static void UNUSED Debug_AddDaycareSteps(u16 numSteps) { gSaveBlock1Ptr->daycare.mons[0].steps += numSteps; gSaveBlock1Ptr->daycare.mons[1].steps += numSteps; @@ -341,7 +339,7 @@ static void Debug_AddDaycareSteps(u16 numSteps) u8 GetNumLevelsGainedFromDaycare(void) { - if (GetBoxMonData(&gSaveBlock1Ptr->daycare.mons[gSpecialVar_0x8004], MON_DATA_SPECIES) != 0) + if (GetBoxMonData(&gSaveBlock1Ptr->daycare.mons[gSpecialVar_0x8004].mon, MON_DATA_SPECIES) != 0) return GetNumLevelsGainedForDaycareMon(&gSaveBlock1Ptr->daycare.mons[gSpecialVar_0x8004]); return 0; @@ -366,7 +364,7 @@ static void ClearDaycareMon(struct DaycareMon *daycareMon) ClearDaycareMonMail(&daycareMon->mail); } -static void ClearAllDaycareData(struct DayCare *daycare) +static void UNUSED ClearAllDaycareData(struct DayCare *daycare) { u8 i; @@ -500,8 +498,7 @@ void TriggerPendingDaycareEgg(void) _TriggerPendingDaycareEgg(&gSaveBlock1Ptr->daycare); } -// Unused -static void TriggerPendingDaycareMaleEgg(void) +static void UNUSED TriggerPendingDaycareMaleEgg(void) { _TriggerPendingDaycareMaleEgg(&gSaveBlock1Ptr->daycare); } @@ -599,7 +596,7 @@ static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare) } } -// Counts the number of egg moves a pokemon learns and stores the moves in +// 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) { @@ -685,7 +682,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru { for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) { - if (sHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01_FOCUS_PUNCH + j) && CanMonLearnTMHM(egg, j)) + if (sHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01 + j) && CanMonLearnTMHM(egg, j)) { if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == MON_HAS_MAX_MOVES) DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFatherMoves[i]); @@ -946,12 +943,12 @@ static bool8 IsEggPending(struct DayCare *daycare) // gStringVar3 = first mon trainer's name static void _GetDaycareMonNicknames(struct DayCare *daycare) { - u8 text[12]; + u8 otName[max(12, PLAYER_NAME_LENGTH + 1)]; if (GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) != 0) { GetBoxMonNickname(&daycare->mons[0].mon, gStringVar1); - GetBoxMonData(&daycare->mons[0].mon, MON_DATA_OT_NAME, text); - StringCopy(gStringVar3, text); + GetBoxMonData(&daycare->mons[0].mon, MON_DATA_OT_NAME, otName); + StringCopy(gStringVar3, otName); } if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != 0) @@ -988,7 +985,7 @@ u8 GetDaycareState(void) return DAYCARE_NO_MONS; } -static u8 GetDaycarePokemonCount(void) +static u8 UNUSED GetDaycarePokemonCount(void) { u8 ret = CountPokemonInDaycare(&gSaveBlock1Ptr->daycare); if (ret) @@ -1036,7 +1033,7 @@ static u8 GetDaycareCompatibilityScore(struct DayCare *daycare) } // check unbreedable egg group - if (eggGroups[0][0] == EGG_GROUP_UNDISCOVERED || eggGroups[1][0] == EGG_GROUP_UNDISCOVERED) + if (eggGroups[0][0] == EGG_GROUP_NO_EGGS_DISCOVERED || eggGroups[1][0] == EGG_GROUP_NO_EGGS_DISCOVERED) return PARENTS_INCOMPATIBLE; // two Ditto can't breed if (eggGroups[0][0] == EGG_GROUP_DITTO && eggGroups[1][0] == EGG_GROUP_DITTO) @@ -1144,9 +1141,9 @@ static u8 *AppendMonGenderSymbol(u8 *name, struct BoxPokemon *boxMon) return AppendGenderSymbol(name, GetBoxMonGender(boxMon)); } -static void GetDaycareLevelMenuText(struct DayCare *daycare, u8 *dest) +static void UNUSED GetDaycareLevelMenuText(struct DayCare *daycare, u8 *dest) { - u8 monNames[DAYCARE_MON_COUNT][20]; + u8 monNames[DAYCARE_MON_COUNT][POKEMON_NAME_BUFFER_SIZE]; u8 i; *dest = EOS; @@ -1163,7 +1160,7 @@ static void GetDaycareLevelMenuText(struct DayCare *daycare, u8 *dest) StringAppend(dest, gText_Exit4); } -static void GetDaycareLevelMenuLevelText(struct DayCare *daycare, u8 *dest) +static void UNUSED GetDaycareLevelMenuLevelText(struct DayCare *daycare, u8 *dest) { u8 i; u8 level; @@ -1204,8 +1201,7 @@ static void DaycareAddTextPrinter(u8 windowId, const u8 *text, u32 x, u32 y) static void DaycarePrintMonNickname(struct DayCare *daycare, u8 windowId, u32 daycareSlotId, u32 y) { - u8 nickname[POKEMON_NAME_LENGTH * 2]; - + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; GetBoxMonNickname(&daycare->mons[daycareSlotId].mon, nickname); AppendMonGenderSymbol(nickname, &daycare->mons[daycareSlotId].mon); DaycareAddTextPrinter(windowId, nickname, 8, y); diff --git a/src/decompress.c b/src/decompress.c index c16c2cdb31..55807e89bb 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -113,7 +113,7 @@ void Unused_LZDecompressWramIndirect(const void **src, void *dest) LZ77UnCompWram(*src, dest); } -static void StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_tiles, u8 *dest_tiles) +static void UNUSED StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_tiles, u8 *dest_tiles) { /* This function appears to emulate behaviour found in the GB(C) versions regarding how the Pokemon images @@ -214,7 +214,8 @@ static void StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_ // While the remaining space will be filled with actual data if (object_size == 6) { - for (k = 0; k < 256; k++) { + for (k = 0; k < 256; k++) + { *dest = 0; dest++; } @@ -224,14 +225,16 @@ static void StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_ { if (object_size == 6) { - for (k = 0; k < 32; k++) { + for (k = 0; k < 32; k++) + { *dest = 0; dest++; } } // Copy tile data - for (k = 0; k < 32 * object_size; k++) { + for (k = 0; k < 32 * object_size; k++) + { *dest = *src; src++; dest++; @@ -239,7 +242,8 @@ static void StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_ if (object_size == 6) { - for (k = 0; k < 32; k++) { + for (k = 0; k < 32; k++) + { *dest = 0; dest++; } @@ -248,7 +252,8 @@ static void StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_ if (object_size == 6) { - for (k = 0; k < 256; k++) { + for (k = 0; k < 256; k++) + { *dest = 0; dest++; } diff --git a/src/decoration.c b/src/decoration.c index 6d95cfbdc3..18d6e2e680 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -113,7 +113,7 @@ 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 sFiller[2] = {}; +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; @@ -422,7 +422,16 @@ static const u8 sDecorationSlideElevation[] = }; static const u16 sDecorShapeSizes[] = { - 0x04, 0x08, 0x10, 0x20, 0x10, 0x08, 0x10, 0x20, 0x40, 0x20 + [DECORSHAPE_1x1] = 4, + [DECORSHAPE_2x1] = 8, + [DECORSHAPE_3x1] = 16, + [DECORSHAPE_4x2] = 32, + [DECORSHAPE_2x2] = 16, + [DECORSHAPE_1x2] = 8, + [DECORSHAPE_1x3] = 16, + [DECORSHAPE_2x4] = 32, + [DECORSHAPE_3x3] = 64, + [DECORSHAPE_3x2] = 32, }; static const u16 sBrendanPalette[] = INCBIN_U16("graphics/decorations/brendan.gbapal"); @@ -688,7 +697,7 @@ static void ReturnToDecorationActionsAfterInvalidSelection(u8 taskId) static void SecretBasePC_PrepMenuForSelectingStoredDecors(u8 taskId) { - LoadPalette(sDecorationMenuPalette, BG_PLTT_ID(13), PLTT_SIZE_4BPP); + LoadPalette(sDecorationMenuPalette, BG_PLTT_ID(13), sizeof(sDecorationMenuPalette)); ClearDialogWindowAndFrame(0, FALSE); RemoveDecorationWindow(WINDOW_MAIN_MENU); InitDecorationCategoriesWindow(taskId); @@ -834,7 +843,7 @@ static void ReturnToActionsMenuFromCategories(u8 taskId) void ShowDecorationCategoriesWindow(u8 taskId) { - LoadPalette(sDecorationMenuPalette, BG_PLTT_ID(13), PLTT_SIZE_4BPP); + LoadPalette(sDecorationMenuPalette, BG_PLTT_ID(13), sizeof(sDecorationMenuPalette)); ClearDialogWindowAndFrame(0, FALSE); gTasks[taskId].tDecorationMenuCommand = DECOR_MENU_TRADE; sCurDecorationCategory = DECORCAT_DESK; @@ -1331,7 +1340,8 @@ static void DecorationItemsMenuAction_AttemptPlace(u8 taskId) else { ConvertIntToDecimalStringN(gStringVar1, sDecorationContext.size, STR_CONV_MODE_RIGHT_ALIGN, 2); - if (sDecorationContext.isPlayerRoom == FALSE) { + if (sDecorationContext.isPlayerRoom == FALSE) + { StringExpandPlaceholders(gStringVar4, gText_NoMoreDecorations); } else @@ -1916,7 +1926,7 @@ static void CopyPalette(u16 *dest, u16 pal) static void CopyTile(u8 *dest, u16 tile) { - u8 buffer[TILE_SIZE_4BPP]; + u8 ALIGNED(4) buffer[TILE_SIZE_4BPP]; u16 mode; u16 i; @@ -2245,7 +2255,8 @@ static void Task_PutAwayDecoration(u8 taskId) gTasks[taskId].tState = 1; break; case 1: - if (!gPaletteFade.active) { + if (!gPaletteFade.active) + { DrawWholeMapView(); ScriptContext_SetupScript(SecretBase_EventScript_PutAwayDecoration); ClearDialogWindowAndFrame(0, TRUE); diff --git a/src/dewford_trend.c b/src/dewford_trend.c index 08dd9afe0b..45c18f6013 100644 --- a/src/dewford_trend.c +++ b/src/dewford_trend.c @@ -224,7 +224,7 @@ static void SortTrends(struct DewfordTrend *trends, u16 numTrends, u8 mode) } #define SAVED_TRENDS_SIZE (sizeof(struct DewfordTrend) * SAVED_TRENDS_COUNT) -#define BUFFER_SIZE (SAVED_TRENDS_SIZE * MAX_LINK_PLAYERS > 0x100 ? SAVED_TRENDS_SIZE * MAX_LINK_PLAYERS : 0x100) // More space was allocated than needed +#define BUFFER_SIZE max(SAVED_TRENDS_SIZE * MAX_LINK_PLAYERS, 0x100) // More space was allocated than needed void ReceiveDewfordTrendData(struct DewfordTrend *linkedTrends, size_t size, u8 unused) { diff --git a/src/diploma.c b/src/diploma.c index 4f62644924..2a18867450 100644 --- a/src/diploma.c +++ b/src/diploma.c @@ -72,7 +72,7 @@ void CB2_ShowDiploma(void) ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); - LoadPalette(sDiplomaPalettes, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); + LoadPalette(sDiplomaPalettes, BG_PLTT_ID(0), sizeof(sDiplomaPalettes)); sDiplomaTilemapPtr = Alloc(0x1000); InitDiplomaBg(); InitDiplomaWindow(); diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 8d47595c8b..ce1877c6cd 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -552,8 +552,8 @@ static const u8 sUnsharedColumns[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS] = }; // Duplicate and unused gfx. Feel free to remove. -static const u32 sDuplicateGfx[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.gbapal", - "graphics/dodrio_berry_picking/tree_border.gbapal", +static const u32 sDuplicateGfx[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border.gbapal", + "graphics/dodrio_berry_picking/bg.gbapal", "graphics/dodrio_berry_picking/dodrio.gbapal", "graphics/dodrio_berry_picking/shiny.gbapal", "graphics/dodrio_berry_picking/status.gbapal", @@ -1091,32 +1091,39 @@ static void InitResults_Member(void) { u8 i; - switch (sGame->state) { + switch (sGame->state) + { case 0: - if (SendBlock(0, sGame->berryResults[sGame->timer], sizeof(sGame->berryResults))) { + if (SendBlock(0, sGame->berryResults[sGame->timer], sizeof(sGame->berryResults))) + { sGame->playersReceived = 0; sGame->state++; } break; case 1: - if (IsLinkTaskFinished()) { + if (IsLinkTaskFinished()) + { sGame->state++; } break; case 2: - if (AllLinkBlocksReceived()) { - for (i = 0; i < sGame->numPlayers; i++) { + if (AllLinkBlocksReceived()) + { + for (i = 0; i < sGame->numPlayers; i++) + { memcpy(sGame->berryResults, gBlockRecvBuffer, sizeof(sGame->berryResults)); sGame->playersReceived = sGame->numPlayers; } } - if (sGame->playersReceived >= sGame->numPlayers) { + if (sGame->playersReceived >= sGame->numPlayers) + { sGame->timer++; sGame->state++; } break; default: - if (WaitFanfare(TRUE)) { + if (WaitFanfare(TRUE)) + { sGame->maxBerriesPickedInRow = sGame->berryResults[sGame->multiplayerId][BERRY_IN_ROW]; SetGameFunc(FUNC_RESULTS); FadeOutAndPlayNewMapMusic(MUS_RG_VICTORY_WILD, 4); @@ -2834,9 +2841,8 @@ static void GetScoreResults(struct DodrioGame_ScoreResults *dst, u8 playerId) *dst = sGame->scoreResults[playerId]; } -// Unused // Returns where the specified player's score ranks, 0 being first (highest score) -static u8 GetScoreRanking(u8 playerId) +static u8 UNUSED GetScoreRanking(u8 playerId) { u8 i, ranking = 0; u8 numPlayers = sGame->numPlayers; @@ -3068,12 +3074,12 @@ static const u8 *const sDebug_PlayerNames[] = sText_Digits }; -static void Debug_UpdateNumPlayers(void) +static void UNUSED Debug_UpdateNumPlayers(void) { sGame->numPlayers = GetLinkPlayerCount(); } -static void Debug_SetPlayerNamesAndResults(void) +static void UNUSED Debug_SetPlayerNamesAndResults(void) { u8 i, playerId; @@ -3586,8 +3592,8 @@ static const u8 sUnsharedColumns_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS] = {1, 3, 5, 6, 9}, }; -static const u16 sBg_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/bg.gbapal", - "graphics/dodrio_berry_picking/tree_border.gbapal"); +static const u16 sBg_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/tree_border.gbapal", + "graphics/dodrio_berry_picking/bg.gbapal"); static const u16 sDodrioNormal_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/dodrio.gbapal"); static const u16 sDodrioShiny_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/shiny.gbapal"); static const u16 sStatus_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/status.gbapal"); @@ -4253,8 +4259,7 @@ static void SetBerryAnim(u16 id, u8 animNum) StartSpriteAnim(&gSprites[*sBerrySpriteIds[id]], animNum); } -// Unused -static void UnusedSetSpritePos(u8 spriteId) +static void UNUSED UnusedSetSpritePos(u8 spriteId) { gSprites[spriteId].x = 20 * spriteId + 50; gSprites[spriteId].y = 50; @@ -4486,8 +4491,7 @@ static void InitGameGfx(struct DodrioGame_Gfx *ptr) SetGfxFunc(LoadGfx); } -// Unused -static void FreeAllWindowBuffers_(void) +static void UNUSED FreeAllWindowBuffers_(void) { FreeAllWindowBuffers(); } diff --git a/src/easy_chat.c b/src/easy_chat.c index 35ba633cf4..8e93ca310e 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -230,7 +230,7 @@ enum { PALTAG_TRIANGLE_CURSOR, PALTAG_RECTANGLE_CURSOR, PALTAG_MISC_UI, - PALTAG_RS_INTERVIEW_FRAME, + PALTAG_RS_INTERVIEW_FRAME, }; enum { @@ -240,7 +240,7 @@ enum { GFXTAG_START_SELECT_BUTTONS, GFXTAG_MODE_WINDOW, GFXTAG_RS_INTERVIEW_FRAME, - GFXTAG_BUTTON_WINDOW, + GFXTAG_BUTTON_WINDOW, }; @@ -2758,7 +2758,7 @@ static void GetEasyChatConfirmDeletionText(const u8 **str1, const u8 **str2) *str2 = gText_BeDeletedThatOkay; } -static void GetKeyboardCursorColAndRow(u8 *column, u8 *row) +static void GetKeyboardCursorColAndRow(s8 *column, s8 *row) { *column = sEasyChatScreen->keyboardColumn; *row = sEasyChatScreen->keyboardRow; @@ -2774,7 +2774,7 @@ static u8 GetKeyboardScrollOffset(void) return sEasyChatScreen->keyboardScrollOffset; } -static void GetWordSelectColAndRow(u8 *column, u8 *row) +static void GetWordSelectColAndRow(s8 *column, s8 *row) { *column = sEasyChatScreen->wordSelectColumn; *row = sEasyChatScreen->wordSelectRow; @@ -2790,7 +2790,7 @@ static u8 GetWordSelectLastRow(void) return sEasyChatScreen->wordSelectLastRow; } -static u8 UnusedDummy(void) +static u8 UNUSED UnusedDummy(void) { return FALSE; } @@ -3930,12 +3930,12 @@ static void LoadEasyChatPalettes(void) { ResetPaletteFade(); LoadPalette(gEasyChatMode_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); - LoadPalette(sTextInputFrameOrange_Pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); - LoadPalette(sTextInputFrameGreen_Pal, BG_PLTT_ID(4), PLTT_SIZE_4BPP); - LoadPalette(sTitleText_Pal, BG_PLTT_ID(10), PLTT_SIZEOF(4)); - LoadPalette(sText_Pal, BG_PLTT_ID(11), PLTT_SIZEOF(6)); - LoadPalette(sText_Pal, BG_PLTT_ID(15), PLTT_SIZEOF(6)); - LoadPalette(sText_Pal, BG_PLTT_ID(3), PLTT_SIZEOF(6)); + LoadPalette(sTextInputFrameOrange_Pal, BG_PLTT_ID(1), sizeof(sTextInputFrameOrange_Pal)); + LoadPalette(sTextInputFrameGreen_Pal, BG_PLTT_ID(4), sizeof(sTextInputFrameGreen_Pal)); + LoadPalette(sTitleText_Pal, BG_PLTT_ID(10), sizeof(sTitleText_Pal)); + LoadPalette(sText_Pal, BG_PLTT_ID(11), sizeof(sText_Pal)); + LoadPalette(sText_Pal, BG_PLTT_ID(15), sizeof(sText_Pal)); + LoadPalette(sText_Pal, BG_PLTT_ID(3), sizeof(sText_Pal)); } static void PrintTitle(void) @@ -5264,7 +5264,7 @@ u8 *ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows return dest; } -static u8 *UnusedConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows) +static u8 UNUSED *UnusedConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows) { u16 i, j, k; u16 numColumns; @@ -5503,8 +5503,7 @@ u16 UnlockRandomTrendySaying(void) return EC_EMPTY_WORD; } -// Unused -static u16 GetRandomUnlockedTrendySaying(void) +static u16 UNUSED GetRandomUnlockedTrendySaying(void) { u16 i; u16 n = GetNumTrendySayingsUnlocked(); @@ -5650,8 +5649,7 @@ static u8 GetUnlockedEasyChatGroupId(u8 index) return sWordData->unlockedGroupIds[index]; } -// Unused -static u8 *BufferEasyChatWordGroupName(u8 *dest, u8 groupId, u16 totalChars) +static u8 UNUSED *BufferEasyChatWordGroupName(u8 *dest, u8 groupId, u16 totalChars) { u16 i; u8 *str = StringCopy(dest, sEasyChatGroupNamePointers[groupId]); diff --git a/src/egg_hatch.c b/src/egg_hatch.c index 96d431a226..abf1aff841 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -399,7 +399,7 @@ void ScriptHatchMon(void) static bool8 _CheckDaycareMonReceivedMail(struct DayCare *daycare, u8 daycareId) { - u8 nickname[32]; + u8 nickname[max(32, POKEMON_NAME_BUFFER_SIZE)]; struct DaycareMon *daycareMon = &daycare->mons[daycareId]; GetBoxMonNickname(&daycareMon->mon, nickname); @@ -781,7 +781,7 @@ static void SpriteCB_Egg_Shake3(struct Sprite *sprite) { if (++sprite->sTimer > 38) { - u16 species; + u16 UNUSED species; sprite->callback = SpriteCB_Egg_WaitHatch; sprite->sTimer = 0; species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyId], MON_DATA_SPECIES); diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c index 894ad00123..c5b8712b5c 100755 --- a/src/ereader_helpers.c +++ b/src/ereader_helpers.c @@ -753,11 +753,11 @@ void EReaderHelper_SerialCallback(void) switch (sSendRecvMgr.state) { case EREADER_XFR_STATE_HANDSHAKE: - REG_SIOMLT_SEND = 0xCCD0; // Handshake id + REG_SIOMLT_SEND = EREADER_HANDSHAKE; *(u64 *)recv = REG_SIOMLT_RECV; for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++) { - if (recv[i] == 0xCCD0) + if (recv[i] == EREADER_HANDSHAKE) cnt1++; else if (recv[i] != 0xFFFF) cnt2++; diff --git a/src/event_data.c b/src/event_data.c index 22ebdb0d1d..e3ee3dedb2 100644 --- a/src/event_data.c +++ b/src/event_data.c @@ -2,11 +2,6 @@ #include "event_data.h" #include "pokedex.h" -#define NUM_SPECIAL_FLAGS (SPECIAL_FLAGS_END - SPECIAL_FLAGS_START + 1) -#define NUM_TEMP_FLAGS (TEMP_FLAGS_END - TEMP_FLAGS_START + 1) -#define NUM_DAILY_FLAGS (DAILY_FLAGS_END - DAILY_FLAGS_START + 1) -#define NUM_TEMP_VARS (TEMP_VARS_END - TEMP_VARS_START + 1) - #define SPECIAL_FLAGS_SIZE (NUM_SPECIAL_FLAGS / 8) // 8 flags per byte #define TEMP_FLAGS_SIZE (NUM_TEMP_FLAGS / 8) #define DAILY_FLAGS_SIZE (NUM_DAILY_FLAGS / 8) @@ -43,8 +38,8 @@ void InitEventData(void) void ClearTempFieldEventData(void) { - memset(gSaveBlock1Ptr->flags + (TEMP_FLAGS_START / 8), 0, TEMP_FLAGS_SIZE); - memset(gSaveBlock1Ptr->vars + ((TEMP_VARS_START - VARS_START) * 2), 0, TEMP_VARS_SIZE); + memset(&gSaveBlock1Ptr->flags[TEMP_FLAGS_START / 8], 0, TEMP_FLAGS_SIZE); + memset(&gSaveBlock1Ptr->vars[TEMP_VARS_START - VARS_START], 0, TEMP_VARS_SIZE); FlagClear(FLAG_SYS_ENC_UP_ITEM); FlagClear(FLAG_SYS_ENC_DOWN_ITEM); FlagClear(FLAG_SYS_USE_STRENGTH); @@ -54,7 +49,7 @@ void ClearTempFieldEventData(void) void ClearDailyFlags(void) { - memset(gSaveBlock1Ptr->flags + (DAILY_FLAGS_START / 8), 0, DAILY_FLAGS_SIZE); + memset(&gSaveBlock1Ptr->flags[DAILY_FLAGS_START / 8], 0, DAILY_FLAGS_SIZE); } void DisableNationalPokedex(void) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index d406eca1bf..2a84f7450b 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -144,9 +144,9 @@ static u8 FindObjectEventPaletteIndexByTag(u16); static void _PatchObjectPalette(u16, u8); static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8); static void SpriteCB_CameraObject(struct Sprite *); -static void CameraObject_0(struct Sprite *); -static void CameraObject_1(struct Sprite *); -static void CameraObject_2(struct Sprite *); +static void CameraObject_Init(struct Sprite *); +static void CameraObject_UpdateMove(struct Sprite *); +static void CameraObject_UpdateFrozen(struct Sprite *); static const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8, const struct ObjectEventTemplate *, u8); static void ClearObjectEventMovement(struct ObjectEvent *, struct Sprite *); static void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8); @@ -193,10 +193,16 @@ static const struct SpriteTemplate sCameraSpriteTemplate = { .callback = SpriteCB_CameraObject }; +enum { + CAMERA_STATE_INIT, + CAMERA_STATE_MOVE, + CAMERA_STATE_FROZEN, +}; + static void (*const sCameraObjectFuncs[])(struct Sprite *) = { - CameraObject_0, - CameraObject_1, - CameraObject_2, + [CAMERA_STATE_INIT] = CameraObject_Init, + [CAMERA_STATE_MOVE] = CameraObject_UpdateMove, + [CAMERA_STATE_FROZEN] = CameraObject_UpdateFrozen, }; #include "data/object_events/object_event_graphics.h" @@ -498,7 +504,7 @@ static const struct SpritePalette sObjectEventSpritePalettes[] = { {gObjectEventPal_RubySapphireBrendan, OBJ_EVENT_PAL_TAG_RS_BRENDAN}, {gObjectEventPal_RubySapphireMay, OBJ_EVENT_PAL_TAG_RS_MAY}, #ifdef BUGFIX - {NULL, OBJ_EVENT_PAL_TAG_NONE}, + {NULL, OBJ_EVENT_PAL_TAG_NONE}, #else {}, // BUG: FindObjectEventPaletteIndexByTag looks for OBJ_EVENT_PAL_TAG_NONE and not 0x0. // If it's looking for a tag that isn't in this table, the game locks in an infinite loop. @@ -1328,7 +1334,7 @@ u8 Unref_TryInitLocalObjectEvent(u8 localId) if (InBattlePyramid()) objectEventCount = GetNumBattlePyramidObjectEvents(); else if (InTrainerHill()) - objectEventCount = 2; + objectEventCount = HILL_TRAINERS_PER_FLOOR; else objectEventCount = gMapHeader.events->objectEventCount; @@ -1644,7 +1650,7 @@ void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) if (InBattlePyramid()) objectCount = GetNumBattlePyramidObjectEvents(); else if (InTrainerHill()) - objectCount = 2; + objectCount = HILL_TRAINERS_PER_FLOOR; else objectCount = gMapHeader.events->objectEventCount; @@ -1840,7 +1846,7 @@ void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) sprite->x += 8; sprite->y += 16 + sprite->centerToCornerVecY; if (objectEvent->trackedByCamera) - CameraObjectReset1(); + CameraObjectReset(); } void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) @@ -2011,8 +2017,7 @@ static void LoadObjectEventPalette(u16 paletteTag) LoadSpritePaletteIfTagExists(&sObjectEventSpritePalettes[i]); } -// Unused -static void LoadObjectEventPaletteSet(u16 *paletteTags) +static void UNUSED LoadObjectEventPaletteSet(u16 *paletteTags) { u8 i; @@ -2094,8 +2099,7 @@ static void _PatchObjectPalette(u16 tag, u8 slot) PatchObjectPalette(tag, slot); } -// Unused -static void IncrementObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) +static void UNUSED IncrementObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) { objectEvent->previousCoords.x = objectEvent->currentCoords.x; objectEvent->previousCoords.y = objectEvent->currentCoords.y; @@ -2134,7 +2138,7 @@ void MoveObjectEventToMapCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) sprite->y += 16 + sprite->centerToCornerVecY; ResetObjectEventFldEffData(objectEvent); if (objectEvent->trackedByCamera) - CameraObjectReset1(); + CameraObjectReset(); } void TryMoveObjectEventToMapCoords(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) @@ -2210,15 +2214,15 @@ void UpdateObjectEventsForCameraUpdate(s16 x, s16 y) RemoveObjectEventsOutsideView(); } -#define sLinkedSpriteId data[0] -#define sState data[1] - -u8 AddCameraObject(u8 linkedSpriteId) +// The "CameraObject" functions below are responsible for an invisible sprite +// that follows the movements of a different sprite (normally the player's sprite) +// and tracks x/y movement distances for the camera so it knows where to move. +u8 AddCameraObject(u8 followSpriteId) { u8 spriteId = CreateSprite(&sCameraSpriteTemplate, 0, 0, 4); gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].sLinkedSpriteId = linkedSpriteId; + gSprites[spriteId].sCamera_FollowSpriteId = followSpriteId; return spriteId; } @@ -2227,35 +2231,37 @@ static void SpriteCB_CameraObject(struct Sprite *sprite) void (*callbacks[ARRAY_COUNT(sCameraObjectFuncs)])(struct Sprite *); memcpy(callbacks, sCameraObjectFuncs, sizeof sCameraObjectFuncs); - callbacks[sprite->sState](sprite); + callbacks[sprite->sCamera_State](sprite); } -static void CameraObject_0(struct Sprite *sprite) +static void CameraObject_Init(struct Sprite *sprite) { - sprite->x = gSprites[sprite->sLinkedSpriteId].x; - sprite->y = gSprites[sprite->sLinkedSpriteId].y; + sprite->x = gSprites[sprite->sCamera_FollowSpriteId].x; + sprite->y = gSprites[sprite->sCamera_FollowSpriteId].y; sprite->invisible = TRUE; - sprite->sState = 1; - CameraObject_1(sprite); + sprite->sCamera_State = CAMERA_STATE_MOVE; + CameraObject_UpdateMove(sprite); } -static void CameraObject_1(struct Sprite *sprite) +static void CameraObject_UpdateMove(struct Sprite *sprite) { - s16 x = gSprites[sprite->sLinkedSpriteId].x; - s16 y = gSprites[sprite->sLinkedSpriteId].y; + s16 x = gSprites[sprite->sCamera_FollowSpriteId].x; + s16 y = gSprites[sprite->sCamera_FollowSpriteId].y; - sprite->data[2] = x - sprite->x; - sprite->data[3] = y - sprite->y; + sprite->sCamera_MoveX = x - sprite->x; + sprite->sCamera_MoveY = y - sprite->y; sprite->x = x; sprite->y = y; } -static void CameraObject_2(struct Sprite *sprite) +// Invisible sprite will continue to follow the parent sprite, +// but no corresponding camera movement will be shown. +static void CameraObject_UpdateFrozen(struct Sprite *sprite) { - sprite->x = gSprites[sprite->sLinkedSpriteId].x; - sprite->y = gSprites[sprite->sLinkedSpriteId].y; - sprite->data[2] = 0; - sprite->data[3] = 0; + sprite->x = gSprites[sprite->sCamera_FollowSpriteId].x; + sprite->y = gSprites[sprite->sCamera_FollowSpriteId].y; + sprite->sCamera_MoveX = 0; + sprite->sCamera_MoveY = 0; } static struct Sprite *FindCameraSprite(void) @@ -2270,52 +2276,43 @@ static struct Sprite *FindCameraSprite(void) return NULL; } -void CameraObjectReset1(void) +void CameraObjectReset(void) { - struct Sprite *camera; - - camera = FindCameraSprite(); + struct Sprite *camera = FindCameraSprite(); if (camera != NULL) { - camera->sState = 0; + camera->sCamera_State = CAMERA_STATE_INIT; camera->callback(camera); } } void CameraObjectSetFollowedSpriteId(u8 spriteId) { - struct Sprite *camera; - - camera = FindCameraSprite(); + struct Sprite *camera = FindCameraSprite(); if (camera != NULL) { - camera->sLinkedSpriteId = spriteId; - CameraObjectReset1(); + camera->sCamera_FollowSpriteId = spriteId; + CameraObjectReset(); } } -// Unused -static u8 CameraObjectGetFollowedSpriteId(void) +static u8 UNUSED CameraObjectGetFollowedSpriteId(void) { - struct Sprite *camera; - - camera = FindCameraSprite(); + struct Sprite *camera = FindCameraSprite(); if (camera == NULL) return MAX_SPRITES; - return camera->sLinkedSpriteId; + return camera->sCamera_FollowSpriteId; } -void CameraObjectReset2(void) +void CameraObjectFreeze(void) { - // UB: Possible null dereference -#ifdef UBFIX struct Sprite *camera = FindCameraSprite(); - if (camera) - camera->sState = 2; -#else - FindCameraSprite()->sState = 2; -#endif // UBFIX +#ifdef UBFIX // Possible null dereference + if (camera == NULL) + return; +#endif + camera->sCamera_State = CAMERA_STATE_FROZEN; } u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) @@ -2392,8 +2389,7 @@ static u16 GetObjectEventFlagIdByObjectEventId(u8 objectEventId) return GetObjectEventFlagIdByLocalIdAndMap(gObjectEvents[objectEventId].localId, gObjectEvents[objectEventId].mapNum, gObjectEvents[objectEventId].mapGroup); } -// Unused -static u8 GetObjectTrainerTypeByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +static u8 UNUSED GetObjectTrainerTypeByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { u8 objectEventId; @@ -2403,8 +2399,7 @@ static u8 GetObjectTrainerTypeByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup return gObjectEvents[objectEventId].trainerType; } -// Unused -static u8 GetObjectTrainerTypeByObjectEventId(u8 objectEventId) +static u8 UNUSED GetObjectTrainerTypeByObjectEventId(u8 objectEventId) { return gObjectEvents[objectEventId].trainerType; } @@ -4767,8 +4762,7 @@ void MoveCoords(u8 direction, s16 *x, s16 *y) *y += sDirectionToVectors[direction].y; } -// Unused -static void MoveCoordsInMapCoordIncrement(u8 direction, s16 *x, s16 *y) +static void UNUSED MoveCoordsInMapCoordIncrement(u8 direction, s16 *x, s16 *y) { *x += sDirectionToVectors[direction].x << 4; *y += sDirectionToVectors[direction].y << 4; @@ -7912,10 +7906,10 @@ static void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent *objEvent, st // each byte in that row is for the next direction of the bike in the order // of down, up, left, right. static const u8 bikeTireTracks_Transitions[4][4] = { - 1, 2, 7, 8, - 1, 2, 6, 5, - 5, 8, 3, 4, - 6, 7, 3, 4, + {1, 2, 7, 8}, + {1, 2, 6, 5}, + {5, 8, 3, 4}, + {6, 7, 3, 4}, }; if (objEvent->currentCoords.x != objEvent->previousCoords.x || objEvent->currentCoords.y != objEvent->previousCoords.y) @@ -8080,14 +8074,18 @@ static void DoGroundEffects_OnSpawn(struct ObjectEvent *objEvent, struct Sprite { u32 flags; +#ifdef BUGFIX + if (objEvent->triggerGroundEffectsOnMove && objEvent->localId != OBJ_EVENT_ID_CAMERA) +#else if (objEvent->triggerGroundEffectsOnMove) +#endif { flags = 0; UpdateObjectEventElevationAndPriority(objEvent, sprite); GetAllGroundEffectFlags_OnSpawn(objEvent, &flags); SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite); DoFlaggedGroundEffects(objEvent, sprite, flags); - objEvent->triggerGroundEffectsOnMove = 0; + objEvent->triggerGroundEffectsOnMove = FALSE; objEvent->disableCoveringGroundEffects = 0; } } @@ -8096,7 +8094,11 @@ static void DoGroundEffects_OnBeginStep(struct ObjectEvent *objEvent, struct Spr { u32 flags; +#ifdef BUGFIX + if (objEvent->triggerGroundEffectsOnMove && objEvent->localId != OBJ_EVENT_ID_CAMERA) +#else if (objEvent->triggerGroundEffectsOnMove) +#endif { flags = 0; UpdateObjectEventElevationAndPriority(objEvent, sprite); @@ -8104,7 +8106,7 @@ static void DoGroundEffects_OnBeginStep(struct ObjectEvent *objEvent, struct Spr SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite); filters_out_some_ground_effects(objEvent, &flags); DoFlaggedGroundEffects(objEvent, sprite, flags); - objEvent->triggerGroundEffectsOnMove = 0; + objEvent->triggerGroundEffectsOnMove = FALSE; objEvent->disableCoveringGroundEffects = 0; } } @@ -8113,7 +8115,11 @@ static void DoGroundEffects_OnFinishStep(struct ObjectEvent *objEvent, struct Sp { u32 flags; +#ifdef BUGFIX + if (objEvent->triggerGroundEffectsOnStop && objEvent->localId != OBJ_EVENT_ID_CAMERA) +#else if (objEvent->triggerGroundEffectsOnStop) +#endif { flags = 0; UpdateObjectEventElevationAndPriority(objEvent, sprite); @@ -8584,8 +8590,7 @@ static void SpriteCB_VirtualObject(struct Sprite *sprite) UpdateObjectEventSpriteInvisibility(sprite, sprite->sInvisible); } -// Unused -static void DestroyVirtualObjects(void) +static void UNUSED DestroyVirtualObjects(void) { int i; diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c index a86f16201f..96ff1b52df 100644 --- a/src/evolution_graphics.c +++ b/src/evolution_graphics.c @@ -409,7 +409,7 @@ static void Task_Sparkles_SprayAndFlash_Init(u8 taskId) { SetEvoSparklesMatrices(); gTasks[taskId].tTimer = 0; - CpuSet(&gPlttBufferFaded[0x20], &gPlttBufferUnfaded[0x20], 0x30); + CpuCopy16(&gPlttBufferFaded[BG_PLTT_ID(2)], &gPlttBufferUnfaded[BG_PLTT_ID(2)], 3 * PLTT_SIZE_4BPP); BeginNormalPaletteFade(0xFFF9041C, 0, 0, 0x10, RGB_WHITE); // was 0xFFF9001C in R/S gTasks[taskId].func = Task_Sparkles_SprayAndFlash; PlaySE(SE_M_PETAL_DANCE); @@ -458,7 +458,7 @@ static void Task_Sparkles_SprayAndFlashTrade_Init(u8 taskId) { SetEvoSparklesMatrices(); gTasks[taskId].tTimer = 0; - CpuSet(&gPlttBufferFaded[0x20], &gPlttBufferUnfaded[0x20], 0x30); + CpuCopy16(&gPlttBufferFaded[BG_PLTT_ID(2)], &gPlttBufferUnfaded[BG_PLTT_ID(2)], 3 * PLTT_SIZE_4BPP); BeginNormalPaletteFade(0xFFF90400, 0, 0, 0x10, RGB_WHITE); // was 0xFFFF0001 in R/S gTasks[taskId].func = Task_Sparkles_SprayAndFlashTrade; PlaySE(SE_M_PETAL_DANCE); @@ -536,13 +536,13 @@ u8 CycleEvolutionMonSprite(u8 preEvoSpriteId, u8 postEvoSpriteId) gSprites[preEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[preEvoSpriteId].oam.matrixNum = MATRIX_PRE_EVO; gSprites[preEvoSpriteId].invisible = FALSE; - CpuSet(monPalette, &gPlttBufferFaded[0x100 + (gSprites[preEvoSpriteId].oam.paletteNum * 16)], 16); + CpuSet(monPalette, &gPlttBufferFaded[OBJ_PLTT_ID(gSprites[preEvoSpriteId].oam.paletteNum)], 16); gSprites[postEvoSpriteId].callback = SpriteCB_EvolutionMonSprite; gSprites[postEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[postEvoSpriteId].oam.matrixNum = MATRIX_POST_EVO; gSprites[postEvoSpriteId].invisible = FALSE; - CpuSet(monPalette, &gPlttBufferFaded[0x100 + (gSprites[postEvoSpriteId].oam.paletteNum * 16)], 16); + CpuSet(monPalette, &gPlttBufferFaded[OBJ_PLTT_ID(gSprites[postEvoSpriteId].oam.paletteNum)], 16); gTasks[taskId].tEvoStopped = FALSE; return taskId; diff --git a/src/evolution_scene.c b/src/evolution_scene.c index eeb22edd24..133afe3b0d 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -208,7 +208,7 @@ void BeginEvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, bool8 canStopE void EvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, bool8 canStopEvo, u8 partyId) { - u8 name[20]; + u8 name[POKEMON_NAME_BUFFER_SIZE]; u16 currSpecies; u32 trainerId, personality; const struct CompressedSpritePalette* pokePal; @@ -298,7 +298,7 @@ void EvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, bool8 canStopEvo, u gTasks[id].tEvoWasStopped = FALSE; gTasks[id].tPartyId = partyId; - memcpy(&sEvoStructPtr->savedPalette, &gPlttBufferUnfaded[0x20], sizeof(sEvoStructPtr->savedPalette)); + memcpy(&sEvoStructPtr->savedPalette, &gPlttBufferUnfaded[BG_PLTT_ID(2)], sizeof(sEvoStructPtr->savedPalette)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP); @@ -467,7 +467,7 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) void TradeEvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, u8 preEvoSpriteId, u8 partyId) { - u8 name[20]; + u8 name[POKEMON_NAME_BUFFER_SIZE]; u16 currSpecies; u32 trainerId, personality; const struct CompressedSpritePalette* pokePal; @@ -741,7 +741,7 @@ static void Task_EvolutionScene(u8 taskId) if (IsSEPlaying()) { m4aMPlayAllStop(); - memcpy(&gPlttBufferUnfaded[0x20], sEvoStructPtr->savedPalette, sizeof(sEvoStructPtr->savedPalette)); + memcpy(&gPlttBufferUnfaded[BG_PLTT_ID(2)], sEvoStructPtr->savedPalette, sizeof(sEvoStructPtr->savedPalette)); RestoreBgAfterAnim(); BeginNormalPaletteFade(0x1C, 0, 0x10, 0, RGB_BLACK); gTasks[taskId].tState++; @@ -775,8 +775,7 @@ static void Task_EvolutionScene(u8 taskId) var = MonTryLearningNewMove(mon, gTasks[taskId].tLearnsFirstMove); if (var != MOVE_NONE && !gTasks[taskId].tEvoWasStopped) { - u8 text[20]; - + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; if (!(gTasks[taskId].tBits & TASK_BIT_LEARN_MOVE)) { StopMapMusic(); @@ -786,8 +785,8 @@ static void Task_EvolutionScene(u8 taskId) gTasks[taskId].tBits |= TASK_BIT_LEARN_MOVE; gTasks[taskId].tLearnsFirstMove = FALSE; gTasks[taskId].tLearnMoveState = MVSTATE_INTRO_MSG_1; - GetMonData(mon, MON_DATA_NICKNAME, text); - StringCopy_Nickname(gBattleTextBuff1, text); + GetMonData(mon, MON_DATA_NICKNAME, nickname); + StringCopy_Nickname(gBattleTextBuff1, nickname); if (var == MON_HAS_MAX_MOVES) gTasks[taskId].tState = EVOSTATE_REPLACE_MOVE; @@ -1170,7 +1169,7 @@ static void Task_TradeEvolutionScene(u8 taskId) // Restore bg, do mon anim/cry Free(sBgAnimPal); EvoScene_DoMonAnimAndCry(sEvoStructPtr->postEvoSpriteId, gTasks[taskId].tPostEvoSpecies); - memcpy(&gPlttBufferUnfaded[0x20], sEvoStructPtr->savedPalette, sizeof(sEvoStructPtr->savedPalette)); + memcpy(&gPlttBufferUnfaded[BG_PLTT_ID(2)], sEvoStructPtr->savedPalette, sizeof(sEvoStructPtr->savedPalette)); gTasks[taskId].tState++; } break; @@ -1195,13 +1194,12 @@ static void Task_TradeEvolutionScene(u8 taskId) var = MonTryLearningNewMove(mon, gTasks[taskId].tLearnsFirstMove); if (var != MOVE_NONE && !gTasks[taskId].tEvoWasStopped) { - u8 text[20]; - + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; gTasks[taskId].tBits |= TASK_BIT_LEARN_MOVE; gTasks[taskId].tLearnsFirstMove = FALSE; gTasks[taskId].tLearnMoveState = 0; - GetMonData(mon, MON_DATA_NICKNAME, text); - StringCopy_Nickname(gBattleTextBuff1, text); + GetMonData(mon, MON_DATA_NICKNAME, nickname); + StringCopy_Nickname(gBattleTextBuff1, nickname); if (var == MON_HAS_MAX_MOVES) gTasks[taskId].tState = T_EVOSTATE_REPLACE_MOVE; @@ -1636,8 +1634,7 @@ static void StartBgAnimation(bool8 isLink) CreateBgAnimTask(isLink); } -// Unused -static void PauseBgPaletteAnim(void) +static void UNUSED PauseBgPaletteAnim(void) { u8 taskId = FindTaskIdByFunc(Task_UpdateBgPalette); diff --git a/src/field_camera.c b/src/field_camera.c index 3f7e29208c..31ebc63c05 100644 --- a/src/field_camera.c +++ b/src/field_camera.c @@ -331,8 +331,8 @@ static void CameraUpdateCallback(struct CameraObject *fieldCamera) { if (fieldCamera->spriteId != 0) { - fieldCamera->movementSpeedX = gSprites[fieldCamera->spriteId].data[2]; - fieldCamera->movementSpeedY = gSprites[fieldCamera->spriteId].data[3]; + fieldCamera->movementSpeedX = gSprites[fieldCamera->spriteId].sCamera_MoveX; + fieldCamera->movementSpeedY = gSprites[fieldCamera->spriteId].sCamera_MoveY; } } diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index e5d3823b3d..eca9de304e 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -609,8 +609,7 @@ static bool8 TryStartStepCountScript(u16 metatileBehavior) return FALSE; } -// Unused -static void ClearFriendshipStepCounter(void) +static void UNUSED ClearFriendshipStepCounter(void) { VarSet(VAR_FRIENDSHIP_STEP_COUNTER, 0); } diff --git a/src/field_door.c b/src/field_door.c index 756d0dabf1..255233ec23 100644 --- a/src/field_door.c +++ b/src/field_door.c @@ -408,7 +408,7 @@ static bool32 AnimateDoorFrame(struct DoorGraphics *gfx, struct DoorAnimFrame *f static void Task_AnimateDoor(u8 taskId) { - u16 *data = gTasks[taskId].data; + u16 *data = (u16*) gTasks[taskId].data; struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(tFramesHi << 16 | tFramesLo); struct DoorGraphics *gfx = (struct DoorGraphics *)(tGfxHi << 16 | tGfxLo); @@ -502,8 +502,8 @@ static s8 GetDoorSoundType(const struct DoorGraphics *gfx, u32 x, u32 y) return gfx->sound; } -// Unused. Debug? Same as FieldAnimateDoorOpen but doesnt return or check if metatile is actually a door -static void Debug_FieldAnimateDoorOpen(u32 x, u32 y) +// Debug? Same as FieldAnimateDoorOpen but doesnt return or check if metatile is actually a door +static void UNUSED Debug_FieldAnimateDoorOpen(u32 x, u32 y) { StartDoorOpenAnimation(sDoorAnimGraphicsTable, x, y); } diff --git a/src/field_effect.c b/src/field_effect.c index b1c894fea3..574484ac11 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -270,7 +270,7 @@ static const u32 sHofMonitorBig_Gfx[] = INCBIN_U32("graphics/field_effects/pics/ static const u8 sHofMonitorSmall_Gfx[] = INCBIN_U8("graphics/field_effects/pics/hof_monitor_small.4bpp"); static const u16 sHofMonitor_Pal[16] = INCBIN_U16("graphics/field_effects/palettes/hof_monitor.gbapal"); -// Graphics for the lights streaking past your Pokemon when it uses a field move. +// Graphics for the lights streaking past your Pokémon when it uses a field move. static const u32 sFieldMoveStreaksOutdoors_Gfx[] = INCBIN_U32("graphics/field_effects/pics/field_move_streaks.4bpp"); static const u16 sFieldMoveStreaksOutdoors_Pal[16] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks.gbapal"); static const u16 sFieldMoveStreaksOutdoors_Tilemap[320] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks.bin"); @@ -916,7 +916,7 @@ u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buf return CreateSprite(&spriteTemplate, x, y, subpriority); } -void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) +static void UNUSED LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) { LZDecompressVram(gTrainerFrontPicTable[gender].data, dest); LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, PLTT_SIZE_4BPP); @@ -1206,14 +1206,14 @@ static void PokeballGlowEffect_Flash1(struct Sprite *sprite) sprite->data[3]++; } phase = (sprite->sCounter + 3) & 3; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW) << 4) + 0x108, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW)) + 8, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); phase = (sprite->sCounter + 2) & 3; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW) << 4) + 0x106, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW)) + 6, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); phase = (sprite->sCounter + 1) & 3; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW) << 4) + 0x102, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW)) + 2, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); phase = sprite->sCounter; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW) << 4) + 0x105, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW) << 4) + 0x103, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW)) + 5, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW)) + 3, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); if (sprite->data[3] > 2) { sprite->sState++; @@ -1237,19 +1237,17 @@ static void PokeballGlowEffect_Flash2(struct Sprite *sprite) } } phase = sprite->sCounter; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW) << 4) + 0x108, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW) << 4) + 0x106, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW) << 4) + 0x102, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW) << 4) + 0x105, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW) << 4) + 0x103, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW)) + 8, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW)) + 6, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW)) + 2, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW)) + 5, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_POKEBALL_GLOW)) + 3, sPokeballGlowReds[phase], sPokeballGlowGreens[phase], sPokeballGlowBlues[phase]); } static void PokeballGlowEffect_WaitAfterFlash(struct Sprite *sprite) { if ((--sprite->sTimer) == 0) - { sprite->sState++; - } } static void PokeballGlowEffect_Dummy(struct Sprite *sprite) @@ -1462,7 +1460,7 @@ static bool8 FallWarpEffect_Init(struct Task *task) struct Sprite *playerSprite; playerObject = &gObjectEvents[gPlayerAvatar.objectEventId]; playerSprite = &gSprites[gPlayerAvatar.spriteId]; - CameraObjectReset2(); + CameraObjectFreeze(); gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE; gPlayerAvatar.preventStep = TRUE; ObjectEventSetHeldMovement(playerObject, GetFaceDirectionMovementAction(GetPlayerFacingDirection())); @@ -1558,7 +1556,7 @@ static bool8 FallWarpEffect_End(struct Task *task) { gPlayerAvatar.preventStep = FALSE; UnlockPlayerFieldControls(); - CameraObjectReset1(); + CameraObjectReset(); UnfreezeObjectEvents(); InstallCameraPanAheadCallback(); DestroyTask(FindTaskIdByFunc(Task_FallWarpFieldEffect)); @@ -1597,7 +1595,7 @@ static void Task_EscalatorWarpOut(u8 taskId) static bool8 EscalatorWarpOut_Init(struct Task *task) { FreezeObjectEvents(); - CameraObjectReset2(); + CameraObjectFreeze(); StartEscalator(task->tGoingUp); task->tState++; return FALSE; @@ -1729,7 +1727,7 @@ static bool8 EscalatorWarpIn_Init(struct Task *task) s16 x; s16 y; u8 behavior; - CameraObjectReset2(); + CameraObjectFreeze(); objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(DIR_EAST)); PlayerGetDestCoords(&x, &y); @@ -1829,7 +1827,7 @@ static bool8 EscalatorWarpIn_End(struct Task *task) objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { - CameraObjectReset1(); + CameraObjectReset(); UnlockPlayerFieldControls(); ObjectEventSetHeldMovement(objectEvent, GetWalkNormalMovementAction(DIR_EAST)); DestroyTask(FindTaskIdByFunc(Task_EscalatorWarpIn)); @@ -1979,7 +1977,7 @@ static void Task_LavaridgeGymB1FWarp(u8 taskId) static bool8 LavaridgeGymB1FWarpEffect_Init(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) { FreezeObjectEvents(); - CameraObjectReset2(); + CameraObjectFreeze(); SetCameraPanningCallback(NULL); gPlayerAvatar.preventStep = TRUE; objectEvent->fixedPriority = 1; @@ -2094,7 +2092,7 @@ static void Task_LavaridgeGymB1FWarpExit(u8 taskId) static bool8 LavaridgeGymB1FWarpExitEffect_Init(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) { - CameraObjectReset2(); + CameraObjectFreeze(); FreezeObjectEvents(); gPlayerAvatar.preventStep = TRUE; objectEvent->invisible = TRUE; @@ -2123,7 +2121,7 @@ static bool8 LavaridgeGymB1FWarpExitEffect_PopOut(struct Task *task, struct Obje { task->data[0]++; objectEvent->invisible = FALSE; - CameraObjectReset1(); + CameraObjectReset(); PlaySE(SE_M_DIG); ObjectEventSetHeldMovement(objectEvent, GetJumpMovementAction(DIR_EAST)); } @@ -2172,7 +2170,7 @@ static void Task_LavaridgeGym1FWarp(u8 taskId) static bool8 LavaridgeGym1FWarpEffect_Init(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) { FreezeObjectEvents(); - CameraObjectReset2(); + CameraObjectFreeze(); gPlayerAvatar.preventStep = TRUE; objectEvent->fixedPriority = 1; task->data[0]++; @@ -2392,7 +2390,7 @@ static void TeleportWarpOutFieldEffect_Init(struct Task *task) { LockPlayerFieldControls(); FreezeObjectEvents(); - CameraObjectReset2(); + CameraObjectFreeze(); task->data[15] = GetPlayerFacingDirection(); task->tState++; } @@ -2437,7 +2435,7 @@ static void TeleportWarpOutFieldEffect_SpinExit(struct Task *task) { sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; } - if (task->data[4] >= 0xa8) + if (task->data[4] >= DISPLAY_HEIGHT + 8) { task->tState++; TryFadeOutOldMapMusic(); @@ -2474,7 +2472,7 @@ static void FieldCallback_TeleportWarpIn(void) FreezeObjectEvents(); gFieldCallback = NULL; gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE; - CameraObjectReset2(); + CameraObjectFreeze(); CreateTask(Task_TeleportWarpIn, 0); } @@ -2518,7 +2516,7 @@ static void TeleportWarpInFieldEffect_SpinEnter(struct Task *task) if (task->data[13] == 0) { task->data[13]++; - objectEvent->triggerGroundEffectsOnMove = 1; + objectEvent->triggerGroundEffectsOnMove = TRUE; sprite->subspriteMode = task->data[14]; } } else @@ -2558,7 +2556,7 @@ static void TeleportWarpInFieldEffect_SpinGround(struct Task *task) if ((++task->data[2]) > 4 && task->data[14] == objectEvent->facingDirection) { UnlockPlayerFieldControls(); - CameraObjectReset1(); + CameraObjectReset(); UnfreezeObjectEvents(); DestroyTask(FindTaskIdByFunc(Task_TeleportWarpIn)); } @@ -2631,7 +2629,7 @@ static void FieldMoveShowMonOutdoorsEffect_Init(struct Task *task) { task->data[11] = REG_WININ; task->data[12] = REG_WINOUT; - StoreWordInTwoHalfwords(&task->data[13], (u32)gMain.vblankCallback); + StoreWordInTwoHalfwords((u16*) &task->data[13], (u32)gMain.vblankCallback); task->tWinHoriz = WIN_RANGE(DISPLAY_WIDTH, DISPLAY_WIDTH + 1); task->tWinVert = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1); task->tWinIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR; @@ -3290,7 +3288,7 @@ static void FlyOutFieldEffect_FlyOffWithBird(struct Task *task) objectEvent->inanimate = FALSE; objectEvent->hasShadow = FALSE; SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, objectEvent->spriteId); - CameraObjectReset2(); + CameraObjectFreeze(); task->tState++; } } @@ -3505,7 +3503,7 @@ static void FlyInFieldEffect_BirdSwoopDown(struct Task *task) SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_NONE); } ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_SURFING)); - CameraObjectReset2(); + CameraObjectFreeze(); ObjectEventTurn(objectEvent, DIR_WEST); StartSpriteAnim(&gSprites[objectEvent->spriteId], ANIM_GET_ON_OFF_POKEMON_WEST); objectEvent->invisible = FALSE; diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 042c107383..99e23ecdab 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -32,8 +32,12 @@ static void UpdateBobbingEffect(struct ObjectEvent *, struct Sprite *, struct Sp static void SpriteCB_UnderwaterSurfBlob(struct Sprite *); static u32 ShowDisguiseFieldEffect(u8, u8, u8); -// Used by several field effects to determine which of a group it is -#define sFldEff data[1] +// Data used by all the field effects that share UpdateJumpImpactEffect +#define sJumpElevation data[0] +#define sJumpFldEff data[1] + +// Data used by all the field effects that share WaitFieldEffectSpriteAnim +#define sWaitFldEff data[0] #define sReflectionObjEventId data[0] #define sReflectionObjEventLocalId data[1] @@ -44,7 +48,7 @@ void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, boo { struct Sprite *reflectionSprite; - reflectionSprite = &gSprites[CreateCopySpriteAt(sprite, sprite->x, sprite->y, 0x98)]; + reflectionSprite = &gSprites[CreateCopySpriteAt(sprite, sprite->x, sprite->y, 152)]; reflectionSprite->callback = UpdateObjectReflectionSprite; reflectionSprite->oam.priority = 3; reflectionSprite->oam.paletteNum = gReflectionEffectPaletteMap[reflectionSprite->oam.paletteNum]; @@ -92,9 +96,7 @@ static void LoadObjectReflectionPalette(struct ObjectEvent *objectEvent, struct static void LoadObjectRegularReflectionPalette(struct ObjectEvent *objectEvent, u8 paletteIndex) { - const struct ObjectEventGraphicsInfo *graphicsInfo; - - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); if (graphicsInfo->reflectionPaletteTag != OBJ_EVENT_PAL_TAG_NONE) { if (graphicsInfo->paletteSlot == PALSLOT_PLAYER) @@ -111,9 +113,7 @@ static void LoadObjectRegularReflectionPalette(struct ObjectEvent *objectEvent, // This is so the sprite blends in with the dark water metatile underneath the bridge. static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent *objectEvent, u8 paletteNum) { - const struct ObjectEventGraphicsInfo *graphicsInfo; - - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); if (graphicsInfo->reflectionPaletteTag != OBJ_EVENT_PAL_TAG_NONE) { PatchObjectPalette(graphicsInfo->reflectionPaletteTag, paletteNum); @@ -123,11 +123,8 @@ static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent *objectEven static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) { - struct ObjectEvent *objectEvent; - struct Sprite *mainSprite; - - objectEvent = &gObjectEvents[reflectionSprite->sReflectionObjEventId]; - mainSprite = &gSprites[objectEvent->spriteId]; + struct ObjectEvent *objectEvent = &gObjectEvents[reflectionSprite->sReflectionObjEventId]; + struct Sprite *mainSprite = &gSprites[objectEvent->spriteId]; if (!objectEvent->active || !objectEvent->hasReflection || objectEvent->localId != reflectionSprite->sReflectionObjEventLocalId) { reflectionSprite->inUse = FALSE; @@ -172,15 +169,15 @@ static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[]; +#define sPrevX data[0] +#define sPrevY data[1] + u8 CreateWarpArrowSprite(void) { - u8 spriteId; - struct Sprite *sprite; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ARROW], 0, 0, 0x52); + u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ARROW], 0, 0, 82); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->oam.priority = 1; sprite->coordOffsetEnabled = TRUE; sprite->invisible = TRUE; @@ -195,24 +192,24 @@ void SetSpriteInvisible(u8 spriteId) void ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y) { - s16 x2; - s16 y2; - struct Sprite *sprite; - - sprite = &gSprites[spriteId]; - if (sprite->invisible || sprite->data[0] != x || sprite->data[1] != y) + struct Sprite *sprite = &gSprites[spriteId]; + if (sprite->invisible || sprite->sPrevX != x || sprite->sPrevY != y) { + s16 x2, y2; SetSpritePosToMapCoords(x, y, &x2, &y2); sprite = &gSprites[spriteId]; sprite->x = x2 + 8; sprite->y = y2 + 8; sprite->invisible = FALSE; - sprite->data[0] = x; - sprite->data[1] = y; + sprite->sPrevX = x; + sprite->sPrevY = y; StartSpriteAnim(sprite, direction - 1); } } +#undef sPrevX +#undef sPrevY + static const u8 sShadowEffectTemplateIds[] = { FLDEFFOBJ_SHADOW_S, FLDEFFOBJ_SHADOW_M, @@ -227,22 +224,24 @@ const u16 gShadowVerticalOffsets[] = { 16 }; +// Sprite data for FLDEFF_SHADOW +#define sLocalId data[0] +#define sMapNum data[1] +#define sMapGroup data[2] +#define sYOffset data[3] + u32 FldEff_Shadow(void) { - u8 objectEventId; - const struct ObjectEventGraphicsInfo *graphicsInfo; - u8 spriteId; - - objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94); + u8 objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); + u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 148); if (spriteId != MAX_SPRITES) { gSprites[spriteId].coordOffsetEnabled = TRUE; - gSprites[spriteId].data[0] = gFieldEffectArguments[0]; - gSprites[spriteId].data[1] = gFieldEffectArguments[1]; - gSprites[spriteId].data[2] = gFieldEffectArguments[2]; - gSprites[spriteId].data[3] = (graphicsInfo->height >> 1) - gShadowVerticalOffsets[graphicsInfo->shadowSize]; + gSprites[spriteId].sLocalId = gFieldEffectArguments[0]; + gSprites[spriteId].sMapNum = gFieldEffectArguments[1]; + gSprites[spriteId].sMapGroup = gFieldEffectArguments[2]; + gSprites[spriteId].sYOffset = (graphicsInfo->height >> 1) - gShadowVerticalOffsets[graphicsInfo->shadowSize]; } return 0; } @@ -250,20 +249,18 @@ u32 FldEff_Shadow(void) void UpdateShadowFieldEffect(struct Sprite *sprite) { u8 objectEventId; - struct ObjectEvent *objectEvent; - struct Sprite *linkedSprite; - if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId)) + if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objectEventId)) { FieldEffectStop(sprite, FLDEFF_SHADOW); } else { - objectEvent = &gObjectEvents[objectEventId]; - linkedSprite = &gSprites[objectEvent->spriteId]; + struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; + struct Sprite *linkedSprite = &gSprites[objectEvent->spriteId]; sprite->oam.priority = linkedSprite->oam.priority; sprite->x = linkedSprite->x; - sprite->y = linkedSprite->y + sprite->data[3]; + sprite->y = linkedSprite->y + sprite->sYOffset; if (!objectEvent->active || !objectEvent->hasShadow || MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->currentMetatileBehavior) @@ -276,6 +273,11 @@ void UpdateShadowFieldEffect(struct Sprite *sprite) } } +#undef sLocalId +#undef sMapNum +#undef sMapGroup +#undef sYOffset + // Sprite data for FLDEFF_TALL_GRASS and FLDEFF_LONG_GRASS #define sElevation data[0] #define sX data[1] @@ -288,18 +290,14 @@ void UpdateShadowFieldEffect(struct Sprite *sprite) u32 FldEff_TallGrass(void) { - s16 x; - s16 y; u8 spriteId; - struct Sprite *sprite; - - x = gFieldEffectArguments[0]; - y = gFieldEffectArguments[1]; + s16 x = gFieldEffectArguments[0]; + s16 y = gFieldEffectArguments[1]; SetSpritePosToOffsetMapCoords(&x, &y, 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_TALL_GRASS], x, y, 0); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->sElevation = gFieldEffectArguments[2]; @@ -317,15 +315,12 @@ u32 FldEff_TallGrass(void) void UpdateTallGrassFieldEffect(struct Sprite *sprite) { - u8 mapNum; - u8 mapGroup; u8 metatileBehavior; u8 localId; u8 objectEventId; - struct ObjectEvent *objectEvent; + u8 mapNum = sprite->sCurrentMap >> 8; + u8 mapGroup = sprite->sCurrentMap; - mapNum = sprite->sCurrentMap >> 8; - mapGroup = sprite->sCurrentMap; if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup)) { sprite->sX -= gCamera.x; @@ -346,11 +341,9 @@ void UpdateTallGrassFieldEffect(struct Sprite *sprite) else { // Check if the object that triggered the effect has moved away - objectEvent = &gObjectEvents[objectEventId]; - if ((objectEvent->currentCoords.x != sprite->sX - || objectEvent->currentCoords.y != sprite->sY) - && (objectEvent->previousCoords.x != sprite->sX - || objectEvent->previousCoords.y != sprite->sY)) + struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; + if ((objectEvent->currentCoords.x != sprite->sX || objectEvent->currentCoords.y != sprite->sY) + && (objectEvent->previousCoords.x != sprite->sX || objectEvent->previousCoords.y != sprite->sY)) sprite->sObjectMoved = TRUE; // Metatile behavior var re-used as subpriority @@ -366,31 +359,28 @@ void UpdateTallGrassFieldEffect(struct Sprite *sprite) u32 FldEff_JumpTallGrass(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_TALL_GRASS], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->sElevation = gFieldEffectArguments[2]; - sprite->sFldEff = FLDEFF_JUMP_TALL_GRASS; + sprite->sJumpElevation = gFieldEffectArguments[2]; + sprite->sJumpFldEff = FLDEFF_JUMP_TALL_GRASS; } return 0; } u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) { - struct Sprite *sprite; u8 i; - for (i = 0; i < MAX_SPRITES; i ++) { if (gSprites[i].inUse) { - sprite = &gSprites[i]; + struct Sprite *sprite = &gSprites[i]; if (sprite->callback == UpdateTallGrassFieldEffect && (x == sprite->sX && y == sprite->sY) && localId == (u8)(sprite->sLocalId) @@ -404,18 +394,14 @@ u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s u32 FldEff_LongGrass(void) { - s16 x; - s16 y; u8 spriteId; - struct Sprite *sprite; - - x = gFieldEffectArguments[0]; - y = gFieldEffectArguments[1]; + s16 x = gFieldEffectArguments[0]; + s16 y = gFieldEffectArguments[1]; SetSpritePosToOffsetMapCoords(&x, &y, 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_LONG_GRASS], x, y, 0); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = ElevationToPriority(gFieldEffectArguments[2]); sprite->sElevation = gFieldEffectArguments[2]; @@ -433,15 +419,12 @@ u32 FldEff_LongGrass(void) void UpdateLongGrassFieldEffect(struct Sprite *sprite) { - u8 mapNum; - u8 mapGroup; u8 metatileBehavior; u8 localId; u8 objectEventId; - struct ObjectEvent *objectEvent; + u8 mapNum = sprite->sCurrentMap >> 8; + u8 mapGroup = sprite->sCurrentMap; - mapNum = sprite->sCurrentMap >> 8; - mapGroup = sprite->sCurrentMap; if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup)) { sprite->sX -= gCamera.x; @@ -451,7 +434,7 @@ void UpdateLongGrassFieldEffect(struct Sprite *sprite) localId = sprite->sLocalId; mapNum = sprite->sMapNum; mapGroup = sprite->sMapGroup; - metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]); + metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->sX, sprite->sY); if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->sObjectMoved && sprite->animEnded)) @@ -461,11 +444,9 @@ void UpdateLongGrassFieldEffect(struct Sprite *sprite) else { // Check if the object that triggered the effect has moved away - objectEvent = &gObjectEvents[objectEventId]; - if ((objectEvent->currentCoords.x != sprite->data[1] - || objectEvent->currentCoords.y != sprite->data[2]) - && (objectEvent->previousCoords.x != sprite->data[1] - || objectEvent->previousCoords.y != sprite->data[2])) + struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; + if ((objectEvent->currentCoords.x != sprite->sX || objectEvent->currentCoords.y != sprite->sY) + && (objectEvent->previousCoords.x != sprite->sX || objectEvent->previousCoords.y != sprite->sY)) sprite->sObjectMoved = TRUE; UpdateObjectEventSpriteInvisibility(sprite, FALSE); @@ -473,6 +454,7 @@ void UpdateLongGrassFieldEffect(struct Sprite *sprite) } } +#undef sElevation #undef sX #undef sY #undef sMapNum @@ -486,41 +468,42 @@ void UpdateLongGrassFieldEffect(struct Sprite *sprite) u32 FldEff_JumpLongGrass(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_LONG_GRASS], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->sElevation = gFieldEffectArguments[2]; - sprite->sFldEff = FLDEFF_JUMP_LONG_GRASS; + sprite->sJumpElevation = gFieldEffectArguments[2]; + sprite->sJumpFldEff = FLDEFF_JUMP_LONG_GRASS; } return 0; } +// Sprite data for FLDEFF_SHORT_GRASS +#define sLocalId data[0] +#define sMapNum data[1] +#define sMapGroup data[2] +#define sPrevX data[3] +#define sPrevY data[4] + u32 FldEff_ShortGrass(void) { - u8 objectEventId; - struct ObjectEvent *objectEvent; - u8 spriteId; - struct Sprite *sprite; - - objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - objectEvent = &gObjectEvents[objectEventId]; - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SHORT_GRASS], 0, 0, 0); + u8 objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; + u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SHORT_GRASS], 0, 0, 0); if (spriteId != MAX_SPRITES) { - sprite = &(gSprites[spriteId]); + struct Sprite *sprite = &(gSprites[spriteId]); sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = gSprites[objectEvent->spriteId].x; - sprite->data[4] = gSprites[objectEvent->spriteId].y; + sprite->sLocalId = gFieldEffectArguments[0]; + sprite->sMapNum = gFieldEffectArguments[1]; + sprite->sMapGroup = gFieldEffectArguments[2]; + sprite->sPrevX = gSprites[objectEvent->spriteId].x; + sprite->sPrevY = gSprites[objectEvent->spriteId].y; } return 0; } @@ -528,32 +511,28 @@ u32 FldEff_ShortGrass(void) void UpdateShortGrassFieldEffect(struct Sprite *sprite) { u8 objectEventId; - s16 x; - s16 y; - const struct ObjectEventGraphicsInfo *graphicsInfo; - struct Sprite *linkedSprite; - if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inShortGrass) + if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objectEventId) || !gObjectEvents[objectEventId].inShortGrass) { FieldEffectStop(sprite, FLDEFF_SHORT_GRASS); } else { - graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); - linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId]; - y = linkedSprite->y; - x = linkedSprite->x; - if (x != sprite->data[3] || y != sprite->data[4]) + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); + struct Sprite *linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId]; + s16 parentY = linkedSprite->y; + s16 parentX = linkedSprite->x; + if (parentX != sprite->sPrevX || parentY != sprite->sPrevY) { - sprite->data[3] = x; - sprite->data[4] = y; + // Parent sprite moved, try to restart the animation + sprite->sPrevX = parentX; + sprite->sPrevY = parentY; if (sprite->animEnded) - { StartSpriteAnim(sprite, 0); - } } - sprite->x = x; - sprite->y = y; + sprite->x = parentX; + sprite->y = parentY; + // Offset the grass sprite halfway down the parent sprite. sprite->y2 = (graphicsInfo->height >> 1) - 8; sprite->subpriority = linkedSprite->subpriority - 1; sprite->oam.priority = linkedSprite->oam.priority; @@ -561,19 +540,29 @@ void UpdateShortGrassFieldEffect(struct Sprite *sprite) } } +#undef sLocalId +#undef sMapNum +#undef sMapGroup +#undef sPrevX +#undef sPrevY + +// Sprite data for FLDEFF_SAND_FOOTPRINTS, FLDEFF_DEEP_SAND_FOOTPRINTS, and FLDEFF_BIKE_TIRE_TRACKS +#define sState data[0] +#define sTimer data[1] +#define sFldEff data[7] + u32 FldEff_SandFootprints(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SAND_FOOTPRINTS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[7] = FLDEFF_SAND_FOOTPRINTS; + sprite->sFldEff = FLDEFF_SAND_FOOTPRINTS; StartSpriteAnim(sprite, gFieldEffectArguments[4]); } return 0; @@ -582,16 +571,15 @@ u32 FldEff_SandFootprints(void) u32 FldEff_DeepSandFootprints(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_DEEP_SAND_FOOTPRINTS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[7] = FLDEFF_DEEP_SAND_FOOTPRINTS; + sprite->sFldEff = FLDEFF_DEEP_SAND_FOOTPRINTS; StartSpriteAnim(sprite, gFieldEffectArguments[4]); } return spriteId; @@ -600,16 +588,15 @@ u32 FldEff_DeepSandFootprints(void) u32 FldEff_BikeTireTracks(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BIKE_TIRE_TRACKS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[7] = FLDEFF_BIKE_TIRE_TRACKS; + sprite->sFldEff = FLDEFF_BIKE_TIRE_TRACKS; StartSpriteAnim(sprite, gFieldEffectArguments[4]); } return spriteId; @@ -622,14 +609,14 @@ void (*const gFadeFootprintsTireTracksFuncs[])(struct Sprite *) = { void UpdateFootprintsTireTracksFieldEffect(struct Sprite *sprite) { - gFadeFootprintsTireTracksFuncs[sprite->data[0]](sprite); + gFadeFootprintsTireTracksFuncs[sprite->sState](sprite); } static void FadeFootprintsTireTracks_Step0(struct Sprite *sprite) { // Wait 40 frames before the flickering starts. - if (++sprite->data[1] > 40) - sprite->data[0] = 1; + if (++sprite->sTimer > 40) + sprite->sState = 1; UpdateObjectEventSpriteInvisibility(sprite, FALSE); } @@ -637,36 +624,37 @@ static void FadeFootprintsTireTracks_Step0(struct Sprite *sprite) static void FadeFootprintsTireTracks_Step1(struct Sprite *sprite) { sprite->invisible ^= 1; - sprite->data[1]++; + sprite->sTimer++; UpdateObjectEventSpriteInvisibility(sprite, sprite->invisible); - if (sprite->data[1] > 56) - { - FieldEffectStop(sprite, sprite->data[7]); - } + if (sprite->sTimer > 56) + FieldEffectStop(sprite, sprite->sFldEff); } +#undef sState +#undef sTimer +#undef sFldEff + +// Sprite data for FLDEFF_SPLASH +#define sLocalId data[0] +#define sMapNum data[1] +#define sMapGroup data[2] + u32 FldEff_Splash(void) { - u8 objectEventId; - struct ObjectEvent *objectEvent; - u8 spriteId; - struct Sprite *sprite; - const struct ObjectEventGraphicsInfo *graphicsInfo; - struct Sprite *linkedSprite; - - objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - objectEvent = &gObjectEvents[objectEventId]; - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPLASH], 0, 0, 0); + u8 objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; + u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPLASH], 0, 0, 0); if (spriteId != MAX_SPRITES) { - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - sprite = &gSprites[spriteId]; + struct Sprite *linkedSprite; + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; linkedSprite = &gSprites[objectEvent->spriteId]; sprite->oam.priority = linkedSprite->oam.priority; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; + sprite->sLocalId = gFieldEffectArguments[0]; + sprite->sMapNum = gFieldEffectArguments[1]; + sprite->sMapGroup = gFieldEffectArguments[2]; sprite->y2 = (graphicsInfo->height >> 1) - 4; PlaySE(SE_PUDDLE); } @@ -677,7 +665,7 @@ void UpdateSplashFieldEffect(struct Sprite *sprite) { u8 objectEventId; - if (sprite->animEnded || TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId)) + if (sprite->animEnded || TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objectEventId)) { FieldEffectStop(sprite, FLDEFF_SPLASH); } @@ -689,20 +677,23 @@ void UpdateSplashFieldEffect(struct Sprite *sprite) } } +#undef sLocalId +#undef sMapNum +#undef sMapGroup + u32 FldEff_JumpSmallSplash(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_SMALL_SPLASH], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = FLDEFF_JUMP_SMALL_SPLASH; + sprite->sJumpElevation = gFieldEffectArguments[2]; + sprite->sJumpFldEff = FLDEFF_JUMP_SMALL_SPLASH; } return 0; } @@ -710,44 +701,44 @@ u32 FldEff_JumpSmallSplash(void) u32 FldEff_JumpBigSplash(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_JUMP_BIG_SPLASH], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = FLDEFF_JUMP_BIG_SPLASH; + sprite->sJumpElevation = gFieldEffectArguments[2]; + sprite->sJumpFldEff = FLDEFF_JUMP_BIG_SPLASH; } return 0; } +// Sprite data for FLDEFF_FEET_IN_FLOWING_WATER +#define sLocalId data[0] +#define sMapNum data[1] +#define sMapGroup data[2] +#define sPrevX data[3] +#define sPrevY data[4] + u32 FldEff_FeetInFlowingWater(void) { - u8 objectEventId; - struct ObjectEvent *objectEvent; - u8 spriteId; - struct Sprite *sprite; - const struct ObjectEventGraphicsInfo *graphicsInfo; - - objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - objectEvent = &gObjectEvents[objectEventId]; - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPLASH], 0, 0, 0); + u8 objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; + u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPLASH], 0, 0, 0); if (spriteId != MAX_SPRITES) { - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - sprite = &gSprites[spriteId]; + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); + struct Sprite *sprite = &gSprites[spriteId]; sprite->callback = UpdateFeetInFlowingWaterFieldEffect; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = -1; - sprite->data[4] = -1; + sprite->sLocalId = gFieldEffectArguments[0]; + sprite->sMapNum = gFieldEffectArguments[1]; + sprite->sMapGroup = gFieldEffectArguments[2]; + sprite->sPrevX = -1; + sprite->sPrevY = -1; sprite->y2 = (graphicsInfo->height >> 1) - 4; StartSpriteAnim(sprite, 1); } @@ -757,69 +748,70 @@ u32 FldEff_FeetInFlowingWater(void) static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *sprite) { u8 objectEventId; - struct Sprite *linkedSprite; - struct ObjectEvent *objectEvent; - if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inShallowFlowingWater) + if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objectEventId) || !gObjectEvents[objectEventId].inShallowFlowingWater) { FieldEffectStop(sprite, FLDEFF_FEET_IN_FLOWING_WATER); } else { - objectEvent = &gObjectEvents[objectEventId]; - linkedSprite = &gSprites[objectEvent->spriteId]; + struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; + struct Sprite *linkedSprite = &gSprites[objectEvent->spriteId]; sprite->x = linkedSprite->x; sprite->y = linkedSprite->y; sprite->subpriority = linkedSprite->subpriority; UpdateObjectEventSpriteInvisibility(sprite, FALSE); - if (objectEvent->currentCoords.x != sprite->data[3] || objectEvent->currentCoords.y != sprite->data[4]) + if (objectEvent->currentCoords.x != sprite->sPrevX || objectEvent->currentCoords.y != sprite->sPrevY) { - sprite->data[3] = objectEvent->currentCoords.x; - sprite->data[4] = objectEvent->currentCoords.y; + sprite->sPrevX = objectEvent->currentCoords.x; + sprite->sPrevY = objectEvent->currentCoords.y; if (!sprite->invisible) - { PlaySE(SE_PUDDLE); - } } } } +#undef sLocalId +#undef sMapNum +#undef sMapGroup +#undef sPrevX +#undef sPrevY + u32 FldEff_Ripple(void) { - u8 spriteId; - struct Sprite *sprite; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_RIPPLE], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_RIPPLE], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_RIPPLE; + sprite->sWaitFldEff = FLDEFF_RIPPLE; } return 0; } +// Sprite data for FLDEFF_HOT_SPRINGS_WATER +#define sLocalId data[0] +#define sMapNum data[1] +#define sMapGroup data[2] +#define sPrevX data[3] +#define sPrevY data[4] + u32 FldEff_HotSpringsWater(void) { - u8 objectEventId; - struct ObjectEvent *objectEvent; - u8 spriteId; - struct Sprite *sprite; - - objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - objectEvent = &gObjectEvents[objectEventId]; - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_HOT_SPRINGS_WATER], 0, 0, 0); + u8 objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; + u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_HOT_SPRINGS_WATER], 0, 0, 0); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = gSprites[objectEvent->spriteId].x; - sprite->data[4] = gSprites[objectEvent->spriteId].y; + sprite->sLocalId = gFieldEffectArguments[0]; + sprite->sMapNum = gFieldEffectArguments[1]; + sprite->sMapGroup = gFieldEffectArguments[2]; + sprite->sPrevX = gSprites[objectEvent->spriteId].x; // Unused + sprite->sPrevY = gSprites[objectEvent->spriteId].y; // Unused } return 0; } @@ -827,17 +819,15 @@ u32 FldEff_HotSpringsWater(void) void UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite) { u8 objectEventId; - const struct ObjectEventGraphicsInfo *graphicsInfo; - struct Sprite *linkedSprite; - if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inHotSprings) + if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objectEventId) || !gObjectEvents[objectEventId].inHotSprings) { FieldEffectStop(sprite, FLDEFF_HOT_SPRINGS_WATER); } else { - graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); - linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId]; + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); + struct Sprite *linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId]; sprite->x = linkedSprite->x; sprite->y = (graphicsInfo->height >> 1) + linkedSprite->y - 8; sprite->subpriority = linkedSprite->subpriority - 1; @@ -845,19 +835,24 @@ void UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite) } } +#undef sLocalId +#undef sMapNum +#undef sMapGroup +#undef sPrevX +#undef sPrevY + u32 FldEff_UnusedGrass(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_GRASS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNUSED_GRASS; + sprite->sWaitFldEff = FLDEFF_UNUSED_GRASS; } return 0; } @@ -865,16 +860,15 @@ u32 FldEff_UnusedGrass(void) u32 FldEff_UnusedGrass2(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_GRASS_2], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNUSED_GRASS_2; + sprite->sWaitFldEff = FLDEFF_UNUSED_GRASS_2; } return 0; } @@ -882,16 +876,15 @@ u32 FldEff_UnusedGrass2(void) u32 FldEff_UnusedSand(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_SAND], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNUSED_SAND; + sprite->sWaitFldEff = FLDEFF_UNUSED_SAND; } return 0; } @@ -899,16 +892,15 @@ u32 FldEff_UnusedSand(void) u32 FldEff_WaterSurfacing(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_WATER_SURFACING], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_WATER_SURFACING; + sprite->sWaitFldEff = FLDEFF_WATER_SURFACING; } return 0; } @@ -933,18 +925,15 @@ void StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 delay) u32 FldEff_Ash(void) { - s16 x; - s16 y; u8 spriteId; - struct Sprite *sprite; - x = gFieldEffectArguments[0]; - y = gFieldEffectArguments[1]; + s16 x = gFieldEffectArguments[0]; + s16 y = gFieldEffectArguments[1]; SetSpritePosToOffsetMapCoords(&x, &y, 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ASH], x, y, gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->sX = gFieldEffectArguments[0]; @@ -998,27 +987,30 @@ static void UpdateAshFieldEffect_End(struct Sprite *sprite) #undef sDelay // Sprite data for FLDEFF_SURF_BLOB -#define tBitfield data[0] -#define tPlayerOffset data[1] -#define tPlayerObjId data[2] - +#define sBitfield data[0] +#define sPlayerOffset data[1] +#define sPlayerObjId data[2] +#define sVelocity data[3] +#define sTimer data[4] +#define sIntervalIdx data[5] +#define sPrevX data[6] +#define sPrevY data[7] u32 FldEff_SurfBlob(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SURF_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SURF_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 150); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.paletteNum = 0; - sprite->tPlayerObjId = gFieldEffectArguments[2]; - sprite->data[3] = -1; - sprite->data[6] = -1; - sprite->data[7] = -1; + sprite->sPlayerObjId = gFieldEffectArguments[2]; + sprite->sVelocity = -1; + sprite->sPrevX = -1; + sprite->sPrevY = -1; } FieldEffectActiveListRemove(FLDEFF_SURF_BLOB); return spriteId; @@ -1027,43 +1019,40 @@ u32 FldEff_SurfBlob(void) void SetSurfBlob_BobState(u8 spriteId, u8 state) { - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF) | (state & 0xF); + gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF) | (state & 0xF); } void SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 dontSync) { - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF0) | ((dontSync & 0xF) << 4); + gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF0) | ((dontSync & 0xF) << 4); } void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset) { - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF00) | ((hasOffset & 0xF) << 8); - gSprites[spriteId].tPlayerOffset = offset; + gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF00) | ((hasOffset & 0xF) << 8); + gSprites[spriteId].sPlayerOffset = offset; } static u8 GetSurfBlob_BobState(struct Sprite *sprite) { - return sprite->data[0] & 0xF; + return sprite->sBitfield & 0xF; } // Never TRUE static u8 GetSurfBlob_DontSyncAnim(struct Sprite *sprite) { - return (sprite->data[0] & 0xF0) >> 4; + return (sprite->sBitfield & 0xF0) >> 4; } static u8 GetSurfBlob_HasPlayerOffset(struct Sprite *sprite) { - return (sprite->data[0] & 0xF00) >> 8; + return (sprite->sBitfield & 0xF00) >> 8; } void UpdateSurfBlobFieldEffect(struct Sprite *sprite) { - struct ObjectEvent *playerObj; - struct Sprite *playerSprite; - - playerObj = &gObjectEvents[sprite->tPlayerObjId]; - playerSprite = &gSprites[playerObj->spriteId]; + struct ObjectEvent *playerObj = &gObjectEvents[sprite->sPlayerObjId]; + struct Sprite *playerSprite = &gSprites[playerObj->spriteId]; SynchroniseSurfAnim(playerObj, sprite); SynchroniseSurfPosition(playerObj, sprite); UpdateBobbingEffect(playerObj, playerSprite, sprite); @@ -1096,17 +1085,19 @@ void SynchroniseSurfPosition(struct ObjectEvent *playerObj, struct Sprite *sprit s16 y = playerObj->currentCoords.y; s32 spriteY = sprite->y2; - if (spriteY == 0 && (x != sprite->data[6] || y != sprite->data[7])) + if (spriteY == 0 && (x != sprite->sPrevX || y != sprite->sPrevY)) { - sprite->data[5] = spriteY; - sprite->data[6] = x; - sprite->data[7] = y; - for (i = DIR_SOUTH; i <= DIR_EAST; i++, x = sprite->data[6], y = sprite->data[7]) + // Player is moving while surfing, update position. + sprite->sIntervalIdx = 0; + sprite->sPrevX = x; + sprite->sPrevY = y; + for (i = DIR_SOUTH; i <= DIR_EAST; i++, x = sprite->sPrevX, y = sprite->sPrevY) { MoveCoords(i, &x, &y); if (MapGridGetElevationAt(x, y) == 3) { - sprite->data[5]++; + // While dismounting the surf blob bobs at a slower rate + sprite->sIntervalIdx++; break; } } @@ -1115,47 +1106,54 @@ void SynchroniseSurfPosition(struct ObjectEvent *playerObj, struct Sprite *sprit static void UpdateBobbingEffect(struct ObjectEvent *playerObj, struct Sprite *playerSprite, struct Sprite *sprite) { - u16 intervals[] = {3, 7}; + // The frame interval at which to update the blob's y movement. + // Normally every 4th frame, but every 8th frame while dismounting. + u16 intervals[] = {0x3, 0x7}; + u8 bobState = GetSurfBlob_BobState(sprite); if (bobState != BOB_NONE) { - // Update bobbing position of surf blob - if (((u16)(++sprite->data[4]) & intervals[sprite->data[5]]) == 0) - { - sprite->y2 += sprite->data[3]; - } + // Update vertical position of surf blob + if (((u16)(++sprite->sTimer) & intervals[sprite->sIntervalIdx]) == 0) + sprite->y2 += sprite->sVelocity; + + // Reverse bob direction + if ((sprite->sTimer & 15) == 0) + sprite->sVelocity = -sprite->sVelocity; - if ((sprite->data[4] & 15) == 0) - { - sprite->data[3] = -sprite->data[3]; - } if (bobState != BOB_JUST_MON) { - // Update bobbing position of player + // Update vertical position of player if (!GetSurfBlob_HasPlayerOffset(sprite)) playerSprite->y2 = sprite->y2; else - playerSprite->y2 = sprite->tPlayerOffset + sprite->y2; + playerSprite->y2 = sprite->sPlayerOffset + sprite->y2; sprite->x = playerSprite->x; sprite->y = playerSprite->y + 8; } } } +#undef sBitfield +#undef sPlayerOffset +#undef sPlayerObjId +#undef sVelocity +#undef sTimer +#undef sIntervalIdx +#undef sPrevX +#undef sPrevY + #define sSpriteId data[0] #define sBobY data[1] #define sTimer data[2] u8 StartUnderwaterSurfBlobBobbing(u8 blobSpriteId) { - u8 spriteId; - struct Sprite *sprite; - // Create a dummy sprite with its own callback // that tracks the actual surf blob sprite and // makes it bob up and down underwater - spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1); - sprite = &gSprites[spriteId]; + u8 spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1); + struct Sprite *sprite = &gSprites[spriteId]; sprite->callback = SpriteCB_UnderwaterSurfBlob; sprite->invisible = TRUE; sprite->sSpriteId = blobSpriteId; @@ -1165,17 +1163,14 @@ u8 StartUnderwaterSurfBlobBobbing(u8 blobSpriteId) static void SpriteCB_UnderwaterSurfBlob(struct Sprite *sprite) { - struct Sprite *blobSprite; + struct Sprite *blobSprite = &gSprites[sprite->sSpriteId]; - blobSprite = &gSprites[sprite->sSpriteId]; + // Update vertical position of surf blob if (((sprite->sTimer++) & 3) == 0) - { blobSprite->y2 += sprite->sBobY; - } + // Reverse direction if ((sprite->sTimer & 15) == 0) - { sprite->sBobY = -sprite->sBobY; - } } #undef sSpriteId @@ -1185,17 +1180,16 @@ static void SpriteCB_UnderwaterSurfBlob(struct Sprite *sprite) u32 FldEff_Dust(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_GROUND_IMPACT_DUST], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = FLDEFF_DUST; + sprite->sJumpElevation = gFieldEffectArguments[2]; + sprite->sJumpFldEff = FLDEFF_DUST; } return 0; } @@ -1218,28 +1212,29 @@ u32 FldEff_RockClimbDust(void) return 0; } +// Sprite data for FLDEFF_SAND_PILE +#define sLocalId data[0] +#define sMapNum data[1] +#define sMapGroup data[2] +#define sPrevX data[3] +#define sPrevY data[4] + u32 FldEff_SandPile(void) { - u8 objectEventId; - struct ObjectEvent *objectEvent; - u8 spriteId; - struct Sprite *sprite; - const struct ObjectEventGraphicsInfo *graphicsInfo; - - objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - objectEvent = &gObjectEvents[objectEventId]; - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SAND_PILE], 0, 0, 0); + u8 objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + struct ObjectEvent *objectEvent = &gObjectEvents[objectEventId]; + u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SAND_PILE], 0, 0, 0); if (spriteId != MAX_SPRITES) { - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - sprite = &gSprites[spriteId]; + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = gSprites[objectEvent->spriteId].x; - sprite->data[4] = gSprites[objectEvent->spriteId].y; + sprite->sLocalId = gFieldEffectArguments[0]; + sprite->sMapNum = gFieldEffectArguments[1]; + sprite->sMapGroup = gFieldEffectArguments[2]; + sprite->sPrevX = gSprites[objectEvent->spriteId].x; + sprite->sPrevY = gSprites[objectEvent->spriteId].y; sprite->y2 = (graphicsInfo->height >> 1) - 2; SeekSpriteAnim(sprite, 2); } @@ -1249,81 +1244,85 @@ u32 FldEff_SandPile(void) void UpdateSandPileFieldEffect(struct Sprite *sprite) { u8 objectEventId; - s16 x; - s16 y; - if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inSandPile) + if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objectEventId) || !gObjectEvents[objectEventId].inSandPile) { FieldEffectStop(sprite, FLDEFF_SAND_PILE); } else { - y = gSprites[gObjectEvents[objectEventId].spriteId].y; - x = gSprites[gObjectEvents[objectEventId].spriteId].x; - if (x != sprite->data[3] || y != sprite->data[4]) + s16 parentY = gSprites[gObjectEvents[objectEventId].spriteId].y; + s16 parentX = gSprites[gObjectEvents[objectEventId].spriteId].x; + if (parentX != sprite->sPrevX || parentY != sprite->sPrevY) { - sprite->data[3] = x; - sprite->data[4] = y; + sprite->sPrevX = parentX; + sprite->sPrevY = parentY; if (sprite->animEnded) - { StartSpriteAnim(sprite, 0); - } } - sprite->x = x; - sprite->y = y; + sprite->x = parentX; + sprite->y = parentY; sprite->subpriority = gSprites[gObjectEvents[objectEventId].spriteId].subpriority; UpdateObjectEventSpriteInvisibility(sprite, FALSE); } } +#undef sLocalId +#undef sMapNum +#undef sMapGroup +#undef sPrevX +#undef sPrevY + u32 FldEff_Bubbles(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 0); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BUBBLES], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BUBBLES], gFieldEffectArguments[0], gFieldEffectArguments[1], 82); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = 1; } return 0; } +#define sY data[0] + void UpdateBubblesFieldEffect(struct Sprite *sprite) { - sprite->data[0] += 0x80; - sprite->data[0] &= 0x100; - sprite->y -= sprite->data[0] >> 8; + // Move up 1 every other frame. + sprite->sY += ((1 << 8) / 2); + sprite->sY &= (1 << 8); + sprite->y -= sprite->sY >> 8; UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (sprite->invisible || sprite->animEnded) - { FieldEffectStop(sprite, FLDEFF_BUBBLES); - } } +#undef sY + u32 FldEff_BerryTreeGrowthSparkle(void) { u8 spriteId; - struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 4); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPARKLE], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; sprite->oam.paletteNum = 5; - sprite->data[0] = FLDEFF_BERRY_TREE_GROWTH_SPARKLE; + sprite->sWaitFldEff = FLDEFF_BERRY_TREE_GROWTH_SPARKLE; } return 0; } // Sprite data for FLDEFF_TREE_DISGUISE / FLDEFF_MOUNTAIN_DISGUISE / FLDEFF_SAND_DISGUISE #define sState data[0] +#define sFldEff data[1] #define sLocalId data[2] #define sMapNum data[3] #define sMapGroup data[4] @@ -1347,7 +1346,6 @@ u32 ShowSandDisguiseFieldEffect(void) static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 fldEffObj, u8 paletteNum) { u8 spriteId; - struct Sprite *sprite; if (TryGetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &spriteId)) { @@ -1357,7 +1355,7 @@ static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 fldEffObj, u8 paletteNum) spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[fldEffObj], 0, 0, 0); if (spriteId != MAX_SPRITES) { - sprite = &gSprites[spriteId]; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled ++; sprite->oam.paletteNum = paletteNum; sprite->sFldEff = fldEff; @@ -1424,6 +1422,7 @@ bool8 UpdateRevealDisguise(struct ObjectEvent *objectEvent) } #undef sState +#undef sFldEff #undef sLocalId #undef sMapNum #undef sMapGroup @@ -1440,7 +1439,7 @@ u32 FldEff_Sparkle(void) gFieldEffectArguments[0] += MAP_OFFSET; gFieldEffectArguments[1] += MAP_OFFSET; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SMALL_SPARKLE], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SMALL_SPARKLE], gFieldEffectArguments[0], gFieldEffectArguments[1], 82); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.priority = gFieldEffectArguments[2]; @@ -1468,7 +1467,9 @@ void UpdateSparkleFieldEffect(struct Sprite *sprite) #undef sEndTimer #define sTimer data[0] +#define sMoveTimer data[1] #define sState data[2] +#define sVelocity data[3] #define sStartY data[4] #define sCounter data[5] #define sAnimCounter data[6] @@ -1634,41 +1635,44 @@ void UpdateRayquazaSpotlightEffect(struct Sprite *sprite) if (sprite->sState == 1) { - if ((sprite->data[1] & 7) == 0) - sprite->y2 += sprite->data[3]; - if ((sprite->data[1] & 15) == 0) - sprite->data[3] = -sprite->data[3]; - sprite->data[1]++; + // Update movement + if ((sprite->sMoveTimer & 7) == 0) + sprite->y2 += sprite->sVelocity; + // Reverse direction + if ((sprite->sMoveTimer & 15) == 0) + sprite->sVelocity = -sprite->sVelocity; + sprite->sMoveTimer++; } sprite->sTimer++; } #undef sTimer +#undef sMoveTimer #undef sState #undef sStartY +#undef sVelocity #undef sCounter #undef sAnimCounter #undef sAnimState -// Used by FLDEFF_JUMP_TALL_GRASS and FLDEFF_JUMP_LONG_GRASS void UpdateJumpImpactEffect(struct Sprite *sprite) { if (sprite->animEnded) { - FieldEffectStop(sprite, sprite->sFldEff); + FieldEffectStop(sprite, sprite->sJumpFldEff); } else { UpdateObjectEventSpriteInvisibility(sprite, FALSE); - SetObjectSubpriorityByElevation(sprite->sElevation, sprite, 0); + SetObjectSubpriorityByElevation(sprite->sJumpElevation, sprite, 0); } } void WaitFieldEffectSpriteAnim(struct Sprite *sprite) { if (sprite->animEnded) - FieldEffectStop(sprite, sprite->data[0]); + FieldEffectStop(sprite, sprite->sWaitFldEff); else UpdateObjectEventSpriteInvisibility(sprite, FALSE); } @@ -1677,8 +1681,6 @@ static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 elevatio { u8 i; s16 var, xhi, lyhi, yhi, ylo; - const struct ObjectEventGraphicsInfo *graphicsInfo; // Unused Variable - struct Sprite *linkedSprite; SetObjectSubpriorityByElevation(elevation, sprite, subpriority); for (i = 0; i < OBJECT_EVENTS_COUNT; i ++) @@ -1686,8 +1688,9 @@ static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 elevatio struct ObjectEvent *objectEvent = &gObjectEvents[i]; if (objectEvent->active) { - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - linkedSprite = &gSprites[objectEvent->spriteId]; + const struct ObjectEventGraphicsInfo UNUSED *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); + struct Sprite *linkedSprite = &gSprites[objectEvent->spriteId]; + xhi = sprite->x + sprite->centerToCornerVecX; var = sprite->x - sprite->centerToCornerVecX; if (xhi < linkedSprite->x && var > linkedSprite->x) diff --git a/src/field_message_box.c b/src/field_message_box.c index 64734cc209..b797e1d353 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -84,7 +84,7 @@ bool8 ShowPokenavFieldMessage(const u8 *str) StringExpandPlaceholders(gStringVar4, str); CreateTask(Task_HidePokenavMessageWhenDone, 0); StartMatchCallFromScript(str); - sFieldMessageBoxMode = 2; + sFieldMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL; return TRUE; } @@ -97,8 +97,7 @@ bool8 ShowFieldAutoScrollMessage(const u8 *str) return TRUE; } -// Unused -static bool8 ForceShowFieldAutoScrollMessage(const u8 *str) +static bool8 UNUSED ForceShowFieldAutoScrollMessage(const u8 *str) { sFieldMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL; ExpandStringAndStartDrawFieldMessage(str, TRUE); @@ -148,8 +147,7 @@ bool8 IsFieldMessageBoxHidden(void) return FALSE; } -// Unused -static void ReplaceFieldMessageWithFrame(void) +static void UNUSED ReplaceFieldMessageWithFrame(void) { DestroyTask_DrawFieldMessage(); DrawStdWindowFrame(0, TRUE); diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 5f4573c533..1f0708af22 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -1663,6 +1663,10 @@ static void Task_WaitStopSurfing(u8 taskId) gPlayerAvatar.preventStep = FALSE; UnlockPlayerFieldControls(); DestroySprite(&gSprites[playerObjEvent->fieldEffectSpriteId]); +#ifdef BUGFIX + // If this is not defined but the player steps into grass from surfing, they will appear over the grass instead of in the grass. + playerObjEvent->triggerGroundEffectsOnMove = TRUE; +#endif DestroyTask(taskId); } } @@ -2093,7 +2097,7 @@ static void Task_DoPlayerSpinExit(u8 taskId) tSpeed = 1; tCurY = (u16)(sprite->y + sprite->y2) << 4; sprite->y2 = 0; - CameraObjectReset2(); + CameraObjectFreeze(); object->fixedPriority = TRUE; sprite->oam.priority = 0; sprite->subpriority = 0; @@ -2162,7 +2166,7 @@ static void Task_DoPlayerSpinEntrance(u8 taskId) tSubpriority = sprite->subpriority; tCurY = -((u16)sprite->y2 + 32) * 16; sprite->y2 = 0; - CameraObjectReset2(); + CameraObjectFreeze(); object->fixedPriority = TRUE; sprite->oam.priority = 1; sprite->subpriority = 0; @@ -2197,7 +2201,7 @@ static void Task_DoPlayerSpinEntrance(u8 taskId) object->fixedPriority = 0; sprite->oam.priority = tPriority; sprite->subpriority = tSubpriority; - CameraObjectReset1(); + CameraObjectReset(); DestroyTask(taskId); } break; diff --git a/src/field_special_scene.c b/src/field_special_scene.c index 7c98703c6b..a2b3d6366f 100644 --- a/src/field_special_scene.c +++ b/src/field_special_scene.c @@ -264,7 +264,7 @@ void ExecuteTruckSequence(void) MapGridSetMetatileIdAt(4 + MAP_OFFSET, 3 + MAP_OFFSET, METATILE_InsideOfTruck_DoorClosedFloor_Bottom); DrawWholeMapView(); LockPlayerFieldControls(); - CpuFastFill(0, gPlttBufferFaded, 0x400); + CpuFastFill(0, gPlttBufferFaded, PLTT_SIZE); CreateTask(Task_HandleTruckSequence, 0xA); } diff --git a/src/field_specials.c b/src/field_specials.c index 38746c97a4..7d20d3571d 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -57,7 +57,6 @@ #include "constants/heal_locations.h" #include "constants/map_types.h" #include "constants/mystery_gift.h" -#include "constants/script_menu.h" #include "constants/slot_machine.h" #include "constants/songs.h" #include "constants/moves.h" @@ -1012,7 +1011,7 @@ static void PCTurnOnEffect(struct Task *task) if (task->tTimer == 6) { task->tTimer = 0; - + // Get where the PC should be, depending on where the player is looking. playerDirection = GetPlayerFacingDirection(); switch (playerDirection) @@ -1034,7 +1033,7 @@ static void PCTurnOnEffect(struct Task *task) // Update map PCTurnOnEffect_SetMetatile(task->tIsScreenOn, dx, dy); DrawWholeMapView(); - + // Screen flickers 5 times. Odd number and starting with the // screen off means the animation ends with the screen on. task->tIsScreenOn ^= 1; @@ -3193,8 +3192,8 @@ void GetBattleFrontierTutorMoveIndex(void) u16 moveIndex = 0; gSpecialVar_0x8005 = 0; - moveTutor = VarGet(VAR_TEMP_E); - moveIndex = VarGet(VAR_TEMP_D); + moveTutor = VarGet(VAR_TEMP_FRONTIER_TUTOR_ID); + moveIndex = VarGet(VAR_TEMP_FRONTIER_TUTOR_SELECTION); if (moveTutor != 0) { @@ -3260,6 +3259,7 @@ void ScrollableMultichoice_ClosePersistentMenu(void) #undef tTaskId #define DEOXYS_ROCK_LEVELS 11 +#define ROCK_PAL_ID 10 void DoDeoxysRockInteraction(void) { @@ -3339,7 +3339,7 @@ static void Task_DeoxysRockInteraction(u8 taskId) static void ChangeDeoxysRockLevel(u8 rockLevel) { u8 objectEventId; - LoadPalette(&sDeoxysRockPalettes[rockLevel], OBJ_PLTT_ID(10), PLTT_SIZEOF(4)); + LoadPalette(&sDeoxysRockPalettes[rockLevel], OBJ_PLTT_ID(ROCK_PAL_ID), PLTT_SIZEOF(4)); TryGetObjectEventIdByLocalIdAndMap(LOCALID_BIRTH_ISLAND_EXTERIOR_ROCK, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); if (rockLevel == 0) @@ -3376,21 +3376,20 @@ static void WaitForDeoxysRockMovement(u8 taskId) void IncrementBirthIslandRockStepCount(void) { - u16 var = VarGet(VAR_DEOXYS_ROCK_STEP_COUNT); + u16 stepCount = VarGet(VAR_DEOXYS_ROCK_STEP_COUNT); if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(BIRTH_ISLAND_EXTERIOR) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BIRTH_ISLAND_EXTERIOR)) { - var++; - if (var > 99) + if (++stepCount > 99) VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, 0); else - VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, var); + VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, stepCount); } } void SetDeoxysRockPalette(void) { - LoadPalette(&sDeoxysRockPalettes[(u8)VarGet(VAR_DEOXYS_ROCK_LEVEL)], OBJ_PLTT_ID(10), PLTT_SIZEOF(4)); - BlendPalettes(0x04000000, 16, 0); + LoadPalette(&sDeoxysRockPalettes[(u8)VarGet(VAR_DEOXYS_ROCK_LEVEL)], OBJ_PLTT_ID(ROCK_PAL_ID), PLTT_SIZEOF(4)); + BlendPalettes(1 << (ROCK_PAL_ID + 16), 16, 0); } void SetPCBoxToSendMon(u8 boxId) @@ -3957,16 +3956,15 @@ bool8 InPokemonCenter(void) #define FANCLUB_BITFIELD (gSaveBlock1Ptr->vars[VAR_FANCLUB_FAN_COUNTER - VARS_START]) #define FANCLUB_COUNTER 0x007F -#define FANCLUB_FAN_FLAGS 0xFF80 #define GET_TRAINER_FAN_CLUB_FLAG(flag) (FANCLUB_BITFIELD >> (flag) & 1) #define SET_TRAINER_FAN_CLUB_FLAG(flag) (FANCLUB_BITFIELD |= 1 << (flag)) #define FLIP_TRAINER_FAN_CLUB_FLAG(flag)(FANCLUB_BITFIELD ^= 1 << (flag)) #define GET_TRAINER_FAN_CLUB_COUNTER (FANCLUB_BITFIELD & FANCLUB_COUNTER) -#define SET_TRAINER_FAN_CLUB_COUNTER(count) (FANCLUB_BITFIELD = (FANCLUB_BITFIELD & FANCLUB_FAN_FLAGS) | (count)) +#define SET_TRAINER_FAN_CLUB_COUNTER(count) (FANCLUB_BITFIELD = (FANCLUB_BITFIELD & ~FANCLUB_COUNTER) | (count)) #define INCR_TRAINER_FAN_CLUB_COUNTER(count)(FANCLUB_BITFIELD += (count)) -#define CLEAR_TRAINER_FAN_CLUB_COUNTER (FANCLUB_BITFIELD &= ~(FANCLUB_COUNTER)) +#define CLEAR_TRAINER_FAN_CLUB_COUNTER (FANCLUB_BITFIELD &= ~FANCLUB_COUNTER) void ResetFanClub(void) { diff --git a/src/field_tasks.c b/src/field_tasks.c index dec5cba800..a9d11b2d70 100644 --- a/src/field_tasks.c +++ b/src/field_tasks.c @@ -100,6 +100,9 @@ static const struct PacifidlogMetatileOffsets sFloatingBridgeMetatileOffsets[] = }; // Each element corresponds to a y coordinate row in the sootopolis gym 1F map. +// The rows with ice each have a temp var used to track the ice steps. Each bit in the var +// represents whether ice at that x coordinate (starting from the left edge) has been visited. +// This method of tracking steps will break if the ice puzzle is more than 16 map spaces wide. static const u16 sSootopolisGymIceRowVars[] = { 0, @@ -169,7 +172,7 @@ static void Task_RunTimeBasedEvents(u8 taskId) if (!ArePlayerFieldControlsLocked()) { RunTimeBasedEvents(data); - UpdateAmbientCry(&tAmbientCryState, &tAmbientCryDelay); + UpdateAmbientCry(&tAmbientCryState, (u16*) &tAmbientCryDelay); } } diff --git a/src/field_weather.c b/src/field_weather.c index 92863dee5f..bc86bcdc7d 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -61,7 +61,7 @@ static void None_Main(void); static u8 None_Finish(void); EWRAM_DATA struct Weather gWeather = {0}; -EWRAM_DATA static u8 sFieldEffectPaletteColorMapTypes[32] = {0}; +EWRAM_DATA static u8 ALIGNED(2) sFieldEffectPaletteColorMapTypes[32] = {0}; static const u8 *sPaletteColorMapTypes; @@ -111,7 +111,7 @@ void (*const gWeatherPalStateFuncs[])(void) = // This table specifies which of the color maps should be // applied to each of the background and sprite palettes. -static const u8 sBasePaletteColorMapTypes[32] = +static const u8 ALIGNED(2) sBasePaletteColorMapTypes[32] = { // background palettes COLOR_MAP_DARK_CONTRAST, @@ -149,14 +149,14 @@ static const u8 sBasePaletteColorMapTypes[32] = COLOR_MAP_DARK_CONTRAST, }; -const u16 gFogPalette[] = INCBIN_U16("graphics/weather/fog.gbapal"); +const u16 ALIGNED(4) gFogPalette[] = INCBIN_U16("graphics/weather/fog.gbapal"); void StartWeather(void) { if (!FuncIsActiveTask(Task_WeatherMain)) { u8 index = AllocSpritePalette(PALTAG_WEATHER); - CpuCopy32(gFogPalette, &gPlttBufferUnfaded[0x100 + index * 16], 32); + CpuCopy32(gFogPalette, &gPlttBufferUnfaded[OBJ_PLTT_ID(index)], PLTT_SIZE_4BPP); BuildColorMaps(); gWeatherPtr->contrastColorMapSpritePalIndex = index; gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(PALTAG_WEATHER_2); @@ -277,7 +277,6 @@ static void BuildColorMaps(void) u16 brightnessDelta; u16 colorMapIndex; u16 baseBrightness; - u32 remainingBrightness; s16 diff; sPaletteColorMapTypes = sBasePaletteColorMapTypes; @@ -305,11 +304,7 @@ static void BuildColorMaps(void) } baseBrightness = curBrightness; - remainingBrightness = 0x1f00 - curBrightness; - if ((0x1f00 - curBrightness) < 0) - remainingBrightness += 0xf; - - brightnessDelta = remainingBrightness / (NUM_WEATHER_COLOR_MAPS - 3); + brightnessDelta = (0x1f00 - curBrightness) / (NUM_WEATHER_COLOR_MAPS - 3); if (colorVal < 12) { // For shadows (color values < 12), the remaining color mappings are @@ -471,7 +466,7 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) if (colorMapIndex > 0) { colorMapIndex--; - palOffset = startPalIndex * 16; + palOffset = PLTT_ID(startPalIndex); numPalettes += startPalIndex; curPalIndex = startPalIndex; @@ -481,7 +476,7 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) if (sPaletteColorMapTypes[curPalIndex] == COLOR_MAP_NONE) { // No palette change. - CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); + CpuFastCopy(&gPlttBufferUnfaded[palOffset], &gPlttBufferFaded[palOffset], PLTT_SIZE_4BPP); palOffset += 16; } else @@ -511,7 +506,7 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) { // A negative gammIndex value means that the blending will come from the special Drought weather's palette tables. colorMapIndex = -colorMapIndex - 1; - palOffset = startPalIndex * 16; + palOffset = PLTT_ID(startPalIndex); numPalettes += startPalIndex; curPalIndex = startPalIndex; @@ -520,7 +515,7 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) if (sPaletteColorMapTypes[curPalIndex] == COLOR_MAP_NONE) { // No palette change. - CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); + CpuFastCopy(&gPlttBufferUnfaded[palOffset], &gPlttBufferFaded[palOffset], PLTT_SIZE_4BPP); palOffset += 16; } else @@ -538,7 +533,7 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) else { // No palette blending. - CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); + CpuFastCopy(&gPlttBufferUnfaded[PLTT_ID(startPalIndex)], &gPlttBufferFaded[PLTT_ID(startPalIndex)], numPalettes * PLTT_SIZE_4BPP); } } @@ -552,7 +547,7 @@ static void ApplyColorMapWithBlend(u8 startPalIndex, u8 numPalettes, s8 colorMap u8 gBlend = color.g; u8 bBlend = color.b; - palOffset = BG_PLTT_ID(startPalIndex); + palOffset = PLTT_ID(startPalIndex); numPalettes += startPalIndex; colorMapIndex--; curPalIndex = startPalIndex; @@ -666,8 +661,8 @@ static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) { if (LightenSpritePaletteInFog(curPalIndex)) { - u16 palEnd = (curPalIndex + 1) * 16; - u16 palOffset = curPalIndex * 16; + u16 palEnd = PLTT_ID(curPalIndex + 1); + u16 palOffset = PLTT_ID(curPalIndex); while (palOffset < palEnd) { @@ -786,7 +781,7 @@ void FadeScreen(u8 mode, s8 delay) if (fadeOut) { if (useWeatherPal) - CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2); + CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(PALETTES_ALL, delay, 0, 16, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; @@ -824,14 +819,14 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) { if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) MarkFogSpritePalToLighten(paletteIndex); - paletteIndex *= 16; + paletteIndex = PLTT_ID(paletteIndex); for (i = 0; i < 16; i++) gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor; } break; case WEATHER_PAL_STATE_SCREEN_FADING_OUT: paletteIndex = PLTT_ID(paletteIndex); - CpuFastCopy(gPlttBufferFaded + paletteIndex, gPlttBufferUnfaded + paletteIndex, PLTT_SIZE_4BPP); + CpuFastCopy(&gPlttBufferFaded[paletteIndex], &gPlttBufferUnfaded[paletteIndex], PLTT_SIZE_4BPP); BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor); break; // WEATHER_PAL_STATE_CHANGING_WEATHER @@ -855,8 +850,7 @@ void ApplyWeatherColorMapToPal(u8 paletteIndex) ApplyColorMap(paletteIndex, 1, gWeatherPtr->colorMapIndex); } -// Unused -static bool8 IsFirstFrameOfWeatherFadeIn(void) +static bool8 UNUSED IsFirstFrameOfWeatherFadeIn(void) { if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN) return gWeatherPtr->fadeInFirstFrame; @@ -997,8 +991,8 @@ bool8 Weather_UpdateBlend(void) return FALSE; } -// Unused. Uses the same numbering scheme as the coord events -static void SetFieldWeather(u8 weather) +// Uses the same numbering scheme as the coord events +static void UNUSED SetFieldWeather(u8 weather) { switch (weather) { diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index 05eae421e0..10ce1bc37a 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -770,7 +770,7 @@ void Snow_InitVars(void) gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->targetColorMapIndex = 3; gWeatherPtr->colorMapStepDelay = 20; - gWeatherPtr->targetSnowflakeSpriteCount = 16; + gWeatherPtr->targetSnowflakeSpriteCount = NUM_SNOWFLAKE_SPRITES; gWeatherPtr->snowflakeVisibleCounter = 0; } @@ -2434,8 +2434,7 @@ static void UpdateBubbleSprite(struct Sprite *sprite) //------------------------------------------------------------------------------ -// Unused function. -static void UnusedSetCurrentAbnormalWeather(u32 weather, u32 unknown) +static void UNUSED UnusedSetCurrentAbnormalWeather(u32 weather, u32 unknown) { sCurrentAbnormalWeather = weather; sUnusedWeatherRelated = unknown; diff --git a/src/fieldmap.c b/src/fieldmap.c index df4db47b53..d9c4fa371a 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -25,11 +25,11 @@ struct ConnectionFlags u8 east:1; }; -EWRAM_DATA static u16 sBackupMapData[MAX_MAP_DATA_SIZE] = {0}; +EWRAM_DATA static u16 ALIGNED(4) sBackupMapData[MAX_MAP_DATA_SIZE] = {0}; EWRAM_DATA struct MapHeader gMapHeader = {0}; EWRAM_DATA struct Camera gCamera = {0}; EWRAM_DATA static struct ConnectionFlags sMapConnectionFlags = {0}; -EWRAM_DATA static u32 sFiller = 0; // without this, the next file won't align properly +EWRAM_DATA static u32 UNUSED sFiller = 0; // without this, the next file won't align properly struct BackupMapLayout gBackupMapLayout; @@ -799,8 +799,7 @@ void GetCameraFocusCoords(u16 *x, u16 *y) *y = gSaveBlock1Ptr->pos.y + MAP_OFFSET; } -// Unused -static void SetCameraCoords(u16 x, u16 y) +static void UNUSED SetCameraCoords(u16 x, u16 y) { gSaveBlock1Ptr->pos.x = x; gSaveBlock1Ptr->pos.y = y; @@ -866,12 +865,12 @@ static void ApplyGlobalTintToPaletteEntries(u16 offset, u16 size) } -static void ApplyGlobalTintToPaletteSlot(u8 slot, u8 count) +static void UNUSED ApplyGlobalTintToPaletteSlot(u8 slot, u8 count) { } -void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) +static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) { u16 black = RGB_BLACK; diff --git a/src/fldeff_escalator.c b/src/fldeff_escalator.c index 0dc98c319c..eabbd53549 100644 --- a/src/fldeff_escalator.c +++ b/src/fldeff_escalator.c @@ -14,43 +14,43 @@ static void Task_DrawEscalator(u8 taskId); #define ESCALATOR_STAGES 3 #define LAST_ESCALATOR_STAGE (ESCALATOR_STAGES - 1) -static const u16 sEscalatorMetatiles_1F_0[ESCALATOR_STAGES] = { +static const s16 sEscalatorMetatiles_1F_0[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator1F_Tile0_Frame2, METATILE_PokemonCenter_Escalator1F_Tile0_Frame1, METATILE_PokemonCenter_Escalator1F_Tile0_Frame0 }; -static const u16 sEscalatorMetatiles_1F_1[ESCALATOR_STAGES] = { +static const s16 sEscalatorMetatiles_1F_1[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator1F_Tile1_Frame2, METATILE_PokemonCenter_Escalator1F_Tile1_Frame1, METATILE_PokemonCenter_Escalator1F_Tile1_Frame0 }; -static const u16 sEscalatorMetatiles_1F_2[ESCALATOR_STAGES] = { +static const s16 sEscalatorMetatiles_1F_2[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator1F_Tile2_Frame2, METATILE_PokemonCenter_Escalator1F_Tile2_Frame1, METATILE_PokemonCenter_Escalator1F_Tile2_Frame0 }; -static const u16 sEscalatorMetatiles_1F_3[ESCALATOR_STAGES] = { +static const s16 sEscalatorMetatiles_1F_3[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator1F_Tile3_Frame2, METATILE_PokemonCenter_Escalator1F_Tile3_Frame1, METATILE_PokemonCenter_Escalator1F_Tile3_Frame0 }; -static const u16 sEscalatorMetatiles_2F_0[ESCALATOR_STAGES] = { +static const s16 sEscalatorMetatiles_2F_0[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator2F_Tile0_Frame0, METATILE_PokemonCenter_Escalator2F_Tile0_Frame1, METATILE_PokemonCenter_Escalator2F_Tile0_Frame2 }; -static const u16 sEscalatorMetatiles_2F_1[ESCALATOR_STAGES] = { +static const s16 sEscalatorMetatiles_2F_1[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator2F_Tile1_Frame0, METATILE_PokemonCenter_Escalator2F_Tile1_Frame1, METATILE_PokemonCenter_Escalator2F_Tile1_Frame2 }; -static const u16 sEscalatorMetatiles_2F_2[ESCALATOR_STAGES] = { +static const s16 sEscalatorMetatiles_2F_2[ESCALATOR_STAGES] = { METATILE_PokemonCenter_Escalator2F_Tile2_Frame0, METATILE_PokemonCenter_Escalator2F_Tile2_Frame1, METATILE_PokemonCenter_Escalator2F_Tile2_Frame2 diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c index 87d0117410..5c7d23b5ac 100644 --- a/src/fldeff_flash.c +++ b/src/fldeff_flash.c @@ -270,7 +270,7 @@ static void Task_ExitCaveTransition4(u8 taskId) if (count < 8) { gTasks[taskId].data[2]++; - LoadPalette(&sCaveTransitionPalette_Exit[count], BG_PLTT_ID(14), PLTT_SIZEOF(8) - PLTT_SIZEOF(count)); + LoadPalette(&sCaveTransitionPalette_Exit[count], BG_PLTT_ID(14), sizeof(sCaveTransitionPalette_Exit) - PLTT_SIZEOF(count)); } else { diff --git a/src/fldeff_misc.c b/src/fldeff_misc.c index c01e88b512..513cd13e76 100644 --- a/src/fldeff_misc.c +++ b/src/fldeff_misc.c @@ -308,7 +308,7 @@ static const struct SpriteTemplate sSpriteTemplate_RecordMixLights = .callback = SpriteCallbackDummy, }; -// For accessing pokemon storage PC or the Hall of Fame PC +// For accessing Pokémon storage PC or the Hall of Fame PC void ComputerScreenOpenEffect(u16 increment, u16 unused, u8 priority) { CreateComputerScreenEffectTask(Task_ComputerScreenOpenEffect, increment, unused, priority); diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index 7e93526094..dd979c77a8 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -52,8 +52,8 @@ static void StartSweetScentFieldEffect(void) u8 taskId; PlaySE(SE_M_SWEET_SCENT); - CpuFastSet(gPlttBufferUnfaded, gPaletteDecompressionBuffer, 0x100); - CpuFastSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x100); + CpuFastCopy(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_SIZE); + CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarSpriteId()].oam.paletteNum + 16)), 4, 0, 8, RGB_RED); taskId = CreateTask(TrySweetScentEncounter, 0); gTasks[taskId].data[0] = 0; @@ -91,7 +91,7 @@ static void FailSweetScentEncounter(u8 taskId) { if (!gPaletteFade.active) { - CpuFastSet(gPaletteDecompressionBuffer, gPlttBufferUnfaded, 0x100); + CpuFastCopy(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE); SetWeatherPalStateIdle(); ScriptContext_SetupScript(EventScript_FailSweetScent); DestroyTask(taskId); diff --git a/src/frontier_util.c b/src/frontier_util.c index 8cd385e653..1858792b4e 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -326,7 +326,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ }, [FRONTIER_FACILITY_FACTORY] = { - // Because Factory's pokemon are random, this facility's Brain also uses random pokemon. + // Because Factory's Pokémon are random, this facility's Brain also uses random Pokémon. // What is interesting, this team is actually the one Steven uses in the multi tag battle alongside the player. { { @@ -698,8 +698,8 @@ static const u8 *const sRecordsWindowChallengeTexts[][2] = static const u8 *const sLevelModeText[] = { - gText_RecordsLv50, - gText_RecordsOpenLevel, + [FRONTIER_LVL_50] = gText_RecordsLv50, + [FRONTIER_LVL_OPEN] = gText_RecordsOpenLevel, }; static const u8 *const sHallFacilityToRecordsText[] = @@ -789,28 +789,28 @@ void CallFrontierUtilFunc(void) sFrontierUtilFuncs[gSpecialVar_0x8004](); } -// Buffers into VAR_TEMP_0 specifically because this is used to react to the status in OnFrame map scripts +// VAR_TEMP_CHALLENGE_STATUS is used to react to the status in OnFrame map scripts static void GetChallengeStatus(void) { - VarSet(VAR_TEMP_0, 0xFF); + VarSet(VAR_TEMP_CHALLENGE_STATUS, 0xFF); switch (gSaveBlock2Ptr->frontier.challengeStatus) { case 0: break; case CHALLENGE_STATUS_SAVING: FrontierGamblerSetWonOrLost(FALSE); - VarSet(VAR_TEMP_0, gSaveBlock2Ptr->frontier.challengeStatus); + VarSet(VAR_TEMP_CHALLENGE_STATUS, gSaveBlock2Ptr->frontier.challengeStatus); break; case CHALLENGE_STATUS_LOST: FrontierGamblerSetWonOrLost(FALSE); - VarSet(VAR_TEMP_0, gSaveBlock2Ptr->frontier.challengeStatus); + VarSet(VAR_TEMP_CHALLENGE_STATUS, gSaveBlock2Ptr->frontier.challengeStatus); break; case CHALLENGE_STATUS_WON: FrontierGamblerSetWonOrLost(TRUE); - VarSet(VAR_TEMP_0, gSaveBlock2Ptr->frontier.challengeStatus); + VarSet(VAR_TEMP_CHALLENGE_STATUS, gSaveBlock2Ptr->frontier.challengeStatus); break; case CHALLENGE_STATUS_PAUSED: - VarSet(VAR_TEMP_0, gSaveBlock2Ptr->frontier.challengeStatus); + VarSet(VAR_TEMP_CHALLENGE_STATUS, gSaveBlock2Ptr->frontier.challengeStatus); break; } } @@ -2006,7 +2006,7 @@ static void AppendIfValid(u16 species, u16 heldItem, u16 hp, u8 lvlMode, u8 monL // gSpecialVar_Result is the level mode before and after calls to this function // gSpecialVar_0x8004 is used to store the return value instead (TRUE if there are insufficient eligible mons) -// The names of ineligible pokemon that have been caught are also buffered to print +// The names of ineligible Pokémon that have been caught are also buffered to print static void CheckPartyIneligibility(void) { u16 speciesArray[PARTY_SIZE]; diff --git a/src/graphics.c b/src/graphics.c index e8f891d8b2..2612022695 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -362,7 +362,7 @@ const u8 gHealthboxElementsGfxTable[] = INCBIN_U8("graphics/battle_interface/hpb "graphics/battle_interface/misc_frameend.4bpp", "graphics/battle_interface/ball_display.4bpp", "graphics/battle_interface/ball_caught_indicator.4bpp", - "graphics/battle_interface/status2.4bpp", // these three duplicate sets of graphics are for the opponent/partner pokemon + "graphics/battle_interface/status2.4bpp", // these three duplicate sets of graphics are for the opponent/partner Pokémon "graphics/battle_interface/status3.4bpp", "graphics/battle_interface/status4.4bpp", "graphics/battle_interface/healthbox_doubles_frameend.4bpp", @@ -865,18 +865,17 @@ const u32 gBattleAnimSpritePal_PinkCloud[] = INCBIN_U32("graphics/battle_anims/s const u32 gBattleAnimSpriteGfx_SweatDrop[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_drop.4bpp.lz"); const u32 gBattleAnimSpritePal_SweatDrop[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_drop.gbapal.lz"); -const u32 gBattleStatMask_Gfx[] = INCBIN_U32("graphics/battle_anims/masks/stat.4bpp.lz"); -const u32 gBattleStatMask1_Tilemap[] = INCBIN_U32("graphics/battle_anims/masks/stat_tilemap_1.bin.lz"); -const u32 gBattleStatMask2_Tilemap[] = INCBIN_U32("graphics/battle_anims/masks/stat_tilemap_2.bin.lz"); - -const u32 gBattleStatMask1_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat1.gbapal.lz"); -const u32 gBattleStatMask2_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat2.gbapal.lz"); -const u32 gBattleStatMask3_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat3.gbapal.lz"); -const u32 gBattleStatMask4_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat4.gbapal.lz"); -const u32 gBattleStatMask5_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat5.gbapal.lz"); -const u32 gBattleStatMask6_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat6.gbapal.lz"); -const u32 gBattleStatMask7_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat7.gbapal.lz"); -const u32 gBattleStatMask8_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat8.gbapal.lz"); +const u32 gStatAnim_Gfx[] = INCBIN_U32("graphics/battle_anims/stat_change/tiles.4bpp.lz"); +const u32 gStatAnim_Increase_Tilemap[] = INCBIN_U32("graphics/battle_anims/stat_change/increase.bin.lz"); +const u32 gStatAnim_Decrease_Tilemap[] = INCBIN_U32("graphics/battle_anims/stat_change/decrease.bin.lz"); +const u32 gStatAnim_Defense_Pal[] = INCBIN_U32("graphics/battle_anims/stat_change/defense.gbapal.lz"); +const u32 gStatAnim_Attack_Pal[] = INCBIN_U32("graphics/battle_anims/stat_change/attack.gbapal.lz"); +const u32 gStatAnim_Accuracy_Pal[] = INCBIN_U32("graphics/battle_anims/stat_change/accuracy.gbapal.lz"); +const u32 gStatAnim_Speed_Pal[] = INCBIN_U32("graphics/battle_anims/stat_change/speed.gbapal.lz"); +const u32 gStatAnim_Multiple_Pal[] = INCBIN_U32("graphics/battle_anims/stat_change/multiple.gbapal.lz"); +const u32 gStatAnim_Evasion_Pal[] = INCBIN_U32("graphics/battle_anims/stat_change/evasion.gbapal.lz"); +const u32 gStatAnim_SpAttack_Pal[] = INCBIN_U32("graphics/battle_anims/stat_change/sp_attack.gbapal.lz"); +const u32 gStatAnim_SpDefense_Pal[] = INCBIN_U32("graphics/battle_anims/stat_change/sp_defense.gbapal.lz"); const u32 gCureBubblesGfx[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.4bpp.lz"); const u32 gCureBubblesPal[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.gbapal.lz"); @@ -954,8 +953,8 @@ const u32 gDomeTourneyLineUp_Tilemap[] = INCBIN_U32("graphics/battle_frontier/to const u32 gDomeTourneyInfoCard_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card.4bpp.lz"); const u32 gDomeTourneyInfoCard_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_tilemap.bin.lz"); const u32 gDomeTourneyInfoCardBg_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_bg.bin.lz"); -const u32 gDomeTourneyTreeButtons_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_buttons.4bpp.lz"); // exit/cancel and pokeball buttons -const u32 gDomeTourneyTree_Pal[] = INCBIN_U32("graphics/battle_frontier/tourney.gbapal.lz"); +const u32 gDomeTourneyTreeButtons_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_buttons.4bpp.lz"); // exit/cancel and Poké Ball buttons +const u32 gDomeTourneyTree_Pal[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.gbapal.lz"); const u32 gDomeTourneyTreeButtons_Pal[] = INCBIN_U32("graphics/battle_frontier/tourney_buttons.gbapal.lz"); const u32 gDomeTourneyMatchCardBg_Pal[] = INCBIN_U32("graphics/battle_frontier/tourney_match_card_bg.gbapal.lz"); @@ -1216,13 +1215,9 @@ const u32 gRouletteMultiplier_Gfx[] = INCBIN_U32("graphics/roulette/multiplier.4 #include "data/graphics/mail.h" -const u16 gFrontierFactorySelectMenu_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_menu1.gbapal"); -const u16 gFrontierFactorySelectMenu_Pal2[] = INCBIN_U16("graphics/battle_frontier/factory_menu2.gbapal"); - -const u8 gFrontierFactorySelectMenu_Gfx[] = INCBIN_U8("graphics/battle_frontier/factory_menu1.4bpp"); -const u8 gFrontierFactorySelectMenu_Gfx2[] = INCBIN_U8("graphics/battle_frontier/factory_menu2.4bpp"); - -const u16 gFrontierFactorySelectMenu_Tilemap[] = INCBIN_U16("graphics/battle_frontier/factory_menu.bin"); +const u16 gFrontierFactoryMenu_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_screen/menu.gbapal"); +const u16 gFrontierFactoryMenu_Gfx[] = INCBIN_U16("graphics/battle_frontier/factory_screen/menu.4bpp"); +const u16 gFrontierFactoryMenu_Tilemap[] = INCBIN_U16("graphics/battle_frontier/factory_screen/menu.bin"); const u32 gFrontierPassMedals_Gfx[] = INCBIN_U32("graphics/frontier_pass/medals.4bpp.lz"); @@ -1233,9 +1228,8 @@ const u16 gFrontierPassMapCursor_Pal[] = INCBIN_U16("graphics/frontier_pass/map_ const u16 gFrontierPassMedalsSilver_Pal[] = INCBIN_U16("graphics/frontier_pass/silver.gbapal"); const u16 gFrontierPassMedalsGold_Pal[] = INCBIN_U16("graphics/frontier_pass/gold.gbapal"); -// Pokedex +// Pokédex const u16 gPokedexBgHoenn_Pal[] = INCBIN_U16("graphics/pokedex/bg_hoenn.gbapal"); -const u16 gPokedexCaughtScreen_Pal[] = INCBIN_U16("graphics/pokedex/caught_screen.gbapal"); const u16 gPokedexSearchResults_Pal[] = INCBIN_U16("graphics/pokedex/search_results_bg.gbapal"); const u16 gPokedexBgNational_Pal[] = INCBIN_U16("graphics/pokedex/bg_national.gbapal"); const u32 gPokedexMenu_Gfx[] = INCBIN_U32("graphics/pokedex/menu.4bpp.lz"); @@ -1287,7 +1281,7 @@ const u16 gContestResultsTitle_Smart_Tilemap[] = INCBIN_U16("graphics/contest/r const u16 gContestResultsTitle_Tough_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_tough.bin"); const u16 gContestResultsTitle_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title.bin"); -// pokenav +// PokéNav const u16 gPokenavCondition_Pal[] = INCBIN_U16("graphics/pokenav/condition/graph.gbapal"); const u32 gPokenavCondition_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph.4bpp.lz"); @@ -1388,7 +1382,7 @@ const u32 gKantoTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/f const u32 gKantoTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/back.bin.lz"); const u32 gKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/front_link.bin.lz"); -// pokemon storage system +// Pokémon storage system const u32 gStorageSystemMenu_Gfx[] = INCBIN_U32("graphics/pokemon_storage/menu.4bpp.lz"); const u16 gStorageSystemPartyMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/party_menu.gbapal"); @@ -1520,7 +1514,7 @@ const u16 gTitleScreenPressStartPal[] = INCBIN_U16("graphics/title_screen/p const u32 gTitleScreenPressStartGfx[] = INCBIN_U32("graphics/title_screen/press_start.4bpp.lz"); const u32 gTitleScreenPokemonLogoTilemap[] = INCBIN_U32("graphics/title_screen/pokemon_logo.bin.lz"); -const u16 gFrontierPassBg_Pal[][16] = INCBIN_U16("graphics/frontier_pass/bg.gbapal"); +const u16 gFrontierPassBg_Pal[] = INCBIN_U16("graphics/frontier_pass/bg.gbapal"); // 8 x 16 const u32 gFrontierPassBg_Gfx[] = INCBIN_U32("graphics/frontier_pass/bg.4bpp.lz"); const u32 gFrontierPassMapAndCard_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_and_card.8bpp.lz"); const u32 gFrontierPassBg_Tilemap[] = INCBIN_U32("graphics/frontier_pass/bg.bin.lz"); diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index f4a4c96d71..91850ec72e 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -44,7 +44,7 @@ struct HallofFameMon u32 personality; u16 species:9; u16 lvl:7; - u8 nick[POKEMON_NAME_LENGTH]; + u8 nickname[POKEMON_NAME_LENGTH]; }; struct HallofFameTeam @@ -338,7 +338,7 @@ static const struct HallofFameMon sDummyFameMon = .personality = 0, .species = SPECIES_NONE, .lvl = 0, - .nick = {0} + .nickname = {0} }; // Unused, order of party slots on Hall of Fame screen @@ -442,18 +442,16 @@ static void Task_Hof_InitMonData(u8 taskId) for (i = 0; i < PARTY_SIZE; i++) { - u8 nick[POKEMON_NAME_LENGTH + 2]; + u8 nickname[POKEMON_NAME_LENGTH + 1]; if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) { sHofMonPtr->mon[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); sHofMonPtr->mon[i].tid = GetMonData(&gPlayerParty[i], MON_DATA_OT_ID); sHofMonPtr->mon[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); sHofMonPtr->mon[i].lvl = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nick); + GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nickname); for (j = 0; j < POKEMON_NAME_LENGTH; j++) - { - sHofMonPtr->mon[i].nick[j] = nick[j]; - } + sHofMonPtr->mon[i].nickname[j] = nickname[j]; gTasks[taskId].tMonNumber++; } else @@ -462,7 +460,7 @@ static void Task_Hof_InitMonData(u8 taskId) sHofMonPtr->mon[i].tid = 0; sHofMonPtr->mon[i].personality = 0; sHofMonPtr->mon[i].lvl = 0; - sHofMonPtr->mon[i].nick[0] = EOS; + sHofMonPtr->mon[i].nickname[0] = EOS; } } @@ -623,7 +621,7 @@ static void Task_Hof_TryDisplayAnotherMon(u8 taskId) else { sHofFadePalettes |= (0x10000 << gSprites[gTasks[taskId].tMonSpriteId(currPokeID)].oam.paletteNum); - if (gTasks[taskId].tDisplayedMonId < PARTY_SIZE - 1 && currMon[1].species != SPECIES_NONE) // there is another pokemon to display + if (gTasks[taskId].tDisplayedMonId < PARTY_SIZE - 1 && currMon[1].species != SPECIES_NONE) // there is another Pokémon to display { gTasks[taskId].tDisplayedMonId++; BeginNormalPaletteFade(sHofFadePalettes, 0, 12, 12, RGB(16, 29, 24)); @@ -740,7 +738,7 @@ static void Task_Hof_ExitOnKeyPressed(u8 taskId) static void Task_Hof_HandlePaletteOnExit(u8 taskId) { - CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); + CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(PALETTES_ALL, 8, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_Hof_HandleExit; } @@ -1044,7 +1042,7 @@ static void Task_HofPC_HandlePaletteOnExit(u8 taskId) { struct HallofFameTeam *fameTeam; - CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); + CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); fameTeam = (struct HallofFameTeam *)(gDecompressionBuffer); fameTeam->mon[0] = sDummyFameMon; ComputerScreenCloseEffect(0, 0, 0); @@ -1115,7 +1113,7 @@ static void HallOfFame_PrintWelcomeText(u8 unusedPossiblyWindowId, u8 unused2) static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u8 unused2) { - u8 text[30]; + u8 text[max(32, POKEMON_NAME_LENGTH + 1)]; u8 *stringPtr; s32 dexNumber; s32 width; @@ -1148,8 +1146,8 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u AddTextPrinterParameterized3(0, FONT_NORMAL, 0x10, 1, sMonInfoTextColors, TEXT_SKIP_DRAW, text); } - // nick, species names, gender and level - memcpy(text, currMon->nick, POKEMON_NAME_LENGTH); + // nickname, species names, gender and level + memcpy(text, currMon->nickname, POKEMON_NAME_LENGTH); text[POKEMON_NAME_LENGTH] = EOS; if (currMon->species == SPECIES_EGG) { @@ -1269,7 +1267,7 @@ static void ClearVramOamPltt_LoadHofPal(void) DmaFill16(3, 0, plttOffset, plttSize); ResetPaletteFade(); - LoadPalette(sHallOfFame_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); + LoadPalette(sHallOfFame_Pal, BG_PLTT_ID(0), sizeof(sHallOfFame_Pal)); } static void LoadHofGfx(void) diff --git a/src/international_string_util.c b/src/international_string_util.c index 457e3260be..6186bd116c 100644 --- a/src/international_string_util.c +++ b/src/international_string_util.c @@ -76,10 +76,7 @@ int Intl_GetListMenuWidth(const struct ListMenuTemplate *listMenu) } finalWidth = maxWidth + listMenu->item_X + 9; - if (finalWidth < 0) - finalWidth += 7; - - finalWidth >>= 3; + finalWidth /= 8; if (finalWidth > 28) finalWidth = 28; diff --git a/src/intro.c b/src/intro.c index fd9c124670..195374bba0 100644 --- a/src/intro.c +++ b/src/intro.c @@ -169,7 +169,7 @@ extern const struct SpriteTemplate gAncientPowerRockSpriteTemplate[]; #define TIMER_START_LEGENDARIES 43 static EWRAM_DATA u16 sIntroCharacterGender = 0; -static EWRAM_DATA u16 sUnusedVar = 0; +static EWRAM_DATA u16 UNUSED sUnusedVar = 0; static EWRAM_DATA u16 sFlygonYOffset = 0; u32 gIntroFrameCounter; @@ -178,7 +178,7 @@ struct GcmbStruct gMultibootProgramStruct; static const u16 sIntroDrops_Pal[] = INCBIN_U16("graphics/intro/scene_1/drops.gbapal"); static const u16 sIntroLogo_Pal[] = INCBIN_U16("graphics/intro/scene_1/logo.gbapal"); static const u32 sIntroDropsLogo_Gfx[] = INCBIN_U32("graphics/intro/scene_1/drops_logo.4bpp.lz"); -static const u16 sIntro1Bg_Pal[16][16] = INCBIN_U16("graphics/intro/scene_1/bg.gbapal"); +static const u16 sIntro1Bg_Pal[] = INCBIN_U16("graphics/intro/scene_1/bg.gbapal"); // 16 x 16 static const u32 sIntro1Bg0_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg0_map.bin.lz"); static const u32 sIntro1Bg1_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg1_map.bin.lz"); static const u32 sIntro1Bg2_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg2_map.bin.lz"); @@ -1163,7 +1163,7 @@ void CB2_InitCopyrightScreenAfterTitleScreen(void) static void Task_Scene1_Load(u8 taskId) { SetVBlankCallback(NULL); - sIntroCharacterGender = Random() & 1; + sIntroCharacterGender = MOD(Random(), GENDER_COUNT); IntroResetGpuRegs(); SetGpuReg(REG_OFFSET_BG3VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 80); @@ -1188,14 +1188,14 @@ static void Task_Scene1_Load(u8 taskId) LoadSpritePalettes(sSpritePalettes_Intro1); LoadCompressedSpriteSheet(sSpriteSheet_Sparkle); LoadSpritePalettes(sSpritePalette_Sparkle); - CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1F0], 0x20); - CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1E1], 0x1E); - CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1D2], 0x1C); - CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1C3], 0x1A); - CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1B4], 0x18); - CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1A5], 0x16); - CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x196], 0x14); - CreateGameFreakLogoSprites(120, 80, 0); + CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_ID(0)], &gPlttBufferUnfaded[OBJ_PLTT_ID(15) + 0], PLTT_SIZEOF(16 - 0)); + CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_ID(0)], &gPlttBufferUnfaded[OBJ_PLTT_ID(14) + 1], PLTT_SIZEOF(16 - 1) + 1); // Copying an extra half color? + CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_ID(0)], &gPlttBufferUnfaded[OBJ_PLTT_ID(13) + 2], PLTT_SIZEOF(16 - 2)); + CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_ID(0)], &gPlttBufferUnfaded[OBJ_PLTT_ID(12) + 3], PLTT_SIZEOF(16 - 3)); + CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_ID(0)], &gPlttBufferUnfaded[OBJ_PLTT_ID(11) + 4], PLTT_SIZEOF(16 - 4)); + CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_ID(0)], &gPlttBufferUnfaded[OBJ_PLTT_ID(10) + 5], PLTT_SIZEOF(16 - 5)); + CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_ID(0)], &gPlttBufferUnfaded[OBJ_PLTT_ID( 9) + 6], PLTT_SIZEOF(16 - 6)); + CreateGameFreakLogoSprites(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0); gTasks[taskId].sBigDropSpriteId = CreateWaterDrop(236, -14, 0x200, 1, 0x78, FALSE); gTasks[taskId].func = Task_Scene1_FadeIn; } @@ -1722,7 +1722,7 @@ static void Task_Scene3_Load(u8 taskId) gTasks[taskId].tZoomDiv = 0; gTasks[taskId].tZoomDivSpeed = 0; gTasks[taskId].data[3] = 0; - PanFadeAndZoomScreen(0x78, 0x50, 0, 0); + PanFadeAndZoomScreen(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0, 0); ResetSpriteData(); FreeAllSpritePalettes(); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_WHITEALPHA); @@ -1746,7 +1746,7 @@ static void Task_Scene3_SpinPokeball(u8 taskId) gTasks[taskId].func = Task_Scene3_WaitGroudon; } - PanFadeAndZoomScreen(0x78, 0x50, SAFE_DIV(0x10000, gTasks[taskId].tZoomDiv), gTasks[taskId].tAlpha); + PanFadeAndZoomScreen(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, SAFE_DIV(0x10000, gTasks[taskId].tZoomDiv), gTasks[taskId].tAlpha); if (gIntroFrameCounter == TIMER_POKEBALL_FADE) BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITEALPHA); @@ -1848,7 +1848,7 @@ static void Task_Scene3_StartGroudon(u8 taskId) { gTasks[taskId].tState = 0; gTasks[taskId].func = Task_Scene3_Groudon; - ScanlineEffect_InitWave(0, 160, 4, 4, 1, SCANLINE_EFFECT_REG_BG1HOFS, FALSE); + ScanlineEffect_InitWave(0, DISPLAY_HEIGHT, 4, 4, 1, SCANLINE_EFFECT_REG_BG1HOFS, FALSE); } #define tScreenX data[1] @@ -1884,7 +1884,7 @@ static void Task_Scene3_Groudon(u8 taskId) if (--tDelay == 0) { tDelay = 2; - CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[31], sizeof(u16)); + CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[BG_PLTT_ID(1) + 15], PLTT_SIZEOF(1)); tPalIdx += 2; if (tPalIdx == 0x1EC) tState++; @@ -1901,7 +1901,7 @@ static void Task_Scene3_Groudon(u8 taskId) if (--tDelay == 0) { tDelay = 2; - CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[31], sizeof(u16)); + CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[BG_PLTT_ID(1) + 15], PLTT_SIZEOF(1)); tPalIdx -= 2; if (tPalIdx == 0x1E0) { @@ -2058,7 +2058,7 @@ static void Task_Scene3_LoadKyogre(u8 taskId) gTasks[taskId].tDelay = 16; gTasks[taskId].tZoom = 256; PanFadeAndZoomScreen(gTasks[taskId].tScreenX, gTasks[taskId].tScreenY, gTasks[taskId].tZoom, 0); - ScanlineEffect_InitWave(0, 0xA0, 4, 4, 1, SCANLINE_EFFECT_REG_BG1VOFS, FALSE); + ScanlineEffect_InitWave(0, DISPLAY_HEIGHT, 4, 4, 1, SCANLINE_EFFECT_REG_BG1VOFS, FALSE); } static void Task_Scene3_Kyogre(u8 taskId) @@ -2143,7 +2143,7 @@ static void Task_Scene3_Kyogre(u8 taskId) if (--tDelay == 0) { tDelay = 4; - CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[47], sizeof(u16)); + CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[BG_PLTT_ID(2) + 15], PLTT_SIZEOF(1)); tPalIdx -= 2; if (tPalIdx == 0x1E0) tState++; @@ -2161,7 +2161,7 @@ static void Task_Scene3_Kyogre(u8 taskId) if (--tDelay == 0) { tDelay = 4; - CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[47], sizeof(u16)); + CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[BG_PLTT_ID(2) + 15], PLTT_SIZEOF(1)); tPalIdx += 2; if (tPalIdx == 0x1EE) { @@ -2492,7 +2492,7 @@ static void SpriteCB_Lightning(struct Sprite *sprite) sprite->sPalIdx = 0x1C2; sprite->sState++; case 1: - CpuCopy16(&gIntro3Bg_Pal[sprite->sPalIdx], &gPlttBufferFaded[93], 2); + CpuCopy16(&gIntro3Bg_Pal[sprite->sPalIdx], &gPlttBufferFaded[BG_PLTT_ID(5) + 13], PLTT_SIZEOF(1)); sprite->sPalIdx += 2; if (sprite->sPalIdx != 0x1CE) break; @@ -2503,7 +2503,7 @@ static void SpriteCB_Lightning(struct Sprite *sprite) if (--sprite->sDelay == 0) { sprite->sDelay = 4; - CpuCopy16(&gIntro3Bg_Pal[sprite->sPalIdx], &gPlttBufferFaded[93], 2); + CpuCopy16(&gIntro3Bg_Pal[sprite->sPalIdx], &gPlttBufferFaded[BG_PLTT_ID(5) + 13], PLTT_SIZEOF(1)); sprite->sPalIdx -= 2; if (sprite->sPalIdx == 0x1C0) DestroySprite(sprite); @@ -2606,7 +2606,7 @@ static void Task_RayquazaAttack(u8 taskId) case 0: if ((data[2] & 1) != 0) { - CpuCopy16(&gIntro3Bg_Pal[0x1A2 + data[1] * 2], &gPlttBufferFaded[94], 2); + CpuCopy16(&gIntro3Bg_Pal[0x1A2 + data[1] * 2], &gPlttBufferFaded[BG_PLTT_ID(5) + 14], PLTT_SIZEOF(1)); data[1]++; } if (data[1] == 6) @@ -2621,7 +2621,7 @@ static void Task_RayquazaAttack(u8 taskId) { if ((data[2] & 1) != 0) { - CpuCopy16(&gIntro3Bg_Pal[0x1A2 + data[1] * 2], &gPlttBufferFaded[88], 2); + CpuCopy16(&gIntro3Bg_Pal[0x1A2 + data[1] * 2], &gPlttBufferFaded[BG_PLTT_ID(5) + 8], PLTT_SIZEOF(1)); data[1]++; } if (data[1] == 6) @@ -2640,7 +2640,7 @@ static void Task_RayquazaAttack(u8 taskId) { if ((data[2] & 1) != 0) { - CpuCopy16(&gIntro3Bg_Pal[0x182 + data[1] * 2], &gPlttBufferFaded[92], 2); + CpuCopy16(&gIntro3Bg_Pal[0x182 + data[1] * 2], &gPlttBufferFaded[BG_PLTT_ID(5) + 12], PLTT_SIZEOF(1)); data[1]++; } if (data[1] == 6) @@ -3197,16 +3197,16 @@ static void SpriteCB_LogoLetter(struct Sprite *sprite) sprite->sColorDelay = 2; if (sprite->sTimer != 0) { - CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer], &gPlttBufferFaded[0x11F], 2); - CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 16], &gPlttBufferFaded[0x114], 2); - CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 32], &gPlttBufferFaded[0x11A], 2); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer], &gPlttBufferFaded[OBJ_PLTT_ID(1) + 15], PLTT_SIZEOF(1)); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 16], &gPlttBufferFaded[OBJ_PLTT_ID(1) + 4], PLTT_SIZEOF(1)); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 32], &gPlttBufferFaded[OBJ_PLTT_ID(1) + 10], PLTT_SIZEOF(1)); sprite->sTimer--; } else { - CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer], &gPlttBufferFaded[0x11F], 2); - CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 16], &gPlttBufferFaded[0x114], 2); - CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 32], &gPlttBufferFaded[0x11A], 2); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer], &gPlttBufferFaded[OBJ_PLTT_ID(1) + 15], PLTT_SIZEOF(1)); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 16], &gPlttBufferFaded[OBJ_PLTT_ID(1) + 4], PLTT_SIZEOF(1)); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 32], &gPlttBufferFaded[OBJ_PLTT_ID(1) + 10], PLTT_SIZEOF(1)); sprite->sState++; } } @@ -3226,9 +3226,9 @@ static void SpriteCB_LogoLetter(struct Sprite *sprite) sprite->sColorDelay = 2; if (sprite->sTimer <= COLOR_CHANGES) { - CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer], &gPlttBufferFaded[0x11F], 2); - CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 16], &gPlttBufferFaded[0x114], 2); - CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 32], &gPlttBufferFaded[0x11A], 2); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer], &gPlttBufferFaded[OBJ_PLTT_ID(1) + 15], PLTT_SIZEOF(1)); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 16], &gPlttBufferFaded[OBJ_PLTT_ID(1) + 4], PLTT_SIZEOF(1)); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 32], &gPlttBufferFaded[OBJ_PLTT_ID(1) + 10], PLTT_SIZEOF(1)); sprite->sTimer++; } else diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c index 7593a296e8..c4b059fdd7 100644 --- a/src/intro_credits_graphics.c +++ b/src/intro_credits_graphics.c @@ -998,13 +998,13 @@ void CycleSceneryPalette(u8 mode) break; if (gMain.vblankCounter1 & 4) { - x = gPlttBufferUnfaded[9]; - y = gPlttBufferUnfaded[10]; + x = gPlttBufferUnfaded[BG_PLTT_ID(0) + 9]; + y = gPlttBufferUnfaded[BG_PLTT_ID(0) + 10]; } else { - x = gPlttBufferUnfaded[10]; - y = gPlttBufferUnfaded[9]; + x = gPlttBufferUnfaded[BG_PLTT_ID(0) + 10]; + y = gPlttBufferUnfaded[BG_PLTT_ID(0) + 9]; } LoadPalette(&x, BG_PLTT_ID(0) + 9, sizeof(x)); LoadPalette(&y, BG_PLTT_ID(0) + 10, sizeof(y)); @@ -1148,7 +1148,7 @@ static void SpriteCB_FlygonRightHalf(struct Sprite *sprite) } // In RS these were for Latios/Latias. In Emerald both are replaced with Flygon and now only 1 is used -static u8 CreateIntroFlygonSprite_Unused(s16 x, s16 y) +static u8 UNUSED CreateIntroFlygonSprite_Unused(s16 x, s16 y) { u8 leftSpriteId = CreateSprite(&sSpriteTemplate_FlygonLatios, x - 32, y, 5); u8 rightSpriteId = CreateSprite(&sSpriteTemplate_FlygonLatios, x + 32, y, 6); diff --git a/src/item_menu.c b/src/item_menu.c index 00449c6ec7..f0abfcf62a 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -109,7 +109,7 @@ struct ListBuffer1 { }; struct ListBuffer2 { - s8 name[MAX_POCKET_ITEMS][ITEM_NAME_LENGTH + 10]; + u8 name[MAX_POCKET_ITEMS][ITEM_NAME_LENGTH + 10]; }; struct TempWallyBag { @@ -138,7 +138,7 @@ static void PrepareTMHMMoveWindow(void); static bool8 IsWallysBag(void); static void Task_WallyTutorialBagMenu(u8); static void Task_BagMenu_HandleInput(u8); -static void GetItemName(s8 *, u16); +static void GetItemName(u8 *, u16); static void PrintItemDescription(int); static void BagMenu_PrintCursorAtPos(u8, u8); static void BagMenu_Print(u8, u8, const u8 *, u8, u8, u8, u8, u8, u8); @@ -265,21 +265,21 @@ 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_DUMMY] = {gText_EmptyString2, NULL} + [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_DUMMY] = {gText_EmptyString2, {NULL}} }; // these are all 2D arrays with a width of 2 but are represented as 1D arrays @@ -894,7 +894,7 @@ static void LoadBagItemListBuffers(u8 pocketId) gMultiuseListMenuTemplate.maxShowed = gBagMenu->numShownItems[pocketId]; } -static void GetItemName(s8 *dest, u16 itemId) +static void GetItemName(u8 *dest, u16 itemId) { switch (gBagPosition.pocket) { @@ -2429,16 +2429,16 @@ static void PrintPocketNames(const u8 *pocketName1, const u8 *pocketName2) static void CopyPocketNameToWindow(u32 a) { - u8 (* tileDataBuffer)[32][32]; + u8 (*tileDataBuffer)[32][32]; u8 *windowTileData; int b; if (a > 8) a = 8; tileDataBuffer = &gBagMenu->pocketNameBuffer; windowTileData = (u8 *)GetWindowAttribute(2, WINDOW_TILE_DATA); - CpuCopy32(tileDataBuffer[0][a], windowTileData, 0x100); // Top half of pocket name + CpuCopy32(&tileDataBuffer[0][a], windowTileData, 0x100); // Top half of pocket name b = a + 16; - CpuCopy32(tileDataBuffer[0][b], windowTileData + 0x100, 0x100); // Bottom half of pocket name + CpuCopy32(&tileDataBuffer[0][b], windowTileData + 0x100, 0x100); // Bottom half of pocket name CopyWindowToVram(WIN_POCKET_NAME, COPYWIN_GFX); } @@ -2466,8 +2466,7 @@ static void BagMenu_Print(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top AddTextPrinterParameterized4(windowId, fontId, left, top, letterSpacing, lineSpacing, sFontColorTable[colorIndex], speed, str); } -// Unused -static u8 BagMenu_GetWindowId(u8 windowType) +static u8 UNUSED BagMenu_GetWindowId(u8 windowType) { return gBagMenu->windowIds[windowType]; } diff --git a/src/item_use.c b/src/item_use.c index 8a02827176..60338e437a 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -724,7 +724,7 @@ static void ItemUseOnFieldCB_WailmerPailBerry(u8 taskId) static bool8 TryToWaterSudowoodo(void) { - u16 x, y; + s16 x, y; u8 elevation; u8 objId; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); @@ -781,7 +781,7 @@ void ItemUseOutOfBattle_RareCandy(u8 taskId) void ItemUseOutOfBattle_TMHM(u8 taskId) { - if (gSpecialVar_ItemId >= ITEM_HM01_CUT) + if (gSpecialVar_ItemId >= ITEM_HM01) DisplayItemMessage(taskId, FONT_NORMAL, gText_BootedUpHM, BootUpSoundTMHM); // HM else DisplayItemMessage(taskId, FONT_NORMAL, gText_BootedUpTM, BootUpSoundTMHM); // TM diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index 319743d0d2..828d6450bc 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -139,7 +139,7 @@ u16 rfu_initializeAPI(u32 *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p u16 buffByteSizeMax; // is in EWRAM? - if (((uintptr_t)APIBuffer & 0xF000000) == 0x2000000 && copyInterruptToRam) + if (((uintptr_t)APIBuffer & 0xF000000) == EWRAM_START && copyInterruptToRam) return ERR_RFU_API_BUFF_ADR; // is not 4-byte aligned? if ((u32)APIBuffer & 3) @@ -338,7 +338,7 @@ u16 rfu_getRFUStatus(u8 *rfuState) u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) { const char *s1 = str_checkMbootLL; - char *s2 = (char *)0x30000F0; + char *s2 = (char *)(IWRAM_START + 0xF0); u16 checksum; u16 *mb_buff_iwram_p; u8 i; @@ -347,15 +347,15 @@ u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) while (*s1 != '\0') if (*s1++ != *s2++) return 1; - mb_buff_iwram_p = (u16 *)0x3000000; + mb_buff_iwram_p = (u16 *)IWRAM_START; // The size of struct RfuLinkStatus is 180 checksum = 0; for (i = 0; i < 180/2; ++i) checksum += *mb_buff_iwram_p++; - if (checksum != *(u16 *)0x30000FA) + if (checksum != *(u16 *)(IWRAM_START + 0xFA)) return 1; - CpuCopy16((u16 *)0x3000000, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); + CpuCopy16((u16 *)IWRAM_START, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); gRfuStatic->flags |= 0x80; // mboot return 0; } @@ -1400,7 +1400,11 @@ static u16 rfu_STC_setSendData_org(u8 ni_or_uni, u8 bmSendSlot, u8 subFrameSize, { u8 bm_slot_id, sendSlotFlag; u8 frameSize; +#ifdef UBFIX + u8 *llFrameSize_p = NULL; +#else u8 *llFrameSize_p; +#endif u8 sending; u8 i; u16 imeBak; @@ -1426,7 +1430,11 @@ static u16 rfu_STC_setSendData_org(u8 ni_or_uni, u8 bmSendSlot, u8 subFrameSize, else if (gRfuLinkStatus->parentChild == MODE_CHILD) llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id]; frameSize = llsf_struct[gRfuLinkStatus->parentChild].frameSize; +#ifdef UBFIX + if ((llFrameSize_p && subFrameSize > *llFrameSize_p) || subFrameSize <= frameSize) +#else if (subFrameSize > *llFrameSize_p || subFrameSize <= frameSize) +#endif return ERR_SUBFRAME_SIZE; imeBak = REG_IME; REG_IME = 0; @@ -1464,7 +1472,10 @@ static u16 rfu_STC_setSendData_org(u8 ni_or_uni, u8 bmSendSlot, u8 subFrameSize, } while (0); } gRfuLinkStatus->sendSlotNIFlag |= bmSendSlot; - *llFrameSize_p -= subFrameSize; +#ifdef UBFIX + if (llFrameSize_p) +#endif + *llFrameSize_p -= subFrameSize; slotStatus_NI->send.state = SLOT_STATE_SEND_START; } else if (ni_or_uni & 0x10) @@ -1473,7 +1484,10 @@ static u16 rfu_STC_setSendData_org(u8 ni_or_uni, u8 bmSendSlot, u8 subFrameSize, slotStatus_UNI->send.bmSlot = bmSendSlot; slotStatus_UNI->send.src = src; slotStatus_UNI->send.payloadSize = subFrameSize - frameSize; - *llFrameSize_p -= subFrameSize; +#ifdef UBFIX + if (llFrameSize_p) +#endif + *llFrameSize_p -= subFrameSize; slotStatus_UNI->send.state = SLOT_STATE_SEND_UNI; gRfuLinkStatus->sendSlotUNIFlag |= bmSendSlot; } diff --git a/src/link.c b/src/link.c index 06bde1e38f..f784a36c67 100644 --- a/src/link.c +++ b/src/link.c @@ -78,7 +78,7 @@ bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS]; u8 gBlockReceivedStatus[MAX_LINK_PLAYERS]; u32 gLinkFiller2; u16 gLinkHeldKeys; -u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; +u16 ALIGNED(4) gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; u32 gLinkStatus; bool8 gLinkDummy1; // Never read bool8 gLinkDummy2; // Never read @@ -278,8 +278,7 @@ static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charB SetGpuReg(REG_OFFSET_BG0VOFS + bgNum * 4, 0); } -// Unused -static void LoadLinkTestBgGfx(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) +static void UNUSED LoadLinkTestBgGfx(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) { LoadPalette(sLinkTestDigitsPal, BG_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); DmaCopy16(3, sLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock), sizeof sLinkTestDigitsGfx); @@ -289,8 +288,7 @@ static void LoadLinkTestBgGfx(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 ch SetGpuReg(sBGControlRegs[bgNum], BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock)); } -// Unused -static void LinkTestScreen(void) +static void UNUSED LinkTestScreen(void) { int i; @@ -779,8 +777,7 @@ u32 LinkDummy_Return2(void) return 2; } -// Unused -static bool32 IsFullLinkGroupWithNoRS(void) +static bool32 UNUSED IsFullLinkGroupWithNoRS(void) { if (GetLinkPlayerCount() != MAX_LINK_PLAYERS || AreAnyLinkPlayersUsingVersions(VERSION_RUBY, VERSION_SAPPHIRE) < 0) { @@ -1012,14 +1009,12 @@ void SetBerryBlenderLinkCallback(void) gLinkCallback = LinkCB_BerryBlenderSendHeldKeys; } -// Unused -static u32 GetBerryBlenderKeySendAttempts(void) +static u32 UNUSED GetBerryBlenderKeySendAttempts(void) { return gBerryBlenderKeySendAttempts; } -// Unused -static void SendBerryBlenderNoSpaceForPokeblocks(void) +static void UNUSED SendBerryBlenderNoSpaceForPokeblocks(void) { BuildSendCmd(LINKCMD_BLENDER_NO_PBLOCK_SPACE); } @@ -1165,7 +1160,7 @@ static void LinkTest_PrintHex(u32 num, u8 x, u8 y, u8 length) } } -static void LinkTest_PrintInt(int num, u8 x, u8 y, u8 length) +static void UNUSED LinkTest_PrintInt(int num, u8 x, u8 y, u8 length) { char buff[16]; int negX; @@ -1297,8 +1292,7 @@ u8 GetSavedPlayerCount(void) return gSavedLinkPlayerCount; } -// Unused -static u8 GetSavedMultiplayerId(void) +static u8 UNUSED GetSavedMultiplayerId(void) { return gSavedMultiplayerId; } @@ -1335,13 +1329,13 @@ bool8 DoesLinkPlayerCountMatchSaved(void) void ClearSavedLinkPlayers(void) { - int i; // The CpuSet loop below is incorrectly writing to NULL // instead of sSavedLinkPlayers. // Additionally it's using the wrong array size. #ifdef UBFIX memset(sSavedLinkPlayers, 0, sizeof(sSavedLinkPlayers)); #else + int i; for (i = 0; i < MAX_LINK_PLAYERS; i++) CpuSet(&sSavedLinkPlayers[i], NULL, sizeof(struct LinkPlayer)); #endif @@ -1382,8 +1376,7 @@ bool8 IsLinkMaster(void) return EXTRACT_MASTER(gLinkStatus); } -// Unused -static u8 GetDummy2(void) +static u8 UNUSED GetDummy2(void) { return sDummy2; } @@ -1650,7 +1643,7 @@ static void ErrorMsg_MoveCloserToPartner(void) DecompressAndLoadBgGfxUsingHeap(1, sWirelessLinkDisplayGfx, FALSE, 0, 0); CopyToBgTilemapBuffer(1, sWirelessLinkDisplayTilemap, 0, 0); CopyBgTilemapBufferToVram(1); - LoadPalette(sWirelessLinkDisplayPal, 0, 0x20); + LoadPalette(sWirelessLinkDisplayPal, BG_PLTT_ID(0), sizeof(sWirelessLinkDisplayPal)); FillWindowPixelBuffer(WIN_LINK_ERROR_TOP, PIXEL_FILL(0)); FillWindowPixelBuffer(WIN_LINK_ERROR_BOTTOM, PIXEL_FILL(0)); AddTextPrinterParameterized3(WIN_LINK_ERROR_TOP, FONT_SHORT_COPY_1, 2, 6, sTextColors, 0, gText_CommErrorEllipsis); diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index 9d66a18378..9979097a49 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -699,8 +699,7 @@ void StopUnionRoomLinkManager(void) gRfu.state = RFUSTATE_UR_STOP_MANAGER; } -// Unused -static void ReadySendDataForSlots(u8 slots) +static void UNUSED ReadySendDataForSlots(u8 slots) { u8 i; @@ -1918,7 +1917,8 @@ static void Task_PlayerExchangeUpdate(u8 taskId) for (i = 0; i < RFU_CHILD_MAX; i++) sio->linkPlayerIdx[i] = gRfu.linkPlayerIdx[i]; memcpy(sio->linkPlayers, gLinkPlayers, sizeof(gLinkPlayers)); - if (SendBlock(0, gBlockSendBuffer, 0xa0)) + // Send SioInfo but exclude the 92 unused bytes at the end + if (SendBlock(0, gBlockSendBuffer, offsetof(struct SioInfo, filler))) gTasks[taskId].tState++; break; case 5: @@ -2145,7 +2145,7 @@ void RfuSetErrorParams(u32 errorInfo) } } -static void ResetErrorState(void) +static void UNUSED ResetErrorState(void) { gRfu.errorState = RFU_ERROR_STATE_NONE; } @@ -2559,8 +2559,7 @@ static void VBlank_RfuIdle(void) TransferPlttBuffer(); } -// Unused -static void Debug_RfuIdle(void) +static void UNUSED Debug_RfuIdle(void) { s32 i; @@ -2933,7 +2932,7 @@ static void Debug_PrintEmpty(void) Debug_PrintString(sASCII_30Spaces, 0, i); } -static void Debug_PrintStatus(void) +static void UNUSED Debug_PrintStatus(void) { s32 i, j; Debug_PrintNum(GetBlockReceivedStatus(), 28, 19, 2); @@ -2989,7 +2988,7 @@ static void Debug_PrintStatus(void) } } -static u32 GetRfuSendQueueLength(void) +static u32 UNUSED GetRfuSendQueueLength(void) { return gRfu.sendQueue.count; } diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 6eee8435c9..8a9c28f1b0 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -342,7 +342,7 @@ void RfuSendQueue_Reset(struct RfuSendQueue *queue) queue->full = FALSE; } -static void RfuUnusedQueue_Reset(struct RfuUnusedQueue *queue) +static void UNUSED RfuUnusedQueue_Reset(struct RfuUnusedQueue *queue) { s32 i; s32 j; @@ -514,7 +514,7 @@ bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *src) return TRUE; } -static void RfuUnusedQueue_Enqueue(struct RfuUnusedQueue *queue, u8 *data) +static void UNUSED RfuUnusedQueue_Enqueue(struct RfuUnusedQueue *queue, u8 *data) { s32 i; @@ -533,7 +533,7 @@ static void RfuUnusedQueue_Enqueue(struct RfuUnusedQueue *queue, u8 *data) } } -static bool8 RfuUnusedQueue_Dequeue(struct RfuUnusedQueue *queue, u8 *dest) +static bool8 UNUSED RfuUnusedQueue_Dequeue(struct RfuUnusedQueue *queue, u8 *dest) { s32 i; @@ -549,11 +549,10 @@ static bool8 RfuUnusedQueue_Dequeue(struct RfuUnusedQueue *queue, u8 *dest) return TRUE; } -// Unused // Populates an array with a sequence of numbers (which numbers depends on the mode) // and sets the final element to the total of the other elements #define SEQ_ARRAY_MAX_SIZE 200 -static void PopulateArrayWithSequence(u8 *arr, u8 mode) +static void UNUSED PopulateArrayWithSequence(u8 *arr, u8 mode) { s32 i; u8 rval; @@ -607,7 +606,7 @@ static void PopulateArrayWithSequence(u8 *arr, u8 mode) // File boundary here maybe? -static void PkmnStrToASCII(u8 *asciiStr, const u8 *pkmnStr) +static void UNUSED PkmnStrToASCII(u8 *asciiStr, const u8 *pkmnStr) { s32 i; @@ -616,7 +615,7 @@ static void PkmnStrToASCII(u8 *asciiStr, const u8 *pkmnStr) asciiStr[i] = 0; } -static void ASCIIToPkmnStr(u8 *pkmnStr, const u8 *asciiStr) +static void UNUSED ASCIIToPkmnStr(u8 *pkmnStr, const u8 *asciiStr) { s32 i; diff --git a/src/list_menu.c b/src/list_menu.c index 546ec6f6cd..e24442ca02 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -316,7 +316,7 @@ static void ListMenuDummyTask(u8 taskId) } -s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 drawMode, u16 tileNum, u16 palNum) +s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 drawMode, u16 tileNum, u16 palOffset) { switch (sMysteryGiftLinkMenu.state) { @@ -326,9 +326,9 @@ s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const str switch (drawMode) { case 2: - LoadUserWindowBorderGfx(sMysteryGiftLinkMenu.windowId, tileNum, palNum); + LoadUserWindowBorderGfx(sMysteryGiftLinkMenu.windowId, tileNum, palOffset); case 1: - DrawTextBorderOuter(sMysteryGiftLinkMenu.windowId, tileNum, palNum / 16); + DrawTextBorderOuter(sMysteryGiftLinkMenu.windowId, tileNum, palOffset / 16); break; } gMultiuseListMenuTemplate = *listMenuTemplate; diff --git a/src/lottery_corner.c b/src/lottery_corner.c index f19e9f7b7b..052e2cfc38 100644 --- a/src/lottery_corner.c +++ b/src/lottery_corner.c @@ -75,7 +75,7 @@ void PickLotteryCornerTicket(void) } } } - else // pokemon are always arranged from populated spots first to unpopulated, so the moment a NONE species is found, that's the end of the list. + else // Pokémon are always arranged from populated spots first to unpopulated, so the moment a NONE species is found, that's the end of the list. break; } diff --git a/src/m4a_1.s b/src/m4a_1.s index 3f15788061..20f9197a8d 100644 --- a/src/m4a_1.s +++ b/src/m4a_1.s @@ -1395,7 +1395,7 @@ _081DD9F6: cmp r6, 0 beq _081DDA14 ldrb r0, [r4, o_CgbChannel_modify] - movs r1, 0x1 + movs r1, CGB_CHANNEL_MO_VOL orrs r0, r1 strb r0, [r4, o_CgbChannel_modify] _081DDA14: diff --git a/src/m4a_tables.c b/src/m4a_tables.c index 9a4ea32e69..4d012cea28 100644 --- a/src/m4a_tables.c +++ b/src/m4a_tables.c @@ -257,35 +257,34 @@ const u8 gClockTable[] = const struct PokemonCrySong gPokemonCrySongTemplate = { - 1, // track count - 0, // block count - 255, // priority - 0, // reverb - (struct ToneData *)&voicegroup000, - NULL, - NULL, - 0, - TUNE, // part 0 - C_V, // TUNE value - GOTO, - 0, // GOTO target address - TUNE, // part 1 - C_V + 16, // TUNE value - {VOICE, 0}, // part 0 jumps here with GOTO - VOL, - 127, // volume - {XCMD, 0x0D}, - 0, // unk value - {XCMD, xRELE}, - 0, // release - PAN, - C_V, // PAN value - TIE, - 60, // TIE key (default is Cn3) - 127, // TIE velocity - {XCMD, 0x0C}, - 60, // unk value - {EOT, FINE} // end + .trackCount = 1, + .blockCount = 0, + .priority = 255, + .reverb = 0, + .tone = (struct ToneData *)&voicegroup000, + .part = {NULL, NULL}, + .gap = 0, + .part0 = TUNE, + .tuneValue = C_V, + .gotoCmd = GOTO, + .gotoTarget = 0, + .part1 = TUNE, + .tuneValue2 = C_V + 16, + .cont = {VOICE, 0}, // part0 jumps here with gotoCmd + .volCmd = VOL, + .volumeValue = 127, + .unkCmd0D = {XCMD, 0x0D}, + .unkCmd0DParam = 0, + .xreleCmd = {XCMD, xRELE}, + .releaseValue = 0, + .panCmd = PAN, + .panValue = C_V, + .tieCmd = TIE, + .tieKeyValue = 60, // default is Cn3 + .tieVelocityValue = 127, + .unkCmd0C = {XCMD, 0x0C}, + .unkCmd0CParam = 60, + .end = {EOT, FINE} }; const XcmdFunc gXcmdTable[] = diff --git a/src/mail.c b/src/mail.c index a6f3bc0ffd..424a286f3f 100644 --- a/src/mail.c +++ b/src/mail.c @@ -551,9 +551,7 @@ static bool8 MailReadBuildGraphics(void) break; case 9: if (FreeTempTileDataBuffersIfPossible()) - { return FALSE; - } break; case 10: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, DISPLAY_TILE_WIDTH, DISPLAY_TILE_HEIGHT); @@ -567,23 +565,20 @@ static bool8 MailReadBuildGraphics(void) break; case 12: LoadPalette(GetOverworldTextboxPalettePtr(), BG_PLTT_ID(15), PLTT_SIZE_4BPP); + gPlttBufferUnfaded[BG_PLTT_ID(15) + 10] = sMailGraphics[sMailRead->mailType].textColor; + gPlttBufferFaded[BG_PLTT_ID(15) + 10] = sMailGraphics[sMailRead->mailType].textColor; + gPlttBufferUnfaded[BG_PLTT_ID(15) + 11] = sMailGraphics[sMailRead->mailType].textShadow; + gPlttBufferFaded[BG_PLTT_ID(15) + 11] = sMailGraphics[sMailRead->mailType].textShadow; - gPlttBufferUnfaded[250] = sMailGraphics[sMailRead->mailType].textColor; - gPlttBufferFaded[250] = sMailGraphics[sMailRead->mailType].textColor; - gPlttBufferUnfaded[251] = sMailGraphics[sMailRead->mailType].textShadow; - gPlttBufferFaded[251] = sMailGraphics[sMailRead->mailType].textShadow; LoadPalette(sMailGraphics[sMailRead->mailType].palette, BG_PLTT_ID(0), PLTT_SIZE_4BPP); - - gPlttBufferUnfaded[10] = sBgColors[gSaveBlock2Ptr->playerGender][0]; - gPlttBufferFaded[10] = sBgColors[gSaveBlock2Ptr->playerGender][0]; - gPlttBufferUnfaded[11] = sBgColors[gSaveBlock2Ptr->playerGender][1]; - gPlttBufferFaded[11] = sBgColors[gSaveBlock2Ptr->playerGender][1]; + gPlttBufferUnfaded[BG_PLTT_ID(0) + 10] = sBgColors[gSaveBlock2Ptr->playerGender][0]; + gPlttBufferFaded[BG_PLTT_ID(0) + 10] = sBgColors[gSaveBlock2Ptr->playerGender][0]; + gPlttBufferUnfaded[BG_PLTT_ID(0) + 11] = sBgColors[gSaveBlock2Ptr->playerGender][1]; + gPlttBufferFaded[BG_PLTT_ID(0) + 11] = sBgColors[gSaveBlock2Ptr->playerGender][1]; break; case 13: if (sMailRead->hasText) - { BufferMailText(); - } break; case 14: if (sMailRead->hasText) diff --git a/src/mail_data.c b/src/mail_data.c index 99cf1f9edd..ed152faf2c 100644 --- a/src/mail_data.c +++ b/src/mail_data.c @@ -129,7 +129,7 @@ u8 GiveMailToMon(struct Pokemon *mon, struct Mail *mail) return mailId; } -static bool32 DummyMailFunc(void) +static bool32 UNUSED DummyMailFunc(void) { return FALSE; } diff --git a/src/main.c b/src/main.c index 99d2610bb3..5f12a2996e 100644 --- a/src/main.c +++ b/src/main.c @@ -76,7 +76,9 @@ static EWRAM_DATA u16 sTrainerId = 0; static void UpdateLinkAndCallCallbacks(void); static void InitMainCallbacks(void); static void CallCallbacks(void); +#ifdef BUGFIX static void SeedRngWithRtc(void); +#endif static void ReadKeys(void); void InitIntrHandlers(void); static void WaitForVBlank(void); diff --git a/src/main_menu.c b/src/main_menu.c index 6808a8f11a..6a6ee99557 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -4,6 +4,7 @@ #include "constants/rgb.h" #include "constants/songs.h" #include "constants/trainers.h" +#include "data.h" #include "decompress.h" #include "event_data.h" #include "field_effect.h" @@ -453,8 +454,8 @@ static const union AffineAnimCmd *const sSpriteAffineAnimTable_PlayerShrink[] = }; static const struct MenuAction sMenuActions_Gender[] = { - {gText_BirchBoy, NULL}, - {gText_BirchGirl, NULL} + {gText_BirchBoy, {NULL}}, + {gText_BirchGirl, {NULL}} }; static const u8 *const sMalePresetNames[] = { @@ -1086,8 +1087,8 @@ static void Task_HandleMainMenuAPressed(u8 taskId) case ACTION_INVALID: gTasks[taskId].tCurrItem = 0; gTasks[taskId].func = Task_DisplayMainMenuInvalidActionError; - gPlttBufferUnfaded[0xF1] = RGB_WHITE; - gPlttBufferFaded[0xF1] = RGB_WHITE; + gPlttBufferUnfaded[BG_PLTT_ID(15) + 1] = RGB_WHITE; + gPlttBufferFaded[BG_PLTT_ID(15) + 1] = RGB_WHITE; SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); @@ -1900,7 +1901,7 @@ static void AddBirchSpeechObjects(u8 taskId) gSprites[brendanSpriteId].invisible = TRUE; gSprites[brendanSpriteId].oam.priority = 0; gTasks[taskId].tBrendanSpriteId = brendanSpriteId; - maySpriteId = CreateTrainerSprite(FacilityClassToPicIndex(FACILITY_CLASS_MAY), 120, 60, 0, &gDecompressionBuffer[0x800]); + maySpriteId = CreateTrainerSprite(FacilityClassToPicIndex(FACILITY_CLASS_MAY), 120, 60, 0, &gDecompressionBuffer[TRAINER_PIC_SIZE]); gSprites[maySpriteId].callback = SpriteCB_Null; gSprites[maySpriteId].invisible = TRUE; gSprites[maySpriteId].oam.priority = 0; diff --git a/src/map_name_popup.c b/src/map_name_popup.c index 93a2825833..d004b18d56 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -198,30 +198,52 @@ static const u8 * const sBattlePyramid_MapHeaderStrings[FRONTIER_STAGES_PER_CHAL sText_Pyramid, }; -// Unused -static bool8 StartMenu_ShowMapNamePopup(void) +static bool8 UNUSED StartMenu_ShowMapNamePopup(void) { HideStartMenu(); ShowMapNamePopup(); return TRUE; } +// States and data defines for Task_MapNamePopUpWindow +enum { + STATE_SLIDE_IN, + STATE_WAIT, + STATE_SLIDE_OUT, + STATE_UNUSED, + STATE_ERASE, + STATE_END, + STATE_PRINT, // For some reason the first state is numerically last. +}; + +#define POPUP_OFFSCREEN_Y 40 +#define POPUP_SLIDE_SPEED 2 + +#define tState data[0] +#define tOnscreenTimer data[1] +#define tYOffset data[2] +#define tIncomingPopUp data[3] +#define tPrintTimer data[4] + void ShowMapNamePopup(void) { if (FlagGet(FLAG_HIDE_MAP_NAME_POPUP) != TRUE) { if (!FuncIsActiveTask(Task_MapNamePopUpWindow)) { + // New pop up window sPopupTaskId = CreateTask(Task_MapNamePopUpWindow, 90); - SetGpuReg(REG_OFFSET_BG0VOFS, 40); - gTasks[sPopupTaskId].data[0] = 6; - gTasks[sPopupTaskId].data[2] = 40; + SetGpuReg(REG_OFFSET_BG0VOFS, POPUP_OFFSCREEN_Y); + gTasks[sPopupTaskId].tState = STATE_PRINT; + gTasks[sPopupTaskId].tYOffset = POPUP_OFFSCREEN_Y; } else { - if (gTasks[sPopupTaskId].data[0] != 2) - gTasks[sPopupTaskId].data[0] = 2; - gTasks[sPopupTaskId].data[3] = 1; + // There's already a pop up window running. + // Hurry the old pop up offscreen so the new one can appear. + if (gTasks[sPopupTaskId].tState != STATE_SLIDE_OUT) + gTasks[sPopupTaskId].tState = STATE_SLIDE_OUT; + gTasks[sPopupTaskId].tIncomingPopUp = TRUE; } } } @@ -230,69 +252,78 @@ static void Task_MapNamePopUpWindow(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { - case 6: - task->data[4]++; - if (task->data[4] > 30) + case STATE_PRINT: + // Wait, then create and print the pop up window + if (++task->tPrintTimer > 30) { - task->data[0] = 0; - task->data[4] = 0; + task->tState = STATE_SLIDE_IN; + task->tPrintTimer = 0; ShowMapNamePopUpWindow(); } break; - case 0: - task->data[2] -= 2; - if (task->data[2] <= 0 ) + case STATE_SLIDE_IN: + // Slide the window onscreen. + task->tYOffset -= POPUP_SLIDE_SPEED; + if (task->tYOffset <= 0 ) { - task->data[2] = 0; - task->data[0] = 1; + task->tYOffset = 0; + task->tState = STATE_WAIT; gTasks[sPopupTaskId].data[1] = 0; } break; - case 1: - task->data[1]++; - if (task->data[1] > 120 ) + case STATE_WAIT: + // Wait while the window is fully onscreen. + if (++task->tOnscreenTimer > 120) { - task->data[1] = 0; - task->data[0] = 2; + task->tOnscreenTimer = 0; + task->tState = STATE_SLIDE_OUT; } break; - case 2: - task->data[2] += 2; - if (task->data[2] > 39) + case STATE_SLIDE_OUT: + // Slide the window offscreen. + task->tYOffset += POPUP_SLIDE_SPEED; + if (task->tYOffset >= POPUP_OFFSCREEN_Y) { - task->data[2] = 40; - if (task->data[3]) + task->tYOffset = POPUP_OFFSCREEN_Y; + if (task->tIncomingPopUp) { - task->data[0] = 6; - task->data[4] = 0; - task->data[3] = 0; + // A new pop up window is incoming, + // return to the first state to show it. + task->tState = STATE_PRINT; + task->tPrintTimer = 0; + task->tIncomingPopUp = FALSE; } else { - task->data[0] = 4; + task->tState = STATE_ERASE; return; } } break; - case 4: + case STATE_ERASE: ClearStdWindowAndFrame(GetMapNamePopUpWindowId(), TRUE); - task->data[0] = 5; + task->tState = STATE_END; break; - case 5: + case STATE_END: HideMapNamePopUpWindow(); return; } - SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]); + SetGpuReg(REG_OFFSET_BG0VOFS, task->tYOffset); } void HideMapNamePopUpWindow(void) { if (FuncIsActiveTask(Task_MapNamePopUpWindow)) { - ClearStdWindowAndFrame(GetMapNamePopUpWindowId(), TRUE); - RemoveMapNamePopUpWindow(); + #ifdef UBFIX + if (GetMapNamePopUpWindowId() != WINDOW_NONE) + #endif // UBFIX + { + ClearStdWindowAndFrame(GetMapNamePopUpWindowId(), TRUE); + RemoveMapNamePopUpWindow(); + } SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, 0); DestroyTask(sPopupTaskId); } diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c index 6075bd5d95..287419f901 100644 --- a/src/mauville_old_man.c +++ b/src/mauville_old_man.c @@ -740,8 +740,7 @@ void SanitizeMauvilleOldManForRuby(union OldMan * oldMan) } } -// Unused -static void SetMauvilleOldManLanguage(union OldMan * oldMan, u32 language1, u32 language2, u32 language3) +static void UNUSED SetMauvilleOldManLanguage(union OldMan * oldMan, u32 language1, u32 language2, u32 language3) { s32 i; @@ -969,7 +968,7 @@ static const struct Story sStorytellerStories[] = { MauvilleCity_PokemonCenter_1F_Text_PokemonCaughtStory }, { - GAME_STAT_FISHING_CAPTURES, 1, + GAME_STAT_FISHING_ENCOUNTERS, 1, MauvilleCity_PokemonCenter_1F_Text_FishingPokemonCaughtTitle, MauvilleCity_PokemonCenter_1F_Text_FishingPokemonCaughtAction, MauvilleCity_PokemonCenter_1F_Text_FishingPokemonCaughtStory diff --git a/src/menu.c b/src/menu.c index ad3381de9b..dd43e310dc 100644 --- a/src/menu.c +++ b/src/menu.c @@ -442,14 +442,12 @@ void Menu_LoadStdPalAt(u16 offset) LoadPalette(gStandardMenuPalette, offset, STD_WINDOW_PALETTE_SIZE); } -// Unused -static const u16 *Menu_GetStdPal(void) +static UNUSED const u16* Menu_GetStdPal(void) { return gStandardMenuPalette; } -// Unused -static u16 Menu_GetStdPalColor(u8 colorNum) +static u16 UNUSED Menu_GetStdPalColor(u8 colorNum) { if (colorNum > 15) colorNum = 0; @@ -510,14 +508,12 @@ void RemoveStartMenuWindow(void) } } -// Unused -static u16 GetDialogFrameBaseTileNum(void) +static u16 UNUSED GetDialogFrameBaseTileNum(void) { return DLG_WINDOW_BASE_TILE_NUM; } -// Unused -static u16 GetStandardFrameBaseTileNum(void) +static u16 UNUSED GetStandardFrameBaseTileNum(void) { return STD_WINDOW_BASE_TILE_NUM; } @@ -567,8 +563,7 @@ void DrawDialogFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 CopyWindowToVram(windowId, COPYWIN_FULL); } -// Never used. -static void DrawDialogFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 tileNum) +static void UNUSED DrawDialogFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 tileNum) { sTileNum = tileNum; sPaletteNum = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM); @@ -877,15 +872,13 @@ void HofPCTopBar_PrintPair(const u8 *string, const u8 *string2, bool8 noBg, u8 l } } -// Unused -static void HofPCTopBar_CopyToVram(void) +static void UNUSED HofPCTopBar_CopyToVram(void) { if (sHofPCTopBarWindowId != WINDOW_NONE) CopyWindowToVram(sHofPCTopBarWindowId, COPYWIN_FULL); } -// Unused -static void HofPCTopBar_Clear(void) +static void UNUSED HofPCTopBar_Clear(void) { if (sHofPCTopBarWindowId != WINDOW_NONE) { @@ -936,8 +929,7 @@ u8 InitMenuNormal(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 n return InitMenu(windowId, fontId, left, top, cursorHeight, numChoices, initialCursorPos, FALSE); } -// Unused -static u8 InitMenuDefaultCursorHeight(u8 windowId, u8 fontId, u8 left, u8 top, u8 numChoices, u8 initialCursorPos) +static u8 UNUSED InitMenuDefaultCursorHeight(u8 windowId, u8 fontId, u8 left, u8 top, u8 numChoices, u8 initialCursorPos) { u8 cursorHeight = GetMenuCursorDimensionByFont(fontId, 1); return InitMenuNormal(windowId, fontId, left, top, cursorHeight, numChoices, initialCursorPos); @@ -1114,8 +1106,7 @@ void PrintMenuActionTextsAtPos(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineH CopyWindowToVram(windowId, COPYWIN_GFX); } -// Unused -static void PrintMenuActionTextsWithSpacing(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *menuActions, u8 letterSpacing, u8 lineSpacing) +static void UNUSED PrintMenuActionTextsWithSpacing(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *menuActions, u8 letterSpacing, u8 lineSpacing) { u8 i; for (i = 0; i < itemCount; i++) @@ -1123,8 +1114,7 @@ static void PrintMenuActionTextsWithSpacing(u8 windowId, u8 fontId, u8 left, u8 CopyWindowToVram(windowId, COPYWIN_GFX); } -// Unused -static void PrintMenuActionTextsAtTop(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *menuActions) +static void UNUSED PrintMenuActionTextsAtTop(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *menuActions) { PrintMenuActionTextsAtPos(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 1, lineHeight, itemCount, menuActions); } @@ -1156,8 +1146,7 @@ void PrintMenuActionTexts(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpac CopyWindowToVram(windowId, COPYWIN_GFX); } -// Unused -static void PrintMenuActionTextsAtTopById(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *menuActions, const u8 *actionIds) +static void UNUSED PrintMenuActionTextsAtTopById(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *menuActions, const u8 *actionIds) { PrintMenuActionTexts(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 1, GetFontAttribute(fontId, FONTATTR_LETTER_SPACING), lineHeight, itemCount, menuActions, actionIds); } @@ -1214,7 +1203,7 @@ static void CreateYesNoMenuAtPos(const struct WindowTemplate *window, u8 fontId, InitMenuNormal(sYesNoWindowId, fontId, left, top, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT), 2, initialCursorPos); } -static void CreateYesNoMenuInTopLeft(const struct WindowTemplate *window, u8 fontId, u16 baseTileNum, u8 paletteNum) +static void UNUSED CreateYesNoMenuInTopLeft(const struct WindowTemplate *window, u8 fontId, u16 baseTileNum, u8 paletteNum) { CreateYesNoMenuAtPos(window, fontId, 0, 1, baseTileNum, paletteNum, 0); } @@ -1245,8 +1234,7 @@ static void PrintMenuActionGridText(u8 windowId, u8 fontId, u8 left, u8 top, u8 CopyWindowToVram(windowId, COPYWIN_GFX); } -// Unused -static void PrintMenuActionGridTextAtTop(u8 windowId, u8 fontId, u8 width, u8 height, u8 columns, u8 rows, const struct MenuAction *menuActions) +static void UNUSED PrintMenuActionGridTextAtTop(u8 windowId, u8 fontId, u8 width, u8 height, u8 columns, u8 rows, const struct MenuAction *menuActions) { PrintMenuActionGridText(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 0, width, height, columns, rows, menuActions); } @@ -1282,8 +1270,7 @@ void PrintMenuActionGrid(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth CopyWindowToVram(windowId, COPYWIN_GFX); } -// Unused -static void PrintMenuActionGrid_TopLeft(u8 windowId, u8 fontId, u8 optionWidth, u8 unused, u8 horizontalCount, u8 verticalCount, const struct MenuAction *menuActions, const u8 *actionIds) +static void UNUSED PrintMenuActionGrid_TopLeft(u8 windowId, u8 fontId, u8 optionWidth, u8 unused, u8 horizontalCount, u8 verticalCount, const struct MenuAction *menuActions, const u8 *actionIds) { PrintMenuActionGrid(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 0, optionWidth, horizontalCount, verticalCount, menuActions, actionIds); } @@ -1315,8 +1302,7 @@ static u8 InitMenuGrid(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, return sMenu.cursorPos; } -// Unused -static u8 InitMenuGridDefaultCursorHeight(u8 windowId, u8 fontId, u8 left, u8 top, u8 width, u8 columns, u8 rows, u8 cursorPos) +static u8 UNUSED InitMenuGridDefaultCursorHeight(u8 windowId, u8 fontId, u8 left, u8 top, u8 width, u8 columns, u8 rows, u8 cursorPos) { u8 cursorHeight = GetMenuCursorDimensionByFont(fontId, 1); u8 numChoices = columns * rows; @@ -1408,8 +1394,7 @@ u8 ChangeGridMenuCursorPosition(s8 deltaX, s8 deltaY) } } -// Unused -static s8 Menu_ProcessGridInput_NoSoundLimit(void) +static s8 UNUSED Menu_ProcessGridInput_NoSoundLimit(void) { if (JOY_NEW(A_BUTTON)) { @@ -1489,8 +1474,7 @@ s8 Menu_ProcessGridInput(void) return MENU_NOTHING_CHOSEN; } -// Unused -static s8 Menu_ProcessGridInputRepeat_NoSoundLimit(void) +static s8 UNUSED Menu_ProcessGridInputRepeat_NoSoundLimit(void) { if (JOY_NEW(A_BUTTON)) { @@ -1529,8 +1513,7 @@ static s8 Menu_ProcessGridInputRepeat_NoSoundLimit(void) return MENU_NOTHING_CHOSEN; } -// Unused -static s8 Menu_ProcessGridInputRepeat(void) +static s8 UNUSED Menu_ProcessGridInputRepeat(void) { u8 oldPos = sMenu.cursorPos; @@ -1674,8 +1657,7 @@ void PrintMenuGridTable(u8 windowId, u8 optionWidth, u8 columns, u8 rows, const CopyWindowToVram(windowId, COPYWIN_GFX); } -// Unused -static void PrintMenuActionGridTextNoSpacing(u8 windowId, u8 optionWidth, u8 columns, u8 rows, const struct MenuAction *menuActions, const u8 *actionIds) +static void UNUSED PrintMenuActionGridTextNoSpacing(u8 windowId, u8 optionWidth, u8 columns, u8 rows, const struct MenuAction *menuActions, const u8 *actionIds) { u8 i; u8 j; @@ -2007,7 +1989,7 @@ void PrintPlayerNameOnWindow(u8 windowId, const u8 *src, u16 x, u16 y) AddTextPrinterParameterized(windowId, 1, gStringVar4, x, y, TEXT_SKIP_DRAW, 0); } -static void UnusedBlitBitmapRect(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height) +static void UNUSED UnusedBlitBitmapRect(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height) { int loopSrcY, loopDstY, loopSrcX, loopDstX, xEnd, yEnd, multiplierSrcY, multiplierDstY; const u8 *pixelsSrc; @@ -2082,14 +2064,12 @@ static void UnusedBlitBitmapRect(const struct Bitmap *src, struct Bitmap *dst, u } } -// Unused -static void LoadMonIconPalAtOffset(u8 palOffset, u16 speciesId) +static void UNUSED LoadMonIconPalAtOffset(u8 palOffset, u16 speciesId) { LoadPalette(GetValidMonIconPalettePtr(speciesId), palOffset, PLTT_SIZE_4BPP); } -// Unused -static void DrawMonIconAtPos(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y) +static void UNUSED DrawMonIconAtPos(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y) { BlitBitmapToWindow(windowId, GetMonIconPtr(speciesId, personality, 1), x, y, 32, 32); } diff --git a/src/menu_specialized.c b/src/menu_specialized.c index 8f25c3188f..20ddce1f44 100644 --- a/src/menu_specialized.c +++ b/src/menu_specialized.c @@ -236,8 +236,7 @@ void MailboxMenu_RemoveWindow(u8 windowIdx) sMailboxWindowIds[windowIdx] = WINDOW_NONE; } -// Unused -static u8 MailboxMenu_GetWindowId(u8 windowIdx) +static u8 UNUSED MailboxMenu_GetWindowId(u8 windowIdx) { return sMailboxWindowIds[windowIdx]; } @@ -588,7 +587,7 @@ static void ConditionGraph_CalcRightHalf(struct ConditionGraph *graph) // No need for conditional, positions on the Beauty line are always above the Cute line ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_BEAUTY], &graph->curPositions[GRAPH_CUTE], TRUE, NULL); - // Calculate Cute -> Tough line (includes left scanline because this crosses the halfway point) + // Calculate Cute -> Smart line (includes left scanline because this crosses the halfway point) i = (graph->curPositions[GRAPH_CUTE].y <= graph->curPositions[GRAPH_SMART].y); ConditionGraph_CalcLine(graph, graph->scanlineRight[0], &graph->curPositions[GRAPH_CUTE], &graph->curPositions[GRAPH_SMART], i, graph->scanlineLeft[0]); @@ -918,7 +917,7 @@ static u8 *GetConditionMenuMonString(u8 *dst, u16 boxId, u16 monId) *(dst++) = TEXT_COLOR_TRANSPARENT; *(dst++) = TEXT_COLOR_LIGHT_BLUE; if (GetBoxOrPartyMonData(box, mon, MON_DATA_IS_EGG, NULL)) - return StringCopyPadded(dst, gText_EggNickname, 0, 12); + return StringCopyPadded(dst, gText_EggNickname, 0, POKEMON_NAME_LENGTH + 2); GetBoxOrPartyMonData(box, mon, MON_DATA_NICKNAME, dst); StringGet_Nickname(dst); species = GetBoxOrPartyMonData(box, mon, MON_DATA_SPECIES, NULL); @@ -1020,7 +1019,7 @@ void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId locationDst[3] = TEXT_COLOR_TRANSPARENT; locationDst[4] = TEXT_COLOR_LIGHT_BLUE; if (box == TOTAL_BOXES_COUNT) // Party mon. - BufferConditionMenuSpacedStringN(&locationDst[5], gText_InParty, 8); + BufferConditionMenuSpacedStringN(&locationDst[5], gText_InParty, BOX_NAME_LENGTH); else BufferConditionMenuSpacedStringN(&locationDst[5], GetBoxNamePtr(box), BOX_NAME_LENGTH); } @@ -1029,7 +1028,7 @@ void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId for (i = 0; i < POKEMON_NAME_LENGTH + 2; i++) nameDst[i] = CHAR_SPACE; nameDst[i] = EOS; - for (i = 0; i < 8; i++) + for (i = 0; i < BOX_NAME_LENGTH; i++) locationDst[i] = CHAR_SPACE; locationDst[i] = EOS; } diff --git a/src/mini_printf.c b/src/mini_printf.c index d96a9379a1..cab78d7611 100644 --- a/src/mini_printf.c +++ b/src/mini_printf.c @@ -41,7 +41,7 @@ #ifndef NDEBUG -struct mini_buff +struct mini_buff { char *buffer, *pbuffer; u32 buffer_len; @@ -95,15 +95,17 @@ static s32 _putsAscii(char *s, s32 len, void *buf) s32 i; struct mini_buff *b; - if (!buf) + if (!buf) return len; - + b = buf; p0 = b->buffer; /* Copy to buffer */ - for (i = 0; i < len; i++) { - if(b->pbuffer == b->buffer + b->buffer_len - 1) { + for (i = 0; i < len; i++) + { + if(b->pbuffer == b->buffer + b->buffer_len - 1) + { break; } *(b->pbuffer ++) = s[i]; @@ -118,15 +120,17 @@ static s32 _putsEncoded(char *s, s32 len, void *buf) s32 i; struct mini_buff *b; - if (!buf) + if (!buf) return len; - + b = buf; p0 = b->buffer; /* Copy to buffer */ - for (i = 0; i < len; i++) { - if(b->pbuffer == b->buffer + b->buffer_len - 1) { + for (i = 0; i < len; i++) + { + if(b->pbuffer == b->buffer + b->buffer_len - 1) + { break; } *(b->pbuffer ++) = mini_pchar_decode(s[i]); @@ -159,7 +163,7 @@ static s32 mini_itoa(s32 value, u32 radix, s32 uppercase, bool32 unsig, char *bu } /* This builds the string back to front ... */ - do + do { s32 digit = value % radix; *(pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10); @@ -191,7 +195,8 @@ static s32 mini_pad(char* ptr, s32 len, char pad_char, s32 pad_to, char *buffer) char * pbuffer = buffer; if(pad_to == 0) pad_to = len; - if (len > pad_to) { + if (len > pad_to) + { len = pad_to; overflow = TRUE; } @@ -243,7 +248,7 @@ s32 mini_vpprintf(void* buf, const char *fmt, va_list va) { len = 1; len = _putsAscii(&ch, len, buf); - } else + } else { char pad_char = ' '; s32 pad_to = 0; @@ -270,7 +275,7 @@ s32 mini_vpprintf(void* buf, const char *fmt, va_list va) ch=*(fmt++); } - switch (ch) + switch (ch) { case 0: goto end; @@ -328,7 +333,7 @@ s32 mini_vpprintf(void* buf, const char *fmt, va_list va) break; case 'S' : // preproc encoded string handler ptr = va_arg(va, char*); - len = StringLength(ptr); + len = StringLength((u8*)ptr); if (pad_to > 0) { len = mini_pad(ptr, len, pad_char, pad_to, bf); diff --git a/src/minigame_countdown.c b/src/minigame_countdown.c index b4d3b6558b..617922e5aa 100644 --- a/src/minigame_countdown.c +++ b/src/minigame_countdown.c @@ -158,8 +158,7 @@ static const TaskFunc sStaticCountdownFuncs[][4] = #define sId data[4] // Never read #define sNumberSpriteId data[5] // Never read -// Unused -static u32 CreateStaticCountdownTask(u8 funcSetId, u8 taskPriority) +static u32 UNUSED CreateStaticCountdownTask(u8 funcSetId, u8 taskPriority) { u8 taskId = CreateTask(Task_StaticCountdown, taskPriority); struct Task *task = &gTasks[taskId]; @@ -170,7 +169,7 @@ static u32 CreateStaticCountdownTask(u8 funcSetId, u8 taskPriority) return taskId; } -static bool32 StartStaticCountdown(void) +static bool32 UNUSED StartStaticCountdown(void) { u8 taskId = FindTaskIdByFunc(Task_StaticCountdown); if (taskId == TASK_NONE) @@ -180,7 +179,7 @@ static bool32 StartStaticCountdown(void) return TRUE; } -static bool32 IsStaticCountdownRunning(void) +static bool32 UNUSED IsStaticCountdownRunning(void) { return FuncIsActiveTask(Task_StaticCountdown); } diff --git a/src/mirage_tower.c b/src/mirage_tower.c index 01b87393ae..b1e2e5003b 100644 --- a/src/mirage_tower.c +++ b/src/mirage_tower.c @@ -8,6 +8,7 @@ #include "gpu_regs.h" #include "menu.h" #include "random.h" +#include "palette.h" #include "palette_util.h" #include "script.h" #include "sound.h" @@ -74,7 +75,7 @@ static void Task_FossilFallAndSink(u8); static void SpriteCB_FallingFossil(struct Sprite *); static void UpdateDisintegrationEffect(u8 *, u16, u8, u8, u8); -static const u8 sBlankTile_Gfx[32] = {0}; +static const u8 ALIGNED(2) sBlankTile_Gfx[32] = {0}; static const u8 sMirageTower_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower.4bpp"); static const u16 sMirageTowerTilemap[] = INCBIN_U16("graphics/misc/mirage_tower.bin"); static const u16 sFossil_Pal[] = INCBIN_U16("graphics/object_events/pics/misc/fossil.gbapal"); // Unused @@ -163,7 +164,7 @@ static const struct SpriteTemplate sSpriteTemplate_FallingFossil = const struct PulseBlendSettings gMirageTowerPulseBlendSettings = { .blendColor = RGB(27, 25, 16), - .paletteOffset = 0x61, + .paletteOffset = BG_PLTT_ID(6) + 1, .numColors = 15, .delay = 5, .numFadeCycles = -1, @@ -430,7 +431,7 @@ void DoMirageTowerCeilingCrumble(void) static void WaitCeilingCrumble(u8 taskId) { - u16 *data = gTasks[taskId].data; + u16 *data = (u16*)gTasks[taskId].data; data[1]++; // Either wait 1000 frames, or until all 16 crumble sprites and the one screen-shake task are completed. if (data[1] == 1000 || data[0] == 17) diff --git a/src/move_relearner.c b/src/move_relearner.c index af4593e533..975663e4d3 100644 --- a/src/move_relearner.c +++ b/src/move_relearner.c @@ -369,7 +369,7 @@ static void VBlankCB_MoveRelearner(void) TransferPlttBuffer(); } -// Script arguments: The pokemon to teach is in VAR_0x8004 +// Script arguments: The Pokémon to teach is in VAR_0x8004 void TeachMoveRelearnerMove(void) { LockPlayerFieldControls(); diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c index c44b7a2620..78e4a45715 100644 --- a/src/mystery_gift_menu.c +++ b/src/mystery_gift_menu.c @@ -597,8 +597,7 @@ static void ShowDownArrow(void) DrawDownArrow(WIN_MSG, DOWN_ARROW_X, DOWN_ARROW_Y, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); } -// Unused -static bool32 HideDownArrowAndWaitButton(u8 * textState) +static bool32 UNUSED HideDownArrowAndWaitButton(u8 * textState) { switch (*textState) { @@ -722,7 +721,7 @@ s8 DoMysteryGiftYesNo(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, c // Handle the "Receive/Send/Toss" menu that appears when selecting Wonder Card/News static s32 HandleGiftSelectMenu(u8 * textState, u16 * windowId, bool32 cannotToss, bool32 cannotSend) { - struct WindowTemplate windowTemplate; + struct WindowTemplate UNUSED windowTemplate; s32 input; switch (*textState) diff --git a/src/naming_screen.c b/src/naming_screen.c index 58c9f0f369..d8ae7ccd4d 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -978,10 +978,10 @@ static u16 GetButtonPalOffset(u8 button) { const u16 palOffsets[BUTTON_COUNT + 1] = { - [BUTTON_PAGE] = IndexOfSpritePaletteTag(PALTAG_PAGE_SWAP) * 16 + 0x10E, - [BUTTON_BACK] = IndexOfSpritePaletteTag(PALTAG_BACK_BUTTON) * 16 + 0x10E, - [BUTTON_OK] = IndexOfSpritePaletteTag(PALTAG_OK_BUTTON) * 16 + 0x10E, - [BUTTON_COUNT] = IndexOfSpritePaletteTag(PALTAG_OK_BUTTON) * 16 + 0x101, + [BUTTON_PAGE] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_PAGE_SWAP)) + 14, + [BUTTON_BACK] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_BACK_BUTTON)) + 14, + [BUTTON_OK] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_OK_BUTTON)) + 14, + [BUTTON_COUNT] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_OK_BUTTON)) + 1, }; return palOffsets[button]; @@ -1051,7 +1051,7 @@ static void SpriteCB_Cursor(struct Sprite *sprite) { s8 gb = sprite->sColor; s8 r = sprite->sColor >> 1; - u16 index = IndexOfSpritePaletteTag(PALTAG_CURSOR) * 16 + 0x0101; + u16 index = OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_CURSOR)) + 1; MultiplyInvertedPaletteRGBComponents(index, r, gb, gb); } @@ -1067,7 +1067,7 @@ static void SpriteCB_InputArrow(struct Sprite *sprite) if (sprite->sDelay == 0 || --sprite->sDelay == 0) { sprite->sDelay = 8; - sprite->sXPosId = (sprite->sXPosId + 1) & (ARRAY_COUNT(x) - 1); + sprite->sXPosId = MOD(sprite->sXPosId + 1, ARRAY_COUNT(x)); } sprite->x2 = x[sprite->sXPosId]; } @@ -1097,7 +1097,7 @@ static void SpriteCB_Underscore(struct Sprite *sprite) sprite->sDelay++; if (sprite->sDelay > 8) { - sprite->sYPosId = (sprite->sYPosId + 1) & (ARRAY_COUNT(y) - 1); + sprite->sYPosId = MOD(sprite->sYPosId + 1, ARRAY_COUNT(y)); sprite->sDelay = 0; } } @@ -2058,23 +2058,23 @@ static bool8 IsWideLetter(u8 character) return FALSE; } -// Debug? Unused, and arguments aren't sensible for non-player screens. -static void Debug_NamingScreenPlayer(void) +// Debug? Arguments aren't sensible for non-player screens. +static void UNUSED Debug_NamingScreenPlayer(void) { DoNamingScreen(NAMING_SCREEN_PLAYER, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnToFieldWithOpenMenu); } -static void Debug_NamingScreenBox(void) +static void UNUSED Debug_NamingScreenBox(void) { DoNamingScreen(NAMING_SCREEN_BOX, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnToFieldWithOpenMenu); } -static void Debug_NamingScreenCaughtMon(void) +static void UNUSED Debug_NamingScreenCaughtMon(void) { DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnToFieldWithOpenMenu); } -static void Debug_NamingScreenNickname(void) +static void UNUSED Debug_NamingScreenNickname(void) { DoNamingScreen(NAMING_SCREEN_NICKNAME, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnToFieldWithOpenMenu); } diff --git a/src/overworld.c b/src/overworld.c index 3d46fc5005..e1cb0a1cad 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -134,14 +134,11 @@ static void CreateLinkPlayerSprite(u8, u8); static void GetLinkPlayerCoords(u8, u16 *, u16 *); static u8 GetLinkPlayerFacingDirection(u8); static u8 GetLinkPlayerElevation(u8); -static s32 GetLinkPlayerObjectStepTimer(u8); static u8 GetLinkPlayerIdAt(s16, s16); static void SetPlayerFacingDirection(u8, u8); static void ZeroObjectEvent(struct ObjectEvent *); static void SpawnLinkPlayerObjectEvent(u8, s16, s16, u8); static void InitLinkPlayerObjectEventPos(struct ObjectEvent *, s16, s16); -static void SetLinkPlayerObjectRange(u8, u8); -static void DestroyLinkPlayerObject(u8); static u8 GetSpriteForLinkedPlayer(u8); static void RunTerminateLinkScript(void); static u32 GetLinkSendQueueLength(void); @@ -1004,8 +1001,8 @@ void SetObjectEventLoadFlag(u8 flag) sObjectEventLoadFlag = flag; } -// Unused, sObjectEventLoadFlag is read directly -static u8 GetObjectEventLoadFlag(void) +// sObjectEventLoadFlag is read directly +static u8 UNUSED GetObjectEventLoadFlag(void) { return sObjectEventLoadFlag; } @@ -1300,7 +1297,7 @@ void UpdateAmbientCry(s16 *state, u16 *delayCounter) } } // Ambient cries after the first one take between 1200-2399 frames (~20-40 seconds) - // If the player has a pokemon with the ability Swarm in their party, the time is halved to 600-1199 frames (~10-20 seconds) + // If the player has a Pokémon with the ability Swarm in their party, the time is halved to 600-1199 frames (~10-20 seconds) *delayCounter = ((Random() % 1200) + 1200) / divBy; *state = AMB_CRY_WAIT; break; @@ -1312,7 +1309,7 @@ void UpdateAmbientCry(s16 *state, u16 *delayCounter) } break; case AMB_CRY_IDLE: - // No land/water pokemon on this map + // No land/water Pokémon on this map break; } } @@ -1323,7 +1320,7 @@ static void ChooseAmbientCrySpecies(void) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE130)) && !IsMirageIslandPresent()) { - // Only play water pokemon cries on this route + // Only play water Pokémon cries on this route // when Mirage Island is not present sIsAmbientCryWaterMon = TRUE; sAmbientCrySpecies = GetLocalWaterMon(); @@ -2165,7 +2162,7 @@ static void InitObjectEventsLink(void) static void InitObjectEventsLocal(void) { - s16 x, y; + u16 x, y; struct InitialPlayerAvatarState *player; gTotalCameraPixelOffsetX = 0; @@ -2661,8 +2658,7 @@ u32 GetCableClubPartnersReady(void) return CABLE_SEAT_WAITING; } -// Unused -static bool32 IsAnyPlayerExitingCableClub(void) +static bool32 UNUSED IsAnyPlayerExitingCableClub(void) { return IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM); } @@ -2970,7 +2966,7 @@ static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s1 ObjectEventUpdateElevation(objEvent); } -static void SetLinkPlayerObjectRange(u8 linkPlayerId, u8 dir) +static void UNUSED SetLinkPlayerObjectRange(u8 linkPlayerId, u8 dir) { if (gLinkPlayerObjectEvents[linkPlayerId].active) { @@ -2980,7 +2976,7 @@ static void SetLinkPlayerObjectRange(u8 linkPlayerId, u8 dir) } } -static void DestroyLinkPlayerObject(u8 linkPlayerId) +static void UNUSED DestroyLinkPlayerObject(u8 linkPlayerId) { struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId]; u8 objEventId = linkPlayerObjEvent->objEventId; @@ -3021,7 +3017,7 @@ static u8 GetLinkPlayerElevation(u8 linkPlayerId) return objEvent->currentElevation; } -static s32 GetLinkPlayerObjectStepTimer(u8 linkPlayerId) +static s32 UNUSED GetLinkPlayerObjectStepTimer(u8 linkPlayerId) { u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; @@ -3054,7 +3050,7 @@ static void SetPlayerFacingDirection(u8 linkPlayerId, u8 facing) { if (facing > FACING_FORCED_RIGHT) { - objEvent->triggerGroundEffectsOnMove = 1; + objEvent->triggerGroundEffectsOnMove = TRUE; } else { @@ -3203,7 +3199,7 @@ static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion) sprite = &gSprites[objEvent->spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->data[0] = linkPlayerId; - objEvent->triggerGroundEffectsOnMove = 0; + objEvent->triggerGroundEffectsOnMove = FALSE; } } diff --git a/src/palette.c b/src/palette.c index 577257eff3..f19ac07cf6 100644 --- a/src/palette.c +++ b/src/palette.c @@ -64,7 +64,7 @@ static EWRAM_DATA struct PaletteStruct sPaletteStructs[NUM_PALETTE_STRUCTS] = {0 EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0}; static EWRAM_DATA u32 sFiller = 0; static EWRAM_DATA u32 sPlttBufferTransferPending = 0; -EWRAM_DATA u8 gPaletteDecompressionBuffer[PLTT_DECOMP_BUFFER_SIZE] = {0}; +EWRAM_DATA u8 ALIGNED(2) gPaletteDecompressionBuffer[PLTT_SIZE] = {0}; static const struct PaletteStructTemplate sDummyPaletteStructTemplate = { .id = 0xFFFF, @@ -148,7 +148,7 @@ static void ReadPlttIntoBuffers(void) u16 i; u16 *pltt = (u16 *)PLTT; - for (i = 0; i < PLTT_SIZE / 2; i++) + for (i = 0; i < PLTT_BUFFER_SIZE; i++) { gPlttBufferUnfaded[i] = pltt[i]; gPlttBufferFaded[i] = pltt[i]; @@ -201,15 +201,13 @@ bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targe } } -// Unused -static bool8 BeginPlttFade(u32 selectedPalettes, u8 delay, u8 startY, u8 targetY, u16 blendColor) +static bool8 UNUSED BeginPlttFade(u32 selectedPalettes, u8 delay, u8 startY, u8 targetY, u16 blendColor) { ReadPlttIntoBuffers(); return BeginNormalPaletteFade(selectedPalettes, delay, startY, targetY, blendColor); } -// Unused -static void PaletteStruct_Run(u8 a1, u32 *unkFlags) +static void UNUSED PaletteStruct_Run(u8 a1, u32 *unkFlags) { u8 i; @@ -382,14 +380,14 @@ void ResetPaletteFadeControl(void) gPaletteFade.deltaY = 2; } -static void PaletteStruct_SetUnusedFlag(u16 id) +static void UNUSED PaletteStruct_SetUnusedFlag(u16 id) { u8 paletteNum = PaletteStruct_GetPalNum(id); if (paletteNum != NUM_PALETTE_STRUCTS) sPaletteStructs[paletteNum].flag = TRUE; } -static void PaletteStruct_ClearUnusedFlag(u16 id) +static void UNUSED PaletteStruct_ClearUnusedFlag(u16 id) { u8 paletteNum = PaletteStruct_GetPalNum(id); if (paletteNum != NUM_PALETTE_STRUCTS) @@ -440,7 +438,7 @@ static u8 UpdateNormalPaletteFade(void) else { selectedPalettes = gPaletteFade_selectedPalettes >> 16; - paletteOffset = 256; + paletteOffset = OBJ_PLTT_OFFSET; } while (selectedPalettes) @@ -592,13 +590,13 @@ static u8 UpdateFastPaletteFade(void) if (gPaletteFade.objPaletteToggle) { - paletteOffsetStart = 256; - paletteOffsetEnd = 512; + paletteOffsetStart = OBJ_PLTT_OFFSET; + paletteOffsetEnd = PLTT_BUFFER_SIZE; } else { paletteOffsetStart = 0; - paletteOffsetEnd = 256; + paletteOffsetEnd = OBJ_PLTT_OFFSET; } switch (gPaletteFade_submode) @@ -982,8 +980,7 @@ void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTa gTasks[taskId].func(taskId); } -// Unused -static bool32 IsBlendPalettesGraduallyTaskActive(u8 id) +static bool32 UNUSED IsBlendPalettesGraduallyTaskActive(u8 id) { int i; @@ -996,8 +993,7 @@ static bool32 IsBlendPalettesGraduallyTaskActive(u8 id) return FALSE; } -// Unused -static void DestroyBlendPalettesGraduallyTask(void) +static void UNUSED DestroyBlendPalettesGraduallyTask(void) { u8 taskId; diff --git a/src/palette_util.c b/src/palette_util.c index 08239c3363..d24321d580 100755 --- a/src/palette_util.c +++ b/src/palette_util.c @@ -39,8 +39,7 @@ u8 RouletteFlash_Add(struct RouletteFlashUtil *flash, u8 id, const struct Roulet return id; } -// Unused -static u8 RouletteFlash_Remove(struct RouletteFlashUtil *flash, u8 id) +static u8 UNUSED RouletteFlash_Remove(struct RouletteFlashUtil *flash, u8 id) { if (id >= ARRAY_COUNT(flash->palettes)) return 0xFF; @@ -470,7 +469,7 @@ void SetTilemapRect(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height) } } -static void FillTilemapRect_Unused(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) +static void UNUSED FillTilemapRect_Unused(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) { u8 i, j; u8 x, y; @@ -486,7 +485,7 @@ static void FillTilemapRect_Unused(void *dest, u16 value, u8 left, u8 top, u8 wi } } -static void SetTilemapRect_Unused(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) +static void UNUSED SetTilemapRect_Unused(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) { u8 i, j; u8 x, y; diff --git a/src/party_menu.c b/src/party_menu.c index 0d5636db8f..9fd8d41d3b 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -170,7 +170,7 @@ enum { }; enum { - // Window ids 0-5 are implicitly assigned to each party pokemon in InitPartyMenuBoxes + // Window ids 0-5 are implicitly assigned to each party Pokémon in InitPartyMenuBoxes WIN_MSG = PARTY_SIZE, }; @@ -778,11 +778,11 @@ static bool8 AllocPartyMenuBgGfx(void) return FALSE; } -static void PartyPaletteBufferCopy(u8 offset) +static void PartyPaletteBufferCopy(u8 palNum) { - offset *= 16; - CpuCopy16(&gPlttBufferUnfaded[0x30], &gPlttBufferUnfaded[offset], 32); - CpuCopy16(&gPlttBufferUnfaded[0x30], &gPlttBufferFaded[offset], 32); + u8 offset = PLTT_ID(palNum); + CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(3)], &gPlttBufferUnfaded[offset], PLTT_SIZE_4BPP); + CpuCopy16(&gPlttBufferUnfaded[BG_PLTT_ID(3)], &gPlttBufferFaded[offset], PLTT_SIZE_4BPP); } static void FreePartyPointers(void) @@ -1939,7 +1939,7 @@ u8 GetMonAilment(struct Pokemon *mon) static void SetPartyMonsAllowedInMinigame(void) { - u16 *ptr; + s16 *ptr; if (gPartyMenu.menuType == PARTY_MENU_TYPE_MINIGAME) { @@ -2197,16 +2197,16 @@ static void DrawEmptySlot(u8 windowId) BlitBitmapToPartyWindow(windowId, sSlotTilemap_WideEmpty, 18, 0, 0, 18, 3); } -#define LOAD_PARTY_BOX_PAL(paletteIds, paletteOffsets) \ -{ \ - LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[0]), paletteOffsets[0] + palNum, PLTT_SIZEOF(1)); \ - LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[1]), paletteOffsets[1] + palNum, PLTT_SIZEOF(1)); \ - LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[2]), paletteOffsets[2] + palNum, PLTT_SIZEOF(1)); \ +#define LOAD_PARTY_BOX_PAL(paletteIds, paletteOffsets) \ +{ \ + LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[0]), paletteOffsets[0] + palOffset, PLTT_SIZEOF(1)); \ + LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[1]), paletteOffsets[1] + palOffset, PLTT_SIZEOF(1)); \ + LoadPalette(GetPartyMenuPalBufferPtr(paletteIds[2]), paletteOffsets[2] + palOffset, PLTT_SIZEOF(1)); \ } static void LoadPartyBoxPalette(struct PartyMenuBox *menuBox, u8 palFlags) { - u8 palNum = GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM) * 16; + u8 palOffset = BG_PLTT_ID(GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM)); if (palFlags & PARTY_PAL_NO_MON) { @@ -2334,7 +2334,7 @@ static void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *mon, struct Pa static void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, struct PartyMenuBox *menuBox) { - u8 palNum = GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM) * 16; + u8 palOffset = BG_PLTT_ID(GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM)); if (species == SPECIES_NONE) return; @@ -2343,13 +2343,13 @@ static void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, stru switch (gender) { case MON_MALE: - LoadPalette(GetPartyMenuPalBufferPtr(sGenderMalePalIds[0]), sGenderPalOffsets[0] + palNum, PLTT_SIZEOF(1)); - LoadPalette(GetPartyMenuPalBufferPtr(sGenderMalePalIds[1]), sGenderPalOffsets[1] + palNum, PLTT_SIZEOF(1)); + LoadPalette(GetPartyMenuPalBufferPtr(sGenderMalePalIds[0]), sGenderPalOffsets[0] + palOffset, PLTT_SIZEOF(1)); + LoadPalette(GetPartyMenuPalBufferPtr(sGenderMalePalIds[1]), sGenderPalOffsets[1] + palOffset, PLTT_SIZEOF(1)); DisplayPartyPokemonBarDetail(menuBox->windowId, gText_MaleSymbol, 2, &menuBox->infoRects->dimensions[8]); break; case MON_FEMALE: - LoadPalette(GetPartyMenuPalBufferPtr(sGenderFemalePalIds[0]), sGenderPalOffsets[0] + palNum, PLTT_SIZEOF(1)); - LoadPalette(GetPartyMenuPalBufferPtr(sGenderFemalePalIds[1]), sGenderPalOffsets[1] + palNum, PLTT_SIZEOF(1)); + LoadPalette(GetPartyMenuPalBufferPtr(sGenderFemalePalIds[0]), sGenderPalOffsets[0] + palOffset, PLTT_SIZEOF(1)); + LoadPalette(GetPartyMenuPalBufferPtr(sGenderFemalePalIds[1]), sGenderPalOffsets[1] + palOffset, PLTT_SIZEOF(1)); DisplayPartyPokemonBarDetail(menuBox->windowId, gText_FemaleSymbol, 2, &menuBox->infoRects->dimensions[8]); break; } @@ -2403,23 +2403,23 @@ static void DisplayPartyPokemonHPBarCheck(struct Pokemon *mon, struct PartyMenuB static void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct PartyMenuBox *menuBox) { - u8 palNum = GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM) * 16; + u8 palOffset = BG_PLTT_ID(GetWindowAttribute(menuBox->windowId, WINDOW_PALETTE_NUM)); u8 hpFraction; switch (GetHPBarLevel(hp, maxhp)) { case HP_BAR_GREEN: case HP_BAR_FULL: - LoadPalette(GetPartyMenuPalBufferPtr(sHPBarGreenPalIds[0]), sHPBarPalOffsets[0] + palNum, PLTT_SIZEOF(1)); - LoadPalette(GetPartyMenuPalBufferPtr(sHPBarGreenPalIds[1]), sHPBarPalOffsets[1] + palNum, PLTT_SIZEOF(1)); + LoadPalette(GetPartyMenuPalBufferPtr(sHPBarGreenPalIds[0]), sHPBarPalOffsets[0] + palOffset, PLTT_SIZEOF(1)); + LoadPalette(GetPartyMenuPalBufferPtr(sHPBarGreenPalIds[1]), sHPBarPalOffsets[1] + palOffset, PLTT_SIZEOF(1)); break; case HP_BAR_YELLOW: - LoadPalette(GetPartyMenuPalBufferPtr(sHPBarYellowPalIds[0]), sHPBarPalOffsets[0] + palNum, PLTT_SIZEOF(1)); - LoadPalette(GetPartyMenuPalBufferPtr(sHPBarYellowPalIds[1]), sHPBarPalOffsets[1] + palNum, PLTT_SIZEOF(1)); + LoadPalette(GetPartyMenuPalBufferPtr(sHPBarYellowPalIds[0]), sHPBarPalOffsets[0] + palOffset, PLTT_SIZEOF(1)); + LoadPalette(GetPartyMenuPalBufferPtr(sHPBarYellowPalIds[1]), sHPBarPalOffsets[1] + palOffset, PLTT_SIZEOF(1)); break; default: - LoadPalette(GetPartyMenuPalBufferPtr(sHPBarRedPalIds[0]), sHPBarPalOffsets[0] + palNum, PLTT_SIZEOF(1)); - LoadPalette(GetPartyMenuPalBufferPtr(sHPBarRedPalIds[1]), sHPBarPalOffsets[1] + palNum, PLTT_SIZEOF(1)); + LoadPalette(GetPartyMenuPalBufferPtr(sHPBarRedPalIds[0]), sHPBarPalOffsets[0] + palOffset, PLTT_SIZEOF(1)); + LoadPalette(GetPartyMenuPalBufferPtr(sHPBarRedPalIds[1]), sHPBarPalOffsets[1] + palOffset, PLTT_SIZEOF(1)); break; } @@ -4156,9 +4156,9 @@ static void PartyMenuStartSpriteAnim(u8 spriteId, u8 animNum) StartSpriteAnim(&gSprites[spriteId], animNum); } -// Unused. Might explain the large blank section in gPartyMenuPokeballSmall_Gfx +// Might explain the large blank section in gPartyMenuPokeballSmall_Gfx // At the very least this is how the unused anim cmds for sSpriteAnimTable_MenuPokeballSmall were meant to be accessed -static void SpriteCB_BounceConfirmCancelButton(u8 spriteId, u8 spriteId2, u8 animNum) +static void UNUSED SpriteCB_BounceConfirmCancelButton(u8 spriteId, u8 spriteId2, u8 animNum) { if (animNum == 0) { @@ -4777,7 +4777,7 @@ static void Task_LearnedMove(u8 taskId) if (move[1] == 0) { AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM); - if (item < ITEM_HM01_CUT) + if (item < ITEM_HM01) RemoveBagItem(item, 1); } GetMonNickname(mon, gStringVar1); @@ -5803,7 +5803,7 @@ static bool8 TrySwitchInPokemon(void) u8 newSlot; u8 i; - // In a multi battle, slots 1, 4, and 5 are the partner's pokemon + // In a multi battle, slots 1, 4, and 5 are the partner's Pokémon if (IsMultiBattle() == TRUE && (slot == 1 || slot == 4 || slot == 5)) { StringCopy(gStringVar1, GetTrainerPartnerName()); @@ -6097,8 +6097,7 @@ static void UpdatePartyToFieldOrder(void) Free(partyBuffer); } -// Unused -static void SwitchAliveMonIntoLeadSlot(void) +static void UNUSED SwitchAliveMonIntoLeadSlot(void) { u8 i; struct Pokemon *mon; @@ -6200,8 +6199,7 @@ void ChooseMonForDaycare(void) InitPartyMenu(PARTY_MENU_TYPE_DAYCARE, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, FALSE, PARTY_MSG_CHOOSE_MON_2, Task_HandleChooseMonInput, BufferMonSelection); } -// Unused -static void ChoosePartyMonByMenuType(u8 menuType) +static void UNUSED ChoosePartyMonByMenuType(u8 menuType) { gFieldCallback2 = CB2_FadeFromPartyMenu; InitPartyMenu(menuType, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_AND_CLOSE, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_ReturnToField); diff --git a/src/player_pc.c b/src/player_pc.c index f53e08f532..009aa7810f 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -191,10 +191,10 @@ static const u8 *const sItemStorage_OptionDescriptions[] = 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] = { gText_ItemStorage, {PlayerPC_ItemStorage} }, + [MENU_MAILBOX] = { gText_Mailbox, {PlayerPC_Mailbox} }, + [MENU_DECORATION] = { gText_Decoration, {PlayerPC_Decoration} }, + [MENU_TURNOFF] = { gText_TurnOff, {PlayerPC_TurnOff} } }; static const u8 sBedroomPC_OptionOrder[] = @@ -216,13 +216,13 @@ 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_EXIT] = { gText_Cancel, ItemStorage_Exit } + [MENU_WITHDRAW] = { gText_WithdrawItem, {ItemStorage_Withdraw} }, + [MENU_DEPOSIT] = { gText_DepositItem, {ItemStorage_Deposit} }, + [MENU_TOSS] = { gText_TossItem, {ItemStorage_Toss} }, + [MENU_EXIT] = { gText_Cancel, {ItemStorage_Exit} } }; -static const struct ItemSlot sNewGamePCItems[] = +static const u16 sNewGamePCItems[][2] = { { ITEM_POTION, 1 }, { ITEM_NONE, 0 } @@ -230,10 +230,10 @@ static const struct ItemSlot sNewGamePCItems[] = const struct MenuAction gMailboxMailOptions[] = { - { gText_Read, Mailbox_DoMailRead }, - { gText_MoveToBag, Mailbox_MoveToBag }, - { gText_Give2, Mailbox_Give }, - { gText_Cancel2, Mailbox_Cancel } + { gText_Read, {Mailbox_DoMailRead} }, + { gText_MoveToBag, {Mailbox_MoveToBag} }, + { gText_Give2, {Mailbox_Give} }, + { gText_Cancel2, {Mailbox_Cancel} } }; static const struct WindowTemplate sWindowTemplates_MainMenus[] = @@ -355,16 +355,20 @@ static const struct WindowTemplate sWindowTemplates_ItemStorage[ITEMPC_WIN_COUNT static const u8 sSwapArrowTextColors[] = {TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY}; -// Macro below is likely a fakematch, equivalent to sNewGamePCItems[i].quantity -#define GET_QUANTITY(i) ((u16)((u16 *)sNewGamePCItems + 1)[i * 2]) void NewGameInitPCItems(void) { u8 i = 0; ClearItemSlots(gSaveBlock1Ptr->pcItems, PC_ITEMS_COUNT); - for(; sNewGamePCItems[i].itemId != ITEM_NONE && GET_QUANTITY(i) && - AddPCItem(sNewGamePCItems[i].itemId, GET_QUANTITY(i)) == TRUE; i++); + + while (TRUE) + { + if (sNewGamePCItems[i][0] == ITEM_NONE || sNewGamePCItems[i][1] == 0) + break; + if (AddPCItem(sNewGamePCItems[i][0], sNewGamePCItems[i][1]) != TRUE) + break; + i++; + } } -#undef GET_QUANTITY void BedroomPC(void) { diff --git a/src/pokeball.c b/src/pokeball.c index 2633fd5740..445f048924 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -1014,10 +1014,10 @@ static u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 spritePalNum, u return LaunchBallFadeMonTask(unFadeLater, spritePalNum, selectedPalettes, BALL_POKE); } -// Sprite data for the pokemon +// Sprite data for the Pokémon #define sSpecies data[7] -// Sprite data for the pokeball +// Sprite data for the Poké Ball #define sMonSpriteId data[0] #define sDelay data[1] #define sMonPalNum data[2] @@ -1027,14 +1027,14 @@ static u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 spritePalNum, u #define sFinalMonY data[6] #define sTrigIdx data[7] -// Pokeball in Birch intro, and when receiving via trade -void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes, u16 species) +// Poké Ball in Birch intro, and when receiving via trade +void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriority, u8 delay, u32 fadePalettes, u16 species) { u8 spriteId; LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[BALL_POKE]); LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[BALL_POKE]); - spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subpriortiy); + spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subpriority); gSprites[spriteId].sMonSpriteId = monSpriteId; gSprites[spriteId].sFinalMonX = gSprites[monSpriteId].x; @@ -1228,7 +1228,7 @@ static void SpriteCB_TradePokeballEnd(struct Sprite *sprite) #undef sTimer // Unreferenced here and in RS, but used in FRLG, possibly by mistake. -static void DestroySpriteAndFreeResources_Ball(struct Sprite *sprite) +static void UNUSED DestroySpriteAndFreeResources_Ball(struct Sprite *sprite) { DestroySpriteAndFreeResources(sprite); } diff --git a/src/pokeblock.c b/src/pokeblock.c index e490f372c4..e01e821f7e 100644 --- a/src/pokeblock.c +++ b/src/pokeblock.c @@ -215,12 +215,12 @@ const u8 *const gPokeblockNames[] = static const struct MenuAction sPokeblockMenuActions[] = { - [PKBL_USE_ON_FIELD] = {gMenuText_Use, PokeblockAction_UseOnField}, - [PKBL_TOSS] = {gMenuText_Toss, PokeblockAction_Toss}, - [PKBL_CANCEL] = {gText_Cancel2, PokeblockAction_Cancel}, - [PKBL_USE_IN_BATTLE] = {gMenuText_Use, PokeblockAction_UseInBattle}, - [PKBL_USE_ON_FEEDER] = {gMenuText_Use, PokeblockAction_UseOnPokeblockFeeder}, - [PKBL_GIVE_TO_LADY] = {gMenuText_Give2, PokeblockAction_GiveToContestLady}, + [PKBL_USE_ON_FIELD] = {gMenuText_Use, {PokeblockAction_UseOnField}}, + [PKBL_TOSS] = {gMenuText_Toss, {PokeblockAction_Toss}}, + [PKBL_CANCEL] = {gText_Cancel2, {PokeblockAction_Cancel}}, + [PKBL_USE_IN_BATTLE] = {gMenuText_Use, {PokeblockAction_UseInBattle}}, + [PKBL_USE_ON_FEEDER] = {gMenuText_Use, {PokeblockAction_UseOnPokeblockFeeder}}, + [PKBL_GIVE_TO_LADY] = {gMenuText_Give2, {PokeblockAction_GiveToContestLady}}, }; static const u8 sActionsOnField[] = {PKBL_USE_ON_FIELD, PKBL_TOSS, PKBL_CANCEL}; diff --git a/src/pokedex.c b/src/pokedex.c index 88558d6f2c..09a25b872b 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -93,6 +93,13 @@ enum NAME_YZ, }; +enum { + WIN_INFO, + WIN_FOOTPRINT, + WIN_CRY_WAVE, + WIN_VU_METER, +}; + // For scrolling search parameter #define MAX_SEARCH_PARAM_ON_SCREEN 6 #define MAX_SEARCH_PARAM_CURSOR_POS (MAX_SEARCH_PARAM_ON_SCREEN - 1) @@ -888,11 +895,6 @@ static const struct BgTemplate sInfoScreen_BgTemplate[] = } }; -#define WIN_INFO 0 -#define WIN_FOOTPRINT 1 -#define WIN_CRY_WAVE 2 -#define WIN_VU_METER 3 - static const struct WindowTemplate sInfoScreen_WindowTemplates[] = { [WIN_INFO] = @@ -1756,7 +1758,7 @@ static void Task_HandlePokedexStartMenuInput(u8 taskId) CreateMonSpritesAtPos(sPokedexView->selectedPokemon, 0xE); gMain.newKeys |= START_BUTTON; //Exit menu break; - case 3: //CLOSE POKEDEX + case 3: //CLOSE POKéDEX BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_ClosePokedex; PlaySE(SE_PC_OFF); @@ -1956,12 +1958,12 @@ static void Task_HandleSearchResultsStartMenuInput(u8 taskId) CreateMonSpritesAtPos(sPokedexView->selectedPokemon, 0xE); gMain.newKeys |= START_BUTTON; break; - case 3: //BACK TO POKEDEX + case 3: //BACK TO POKéDEX BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_ReturnToPokedexFromSearchResults; PlaySE(SE_TRUCK_DOOR); break; - case 4: //CLOSE POKEDEX + case 4: //CLOSE POKéDEX BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_ClosePokedexFromSearchResultsStartMenu; PlaySE(SE_PC_OFF); @@ -2047,7 +2049,7 @@ static void Task_ClosePokedexFromSearchResultsStartMenu(u8 taskId) #undef tLoadScreenTaskId -// For loading main pokedex page or pokedex search results +// For loading main pokedex page or Pokédex search results static bool8 LoadPokedexListPage(u8 page) { switch (gMain.state) @@ -3264,7 +3266,7 @@ static void Task_LoadInfoScreen(u8 taskId) case 4: PrintMonInfo(sPokedexListItem->dexNum, sPokedexView->dexMode == DEX_MODE_HOENN ? FALSE : TRUE, sPokedexListItem->owned, 0); if (!sPokedexListItem->owned) - LoadPalette(gPlttBufferUnfaded + 1, BG_PLTT_ID(3) + 1, PLTT_SIZEOF(16 - 1)); + LoadPalette(&gPlttBufferUnfaded[BG_PLTT_ID(0) + 1], BG_PLTT_ID(3) + 1, PLTT_SIZEOF(16 - 1)); CopyWindowToVram(WIN_INFO, COPYWIN_FULL); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); @@ -3753,7 +3755,7 @@ static void Task_LoadSizeScreen(u8 taskId) StringCopy(string, gText_SizeComparedTo); StringAppend(string, gSaveBlock2Ptr->playerName); - PrintInfoScreenText(string, GetStringCenterAlignXOffset(FONT_NORMAL, string, 0xF0), 0x79); + PrintInfoScreenText(string, GetStringCenterAlignXOffset(FONT_NORMAL, string, DISPLAY_WIDTH), 121); gMain.state++; } break; @@ -4034,7 +4036,7 @@ static void Task_HandleCaughtMonPageInput(u8 taskId) } else { - LoadPalette(gPokedexCaughtScreen_Pal + 1, BG_PLTT_ID(3) + 1, PLTT_SIZEOF(7)); + LoadPalette(gPokedexBgHoenn_Pal + 49, BG_PLTT_ID(3) + 1, PLTT_SIZEOF(7)); } } @@ -4070,14 +4072,14 @@ static void Task_ExitCaughtMonPage(u8 taskId) static void SpriteCB_SlideCaughtMonToCenter(struct Sprite *sprite) { - if (sprite->x < 0x78) + if (sprite->x < DISPLAY_WIDTH / 2) sprite->x += 2; - if (sprite->x > 0x78) + if (sprite->x > DISPLAY_WIDTH / 2) sprite->x -= 2; - if (sprite->y < 0x50) + if (sprite->y < DISPLAY_HEIGHT / 2) sprite->y += 1; - if (sprite->y > 0x50) + if (sprite->y > DISPLAY_HEIGHT / 2) sprite->y -= 1; } @@ -4101,7 +4103,7 @@ static void PrintMonInfo(u32 num, u32 value, u32 owned, u32 newEntry) const u8 *description; if (newEntry) - PrintInfoScreenText(gText_PokedexRegistration, GetStringCenterAlignXOffset(FONT_NORMAL, gText_PokedexRegistration, 0xF0), 0); + PrintInfoScreenText(gText_PokedexRegistration, GetStringCenterAlignXOffset(FONT_NORMAL, gText_PokedexRegistration, DISPLAY_WIDTH), 0); if (value == 0) value = NationalToHoennOrder(num); else @@ -4140,7 +4142,7 @@ static void PrintMonInfo(u32 num, u32 value, u32 owned, u32 newEntry) description = gPokedexEntries[num].description; else description = sExpandedPlaceholder_PokedexDescription; - PrintInfoScreenText(description, GetStringCenterAlignXOffset(FONT_NORMAL, description, 0xF0), 0x5F); + PrintInfoScreenText(description, GetStringCenterAlignXOffset(FONT_NORMAL, description, DISPLAY_WIDTH), 95); } static void PrintMonHeight(u16 height, u8 left, u8 top) @@ -4478,7 +4480,7 @@ static void PrintInfoSubMenuText(u8 windowId, const u8 *str, u8 left, u8 top) AddTextPrinterParameterized4(windowId, FONT_NORMAL, left, top, 0, 0, color, TEXT_SKIP_DRAW, str); } -static void UnusedPrintNum(u8 windowId, u16 num, u8 left, u8 top) +static void UNUSED UnusedPrintNum(u8 windowId, u16 num, u8 left, u8 top) { u8 str[4]; @@ -4512,7 +4514,7 @@ static u8 PrintCryScreenSpeciesName(u8 windowId, u16 num, u8 left, u8 top) return i; } -static void UnusedPrintMonName(u8 windowId, const u8 *name, u8 left, u8 top) +static void UNUSED UnusedPrintMonName(u8 windowId, const u8 *name, u8 left, u8 top) { u8 str[POKEMON_NAME_LENGTH + 1]; u8 i; @@ -4533,7 +4535,7 @@ static void UnusedPrintMonName(u8 windowId, const u8 *name, u8 left, u8 top) } // Unused in the English version, used to print height/weight in versions which use metric system. -static void PrintDecimalNum(u8 windowId, u16 num, u8 left, u8 top) +static void UNUSED PrintDecimalNum(u8 windowId, u16 num, u8 left, u8 top) { u8 str[6]; bool8 outputted = FALSE; @@ -4570,30 +4572,42 @@ static void PrintDecimalNum(u8 windowId, u16 num, u8 left, u8 top) PrintInfoSubMenuText(windowId, str, left, top); } +// The footprints are drawn on WIN_FOOTPRINT, which uses BG palette 15 (loaded with graphics/text_window/message_box.gbapal) +// The footprint pixels are stored as 1BPP, and set to the below color index in this palette when converted to 4BPP. +#define FOOTPRINT_COLOR_IDX 2 + +#define NUM_FOOTPRINT_TILES 4 + static void DrawFootprint(u8 windowId, u16 dexNum) { - u8 footprint[32 * 4]; + u8 footprint4bpp[TILE_SIZE_4BPP * NUM_FOOTPRINT_TILES]; const u8 * footprintGfx = gMonFootprintTable[NationalPokedexNumToSpecies(dexNum)]; u16 tileIdx = 0; u16 i, j; - for (i = 0; i < 32; i++) + for (i = 0; i < TILE_SIZE_1BPP * NUM_FOOTPRINT_TILES; i++) { - u8 tile = footprintGfx[i]; + u8 footprint1bpp = footprintGfx[i]; + + // Convert the 8 pixels in the above 1BPP byte to 4BPP. + // Each iteration creates one 4BPP byte (2 pixels), + // so we need 4 iterations to do all 8 pixels. for (j = 0; j < 4; j++) { - u8 value = ((tile >> (2 * j)) & 1 ? 2 : 0); - if (tile & (2 << (2 * j))) - value |= 0x20; - footprint[tileIdx] = value; + u8 tile = 0; + if (footprint1bpp & (1 << (2 * j))) + tile |= FOOTPRINT_COLOR_IDX; // Set pixel + if (footprint1bpp & (2 << (2 * j))) + tile |= FOOTPRINT_COLOR_IDX << 4; // Set pixel + footprint4bpp[tileIdx] = tile; tileIdx++; } } - CopyToWindowPixelBuffer(windowId, footprint, sizeof(footprint), 0); + CopyToWindowPixelBuffer(windowId, footprint4bpp, sizeof(footprint4bpp), 0); } -// Unused Ruby/Sapphire function. -static void RS_DrawFootprint(u16 offset, u16 tileNum) +// Ruby/Sapphire function. +static void UNUSED RS_DrawFootprint(u16 offset, u16 tileNum) { *(u16 *)(VRAM + offset * 0x800 + 0x232) = 0xF000 + tileNum + 0; *(u16 *)(VRAM + offset * 0x800 + 0x234) = 0xF000 + tileNum + 1; diff --git a/src/pokedex_area_region_map.c b/src/pokedex_area_region_map.c index ff32f8eef1..cd2975473a 100644 --- a/src/pokedex_area_region_map.c +++ b/src/pokedex_area_region_map.c @@ -8,7 +8,7 @@ static EWRAM_DATA u8 *sPokedexAreaMapBgNum = NULL; -static const u16 sPokedexAreaMap_Pal[] = INCBIN_U16("graphics/pokedex/region_map.gbapal"); +static const u16 ALIGNED(4) sPokedexAreaMap_Pal[] = INCBIN_U16("graphics/pokedex/region_map.gbapal"); static const u32 sPokedexAreaMap_Gfx[] = INCBIN_U32("graphics/pokedex/region_map.8bpp.lz"); static const u32 sPokedexAreaMap_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map.bin.lz"); static const u32 sPokedexAreaMapAffine_Gfx[] = INCBIN_U32("graphics/pokedex/region_map_affine.8bpp.lz"); @@ -41,7 +41,7 @@ void LoadPokedexAreaMapGfx(const struct PokedexAreaMapTemplate *template) ChangeBgX(template->bg, 0, BG_COORD_SET); ChangeBgY(template->bg, 0, BG_COORD_SET); SetBgAttribute(template->bg, BG_ATTR_PALETTEMODE, 1); - CpuCopy32(sPokedexAreaMap_Pal, &gPlttBufferUnfaded[0x70], sizeof(sPokedexAreaMap_Pal)); + CpuCopy32(sPokedexAreaMap_Pal, &gPlttBufferUnfaded[BG_PLTT_ID(7)], sizeof(sPokedexAreaMap_Pal)); *sPokedexAreaMapBgNum = template->bg; } diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c index 01cbacb447..f9181a985b 100755 --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -224,7 +224,7 @@ static bool8 DrawAreaGlow(void) case 3: if (!FreeTempTileDataBuffersIfPossible()) { - CpuCopy32(sAreaGlow_Pal, &gPlttBufferUnfaded[GLOW_PALETTE * 16], sizeof(sAreaGlow_Pal)); + CpuCopy32(sAreaGlow_Pal, &gPlttBufferUnfaded[BG_PLTT_ID(GLOW_PALETTE)], sizeof(sAreaGlow_Pal)); sPokedexAreaScreen->drawAreaGlowState++; } return TRUE; diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c index 2c352c67a0..437ef8cf5a 100644 --- a/src/pokedex_cry_screen.c +++ b/src/pokedex_cry_screen.c @@ -362,7 +362,7 @@ static void BufferCryWaveformSegment(void) else baseBuffer = gSoundInfo.pcmBuffer + (gSoundInfo.pcmDmaPeriod + 1 - gPcmDmaCounter) * gSoundInfo.pcmSamplesPerVBlank; - buffer = baseBuffer + 0x630; + buffer = baseBuffer + PCM_DMA_BUF_SIZE; for (i = 0; i < ARRAY_COUNT(sDexCryScreen->cryWaveformBuffer); i++) sDexCryScreen->cryWaveformBuffer[i] = buffer[i * 2] * 2; } diff --git a/src/pokemon.c b/src/pokemon.c index bebed465bf..ef8e7e9e05 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -48,6 +48,14 @@ #include "constants/trainers.h" #include "constants/union_room.h" +#define DAY_EVO_HOUR_BEGIN 12 +#define DAY_EVO_HOUR_END HOURS_PER_DAY + +#define NIGHT_EVO_HOUR_BEGIN 0 +#define NIGHT_EVO_HOUR_END 12 + +#define FRIENDSHIP_EVO_THRESHOLD 220 + struct SpeciesItem { u16 species; @@ -62,7 +70,7 @@ static void Task_PlayMapChosenOrBattleBGM(u8 taskId); static bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 battlerId); static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); static bool8 ShouldSkipFriendshipChange(void); -static u8 SendMonToPC(struct Pokemon *mon); +static u8 CopyMonToPC(struct Pokemon *mon); EWRAM_DATA static u8 sLearningMoveTableID = 0; EWRAM_DATA u8 gPlayerPartyCount = 0; @@ -1346,10 +1354,10 @@ static const u16 sHoennToNationalOrder[NUM_SPECIES - 1] = const struct SpindaSpot gSpindaSpotGraphics[] = { - {.x = 16, .y = 7, .image = INCBIN_U16("graphics/spinda_spots/spot_0.bin")}, - {.x = 40, .y = 8, .image = INCBIN_U16("graphics/spinda_spots/spot_1.bin")}, - {.x = 22, .y = 25, .image = INCBIN_U16("graphics/spinda_spots/spot_2.bin")}, - {.x = 34, .y = 26, .image = INCBIN_U16("graphics/spinda_spots/spot_3.bin")} + {.x = 16, .y = 7, .image = INCBIN_U16("graphics/pokemon/spinda/spots/spot_0.1bpp")}, + {.x = 40, .y = 8, .image = INCBIN_U16("graphics/pokemon/spinda/spots/spot_1.1bpp")}, + {.x = 22, .y = 25, .image = INCBIN_U16("graphics/pokemon/spinda/spots/spot_2.1bpp")}, + {.x = 34, .y = 26, .image = INCBIN_U16("graphics/pokemon/spinda/spots/spot_3.1bpp")} }; #include "data/pokemon/item_effects.h" @@ -2406,7 +2414,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) { s32 i; - u8 nickname[30]; + u8 nickname[max(32, POKEMON_NAME_BUFFER_SIZE)]; u8 language; u8 value; @@ -2460,7 +2468,7 @@ void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) void CreateBattleTowerMon_HandleLevel(struct Pokemon *mon, struct BattleTowerPokemon *src, bool8 lvl50) { s32 i; - u8 nickname[30]; + u8 nickname[max(32, POKEMON_NAME_BUFFER_SIZE)]; u8 level; u8 language; u8 value; @@ -3622,7 +3630,11 @@ static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 perso return substruct; } -u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) +/* GameFreak called GetMonData with either 2 or 3 arguments, for type + * safety we have a GetMonData macro (in include/pokemon.h) which + * dispatches to either GetMonData2 or GetMonData3 based on the number + * of arguments. */ +u32 GetMonData3(struct Pokemon *mon, s32 field, u8 *data) { u32 ret; @@ -3690,7 +3702,13 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) return ret; } -u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) +u32 GetMonData2(struct Pokemon *mon, s32 field) __attribute__((alias("GetMonData3"))); + +/* GameFreak called GetBoxMonData with either 2 or 3 arguments, for type + * safety we have a GetBoxMonData macro (in include/pokemon.h) which + * dispatches to either GetBoxMonData2 or GetBoxMonData3 based on the + * number of arguments. */ +u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) { s32 i; u32 retVal = 0; @@ -4046,6 +4064,8 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) return retVal; } +u32 GetBoxMonData2(struct BoxPokemon *boxMon, s32 field) __attribute__((alias("GetBoxMonData3"))); + #define SET8(lhs) (lhs) = *data #define SET16(lhs) (lhs) = data[0] + (data[1] << 8) #define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24) @@ -4385,14 +4405,14 @@ u8 GiveMonToPlayer(struct Pokemon *mon) } if (i >= PARTY_SIZE) - return SendMonToPC(mon); + return CopyMonToPC(mon); CopyMon(&gPlayerParty[i], mon, sizeof(*mon)); gPlayerPartyCount = i + 1; return MON_GIVEN_TO_PARTY; } -static u8 SendMonToPC(struct Pokemon *mon) +static u8 CopyMonToPC(struct Pokemon *mon) { s32 boxNo, boxPos; @@ -4617,7 +4637,7 @@ void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) { u16 *hpSwitchout; s32 i; - u8 nickname[POKEMON_NAME_LENGTH * 2]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; gBattleMons[battlerId].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); gBattleMons[battlerId].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL); @@ -5481,17 +5501,17 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 mode, u16 evolutionItem) switch (gEvolutionTable[species][i].method) { case EVO_FRIENDSHIP: - if (friendship >= 220) + if (friendship >= FRIENDSHIP_EVO_THRESHOLD) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_FRIENDSHIP_DAY: RtcCalcLocalTime(); - if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220) + if (gLocalTime.hours >= DAY_EVO_HOUR_BEGIN && gLocalTime.hours < DAY_EVO_HOUR_END && friendship >= FRIENDSHIP_EVO_THRESHOLD) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_FRIENDSHIP_NIGHT: RtcCalcLocalTime(); - if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220) + if (gLocalTime.hours >= NIGHT_EVO_HOUR_BEGIN && gLocalTime.hours < NIGHT_EVO_HOUR_END && friendship >= FRIENDSHIP_EVO_THRESHOLD) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL: @@ -5743,7 +5763,7 @@ u16 SpeciesToCryId(u16 species) // Same as DrawSpindaSpots but attempts to discern for itself whether or // not it's the front pic. -static void DrawSpindaSpotsUnused(u16 species, u32 personality, u8 *dest) +static void UNUSED DrawSpindaSpotsUnused(u16 species, u32 personality, u8 *dest) { if (species == SPECIES_SPINDA && dest != gMonSpritesGfxPtr->sprites.ptr[B_POSITION_PLAYER_LEFT] @@ -5857,16 +5877,11 @@ u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex) return retVal; } -#define IS_LEAGUE_BATTLE \ - ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) \ - && (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR \ - || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER \ - || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)) \ - void AdjustFriendship(struct Pokemon *mon, u8 event) { u16 species, heldItem; u8 holdEffect; + s8 mod; if (ShouldSkipFriendshipChange()) return; @@ -5896,26 +5911,43 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) if (friendship > 199) friendshipLevel++; - if ((event != FRIENDSHIP_EVENT_WALKING || !(Random() & 1)) - && (event != FRIENDSHIP_EVENT_LEAGUE_BATTLE || IS_LEAGUE_BATTLE)) + if (event == FRIENDSHIP_EVENT_WALKING) { - s8 mod = sFriendshipEventModifiers[event][friendshipLevel]; - if (mod > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) - mod = (150 * mod) / 100; - friendship += mod; - if (mod > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == GetCurrentRegionMapSectionId()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > MAX_FRIENDSHIP) - friendship = MAX_FRIENDSHIP; - SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); + // 50% chance every 128 steps + if (Random() & 1) + return; } + if (event == FRIENDSHIP_EVENT_LEAGUE_BATTLE) + { + // Only if it's a trainer battle with league progression significance + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + return; + if (!(gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)) + return; + } + + mod = sFriendshipEventModifiers[event][friendshipLevel]; + if (mod > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) + // 50% increase, rounding down + mod = (150 * mod) / 100; + + friendship += mod; + if (mod > 0) + { + if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) + friendship++; + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) + friendship++; + } + + if (friendship < 0) + friendship = 0; + if (friendship > MAX_FRIENDSHIP) + friendship = MAX_FRIENDSHIP; + + SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); } } @@ -6018,14 +6050,10 @@ void RandomlyGivePartyPokerus(struct Pokemon *party) do { - do - { - rnd = Random() % PARTY_SIZE; - mon = &party[rnd]; - } - while (!GetMonData(mon, MON_DATA_SPECIES, 0)); + rnd = Random() % PARTY_SIZE; + mon = &party[rnd]; } - while (GetMonData(mon, MON_DATA_IS_EGG, 0)); + while (!GetMonData(mon, MON_DATA_SPECIES, 0) || GetMonData(mon, MON_DATA_IS_EGG, 0)); if (!(CheckPartyHasHadPokerus(party, gBitTable[rnd]))) { @@ -6187,15 +6215,26 @@ u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm) { return 0; } - else if (tm < 32) + + // Fewer than 64 moves, use GF's method (for matching). + if (sizeof(struct TMHMLearnset) <= 8) { - u32 mask = 1 << tm; - return gTMHMLearnsets[species][0] & mask; + if (tm < 32) + { + u32 mask = 1 << tm; + return gTMHMLearnsets[species].as_u32s[0] & mask; + } + else + { + u32 mask = 1 << (tm - 32); + return gTMHMLearnsets[species].as_u32s[1] & mask; + } } else { - u32 mask = 1 << (tm - 32); - return gTMHMLearnsets[species][1] & mask; + u32 index = tm / 32; + u32 mask = 1 << (tm % 32); + return gTMHMLearnsets[species].as_u32s[index] & mask; } } @@ -6205,15 +6244,25 @@ u32 CanSpeciesLearnTMHM(u16 species, u8 tm) { return 0; } - else if (tm < 32) + // Fewer than 64 moves, use GF's method (for matching). + if (sizeof(struct TMHMLearnset) <= 8) { - u32 mask = 1 << tm; - return gTMHMLearnsets[species][0] & mask; + if (tm < 32) + { + u32 mask = 1 << tm; + return gTMHMLearnsets[species].as_u32s[0] & mask; + } + else + { + u32 mask = 1 << (tm - 32); + return gTMHMLearnsets[species].as_u32s[1] & mask; + } } else { - u32 mask = 1 << (tm - 32); - return gTMHMLearnsets[species][1] & mask; + u32 index = tm / 32; + u32 mask = 1 << (tm % 32); + return gTMHMLearnsets[species].as_u32s[index] & mask; } } @@ -6805,9 +6854,9 @@ void BattleAnimateBackSprite(struct Sprite *sprite, u16 species) } } -// Unused, identical to GetOpposingLinkMultiBattlerId but for the player +// Identical to GetOpposingLinkMultiBattlerId but for the player // "rightSide" from that team's perspective, i.e. B_POSITION_*_RIGHT -static u8 GetOwnOpposingLinkMultiBattlerId(bool8 rightSide) +static u8 UNUSED GetOwnOpposingLinkMultiBattlerId(bool8 rightSide) { s32 i; s32 battlerId = 0; diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c index 6afbd20b7d..c5ef33878f 100644 --- a/src/pokemon_animation.c +++ b/src/pokemon_animation.c @@ -846,13 +846,13 @@ static const u8 sBackAnimNatureModTable[NUM_NATURES] = static const union AffineAnimCmd sMonAffineAnim_0[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), - AFFINEANIMCMDTYPE_END + {AFFINEANIMCMDTYPE_END} }; static const union AffineAnimCmd sMonAffineAnim_1[] = { AFFINEANIMCMD_FRAME(-256, 256, 0, 0), - AFFINEANIMCMDTYPE_END + {AFFINEANIMCMDTYPE_END} }; static const union AffineAnimCmd *const sMonAffineAnims[] = @@ -4969,29 +4969,24 @@ static void ShrinkGrowVibrate(struct Sprite *sprite) } else { - u8 posY_unsigned; - s8 posY_signed; - s32 posY; - s16 index = (u16)(sprite->data[2] % sprite->data[6] * 256) / sprite->data[6] % 256; + s8 sinY; + u16 y; + s16 index = ((u16)(sprite->data[2] % sprite->data[6] * 256) / sprite->data[6]) % 256; if (sprite->data[2] % 2 == 0) { sprite->data[4] = Sin(index, 32) + 256; sprite->data[5] = Sin(index, 32) + 256; - posY_unsigned = Sin(index, 32); - posY_signed = posY_unsigned; + sinY = Sin(index, 32); } else { sprite->data[4] = Sin(index, 8) + 256; sprite->data[5] = Sin(index, 8) + 256; - posY_unsigned = Sin(index, 8); - posY_signed = posY_unsigned; + sinY = Sin(index, 8); } - posY = posY_signed; - if (posY < 0) - posY += 7; - sprite->y2 = (u32)(posY) >> 3; + y = sinY / 8; + sprite->y2 = y; HandleSetAffineData(sprite, sprite->data[4], sprite->data[5], 0); } diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index 237f728381..caed0bcdc3 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -4,8 +4,7 @@ #include "palette.h" #include "pokemon_icon.h" #include "sprite.h" - -#define POKE_ICON_BASE_PAL_TAG 56000 +#include "constants/pokemon_icon.h" #define INVALID_ICON_SPECIES SPECIES_OLD_UNOWN_J // Oddly specific, used when an icon should be a ?. Any of the 'old unown' would work @@ -146,7 +145,7 @@ const u8 *const gMonIconTable[] = [SPECIES_SEAKING] = gMonIcon_Seaking, [SPECIES_STARYU] = gMonIcon_Staryu, [SPECIES_STARMIE] = gMonIcon_Starmie, - [SPECIES_MR_MIME] = gMonIcon_Mrmime, + [SPECIES_MR_MIME] = gMonIcon_MrMime, [SPECIES_SCYTHER] = gMonIcon_Scyther, [SPECIES_JYNX] = gMonIcon_Jynx, [SPECIES_ELECTABUZZ] = gMonIcon_Electabuzz, @@ -1199,16 +1198,12 @@ const u8 *GetMonIconTiles(u16 species, bool32 handleDeoxys) void TryLoadAllMonIconPalettesAtOffset(u16 offset) { s32 i; - const struct SpritePalette* monIconPalettePtr; - - if (offset <= BG_PLTT_ID(10)) + if (offset <= BG_PLTT_ID(16 - ARRAY_COUNT(gMonIconPaletteTable))) { - monIconPalettePtr = gMonIconPaletteTable; - for (i = ARRAY_COUNT(gMonIconPaletteTable) - 1; i >= 0; i--) + for (i = 0; i < (int)ARRAY_COUNT(gMonIconPaletteTable); i++) { - LoadPalette(monIconPalettePtr->data, offset, PLTT_SIZE_4BPP); - offset += 0x10; - monIconPalettePtr++; + LoadPalette(gMonIconPaletteTable[i].data, offset, PLTT_SIZE_4BPP); + offset += 16; } } } diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c index 4461d8ad2a..d744ff6650 100755 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -3968,7 +3968,7 @@ struct UnusedPacket // Data packet that's never sent // No function to read it either -static void SendPacket_Unused(u32 data) +static void UNUSED SendPacket_Unused(u32 data) { struct UnusedPacket packet; packet.id = PACKET_UNUSED; diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 8649e3ce79..b398b88752 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -40,6 +40,7 @@ #include "constants/moves.h" #include "constants/rgb.h" #include "constants/songs.h" +#include "constants/pokemon_icon.h" /* NOTE: This file is large. Some general groups of functions have @@ -199,7 +200,7 @@ enum { CURSOR_AREA_IN_BOX, CURSOR_AREA_IN_PARTY, CURSOR_AREA_BOX_TITLE, - CURSOR_AREA_BUTTONS, // Party Pokemon and Close Box + CURSOR_AREA_BUTTONS, // Party Pokémon and Close Box }; #define CURSOR_AREA_IN_HAND CURSOR_AREA_BOX_TITLE // Alt name for cursor area used by Move Items @@ -215,7 +216,7 @@ enum { #define BOXID_CANCELED 201 enum { - PALTAG_MON_ICON_0 = 56000, + PALTAG_MON_ICON_0 = POKE_ICON_BASE_PAL_TAG, PALTAG_MON_ICON_1, // Used implicitly in CreateMonIconSprite PALTAG_MON_ICON_2, // Used implicitly in CreateMonIconSprite PALTAG_3, // Unused @@ -550,8 +551,8 @@ struct PokemonStorageSystemData u16 *displayMonTilePtr; struct Sprite *displayMonSprite; u16 displayMonPalBuffer[0x40]; - u8 tileBuffer[MON_PIC_SIZE * MAX_MON_PIC_FRAMES]; - u8 itemIconBuffer[0x800]; + u8 ALIGNED(4) tileBuffer[MON_PIC_SIZE * MAX_MON_PIC_FRAMES]; + u8 ALIGNED(4) itemIconBuffer[0x800]; u8 wallpaperBgTilemapBuffer[0x1000]; u8 displayMenuTilemapBuffer[0x800]; }; @@ -1370,8 +1371,7 @@ void DrawTextWindowAndBufferTiles(const u8 *string, void *dst, u8 zero1, u8 zero RemoveWindow(windowId); } -// Unused -static void UnusedDrawTextWindow(const u8 *string, void *dst, u16 offset, u8 bgColor, u8 fgColor, u8 shadowColor) +static void UNUSED UnusedDrawTextWindow(const u8 *string, void *dst, u16 offset, u8 bgColor, u8 fgColor, u8 shadowColor) { u32 tilesSize; u8 windowId; @@ -1486,8 +1486,7 @@ u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n) return str; } -// Unused -static void UnusedWriteRectCpu(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) +static void UNUSED UnusedWriteRectCpu(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) { u16 i; @@ -1502,8 +1501,7 @@ static void UnusedWriteRectCpu(u16 *dest, u16 dest_left, u16 dest_top, const u16 } } -// Unused -static void UnusedWriteRectDma(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) +static void UNUSED UnusedWriteRectDma(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) { u16 i; @@ -1697,8 +1695,7 @@ static void CB2_ExitPokeStorage(void) SetMainCallback2(CB2_ReturnToField); } -// Unused -static s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) +static s16 UNUSED StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) { s16 i; s16 direction; @@ -5490,7 +5487,7 @@ static void InitBoxTitle(u8 boxId) tagIndex = IndexOfSpritePaletteTag(PALTAG_BOX_TITLE); sStorage->boxTitlePalOffset = OBJ_PLTT_ID(tagIndex) + 14; - sStorage->wallpaperPalBits |= 0x10000 << tagIndex; + sStorage->wallpaperPalBits |= (1 << 16) << tagIndex; // The below seems intended to have separately tracked // the incoming wallpaper title's palette, but as they now @@ -5498,7 +5495,7 @@ static void InitBoxTitle(u8 boxId) // this is redundant along with the use of boxTitleAltPalOffset tagIndex = IndexOfSpritePaletteTag(PALTAG_BOX_TITLE); sStorage->boxTitleAltPalOffset = OBJ_PLTT_ID(tagIndex) + 14; - sStorage->wallpaperPalBits |= 0x10000 << tagIndex; + sStorage->wallpaperPalBits |= (1 << 16) << tagIndex; StringCopyPadded(sStorage->boxTitleText, GetBoxNamePtr(boxId), 0, BOX_NAME_LENGTH); DrawTextWindowAndBufferTiles(sStorage->boxTitleText, sStorage->boxTitleTiles, 0, 0, 2); @@ -5616,9 +5613,9 @@ static void CycleBoxTitleColor(void) u8 boxId = StorageGetCurrentBox(); u8 wallpaperId = GetBoxWallpaper(boxId); if (sStorage->boxTitleCycleId == 0) - CpuCopy16(sBoxTitleColors[wallpaperId], gPlttBufferUnfaded + sStorage->boxTitlePalOffset, 4); + CpuCopy16(sBoxTitleColors[wallpaperId], &gPlttBufferUnfaded[sStorage->boxTitlePalOffset], PLTT_SIZEOF(2)); else - CpuCopy16(sBoxTitleColors[wallpaperId], gPlttBufferUnfaded + sStorage->boxTitleAltPalOffset, 4); + CpuCopy16(sBoxTitleColors[wallpaperId], &gPlttBufferUnfaded[sStorage->boxTitleAltPalOffset], PLTT_SIZEOF(2)); } static s16 GetBoxTitleBaseX(const u8 *string) @@ -7893,8 +7890,7 @@ static void StartCursorAnim(u8 animNum) StartSpriteAnim(sStorage->cursorSprite, animNum); } -// Unused -static u8 GetMovingMonOriginalBoxId(void) +static u8 UNUSED GetMovingMonOriginalBoxId(void) { return sMovingMonOrigBoxId; } @@ -8746,8 +8742,7 @@ static void CreateItemIconSprites(void) LoadCompressedSpriteSheet(&spriteSheet); sStorage->itemIcons[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * TILE_SIZE_4BPP + (void *)(OBJ_VRAM0); sStorage->itemIcons[i].palIndex = AllocSpritePalette(PALTAG_ITEM_ICON_0 + i); - sStorage->itemIcons[i].palIndex *= 16; - sStorage->itemIcons[i].palIndex += 0x100; + sStorage->itemIcons[i].palIndex = OBJ_PLTT_ID(sStorage->itemIcons[i].palIndex); spriteTemplate.tileTag = GFXTAG_ITEM_ICON_0 + i; spriteTemplate.paletteTag = PALTAG_ITEM_ICON_0 + i; spriteId = CreateSprite(&spriteTemplate, 0, 0, 11); @@ -9393,14 +9388,14 @@ static void SpriteCB_ItemIcon_HideParty(struct Sprite *sprite) //------------------------------------------------------------------------------ -// Unused, leftover from FRLG -static void BackupPokemonStorage(void/*struct PokemonStorage * dest*/) +// Leftover from FRLG +static void UNUSED BackupPokemonStorage(void/*struct PokemonStorage * dest*/) { //*dest = *gPokemonStoragePtr; } -// Unused, leftover from FRLG -static void RestorePokemonStorage(void/*struct PokemonStorage * src*/) +// Leftover from FRLG +static void UNUSED RestorePokemonStorage(void/*struct PokemonStorage * src*/) { //*gPokemonStoragePtr = *src; } @@ -9792,8 +9787,7 @@ static void TilemapUtil_Free(void) Free(sTilemapUtil); } -// Unused -static void TilemapUtil_UpdateAll(void) +static void UNUSED TilemapUtil_UpdateAll(void) { s32 i; @@ -9857,8 +9851,7 @@ static void TilemapUtil_SetMap(u8 id, u8 bg, const void *tilemap, u16 width, u16 sTilemapUtil[id].active = TRUE; } -// Unused -static void TilemapUtil_SetSavedMap(u8 id, const void *tilemap) +static void UNUSED TilemapUtil_SetSavedMap(u8 id, const void *tilemap) { if (id >= sNumTilemapUtilIds) return; @@ -10008,8 +10001,7 @@ static void UnkUtil_Run(void) } } -// Unused -static bool8 UnkUtil_CpuAdd(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height, u16 unkArg) +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; @@ -10039,8 +10031,7 @@ static void UnkUtil_CpuRun(struct UnkUtilData *data) } } -// Unused -static bool8 UnkUtil_DmaAdd(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height) +static bool8 UNUSED UnkUtil_DmaAdd(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height) { struct UnkUtilData *data; diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 7b306016ce..642b176d6b 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -88,13 +88,13 @@ enum { #define PSS_LABEL_WINDOW_PORTRAIT_SPECIES 19 // The lower name #define PSS_LABEL_WINDOW_END 20 -// Dynamic fields for the Pokemon Info page +// Dynamic fields for the Pokémon Info page #define PSS_DATA_WINDOW_INFO_ORIGINAL_TRAINER 0 #define PSS_DATA_WINDOW_INFO_ID 1 #define PSS_DATA_WINDOW_INFO_ABILITY 2 #define PSS_DATA_WINDOW_INFO_MEMO 3 -// Dynamic fields for the Pokemon Skills page +// Dynamic fields for the Pokémon Skills page #define PSS_DATA_WINDOW_SKILLS_HELD_ITEM 0 #define PSS_DATA_WINDOW_SKILLS_RIBBON_COUNT 1 #define PSS_DATA_WINDOW_SKILLS_STATS_LEFT 2 // HP, Attack, Defense @@ -174,7 +174,7 @@ static EWRAM_DATA struct PokemonSummaryScreenData u8 currPageIndex; u8 minPageIndex; u8 maxPageIndex; - bool8 lockMonFlag; // This is used to prevent the player from changing pokemon in the move deleter select, etc, but it is not needed because the input is handled differently there + bool8 lockMonFlag; // This is used to prevent the player from changing Pokémon in the move deleter select, etc, but it is not needed because the input is handled differently there u16 newMove; u8 firstMoveIndex; u8 secondMoveIndex; @@ -184,7 +184,7 @@ static EWRAM_DATA struct PokemonSummaryScreenData u8 windowIds[8]; u8 spriteIds[SPRITE_ARR_ID_COUNT]; bool8 handleDeoxys; - s16 switchCounter; // Used for various switch statement cases that decompress/load graphics or pokemon data + s16 switchCounter; // Used for various switch statement cases that decompress/load graphics or Pokémon data u8 unk_filler4[6]; } *sMonSummaryScreen = NULL; EWRAM_DATA u8 gLastViewedMonIndex = 0; @@ -702,8 +702,10 @@ static const u8 sTextColors[][3] = {0, 7, 8} }; -static const u8 sAButton_Gfx[] = INCBIN_U8("graphics/summary_screen/a_button.4bpp"); -static const u8 sBButton_Gfx[] = INCBIN_U8("graphics/summary_screen/b_button.4bpp"); +static const u8 sButtons_Gfx[][4 * TILE_SIZE_4BPP] = { + INCBIN_U8("graphics/summary_screen/a_button.4bpp"), + INCBIN_U8("graphics/summary_screen/b_button.4bpp"), +}; static void (*const sTextPrinterFunctions[])(void) = { @@ -2680,7 +2682,7 @@ static void DrawContestMoveHearts(u16 move) } } -static void LimitEggSummaryPageDisplay(void) // If the pokemon is an egg, limit the number of pages displayed to 1 +static void LimitEggSummaryPageDisplay(void) // If the Pokémon is an egg, limit the number of pages displayed to 1 { if (sMonSummaryScreen->summary.isEgg) ChangeBgX(3, 0x10000, BG_COORD_SET); @@ -2790,8 +2792,13 @@ static void PrintGenderSymbol(struct Pokemon *mon, u16 species) static void PrintAOrBButtonIcon(u8 windowId, bool8 bButton, u32 x) { - // sBButton_Gfx - sizeof(sBButton_Gfx) = sAButton_Gfx - BlitBitmapToWindow(windowId, (bButton) ? sBButton_Gfx : sBButton_Gfx - sizeof(sBButton_Gfx), x, 0, 16, 16); + const u8 *button; + if (!bButton) + button = sButtons_Gfx[0]; + else + button = sButtons_Gfx[1]; + + BlitBitmapToWindow(windowId, button, x, 0, 16, 16); } static void PrintPageNamesAndStats(void) @@ -3984,8 +3991,7 @@ static void SummaryScreen_DestroyAnimDelayTask(void) } } -// unused -static bool32 IsMonAnimationFinished(void) +static bool32 UNUSED IsMonAnimationFinished(void) { if (gSprites[sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_MON]].callback == SpriteCallbackDummy) return FALSE; @@ -3993,7 +3999,7 @@ static bool32 IsMonAnimationFinished(void) return TRUE; } -static void StopPokemonAnimations(void) // A subtle effect, this function stops pokemon animations when leaving the PSS +static void StopPokemonAnimations(void) // A subtle effect, this function stops Pokémon animations when leaving the PSS { u16 i; u16 paletteIndex; diff --git a/src/pokenav_conditions.c b/src/pokenav_conditions.c index 05f86cab2f..1ebf6edbe9 100644 --- a/src/pokenav_conditions.c +++ b/src/pokenav_conditions.c @@ -348,7 +348,7 @@ static u8 *CopyConditionMonNameGender(u8 *str, u16 listId, bool8 skipPadding) *(str++) = TEXT_COLOR_LIGHT_BLUE; if (GetBoxOrPartyMonData(boxId, monId, MON_DATA_IS_EGG, NULL)) - return StringCopyPadded(str, gText_EggNickname, CHAR_SPACE, 12); + return StringCopyPadded(str, gText_EggNickname, CHAR_SPACE, POKEMON_NAME_LENGTH + 2); GetBoxOrPartyMonData(boxId, monId, MON_DATA_NICKNAME, str); StringGet_Nickname(str); @@ -445,7 +445,7 @@ static void CopyMonNameGenderLocation(s16 listId, u8 loadId) } else { - for (i = 0; i < 12; i++) + for (i = 0; i < POKEMON_NAME_LENGTH + 2; i++) menu->nameText[loadId][i] = CHAR_SPACE; menu->nameText[loadId][i] = EOS; diff --git a/src/pokenav_conditions_gfx.c b/src/pokenav_conditions_gfx.c index e382cbf699..26d8e99e06 100644 --- a/src/pokenav_conditions_gfx.c +++ b/src/pokenav_conditions_gfx.c @@ -116,10 +116,12 @@ static const LoopedTask sLoopedTaskFuncs[] = [CONDITION_FUNC_CLOSE_MARKINGS] = LoopedTask_CloseMonMarkingsWindow }; +typedef u8 ALIGNED(4) TilemapBuffer[BG_SCREEN_SIZE]; + struct Pokenav_ConditionMenuGfx { u32 loopedTaskId; - u8 tilemapBuffers[3][BG_SCREEN_SIZE]; + TilemapBuffer tilemapBuffers[3]; u8 filler[2]; u8 partyPokeballSpriteIds[PARTY_SIZE + 1]; u32 (*callback)(void); @@ -546,7 +548,7 @@ static u32 LoopedTask_CloseMonMarkingsWindow(s32 state) return LT_FINISH; } -static u8 *UnusedPrintNumberString(u8 *dst, u16 num) +static u8 UNUSED *UnusedPrintNumberString(u8 *dst, u16 num) { u8 *txtPtr = ConvertIntToDecimalStringN(dst, num, STR_CONV_MODE_RIGHT_ALIGN, 4); txtPtr = StringCopy(txtPtr, gText_Number2); diff --git a/src/pokenav_conditions_search_results.c b/src/pokenav_conditions_search_results.c index d3764cb802..1817398020 100644 --- a/src/pokenav_conditions_search_results.c +++ b/src/pokenav_conditions_search_results.c @@ -432,7 +432,7 @@ static u32 LoopedTask_OpenConditionSearchResults(s32 state) SetBgTilemapBuffer(1, gfx->buff); CopyToBgTilemapBuffer(1, sConditionSearchResultTilemap, 0, 0); CopyBgTilemapBufferToVram(1); - CopyPaletteIntoBufferUnfaded(sConditionSearchResultFramePal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sConditionSearchResultFramePal, BG_PLTT_ID(1), sizeof(sConditionSearchResultFramePal)); CopyBgTilemapBufferToVram(1); return LT_INC_AND_PAUSE; case 1: @@ -444,7 +444,7 @@ static u32 LoopedTask_OpenConditionSearchResults(s32 state) case 2: if (FreeTempTileDataBuffersIfPossible()) return LT_PAUSE; - CopyPaletteIntoBufferUnfaded(sListBg_Pal, BG_PLTT_ID(2), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sListBg_Pal, BG_PLTT_ID(2), sizeof(sListBg_Pal)); CreateSearchResultsList(); return LT_INC_AND_PAUSE; case 3: diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c index bfc5ba0cb4..761f572d6b 100644 --- a/src/pokenav_main_menu.c +++ b/src/pokenav_main_menu.c @@ -443,7 +443,7 @@ static u32 LoopedTask_SlideMenuHeaderDown(s32 state) void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 bufferOffset, u32 size) { - CpuCopy16(palette, gPlttBufferUnfaded + bufferOffset, size); + CpuCopy16(palette, &gPlttBufferUnfaded[bufferOffset], size); } void Pokenav_AllocAndLoadPalettes(const struct SpritePalette *palettes) @@ -468,7 +468,7 @@ void Pokenav_AllocAndLoadPalettes(const struct SpritePalette *palettes) void PokenavFillPalette(u32 palIndex, u16 fillValue) { - CpuFill16(fillValue, gPlttBufferFaded + 0x100 + (palIndex * 16), 16 * sizeof(u16)); + CpuFill16(fillValue, &gPlttBufferFaded[OBJ_PLTT_ID(palIndex)], PLTT_SIZE_4BPP); } void PokenavCopyPalette(const u16 *src, const u16 *dest, int size, int a3, int a4, u16 *palette) diff --git a/src/pokenav_match_call_data.c b/src/pokenav_match_call_data.c index 2e8cc40b5c..f6d71009bb 100644 --- a/src/pokenav_match_call_data.c +++ b/src/pokenav_match_call_data.c @@ -164,7 +164,7 @@ static const match_call_text_data_t sMrStoneTextScripts[] = { { MatchCall_Text_MrStone2, FLAG_ENABLE_MR_STONE_POKENAV, 0xFFFF }, { MatchCall_Text_MrStone3, FLAG_DELIVERED_STEVEN_LETTER, 0xFFFF }, { MatchCall_Text_MrStone4, FLAG_RECEIVED_EXP_SHARE, 0xFFFF }, - { MatchCall_Text_MrStone5, FLAG_RECEIVED_HM04, 0xFFFF }, + { MatchCall_Text_MrStone5, FLAG_RECEIVED_HM_STRENGTH, 0xFFFF }, { MatchCall_Text_MrStone6, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, { MatchCall_Text_MrStone7, FLAG_RECEIVED_CASTFORM, 0xFFFF }, { MatchCall_Text_MrStone8, FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xFFFF }, @@ -260,7 +260,7 @@ static const match_call_text_data_t sMayTextScripts[] = { { MatchCall_Text_May2, FLAG_DEFEATED_DEWFORD_GYM, 0xFFFF }, { MatchCall_Text_May3, FLAG_DELIVERED_DEVON_GOODS, 0xFFFF }, { MatchCall_Text_May4, FLAG_HIDE_MAUVILLE_CITY_WALLY, 0xFFFF }, - { MatchCall_Text_May5, FLAG_RECEIVED_HM04, 0xFFFF }, + { MatchCall_Text_May5, FLAG_RECEIVED_HM_STRENGTH, 0xFFFF }, { MatchCall_Text_May6, FLAG_DEFEATED_LAVARIDGE_GYM, 0xFFFF }, { MatchCall_Text_May7, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, { MatchCall_Text_May8, FLAG_RECEIVED_CASTFORM, 0xFFFF }, @@ -289,7 +289,7 @@ static const match_call_text_data_t sBrendanTextScripts[] = { { MatchCall_Text_Brendan2, FLAG_DEFEATED_DEWFORD_GYM, 0xFFFF }, { MatchCall_Text_Brendan3, FLAG_DELIVERED_DEVON_GOODS, 0xFFFF }, { MatchCall_Text_Brendan4, FLAG_HIDE_MAUVILLE_CITY_WALLY, 0xFFFF }, - { MatchCall_Text_Brendan5, FLAG_RECEIVED_HM04, 0xFFFF }, + { MatchCall_Text_Brendan5, FLAG_RECEIVED_HM_STRENGTH, 0xFFFF }, { MatchCall_Text_Brendan6, FLAG_DEFEATED_LAVARIDGE_GYM, 0xFFFF }, { MatchCall_Text_Brendan7, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, { MatchCall_Text_Brendan8, FLAG_RECEIVED_CASTFORM, 0xFFFF }, diff --git a/src/pokenav_match_call_gfx.c b/src/pokenav_match_call_gfx.c index 1747d3ef0b..4271e2ff23 100755 --- a/src/pokenav_match_call_gfx.c +++ b/src/pokenav_match_call_gfx.c @@ -333,7 +333,7 @@ static u32 LoopedTask_OpenMatchCall(s32 state) SetBgTilemapBuffer(2, gfx->bgTilemapBuffer2); CopyToBgTilemapBuffer(2, sMatchCallUI_Tilemap, 0, 0); CopyBgTilemapBufferToVram(2); - CopyPaletteIntoBufferUnfaded(sMatchCallUI_Pal, BG_PLTT_ID(2), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sMatchCallUI_Pal, BG_PLTT_ID(2), sizeof(sMatchCallUI_Pal)); CopyBgTilemapBufferToVram(2); return LT_INC_AND_PAUSE; case 1: @@ -343,7 +343,7 @@ static u32 LoopedTask_OpenMatchCall(s32 state) BgDmaFill(1, 0, 0, 1); SetBgTilemapBuffer(1, gfx->bgTilemapBuffer1); FillBgTilemapBufferRect_Palette0(1, 0x1000, 0, 0, 32, 20); - CopyPaletteIntoBufferUnfaded(sCallWindow_Pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sCallWindow_Pal, BG_PLTT_ID(1), sizeof(sCallWindow_Pal)); CopyBgTilemapBufferToVram(1); return LT_INC_AND_PAUSE; case 2: @@ -352,7 +352,7 @@ static u32 LoopedTask_OpenMatchCall(s32 state) LoadCallWindowAndFade(gfx); DecompressAndCopyTileDataToVram(3, sPokeball_Gfx, 0, 0, 0); - CopyPaletteIntoBufferUnfaded(sListWindow_Pal, BG_PLTT_ID(3), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sListWindow_Pal, BG_PLTT_ID(3), sizeof(sListWindow_Pal)); CopyPaletteIntoBufferUnfaded(sPokeball_Pal, BG_PLTT_ID(5), PLTT_SIZE_4BPP); return LT_INC_AND_PAUSE; case 3: @@ -913,9 +913,9 @@ static void Task_FlashPokeballIcons(u8 taskId) tSinIdx += 4; tSinIdx &= 0x7F; tSinVal = gSineTable[tSinIdx] >> 4; - PokenavCopyPalette(sPokeball_Pal, &sPokeball_Pal[0x10], 0x10, 0x10, tSinVal, &gPlttBufferUnfaded[0x50]); + PokenavCopyPalette(sPokeball_Pal, &sPokeball_Pal[0x10], 0x10, 0x10, tSinVal, &gPlttBufferUnfaded[BG_PLTT_ID(5)]); if (!gPaletteFade.active) - CpuCopy32(&gPlttBufferUnfaded[0x50], &gPlttBufferFaded[0x50], 0x20); + CpuCopy32(&gPlttBufferUnfaded[BG_PLTT_ID(5)], &gPlttBufferFaded[BG_PLTT_ID(5)], PLTT_SIZE_4BPP); } } diff --git a/src/pokenav_match_call_list.c b/src/pokenav_match_call_list.c index b00c76b48a..8d1a73f557 100755 --- a/src/pokenav_match_call_list.c +++ b/src/pokenav_match_call_list.c @@ -278,22 +278,19 @@ int GetNumberRegistered(void) return state->numRegistered; } -// Unused -static int GetNumSpecialTrainers(void) +static int UNUSED GetNumSpecialTrainers(void) { struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); return state->numSpecialTrainers; } -// Unused -static int GetNumNormalTrainers(void) +static int UNUSED GetNumNormalTrainers(void) { struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); return state->numRegistered - state->numSpecialTrainers; } -// Unused -static int GetNormalTrainerHeaderId(int index) +static int UNUSED GetNormalTrainerHeaderId(int index) { struct Pokenav_MatchCallMenu *state = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_MAIN); index += state->numSpecialTrainers; @@ -468,8 +465,7 @@ int GetIndexDeltaOfNextCheckPageUp(int index) return 0; } -// Unused -static bool32 HasRematchEntry(void) +static bool32 UNUSED HasRematchEntry(void) { int i; diff --git a/src/pokenav_menu_handler.c b/src/pokenav_menu_handler.c index b81b4c892f..d67f61c1ea 100644 --- a/src/pokenav_menu_handler.c +++ b/src/pokenav_menu_handler.c @@ -257,7 +257,7 @@ static u32 HandleMainMenuInput(struct Pokenav_Menu *menu) return POKENAV_MENU_FUNC_NONE; } -// Force the player to select Match Call during the call Mr. Stone pokenav tutorial +// Force the player to select Match Call during the call Mr. Stone PokéNav tutorial static u32 HandleMainMenuInputTutorial(struct Pokenav_Menu *menu) { if (UpdateMenuCursorPos(menu)) @@ -287,7 +287,7 @@ static u32 HandleMainMenuInputTutorial(struct Pokenav_Menu *menu) return POKENAV_MENU_FUNC_NONE; } -// After calling Mr. Stone during the pokenav tutorial, force player to exit or use Match Call again +// After calling Mr. Stone during the PokéNav tutorial, force player to exit or use Match Call again static u32 HandleMainMenuInputEndTutorial(struct Pokenav_Menu *menu) { if (UpdateMenuCursorPos(menu)) diff --git a/src/pokenav_menu_handler_gfx.c b/src/pokenav_menu_handler_gfx.c index 3367442362..ede88affdb 100644 --- a/src/pokenav_menu_handler_gfx.c +++ b/src/pokenav_menu_handler_gfx.c @@ -470,14 +470,14 @@ static u32 LoopedTask_OpenMenu(s32 state) return LT_PAUSE; DecompressAndCopyTileDataToVram(2, sPokenavDeviceBgTiles, 0, 0, 0); DecompressAndCopyTileDataToVram(2, sPokenavDeviceBgTilemap, 0, 0, 1); - CopyPaletteIntoBufferUnfaded(sPokenavDeviceBgPal, BG_PLTT_ID(2), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sPokenavDeviceBgPal, BG_PLTT_ID(2), sizeof(sPokenavDeviceBgPal)); return LT_INC_AND_PAUSE; case 2: if (FreeTempTileDataBuffersIfPossible()) return LT_PAUSE; DecompressAndCopyTileDataToVram(3, sPokenavBgDotsTiles, 0, 0, 0); DecompressAndCopyTileDataToVram(3, sPokenavBgDotsTilemap, 0, 0, 1); - CopyPaletteIntoBufferUnfaded(sPokenavBgDotsPal, BG_PLTT_ID(3), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sPokenavBgDotsPal, BG_PLTT_ID(3), sizeof(sPokenavBgDotsPal)); if (GetPokenavMenuType() == POKENAV_MENU_TYPE_CONDITION || GetPokenavMenuType() == POKENAV_MENU_TYPE_CONDITION_SEARCH) ChangeBgDotsColorToPurple(); return LT_INC_AND_PAUSE; diff --git a/src/pokenav_region_map.c b/src/pokenav_region_map.c index 50f01345c8..f81ff42966 100755 --- a/src/pokenav_region_map.c +++ b/src/pokenav_region_map.c @@ -35,7 +35,7 @@ struct Pokenav_RegionMapGfx u32 loopTaskId; u16 infoWindowId; struct Sprite *cityZoomTextSprites[3]; - u8 tilemapBuffer[BG_SCREEN_SIZE]; + u8 ALIGNED(2) tilemapBuffer[BG_SCREEN_SIZE]; u8 cityZoomPics[NUM_CITY_MAPS][200]; }; @@ -515,7 +515,7 @@ static void LoadPokenavRegionMapGfx(struct Pokenav_RegionMapGfx *state) FillWindowPixelBuffer(state->infoWindowId, PIXEL_FILL(1)); PutWindowTilemap(state->infoWindowId); CopyWindowToVram(state->infoWindowId, COPYWIN_FULL); - CopyPaletteIntoBufferUnfaded(sMapSecInfoWindow_Pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sMapSecInfoWindow_Pal, BG_PLTT_ID(1), sizeof(sMapSecInfoWindow_Pal)); CopyPaletteIntoBufferUnfaded(gRegionMapCityZoomTiles_Pal, BG_PLTT_ID(3), PLTT_SIZE_4BPP); if (!IsRegionMapZoomed()) ChangeBgY(1, -0x6000, BG_COORD_SET); diff --git a/src/pokenav_ribbons_list.c b/src/pokenav_ribbons_list.c index c1ca7f9d92..05eded6240 100644 --- a/src/pokenav_ribbons_list.c +++ b/src/pokenav_ribbons_list.c @@ -227,8 +227,7 @@ static s32 GetRibbonsMonListCount(void) return list->monList->listCount; } -//unused -static s32 GetMonRibbonSelectedMonData(void) +static s32 UNUSED GetMonRibbonSelectedMonData(void) { struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); s32 idx = PokenavList_GetSelectedIndex(); @@ -343,8 +342,7 @@ static void InsertMonListItem(struct Pokenav_RibbonsMonList *list, struct Pokena list->monList->listCount++; } -// Unused -static bool32 PlayerHasRibbonsMon(void) +static bool32 UNUSED PlayerHasRibbonsMon(void) { s32 i, j; @@ -432,7 +430,7 @@ static u32 LoopedTask_OpenRibbonsMonList(s32 state) DecompressAndCopyTileDataToVram(1, sMonRibbonListFrameTiles, 0, 0, 0); SetBgTilemapBuffer(1, menu->buff); CopyToBgTilemapBuffer(1, sMonRibbonListFrameTilemap, 0, 0); - CopyPaletteIntoBufferUnfaded(sMonRibbonListFramePal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sMonRibbonListFramePal, BG_PLTT_ID(1), sizeof(sMonRibbonListFramePal)); CopyBgTilemapBufferToVram(1); return LT_INC_AND_PAUSE; case 1: @@ -447,7 +445,7 @@ static u32 LoopedTask_OpenRibbonsMonList(s32 state) case 2: if (FreeTempTileDataBuffersIfPossible()) return LT_PAUSE; - CopyPaletteIntoBufferUnfaded(sMonRibbonListUi_Pal, BG_PLTT_ID(2), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sMonRibbonListUi_Pal, BG_PLTT_ID(2), sizeof(sMonRibbonListUi_Pal)); CreateRibbonMonsList(); return LT_INC_AND_PAUSE; case 3: diff --git a/src/pokenav_ribbons_summary.c b/src/pokenav_ribbons_summary.c index 4861b8e0ea..e77f839a80 100644 --- a/src/pokenav_ribbons_summary.c +++ b/src/pokenav_ribbons_summary.c @@ -584,7 +584,7 @@ static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state) SetBgTilemapBuffer(1, menu->tilemapBuffers[1]); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); CopyPaletteIntoBufferUnfaded(sRibbonIcons1_Pal, BG_PLTT_ID(2), 5 * PLTT_SIZE_4BPP); - CopyPaletteIntoBufferUnfaded(sMonInfo_Pal, BG_PLTT_ID(10), PLTT_SIZE_4BPP); + CopyPaletteIntoBufferUnfaded(sMonInfo_Pal, BG_PLTT_ID(10), sizeof(sMonInfo_Pal)); CopyBgTilemapBufferToVram(1); return LT_INC_AND_PAUSE; } diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index c984dfec8a..3264b22bdf 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -60,10 +60,12 @@ enum #define MAX_SMOKE 10 +typedef u8 ALIGNED(4) TilemapBuffer[BG_SCREEN_SIZE]; + struct RayquazaScene { MainCallback exitCallback; - u8 tilemapBuffers[4][BG_SCREEN_SIZE]; + TilemapBuffer tilemapBuffers[4]; u16 unk; // never read u8 animId; bool8 endEarly; @@ -1636,7 +1638,7 @@ static void Task_DuoFightAnim(u8 taskId) static void Task_DuoFight_AnimateClouds(u8 taskId) { s16 i; - u16 *data = gTasks[taskId].data; + u16 *data = (u16*)gTasks[taskId].data; for (i = 24; i < 92; i++) { diff --git a/src/record_mixing.c b/src/record_mixing.c index d6edd078b7..c5d915a9db 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -318,7 +318,7 @@ static void Task_RecordMixing_Main(u8 taskId) sSentRecord = Alloc(sizeof(*sSentRecord)); sReceivedRecords = Alloc(sizeof(*sReceivedRecords) * MAX_LINK_PLAYERS); SetLocalLinkPlayerId(gSpecialVar_0x8005); - VarSet(VAR_TEMP_0, 1); + VarSet(VAR_TEMP_MIXED_RECORDS, 1); sReadyToReceive = FALSE; PrepareExchangePacket(); CreateRecordMixingLights(); @@ -972,14 +972,14 @@ static void ReceiveGiftItem(u16 *item, u8 multiplayerId) { if (!CheckBagHasItem(*item, 1) && !CheckPCHasItem(*item, 1) && AddBagItem(*item, 1)) { - VarSet(VAR_TEMP_1, *item); + VarSet(VAR_TEMP_RECORD_MIX_GIFT_ITEM, *item); StringCopy(gStringVar1, gLinkPlayers[0].name); if (*item == ITEM_EON_TICKET) FlagSet(FLAG_ENABLE_SHIP_SOUTHERN_ISLAND); } else { - VarSet(VAR_TEMP_1, ITEM_NONE); + VarSet(VAR_TEMP_RECORD_MIX_GIFT_ITEM, ITEM_NONE); } } } diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 33228255d2..42866c723b 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -222,8 +222,7 @@ u8 RecordedBattle_GetBattlerAction(u8 battlerId) } } -// Unused -static u8 GetRecordedBattleMode(void) +static u8 UNUSED GetRecordedBattleMode(void) { return sRecordMode; } diff --git a/src/region_map.c b/src/region_map.c index ebe3afb8e9..21c6314d30 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -621,7 +621,7 @@ bool8 LoadRegionMapGfx(void) void BlendRegionMap(u16 color, u32 coeff) { BlendPalettes(0x380, coeff, color); - CpuCopy16(gPlttBufferFaded + 0x70, gPlttBufferUnfaded + 0x70, 0x60); + CpuCopy16(&gPlttBufferFaded[BG_PLTT_ID(7)], &gPlttBufferUnfaded[BG_PLTT_ID(7)], 3 * PLTT_SIZE_4BPP); } void FreeRegionMapIconResources(void) @@ -1419,7 +1419,7 @@ void CreateRegionMapCursor(u16 tileTag, u16 paletteTag) sRegionMap->cursorSprite->y = 8 * sRegionMap->cursorPosY + 4; } sRegionMap->cursorSprite->data[1] = 2; - sRegionMap->cursorSprite->data[2] = (IndexOfSpritePaletteTag(paletteTag) << 4) + 0x101; + sRegionMap->cursorSprite->data[2] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(paletteTag)) + 1; sRegionMap->cursorSprite->data[3] = TRUE; } } @@ -1434,14 +1434,12 @@ static void FreeRegionMapCursorSprite(void) } } -// Unused -static void SetUnkCursorSpriteData(void) +static void UNUSED SetUnkCursorSpriteData(void) { sRegionMap->cursorSprite->data[3] = TRUE; } -// Unused -static void ClearUnkCursorSpriteData(void) +static void UNUSED ClearUnkCursorSpriteData(void) { sRegionMap->cursorSprite->data[3] = FALSE; } diff --git a/src/rom_header_gf.c b/src/rom_header_gf.c index 465c0cf410..d5f7d7eefc 100644 --- a/src/rom_header_gf.c +++ b/src/rom_header_gf.c @@ -8,9 +8,9 @@ // 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. -// In vanilla, it was used by Colosseum and XD to access pokemon graphics. -// -// If this struct is rearranged in any way, it defeats the purpose of +// In vanilla, it was used by Colosseum and XD to access Pokémon graphics. +// +// If this struct is rearranged in any way, it defeats the purpose of // having it at all. Applications like PKHex or streaming HUDs may find // these values useful, so there's some potential benefit to keeping it. // If there's a compilation problem below, just comment out the assignment diff --git a/src/rotating_gate.c b/src/rotating_gate.c index f9e732eb74..0b0c68a836 100644 --- a/src/rotating_gate.c +++ b/src/rotating_gate.c @@ -17,12 +17,10 @@ #define GATE_ROT_ACW(arm, longArm) GATE_ROT(ROTATE_ANTICLOCKWISE, arm, longArm) #define GATE_ROT_NONE 255 -// static functions static void SpriteCallback_RotatingGate(struct Sprite *sprite); static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY); static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite); -// enums enum { /* @@ -180,7 +178,6 @@ enum PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6, }; -// structure struct RotatingGatePuzzle { s16 x; @@ -189,7 +186,6 @@ struct RotatingGatePuzzle u8 orientation; }; -// .rodata // Fortree static const struct RotatingGatePuzzle sRotatingGate_FortreePuzzleConfig[] = { @@ -219,6 +215,15 @@ static const struct RotatingGatePuzzle sRotatingGate_TrickHousePuzzleConfig[] = {10, 19, GATE_SHAPE_L3, GATE_ORIENTATION_180}, }; +#define MAX_GATES max(ARRAY_COUNT(sRotatingGate_FortreePuzzleConfig), \ + ARRAY_COUNT(sRotatingGate_TrickHousePuzzleConfig)) + +// Rotating gate puzzles use the temp vars as a byte array to track the orientation of each gate. +// The assert below makes sure the existing puzzles don't have too many gates, and aren't quietly +// using vars outside the temp vars. Aside from potentially reading/writing vars being used for +// something else, using vars that persist when exiting the map could softlock the puzzle. +STATIC_ASSERT(MAX_GATES <= (2 * NUM_TEMP_VARS), TooManyRotatingGates) + static const u8 sRotatingGateTiles_1[] = INCBIN_U8("graphics/rotating_gates/l1.4bpp"); static const u8 sRotatingGateTiles_2[] = INCBIN_U8("graphics/rotating_gates/l2.4bpp"); static const u8 sRotatingGateTiles_3[] = INCBIN_U8("graphics/rotating_gates/l3.4bpp"); @@ -639,9 +644,7 @@ static void RotatingGate_ResetAllGateOrientations(void) u8 *ptr = (u8 *)GetVarPointer(VAR_TEMP_0); for (i = 0; i < sRotatingGate_PuzzleCount; i++) - { ptr[i] = sRotatingGate_PuzzleConfig[i].orientation; - } } static s32 RotatingGate_GetGateOrientation(u8 gateId) diff --git a/src/roulette.c b/src/roulette.c index 06561f7988..ec4c8cfcfe 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -860,7 +860,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + { { // F_FLASH_COLOR_O_WYNAUT .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0x5, + .paletteOffset = BG_PLTT_ID(0) + 5, .numColors = 1, .delay = 1, .unk6 = -1, @@ -870,7 +870,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_G_AZURILL .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0xA, + .paletteOffset = BG_PLTT_ID(0) + 10, .numColors = 1, .delay = 1, .unk6 = -1, @@ -880,7 +880,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_P_SKITTY .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0x15, + .paletteOffset = BG_PLTT_ID(1) + 5, .numColors = 1, .delay = 1, .unk6 = -1, @@ -890,7 +890,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_O_MAKUHITA .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0x55, + .paletteOffset = BG_PLTT_ID(5) + 5, .numColors = 1, .delay = 1, .unk6 = -1, @@ -900,7 +900,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_G_WYNAUT .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0x5A, + .paletteOffset = BG_PLTT_ID(5) + 10, .numColors = 1, .delay = 1, .unk6 = -1, @@ -910,7 +910,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_P_AZURILL .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0x65, + .paletteOffset = BG_PLTT_ID(6) + 5, .numColors = 1, .delay = 1, .unk6 = -1, @@ -920,7 +920,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_O_SKITTY .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0x75, + .paletteOffset = BG_PLTT_ID(7) + 5, .numColors = 1, .delay = 1, .unk6 = -1, @@ -930,7 +930,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_G_MAKUHITA .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0x7A, + .paletteOffset = BG_PLTT_ID(7) + 10, .numColors = 1, .delay = 1, .unk6 = -1, @@ -940,7 +940,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_P_WYNAUT .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0x85, + .paletteOffset = BG_PLTT_ID(8) + 5, .numColors = 1, .delay = 1, .unk6 = -1, @@ -950,7 +950,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_O_AZURILL .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0x95, + .paletteOffset = BG_PLTT_ID(9) + 5, .numColors = 1, .delay = 1, .unk6 = -1, @@ -960,7 +960,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_G_SKITTY .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0x9A, + .paletteOffset = BG_PLTT_ID(9) + 10, .numColors = 1, .delay = 1, .unk6 = -1, @@ -970,7 +970,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_COLOR_P_MAKUHITA .color = FLASHUTIL_USE_EXISTING_COLOR, - .paletteOffset = 0xA5, + .paletteOffset = BG_PLTT_ID(10) + 5, .numColors = 1, .delay = 1, .unk6 = -1, @@ -980,7 +980,7 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, { // F_FLASH_OUTER_EDGES .color = RGB(22, 30, 29), - .paletteOffset = 0x28, + .paletteOffset = BG_PLTT_ID(2) + 8, .numColors = 2, .delay = 10, .unk6 = -1, @@ -990,13 +990,13 @@ static const struct RouletteFlashSettings sFlashData_Colors[NUM_ROULETTE_SLOTS + }, }; -// Data to flash any pokemon icon (F_FLASH_ICON) on the roulette wheel. One entry for each color row -// Each poke icon flashes with the tint of the row color it belongs to, so the pokemon itself is irrelevant +// Data to flash any Pokémon icon (F_FLASH_ICON) on the roulette wheel. One entry for each color row +// Each poke icon flashes with the tint of the row color it belongs to, so the Pokémon itself is irrelevant static const struct RouletteFlashSettings sFlashData_PokeIcons[NUM_BOARD_COLORS] = { [GET_ROW_IDX(ROW_ORANGE)] = { .color = RGB(31, 31, 20), - .paletteOffset = 0x101, + .paletteOffset = OBJ_PLTT_ID(0) + 1, .numColors = 5, .delay = 30, .unk6 = -1, @@ -1006,7 +1006,7 @@ static const struct RouletteFlashSettings sFlashData_PokeIcons[NUM_BOARD_COLORS] }, [GET_ROW_IDX(ROW_GREEN)] = { .color = RGB(27, 31, 31), - .paletteOffset = 0x106, + .paletteOffset = OBJ_PLTT_ID(0) + 6, .numColors = 5, .delay = 30, .unk6 = -1, @@ -1016,7 +1016,7 @@ static const struct RouletteFlashSettings sFlashData_PokeIcons[NUM_BOARD_COLORS] }, [GET_ROW_IDX(ROW_PURPLE)] = { .color = RGB(31, 27, 31), - .paletteOffset = 0x10B, + .paletteOffset = OBJ_PLTT_ID(0) + 11, .numColors = 5, .delay = 30, .unk6 = -1, @@ -1129,9 +1129,9 @@ static void InitRouletteTableData(void) // Left table (with min bet of 1) has red background, other table has green if (sRoulette->minBet == 1) - gPlttBufferUnfaded[0] = gPlttBufferUnfaded[0x51] = gPlttBufferFaded[0] = gPlttBufferFaded[0x51] = bgColors[0]; + gPlttBufferUnfaded[BG_PLTT_ID(0)] = gPlttBufferUnfaded[BG_PLTT_ID(5) + 1] = gPlttBufferFaded[BG_PLTT_ID(0)] = gPlttBufferFaded[BG_PLTT_ID(5) + 1] = bgColors[0]; else - gPlttBufferUnfaded[0] = gPlttBufferUnfaded[0x51] = gPlttBufferFaded[0] = gPlttBufferFaded[0x51] = bgColors[1]; + gPlttBufferUnfaded[BG_PLTT_ID(0)] = gPlttBufferUnfaded[BG_PLTT_ID(5) + 1] = gPlttBufferFaded[BG_PLTT_ID(0)] = gPlttBufferFaded[BG_PLTT_ID(5) + 1] = bgColors[1]; RouletteFlash_Reset(&sRoulette->flashUtil); @@ -2702,7 +2702,7 @@ static const struct SpriteTemplate sSpriteTemplates_GridIcons[NUM_BOARD_POKES] = } }; -// Wheel icons are listed clockwise starting from 1 oclock on the roulette wheel (with pokeball upside right) +// Wheel icons are listed clockwise starting from 1 oclock on the roulette wheel (with Poké Ball upside right) // They go Wynaut -> Azurill -> Skitty -> Makuhita, and Orange -> Green -> Purple static const struct SpriteTemplate sSpriteTemplates_WheelIcons[NUM_ROULETTE_SLOTS] = { @@ -3556,8 +3556,7 @@ static void CreateGridSprites(void) } } -// Unused -static void DestroyGridSprites(void) +static void UNUSED DestroyGridSprites(void) { u8 i; for (i = 0; i < NUM_ROULETTE_SLOTS; i++) @@ -4353,7 +4352,7 @@ static void CreateShroomishSprite(struct Sprite *ball) {116, 44}, {116, 112} }; - struct Roulette *roulette; + struct Roulette UNUSED *roulette; t = ball->data[7] - 2; roulette = sRoulette; // Unnecessary, needed to match @@ -4482,7 +4481,7 @@ static void SetBallStuck(struct Sprite *sprite) // The below slot ids are relative to the slot the ball got stuck on if ((sRoulette->useTaillow + 1) & sRoulette->partySpeciesFlags) { - // If the player has the corresponding pokemon in their party (HAS_SHROOMISH or HAS_TAILLOW), + // If the player has the corresponding Pokémon in their party (HAS_SHROOMISH or HAS_TAILLOW), // there's a 75% chance that the ball will be moved to a spot they bet on // assuming it was one of the slots identified as a candidate if (betSlotId && (rand % 256) < 192) diff --git a/src/rtc.c b/src/rtc.c index b135a675a8..b79f62a3c4 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -16,20 +16,20 @@ struct Time gLocalTime; static const struct SiiRtcInfo sRtcDummy = {0, MONTH_JAN, 1}; // 2000 Jan 1 -static const s32 sNumDaysInMonths[12] = +static const s32 sNumDaysInMonths[MONTH_COUNT] = { - 31, - 28, - 31, - 30, - 31, - 30, - 31, - 31, - 30, - 31, - 30, - 31, + [MONTH_JAN - 1] = 31, + [MONTH_FEB - 1] = 28, + [MONTH_MAR - 1] = 31, + [MONTH_APR - 1] = 30, + [MONTH_MAY - 1] = 31, + [MONTH_JUN - 1] = 30, + [MONTH_JUL - 1] = 31, + [MONTH_AUG - 1] = 31, + [MONTH_SEP - 1] = 30, + [MONTH_OCT - 1] = 31, + [MONTH_NOV - 1] = 30, + [MONTH_DEC - 1] = 31, }; void RtcDisableInterrupts(void) @@ -171,7 +171,7 @@ u16 RtcCheckInfo(struct SiiRtcInfo *rtc) month = ConvertBcdToBinary(rtc->month); - if (month == 0xFF || month == 0 || month > 12) + if (month == 0xFF || month == 0 || month > MONTH_COUNT) errorFlags |= RTC_ERR_INVALID_MONTH; value = ConvertBcdToBinary(rtc->day); @@ -192,17 +192,17 @@ u16 RtcCheckInfo(struct SiiRtcInfo *rtc) value = ConvertBcdToBinary(rtc->hour); - if (value > 24) + if (value > HOURS_PER_DAY) errorFlags |= RTC_ERR_INVALID_HOUR; value = ConvertBcdToBinary(rtc->minute); - if (value > 60) + if (value > MINUTES_PER_HOUR) errorFlags |= RTC_ERR_INVALID_MINUTE; value = ConvertBcdToBinary(rtc->second); - if (value > 60) + if (value > SECONDS_PER_MINUTE) errorFlags |= RTC_ERR_INVALID_SECOND; return errorFlags; @@ -270,19 +270,19 @@ void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct T if (result->seconds < 0) { - result->seconds += 60; + result->seconds += SECONDS_PER_MINUTE; --result->minutes; } if (result->minutes < 0) { - result->minutes += 60; + result->minutes += MINUTES_PER_HOUR; --result->hours; } if (result->hours < 0) { - result->hours += 24; + result->hours += HOURS_PER_DAY; --result->days; } } @@ -317,19 +317,19 @@ void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2) if (result->seconds < 0) { - result->seconds += 60; + result->seconds += SECONDS_PER_MINUTE; --result->minutes; } if (result->minutes < 0) { - result->minutes += 60; + result->minutes += MINUTES_PER_HOUR; --result->hours; } if (result->hours < 0) { - result->hours += 24; + result->hours += HOURS_PER_DAY; --result->days; } } @@ -337,7 +337,7 @@ void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2) u32 RtcGetMinuteCount(void) { RtcGetInfo(&sRtc); - return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute; + return (HOURS_PER_DAY * MINUTES_PER_HOUR) * RtcGetDayCount(&sRtc) + MINUTES_PER_HOUR * sRtc.hour + sRtc.minute; } u32 RtcGetLocalDayCount(void) diff --git a/src/save_location.c b/src/save_location.c index 74d2f2c44d..3384200598 100644 --- a/src/save_location.c +++ b/src/save_location.c @@ -119,9 +119,9 @@ void TrySetMapSaveWarpStatus(void) TrySetUnknownWarpStatus(); } -// In FRLG, only bits 0, 4, and 5 are set when the pokedex is received. +// In FRLG, only bits 0, 4, and 5 are set when the Pokédex is received. // Bits 1, 2, 3, and 15 are instead set by SetPostgameFlags. -// These flags are read by Pokemon Colosseum/XD for linking. XD Additionally requires FLAG_SYS_GAME_CLEAR +// These flags are read by Pokémon Colosseum/XD for linking. XD Additionally requires FLAG_SYS_GAME_CLEAR void SetUnlockedPokedexFlags(void) { gSaveBlock2Ptr->gcnLinkFlags |= (1 << 15); diff --git a/src/scanline_effect.c b/src/scanline_effect.c index dc3ca03f4a..684c89546a 100644 --- a/src/scanline_effect.c +++ b/src/scanline_effect.c @@ -13,7 +13,7 @@ static void CopyValue32Bit(void); // Per-scanline register values. // This is double buffered so that it can be safely written to at any time // without overwriting the buffer that the DMA is currently reading -EWRAM_DATA u16 gScanlineEffectRegBuffers[2][0x3C0] = {0}; +EWRAM_DATA u16 ALIGNED(4) gScanlineEffectRegBuffers[2][0x3C0] = {0}; EWRAM_DATA struct ScanlineEffect gScanlineEffect = {0}; EWRAM_DATA static bool8 sShouldStopWaveTask = FALSE; diff --git a/src/scrcmd.c b/src/scrcmd.c index 18a56631d3..218be539f5 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -76,12 +76,12 @@ void * const gNullScriptPtr = NULL; static const u8 sScriptConditionTable[6][3] = { // < = > - 1, 0, 0, // < - 0, 1, 0, // = - 0, 0, 1, // > - 1, 1, 0, // <= - 0, 1, 1, // >= - 1, 0, 1, // != + {1, 0, 0}, // < + {0, 1, 0}, // = + {0, 0, 1}, // > + {1, 1, 0}, // <= + {0, 1, 1}, // >= + {1, 0, 1}, // != }; static u8 * const sScriptStringVars[] = @@ -649,12 +649,12 @@ bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) case FADE_TO_BLACK: case FADE_TO_WHITE: default: - CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_DECOMP_BUFFER_SIZE); + CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_SIZE); FadeScreen(mode, 0); break; case FADE_FROM_BLACK: case FADE_FROM_WHITE: - CpuCopy32(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_DECOMP_BUFFER_SIZE); + CpuCopy32(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_SIZE); FadeScreen(mode, 0); break; } @@ -2207,7 +2207,7 @@ bool8 ScrCmd_lockfortrainer(struct ScriptContext *ctx) } // This command will set a Pokémon's modernFatefulEncounter bit; there is no similar command to clear it. -bool8 ScrCmd_setmonmodernfatefulencounter(struct ScriptContext *ctx) +bool8 ScrCmd_setmodernfatefulencounter(struct ScriptContext *ctx) { bool8 isModernFatefulEncounter = TRUE; u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); @@ -2216,7 +2216,7 @@ bool8 ScrCmd_setmonmodernfatefulencounter(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_checkmonmodernfatefulencounter(struct ScriptContext *ctx) +bool8 ScrCmd_checkmodernfatefulencounter(struct ScriptContext *ctx) { u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); diff --git a/src/script_menu.c b/src/script_menu.c index 6633332f3f..e923f4031a 100644 --- a/src/script_menu.c +++ b/src/script_menu.c @@ -64,8 +64,7 @@ bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 multichoiceId, bool8 } } -// Unused -static u16 GetLengthWithExpandedPlayerName(const u8 *str) +static u16 UNUSED GetLengthWithExpandedPlayerName(const u8 *str) { u16 length = 0; diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index 6e5653884b..ed28d47c5a 100755 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -213,7 +213,7 @@ void ReducePlayerPartyToSelectedMons(void) CpuFill32(0, party, sizeof party); - // copy the selected pokemon according to the order. + // copy the selected Pokémon according to the order. for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++) if (gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal diff --git a/src/secret_base.c b/src/secret_base.c index 1a4a0ac9cd..9509cd0fc5 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -47,6 +47,8 @@ #include "constants/songs.h" #include "constants/trainers.h" +#define TAG_SCROLL_ARROW 5112 + // Values for registryStatus enum { UNREGISTERED, @@ -985,7 +987,7 @@ static void FinalizeRegistryMenu(u8 taskId) static void AddRegistryMenuScrollArrows(u8 taskId) { s16 *data = gTasks[taskId].data; - tArrowTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 188, 12, 148, tNumBases - tMaxShownItems, 0x13f8, 0x13f8, &tScrollOffset); + tArrowTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 188, 12, 148, tNumBases - tMaxShownItems, TAG_SCROLL_ARROW, TAG_SCROLL_ARROW, &tScrollOffset); } static void HandleRegistryMenuInput(u8 taskId) diff --git a/src/slot_machine.c b/src/slot_machine.c index 2fc0e2c035..34c7ef8849 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -1285,7 +1285,7 @@ static void Task_SlotMachine(u8 taskId) // SLOTTASK_UNFADE static bool8 SlotTask_UnfadeScreen(struct Task *task) { - BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); LoadPikaPowerMeter(sSlotMachine->pikaPowerBolts); sSlotMachine->state++; // SLOTTASK_WAIT_FADE return FALSE; @@ -1731,7 +1731,7 @@ static bool8 SlotTask_EndGame(struct Task *task) { SetCoins(sSlotMachine->coins); TryPutFindThatGamerOnAir(GetCoins()); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sSlotMachine->state++; // SLOTTASK_FREE return FALSE; } @@ -3324,7 +3324,8 @@ static void SpriteCB_FlashMatchingLines(struct Sprite *sprite) if (sprite->sNumFullFlashes) sprite->sNumFullFlashes--; } - else if (sprite->sColor >= maxColorChange) { + else if (sprite->sColor >= maxColorChange) + { // Reached peak darkness, reverse sprite->sColorIncr = -sprite->sColorIncr; } @@ -3904,7 +3905,7 @@ static void Task_InfoBox(u8 taskId) static void InfoBox_FadeIn(struct Task *task) { - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); task->tState++; } @@ -3928,7 +3929,7 @@ static void InfoBox_AddText(struct Task *task) { AddTextPrinterParameterized3(1, FONT_NORMAL, 2, 5, sColors_ReeltimeHelp, 0, gText_ReelTimeHelp); CopyWindowToVram(1, COPYWIN_FULL); - BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); task->tState++; } @@ -3940,7 +3941,7 @@ static void InfoBox_WaitInput(struct Task *task) ClearWindowTilemap(1); CopyWindowToVram(1, COPYWIN_MAP); RemoveWindow(1); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); task->tState++; } } @@ -3961,7 +3962,7 @@ static void InfoBox_CreateDigitalDisplay(struct Task *task) static void InfoBox_LoadPikaPowerMeter(struct Task *task) { LoadPikaPowerMeter(sSlotMachine->pikaPowerBolts); - BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); task->tState++; } @@ -4427,7 +4428,7 @@ static void SpriteCB_ReelTimePikachuAura(struct Sprite *sprite) u8 colors[] = {16, 0}; if (sprite->sFlashPal && --sprite->sDelayTimer <= 0) { - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(PALTAG_PIKA_AURA) << 4) + 0x103, colors[sprite->sColorIdx], colors[sprite->sColorIdx], colors[sprite->sColorIdx]); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_PIKA_AURA)) + 3, colors[sprite->sColorIdx], colors[sprite->sColorIdx], colors[sprite->sColorIdx]); ++sprite->sColorIdx; sprite->sColorIdx &= 1; sprite->sDelayTimer = sprite->sDelay; @@ -4442,7 +4443,7 @@ static void SetReelTimePikachuAuraFlashDelay(s16 delay) static void DestroyReelTimePikachuAuraSprites(void) { u8 i; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(PALTAG_PIKA_AURA) << 4) + 0x103, 0, 0, 0); + MultiplyInvertedPaletteRGBComponents(OBJ_PLTT_ID(IndexOfSpritePaletteTag(PALTAG_PIKA_AURA)) + 3, 0, 0, 0); for (i = 0; i < ARRAY_COUNT(sSlotMachine->reelTimePikachuAuraSpriteIds); i++) DestroySprite(&gSprites[sSlotMachine->reelTimePikachuAuraSpriteIds[i]]); } @@ -4672,9 +4673,9 @@ static void SpriteCB_DigitalDisplay_Reel(struct Sprite *sprite) { case 0: sprite->x += 4; - if (sprite->x >= 0xd0) + if (sprite->x >= DISPLAY_WIDTH - 32) { - sprite->x = 0xd0; + sprite->x = DISPLAY_WIDTH - 32; sprite->sState++; } break; @@ -4684,7 +4685,7 @@ static void SpriteCB_DigitalDisplay_Reel(struct Sprite *sprite) break; case 2: sprite->x += 4; - if (sprite->x >= 0x110) + if (sprite->x >= DISPLAY_WIDTH + 32) sprite->sState++; break; case 3: @@ -4700,9 +4701,9 @@ static void SpriteCB_DigitalDisplay_Time(struct Sprite *sprite) { case 0: sprite->x -= 4; - if (sprite->x <= 0xd0) + if (sprite->x <= DISPLAY_WIDTH - 32) { - sprite->x = 0xd0; + sprite->x = DISPLAY_WIDTH - 32; sprite->sState++; } break; @@ -4712,7 +4713,7 @@ static void SpriteCB_DigitalDisplay_Time(struct Sprite *sprite) break; case 2: sprite->x -= 4; - if (sprite->x <= 0x90) + if (sprite->x <= 144) sprite->sState++; break; case 3: @@ -4738,9 +4739,9 @@ static void SpriteCB_DigitalDisplay_ReelTimeNumber(struct Sprite *sprite) break; case 2: sprite->x += 4; - if (sprite->x >= 0xd0) + if (sprite->x >= DISPLAY_WIDTH - 32) { - sprite->x = 0xd0; + sprite->x = DISPLAY_WIDTH - 32; sprite->sState++; } break; @@ -4750,7 +4751,7 @@ static void SpriteCB_DigitalDisplay_ReelTimeNumber(struct Sprite *sprite) break; case 4: sprite->x += 4; - if (sprite->x >= 0xf8) + if (sprite->x >= DISPLAY_WIDTH + 8) sprite->sState++; break; case 5: @@ -5813,8 +5814,8 @@ static const struct SpriteFrameImage sImageTable_ReelTimeNumbers[] = { gSlotMachineReelTimeNumber5, 0x80 }, }; -static const struct SpriteFrameImage sImageTable_ReelTimeShadow[] = { gSlotMachineReelTimeShadow, 0x200 }; -static const struct SpriteFrameImage sImageTable_ReelTimeNumberGap[] = { gSlotMachineReelTimeNumberGap_Gfx, 0x40 }; +static const struct SpriteFrameImage sImageTable_ReelTimeShadow[] = { {gSlotMachineReelTimeShadow, 0x200} }; +static const struct SpriteFrameImage sImageTable_ReelTimeNumberGap[] = { {gSlotMachineReelTimeNumberGap_Gfx, 0x40} }; static const struct SpriteFrameImage sImageTable_ReelTimeBolt[] = { @@ -5822,7 +5823,7 @@ static const struct SpriteFrameImage sImageTable_ReelTimeBolt[] = { gSlotMachineReelTimeBolt1, 0x100 }, }; -static const struct SpriteFrameImage sImageTable_ReelTimePikachuAura[] = { gSlotMachineReelTimePikaAura, 0x400 }; +static const struct SpriteFrameImage sImageTable_ReelTimePikachuAura[] = { {gSlotMachineReelTimePikaAura, 0x400} }; static const struct SpriteFrameImage sImageTable_ReelTimeExplosion[] = { @@ -5830,9 +5831,9 @@ static const struct SpriteFrameImage sImageTable_ReelTimeExplosion[] = { gSlotMachineReelTimeExplosion1, 0x200 }, }; -static const struct SpriteFrameImage sImageTable_ReelTimeDuck[] = { gSlotMachineReelTimeDuck, 0x20}; -static const struct SpriteFrameImage sImageTable_ReelTimeSmoke[] = { gSlotMachineReelTimeSmoke, 0x80}; -static const struct SpriteFrameImage sImageTable_PikaPowerBolt[] = { gSlotMachinePikaPowerBolt, 0x20}; +static const struct SpriteFrameImage sImageTable_ReelTimeDuck[] = { {gSlotMachineReelTimeDuck, 0x20} }; +static const struct SpriteFrameImage sImageTable_ReelTimeSmoke[] = { {gSlotMachineReelTimeSmoke, 0x80} }; +static const struct SpriteFrameImage sImageTable_PikaPowerBolt[] = { {gSlotMachinePikaPowerBolt, 0x20} }; static const union AnimCmd sAnim_SingleFrame[] = { @@ -6485,7 +6486,7 @@ static const struct Subsprite sSubsprites_ReelBackground[] = static const struct SubspriteTable sSubspriteTable_ReelBackground[] = { - ARRAY_COUNT(sSubsprites_ReelBackground), sSubsprites_ReelBackground + {ARRAY_COUNT(sSubsprites_ReelBackground), sSubsprites_ReelBackground} }; /* v-- Origin on 3 @@ -6547,7 +6548,7 @@ static const struct Subsprite sSubsprites_ReelTimeMachineAntennae[] = static const struct SubspriteTable sSubspriteTable_ReelTimeMachineAntennae[] = { - ARRAY_COUNT(sSubsprites_ReelTimeMachineAntennae), sSubsprites_ReelTimeMachineAntennae + {ARRAY_COUNT(sSubsprites_ReelTimeMachineAntennae), sSubsprites_ReelTimeMachineAntennae} }; /* @@ -6587,7 +6588,7 @@ static const struct Subsprite sSubsprites_ReelTimeMachine[] = static const struct SubspriteTable sSubspriteTable_ReelTimeMachine[] = { - ARRAY_COUNT(sSubsprites_ReelTimeMachine), sSubsprites_ReelTimeMachine + {ARRAY_COUNT(sSubsprites_ReelTimeMachine), sSubsprites_ReelTimeMachine} }; /* @@ -6644,7 +6645,7 @@ static const struct Subsprite sSubsprites_BrokenReelTimeMachine[] = static const struct SubspriteTable sSubspriteTable_BrokenReelTimeMachine[] = { - ARRAY_COUNT(sSubsprites_BrokenReelTimeMachine), sSubsprites_BrokenReelTimeMachine + {ARRAY_COUNT(sSubsprites_BrokenReelTimeMachine), sSubsprites_BrokenReelTimeMachine} }; /* v-- Origin on 3 @@ -6689,7 +6690,7 @@ static const struct Subsprite sSubsprites_ReelTimeShadow[] = static const struct SubspriteTable sSubspriteTable_ReelTimeShadow[] = { - ARRAY_COUNT(sSubsprites_ReelTimeShadow), sSubsprites_ReelTimeShadow + {ARRAY_COUNT(sSubsprites_ReelTimeShadow), sSubsprites_ReelTimeShadow} }; /* @@ -6727,7 +6728,7 @@ static const struct Subsprite sSubsprites_ReelTimeNumberGap[] = static const struct SubspriteTable sSubspriteTable_ReelTimeNumberGap[] = { - ARRAY_COUNT(sSubsprites_ReelTimeNumberGap), sSubsprites_ReelTimeNumberGap + {ARRAY_COUNT(sSubsprites_ReelTimeNumberGap), sSubsprites_ReelTimeNumberGap} }; /* @@ -6784,7 +6785,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_Reel[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Reel[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_Reel), sSubsprites_DigitalDisplay_Reel + {ARRAY_COUNT(sSubsprites_DigitalDisplay_Reel), sSubsprites_DigitalDisplay_Reel} }; /* v-- Origin on 3 @@ -6829,7 +6830,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_Time[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Time[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_Time), sSubsprites_DigitalDisplay_Time + {ARRAY_COUNT(sSubsprites_DigitalDisplay_Time), sSubsprites_DigitalDisplay_Time} }; /* v-- Origin on 3 @@ -6874,7 +6875,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_Insert[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Insert[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_Insert), sSubsprites_DigitalDisplay_Insert + {ARRAY_COUNT(sSubsprites_DigitalDisplay_Insert), sSubsprites_DigitalDisplay_Insert} }; /* v-- Origin on 3 @@ -6919,7 +6920,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_Unused1[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Unused1[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_Unused1), sSubsprites_DigitalDisplay_Unused1 + {ARRAY_COUNT(sSubsprites_DigitalDisplay_Unused1), sSubsprites_DigitalDisplay_Unused1} }; /* v-- Origin on 3 @@ -6981,10 +6982,10 @@ static const struct Subsprite sSubsprites_DigitalDisplay_Win[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Win[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_Win), sSubsprites_DigitalDisplay_Win + {ARRAY_COUNT(sSubsprites_DigitalDisplay_Win), sSubsprites_DigitalDisplay_Win} }; -static const struct Subsprite sSubsprites_DigitalDisplay_Smoke[] = +static const struct Subsprite sSubsprites_DigitalDisplay_SmokeBig[] = { { .x = -16, @@ -6996,7 +6997,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_Smoke[] = } }; -static const struct Subsprite sSubsprites_DigitalDisplay_Unused2[] = +static const struct Subsprite sSubsprites_DigitalDisplay_SmokeSmall[] = { { .x = -8, @@ -7010,12 +7011,8 @@ static const struct Subsprite sSubsprites_DigitalDisplay_Unused2[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Smoke[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_Smoke), sSubsprites_DigitalDisplay_Smoke -}; - -static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Unused2[] = -{ - ARRAY_COUNT(sSubsprites_DigitalDisplay_Unused2), sSubsprites_DigitalDisplay_Unused2 + {ARRAY_COUNT(sSubsprites_DigitalDisplay_SmokeBig), sSubsprites_DigitalDisplay_SmokeBig}, + {ARRAY_COUNT(sSubsprites_DigitalDisplay_SmokeSmall), sSubsprites_DigitalDisplay_SmokeSmall} }; /* @@ -7128,7 +7125,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_Pokeball[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_Pokeball[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_Pokeball), sSubsprites_DigitalDisplay_Pokeball + {ARRAY_COUNT(sSubsprites_DigitalDisplay_Pokeball), sSubsprites_DigitalDisplay_Pokeball} }; /* @@ -7166,7 +7163,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_DPad[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_DPad[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_DPad), sSubsprites_DigitalDisplay_DPad + {ARRAY_COUNT(sSubsprites_DigitalDisplay_DPad), sSubsprites_DigitalDisplay_DPad} }; /* @@ -7195,7 +7192,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_StopS[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_StopS[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_StopS), sSubsprites_DigitalDisplay_StopS + {ARRAY_COUNT(sSubsprites_DigitalDisplay_StopS), sSubsprites_DigitalDisplay_StopS} }; /* @@ -7224,7 +7221,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_StopT[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_StopT[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_StopT), sSubsprites_DigitalDisplay_StopT + {ARRAY_COUNT(sSubsprites_DigitalDisplay_StopT), sSubsprites_DigitalDisplay_StopT} }; /* @@ -7253,7 +7250,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_StopO[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_StopO[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_StopO), sSubsprites_DigitalDisplay_StopO + {ARRAY_COUNT(sSubsprites_DigitalDisplay_StopO), sSubsprites_DigitalDisplay_StopO} }; /* @@ -7282,7 +7279,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_StopP[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_StopP[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_StopP), sSubsprites_DigitalDisplay_StopP + {ARRAY_COUNT(sSubsprites_DigitalDisplay_StopP), sSubsprites_DigitalDisplay_StopP} }; /* @@ -7311,7 +7308,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_BonusB[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BonusB[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusB), sSubsprites_DigitalDisplay_BonusB + {ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusB), sSubsprites_DigitalDisplay_BonusB} }; /* @@ -7340,7 +7337,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_BonusO[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BonusO[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusO), sSubsprites_DigitalDisplay_BonusO + {ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusO), sSubsprites_DigitalDisplay_BonusO} }; /* @@ -7369,7 +7366,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_BonusN[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BonusN[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusN), sSubsprites_DigitalDisplay_BonusN + {ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusN), sSubsprites_DigitalDisplay_BonusN} }; /* @@ -7398,7 +7395,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_BonusU[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BonusU[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusU), sSubsprites_DigitalDisplay_BonusU + {ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusU), sSubsprites_DigitalDisplay_BonusU} }; /* @@ -7427,7 +7424,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_BonusS[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BonusS[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusS), sSubsprites_DigitalDisplay_BonusS + {ARRAY_COUNT(sSubsprites_DigitalDisplay_BonusS), sSubsprites_DigitalDisplay_BonusS} }; /* @@ -7490,7 +7487,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_BigB[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BigB[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_BigB), sSubsprites_DigitalDisplay_BigB + {ARRAY_COUNT(sSubsprites_DigitalDisplay_BigB), sSubsprites_DigitalDisplay_BigB} }; /* @@ -7528,7 +7525,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_BigI[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BigI[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_BigI), sSubsprites_DigitalDisplay_BigI + {ARRAY_COUNT(sSubsprites_DigitalDisplay_BigI), sSubsprites_DigitalDisplay_BigI} }; /* @@ -7591,7 +7588,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_BigG[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_BigG[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_BigG), sSubsprites_DigitalDisplay_BigG + {ARRAY_COUNT(sSubsprites_DigitalDisplay_BigG), sSubsprites_DigitalDisplay_BigG} }; /* @@ -7654,7 +7651,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_RegR[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_RegR[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_RegR), sSubsprites_DigitalDisplay_RegR + {ARRAY_COUNT(sSubsprites_DigitalDisplay_RegR), sSubsprites_DigitalDisplay_RegR} }; /* @@ -7692,7 +7689,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_RegE[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_RegE[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_RegE), sSubsprites_DigitalDisplay_RegE + {ARRAY_COUNT(sSubsprites_DigitalDisplay_RegE), sSubsprites_DigitalDisplay_RegE} }; /* @@ -7755,7 +7752,7 @@ static const struct Subsprite sSubsprites_DigitalDisplay_RegG[] = static const struct SubspriteTable sSubspriteTable_DigitalDisplay_RegG[] = { - ARRAY_COUNT(sSubsprites_DigitalDisplay_RegG), sSubsprites_DigitalDisplay_RegG + {ARRAY_COUNT(sSubsprites_DigitalDisplay_RegG), sSubsprites_DigitalDisplay_RegG} }; static const struct SpriteTemplate *const sSpriteTemplates_DigitalDisplay[NUM_DIG_DISPLAY_SPRITES] = @@ -7853,7 +7850,7 @@ static const u16 sUnusedColors[] = RGB(27, 27, 27), RGB(8, 11, 26), RGB(11, 21, 13), - RGB(31, 31, 31), + RGB_WHITE, RGB(16, 26, 21), RGB(0, 22, 31), RGB(26, 21, 0), diff --git a/src/sound.c b/src/sound.c index 15ebee8312..8685383f78 100644 --- a/src/sound.c +++ b/src/sound.c @@ -156,8 +156,7 @@ void FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed) sMapMusicFadeInSpeed = fadeInSpeed; } -// Unused -static void FadeInNewMapMusic(u16 songNum, u8 speed) +static void UNUSED FadeInNewMapMusic(u16 songNum, u8 speed) { FadeInNewBGM(songNum, speed); sCurrentMapMusic = songNum; @@ -464,9 +463,9 @@ void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) SetPokemonCryChorus(chorus); SetPokemonCryPriority(priority); - // This is a fancy way to get a cry of a pokemon. + // This is a fancy way to get a cry of a Pokémon. // It creates 4 sets of 128 mini cry tables. - // If you wish to expand pokemon, you need to + // If you wish to expand Pokémon, you need to // append new cases to the switch. species = SpeciesToCryId(species); index = species % 128; diff --git a/src/start_menu.c b/src/start_menu.c index f19af9c09d..63914cbb72 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -83,7 +83,7 @@ EWRAM_DATA static u8 sBattlePyramidFloorWindowId = 0; EWRAM_DATA static u8 sStartMenuCursorPos = 0; EWRAM_DATA static u8 sNumStartMenuActions = 0; EWRAM_DATA static u8 sCurrentStartMenuActions[9] = {0}; -EWRAM_DATA static u8 sInitStartMenuData[2] = {0}; +EWRAM_DATA static s8 sInitStartMenuData[2] = {0}; EWRAM_DATA static u8 (*sSaveDialogCallback)(void) = NULL; EWRAM_DATA static u8 sSaveDialogTimer = 0; @@ -137,7 +137,15 @@ static void Task_SaveAfterLinkBattle(u8 taskId); static void Task_WaitForBattleTowerLinkSave(u8 taskId); static bool8 FieldCB_ReturnToFieldStartMenu(void); -static const struct WindowTemplate sSafariBallsWindowTemplate = {0, 1, 1, 9, 4, 0xF, 8}; +static const struct WindowTemplate sWindowTemplate_SafariBalls = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 9, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x8 +}; static const u8 *const sPyramidFloorNames[FRONTIER_STAGES_PER_CHALLENGE + 1] = { @@ -151,8 +159,25 @@ static const u8 *const sPyramidFloorNames[FRONTIER_STAGES_PER_CHALLENGE + 1] = gText_Peak }; -static const struct WindowTemplate sPyramidFloorWindowTemplate_2 = {0, 1, 1, 0xA, 4, 0xF, 8}; -static const struct WindowTemplate sPyramidFloorWindowTemplate_1 = {0, 1, 1, 0xC, 4, 0xF, 8}; +static const struct WindowTemplate sWindowTemplate_PyramidFloor = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 10, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x8 +}; + +static const struct WindowTemplate sWindowTemplate_PyramidPeak = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 12, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x8 +}; static const struct MenuAction sStartMenuItems[] = { @@ -382,7 +407,7 @@ static void BuildMultiPartnerRoomStartMenu(void) static void ShowSafariBallsWindow(void) { - sSafariBallsWindowId = AddWindow(&sSafariBallsWindowTemplate); + sSafariBallsWindowId = AddWindow(&sWindowTemplate_SafariBalls); PutWindowTilemap(sSafariBallsWindowId); DrawStdWindowFrame(sSafariBallsWindowId, FALSE); ConvertIntToDecimalStringN(gStringVar1, gNumSafariBalls, STR_CONV_MODE_RIGHT_ALIGN, 2); @@ -394,9 +419,9 @@ static void ShowSafariBallsWindow(void) static void ShowPyramidFloorWindow(void) { if (gSaveBlock2Ptr->frontier.curChallengeBattleNum == FRONTIER_STAGES_PER_CHALLENGE) - sBattlePyramidFloorWindowId = AddWindow(&sPyramidFloorWindowTemplate_1); + sBattlePyramidFloorWindowId = AddWindow(&sWindowTemplate_PyramidPeak); else - sBattlePyramidFloorWindowId = AddWindow(&sPyramidFloorWindowTemplate_2); + sBattlePyramidFloorWindowId = AddWindow(&sWindowTemplate_PyramidFloor); PutWindowTilemap(sBattlePyramidFloorWindowId); DrawStdWindowFrame(sBattlePyramidFloorWindowId, FALSE); @@ -664,7 +689,7 @@ static bool8 StartMenuPokeNavCallback(void) PlayRainStoppingSoundEffect(); RemoveExtraStartMenuWindows(); CleanupOverworldWindowsAndTilemaps(); - SetMainCallback2(CB2_InitPokeNav); // Display PokeNav + SetMainCallback2(CB2_InitPokeNav); // Display PokéNav return TRUE; } @@ -1349,7 +1374,7 @@ static void ShowSaveInfoWindow(void) if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) { - // Print pokedex count + // Print Pokédex count yOffset += 16; AddTextPrinterParameterized(sSaveInfoWindowId, FONT_NORMAL, gText_SavingPokedex, 0, yOffset, TEXT_SKIP_DRAW, NULL); BufferSaveMenuText(SAVE_MENU_CAUGHT, gStringVar4, color); diff --git a/src/starter_choose.c b/src/starter_choose.c index 3d5291e887..cbbd163b03 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -26,7 +26,7 @@ #define STARTER_MON_COUNT 3 -// Position of the sprite of the selected starter Pokemon +// Position of the sprite of the selected starter Pokémon #define STARTER_PKMN_POS_X (DISPLAY_WIDTH / 2) #define STARTER_PKMN_POS_Y 64 @@ -446,7 +446,7 @@ void CB2_ChooseStarter(void) spriteId = CreateSprite(&sSpriteTemplate_Hand, 120, 56, 2); gSprites[spriteId].data[0] = taskId; - // Create three Pokeball sprites + // Create three Poké Ball sprites spriteId = CreateSprite(&sSpriteTemplate_Pokeball, sPokeballCoords[0][0], sPokeballCoords[0][1], 2); gSprites[spriteId].sTaskId = taskId; gSprites[spriteId].sBallId = 0; @@ -495,7 +495,7 @@ static void Task_HandleStarterChooseInput(u8 taskId) spriteId = CreateSprite(&sSpriteTemplate_StarterCircle, sPokeballCoords[selection][0], sPokeballCoords[selection][1], 1); gTasks[taskId].tCircleSpriteId = spriteId; - // Create Pokemon sprite + // Create Pokémon sprite spriteId = CreatePokemonFrontSprite(GetStarterPokemon(gTasks[taskId].tStarterSelection), sPokeballCoords[selection][0], sPokeballCoords[selection][1]); gSprites[spriteId].affineAnims = &sAffineAnims_StarterPokemon; gSprites[spriteId].callback = SpriteCB_StarterPokemon; @@ -637,7 +637,7 @@ static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y) static void SpriteCB_SelectionHand(struct Sprite *sprite) { - // Float up and down above selected pokeball + // Float up and down above selected Poké Ball sprite->x = sCursorCoords[gTasks[sprite->data[0]].tStarterSelection][0]; sprite->y = sCursorCoords[gTasks[sprite->data[0]].tStarterSelection][1]; sprite->y2 = Sin(sprite->data[1], 8); @@ -646,7 +646,7 @@ static void SpriteCB_SelectionHand(struct Sprite *sprite) static void SpriteCB_Pokeball(struct Sprite *sprite) { - // Animate pokeball if currently selected + // Animate Poké Ball if currently selected if (gTasks[sprite->sTaskId].tStarterSelection == sprite->sBallId) StartSpriteAnimIfDifferent(sprite, 1); else diff --git a/src/tileset_anims.c b/src/tileset_anims.c index 12701fb5f0..595ba08a6f 100644 --- a/src/tileset_anims.c +++ b/src/tileset_anims.c @@ -1167,7 +1167,7 @@ static void QueueAnimTiles_BattlePyramid_StatueShadow(u16 timer) static void BlendAnimPalette_BattleDome_FloorLights(u16 timer) { - CpuCopy16(sTilesetAnims_BattleDomeFloorLightPals[timer % ARRAY_COUNT(sTilesetAnims_BattleDomeFloorLightPals)], &gPlttBufferUnfaded[0x80], 32); + CpuCopy16(sTilesetAnims_BattleDomeFloorLightPals[timer % ARRAY_COUNT(sTilesetAnims_BattleDomeFloorLightPals)], &gPlttBufferUnfaded[BG_PLTT_ID(8)], PLTT_SIZE_4BPP); BlendPalette(BG_PLTT_ID(8), 16, gPaletteFade.y, gPaletteFade.blendColor & 0x7FFF); if ((u8)FindTaskIdByFunc(Task_BattleTransition_Intro) != TASK_NONE) { @@ -1178,7 +1178,7 @@ static void BlendAnimPalette_BattleDome_FloorLights(u16 timer) static void BlendAnimPalette_BattleDome_FloorLightsNoBlend(u16 timer) { - CpuCopy16(sTilesetAnims_BattleDomeFloorLightPals[timer % ARRAY_COUNT(sTilesetAnims_BattleDomeFloorLightPals)], &gPlttBufferUnfaded[0x80], 32); + CpuCopy16(sTilesetAnims_BattleDomeFloorLightPals[timer % ARRAY_COUNT(sTilesetAnims_BattleDomeFloorLightPals)], &gPlttBufferUnfaded[BG_PLTT_ID(8)], PLTT_SIZE_4BPP); if ((u8)FindTaskIdByFunc(Task_BattleTransition_Intro) == TASK_NONE) { BlendPalette(BG_PLTT_ID(8), 16, gPaletteFade.y, gPaletteFade.blendColor & 0x7FFF); diff --git a/src/title_screen.c b/src/title_screen.c index bb73df5bc5..1d605d1fc0 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -23,6 +23,12 @@ #include "constants/rgb.h" #include "constants/songs.h" +enum { + TAG_VERSION = 1000, + TAG_PRESS_START_COPYRIGHT, + TAG_LOGO_SHINE, +}; + #define VERSION_BANNER_RIGHT_TILEOFFSET 64 #define VERSION_BANNER_LEFT_X 98 #define VERSION_BANNER_RIGHT_X 162 @@ -158,8 +164,8 @@ static const union AnimCmd *const sVersionBannerRightAnimTable[] = static const struct SpriteTemplate sVersionBannerLeftSpriteTemplate = { - .tileTag = 1000, - .paletteTag = 1000, + .tileTag = TAG_VERSION, + .paletteTag = TAG_VERSION, .oam = &sVersionBannerLeftOamData, .anims = sVersionBannerLeftAnimTable, .images = NULL, @@ -169,8 +175,8 @@ static const struct SpriteTemplate sVersionBannerLeftSpriteTemplate = static const struct SpriteTemplate sVersionBannerRightSpriteTemplate = { - .tileTag = 1000, - .paletteTag = 1000, + .tileTag = TAG_VERSION, + .paletteTag = TAG_VERSION, .oam = &sVersionBannerRightOamData, .anims = sVersionBannerRightAnimTable, .images = NULL, @@ -183,7 +189,7 @@ static const struct CompressedSpriteSheet sSpriteSheet_EmeraldVersion[] = { .data = gTitleScreenEmeraldVersionGfx, .size = 0x1000, - .tag = 1000 + .tag = TAG_VERSION }, {}, }; @@ -205,75 +211,80 @@ static const struct OamData sOamData_CopyrightBanner = .affineParam = 0, }; -static const union AnimCmd sCopyrightBannerAnim0[] = +static const union AnimCmd sAnim_PressStart_0[] = { ANIMCMD_FRAME(1, 4), ANIMCMD_END, }; -static const union AnimCmd sCopyrightBannerAnim1[] = +static const union AnimCmd sAnim_PressStart_1[] = { ANIMCMD_FRAME(5, 4), ANIMCMD_END, }; -static const union AnimCmd sCopyrightBannerAnim2[] = +static const union AnimCmd sAnim_PressStart_2[] = { ANIMCMD_FRAME(9, 4), ANIMCMD_END, }; -static const union AnimCmd sCopyrightBannerAnim3[] = +static const union AnimCmd sAnim_PressStart_3[] = { ANIMCMD_FRAME(13, 4), ANIMCMD_END, }; -static const union AnimCmd sCopyrightBannerAnim4[] = +static const union AnimCmd sAnim_PressStart_4[] = { ANIMCMD_FRAME(17, 4), ANIMCMD_END, }; -static const union AnimCmd sCopyrightBannerAnim5[] = +static const union AnimCmd sAnim_Copyright_0[] = { ANIMCMD_FRAME(21, 4), ANIMCMD_END, }; -static const union AnimCmd sCopyrightBannerAnim6[] = +static const union AnimCmd sAnim_Copyright_1[] = { ANIMCMD_FRAME(25, 4), ANIMCMD_END, }; -static const union AnimCmd sCopyrightBannerAnim7[] = +static const union AnimCmd sAnim_Copyright_2[] = { ANIMCMD_FRAME(29, 4), ANIMCMD_END, }; -static const union AnimCmd sCopyrightBannerAnim8[] = +static const union AnimCmd sAnim_Copyright_3[] = { ANIMCMD_FRAME(33, 4), ANIMCMD_END, }; -static const union AnimCmd sCopyrightBannerAnim9[] = +static const union AnimCmd sAnim_Copyright_4[] = { ANIMCMD_FRAME(37, 4), ANIMCMD_END, }; -static const union AnimCmd *const sStartCopyrightBannerAnimTable[] = +// The "Press Start" and copyright graphics are each 5 32x8 segments long +#define NUM_PRESS_START_FRAMES 5 +#define NUM_COPYRIGHT_FRAMES 5 + +static const union AnimCmd *const sStartCopyrightBannerAnimTable[NUM_PRESS_START_FRAMES + NUM_COPYRIGHT_FRAMES] = { - sCopyrightBannerAnim0, - sCopyrightBannerAnim1, - sCopyrightBannerAnim2, - sCopyrightBannerAnim3, - sCopyrightBannerAnim4, - sCopyrightBannerAnim5, - sCopyrightBannerAnim6, - sCopyrightBannerAnim7, - sCopyrightBannerAnim8, - sCopyrightBannerAnim9, + sAnim_PressStart_0, + sAnim_PressStart_1, + sAnim_PressStart_2, + sAnim_PressStart_3, + sAnim_PressStart_4, + [NUM_PRESS_START_FRAMES] = + sAnim_Copyright_0, + sAnim_Copyright_1, + sAnim_Copyright_2, + sAnim_Copyright_3, + sAnim_Copyright_4, }; static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate = { - .tileTag = 1001, - .paletteTag = 1001, + .tileTag = TAG_PRESS_START_COPYRIGHT, + .paletteTag = TAG_PRESS_START_COPYRIGHT, .oam = &sOamData_CopyrightBanner, .anims = sStartCopyrightBannerAnimTable, .images = NULL, @@ -286,7 +297,7 @@ static const struct CompressedSpriteSheet sSpriteSheet_PressStart[] = { .data = gTitleScreenPressStartGfx, .size = 0x520, - .tag = 1001 + .tag = TAG_PRESS_START_COPYRIGHT }, {}, }; @@ -295,7 +306,7 @@ static const struct SpritePalette sSpritePalette_PressStart[] = { { .data = gTitleScreenPressStartPal, - .tag = 1001 + .tag = TAG_PRESS_START_COPYRIGHT }, {}, }; @@ -330,8 +341,8 @@ static const union AnimCmd *const sPokemonLogoShineAnimTable[] = static const struct SpriteTemplate sPokemonLogoShineSpriteTemplate = { - .tileTag = 1002, - .paletteTag = 1001, + .tileTag = TAG_LOGO_SHINE, + .paletteTag = TAG_PRESS_START_COPYRIGHT, .oam = &sPokemonLogoShineOamData, .anims = sPokemonLogoShineAnimTable, .images = NULL, @@ -344,15 +355,25 @@ static const struct CompressedSpriteSheet sPokemonLogoShineSpriteSheet[] = { .data = sTitleScreenLogoShineGfx, .size = 0x800, - .tag = 1002 + .tag = TAG_LOGO_SHINE }, {}, }; -// code +// Task data for the main title screen tasks (Task_TitleScreenPhase#) +#define tCounter data[0] +#define tSkipToNext data[1] +#define tPointless data[2] // Incremented but never used to do anything. +#define tBg2Y data[3] +#define tBg1Y data[4] + +// Sprite data for sVersionBannerLeftSpriteTemplate / sVersionBannerRightSpriteTemplate +#define sAlphaBlendIdx data[0] +#define sParentTaskId data[1] + static void SpriteCB_VersionBannerLeft(struct Sprite *sprite) { - if (gTasks[sprite->data[1]].data[1] != 0) + if (gTasks[sprite->sParentTaskId].tSkipToNext) { sprite->oam.objMode = ST_OAM_OBJ_NORMAL; sprite->y = VERSION_BANNER_Y_GOAL; @@ -361,15 +382,15 @@ static void SpriteCB_VersionBannerLeft(struct Sprite *sprite) { if (sprite->y != VERSION_BANNER_Y_GOAL) sprite->y++; - if (sprite->data[0] != 0) - sprite->data[0]--; - SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[sprite->data[0]]); + if (sprite->sAlphaBlendIdx != 0) + sprite->sAlphaBlendIdx--; + SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[sprite->sAlphaBlendIdx]); } } static void SpriteCB_VersionBannerRight(struct Sprite *sprite) { - if (gTasks[sprite->data[1]].data[1] != 0) + if (gTasks[sprite->sParentTaskId].tSkipToNext) { sprite->oam.objMode = ST_OAM_OBJ_NORMAL; sprite->y = VERSION_BANNER_Y_GOAL; @@ -381,13 +402,16 @@ static void SpriteCB_VersionBannerRight(struct Sprite *sprite) } } +// Sprite data for SpriteCB_PressStartCopyrightBanner +#define sAnimate data[0] +#define sTimer data[1] + static void SpriteCB_PressStartCopyrightBanner(struct Sprite *sprite) { - if (sprite->data[0] == 1) + if (sprite->sAnimate == TRUE) { - sprite->data[1]++; // Alternate between hidden and shown every 16th frame - if (sprite->data[1] & 16) + if (++sprite->sTimer & 16) sprite->invisible = FALSE; else sprite->invisible = TRUE; @@ -404,11 +428,11 @@ static void CreatePressStartBanner(s16 x, s16 y) u8 spriteId; x -= 64; - for (i = 0; i < 5; i++, x += 32) + for (i = 0; i < NUM_PRESS_START_FRAMES; i++, x += 32) { spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); StartSpriteAnim(&gSprites[spriteId], i); - gSprites[spriteId].data[0] = 1; + gSprites[spriteId].sAnimate = TRUE; } } @@ -418,93 +442,122 @@ static void CreateCopyrightBanner(s16 x, s16 y) u8 spriteId; x -= 64; - for (i = 0; i < 5; i++, x += 32) + for (i = 0; i < NUM_COPYRIGHT_FRAMES; i++, x += 32) { spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); - StartSpriteAnim(&gSprites[spriteId], i + 5); + StartSpriteAnim(&gSprites[spriteId], i + NUM_PRESS_START_FRAMES); } } +#undef sAnimate +#undef sTimer + +// Defines for SpriteCB_PokemonLogoShine +enum { + SHINE_MODE_SINGLE_NO_BG_COLOR, + SHINE_MODE_DOUBLE, + SHINE_MODE_SINGLE, +}; + +#define SHINE_SPEED 4 + +#define sMode data[0] +#define sBgColor data[1] + static void SpriteCB_PokemonLogoShine(struct Sprite *sprite) { if (sprite->x < DISPLAY_WIDTH + 32) { - if (sprite->data[0]) // Flash background + // In any mode except SHINE_MODE_SINGLE_NO_BG_COLOR the background + // color will change, in addition to the shine sprite moving. + if (sprite->sMode != SHINE_MODE_SINGLE_NO_BG_COLOR) { u16 backgroundColor; if (sprite->x < DISPLAY_WIDTH / 2) { // Brighten background color - if (sprite->data[1] < 31) - sprite->data[1]++; - if (sprite->data[1] < 31) - sprite->data[1]++; + if (sprite->sBgColor < 31) + sprite->sBgColor++; + if (sprite->sBgColor < 31) + sprite->sBgColor++; } else { // Darken background color - if (sprite->data[1] != 0) - sprite->data[1]--; - if (sprite->data[1] != 0) - sprite->data[1]--; + if (sprite->sBgColor != 0) + sprite->sBgColor--; + if (sprite->sBgColor != 0) + sprite->sBgColor--; } - backgroundColor = _RGB(sprite->data[1], sprite->data[1], sprite->data[1]); - if (sprite->x == DISPLAY_WIDTH / 2 + 12 - || sprite->x == DISPLAY_WIDTH / 2 + 16 - || sprite->x == DISPLAY_WIDTH / 2 + 20 - || sprite->x == DISPLAY_WIDTH / 2 + 24) + backgroundColor = _RGB(sprite->sBgColor, sprite->sBgColor, sprite->sBgColor); + + // Flash the background green for 4 frames of movement. + // Otherwise use the updating color. + if (sprite->x == DISPLAY_WIDTH / 2 + (3 * SHINE_SPEED) + || sprite->x == DISPLAY_WIDTH / 2 + (4 * SHINE_SPEED) + || sprite->x == DISPLAY_WIDTH / 2 + (5 * SHINE_SPEED) + || sprite->x == DISPLAY_WIDTH / 2 + (6 * SHINE_SPEED)) gPlttBufferFaded[0] = RGB(24, 31, 12); else gPlttBufferFaded[0] = backgroundColor; } - sprite->x += 4; + + sprite->x += SHINE_SPEED; } else { + // Sprite has moved fully offscreen gPlttBufferFaded[0] = RGB_BLACK; DestroySprite(sprite); } } -static void SpriteCB_PokemonLogoShine2(struct Sprite *sprite) +static void SpriteCB_PokemonLogoShine_Fast(struct Sprite *sprite) { if (sprite->x < DISPLAY_WIDTH + 32) - sprite->x += 8; + sprite->x += SHINE_SPEED * 2; else DestroySprite(sprite); } -static void StartPokemonLogoShine(u8 flashBg) +static void StartPokemonLogoShine(u8 mode) { u8 spriteId; - switch (flashBg) + switch (mode) { - case 0: - case 2: + case SHINE_MODE_SINGLE_NO_BG_COLOR: + case SHINE_MODE_SINGLE: + // Create one regular shine sprite. + // If mode is SHINE_MODE_SINGLE it will also change the background color. spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0); gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; - gSprites[spriteId].data[0] = flashBg; + gSprites[spriteId].sMode = mode; break; - case 1: + case SHINE_MODE_DOUBLE: + // Create an invisible sprite with mode set to update the background color spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0); gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; - gSprites[spriteId].data[0] = flashBg; + gSprites[spriteId].sMode = mode; gSprites[spriteId].invisible = TRUE; + // Create two faster shine sprites spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0); - gSprites[spriteId].callback = SpriteCB_PokemonLogoShine2; + gSprites[spriteId].callback = SpriteCB_PokemonLogoShine_Fast; gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, -80, 68, 0); - gSprites[spriteId].callback = SpriteCB_PokemonLogoShine2; + gSprites[spriteId].callback = SpriteCB_PokemonLogoShine_Fast; gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; break; } } +#undef sMode +#undef sBgColor + static void VBlankCB(void) { ScanlineEffect_InitHBlankDmaTransfer(); @@ -514,9 +567,6 @@ static void VBlankCB(void) SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); } -#define tCounter data[0] -#define tSkipToNext data[1] - void CB2_InitTitleScreen(void) { switch (gMain.state) @@ -573,18 +623,18 @@ void CB2_InitTitleScreen(void) gTasks[taskId].tCounter = 256; gTasks[taskId].tSkipToNext = FALSE; - gTasks[taskId].data[2] = -16; - gTasks[taskId].data[3] = -32; + gTasks[taskId].tPointless = -16; + gTasks[taskId].tBg2Y = -32; gMain.state = 3; break; } case 3: - BeginNormalPaletteFade(PALETTES_ALL, 1, 0x10, 0, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_ALL, 1, 16, 0, RGB_WHITEALPHA); SetVBlankCallback(VBlankCB); gMain.state = 4; break; case 4: - PanFadeAndZoomScreen(0x78, 0x50, 0x100, 0); + PanFadeAndZoomScreen(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0x100, 0); SetGpuReg(REG_OFFSET_BG2X_L, -29 * 256); SetGpuReg(REG_OFFSET_BG2X_H, -1); SetGpuReg(REG_OFFSET_BG2Y_L, -32 * 256); @@ -614,7 +664,7 @@ void CB2_InitTitleScreen(void) case 5: if (!UpdatePaletteFade()) { - StartPokemonLogoShine(0); + StartPokemonLogoShine(SHINE_MODE_SINGLE_NO_BG_COLOR); ScanlineEffect_InitWave(0, DISPLAY_HEIGHT, 4, 4, 0, SCANLINE_EFFECT_REG_BG1HOFS, TRUE); SetMainCallback2(MainCB2); } @@ -630,11 +680,11 @@ static void MainCB2(void) UpdatePaletteFade(); } -// Shine the Pokemon logo two more times, and fade in the version banner +// Shine the Pokémon logo two more times, and fade in the version banner static void Task_TitleScreenPhase1(u8 taskId) { // Skip to next phase when A, B, Start, or Select is pressed - if (JOY_NEW(A_B_START_SELECT) || gTasks[taskId].data[1] != 0) + if (JOY_NEW(A_B_START_SELECT) || gTasks[taskId].tSkipToNext) { gTasks[taskId].tSkipToNext = TRUE; gTasks[taskId].tCounter = 0; @@ -644,9 +694,9 @@ static void Task_TitleScreenPhase1(u8 taskId) { u16 frameNum = gTasks[taskId].tCounter; if (frameNum == 176) - StartPokemonLogoShine(1); + StartPokemonLogoShine(SHINE_MODE_DOUBLE); else if (frameNum == 64) - StartPokemonLogoShine(2); + StartPokemonLogoShine(SHINE_MODE_SINGLE); gTasks[taskId].tCounter--; } @@ -663,19 +713,22 @@ static void Task_TitleScreenPhase1(u8 taskId) // Create left side of version banner spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0); - gSprites[spriteId].data[0] = 64; - gSprites[spriteId].data[1] = taskId; + gSprites[spriteId].sAlphaBlendIdx = ARRAY_COUNT(gTitleScreenAlphaBlend); + gSprites[spriteId].sParentTaskId = taskId; // Create right side of version banner spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0); - gSprites[spriteId].data[1] = taskId; + gSprites[spriteId].sParentTaskId = taskId; gTasks[taskId].tCounter = 144; gTasks[taskId].func = Task_TitleScreenPhase2; } } -// Create "Press Start" and copyright banners, and slide Pokemon logo up +#undef sParentTaskId +#undef sAlphaBlendIdx + +// Create "Press Start" and copyright banners, and slide Pokémon logo up static void Task_TitleScreenPhase2(u8 taskId) { u32 yPos; @@ -705,31 +758,31 @@ static void Task_TitleScreenPhase2(u8 taskId) | DISPCNT_OBJ_ON); CreatePressStartBanner(START_BANNER_X, 108); CreateCopyrightBanner(START_BANNER_X, 148); - gTasks[taskId].data[4] = 0; + gTasks[taskId].tBg1Y = 0; gTasks[taskId].func = Task_TitleScreenPhase3; } - if (!(gTasks[taskId].tCounter & 3) && gTasks[taskId].data[2] != 0) - gTasks[taskId].data[2]++; - if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].data[3] != 0) - gTasks[taskId].data[3]++; + if (!(gTasks[taskId].tCounter & 3) && gTasks[taskId].tPointless != 0) + gTasks[taskId].tPointless++; + if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].tBg2Y != 0) + gTasks[taskId].tBg2Y++; - // Slide Pokemon logo up - yPos = gTasks[taskId].data[3] * 256; + // Slide Pokémon logo up + yPos = gTasks[taskId].tBg2Y * 256; SetGpuReg(REG_OFFSET_BG2Y_L, yPos); SetGpuReg(REG_OFFSET_BG2Y_H, yPos / 0x10000); - gTasks[taskId].data[5] = 15; - gTasks[taskId].data[6] = 6; + gTasks[taskId].data[5] = 15; // Unused + gTasks[taskId].data[6] = 6; // Unused } // Show Rayquaza silhouette and process main title screen input static void Task_TitleScreenPhase3(u8 taskId) { - if ((JOY_NEW(A_BUTTON)) || (JOY_NEW(START_BUTTON))) + if (JOY_NEW(A_BUTTON) || JOY_NEW(START_BUTTON)) { FadeOutBGM(4); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITEALPHA); SetMainCallback2(CB2_GoToMainMenu); } else if (JOY_HELD(CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO) @@ -740,30 +793,29 @@ static void Task_TitleScreenPhase3(u8 taskId) && CanResetRTC() == TRUE) { FadeOutBGM(4); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); SetMainCallback2(CB2_GoToResetRtcScreen); } else if (JOY_HELD(BERRY_UPDATE_BUTTON_COMBO) == BERRY_UPDATE_BUTTON_COMBO) { FadeOutBGM(4); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); SetMainCallback2(CB2_GoToBerryFixScreen); } else { SetGpuReg(REG_OFFSET_BG2Y_L, 0); SetGpuReg(REG_OFFSET_BG2Y_H, 0); - gTasks[taskId].tCounter++; - if (gTasks[taskId].tCounter & 1) + if (++gTasks[taskId].tCounter & 1) { - gTasks[taskId].data[4]++; - gBattle_BG1_Y = gTasks[taskId].data[4] / 2; + gTasks[taskId].tBg1Y++; + gBattle_BG1_Y = gTasks[taskId].tBg1Y / 2; gBattle_BG1_X = 0; } UpdateLegendaryMarkingColor(gTasks[taskId].tCounter); if ((gMPlayInfo_BGM.status & 0xFFFF) == 0) { - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITEALPHA); SetMainCallback2(CB2_GoToCopyrightScreen); } } diff --git a/src/trade.c b/src/trade.c index 971f0d966e..e07e418d1a 100644 --- a/src/trade.c +++ b/src/trade.c @@ -157,7 +157,7 @@ struct InGameTrade { u32 personality; u16 heldItem; u8 mailNum; - u8 otName[11]; + u8 otName[TRAINER_NAME_LENGTH + 1]; u8 otGender; u8 sheen; u16 requestedSpecies; @@ -168,7 +168,7 @@ static EWRAM_DATA u8 *sMenuTextTileBuffer = NULL; // Bytes 0-2 are used for the player's name text // Bytes 3-5 are used for the partner's name text // Bytes 6-7 are used for the Cancel text -// Bytes 8-13 are used for the Choose a Pokemon text +// Bytes 8-13 are used for the Choose a Pokémon text // See the corresponding GFXTAGs in src/data/trade.h static EWRAM_DATA u8 *sMenuTextTileBuffers[NUM_MENU_TEXT_SPRITES] = {NULL}; @@ -1010,25 +1010,25 @@ static void SetActiveMenuOptions(void) { if (i < sTradeMenu->partyCounts[TRADE_PLAYER]) { - // Present player pokemon + // Present player Pokémon gSprites[sTradeMenu->partySpriteIds[TRADE_PLAYER][i]].invisible = FALSE; sTradeMenu->optionsActive[i] = TRUE; } else { - // Absent player pokemon + // Absent player Pokémon sTradeMenu->optionsActive[i] = FALSE; } if (i < sTradeMenu->partyCounts[TRADE_PARTNER]) { - // Present partner pokemon + // Present partner Pokémon gSprites[sTradeMenu->partySpriteIds[TRADE_PARTNER][i]].invisible = FALSE; sTradeMenu->optionsActive[i + PARTY_SIZE] = TRUE; } else { - // Absent partner pokemon + // Absent partner Pokémon sTradeMenu->optionsActive[i + PARTY_SIZE] = FALSE; } } @@ -1285,7 +1285,7 @@ static void Leader_HandleCommunication(void) if (sTradeMenu->playerSelectStatus == STATUS_READY && sTradeMenu->partnerSelectStatus == STATUS_READY) { - // Both players have selected a pokemon to trade + // Both players have selected a Pokémon to trade sTradeMenu->callbackId = CB_SET_SELECTED_MONS; sTradeMenu->linkData[0] = LINKCMD_SET_MONS_TO_TRADE; sTradeMenu->linkData[1] = sTradeMenu->cursorPosition; @@ -1295,7 +1295,7 @@ static void Leader_HandleCommunication(void) else if (sTradeMenu->playerSelectStatus == STATUS_READY && sTradeMenu->partnerSelectStatus == STATUS_CANCEL) { - // The player has selected a pokemon to trade, + // The player has selected a Pokémon to trade, // but the partner has selected Cancel PrintTradeMessage(MSG_CANCELED); sTradeMenu->linkData[0] = LINKCMD_PARTNER_CANCEL_TRADE; @@ -1308,7 +1308,7 @@ static void Leader_HandleCommunication(void) else if (sTradeMenu->playerSelectStatus == STATUS_CANCEL && sTradeMenu->partnerSelectStatus == STATUS_READY) { - // The partner has selected a pokemon to trade, + // The partner has selected a Pokémon to trade, // but the player has selected cancel PrintTradeMessage(MSG_FRIEND_WANTS_TO_TRADE); sTradeMenu->linkData[0] = LINKCMD_PLAYER_CANCEL_TRADE; @@ -1465,7 +1465,7 @@ static void CB_ProcessMenuInput(void) if (sTradeMenu->cursorPosition < PARTY_SIZE) { - // Selected pokemon in player's party + // Selected Pokémon in player's party DrawTextBorderOuter(1, 1, 14); FillWindowPixelBuffer(1, PIXEL_FILL(1)); PrintMenuTable(1, ARRAY_COUNT(sSelectTradeMonActions), sSelectTradeMonActions); @@ -1476,7 +1476,7 @@ static void CB_ProcessMenuInput(void) } else if (sTradeMenu->cursorPosition < PARTY_SIZE * 2) { - // Selected pokemon in partner's party + // Selected Pokémon in partner's party BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenu->callbackId = CB_SHOW_MON_SUMMARY; } @@ -1855,7 +1855,7 @@ static void SetSelectedMon(u8 cursorPosition) if (sTradeMenu->drawSelectedMonState[whichParty] == 0) { // Start the animation to display just the selected - // pokemon in the middle of the screen + // Pokémon in the middle of the screen sTradeMenu->drawSelectedMonState[whichParty] = 1; sTradeMenu->selectedMonIdx[whichParty] = cursorPosition; } @@ -1864,7 +1864,7 @@ static void SetSelectedMon(u8 cursorPosition) static void DrawSelectedMonScreen(u8 whichParty) { s8 nameStringWidth; - u8 nickname[20]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; u8 movesString[56]; u8 i; u8 partyIdx; @@ -1889,10 +1889,10 @@ static void DrawSelectedMonScreen(u8 whichParty) for (i = 0; i < PARTY_SIZE; i++) ClearWindowTilemap(i + (whichParty * PARTY_SIZE + 2)); - // Re-display the selected pokemon + // Re-display the selected Pokémon gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].invisible = FALSE; - // Move the selected pokemon to the center + // Move the selected Pokémon to the center gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[0] = 20; gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[2] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; @@ -1900,7 +1900,7 @@ static void DrawSelectedMonScreen(u8 whichParty) StoreSpriteCallbackInData6(&gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]], SpriteCB_MonIcon); sTradeMenu->drawSelectedMonState[whichParty]++; Trade_MoveSelectedMonToTarget(&gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]]); - + CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, whichParty * 15, 0, 15, 17, 0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); @@ -1950,7 +1950,7 @@ static void DrawSelectedMonScreen(u8 whichParty) static u8 GetMonNicknameWidth(u8 *str, u8 whichParty, u8 partyIdx) { - u8 nickname[POKEMON_NAME_LENGTH]; + u8 nickname[POKEMON_NAME_LENGTH + 1]; if (whichParty == TRADE_PLAYER) GetMonData(&gPlayerParty[partyIdx], MON_DATA_NICKNAME, nickname); @@ -2006,8 +2006,8 @@ static void PrintPartyMonNickname(u8 whichParty, u8 windowId, u8 *nickname) static void PrintPartyNicknames(u8 whichParty) { u8 i; - u8 nickname[20]; - u8 str[32]; + u8 nickname[POKEMON_NAME_BUFFER_SIZE]; + u8 str[max(32, POKEMON_NAME_BUFFER_SIZE)]; struct Pokemon *party = (whichParty == TRADE_PLAYER) ? gPlayerParty : gEnemyParty; for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) @@ -2023,7 +2023,7 @@ static void PrintLevelAndGender(u8 whichParty, u8 monIdx, u8 x, u8 y, u8 width, u8 level; u32 symbolTile; u8 gender; - u8 nickname[POKEMON_NAME_LENGTH]; + u8 nickname[POKEMON_NAME_LENGTH + 1]; CopyToBgTilemapBufferRect_ChangePalette(1, gTradeMenuMonBox_Tilemap, width, height, 6, 3, 0); CopyBgTilemapBufferToVram(1); @@ -3093,7 +3093,7 @@ static void UpdatePokedexForReceivedMon(u8 partyIdx) // Functionally nop after commented code static void TryEnableNationalDexFromLinkPartner(void) { - u8 mpId = GetMultiplayerId(); + u8 UNUSED mpId = GetMultiplayerId(); // Originally in Ruby but commented out /*if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000) EnableNationalPokedex();*/ @@ -3109,13 +3109,13 @@ static void TradeMons(u8 playerPartyIdx, u8 partnerPartyIdx) struct Pokemon *partnerMon = &gEnemyParty[partnerPartyIdx]; u16 partnerMail = GetMonData(partnerMon, MON_DATA_MAIL); - // The mail attached to the sent Pokemon no longer exists in your file. + // The mail attached to the sent Pokémon no longer exists in your file. if (playerMail != MAIL_NONE) ClearMail(&gSaveBlock1Ptr->mail[playerMail]); SWAP(*playerMon, *partnerMon, sTradeAnim->tempMon); - // By default, a Pokemon received from a trade will have 70 Friendship. + // By default, a Pokémon received from a trade will have 70 Friendship. // Eggs use Friendship to track egg cycles, so don't set this on Eggs. friendship = 70; if (!GetMonData(playerMon, MON_DATA_IS_EGG)) @@ -3330,7 +3330,7 @@ static void LoadTradeSequenceSpriteSheetsAndPalettes(void) static void BufferTradeSceneStrings(void) { u8 mpId; - u8 name[20]; + u8 name[POKEMON_NAME_BUFFER_SIZE]; const struct InGameTrade *ingameTrade; if (sTradeAnim->isLinkTrade) @@ -4539,7 +4539,7 @@ u16 GetInGameTradeSpeciesInfo(void) static void BufferInGameTradeMonName(void) { - u8 nickname[32]; + u8 nickname[max(32, POKEMON_NAME_BUFFER_SIZE)]; const struct InGameTrade *inGameTrade = &sIngameTrades[gSpecialVar_0x8004]; GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gStringVar1, nickname); diff --git a/src/trainer_hill.c b/src/trainer_hill.c index a74270ec77..018b9f14ba 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -146,22 +146,22 @@ static const u16 sPrizeListLuxuryBall1[] = {ITEM_LUXURY_BALL, ITEM_ETHER, I static const u16 sPrizeListMaxRevive1[] = {ITEM_MAX_REVIVE, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; static const u16 sPrizeListMaxEther1[] = {ITEM_MAX_ETHER, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; static const u16 sPrizeListElixir1[] = {ITEM_ELIXIR, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; -static const u16 sPrizeListRoar[] = {ITEM_TM05_ROAR, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; -static const u16 sPrizeListSludgeBomb[] = {ITEM_TM36_SLUDGE_BOMB, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; -static const u16 sPrizeListToxic[] = {ITEM_TM06_TOXIC, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; -static const u16 sPrizeListSunnyDay[] = {ITEM_TM11_SUNNY_DAY, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; -static const u16 sPrizeListEarthQuake[] = {ITEM_TM26_EARTHQUAKE, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 sPrizeListRoar[] = {ITEM_TM_ROAR, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 sPrizeListSludgeBomb[] = {ITEM_TM_SLUDGE_BOMB, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 sPrizeListToxic[] = {ITEM_TM_TOXIC, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 sPrizeListSunnyDay[] = {ITEM_TM_SUNNY_DAY, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 sPrizeListEarthQuake[] = {ITEM_TM_EARTHQUAKE, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; static const u16 sPrizeListRareCandy2[] = {ITEM_RARE_CANDY, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; static const u16 sPrizeListLuxuryBall2[] = {ITEM_LUXURY_BALL, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; static const u16 sPrizeListMaxRevive2[] = {ITEM_MAX_REVIVE, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; static const u16 sPrizeListMaxEther2[] = {ITEM_MAX_ETHER, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; static const u16 sPrizeListElixir2[] = {ITEM_ELIXIR, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; -static const u16 sPrizeListBrickBreak[] = {ITEM_TM31_BRICK_BREAK, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; -static const u16 sPrizeListTorment[] = {ITEM_TM41_TORMENT, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; -static const u16 sPrizeListSkillSwap[] = {ITEM_TM48_SKILL_SWAP, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; -static const u16 sPrizeListGigaDrain[] = {ITEM_TM19_GIGA_DRAIN, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; -static const u16 sPrizeListAttract[] = {ITEM_TM45_ATTRACT, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 sPrizeListBrickBreak[] = {ITEM_TM_BRICK_BREAK, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 sPrizeListTorment[] = {ITEM_TM_TORMENT, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 sPrizeListSkillSwap[] = {ITEM_TM_SKILL_SWAP, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 sPrizeListGigaDrain[] = {ITEM_TM_GIGA_DRAIN, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 sPrizeListAttract[] = {ITEM_TM_ATTRACT, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; static const u16 *const sPrizeLists1[NUM_TRAINER_HILL_PRIZE_LISTS] = { @@ -571,7 +571,7 @@ static void IsTrainerHillChallengeActive(void) gSpecialVar_Result = TRUE; } -static void TrainerHillDummy_Unused(void) +static void UNUSED TrainerHillDummy_Unused(void) { } @@ -650,7 +650,7 @@ void LoadTrainerHillObjectEventTemplates(void) eventTemplates[i].localId = i + 1; eventTemplates[i].graphicsId = FacilityClassToGraphicsId(sHillData->floors[floorId].trainers[i].facilityClass); eventTemplates[i].x = sHillData->floors[floorId].map.trainerCoords[i] & 0xF; - eventTemplates[i].y = ((sHillData->floors[floorId].map.trainerCoords[i] >> 4) & 0xF) + 5; + eventTemplates[i].y = ((sHillData->floors[floorId].map.trainerCoords[i] >> 4) & 0xF) + HILL_FLOOR_HEIGHT_MARGIN; bits = i << 2; eventTemplates[i].movementType = ((sHillData->floors[floorId].map.trainerDirections >> bits) & 0xF) + MOVEMENT_TYPE_FACE_UP; eventTemplates[i].trainerRange_berryTreeId = (sHillData->floors[floorId].map.trainerRanges >> bits) & 0xF; @@ -769,8 +769,7 @@ u8 GetCurrentTrainerHillMapId(void) return mapId; } -// Unused -static bool32 OnTrainerHillRoof(void) +static bool32 UNUSED OnTrainerHillRoof(void) { bool32 onRoof; @@ -1066,10 +1065,10 @@ static u16 GetPrizeItemId(void) // Which prize is given from the list depends on the time scored. // The prize for any time after 12 minutes is the same in every list. // The prizes for a time under 12 minutes are: - // - ITEM_TM11_SUNNY_DAY (Normal) + // - ITEM_TM_SUNNY_DAY (Normal) // - ITEM_ELIXIR (Variety) - // - ITEM_TM19_GIGA_DRAIN (Unique) - // - ITEM_TM31_BRICK_BREAK (Expert) + // - ITEM_TM_GIGA_DRAIN (Unique) + // - ITEM_TM_BRICK_BREAK (Expert) // As an additional note, if players were allowed to enter a Trainer Hill challenge before // entering the Hall of Fame, there would be 1 additional prize possibility (ITEM_MAX_ETHER) // as Normal / Unique modes would use sPrizeListSets[0][3] / sPrizeListSets[1][3] respectively. diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index 3d7823cf3e..f36060e8d1 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -11,7 +11,7 @@ #define PICS_COUNT 8 -// Needs to be large enough to store either a decompressed pokemon pic or trainer pic +// Needs to be large enough to store either a decompressed Pokémon pic or trainer pic #define PIC_SPRITE_SIZE max(MON_PIC_SIZE, TRAINER_PIC_SIZE) #define MAX_PIC_FRAMES max(MAX_MON_PIC_FRAMES, MAX_TRAINER_PIC_FRAMES) @@ -337,8 +337,7 @@ u16 FreeAndDestroyMonPicSprite(u16 spriteId) return FreeAndDestroyPicSpriteInternal(spriteId); } -// Unused -static u16 LoadMonPicInWindow(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId) +static u16 UNUSED LoadMonPicInWindow(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId) { return LoadPicSpriteInWindow(species, otId, personality, isFrontPic, paletteSlot, windowId, FALSE); } @@ -359,8 +358,7 @@ u16 FreeAndDestroyTrainerPicSprite(u16 spriteId) return FreeAndDestroyPicSpriteInternal(spriteId); } -// Unused -static u16 LoadTrainerPicInWindow(u16 species, bool8 isFrontPic, u8 paletteSlot, u8 windowId) +static u16 UNUSED LoadTrainerPicInWindow(u16 species, bool8 isFrontPic, u8 paletteSlot, u8 windowId) { return LoadPicSpriteInWindow(species, 0, 0, isFrontPic, paletteSlot, windowId, TRUE); } diff --git a/src/trainer_see.c b/src/trainer_see.c index 97c2bc95e7..51cc64f4a0 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -131,11 +131,11 @@ static const struct SpriteFrameImage sSpriteImageTable_ExclamationQuestionMark[] { { .data = sEmotion_ExclamationMarkGfx, - .size = 0x80 + .size = sizeof(sEmotion_ExclamationMarkGfx) }, { .data = sEmotion_QuestionMarkGfx, - .size = 0x80 + .size = sizeof(sEmotion_QuestionMarkGfx) } }; @@ -143,7 +143,7 @@ static const struct SpriteFrameImage sSpriteImageTable_HeartIcon[] = { { .data = sEmotion_HeartGfx, - .size = 0x80 + .size = sizeof(sEmotion_HeartGfx) } }; @@ -595,7 +595,7 @@ static bool8 JumpInPlaceBuriedTrainer(u8 taskId, struct Task *task, struct Objec if (gSprites[task->tOutOfAshSpriteId].animCmdIndex == 2) { trainerObj->fixedPriority = 0; - trainerObj->triggerGroundEffectsOnMove = 1; + trainerObj->triggerGroundEffectsOnMove = TRUE; sprite = &gSprites[trainerObj->spriteId]; sprite->oam.priority = 2; @@ -627,7 +627,7 @@ static void Task_SetBuriedTrainerMovement(u8 taskId) struct Task *task = &gTasks[taskId]; struct ObjectEvent *objEvent; - LoadWordFromTwoHalfwords(&task->tObjEvent, (u32 *)&objEvent); + LoadWordFromTwoHalfwords((u16*) &task->tObjEvent, (u32 *)&objEvent); if (!task->data[7]) { ObjectEventClearHeldMovement(objEvent); @@ -649,7 +649,7 @@ static void Task_SetBuriedTrainerMovement(u8 taskId) // Called when a buried Trainer has the reveal_trainer movement applied, from direct interaction void SetBuriedTrainerMovement(struct ObjectEvent *objEvent) { - StoreWordInTwoHalfwords(&gTasks[CreateTask(Task_SetBuriedTrainerMovement, 0)].tObjEvent, (u32)objEvent); + StoreWordInTwoHalfwords((u16*) &gTasks[CreateTask(Task_SetBuriedTrainerMovement, 0)].tObjEvent, (u32)objEvent); } void DoTrainerApproach(void) diff --git a/src/tv.c b/src/tv.c index b32881d090..0152dffa3e 100644 --- a/src/tv.c +++ b/src/tv.c @@ -45,7 +45,6 @@ #include "constants/metatile_labels.h" #include "constants/moves.h" #include "constants/region_map_sections.h" -#include "constants/script_menu.h" #define LAST_TVSHOW_IDX (TV_SHOWS_COUNT - 1) @@ -485,7 +484,7 @@ static const u8 *const sTVPokemonTodayFailedTextGroup[] = { gTVPokemonTodayFailedText06 }; -static const u8 *const sTVPokemonAnslerTextGroup[] = { +static const u8 *const sTVPokemonAnglerTextGroup[] = { gTVPokemonAnglerText00, gTVPokemonAnglerText01 }; @@ -941,9 +940,8 @@ void GabbyAndTyBeforeInterview(void) gSaveBlock1Ptr->gabbyAndTyData.mon2 = gBattleResults.playerMon2Species; gSaveBlock1Ptr->gabbyAndTyData.lastMove = gBattleResults.lastUsedMovePlayer; if (gSaveBlock1Ptr->gabbyAndTyData.battleNum != 0xFF) - { gSaveBlock1Ptr->gabbyAndTyData.battleNum++; - } + gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn = gBattleResults.playerMonWasDamaged; if (gBattleResults.playerFaintCounter != 0) @@ -975,9 +973,7 @@ void GabbyAndTyBeforeInterview(void) TakeGabbyAndTyOffTheAir(); if (gSaveBlock1Ptr->gabbyAndTyData.lastMove == MOVE_NONE) - { - FlagSet(FLAG_TEMP_1); - } + FlagSet(FLAG_TEMP_SKIP_GABBY_INTERVIEW); } void GabbyAndTyAfterInterview(void) @@ -1483,8 +1479,8 @@ static void InterviewAfter_BravoTrainerBattleTowerProfile(void) TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->bravoTrainerTower.kind = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE; show->bravoTrainerTower.active = TRUE; - StringCopy(show->bravoTrainerTower.trainerName, gSaveBlock2Ptr->playerName); - StringCopy(show->bravoTrainerTower.pokemonName, gSaveBlock2Ptr->frontier.towerInterview.opponentName); + StringCopy(show->bravoTrainerTower.playerName, gSaveBlock2Ptr->playerName); + StringCopy(show->bravoTrainerTower.opponentName, gSaveBlock2Ptr->frontier.towerInterview.opponentName); show->bravoTrainerTower.species = gSaveBlock2Ptr->frontier.towerInterview.playerSpecies; show->bravoTrainerTower.defeatedSpecies = gSaveBlock2Ptr->frontier.towerInterview.opponentSpecies; show->bravoTrainerTower.numFights = GetCurrentBattleTowerWinStreak(gSaveBlock2Ptr->frontier.towerLvlMode, 0); @@ -1495,11 +1491,11 @@ static void InterviewAfter_BravoTrainerBattleTowerProfile(void) show->bravoTrainerTower.btLevel = FRONTIER_MAX_LEVEL_OPEN; show->bravoTrainerTower.interviewResponse = gSpecialVar_0x8004; StorePlayerIdInNormalShow(show); - show->bravoTrainerTower.language = gGameLanguage; - if (show->bravoTrainerTower.language == LANGUAGE_JAPANESE || gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage == LANGUAGE_JAPANESE) - show->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_JAPANESE; + show->bravoTrainerTower.playerLanguage = gGameLanguage; + if (show->bravoTrainerTower.playerLanguage == LANGUAGE_JAPANESE || gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage == LANGUAGE_JAPANESE) + show->bravoTrainerTower.opponentLanguage = LANGUAGE_JAPANESE; else - show->bravoTrainerTower.pokemonNameLanguage = gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage; + show->bravoTrainerTower.opponentLanguage = gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage; } void TryPutSmartShopperOnAir(void) @@ -3387,6 +3383,7 @@ u8 CheckForPlayersHouseNews(void) void GetMomOrDadStringForTVMessage(void) { + // If the player is checking the TV in their house it will only refer to their Mom. if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) { if (gSaveBlock2Ptr->playerGender == MALE) @@ -3416,6 +3413,7 @@ void GetMomOrDadStringForTVMessage(void) } else if (VarGet(VAR_TEMP_3) > 2) { + // Should only happen if VAR_TEMP_3 is already in use by something else. if (VarGet(VAR_TEMP_3) % 2 == 0) StringCopy(gStringVar1, gText_Mom); else @@ -3423,6 +3421,9 @@ void GetMomOrDadStringForTVMessage(void) } else { + // Randomly choose whether to refer to Mom or Dad. + // NOTE: Because of this, any map that has a TV in it shouldn't rely on VAR_TEMP_3. + // If its value is 0, checking the TV will set it to 1 or 2. if (Random() % 2 != 0) { StringCopy(gStringVar1, gText_Mom); @@ -3960,8 +3961,7 @@ else \ (langptr) = langfix; \ } -// Unused -static void TranslateShowNames(TVShow *show, u32 language) +static void UNUSED TranslateShowNames(TVShow *show, u32 language) { int i; TVShow **shows; @@ -3992,8 +3992,8 @@ static void TranslateShowNames(TVShow *show, u32 language) break; case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: shows[5] = &show[i]; - SetStrLanguage(shows[5]->bravoTrainerTower.trainerName, shows[5]->bravoTrainerTower.language, language); - SetStrLanguage(shows[5]->bravoTrainerTower.pokemonName, shows[5]->bravoTrainerTower.pokemonNameLanguage, language); + SetStrLanguage(shows[5]->bravoTrainerTower.playerName, shows[5]->bravoTrainerTower.playerLanguage, language); + SetStrLanguage(shows[5]->bravoTrainerTower.opponentName, shows[5]->bravoTrainerTower.opponentLanguage, language); break; case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: shows[4] = &show[i]; @@ -4035,8 +4035,8 @@ void SanitizeTVShowsForRuby(TVShow *shows) { if (curShow->bravoTrainerTower.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE) { - if ((curShow->bravoTrainerTower.language == LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage != LANGUAGE_JAPANESE) - || (curShow->bravoTrainerTower.language != LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage == LANGUAGE_JAPANESE)) + if ((curShow->bravoTrainerTower.playerLanguage == LANGUAGE_JAPANESE && curShow->bravoTrainerTower.opponentLanguage != LANGUAGE_JAPANESE) + || (curShow->bravoTrainerTower.playerLanguage != LANGUAGE_JAPANESE && curShow->bravoTrainerTower.opponentLanguage == LANGUAGE_JAPANESE)) memset(curShow, 0, sizeof(TVShow)); } } @@ -4050,10 +4050,10 @@ static void TranslateRubyShows(TVShow *shows) { if (curShow->bravoTrainerTower.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE) { - if (IsStringJapanese(curShow->bravoTrainerTower.pokemonName)) - curShow->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_JAPANESE; + if (IsStringJapanese(curShow->bravoTrainerTower.opponentName)) + curShow->bravoTrainerTower.opponentLanguage = LANGUAGE_JAPANESE; else - curShow->bravoTrainerTower.pokemonNameLanguage = GAME_LANGUAGE; + curShow->bravoTrainerTower.opponentLanguage = GAME_LANGUAGE; } } } @@ -4093,8 +4093,8 @@ static void TranslateJapaneseEmeraldShows(TVShow *shows) curShow->bravoTrainer.pokemonNameLanguage = GetStringLanguage(curShow->bravoTrainer.pokemonNickname); break; case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - curShow->bravoTrainerTower.language = GetStringLanguage(curShow->bravoTrainerTower.trainerName); - curShow->bravoTrainerTower.pokemonNameLanguage = GetStringLanguage(curShow->bravoTrainerTower.pokemonName); + curShow->bravoTrainerTower.playerLanguage = GetStringLanguage(curShow->bravoTrainerTower.playerName); + curShow->bravoTrainerTower.opponentLanguage = GetStringLanguage(curShow->bravoTrainerTower.opponentName); break; case TVSHOW_CONTEST_LIVE_UPDATES: curShow->contestLiveUpdates.winningTrainerLanguage = GetStringLanguage(curShow->contestLiveUpdates.winningTrainerName); @@ -4385,7 +4385,7 @@ static void DoTVShowBravoTrainerBattleTower(void) switch(state) { case BRAVOTOWER_STATE_INTRO: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.playerName, show->bravoTrainerTower.playerLanguage); StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]); if (show->bravoTrainerTower.numFights >= FRONTIER_STAGES_PER_CHALLENGE) sTVShowState = BRAVOTOWER_STATE_NEW_RECORD; @@ -4406,7 +4406,7 @@ static void DoTVShowBravoTrainerBattleTower(void) sTVShowState = BRAVOTOWER_STATE_LOST_FINAL; break; case BRAVOTOWER_STATE_LOST: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.opponentName, show->bravoTrainerTower.opponentLanguage); ConvertIntToDecimalString(1, show->bravoTrainerTower.numFights + 1); if (show->bravoTrainerTower.interviewResponse == 0) sTVShowState = BRAVOTOWER_STATE_SATISFIED; @@ -4414,7 +4414,7 @@ static void DoTVShowBravoTrainerBattleTower(void) sTVShowState = BRAVOTOWER_STATE_UNSATISFIED; break; case BRAVOTOWER_STATE_WON: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.opponentName, show->bravoTrainerTower.opponentLanguage); StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]); if (show->bravoTrainerTower.interviewResponse == 0) sTVShowState = BRAVOTOWER_STATE_SATISFIED; @@ -4422,7 +4422,7 @@ static void DoTVShowBravoTrainerBattleTower(void) sTVShowState = BRAVOTOWER_STATE_UNSATISFIED; break; case BRAVOTOWER_STATE_LOST_FINAL: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.opponentName, show->bravoTrainerTower.opponentLanguage); StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]); if (show->bravoTrainerTower.interviewResponse == 0) sTVShowState = BRAVOTOWER_STATE_SATISFIED; @@ -4430,11 +4430,11 @@ static void DoTVShowBravoTrainerBattleTower(void) sTVShowState = BRAVOTOWER_STATE_UNSATISFIED; break; case BRAVOTOWER_STATE_SATISFIED: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.opponentName, show->bravoTrainerTower.opponentLanguage); sTVShowState = BRAVOTOWER_STATE_RESPONSE; break; case BRAVOTOWER_STATE_UNSATISFIED: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.opponentName, show->bravoTrainerTower.opponentLanguage); sTVShowState = BRAVOTOWER_STATE_RESPONSE; break; case BRAVOTOWER_STATE_UNUSED_1: @@ -4443,7 +4443,7 @@ static void DoTVShowBravoTrainerBattleTower(void) case BRAVOTOWER_STATE_UNUSED_2: case BRAVOTOWER_STATE_UNUSED_3: case BRAVOTOWER_STATE_UNUSED_4: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.playerName, show->bravoTrainerTower.playerLanguage); sTVShowState = BRAVOTOWER_STATE_RESPONSE; break; case BRAVOTOWER_STATE_RESPONSE: @@ -4456,12 +4456,12 @@ static void DoTVShowBravoTrainerBattleTower(void) case BRAVOTOWER_STATE_RESPONSE_SATISFIED: case BRAVOTOWER_STATE_RESPONSE_UNSATISFIED: CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]); - TVShowConvertInternationalString(gStringVar2, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); - TVShowConvertInternationalString(gStringVar3, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->bravoTrainerTower.playerName, show->bravoTrainerTower.playerLanguage); + TVShowConvertInternationalString(gStringVar3, show->bravoTrainerTower.opponentName, show->bravoTrainerTower.opponentLanguage); sTVShowState = BRAVOTOWER_STATE_OUTRO; break; case BRAVOTOWER_STATE_OUTRO: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.playerName, show->bravoTrainerTower.playerLanguage); StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]); TVShowDone(); break; @@ -5502,7 +5502,7 @@ static void DoTVShowPokemonAngler(void) TVShowDone(); break; } - ShowFieldMessage(sTVPokemonAnslerTextGroup[state]); + ShowFieldMessage(sTVPokemonAnglerTextGroup[state]); } static void DoTVShowTheWorldOfMasters(void) @@ -6241,7 +6241,7 @@ static void DoTVShowSpotTheCuties(void) TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language); TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage); - // Comments following the intro depend on how many ribbons the pokemon has + // Comments following the intro depend on how many ribbons the Pokémon has if (show->cuties.nRibbons < 10) sTVShowState = SPOTCUTIES_STATE_RIBBONS_LOW; else if (show->cuties.nRibbons < 20) diff --git a/src/union_room.c b/src/union_room.c index 9160fc16ae..1b29863183 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -1043,8 +1043,8 @@ static void Task_TryJoinLinkGroup(u8 taskId) id = ListMenu_ProcessInput(data->listTaskId); if (JOY_NEW(A_BUTTON) && id != LIST_NOTHING_CHOSEN) { - // this unused variable along with the assignment is needed to match - u32 activity = data->playerList->players[id].rfu.data.activity; + // Needed to match + u32 UNUSED activity = data->playerList->players[id].rfu.data.activity; if (data->playerList->players[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->playerList->players[id].rfu.data.startedActivity) { @@ -2149,8 +2149,8 @@ static void Task_CardOrNewsWithFriend(u8 taskId) id = ListMenu_ProcessInput(data->listTaskId); if (JOY_NEW(A_BUTTON) && id != LIST_NOTHING_CHOSEN) { - // this unused variable along with the assignment is needed to match - u32 activity = data->playerList->players[id].rfu.data.activity; + // Needed to match + u32 UNUSED activity = data->playerList->players[id].rfu.data.activity; if (data->playerList->players[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->playerList->players[id].rfu.data.startedActivity) { diff --git a/src/union_room_chat.c b/src/union_room_chat.c index 253e025689..993e36de52 100644 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -744,11 +744,11 @@ static const struct MessageWindowInfo sDisplayStdMessages[] = { static const u8 sText_Ellipsis[] = _("…"); static const struct MenuAction sKeyboardPageTitleTexts[UNION_ROOM_KB_PAGE_COUNT + 1] = { - [UNION_ROOM_KB_PAGE_UPPER] = {gText_Upper, NULL}, - [UNION_ROOM_KB_PAGE_LOWER] = {gText_Lower, NULL}, - [UNION_ROOM_KB_PAGE_EMOJI] = {gText_Symbols, NULL}, - [UNION_ROOM_KB_PAGE_REGISTER] = {gText_Register2, NULL}, - [UNION_ROOM_KB_PAGE_COUNT] = {gText_Exit2, NULL}, + [UNION_ROOM_KB_PAGE_UPPER] = {gText_Upper, {NULL}}, + [UNION_ROOM_KB_PAGE_LOWER] = {gText_Lower, {NULL}}, + [UNION_ROOM_KB_PAGE_EMOJI] = {gText_Symbols, {NULL}}, + [UNION_ROOM_KB_PAGE_REGISTER] = {gText_Register2, {NULL}}, + [UNION_ROOM_KB_PAGE_COUNT] = {gText_Exit2, {NULL}}, }; static const u16 sUnionRoomChatInterfacePal[] = INCBIN_U16("graphics/union_room_chat/interface.gbapal"); diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c index b64ac4152b..c9d5c56e5c 100644 --- a/src/use_pokeblock.c +++ b/src/use_pokeblock.c @@ -73,10 +73,10 @@ struct UsePokeblockSession u8 natureText[34]; }; -// This struct is identical to PokenavMonListItem, the struct used for managing lists of pokemon in the pokenav +// This struct is identical to PokenavMonListItem, the struct used for managing lists of Pokémon in the PokéNav // Given that this screen is essentially duplicated in the poknav, this struct was probably the same one with // a more general name/purpose -// TODO: Once the pokenav conditions screens are documented, resolve the above +// TODO: Once the PokéNav conditions screens are documented, resolve the above struct UsePokeblockMenuPokemon { u8 boxId; // Because this screen is never used for the PC this is always set to TOTAL_BOXES_COUNT to refer to party @@ -173,8 +173,8 @@ static EWRAM_DATA struct UsePokeblockMenu *sMenu = NULL; static const u32 sMonFrame_Pal[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame_pal.bin"); static const u32 sMonFrame_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame.4bpp"); -static const u32 sMonFrame_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame.bin"); -static const u32 sGraphData_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/graph_data.bin"); +static const u32 sMonFrame_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame.bin.lz"); +static const u32 sGraphData_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/graph_data.bin.lz"); // The condition/flavors aren't listed in their normal order in this file, they're listed as shown on the graph going counter-clockwise // Normally they would go Cool/Spicy, Beauty/Dry, Cute/Sweet, Smart/Bitter, Tough/Sour (also graph order, but clockwise) @@ -1108,15 +1108,14 @@ static u8 GetSelectionIdFromPartyId(u8 partyId) return partyId - numEggs; } -// Unused -static u8 GetPartyIdFromSelectionId_(u8 selectionId) +static u8 UNUSED GetPartyIdFromSelectionId_(u8 selectionId) { return GetPartyIdFromSelectionId(selectionId); } static void LoadAndCreateUpDownSprites(void) { - u16 i, spriteId; + u16 i; LoadSpriteSheet(&sSpriteSheet_UpDown); LoadSpritePalette(&sSpritePalette_UpDown); @@ -1126,7 +1125,7 @@ static void LoadAndCreateUpDownSprites(void) { if (sInfo->enhancements[i] != 0) { - spriteId = CreateSprite(&sSpriteTemplate_UpDown, sUpDownCoordsOnGraph[i][0], sUpDownCoordsOnGraph[i][1], 0); + u16 spriteId = CreateSprite(&sSpriteTemplate_UpDown, sUpDownCoordsOnGraph[i][0], sUpDownCoordsOnGraph[i][1], 0); if (spriteId != MAX_SPRITES) { if (sInfo->enhancements[i] != 0) // Always true here @@ -1137,20 +1136,24 @@ static void LoadAndCreateUpDownSprites(void) } } +#define tTimer data[0] + static void SpriteCB_UpDown(struct Sprite *sprite) { - if (sprite->data[0] < 6) + if (sprite->tTimer < 6) sprite->y2 -= 2; - else if (sprite->data[0] < 12) + else if (sprite->tTimer < 12) sprite->y2 += 2; - if (++sprite->data[0] > 60) + if (++sprite->tTimer > 60) { DestroySprite(sprite); sInfo->numEnhancements--; } } +#undef tTimer + static void LoadPartyInfo(void) { u16 i; @@ -1256,7 +1259,7 @@ static void LoadAndCreateSelectionIcons(void) LoadSpriteSheets(spriteSheets); LoadSpritePalettes(spritePals); - // Fill pokeball selection icons up to number in party + // Fill Poké Ball selection icons up to number in party for (i = 0; i < sMenu->info.numSelections - 1; i++) { spriteId = CreateSprite(&spriteTemplate, 226, (i * 20) + 8, 0); @@ -1486,7 +1489,7 @@ static bool8 LoadNewSelection_CancelToMon(void) case 2: if (!ConditionMenu_UpdateMonEnter(&sMenu->graph, &sMenu->curMonXOffset)) { - // Load the new adjacent pokemon (not the one being shown) + // Load the new adjacent Pokémon (not the one being shown) LoadMonInfo(sMenu->toLoadSelection, sMenu->toLoadId); sMenu->info.helperState++; } @@ -1549,7 +1552,7 @@ static bool8 LoadNewSelection_MonToMon(void) case 2: if (!ConditionMenu_UpdateMonEnter(&sMenu->graph, &sMenu->curMonXOffset)) { - // Load the new adjacent pokemon (not the one being shown) + // Load the new adjacent Pokémon (not the one being shown) LoadMonInfo(sMenu->toLoadSelection, sMenu->toLoadId); sMenu->info.helperState++; } @@ -1590,8 +1593,8 @@ static void SpriteCB_SelectionIconCancel(struct Sprite *sprite) sprite->oam.paletteNum = IndexOfSpritePaletteTag(TAG_CONDITION_CANCEL); } -// Calculate the max id for sparkles/stars that appear around the pokemon on the condition screen -// All pokemon start with 1 sparkle (added by CreateConditionSparkleSprites), so the number here +1 +// Calculate the max id for sparkles/stars that appear around the Pokémon on the condition screen +// All Pokémon start with 1 sparkle (added by CreateConditionSparkleSprites), so the number here +1 // is the total number of sparkles that appear static void CalculateNumAdditionalSparkles(u8 monIndex) { @@ -1612,12 +1615,15 @@ static void LoadConditionGfx(void) LoadSpritePalette(&spritePalette); } +#define sSpeed data[0] +#define sTargetX data[1] + static void CreateConditionSprite(void) { u16 i; s16 xDiff, xStart; int yStart = 17; - int var = 8; + int speed = 8; struct Sprite **sprites = sMenu->condition; const struct SpriteTemplate *template = &sSpriteTemplate_Condition; @@ -1626,9 +1632,9 @@ static void CreateConditionSprite(void) u8 spriteId = CreateSprite(template, i * xDiff + xStart, yStart, 0); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].data[0] = var; - gSprites[spriteId].data[1] = (i * xDiff) | 0x20; - gSprites[spriteId].data[2] = i; + gSprites[spriteId].sSpeed = speed; + gSprites[spriteId].sTargetX = (i * xDiff) | 0x20; + gSprites[spriteId].data[2] = i; // Unused StartSpriteAnim(&gSprites[spriteId], i); sprites[i] = &gSprites[spriteId]; } @@ -1657,11 +1663,15 @@ static void SpriteCB_Condition(struct Sprite *sprite) { s16 prevX = sprite->x; - sprite->x += sprite->data[0]; - if ((prevX <= sprite->data[1] && sprite->x >= sprite->data[1]) - || (prevX >= sprite->data[1] && sprite->x <= sprite->data[1])) + // Slide onscreen + sprite->x += sprite->sSpeed; + + // Check if target position has been reached/surpassed + if ((prevX <= sprite->sTargetX && sprite->x >= sprite->sTargetX) + || (prevX >= sprite->sTargetX && sprite->x <= sprite->sTargetX)) { - sprite->x = sprite->data[1]; + // End slide onscreen, become static sprite. + sprite->x = sprite->sTargetX; sprite->callback = SpriteCallbackDummy; } } diff --git a/src/util.c b/src/util.c index 32f31a26dd..09381fcaf3 100644 --- a/src/util.c +++ b/src/util.c @@ -118,7 +118,7 @@ const u8 gMiscBlank_Gfx[] = INCBIN_U8("graphics/interface/blank.4bpp"); u8 CreateInvisibleSpriteWithCallback(void (*callback)(struct Sprite *)) { - u8 sprite = CreateSprite(&sInvisibleSpriteTemplate, 248, 168, 14); + u8 sprite = CreateSprite(&sInvisibleSpriteTemplate, DISPLAY_WIDTH + 8, DISPLAY_HEIGHT + 8, 14); gSprites[sprite].invisible = TRUE; gSprites[sprite].callback = callback; return sprite; @@ -158,7 +158,7 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) { u8 x, y; s8 i, j; - u8 xflip[32]; + u8 ALIGNED(4) xflip[32]; u8 h = sSpriteDimensions[shape][size][1]; u8 w = sSpriteDimensions[shape][size][0]; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index cc3ce82273..11d01f04ea 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -52,7 +52,11 @@ static void FeebasSeedRng(u16 seed); static bool8 IsWildLevelAllowedByRepel(u8 level); static void ApplyFluteEncounterRateMod(u32 *encRate); static void ApplyCleanseTagEncounterRateMod(u32 *encRate); +#ifdef BUGFIX +static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex, u32 size); +#else static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex); +#endif static bool8 IsAbilityAllowingEncounter(u8 level); EWRAM_DATA static u8 sWildEncountersDisabled = 0; @@ -360,7 +364,7 @@ static u8 PickWildMonNature(void) } } } - // check synchronize for a pokemon with the same ability + // check synchronize for a Pokémon with the same ability if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG) && GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE && Random() % 2 == 0) @@ -409,6 +413,11 @@ static void CreateWildMon(u16 species, u8 level) CreateMonWithNature(&gEnemyParty[0], species, level, USE_RANDOM_IVS, PickWildMonNature()); } +#ifdef BUGFIX +#define TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildPokemon, type, ability, ptr, count) TryGetAbilityInfluencedWildMonIndex(wildPokemon, type, ability, ptr, count) +#else +#define TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildPokemon, type, ability, ptr, count) TryGetAbilityInfluencedWildMonIndex(wildPokemon, type, ability, ptr) +#endif static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 area, u8 flags) { @@ -418,15 +427,15 @@ static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 ar switch (area) { case WILD_AREA_LAND: - if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &wildMonIndex)) + if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &wildMonIndex, LAND_WILD_COUNT)) break; - if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex)) + if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex, LAND_WILD_COUNT)) break; wildMonIndex = ChooseWildMonIndex_Land(); break; case WILD_AREA_WATER: - if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex)) + if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex, WATER_WILD_COUNT)) break; wildMonIndex = ChooseWildMonIndex_WaterRock(); @@ -783,7 +792,7 @@ void FishingWildEncounter(u8 rod) { species = GenerateFishingWildMon(gWildMonHeaders[GetCurrentMapWildMonHeaderId()].fishingMonsInfo, rod); } - IncrementGameStat(GAME_STAT_FISHING_CAPTURES); + IncrementGameStat(GAME_STAT_FISHING_ENCOUNTERS); SetPokemonAnglerSpecies(species); BattleSetup_StartWildBattle(); } @@ -803,16 +812,16 @@ u16 GetLocalWildMon(bool8 *isWaterMon) // Neither if (landMonsInfo == NULL && waterMonsInfo == NULL) return SPECIES_NONE; - // Land Pokemon + // Land Pokémon else if (landMonsInfo != NULL && waterMonsInfo == NULL) return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; - // Water Pokemon + // Water Pokémon else if (landMonsInfo == NULL && waterMonsInfo != NULL) { *isWaterMon = TRUE; return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; } - // Either land or water Pokemon + // Either land or water Pokémon if ((Random() % 100) < 80) { return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; @@ -923,8 +932,11 @@ static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u *monIndex = validIndexes[Random() % validMonCount]; return TRUE; } - +#ifdef BUGFIX +static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex, u32 size) +#else static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex) +#endif { if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) return FALSE; @@ -933,7 +945,11 @@ static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildM else if (Random() % 2 != 0) return FALSE; +#ifdef BUGFIX + return TryGetRandomWildMonIndexByType(wildMon, type, size, monIndex); +#else return TryGetRandomWildMonIndexByType(wildMon, type, LAND_WILD_COUNT, monIndex); +#endif } static void ApplyFluteEncounterRateMod(u32 *encRate) diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index d10c39c7df..9a562cf7f7 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -222,7 +222,7 @@ static void CB2_InitWirelessCommunicationScreen(void) ChangeBgX(1, 0, BG_COORD_SET); ChangeBgY(1, 0, BG_COORD_SET); LoadPalette(sPalettes, BG_PLTT_ID(0), PLTT_SIZE_4BPP); - Menu_LoadStdPalAt(0xF0); + Menu_LoadStdPalAt(BG_PLTT_ID(15)); DynamicPlaceholderTextUtil_Reset(); FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 15); CopyBgTilemapBufferToVram(1); diff --git a/sym_ewram.txt b/sym_ewram.txt index 414b7a3b23..31c507ee9b 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -1,3 +1,4 @@ + .include "gflib/malloc.o" .include "src/decompress.o" .include "src/main.o" .include "gflib/window.o" diff --git a/tools/aif2pcm/main.c b/tools/aif2pcm/main.c index 720db1acae..0824b92da8 100644 --- a/tools/aif2pcm/main.c +++ b/tools/aif2pcm/main.c @@ -238,7 +238,7 @@ void read_aif(struct Bytes *aif, AifData *aif_data) { FATAL_ERROR("More than one MARK Chunk in file!\n"); } - + markers = calloc(num_markers, sizeof(struct Marker)); // Read each marker. @@ -289,7 +289,7 @@ void read_aif(struct Bytes *aif, AifData *aif_data) // Skip NoLooping sustain loop. pos += 4; } - + // Skip release loop, we don't need it. pos += 6; } @@ -303,7 +303,7 @@ void read_aif(struct Bytes *aif, AifData *aif_data) { uint8_t *sample_data = (uint8_t *)malloc(num_samples * sizeof(uint8_t)); memcpy(sample_data, &aif->data[pos], num_samples); - + aif_data->samples8 = sample_data; aif_data->real_num_samples = num_samples; } @@ -316,7 +316,7 @@ void read_aif(struct Bytes *aif, AifData *aif_data) { sample_data_swapped[i] = __builtin_bswap16(sample_data[i]); } - + aif_data->samples16 = sample_data_swapped; aif_data->real_num_samples = num_samples; free(sample_data); @@ -329,12 +329,12 @@ void read_aif(struct Bytes *aif, AifData *aif_data) pos += chunk_size; } } - + if (markers) { // Resolve loop points. struct Marker *cur_marker = markers; - + // Grab loop start point. for (int i = 0; i < num_markers; i++, cur_marker++) { @@ -573,7 +573,7 @@ void aif2pcm(const char *aif_filename, const char *pcm_filename, bool compress) struct Bytes *aif = read_bytearray(aif_filename); AifData aif_data = {0}; read_aif(aif, &aif_data); - + // Convert 16-bit to 8-bit if necessary if (aif_data.sample_size == 16) { diff --git a/tools/gbagfx/Makefile b/tools/gbagfx/Makefile index 8728fa8d09..8a52d52d37 100644 --- a/tools/gbagfx/Makefile +++ b/tools/gbagfx/Makefile @@ -1,4 +1,4 @@ -CC = gcc +CC ?= gcc CFLAGS = -Wall -Wextra -Werror -Wno-sign-compare -std=c11 -O2 -DPNG_SKIP_SETJMP_CHECK CFLAGS += $(shell pkg-config --cflags libpng) diff --git a/tools/gbagfx/convert_png.c b/tools/gbagfx/convert_png.c index a5fefbd8b6..58371229c0 100644 --- a/tools/gbagfx/convert_png.c +++ b/tools/gbagfx/convert_png.c @@ -62,7 +62,7 @@ static unsigned char *ConvertBitDepth(unsigned char *src, int srcBitDepth, int d for (j = 8 - srcBitDepth; j >= 0; j -= srcBitDepth) { - unsigned char pixel = (srcByte >> j) % (1 << destBitDepth); + unsigned char pixel = ((srcByte >> j) % (1 << srcBitDepth)) % (1 << destBitDepth); *dest |= pixel << destBit; destBit -= destBitDepth; if (destBit < 0) @@ -130,7 +130,6 @@ void ReadPng(char *path, struct Image *image) FATAL_ERROR("Bit depth of image must be 1, 2, 4, or 8.\n"); image->pixels = ConvertBitDepth(image->pixels, bit_depth, image->bitDepth, image->width * image->height); free(src); - image->bitDepth = bit_depth; } } diff --git a/tools/gbagfx/font.c b/tools/gbagfx/font.c index 0dd6fbc3ee..1251b5c647 100644 --- a/tools/gbagfx/font.c +++ b/tools/gbagfx/font.c @@ -26,7 +26,7 @@ static void ConvertFromLatinFont(unsigned char *src, unsigned char *dest, unsign unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8); for (unsigned int i = 0; i < 8; i++) { - unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; + unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i; unsigned int destPixelsOffset = (pixelsY * 64) + (pixelsX / 4); dest[destPixelsOffset] = src[srcPixelsOffset + 1]; @@ -75,7 +75,7 @@ static void ConvertFromHalfwidthJapaneseFont(unsigned char *src, unsigned char * for (unsigned int i = 0; i < 8; i++) { unsigned int pixelsY = (row * 16) + (glyphTile * 8) + i; unsigned int destPixelsOffset = (pixelsY * 32) + (pixelsX / 4); - + dest[destPixelsOffset] = src[srcPixelsOffset + 1]; dest[destPixelsOffset + 1] = src[srcPixelsOffset]; @@ -233,7 +233,7 @@ void ReadHalfwidthJapaneseFont(char *path, struct Image *image) FATAL_ERROR("The file size (%d) is not a multiple of %d.\n", fileSize, glyphSize); int numGlyphs = fileSize / glyphSize; - + if (numGlyphs % 16 != 0) FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs); diff --git a/tools/gbagfx/gfx.c b/tools/gbagfx/gfx.c index 832e9bb397..1dfc38e2d0 100644 --- a/tools/gbagfx/gfx.c +++ b/tools/gbagfx/gfx.c @@ -204,6 +204,18 @@ static void ConvertToTiles8Bpp(unsigned char *src, unsigned char *dest, int numT } } +// For untiled, plain images +static void CopyPlainPixels(unsigned char *src, unsigned char *dest, int size, int dataWidth, bool invertColors) +{ + if (dataWidth == 0) return; + for (int i = 0; i < size; i += dataWidth) { + for (int j = dataWidth; j > 0; j--) { + unsigned char pixels = src[i + j - 1]; + *dest++ = invertColors ? ~pixels : pixels; + } + } +} + static void DecodeAffineTilemap(unsigned char *input, unsigned char *output, unsigned char *tilemap, int tileSize, int numTiles) { for (int i = 0; i < numTiles; i++) @@ -345,9 +357,9 @@ static unsigned char *DecodeTilemap(unsigned char *tiles, struct Tilemap *tilema return decoded; } -void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors) +void ReadTileImage(char *path, int tilesWidth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors) { - int tileSize = bitDepth * 8; + int tileSize = image->bitDepth * 8; int fileSize; unsigned char *buffer = ReadWholeFile(path, &fileSize); @@ -355,26 +367,25 @@ void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int int numTiles = fileSize / tileSize; if (image->tilemap.data.affine != NULL) { - int outTileSize = (bitDepth == 4 && image->palette.numColors > 16) ? 64 : tileSize; - buffer = DecodeTilemap(buffer, &image->tilemap, &numTiles, image->isAffine, tileSize, outTileSize, bitDepth); + int outTileSize = (image->bitDepth == 4 && image->palette.numColors > 16) ? 64 : tileSize; + buffer = DecodeTilemap(buffer, &image->tilemap, &numTiles, image->isAffine, tileSize, outTileSize, image->bitDepth); if (outTileSize == 64) { tileSize = 64; - image->bitDepth = bitDepth = 8; + image->bitDepth = 8; } } int tilesHeight = (numTiles + tilesWidth - 1) / tilesWidth; if (tilesWidth % metatileWidth != 0) - FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified metatile width (%d)", tilesWidth, metatileWidth); + FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified metatile width (%d)\n", tilesWidth, metatileWidth); if (tilesHeight % metatileHeight != 0) - FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified metatile height (%d)", tilesHeight, metatileHeight); + FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified metatile height (%d)\n", tilesHeight, metatileHeight); image->width = tilesWidth * 8; image->height = tilesHeight * 8; - image->bitDepth = bitDepth; image->pixels = calloc(tilesWidth * tilesHeight, tileSize); if (image->pixels == NULL) @@ -382,7 +393,7 @@ void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int int metatilesWide = tilesWidth / metatileWidth; - switch (bitDepth) { + switch (image->bitDepth) { case 1: ConvertFromTiles1Bpp(buffer, image->pixels, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); break; @@ -397,9 +408,9 @@ void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int free(buffer); } -void WriteImage(char *path, enum NumTilesMode numTilesMode, int numTiles, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors) +void WriteTileImage(char *path, enum NumTilesMode numTilesMode, int numTiles, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors) { - int tileSize = bitDepth * 8; + int tileSize = image->bitDepth * 8; if (image->width % 8 != 0) FATAL_ERROR("The width in pixels (%d) isn't a multiple of 8.\n", image->width); @@ -411,10 +422,10 @@ void WriteImage(char *path, enum NumTilesMode numTilesMode, int numTiles, int bi int tilesHeight = image->height / 8; if (tilesWidth % metatileWidth != 0) - FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified metatile width (%d)", tilesWidth, metatileWidth); + FATAL_ERROR("The width in tiles (%d) isn't a multiple of the specified metatile width (%d)\n", tilesWidth, metatileWidth); if (tilesHeight % metatileHeight != 0) - FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified metatile height (%d)", tilesHeight, metatileHeight); + FATAL_ERROR("The height in tiles (%d) isn't a multiple of the specified metatile height (%d)\n", tilesHeight, metatileHeight); int maxNumTiles = tilesWidth * tilesHeight; @@ -432,7 +443,7 @@ void WriteImage(char *path, enum NumTilesMode numTilesMode, int numTiles, int bi int metatilesWide = tilesWidth / metatileWidth; - switch (bitDepth) { + switch (image->bitDepth) { case 1: ConvertToTiles1Bpp(image->pixels, buffer, maxNumTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); break; @@ -468,6 +479,57 @@ void WriteImage(char *path, enum NumTilesMode numTilesMode, int numTiles, int bi free(buffer); } +void ReadPlainImage(char *path, int dataWidth, struct Image *image, bool invertColors) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(path, &fileSize); + + if (fileSize % dataWidth != 0) + FATAL_ERROR("The image data size (%d) isn't a multiple of the specified data width %d.\n", fileSize, dataWidth); + + // png scanlines have wasted bits if they do not align to byte boundaries. + // pngs misaligned in this way are not currently handled. + int pixelsPerByte = 8 / image->bitDepth; + if (image->width % pixelsPerByte != 0) + FATAL_ERROR("The width in pixels (%d) isn't a multiple of %d.\n", image->width, pixelsPerByte); + + int numPixels = fileSize * pixelsPerByte; + image->height = (numPixels + image->width - 1) / image->width; + image->pixels = calloc(image->width * image->height * image->bitDepth / 8, 1); + + if (image->pixels == NULL) + FATAL_ERROR("Failed to allocate memory for pixels.\n"); + + CopyPlainPixels(buffer, image->pixels, fileSize, dataWidth, invertColors); + + free(buffer); +} + +void WritePlainImage(char *path, int dataWidth, struct Image *image, bool invertColors) +{ + int bufferSize = image->width * image->height * image->bitDepth / 8; + + if (bufferSize % dataWidth != 0) + FATAL_ERROR("The image data size (%d) isn't a multiple of the specified data width %d.\n", bufferSize, dataWidth); + + // png scanlines have wasted bits if they do not align to byte boundaries. + // pngs misaligned in this way are not currently handled. + int pixelsPerByte = 8 / image->bitDepth; + if (image->width % pixelsPerByte != 0) + FATAL_ERROR("The width in pixels (%d) isn't a multiple of %d.\n", image->width, pixelsPerByte); + + unsigned char *buffer = malloc(bufferSize); + + if (buffer == NULL) + FATAL_ERROR("Failed to allocate memory for pixels.\n"); + + CopyPlainPixels(image->pixels, buffer, bufferSize, dataWidth, invertColors); + + WriteWholeFile(path, buffer, bufferSize); + + free(buffer); +} + void FreeImage(struct Image *image) { if (image->tilemap.data.affine != NULL) diff --git a/tools/gbagfx/gfx.h b/tools/gbagfx/gfx.h index f1dbfcf4f7..1797d84dfd 100644 --- a/tools/gbagfx/gfx.h +++ b/tools/gbagfx/gfx.h @@ -50,8 +50,10 @@ enum NumTilesMode { NUM_TILES_ERROR, }; -void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors); -void WriteImage(char *path, enum NumTilesMode numTilesMode, int numTiles, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors); +void ReadTileImage(char *path, int tilesWidth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors); +void WriteTileImage(char *path, enum NumTilesMode numTilesMode, int numTiles, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors); +void ReadPlainImage(char *path, int dataWidth, struct Image *image, bool invertColors); +void WritePlainImage(char *path, int dataWidth, struct Image *image, bool invertColors); void FreeImage(struct Image *image); void ReadGbaPalette(char *path, struct Palette *palette); void WriteGbaPalette(char *path, struct Palette *palette); diff --git a/tools/gbagfx/jasc_pal.c b/tools/gbagfx/jasc_pal.c index e5ba9c3c2f..8d4bb137d5 100644 --- a/tools/gbagfx/jasc_pal.c +++ b/tools/gbagfx/jasc_pal.c @@ -46,10 +46,14 @@ void ReadJascPaletteLine(FILE *fp, char *line) } if (c == '\n') - FATAL_ERROR("LF line endings aren't supported.\n"); + { + line[length] = 0; + + return; + } if (c == EOF) - FATAL_ERROR("Unexpected EOF. No CRLF at end of file.\n"); + FATAL_ERROR("Unexpected EOF. No LF or CRLF at end of file.\n"); if (c == 0) FATAL_ERROR("NUL character in file.\n"); diff --git a/tools/gbagfx/main.c b/tools/gbagfx/main.c index 5d4faacab0..98a1a1edf9 100644 --- a/tools/gbagfx/main.c +++ b/tools/gbagfx/main.c @@ -25,6 +25,9 @@ void ConvertGbaToPng(char *inputPath, char *outputPath, struct GbaToPngOptions * { struct Image image; + image.bitDepth = options->bitDepth; + image.tilemap.data.affine = NULL; + if (options->paletteFilePath != NULL) { char *paletteFileExtension = GetFileExtensionAfterDot(options->paletteFilePath); @@ -45,22 +48,25 @@ void ConvertGbaToPng(char *inputPath, char *outputPath, struct GbaToPngOptions * image.hasPalette = false; } - if (options->tilemapFilePath != NULL) + if (options->isTiled) { - int fileSize; - image.tilemap.data.affine = ReadWholeFile(options->tilemapFilePath, &fileSize); - if (options->isAffineMap && options->bitDepth != 8) - FATAL_ERROR("affine maps are necessarily 8bpp\n"); - image.isAffine = options->isAffineMap; - image.tilemap.size = fileSize; + if (options->tilemapFilePath != NULL) + { + int fileSize; + image.tilemap.data.affine = ReadWholeFile(options->tilemapFilePath, &fileSize); + if (options->isAffineMap && options->bitDepth != 8) + FATAL_ERROR("affine maps are necessarily 8bpp\n"); + image.isAffine = options->isAffineMap; + image.tilemap.size = fileSize; + } + ReadTileImage(inputPath, options->width, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette); } else { - image.tilemap.data.affine = NULL; + image.width = options->width; + ReadPlainImage(inputPath, options->dataWidth, &image, !image.hasPalette); } - ReadImage(inputPath, options->width, options->bitDepth, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette); - image.hasTransparency = options->hasTransparency; WritePng(outputPath, &image); @@ -77,7 +83,10 @@ void ConvertPngToGba(char *inputPath, char *outputPath, struct PngToGbaOptions * ReadPng(inputPath, &image); - WriteImage(outputPath, options->numTilesMode, options->numTiles, options->bitDepth, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette); + if (options->isTiled) + WriteTileImage(outputPath, options->numTilesMode, options->numTiles, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette); + else + WritePlainImage(outputPath, options->dataWidth, &image, !image.hasPalette); FreeImage(&image); } @@ -94,6 +103,8 @@ void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **a options.metatileHeight = 1; options.tilemapFilePath = NULL; options.isAffineMap = false; + options.isTiled = true; + options.dataWidth = 1; for (int i = 3; i < argc; i++) { @@ -162,6 +173,22 @@ void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **a { options.isAffineMap = true; } + else if (strcmp(option, "-plain") == 0) + { + options.isTiled = false; + } + else if (strcmp(option, "-data_width") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No data width value following \"-data_width\".\n"); + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.dataWidth)) + FATAL_ERROR("Failed to parse data width.\n"); + + if (options.dataWidth < 1) + FATAL_ERROR("Data width must be positive.\n"); + } else { FATAL_ERROR("Unrecognized option \"%s\".\n", option); @@ -177,15 +204,16 @@ void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **a void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **argv) { char *outputFileExtension = GetFileExtensionAfterDot(outputPath); - int bitDepth = outputFileExtension[0] - '0'; struct PngToGbaOptions options; options.numTilesMode = NUM_TILES_IGNORE; options.numTiles = 0; - options.bitDepth = bitDepth; + options.bitDepth = outputFileExtension[0] - '0'; options.metatileWidth = 1; options.metatileHeight = 1; options.tilemapFilePath = NULL; options.isAffineMap = false; + options.isTiled = true; + options.dataWidth = 1; for (int i = 3; i < argc; i++) { @@ -236,6 +264,22 @@ void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **a if (options.metatileHeight < 1) FATAL_ERROR("metatile height must be positive.\n"); } + else if (strcmp(option, "-plain") == 0) + { + options.isTiled = false; + } + else if (strcmp(option, "-data_width") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No data width value following \"-data_width\".\n"); + i++; + + if (!ParseNumber(argv[i], NULL, 10, &options.dataWidth)) + FATAL_ERROR("Failed to parse data width.\n"); + + if (options.dataWidth < 1) + FATAL_ERROR("Data width must be positive.\n"); + } else { FATAL_ERROR("Unrecognized option \"%s\".\n", option); @@ -403,7 +447,7 @@ void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char * else if (strcmp(option, "-search") == 0) { if (i + 1 >= argc) - FATAL_ERROR("No size following \"-overflow\".\n"); + FATAL_ERROR("No size following \"-search\".\n"); i++; diff --git a/tools/gbagfx/options.h b/tools/gbagfx/options.h index 250b723450..830158b52e 100644 --- a/tools/gbagfx/options.h +++ b/tools/gbagfx/options.h @@ -15,6 +15,8 @@ struct GbaToPngOptions { int metatileHeight; char *tilemapFilePath; bool isAffineMap; + bool isTiled; + int dataWidth; }; struct PngToGbaOptions { @@ -25,6 +27,8 @@ struct PngToGbaOptions { int metatileHeight; char *tilemapFilePath; bool isAffineMap; + bool isTiled; + int dataWidth; }; #endif // OPTIONS_H diff --git a/tools/jsonproc/jsonproc.cpp b/tools/jsonproc/jsonproc.cpp index 23056a5ff3..9ef23cd43e 100755 --- a/tools/jsonproc/jsonproc.cpp +++ b/tools/jsonproc/jsonproc.cpp @@ -105,10 +105,13 @@ int main(int argc, char *argv[]) }); env.add_callback("cleanString", 1, [](Arguments& args) { - string badChars = ".'{} \n\t-\u00e9"; string str = args.at(0)->get(); for (unsigned int i = 0; i < str.length(); i++) { - if (badChars.find(str[i]) != std::string::npos) { + // This code is not Unicode aware, so UTF-8 is not easily parsable without introducing + // another library. Just filter out any non-alphanumeric characters for now. + // TODO: proper Unicode string normalization + if ((i == 0 && isdigit(str[i])) + || !isalnum(str[i])) { str[i] = '_'; } } diff --git a/tools/preproc/Makefile b/tools/preproc/Makefile index 1507c973f2..606318944c 100644 --- a/tools/preproc/Makefile +++ b/tools/preproc/Makefile @@ -3,10 +3,10 @@ CXX ?= g++ CXXFLAGS := -std=c++11 -O2 -Wall -Wno-switch -Werror SRCS := asm_file.cpp c_file.cpp charmap.cpp preproc.cpp string_parser.cpp \ - utf8.cpp + utf8.cpp io.cpp HEADERS := asm_file.h c_file.h char_util.h charmap.h preproc.h string_parser.h \ - utf8.h + utf8.h io.h ifeq ($(OS),Windows_NT) EXE := .exe diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp index 04a7410e00..ca8b8cc4ae 100644 --- a/tools/preproc/asm_file.cpp +++ b/tools/preproc/asm_file.cpp @@ -27,33 +27,12 @@ #include "utf8.h" #include "string_parser.h" #include "../../gflib/characters.h" +#include "io.h" -AsmFile::AsmFile(std::string filename) : m_filename(filename) +AsmFile::AsmFile(std::string filename, bool isStdin, bool doEnum) : m_filename(filename) { - FILE *fp = std::fopen(filename.c_str(), "rb"); - - if (fp == NULL) - FATAL_ERROR("Failed to open \"%s\" for reading.\n", filename.c_str()); - - std::fseek(fp, 0, SEEK_END); - - m_size = std::ftell(fp); - - if (m_size < 0) - FATAL_ERROR("File size of \"%s\" is less than zero.\n", filename.c_str()); - else if (m_size == 0) - return; // Empty file - - m_buffer = new char[m_size + 1]; - - std::rewind(fp); - - if (std::fread(m_buffer, m_size, 1, fp) != 1) - FATAL_ERROR("Failed to read \"%s\".\n", filename.c_str()); - - m_buffer[m_size] = 0; - - std::fclose(fp); + m_buffer = ReadFileToBuffer(filename.c_str(), isStdin, &m_size); + m_doEnum = doEnum; m_pos = 0; m_lineNum = 1; @@ -65,6 +44,7 @@ AsmFile::AsmFile(std::string filename) : m_filename(filename) AsmFile::AsmFile(AsmFile&& other) : m_filename(std::move(other.m_filename)) { m_buffer = other.m_buffer; + m_doEnum = other.m_doEnum; m_pos = other.m_pos; m_size = other.m_size; m_lineNum = other.m_lineNum; @@ -174,6 +154,8 @@ Directive AsmFile::GetDirective() return Directive::String; else if (CheckForDirective(".braille")) return Directive::Braille; + else if (CheckForDirective("enum")) + return Directive::Enum; else return Directive::Unknown; } @@ -527,6 +509,70 @@ void AsmFile::OutputLine() } } +// parses an assumed C `enum`. Returns false if `enum { ...` is not matched +bool AsmFile::ParseEnum() +{ + if (!m_doEnum) + return false; + + long fallbackPosition = m_pos; + std::string headerFilename = ""; + long currentHeaderLine = SkipWhitespaceAndEol(); + std::string enumName = ReadIdentifier(); + currentHeaderLine += SkipWhitespaceAndEol(); + long enumCounter = 0; + long symbolCount = 0; + + if (m_buffer[m_pos] != '{') // assume assembly macro, otherwise assume enum and report errors accordingly + { + m_pos = fallbackPosition - 4; + return false; + } + + currentHeaderLine += FindLastLineNumber(headerFilename); + m_pos++; + for (;;) + { + currentHeaderLine += SkipWhitespaceAndEol(); + std::string currentIdentName = ReadIdentifier(); + if (!currentIdentName.empty()) + { + std::printf("# %ld \"%s\"\n", currentHeaderLine, headerFilename.c_str()); + currentHeaderLine += SkipWhitespaceAndEol(); + if (m_buffer[m_pos] == '=') + { + m_pos++; + currentHeaderLine += SkipWhitespaceAndEol(); + enumCounter = ReadInteger(headerFilename, currentHeaderLine); + currentHeaderLine += SkipWhitespaceAndEol(); + } + std::printf(".equiv %s, %ld\n", currentIdentName.c_str(), enumCounter); + enumCounter++; + symbolCount++; + } + else if (symbolCount == 0) + { + RaiseError("%s:%ld: empty enum is invalid", headerFilename.c_str(), currentHeaderLine); + } + + if (m_buffer[m_pos] != ',') + { + currentHeaderLine += SkipWhitespaceAndEol(); + if (m_buffer[m_pos++] == '}' && m_buffer[m_pos++] == ';') + { + ExpectEmptyRestOfLine(); + break; + } + else + { + RaiseError("unterminated enum from included file %s:%ld", headerFilename.c_str(), currentHeaderLine); + } + } + m_pos++; + } + return true; +} + // Asserts that the rest of the line is empty and moves to the next one. void AsmFile::ExpectEmptyRestOfLine() { @@ -599,3 +645,130 @@ void AsmFile::RaiseWarning(const char* format, ...) { DO_REPORT("warning"); } + +// Skips Whitespace including newlines and returns the amount of newlines skipped +int AsmFile::SkipWhitespaceAndEol() +{ + int newlines = 0; + while (m_buffer[m_pos] == '\t' || m_buffer[m_pos] == ' ' || m_buffer[m_pos] == '\n') + { + if (m_buffer[m_pos] == '\n') + newlines++; + m_pos++; + } + return newlines; +} + +// returns the last line indicator and its corresponding file name without modifying the token index +int AsmFile::FindLastLineNumber(std::string& filename) +{ + long pos = m_pos; + long linebreaks = 0; + while (m_buffer[pos] != '#' && pos >= 0) + { + if (m_buffer[pos] == '\n') + linebreaks++; + pos--; + } + + if (pos < 0) + RaiseError("line indicator for header file not found before `enum`"); + + pos++; + while (m_buffer[pos] == ' ' || m_buffer[pos] == '\t') + pos++; + + if (!IsAsciiDigit(m_buffer[pos])) + RaiseError("malformatted line indicator found before `enum`, expected line number"); + + unsigned n = 0; + int digit = 0; + while ((digit = ConvertDigit(m_buffer[pos++], 10)) != -1) + n = 10 * n + digit; + + while (m_buffer[pos] == ' ' || m_buffer[pos] == '\t') + pos++; + + if (m_buffer[pos++] != '"') + RaiseError("malformatted line indicator found before `enum`, expected filename"); + + while (m_buffer[pos] != '"') + { + unsigned char c = m_buffer[pos++]; + + if (c == 0) + { + if (pos >= m_size) + RaiseError("unexpected EOF in line indicator"); + else + RaiseError("unexpected null character in line indicator"); + } + + if (!IsAsciiPrintable(c)) + RaiseError("unexpected character '\\x%02X' in line indicator", c); + + if (c == '\\') + { + c = m_buffer[pos]; + RaiseError("unexpected escape '\\%c' in line indicator", c); + } + + filename += c; + } + + return n + linebreaks - 1; +} + +std::string AsmFile::ReadIdentifier() +{ + long start = m_pos; + if (!IsIdentifierStartingChar(m_buffer[m_pos])) + return std::string(); + + m_pos++; + + while (IsIdentifierChar(m_buffer[m_pos])) + m_pos++; + + return std::string(&m_buffer[start], m_pos - start); +} + +long AsmFile::ReadInteger(std::string filename, long line) +{ + bool negate = false; + int radix = 10; + if (!IsAsciiDigit(m_buffer[m_pos])) + { + if (m_buffer[m_pos++] == '-') + negate = true; + else + RaiseError("expected number in included file %s:%ld", filename.c_str(), line); + } + + if (m_buffer[m_pos] == '0' && m_buffer[m_pos + 1] == 'x') + { + radix = 16; + m_pos += 2; + } + else if (m_buffer[m_pos] == '0' && m_buffer[m_pos + 1] == 'b') + { + radix = 2; + m_pos += 2; + } + else if (m_buffer[m_pos] == '0' && IsAsciiDigit(m_buffer[m_pos+1])) + { + radix = 8; + m_pos++; + } + + long n = 0; + int digit; + + while ((digit = ConvertDigit(m_buffer[m_pos], radix)) != -1) + { + n = n * radix + digit; + m_pos++; + } + + return negate ? -n : n; +} diff --git a/tools/preproc/asm_file.h b/tools/preproc/asm_file.h index 29435f76a4..33e6ce5c49 100644 --- a/tools/preproc/asm_file.h +++ b/tools/preproc/asm_file.h @@ -31,13 +31,14 @@ enum class Directive Include, String, Braille, + Enum, Unknown }; class AsmFile { public: - AsmFile(std::string filename); + AsmFile(std::string filename, bool isStdin, bool doEnum); AsmFile(AsmFile&& other); AsmFile(const AsmFile&) = delete; ~AsmFile(); @@ -49,9 +50,11 @@ public: bool IsAtEnd(); void OutputLine(); void OutputLocation(); + bool ParseEnum(); private: char* m_buffer; + bool m_doEnum; long m_pos; long m_size; long m_lineNum; @@ -68,6 +71,10 @@ private: void RaiseError(const char* format, ...); void RaiseWarning(const char* format, ...); void VerifyStringLength(int length); + int SkipWhitespaceAndEol(); + int FindLastLineNumber(std::string& filename); + std::string ReadIdentifier(); + long ReadInteger(std::string filename, long line); }; #endif // ASM_FILE_H diff --git a/tools/preproc/c_file.cpp b/tools/preproc/c_file.cpp index 17a08cc9f7..191ca4c152 100644 --- a/tools/preproc/c_file.cpp +++ b/tools/preproc/c_file.cpp @@ -30,56 +30,16 @@ #include "char_util.h" #include "utf8.h" #include "string_parser.h" +#include "io.h" CFile::CFile(const char * filenameCStr, bool isStdin) { - FILE *fp; - - if (isStdin) { - fp = stdin; + if (isStdin) m_filename = std::string{"/"}.append(filenameCStr); - } else { - fp = std::fopen(filenameCStr, "rb"); + else m_filename = std::string(filenameCStr); - } - std::string& filename = m_filename; - - if (fp == NULL) - FATAL_ERROR("Failed to open \"%s\" for reading.\n", filename.c_str()); - - m_size = 0; - m_buffer = (char *)malloc(CHUNK_SIZE + 1); - if (m_buffer == NULL) { - FATAL_ERROR("Failed to allocate memory to process file \"%s\"!", filename.c_str()); - } - - std::size_t numAllocatedBytes = CHUNK_SIZE + 1; - std::size_t bufferOffset = 0; - std::size_t count; - - while ((count = std::fread(m_buffer + bufferOffset, 1, CHUNK_SIZE, fp)) != 0) { - if (!std::ferror(fp)) { - m_size += count; - - if (std::feof(fp)) { - break; - } - - numAllocatedBytes += CHUNK_SIZE; - bufferOffset += CHUNK_SIZE; - m_buffer = (char *)realloc(m_buffer, numAllocatedBytes); - if (m_buffer == NULL) { - FATAL_ERROR("Failed to allocate memory to process file \"%s\"!", filename.c_str()); - } - } else { - FATAL_ERROR("Failed to read \"%s\". (error: %s)", filename.c_str(), std::strerror(errno)); - } - } - - m_buffer[m_size] = 0; - - std::fclose(fp); + m_buffer = ReadFileToBuffer(filenameCStr, isStdin, &m_size); m_pos = 0; m_lineNum = 1; @@ -383,7 +343,7 @@ void CFile::TryConvertIncbin() if (m_buffer[m_pos] == '\\') RaiseError("unexpected escape in path string"); - + m_pos++; } @@ -418,7 +378,7 @@ void CFile::TryConvertIncbin() m_pos++; } - + if (m_buffer[m_pos] != ')') RaiseError("expected ')'"); diff --git a/tools/preproc/c_file.h b/tools/preproc/c_file.h index 49e633a18d..c40c33c962 100644 --- a/tools/preproc/c_file.h +++ b/tools/preproc/c_file.h @@ -56,6 +56,4 @@ private: void RaiseWarning(const char* format, ...); }; -#define CHUNK_SIZE 4096 - #endif // C_FILE_H diff --git a/tools/preproc/charmap.cpp b/tools/preproc/charmap.cpp index a7bedfe26f..a0c631026c 100644 --- a/tools/preproc/charmap.cpp +++ b/tools/preproc/charmap.cpp @@ -119,7 +119,7 @@ Lhs CharmapReader::ReadLhs() break; } } - + if (m_buffer[m_pos] == '\'') { m_pos++; diff --git a/tools/preproc/io.cpp b/tools/preproc/io.cpp new file mode 100644 index 0000000000..321676180d --- /dev/null +++ b/tools/preproc/io.cpp @@ -0,0 +1,51 @@ +#include "preproc.h" +#include "io.h" +#include +#include +#include + +char *ReadFileToBuffer(const char *filename, bool isStdin, long *size) +{ + FILE *fp; + if (isStdin) + fp = stdin; + else + fp = std::fopen(filename, "rb"); + + if (fp == NULL) + FATAL_ERROR("Failed to open \"%s\" for reading.\n", filename); + + *size = 0; + char *buffer = (char *)malloc(CHUNK_SIZE + 1); + if (buffer == NULL) { + FATAL_ERROR("Failed to allocate memory to process file \"%s\"!", filename); + } + + std::size_t numAllocatedBytes = CHUNK_SIZE + 1; + std::size_t bufferOffset = 0; + std::size_t count; + + while ((count = std::fread(buffer + bufferOffset, 1, CHUNK_SIZE, fp)) != 0) { + if (!std::ferror(fp)) { + *size += count; + + if (std::feof(fp)) { + break; + } + + numAllocatedBytes += CHUNK_SIZE; + bufferOffset += CHUNK_SIZE; + buffer = (char *)realloc(buffer, numAllocatedBytes); + if (buffer == NULL) { + FATAL_ERROR("Failed to allocate memory to process file \"%s\"!", filename); + } + } else { + FATAL_ERROR("Failed to read \"%s\". (error: %s)", filename, std::strerror(errno)); + } + } + + buffer[*size] = 0; + + std::fclose(fp); + return buffer; +} diff --git a/tools/preproc/io.h b/tools/preproc/io.h new file mode 100644 index 0000000000..ac4e91051f --- /dev/null +++ b/tools/preproc/io.h @@ -0,0 +1,8 @@ +#ifndef IO_H_ +#define IO_H_ + +#define CHUNK_SIZE 4096 + +char *ReadFileToBuffer(const char *filename, bool isStdin, long *size); + +#endif // IO_H_ diff --git a/tools/preproc/preproc.cpp b/tools/preproc/preproc.cpp index eb2d4c8a23..20c2de51b6 100644 --- a/tools/preproc/preproc.cpp +++ b/tools/preproc/preproc.cpp @@ -20,11 +20,14 @@ #include #include +#include #include "preproc.h" #include "asm_file.h" #include "c_file.h" #include "charmap.h" +static void UsageAndExit(const char *program); + Charmap* g_charmap; void PrintAsmBytes(unsigned char *s, int length) @@ -43,11 +46,12 @@ void PrintAsmBytes(unsigned char *s, int length) } } -void PreprocAsmFile(std::string filename) +void PreprocAsmFile(std::string filename, bool isStdin, bool doEnum) { std::stack stack; - stack.push(AsmFile(filename)); + stack.push(AsmFile(filename, isStdin, doEnum)); + std::printf("# 1 \"%s\"\n", filename.c_str()); for (;;) { @@ -66,7 +70,7 @@ void PreprocAsmFile(std::string filename) switch (directive) { case Directive::Include: - stack.push(AsmFile(stack.top().ReadPath())); + stack.push(AsmFile(stack.top().ReadPath(), false, doEnum)); stack.top().OutputLocation(); break; case Directive::String: @@ -83,6 +87,12 @@ void PreprocAsmFile(std::string filename) PrintAsmBytes(s, length); break; } + case Directive::Enum: + { + if (!stack.top().ParseEnum()) + stack.top().OutputLine(); + break; + } case Directive::Unknown: { std::string globalLabel = stack.top().GetGlobalLabel(); @@ -109,9 +119,9 @@ void PreprocCFile(const char * filename, bool isStdin) cFile.Preproc(); } -char* GetFileExtension(char* filename) +const char* GetFileExtension(const char* filename) { - char* extension = filename; + const char* extension = filename; while (*extension != 0) extension++; @@ -130,35 +140,64 @@ char* GetFileExtension(char* filename) return extension; } +static void UsageAndExit(const char *program) +{ + std::fprintf(stderr, "Usage: %s [-i] [-e] SRC_FILE CHARMAP_FILE\nwhere -i denotes if input is from stdin\n -e enables enum handling\n", program); + std::exit(EXIT_FAILURE); +} + int main(int argc, char **argv) { - if (argc < 3 || argc > 4) + int opt; + const char *source = NULL; + const char *charmap = NULL; + bool isStdin = false; + bool doEnum = false; + + /* preproc [-i] [-e] SRC_FILE CHARMAP_FILE */ + while ((opt = getopt(argc, argv, "ie")) != -1) { - std::fprintf(stderr, "Usage: %s SRC_FILE CHARMAP_FILE [-i]\nwhere -i denotes if input is from stdin\n", argv[0]); - return 1; + switch (opt) + { + case 'i': + isStdin = true; + break; + case 'e': + doEnum = true; + break; + default: + UsageAndExit(argv[0]); + break; + } } - g_charmap = new Charmap(argv[2]); + if (optind + 2 != argc) + UsageAndExit(argv[0]); - char* extension = GetFileExtension(argv[1]); + source = argv[optind + 0]; + charmap = argv[optind + 1]; + + g_charmap = new Charmap(charmap); + + const char* extension = GetFileExtension(source); if (!extension) FATAL_ERROR("\"%s\" has no file extension.\n", argv[1]); if ((extension[0] == 's') && extension[1] == 0) - PreprocAsmFile(argv[1]); - else if ((extension[0] == 'c' || extension[0] == 'i') && extension[1] == 0) { - if (argc == 4) { - if (argv[3][0] == '-' && argv[3][1] == 'i' && argv[3][2] == '\0') { - PreprocCFile(argv[1], true); - } else { - FATAL_ERROR("unknown argument flag \"%s\".\n", argv[3]); - } - } else { - PreprocCFile(argv[1], false); - } - } else + { + PreprocAsmFile(source, isStdin, doEnum); + } + else if ((extension[0] == 'c' || extension[0] == 'i') && extension[1] == 0) + { + if (doEnum) + FATAL_ERROR("-e is invalid for C sources\n"); + PreprocCFile(source, isStdin); + } + else + { FATAL_ERROR("\"%s\" has an unknown file extension of \"%s\".\n", argv[1], extension); + } return 0; } diff --git a/tools/scaninc/source_file.cpp b/tools/scaninc/source_file.cpp index df31282f80..9d188eb738 100644 --- a/tools/scaninc/source_file.cpp +++ b/tools/scaninc/source_file.cpp @@ -41,7 +41,7 @@ SourceFileType GetFileType(std::string& path) return SourceFileType::Inc; else FATAL_ERROR("Unrecognized extension \"%s\"\n", extension.c_str()); - + // Unreachable return SourceFileType::Cpp; } @@ -84,7 +84,7 @@ SourceFile::SourceFile(std::string path) else incbins.insert(outputPath); } - + new (&m_source_file.asm_wrapper) SourceFile::InnerUnion::AsmWrapper{incbins, includes}; } }