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};
}
}