summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile33
-rw-r--r--asm/macros/event.inc4
-rw-r--r--berry_fix/Makefile166
-rw-r--r--berry_fix/asm/berry_fix_header.inc35
-rw-r--r--berry_fix/asm/loader.s119
-rw-r--r--berry_fix/charmap.txt1067
-rw-r--r--berry_fix/data/data.s4
-rw-r--r--berry_fix/ld_script.sed14
-rw-r--r--berry_fix/ld_script.txt31
-rw-r--r--berry_fix/payload/Makefile172
-rw-r--r--berry_fix/payload/asm/crt0.s82
-rw-r--r--berry_fix/payload/asm/libagbsyscall.s46
-rw-r--r--berry_fix/payload/asm/macros/function.inc29
-rw-r--r--berry_fix/payload/charmap.txt1067
-rw-r--r--berry_fix/payload/common_syms/agb_flash.txt10
-rw-r--r--berry_fix/payload/common_syms/main.txt9
-rw-r--r--berry_fix/payload/common_syms/rtc.txt2
-rw-r--r--berry_fix/payload/constants/gba_constants.inc490
-rw-r--r--berry_fix/payload/graphics/debug_digits.pngbin0 -> 166 bytes
-rw-r--r--berry_fix/payload/graphics/msg_box.pngbin0 -> 2631 bytes
-rw-r--r--berry_fix/payload/graphics/msg_box.tilemapbin0 -> 8192 bytes
-rw-r--r--berry_fix/payload/include/constants/game_stat.h56
-rw-r--r--berry_fix/payload/include/constants/vars.h196
-rw-r--r--berry_fix/payload/include/flash.h55
-rw-r--r--berry_fix/payload/include/gba/defines.h87
-rw-r--r--berry_fix/payload/include/gba/flash_internal.h85
-rw-r--r--berry_fix/payload/include/gba/gba.h12
-rw-r--r--berry_fix/payload/include/gba/io_reg.h770
-rw-r--r--berry_fix/payload/include/gba/isagbprint.h50
-rw-r--r--berry_fix/payload/include/gba/m4a_internal.h467
-rw-r--r--berry_fix/payload/include/gba/macro.h247
-rw-r--r--berry_fix/payload/include/gba/multiboot.h55
-rw-r--r--berry_fix/payload/include/gba/syscall.h57
-rw-r--r--berry_fix/payload/include/gba/types.h146
-rw-r--r--berry_fix/payload/include/global.berry.h62
-rw-r--r--berry_fix/payload/include/global.fieldmap.h317
-rw-r--r--berry_fix/payload/include/global.h875
-rw-r--r--berry_fix/payload/include/main.h45
-rw-r--r--berry_fix/payload/include/pokemon.h154
-rw-r--r--berry_fix/payload/include/rtc.h15
-rw-r--r--berry_fix/payload/include/siirtc.h54
-rw-r--r--berry_fix/payload/ld_script.sed14
-rw-r--r--berry_fix/payload/ld_script.txt107
-rw-r--r--berry_fix/payload/rom.sha11
-rw-r--r--berry_fix/payload/src/agb_flash.c296
-rw-r--r--berry_fix/payload/src/agb_flash_1m.c86
-rw-r--r--berry_fix/payload/src/agb_flash_le.c31
-rw-r--r--berry_fix/payload/src/agb_flash_mx.c193
-rw-r--r--berry_fix/payload/src/flash.c752
-rw-r--r--berry_fix/payload/src/main.c289
-rw-r--r--berry_fix/payload/src/rtc.c346
-rw-r--r--berry_fix/payload/src/siirtc.c432
-rw-r--r--berry_fix/payload/sym_bss.txt5
-rw-r--r--berry_fix/payload/sym_common.txt29
-rw-r--r--berry_fix/payload/sym_ewram.txt3
-rw-r--r--berry_fix/rom.sha11
-rw-r--r--data/berry_fix.mbbin15348 -> 0 bytes
-rw-r--r--data/event_scripts.s138
-rw-r--r--data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc126
-rw-r--r--data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc2
-rw-r--r--data/maps/DewfordTown/scripts.inc2
-rw-r--r--data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc4
-rw-r--r--data/maps/FarawayIsland_Interior/scripts.inc2
-rw-r--r--data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc1
-rw-r--r--data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc2
-rw-r--r--data/maps/LinkContestRoom1/scripts.inc222
-rw-r--r--data/maps/MauvilleCity_GameCorner/scripts.inc2
-rw-r--r--data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc2
-rw-r--r--data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc6
-rw-r--r--data/maps/MtChimney/scripts.inc1
-rw-r--r--data/maps/Route104/scripts.inc6
-rw-r--r--data/maps/Route104_PrettyPetalFlowerShop/scripts.inc2
-rw-r--r--data/maps/Route109/scripts.inc2
-rw-r--r--data/maps/Route109_SeashoreHouse/scripts.inc1
-rw-r--r--data/maps/Route119_WeatherInstitute_2F/scripts.inc2
-rw-r--r--data/maps/Route121_SafariZoneEntrance/scripts.inc1
-rw-r--r--data/maps/RustboroCity/scripts.inc2
-rw-r--r--data/maps/RusturfTunnel/scripts.inc4
-rw-r--r--data/maps/SeafloorCavern_Entrance/scripts.inc2
-rw-r--r--data/maps/SlateportCity_Harbor/scripts.inc2
-rw-r--r--data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc1
-rw-r--r--data/maps/SootopolisCity/scripts.inc4
-rw-r--r--data/maps/SootopolisCity_Gym_1F/scripts.inc4
-rw-r--r--data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc2
-rw-r--r--data/maps/UnknownLinkContestRoom_25_29/map.json2
-rw-r--r--data/maps/UnknownLinkContestRoom_25_30/map.json2
-rw-r--r--data/maps/UnknownLinkContestRoom_25_31/map.json2
-rw-r--r--data/maps/UnknownLinkContestRoom_25_32/map.json2
-rw-r--r--data/maps/UnknownLinkContestRoom_25_33/map.json2
-rw-r--r--data/maps/UnknownLinkContestRoom_25_34/map.json2
-rw-r--r--data/maps/VictoryRoad_1F/scripts.inc2
-rw-r--r--data/multiboot_berry_glitch_fix.s2
-rw-r--r--data/script_cmd_table.inc2
-rw-r--r--data/scripts/apprentice.inc152
-rw-r--r--data/specials.inc80
-rw-r--r--data/text/match_call.inc338
-rw-r--r--include/constants/contest.h19
-rw-r--r--include/constants/global.h12
-rw-r--r--include/constants/lilycove_lady.h26
-rwxr-xr-xinclude/constants/map_groups.h122
-rw-r--r--include/contest.h19
-rw-r--r--include/credits.h2
-rw-r--r--include/gba/types.h4
-rw-r--r--include/global.fieldmap.h13
-rw-r--r--include/global.h67
-rw-r--r--include/item_menu.h4
-rw-r--r--include/lilycove_lady.h18
-rw-r--r--include/pokedex.h3
-rw-r--r--include/pokemon.h2
-rw-r--r--include/pokenav.h32
-rw-r--r--include/strings.h25
-rw-r--r--ld_script.txt8
-rw-r--r--ld_script_modern.txt9
-rw-r--r--src/battle_anim_effects_1.c14
-rwxr-xr-xsrc/battle_anim_effects_2.c4
-rwxr-xr-xsrc/battle_anim_effects_3.c8
-rw-r--r--src/battle_controllers.c2
-rw-r--r--src/battle_factory.c4
-rw-r--r--src/battle_interface.c2
-rw-r--r--src/battle_main.c6
-rw-r--r--src/battle_setup.c163
-rw-r--r--src/battle_tower.c2
-rw-r--r--src/contest_painting.c2
-rw-r--r--src/credits.c475
-rw-r--r--src/crt0.s (renamed from asm/crt0.s)0
-rwxr-xr-xsrc/data/field_event_obj/event_object_graphics_info_pointers.h478
-rw-r--r--src/data/lilycove_lady.h470
-rw-r--r--src/daycare.c4
-rw-r--r--src/diploma.c2
-rw-r--r--src/easy_chat.c30
-rw-r--r--src/egg_hatch.c2
-rw-r--r--src/electric.c4
-rw-r--r--src/field_specials.c2
-rw-r--r--src/fight.c4
-rw-r--r--src/flying.c2
-rw-r--r--src/frontier_util.c2
-rw-r--r--src/ghost.c2
-rw-r--r--src/hall_of_fame.c2
-rwxr-xr-xsrc/item_menu.c24
-rw-r--r--src/libagbsyscall.s (renamed from asm/libagbsyscall.s)0
-rw-r--r--src/libgcnmultiboot.s (renamed from asm/libgcnmultiboot.s)0
-rw-r--r--src/lilycove_lady.c947
-rw-r--r--src/m4a_1.s (renamed from asm/m4a_1.s)0
-rw-r--r--src/new_game.c2
-rwxr-xr-xsrc/party_menu.c2
-rw-r--r--src/pokedex.c54
-rw-r--r--src/pokemon.c14
-rw-r--r--src/pokemon_storage_system.c3
-rw-r--r--src/pokenav_match_call_data.c116
-rwxr-xr-xsrc/pokenav_unk_3.c14
-rw-r--r--src/record_mixing.c4
-rw-r--r--src/roamer.c2
-rw-r--r--src/rock.c2
-rw-r--r--src/scrcmd.c27
-rw-r--r--src/script_menu.c10
-rwxr-xr-xsrc/script_pokemon_util_80F87D8.c4
-rw-r--r--src/strings.c44
-rw-r--r--src/trade.c4
-rw-r--r--src/tv.c10
-rw-r--r--sym_bss.txt2
-rw-r--r--tools/gbagfx/Makefile9
-rw-r--r--tools/gbagfx/huff.c398
-rw-r--r--tools/gbagfx/huff.h38
-rw-r--r--tools/gbagfx/lz.c4
-rw-r--r--tools/gbagfx/lz.h2
-rw-r--r--tools/gbagfx/main.c74
-rw-r--r--tools/preproc/asm_file.cpp6
-rw-r--r--tools/ramscrgen/elf.cpp101
-rw-r--r--tools/ramscrgen/elf.h2
-rw-r--r--tools/ramscrgen/main.cpp24
-rw-r--r--tools/scaninc/scaninc.cpp19
-rw-r--r--tools/scaninc/source_file.cpp5
-rw-r--r--tools/scaninc/source_file.h1
173 files changed, 12843 insertions, 2099 deletions
diff --git a/Makefile b/Makefile
index 5a8af32a9..e38869ca6 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,5 @@
TOOLCHAIN := $(DEVKITARM)
+COMPARE ?= 0
ifeq ($(CC),)
HOSTCC := gcc
@@ -108,7 +109,7 @@ MAKEFLAGS += --no-print-directory
# Secondary expansion is required for dependency variables in object rules.
.SECONDEXPANSION:
-.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS)
+.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS) berry_fix
infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line))))
@@ -123,6 +124,9 @@ endif
C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c)
C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))
+C_ASM_SRCS += $(wildcard $(C_SUBDIR)/*.s $(C_SUBDIR)/*/*.s $(C_SUBDIR)/*/*/*.s)
+C_ASM_OBJS := $(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o,$(C_ASM_SRCS))
+
ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)
ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS))
@@ -135,7 +139,7 @@ SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS))
MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid)
MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS))
-OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
+OBJS := $(C_OBJS) $(C_ASM_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))
SUBDIRS := $(sort $(dir $(OBJS)))
@@ -151,11 +155,13 @@ tools: $(TOOLDIRS)
$(TOOLDIRS):
@$(MAKE) -C $@ CC=$(HOSTCC) CXX=$(HOSTCXX)
-rom: $(ROM)
+rom: berry_fix $(ROM)
+ifeq ($(COMPARE),1)
+ @$(SHA1) rom.sha1
+endif
# For contributors to make sure a change didn't affect the contents of the ROM.
-compare: all
- @$(SHA1) rom.sha1
+compare: ; @$(MAKE) COMPARE=1
clean: mostlyclean clean-tools
@@ -170,6 +176,7 @@ mostlyclean: tidy
rm -f $(DATA_ASM_SUBDIR)/maps/connections.inc $(DATA_ASM_SUBDIR)/maps/events.inc $(DATA_ASM_SUBDIR)/maps/groups.inc $(DATA_ASM_SUBDIR)/maps/headers.inc
find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} +
rm -f $(AUTO_GEN_TARGETS)
+ @$(MAKE) clean -C berry_fix
tidy:
rm -f $(ROM) $(ELF) $(MAP)
@@ -222,7 +229,7 @@ endif
ifeq ($(NODEP),1)
$(C_BUILDDIR)/%.o: c_dep :=
else
-$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c)
+$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include -I tools/agbcc/include $(C_SUBDIR)/$*.c)
endif
ifeq ($(DINFO),1)
@@ -236,6 +243,15 @@ $(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
$(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s
ifeq ($(NODEP),1)
+$(C_BUILDDIR)/%.o: c_asm_dep :=
+else
+$(C_BUILDDIR)/%.o: c_asm_dep = $(shell $(SCANINC) -I "" $(C_SUBDIR)/$*.s)
+endif
+
+$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s $$(c_asm_dep)
+ $(AS) $(ASFLAGS) -o $@ $<
+
+ifeq ($(NODEP),1)
$(ASM_BUILDDIR)/%.o: asm_dep :=
else
$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) -I "" $(ASM_SUBDIR)/$*.s)
@@ -285,3 +301,8 @@ $(ROM): $(ELF)
$(FIX) $@ -p --silent
modern: ; @$(MAKE) MODERN=1
+
+berry_fix/berry_fix.gba: berry_fix
+
+berry_fix:
+ @$(MAKE) -C berry_fix COMPARE=$(COMPARE)
diff --git a/asm/macros/event.inc b/asm/macros/event.inc
index e00bdb600..bf1b8ce76 100644
--- a/asm/macros/event.inc
+++ b/asm/macros/event.inc
@@ -765,7 +765,8 @@
.2byte \y
.endm
- .macro moveobjectoffscreen index:req
+ @ Copies a live event object's xy position to its template, so that if the sprite goes off screen, it'll still be there when it comes back on screen.
+ .macro copyobjectxytoperm index:req
.byte 0x64
.2byte \index
.endm
@@ -1089,6 +1090,7 @@
.byte 0x95
.byte \x
.byte \y
+ .byte 0 @ 1 = don't perform this command. Always 0 in vanilla. Why this is a thing is beyond me.
.endm
@ Gets the price reduction for the index given. In FireRed, this command is a nop.
diff --git a/berry_fix/Makefile b/berry_fix/Makefile
new file mode 100644
index 000000000..2bc225eba
--- /dev/null
+++ b/berry_fix/Makefile
@@ -0,0 +1,166 @@
+include $(DEVKITARM)/base_tools
+export CPP := $(PREFIX)cpp
+export LD := $(PREFIX)ld
+COMPARE ?= 0
+
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
+GAME_CODE := AGBJ
+MAKER_CODE := 01
+REVISION := 0
+
+SHELL := /bin/bash -o pipefail
+
+CPPFLAGS := -I ../tools/agbcc/include -I ../tools/agbcc -iquote include -nostdinc -undef
+
+ROM := berry_fix.gba
+OBJ_DIR := build
+CC1 := ../tools/agbcc/bin/agbcc$(EXE)
+override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm
+
+
+ELF = $(ROM:.gba=.elf)
+MAP = $(ROM:.gba=.map)
+
+C_SUBDIR = src
+ASM_SUBDIR = asm
+DATA_ASM_SUBDIR = data
+
+C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR)
+ASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR)
+DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR)
+
+ASFLAGS := -mcpu=arm7tdmi
+
+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)
+MID := ../tools/mid2agb/mid2agb$(EXE)
+SCANINC := ../tools/scaninc/scaninc$(EXE)
+PREPROC := ../tools/preproc/preproc$(EXE)
+RAMSCRGEN := ../tools/ramscrgen/ramscrgen$(EXE)
+FIX := ../tools/gbafix/gbafix$(EXE)
+
+# Clear the default suffixes
+.SUFFIXES:
+# Don't delete intermediate files
+.SECONDARY:
+# Delete files that weren't built properly
+.DELETE_ON_ERROR:
+
+# Secondary expansion is required for dependency variables in object rules.
+.SECONDEXPANSION:
+
+.PHONY: all rom clean compare tidy payload
+
+C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c)
+C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))
+
+ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)
+ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS))
+
+DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s)
+DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS))
+
+SONG_SRCS := $(wildcard $(SONG_SUBDIR)/*.s)
+SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS))
+
+MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid)
+MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS))
+
+OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
+# OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))
+
+SUBDIRS := $(sort $(dir $(OBJS)))
+
+$(shell mkdir -p $(SUBDIRS))
+
+all: payload rom
+ @:
+
+rom: $(ROM)
+ifeq ($(COMPARE),1)
+ @$(SHA1) rom.sha1
+endif
+
+# For contributors to make sure a change didn't affect the contents of the ROM.
+compare: ; @$(MAKE) COMPARE=1
+
+clean: tidy
+ rm -f sound/direct_sound_samples/*.bin
+ rm -f $(SONG_OBJS) $(MID_OBJS) $(MID_SUBDIR)/*.s
+ find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} +
+ make -C payload clean
+
+tidy:
+ rm -f $(ROM) $(ELF) $(MAP)
+ rm -r build/*
+ make -C payload tidy
+
+%.s: ;
+%.png: ;
+%.pal: ;
+%.aif: ;
+
+%.1bpp: %.png ; $(GFX) $< $@
+%.4bpp: %.png ; $(GFX) $< $@
+%.8bpp: %.png ; $(GFX) $< $@
+%.gbapal: %.pal ; $(GFX) $< $@
+%.gbapal: %.png ; $(GFX) $< $@
+%.lz: % ; $(GFX) $< $@
+%.rl: % ; $(GFX) $< $@
+
+
+ifeq ($(NODEP),1)
+$(C_BUILDDIR)/%.o: c_dep :=
+else
+$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c)
+endif
+
+$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
+ @$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i
+ @$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s
+ $(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s
+
+ifeq ($(NODEP),1)
+$(ASM_BUILDDIR)/%.o: asm_dep :=
+else
+$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) $(ASM_SUBDIR)/$*.s)
+endif
+
+$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep)
+ $(AS) $(ASFLAGS) -o $@ $<
+
+ifeq ($(NODEP),1)
+$(DATA_ASM_BUILDDIR)/%.o: data_dep :=
+else
+$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s)
+endif
+
+payload:
+ @$(MAKE) -C payload COMPARE=$(COMPARE)
+
+payload/payload.gba: payload
+
+data/payload.gba.lz: payload/payload.gba
+ $(GFX) $< $@ -search 1
+
+$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep)
+ $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
+
+$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s
+ $(AS) $(ASFLAGS) -I sound -o $@ $<
+
+$(ELF): ld_script.txt $(OBJS)
+ cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../ld_script.txt -o ../$@
+
+$(ROM): $(ELF)
+ $(OBJCOPY) -O binary $< $@
+ $(FIX) $@ -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent
+
diff --git a/berry_fix/asm/berry_fix_header.inc b/berry_fix/asm/berry_fix_header.inc
new file mode 100644
index 000000000..5167d2ff0
--- /dev/null
+++ b/berry_fix/asm/berry_fix_header.inc
@@ -0,0 +1,35 @@
+ .global BerryFixMBHeaderNintendoLogo
+BerryFixMBHeaderNintendoLogo:
+ .space 156
+
+BerryFixMBHeaderGameTitle:
+ .space 12
+
+ .global BerryFixMBHeaderGameCode
+BerryFixMBHeaderGameCode:
+ .space 4
+
+BerryFixMBHeaderMakerCode:
+ .space 2
+
+BerryFixMBHeaderMagic:
+ .byte 0
+
+BerryFixMBHeaderMainUnitCode:
+ .byte 0
+
+BerryFixMBHeaderDeviceType:
+ .byte 0
+
+BerryFixMBHeaderReserved1:
+ .space 7
+
+ .global BerryFixMBHeaderSoftwareVersion
+BerryFixMBHeaderSoftwareVersion:
+ .byte 0
+
+BerryFixMBHeaderChecksum:
+ .byte 0
+
+BerryFixMBHeaderReserved2:
+ .space 2
diff --git a/berry_fix/asm/loader.s b/berry_fix/asm/loader.s
new file mode 100644
index 000000000..39e0b768a
--- /dev/null
+++ b/berry_fix/asm/loader.s
@@ -0,0 +1,119 @@
+ .include "../asm/macros/asm.inc"
+ .include "../asm/macros/function.inc"
+ .include "../constants/gba_constants.inc"
+
+ .set SIO_ERROR, 0x0040
+ .set SIO_MULTI_BUSY, 0x0080
+
+ .set EWRAM_ORIG, 0x02000000
+ .set gCode, 0x02010000
+ .set PROG_ORIG, 0x00008000
+
+ .syntax unified
+
+ .text
+
+ arm_func_start _start
+_start: @ 0
+ b _entry
+ arm_func_end _start
+
+ .include "asm/berry_fix_header.inc"
+
+@ C0
+ .word 0
+
+ .global _GPIOPortData
+_GPIOPortData: @ C4
+ .2byte 0
+
+ .global _GPIOPortDirection
+_GPIOPortDirection: @ C6
+ .2byte 0
+
+ .global _GPIOPortReadEnable
+_GPIOPortReadEnable: @ C8
+ .2byte 0
+
+@ CA
+ .2byte 0
+
+@ CC
+ .space 0x34
+
+ arm_func_start _entry
+_entry: @ 100
+ b _send
+ arm_func_end _entry
+
+ .space 0x1C
+
+ arm_func_start _recv
+_recv:
+ @ Waits until link cable is no longer busy.
+ @ Returns nz if an error has occurred
+ @ Otherwise, returns the received short in r1.
+ @ Preserves r0
+_120:
+ ldrh r1, [r0, 0x8] @ SIOCNT
+ tst r1, SIO_MULTI_BUSY
+ beq _120
+_12c:
+ ldrh r1, [r0, 0x8] @ SIOCNT
+ tst r1, SIO_MULTI_BUSY
+ bne _12c
+ ldrh r1, [r0, 0x8] @ SIOCNT
+ tst r1, SIO_ERROR
+ bxne lr
+ ldrh r1, [r0] @ SIOMULTI0
+ bx lr
+ arm_func_end _recv
+
+ arm_func_start _send
+_send: @ 14c
+ ldr r0, =REG_SIOMULTI0
+_150:
+ bl _recv
+ bne _150
+ mov r2, 0
+ strh r2, [r0, 0xa] @ SIOMLT_SEND
+ cmp r1, 0
+ bne _150
+ mov r2, 0x8000
+_16c:
+ mov r1, 0
+_170:
+ strh r1, [r0, 0xa] @ SIOMLT_SEND
+ bl _recv
+ bne _150
+ cmp r1, r2
+ bne _16c
+ lsr r2, 5
+ cmp r1, 0
+ bne _170
+ ldr r3, =BerryFixMBHeaderGameCode
+ ldrh r2, [r3]
+ strh r2, [r0, 0xa] @ SIOMLT_SEND
+ bl _recv
+_1a0:
+ bne _1a0
+ cmp r1, r2
+ bne _1a0
+ ldrh r2, [r3, 0x2]
+ strh r2, [r0, 0xa] @ SIOMLT_SEND
+ bl _recv
+ bne _1a0
+ cmp r1, r2
+ bne _1a0
+ mov r1, 0
+ strh r1, [r0, 0xa] @ SIOMLT_SEND
+ ldr r0, =_data_2f0
+ ldr r1, =gCode
+ swi 0x11 << 16
+ ldr lr, =gCode
+ bx lr
+ .pool
+ arm_func_end _send
+ @ 1f0
+
+ .align 2, 0 @ don't pad with nop
diff --git a/berry_fix/charmap.txt b/berry_fix/charmap.txt
new file mode 100644
index 000000000..a736b40f2
--- /dev/null
+++ b/berry_fix/charmap.txt
@@ -0,0 +1,1067 @@
+' ' = 00
+'À' = 01
+'Á' = 02
+'Â' = 03
+'Ç' = 04
+'È' = 05
+'É' = 06
+'Ê' = 07
+'Ë' = 08
+'Ì' = 09
+'Î' = 0B
+'Ï' = 0C
+'Ò' = 0D
+'Ó' = 0E
+'Ô' = 0F
+'Œ' = 10
+'Ù' = 11
+'Ú' = 12
+'Û' = 13
+'Ñ' = 14
+'ß' = 15
+'à' = 16
+'á' = 17
+'ç' = 19
+'è' = 1A
+'é' = 1B
+'ê' = 1C
+'ë' = 1D
+'ì' = 1E
+'î' = 20
+'ï' = 21
+'ò' = 22
+'ó' = 23
+'ô' = 24
+'œ' = 25
+'ù' = 26
+'ú' = 27
+'û' = 28
+'ñ' = 29
+'º' = 2A
+'ª' = 2B
+SUPER_ER = 2C
+'&' = 2D
+'+' = 2E
+LV = 34
+'=' = 35
+';' = 36
+'¿' = 51
+'¡' = 52
+PK = 53
+PKMN = 53 54
+POKEBLOCK = 55 56 57 58 59
+'Í' = 5A
+'%' = 5B
+'(' = 5C
+')' = 5D
+'â' = 68
+'í' = 6F
+UNK_SPACER = 77
+UP_ARROW = 79
+DOWN_ARROW = 7A
+LEFT_ARROW = 7B
+RIGHT_ARROW = 7C
+'0' = A1
+'1' = A2
+'2' = A3
+'3' = A4
+'4' = A5
+'5' = A6
+'6' = A7
+'7' = A8
+'8' = A9
+'9' = AA
+'!' = AB
+'?' = AC
+'.' = AD
+'-' = AE
+'·' = AF
+'…' = B0
+'“' = B1
+'”' = B2
+'‘' = B3
+'’' = B4
+'♂' = B5
+'♀' = B6
+'¥' = B7
+',' = B8
+'×' = B9
+'/' = BA
+'A' = BB
+'B' = BC
+'C' = BD
+'D' = BE
+'E' = BF
+'F' = C0
+'G' = C1
+'H' = C2
+'I' = C3
+'J' = C4
+'K' = C5
+'L' = C6
+'M' = C7
+'N' = C8
+'O' = C9
+'P' = CA
+'Q' = CB
+'R' = CC
+'S' = CD
+'T' = CE
+'U' = CF
+'V' = D0
+'W' = D1
+'X' = D2
+'Y' = D3
+'Z' = D4
+'a' = D5
+'b' = D6
+'c' = D7
+'d' = D8
+'e' = D9
+'f' = DA
+'g' = DB
+'h' = DC
+'i' = DD
+'j' = DE
+'k' = DF
+'l' = E0
+'m' = E1
+'n' = E2
+'o' = E3
+'p' = E4
+'q' = E5
+'r' = E6
+'s' = E7
+'t' = E8
+'u' = E9
+'v' = EA
+'w' = EB
+'x' = EC
+'y' = ED
+'z' = EE
+'▶' = EF
+':' = F0
+'Ä' = F1
+'Ö' = F2
+'Ü' = F3
+'ä' = F4
+'ö' = F5
+'ü' = F6
+TALL_PLUS = FC 0C FB
+'$' = FF
+
+@ Hiragana
+'あ' = 01
+'い' = 02
+'う' = 03
+'え' = 04
+'お' = 05
+'か' = 06
+'き' = 07
+'く' = 08
+'け' = 09
+'こ' = 0A
+'さ' = 0B
+'し' = 0C
+'す' = 0D
+'せ' = 0E
+'そ' = 0F
+'た' = 10
+'ち' = 11
+'つ' = 12
+'て' = 13
+'と' = 14
+'な' = 15
+'に' = 16
+'ぬ' = 17
+'ね' = 18
+'の' = 19
+'は' = 1A
+'ひ' = 1B
+'ふ' = 1C
+'へ' = 1D
+'ほ' = 1E
+'ま' = 1F
+'み' = 20
+'む' = 21
+'め' = 22
+'も' = 23
+'や' = 24
+'ゆ' = 25
+'よ' = 26
+'ら' = 27
+'り' = 28
+'る' = 29
+'れ' = 2A
+'ろ' = 2B
+'わ' = 2C
+'を' = 2D
+'ん' = 2E
+'ぁ' = 2F
+'ぃ' = 30
+'ぅ' = 31
+'ぇ' = 32
+'ぉ' = 33
+'ゃ' = 34
+'ゅ' = 35
+'ょ' = 36
+'が' = 37
+'ぎ' = 38
+'ぐ' = 39
+'げ' = 3A
+'ご' = 3B
+'ざ' = 3C
+'じ' = 3D
+'ず' = 3E
+'ぜ' = 3F
+'ぞ' = 40
+'だ' = 41
+'ぢ' = 42
+'づ' = 43
+'で' = 44
+'ど' = 45
+'ば' = 46
+'び' = 47
+'ぶ' = 48
+'べ' = 49
+'ぼ' = 4A
+'ぱ' = 4B
+'ぴ' = 4C
+'ぷ' = 4D
+'ぺ' = 4E
+'ぽ' = 4F
+'っ' = 50
+
+@ Katakana
+'ア' = 51
+'イ' = 52
+'ウ' = 53
+'エ' = 54
+'オ' = 55
+'カ' = 56
+'キ' = 57
+'ク' = 58
+'ケ' = 59
+'コ' = 5A
+'サ' = 5B
+'シ' = 5C
+'ス' = 5D
+'セ' = 5E
+'ソ' = 5F
+'タ' = 60
+'チ' = 61
+'ツ' = 62
+'テ' = 63
+'ト' = 64
+'ナ' = 65
+'ニ' = 66
+'ヌ' = 67
+'ネ' = 68
+'ノ' = 69
+'ハ' = 6A
+'ヒ' = 6B
+'フ' = 6C
+'ヘ' = 6D
+'ホ' = 6E
+'マ' = 6F
+'ミ' = 70
+'ム' = 71
+'メ' = 72
+'モ' = 73
+'ヤ' = 74
+'ユ' = 75
+'ヨ' = 76
+'ラ' = 77
+'リ' = 78
+'ル' = 79
+'レ' = 7A
+'ロ' = 7B
+'ワ' = 7C
+'ヲ' = 7D
+'ン' = 7E
+'ァ' = 7F
+'ィ' = 80
+'ゥ' = 81
+'ェ' = 82
+'ォ' = 83
+'ャ' = 84
+'ュ' = 85
+'ョ' = 86
+'ガ' = 87
+'ギ' = 88
+'グ' = 89
+'ゲ' = 8A
+'ゴ' = 8B
+'ザ' = 8C
+'ジ' = 8D
+'ズ' = 8E
+'ゼ' = 8F
+'ゾ' = 90
+'ダ' = 91
+'ヂ' = 92
+'ヅ' = 93
+'デ' = 94
+'ド' = 95
+'バ' = 96
+'ビ' = 97
+'ブ' = 98
+'ベ' = 99
+'ボ' = 9A
+'パ' = 9B
+'ピ' = 9C
+'プ' = 9D
+'ペ' = 9E
+'ポ' = 9F
+'ッ' = A0
+
+@ Japanese punctuation
+' ' = 00
+'!' = AB
+'?' = AC
+'。' = AD
+'ー' = AE
+'⋯' = B0
+
+STRING = FD
+
+@ string placeholders
+PLAYER = FD 01
+STR_VAR_1 = FD 02
+STR_VAR_2 = FD 03
+STR_VAR_3 = FD 04
+KUN = FD 05
+RIVAL = FD 06
+@ version-dependent strings (originally made for Ruby/Sapphire differences)
+@ Emerald uses the Sapphire strings (except for VERSION).
+VERSION = FD 07 @ "EMERALD"
+AQUA = FD 08
+MAGMA = FD 09
+ARCHIE = FD 0A
+MAXIE = FD 0B
+KYOGRE = FD 0C
+GROUDON = FD 0D
+
+@ battle string placeholders
+
+B_BUFF1 = FD 00
+B_BUFF2 = FD 01
+B_COPY_VAR_1 = FD 02
+B_COPY_VAR_2 = FD 03
+B_COPY_VAR_3 = FD 04
+B_PLAYER_MON1_NAME = FD 05
+B_OPPONENT_MON1_NAME = FD 06
+B_PLAYER_MON2_NAME = FD 07
+B_OPPONENT_MON2_NAME = FD 08
+B_LINK_PLAYER_MON1_NAME = FD 09
+B_LINK_OPPONENT_MON1_NAME = FD 0A
+B_LINK_PLAYER_MON2_NAME = FD 0B
+B_LINK_OPPONENT_MON2_NAME = FD 0C
+B_ATK_NAME_WITH_PREFIX_MON1 = FD 0D
+B_ATK_PARTNER_NAME = FD 0E
+B_ATK_NAME_WITH_PREFIX = FD 0F
+B_DEF_NAME_WITH_PREFIX = FD 10
+B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBattler
+B_ACTIVE_NAME_WITH_PREFIX = FD 12
+B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13
+B_CURRENT_MOVE = FD 14
+B_LAST_MOVE = FD 15
+B_LAST_ITEM = FD 16
+B_LAST_ABILITY = FD 17
+B_ATK_ABILITY = FD 18
+B_DEF_ABILITY = FD 19
+B_SCR_ACTIVE_ABILITY = FD 1A
+B_EFF_ABILITY = FD 1B
+B_TRAINER1_CLASS = FD 1C
+B_TRAINER1_NAME = FD 1D
+B_LINK_PLAYER_NAME = FD 1E
+B_LINK_PARTNER_NAME = FD 1F
+B_LINK_OPPONENT1_NAME = FD 20
+B_LINK_OPPONENT2_NAME = FD 21
+B_LINK_SCR_TRAINER_NAME = FD 22
+B_PLAYER_NAME = FD 23
+B_TRAINER1_LOSE_TEXT = FD 24
+B_TRAINER1_WIN_TEXT = FD 25
+B_26 = FD 26
+B_PC_CREATOR_NAME = FD 27
+B_ATK_PREFIX1 = FD 28
+B_DEF_PREFIX1 = FD 29
+B_ATK_PREFIX2 = FD 2A
+B_DEF_PREFIX2 = FD 2B
+B_ATK_PREFIX3 = FD 2C
+B_DEF_PREFIX3 = FD 2D
+B_TRAINER2_CLASS = FD 2E
+B_TRAINER2_NAME = FD 2F
+B_TRAINER2_LOSE_TEXT = FD 30
+B_TRAINER2_WIN_TEXT = FD 31
+B_PARTNER_CLASS = FD 32
+B_PARTNER_NAME = FD 33
+B_BUFF3 = FD 34
+
+@ indicates the end of a town/city name (before " TOWN" or " CITY")
+NAME_END = FC 00
+
+@ special 0xF7 character
+SPECIAL_F7 = F7
+
+@ more text functions
+
+COLOR = FC 01 @ use a color listed below right after
+HIGHLIGHT = FC 02 @ same as fc 01
+SHADOW = FC 03 @ same as fc 01
+COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes
+PALETTE = FC 05 @ used in credits
+SIZE = FC 06 @ note that anything other than "SMALL" is invalid
+UNKNOWN_7 = FC 07
+PAUSE = FC 08 @ manually print the wait byte after this, havent mapped them
+PAUSE_UNTIL_PRESS = FC 09
+UNKNOWN_A = FC 0A
+PLAY_BGM = FC 0B
+ESCAPE = FC 0C
+SHIFT_TEXT = FC 0D
+UNKNOWN_E = FC 0E
+UNKNOWN_F = FC 0F
+PLAY_SE = FC 10
+CLEAR = FC 11
+SKIP = FC 12
+CLEAR_TO = FC 13
+UNKNOWN_14 = FC 14
+JPN = FC 15
+ENG = FC 16
+PAUSE_MUSIC = FC 17
+RESUME_MUSIC = FC 18
+
+@ colors
+
+TRANSPARENT = 00
+WHITE = 01
+DARK_GREY = 02
+LIGHT_GREY = 03
+RED = 04
+LIGHT_RED = 05
+GREEN = 06
+LIGHT_GREEN = 07
+BLUE = 08
+LIGHT_BLUE = 09
+@ these next colors can be set to anything arbitrary at runtime
+@ usually though they'll have the textbox border colors as described below
+DYNAMIC_COLOR1 = 0A @ white
+DYNAMIC_COLOR2 = 0B @ white with a tinge of green
+DYNAMIC_COLOR3 = 0C @ white 2
+DYNAMIC_COLOR4 = 0D @ aquamarine
+DYNAMIC_COLOR5 = 0E @ blue-green
+DYNAMIC_COLOR6 = 0F @ cerulean
+
+@ sound and music
+
+MUS_DUMMY = 00 00
+SE_KAIFUKU = 01 00
+SE_PC_LOGIN = 02 00
+SE_PC_OFF = 03 00
+SE_PC_ON = 04 00
+SE_SELECT = 05 00
+SE_WIN_OPEN = 06 00
+SE_WALL_HIT = 07 00
+SE_DOOR = 08 00
+SE_KAIDAN = 09 00
+SE_DANSA = 0A 00
+SE_JITENSYA = 0B 00
+SE_KOUKA_L = 0C 00
+SE_KOUKA_M = 0D 00
+SE_KOUKA_H = 0E 00
+SE_BOWA2 = 0F 00
+SE_POKE_DEAD = 10 00
+SE_NIGERU = 11 00
+SE_JIDO_DOA = 12 00
+SE_NAMINORI = 13 00
+SE_BAN = 14 00
+SE_PIN = 15 00
+SE_BOO = 16 00
+SE_BOWA = 17 00
+SE_JYUNI = 18 00
+SE_A = 19 00
+SE_I = 1A 00
+SE_U = 1B 00
+SE_E = 1C 00
+SE_O = 1D 00
+SE_N = 1E 00
+SE_SEIKAI = 1F 00
+SE_HAZURE = 20 00
+SE_EXP = 21 00
+SE_JITE_PYOKO = 22 00
+SE_MU_PACHI = 23 00
+SE_TK_KASYA = 24 00
+SE_FU_ZAKU = 25 00
+SE_FU_ZAKU2 = 26 00
+SE_FU_ZUZUZU = 27 00
+SE_RU_GASHIN = 28 00
+SE_RU_GASYAN = 29 00
+SE_RU_BARI = 2A 00
+SE_RU_HYUU = 2B 00
+SE_KI_GASYAN = 2C 00
+SE_TK_WARPIN = 2D 00
+SE_TK_WARPOUT = 2E 00
+SE_TU_SAA = 2F 00
+SE_HI_TURUN = 30 00
+SE_TRACK_MOVE = 31 00
+SE_TRACK_STOP = 32 00
+SE_TRACK_HAIKI = 33 00
+SE_TRACK_DOOR = 34 00
+SE_MOTER = 35 00
+SE_CARD = 36 00
+SE_SAVE = 37 00
+SE_KON = 38 00
+SE_KON2 = 39 00
+SE_KON3 = 3A 00
+SE_KON4 = 3B 00
+SE_SUIKOMU = 3C 00
+SE_NAGERU = 3D 00
+SE_TOY_C = 3E 00
+SE_TOY_D = 3F 00
+SE_TOY_E = 40 00
+SE_TOY_F = 41 00
+SE_TOY_G = 42 00
+SE_TOY_A = 43 00
+SE_TOY_B = 44 00
+SE_TOY_C1 = 45 00
+SE_MIZU = 46 00
+SE_HASHI = 47 00
+SE_DAUGI = 48 00
+SE_PINPON = 49 00
+SE_FUUSEN1 = 4A 00
+SE_FUUSEN2 = 4B 00
+SE_FUUSEN3 = 4C 00
+SE_TOY_KABE = 4D 00
+SE_TOY_DANGO = 4E 00
+SE_DOKU = 4F 00
+SE_ESUKA = 50 00
+SE_T_AME = 51 00
+SE_T_AME_E = 52 00
+SE_T_OOAME = 53 00
+SE_T_OOAME_E = 54 00
+SE_T_KOAME = 55 00
+SE_T_KOAME_E = 56 00
+SE_T_KAMI = 57 00
+SE_T_KAMI2 = 58 00
+SE_ELEBETA = 59 00
+SE_HINSI = 5A 00
+SE_EXPMAX = 5B 00
+SE_TAMAKORO = 5C 00
+SE_TAMAKORO_E = 5D 00
+SE_BASABASA = 5E 00
+SE_REGI = 5F 00
+SE_C_GAJI = 60 00
+SE_C_MAKU_U = 61 00
+SE_C_MAKU_D = 62 00
+SE_C_PASI = 63 00
+SE_C_SYU = 64 00
+SE_C_PIKON = 65 00
+SE_REAPOKE = 66 00
+SE_OP_BASYU = 67 00
+SE_BT_START = 68 00
+SE_DENDOU = 69 00
+SE_JIHANKI = 6A 00
+SE_TAMA = 6B 00
+SE_Z_SCROLL = 6C 00
+SE_Z_PAGE = 6D 00
+SE_PN_ON = 6E 00
+SE_PN_OFF = 6F 00
+SE_Z_SEARCH = 70 00
+SE_TAMAGO = 71 00
+SE_TB_START = 72 00
+SE_TB_KON = 73 00
+SE_TB_KARA = 74 00
+SE_BIDORO = 75 00
+SE_W085 = 76 00
+SE_W085B = 77 00
+SE_W231 = 78 00
+SE_W171 = 79 00
+SE_W233 = 7A 00
+SE_W233B = 7B 00
+SE_W145 = 7C 00
+SE_W145B = 7D 00
+SE_W145C = 7E 00
+SE_W240 = 7F 00
+SE_W015 = 80 00
+SE_W081 = 81 00
+SE_W081B = 82 00
+SE_W088 = 83 00
+SE_W016 = 84 00
+SE_W016B = 85 00
+SE_W003 = 86 00
+SE_W104 = 87 00
+SE_W013 = 88 00
+SE_W196 = 89 00
+SE_W086 = 8A 00
+SE_W004 = 8B 00
+SE_W025 = 8C 00
+SE_W025B = 8D 00
+SE_W152 = 8E 00
+SE_W026 = 8F 00
+SE_W172 = 90 00
+SE_W172B = 91 00
+SE_W053 = 92 00
+SE_W007 = 93 00
+SE_W092 = 94 00
+SE_W221 = 95 00
+SE_W221B = 96 00
+SE_W052 = 97 00
+SE_W036 = 98 00
+SE_W059 = 99 00
+SE_W059B = 9A 00
+SE_W010 = 9B 00
+SE_W011 = 9C 00
+SE_W017 = 9D 00
+SE_W019 = 9E 00
+SE_W028 = 9F 00
+SE_W013B = A0 00
+SE_W044 = A1 00
+SE_W029 = A2 00
+SE_W057 = A3 00
+SE_W056 = A4 00
+SE_W250 = A5 00
+SE_W030 = A6 00
+SE_W039 = A7 00
+SE_W054 = A8 00
+SE_W077 = A9 00
+SE_W020 = AA 00
+SE_W082 = AB 00
+SE_W047 = AC 00
+SE_W195 = AD 00
+SE_W006 = AE 00
+SE_W091 = AF 00
+SE_W146 = B0 00
+SE_W120 = B1 00
+SE_W153 = B2 00
+SE_W071B = B3 00
+SE_W071 = B4 00
+SE_W103 = B5 00
+SE_W062 = B6 00
+SE_W062B = B7 00
+SE_W048 = B8 00
+SE_W187 = B9 00
+SE_W118 = BA 00
+SE_W155 = BB 00
+SE_W122 = BC 00
+SE_W060 = BD 00
+SE_W185 = BE 00
+SE_W014 = BF 00
+SE_W043 = C0 00
+SE_W207 = C1 00
+SE_W207B = C2 00
+SE_W215 = C3 00
+SE_W109 = C4 00
+SE_W173 = C5 00
+SE_W280 = C6 00
+SE_W202 = C7 00
+SE_W060B = C8 00
+SE_W076 = C9 00
+SE_W080 = CA 00
+SE_W100 = CB 00
+SE_W107 = CC 00
+SE_W166 = CD 00
+SE_W129 = CE 00
+SE_W115 = CF 00
+SE_W112 = D0 00
+SE_W197 = D1 00
+SE_W199 = D2 00
+SE_W236 = D3 00
+SE_W204 = D4 00
+SE_W268 = D5 00
+SE_W070 = D6 00
+SE_W063 = D7 00
+SE_W127 = D8 00
+SE_W179 = D9 00
+SE_W151 = DA 00
+SE_W201 = DB 00
+SE_W161 = DC 00
+SE_W161B = DD 00
+SE_W227 = DE 00
+SE_W227B = DF 00
+SE_W226 = E0 00
+SE_W208 = E1 00
+SE_W213 = E2 00
+SE_W213B = E3 00
+SE_W234 = E4 00
+SE_W260 = E5 00
+SE_W328 = E6 00
+SE_W320 = E7 00
+SE_W255 = E8 00
+SE_W291 = E9 00
+SE_W089 = EA 00
+SE_W239 = EB 00
+SE_W230 = EC 00
+SE_W281 = ED 00
+SE_W327 = EE 00
+SE_W287 = EF 00
+SE_W257 = F0 00
+SE_W253 = F1 00
+SE_W258 = F2 00
+SE_W322 = F3 00
+SE_W298 = F4 00
+SE_W287B = F5 00
+SE_W114 = F6 00
+SE_W063B = F7 00
+SE_RG_W_DOOR = F8 00
+SE_RG_CARD1 = F9 00
+SE_RG_CARD2 = FA 00
+SE_RG_CARD3 = FB 00
+SE_RG_BAG1 = FC 00
+SE_RG_BAG2 = FD 00
+SE_RG_GETTING = FE 00
+SE_RG_SHOP = FF 00
+SE_RG_KITEKI = 00 01
+SE_RG_HELP_OP = 01 01
+SE_RG_HELP_CL = 02 01
+SE_RG_HELP_NG = 03 01
+SE_RG_DEOMOV = 04 01
+SE_RG_EXCELLENT = 05 01
+SE_RG_NAWAMISS = 06 01
+SE_TOREEYE = 07 01
+SE_TOREOFF = 08 01
+SE_HANTEI1 = 09 01
+SE_HANTEI2 = 0A 01
+SE_CURTAIN = 0B 01
+SE_CURTAIN1 = 0C 01
+SE_USSOKI = 0D 01
+MUS_TETSUJI = 5E 01
+MUS_FIELD13 = 5F 01
+MUS_KACHI22 = 60 01
+MUS_KACHI2 = 61 01
+MUS_KACHI3 = 62 01
+MUS_KACHI5 = 63 01
+MUS_PCC = 64 01
+MUS_NIBI = 65 01
+MUS_SUIKUN = 66 01
+MUS_DOORO1 = 67 01
+MUS_DOORO_X1 = 68 01
+MUS_DOORO_X3 = 69 01
+MUS_MACHI_S2 = 6A 01
+MUS_MACHI_S4 = 6B 01
+MUS_GIM = 6C 01
+MUS_NAMINORI = 6D 01
+MUS_DAN01 = 6E 01
+MUS_FANFA1 = 6F 01
+MUS_ME_ASA = 70 01
+MUS_ME_BACHI = 71 01
+MUS_FANFA4 = 72 01
+MUS_FANFA5 = 73 01
+MUS_ME_WAZA = 74 01
+MUS_BIJYUTU = 75 01
+MUS_DOORO_X4 = 76 01
+MUS_FUNE_KAN = 77 01
+MUS_ME_SHINKA = 78 01
+MUS_SHINKA = 79 01
+MUS_ME_WASURE = 7A 01
+MUS_SYOUJOEYE = 7B 01
+MUS_BOYEYE = 7C 01
+MUS_DAN02 = 7D 01
+MUS_MACHI_S3 = 7E 01
+MUS_ODAMAKI = 7F 01
+MUS_B_TOWER = 80 01
+MUS_SWIMEYE = 81 01
+MUS_DAN03 = 82 01
+MUS_ME_KINOMI = 83 01
+MUS_ME_TAMA = 84 01
+MUS_ME_B_BIG = 85 01
+MUS_ME_B_SMALL = 86 01
+MUS_ME_ZANNEN = 87 01
+MUS_BD_TIME = 88 01
+MUS_TEST1 = 89 01
+MUS_TEST2 = 8A 01
+MUS_TEST3 = 8B 01
+MUS_TEST4 = 8C 01
+MUS_TEST = 8D 01
+MUS_GOMACHI0 = 8E 01
+MUS_GOTOWN = 8F 01
+MUS_POKECEN = 90 01
+MUS_NEXTROAD = 91 01
+MUS_GRANROAD = 92 01
+MUS_CYCLING = 93 01
+MUS_FRIENDLY = 94 01
+MUS_MISHIRO = 95 01
+MUS_TOZAN = 96 01
+MUS_GIRLEYE = 97 01
+MUS_MINAMO = 98 01
+MUS_ASHROAD = 99 01
+MUS_EVENT0 = 9A 01
+MUS_DEEPDEEP = 9B 01
+MUS_KACHI1 = 9C 01
+MUS_TITLE3 = 9D 01
+MUS_DEMO1 = 9E 01
+MUS_GIRL_SUP = 9F 01
+MUS_HAGESHII = A0 01
+MUS_KAKKOII = A1 01
+MUS_KAZANBAI = A2 01
+MUS_AQA_0 = A3 01
+MUS_TSURETEK = A4 01
+MUS_BOY_SUP = A5 01
+MUS_RAINBOW = A6 01
+MUS_AYASII = A7 01
+MUS_KACHI4 = A8 01
+MUS_ROPEWAY = A9 01
+MUS_CASINO = AA 01
+MUS_HIGHTOWN = AB 01
+MUS_SAFARI = AC 01
+MUS_C_ROAD = AD 01
+MUS_AJITO = AE 01
+MUS_M_BOAT = AF 01
+MUS_M_DUNGON = B0 01
+MUS_FINECITY = B1 01
+MUS_MACHUPI = B2 01
+MUS_P_SCHOOL = B3 01
+MUS_DENDOU = B4 01
+MUS_TONEKUSA = B5 01
+MUS_MABOROSI = B6 01
+MUS_CON_FAN = B7 01
+MUS_CONTEST0 = B8 01
+MUS_MGM0 = B9 01
+MUS_T_BATTLE = BA 01
+MUS_OOAME = BB 01
+MUS_HIDERI = BC 01
+MUS_RUNECITY = BD 01
+MUS_CON_K = BE 01
+MUS_EIKOU_R = BF 01
+MUS_KARAKURI = C0 01
+MUS_HUTAGO = C1 01
+MUS_SITENNOU = C2 01
+MUS_YAMA_EYE = C3 01
+MUS_CONLOBBY = C4 01
+MUS_INTER_V = C5 01
+MUS_DAIGO = C6 01
+MUS_THANKFOR = C7 01
+MUS_END = C8 01
+MUS_B_FRONTIER = C9 01
+MUS_B_ARENA = CA 01
+MUS_ME_POINTGET = CB 01
+MUS_ME_TORE_EYE = CC 01
+MUS_PYRAMID = CD 01
+MUS_PYRAMID_TOP = CE 01
+MUS_B_PALACE = CF 01
+MUS_REKKUU_KOURIN = D0 01
+MUS_SATTOWER = D1 01
+MUS_ME_SYMBOLGET = D2 01
+MUS_B_DOME = D3 01
+MUS_B_TUBE = D4 01
+MUS_B_FACTORY = D5 01
+MUS_VS_REKKU = D6 01
+MUS_VS_FRONT = D7 01
+MUS_VS_MEW = D8 01
+MUS_B_DOME1 = D9 01
+MUS_BATTLE27 = DA 01
+MUS_BATTLE31 = DB 01
+MUS_BATTLE20 = DC 01
+MUS_BATTLE32 = DD 01
+MUS_BATTLE33 = DE 01
+MUS_BATTLE36 = DF 01
+MUS_BATTLE34 = E0 01
+MUS_BATTLE35 = E1 01
+MUS_BATTLE38 = E2 01
+MUS_BATTLE30 = E3 01
+MUS_RG_ANNAI = E4 01
+MUS_RG_SLOT = E5 01
+MUS_RG_AJITO = E6 01
+MUS_RG_GYM = E7 01
+MUS_RG_PURIN = E8 01
+MUS_RG_DEMO = E9 01
+MUS_RG_TITLE = EA 01
+MUS_RG_GUREN = EB 01
+MUS_RG_SHION = EC 01
+MUS_RG_KAIHUKU = ED 01
+MUS_RG_CYCLING = EE 01
+MUS_RG_ROCKET = EF 01
+MUS_RG_SHOUJO = F0 01
+MUS_RG_SHOUNEN = F1 01
+MUS_RG_DENDOU = F2 01
+MUS_RG_T_MORI = F3 01
+MUS_RG_OTSUKIMI = F4 01
+MUS_RG_POKEYASHI = F5 01
+MUS_RG_ENDING = F6 01
+MUS_RG_LOAD01 = F7 01
+MUS_RG_OPENING = F8 01
+MUS_RG_LOAD02 = F9 01
+MUS_RG_LOAD03 = FA 01
+MUS_RG_CHAMP_R = FB 01
+MUS_RG_VS_GYM = FC 01
+MUS_RG_VS_TORE = FD 01
+MUS_RG_VS_YASEI = FE 01
+MUS_RG_VS_LAST = FF 01
+MUS_RG_MASARA = 00 02
+MUS_RG_KENKYU = 01 02
+MUS_RG_OHKIDO = 02 02
+MUS_RG_POKECEN = 03 02
+MUS_RG_SANTOAN = 04 02
+MUS_RG_NAMINORI = 05 02
+MUS_RG_P_TOWER = 06 02
+MUS_RG_SHIRUHU = 07 02
+MUS_RG_HANADA = 08 02
+MUS_RG_TAMAMUSI = 09 02
+MUS_RG_WIN_TRE = 0A 02
+MUS_RG_WIN_YASEI = 0B 02
+MUS_RG_WIN_GYM = 0C 02
+MUS_RG_KUCHIBA = 0D 02
+MUS_RG_NIBI = 0E 02
+MUS_RG_RIVAL1 = 0F 02
+MUS_RG_RIVAL2 = 10 02
+MUS_RG_FAN2 = 11 02
+MUS_RG_FAN5 = 12 02
+MUS_RG_FAN6 = 13 02
+MUS_ME_RG_PHOTO = 14 02
+MUS_RG_TITLEROG = 15 02
+MUS_RG_GET_YASEI = 16 02
+MUS_RG_SOUSA = 17 02
+MUS_RG_SEKAIKAN = 18 02
+MUS_RG_SEIBETU = 19 02
+MUS_RG_JUMP = 1A 02
+MUS_RG_UNION = 1B 02
+MUS_RG_NETWORK = 1C 02
+MUS_RG_OKURIMONO = 1D 02
+MUS_RG_KINOMIKUI = 1E 02
+MUS_RG_NANADUNGEON = 1F 02
+MUS_RG_OSHIE_TV = 20 02
+MUS_RG_NANASHIMA = 21 02
+MUS_RG_NANAISEKI = 22 02
+MUS_RG_NANA123 = 23 02
+MUS_RG_NANA45 = 24 02
+MUS_RG_NANA67 = 25 02
+MUS_RG_POKEFUE = 26 02
+MUS_RG_VS_DEO = 27 02
+MUS_RG_VS_MYU2 = 28 02
+MUS_RG_VS_DEN = 29 02
+MUS_RG_EXEYE = 2A 02
+MUS_RG_DEOEYE = 2B 02
+MUS_RG_T_TOWER = 2C 02
+MUS_RG_SLOWMASARA = 2D 02
+MUS_RG_TVNOIZE = 2E 02
+PH_TRAP_BLEND = 2F 02
+PH_TRAP_HELD = 30 02
+PH_TRAP_SOLO = 31 02
+PH_FACE_BLEND = 32 02
+PH_FACE_HELD = 33 02
+PH_FACE_SOLO = 34 02
+PH_CLOTH_BLEND = 35 02
+PH_CLOTH_HELD = 36 02
+PH_CLOTH_SOLO = 37 02
+PH_DRESS_BLEND = 38 02
+PH_DRESS_HELD = 39 02
+PH_DRESS_SOLO = 3A 02
+PH_FLEECE_BLEND = 3B 02
+PH_FLEECE_HELD = 3C 02
+PH_FLEECE_SOLO = 3D 02
+PH_KIT_BLEND = 3E 02
+PH_KIT_HELD = 3F 02
+PH_KIT_SOLO = 40 02
+PH_PRICE_BLEND = 41 02
+PH_PRICE_HELD = 42 02
+PH_PRICE_SOLO = 43 02
+PH_LOT_BLEND = 44 02
+PH_LOT_HELD = 45 02
+PH_LOT_SOLO = 46 02
+PH_GOAT_BLEND = 47 02
+PH_GOAT_HELD = 48 02
+PH_GOAT_SOLO = 49 02
+PH_THOUGHT_BLEND = 4A 02
+PH_THOUGHT_HELD = 4B 02
+PH_THOUGHT_SOLO = 4C 02
+PH_CHOICE_BLEND = 4D 02
+PH_CHOICE_HELD = 4E 02
+PH_CHOICE_SOLO = 4F 02
+PH_MOUTH_BLEND = 50 02
+PH_MOUTH_HELD = 51 02
+PH_MOUTH_SOLO = 52 02
+PH_FOOT_BLEND = 53 02
+PH_FOOT_HELD = 54 02
+PH_FOOT_SOLO = 55 02
+PH_GOOSE_BLEND = 56 02
+PH_GOOSE_HELD = 57 02
+PH_GOOSE_SOLO = 58 02
+PH_STRUT_BLEND = 59 02
+PH_STRUT_HELD = 5A 02
+PH_STRUT_SOLO = 5B 02
+PH_CURE_BLEND = 5C 02
+PH_CURE_HELD = 5D 02
+PH_CURE_SOLO = 5E 02
+PH_NURSE_BLEND = 5F 02
+PH_NURSE_HELD = 60 02
+PH_NURSE_SOLO = 61 02
+
+A_BUTTON = F8 00
+B_BUTTON = F8 01
+DPAD_UPDOWN = F8 0A
+DPAD_NONE = F8 0C
+
+UP_ARROW_2 = F9 00
+DOWN_ARROW_2 = F9 01
+LEFT_ARROW_2 = F9 02
+RIGHT_ARROW_2 = F9 03
+PLUS = F9 04
+LV_2 = F9 05
+PP = F9 06
+ID = F9 07
+NO = F9 08
+UNDERSCORE = F9 09
+CIRCLE_1 = F9 0A
+CIRCLE_2 = F9 0B
+CIRCLE_3 = F9 0C
+CIRCLE_4 = F9 0D
+CIRCLE_5 = F9 0E
+CIRCLE_6 = F9 0F
+CIRCLE_7 = F9 10
+CIRCLE_8 = F9 11
+CIRCLE_9 = F9 12
+ROUND_LEFT_PAREN = F9 13
+ROUND_RIGHT_PAREN = F9 14
+CIRCLE_DOT = F9 15
+TRIANGLE = F9 16
+BIG_MULT_X = F9 17
+
+EMOJI_UNDERSCORE = F9 D0
+EMOJI_PIPE = F9 D1
+EMOJI_HIGHBAR = F9 D2
+EMOJI_TILDE = F9 D3
+EMOJI_LEFT_PAREN = F9 D4
+EMOJI_RIGHT_PAREN = F9 D5
+EMOJI_UNION = F9 D6 @ ⊂
+EMOJI_GREATER_THAN = F9 D7
+EMOJI_LEFT_EYE = F9 D8
+EMOJI_RIGHT_EYE = F9 D9
+EMOJI_AT = F9 DA
+EMOJI_SEMICOLON = F9 DB
+EMOJI_PLUS = F9 DC
+EMOJI_MINUS = F9 DD
+EMOJI_EQUALS = F9 DE
+EMOJI_SPIRAL = F9 DF
+EMOJI_TONGUE = F9 E0
+EMOJI_TRIANGLE_OUTLINE = F9 E1
+EMOJI_ACUTE = F9 E2
+EMOJI_GRAVE = F9 E3
+EMOJI_CIRCLE = F9 E4
+EMOJI_TRIANGLE = F9 E5
+EMOJI_SQUARE = F9 E6
+EMOJI_HEART = F9 E7
+EMOJI_MOON = F9 E8
+EMOJI_NOTE = F9 E9
+EMOJI_BALL = F9 EA
+EMOJI_BOLT = F9 EB
+EMOJI_LEAF = F9 EC
+EMOJI_FIRE = F9 ED
+EMOJI_WATER = F9 EE
+EMOJI_LEFT_FIST = F9 EF
+EMOJI_RIGHT_FIST = F9 F0
+EMOJI_BIGWHEEL = F9 F1
+EMOJI_SMALLWHEEL = F9 F2
+EMOJI_SPHERE = F9 F3
+EMOJI_IRRITATED = F9 F4
+EMOJI_MISCHIEVOUS = F9 F5
+EMOJI_HAPPY = F9 F6
+EMOJI_ANGRY = F9 F7
+EMOJI_SURPRISED = F9 F8
+EMOJI_BIGSMILE = F9 F9
+EMOJI_EVIL = F9 FA
+EMOJI_TIRED = F9 FB
+EMOJI_NEUTRAL = F9 FC
+EMOJI_SHOCKED = F9 FD
+EMOJI_BIGANGER = F9 FE
+
+'\l' = FA @ scroll up window text
+'\p' = FB @ new paragraph
+'\n' = FE @ new line
diff --git a/berry_fix/data/data.s b/berry_fix/data/data.s
new file mode 100644
index 000000000..dbb86b13b
--- /dev/null
+++ b/berry_fix/data/data.s
@@ -0,0 +1,4 @@
+ .section .rodata
+
+_data_2f0::
+ .incbin "data/payload.gba.lz"
diff --git a/berry_fix/ld_script.sed b/berry_fix/ld_script.sed
new file mode 100644
index 000000000..b91542b6f
--- /dev/null
+++ b/berry_fix/ld_script.sed
@@ -0,0 +1,14 @@
+/<EWRAM>/ {
+ r sym_ewram.ld
+ d
+}
+
+/<BSS>/ {
+ r sym_bss.ld
+ d
+}
+
+/<COMMON>/ {
+ r sym_common.ld
+ d
+}
diff --git a/berry_fix/ld_script.txt b/berry_fix/ld_script.txt
new file mode 100644
index 000000000..2edeaef7c
--- /dev/null
+++ b/berry_fix/ld_script.txt
@@ -0,0 +1,31 @@
+ENTRY(_start)
+
+SECTIONS {
+ . = 0x2000000;
+
+ .text :
+ ALIGN(4)
+ {
+ asm/loader.o(.text);
+ } =0
+
+ . += 0x100;
+ .rodata :
+ ALIGN(4)
+ {
+ data/data.o(.rodata);
+ } =0
+
+ . = 0x2010000;
+
+ ewram (NOLOAD) :
+ ALIGN(4)
+ {
+ gCode = .;
+ }
+
+ /DISCARD/ :
+ {
+ *(*);
+ }
+}
diff --git a/berry_fix/payload/Makefile b/berry_fix/payload/Makefile
new file mode 100644
index 000000000..dfcf2a796
--- /dev/null
+++ b/berry_fix/payload/Makefile
@@ -0,0 +1,172 @@
+include $(DEVKITARM)/base_tools
+export CPP := $(PREFIX)cpp
+export LD := $(PREFIX)ld
+COMPARE ?= 0
+
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
+SHELL := /bin/bash -o pipefail
+
+CPPFLAGS := -I ../../tools/agbcc/include -I ../../tools/agbcc -iquote include -nostdinc -undef
+
+ROM := payload.gba
+OBJ_DIR := build
+CC1 := ../../tools/agbcc/bin/agbcc$(EXE)
+override CC1FLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm
+
+
+ELF = $(ROM:.gba=.elf)
+MAP = $(ROM:.gba=.map)
+
+C_SUBDIR = src
+ASM_SUBDIR = asm
+DATA_ASM_SUBDIR = data
+
+C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR)
+ASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR)
+DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR)
+
+ASFLAGS := -mcpu=arm7tdmi
+
+LDFLAGS = -Map ../$(MAP)
+
+LIB := -L ../../../tools/agbcc/lib -lgcc
+
+SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
+GFX := ../../tools/gbagfx/gbagfx$(EXE)
+AIF := ../../tools/aif2pcm/aif2pcm$(EXE)
+MID := ../../tools/mid2agb/mid2agb$(EXE)
+SCANINC := ../../tools/scaninc/scaninc$(EXE)
+PREPROC := ../../tools/preproc/preproc$(EXE)
+RAMSCRGEN := ../../tools/ramscrgen/ramscrgen$(EXE)
+FIX := ../../tools/gbafix/gbafix$(EXE)
+
+# Clear the default suffixes
+.SUFFIXES:
+# Don't delete intermediate files
+.SECONDARY:
+# Delete files that weren't built properly
+.DELETE_ON_ERROR:
+
+# Secondary expansion is required for dependency variables in object rules.
+.SECONDEXPANSION:
+
+.PHONY: all rom clean compare tidy
+
+C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c)
+C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))
+
+ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)
+ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS))
+
+DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s)
+DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS))
+
+SONG_SRCS := $(wildcard $(SONG_SUBDIR)/*.s)
+SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS))
+
+MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid)
+MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS))
+
+OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
+# OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))
+
+SUBDIRS := $(sort $(dir $(OBJS)))
+
+$(shell mkdir -p $(SUBDIRS))
+
+$(C_BUILDDIR)/siirtc.o: CC1FLAGS := -mthumb-interwork
+$(C_BUILDDIR)/agb_flash.o: CC1FLAGS := -O1 -mthumb-interwork
+$(C_BUILDDIR)/agb_flash_1m.o: CC1FLAGS := -O1 -mthumb-interwork
+$(C_BUILDDIR)/agb_flash_mx.o: CC1FLAGS := -O1 -mthumb-interwork
+$(C_BUILDDIR)/agb_flash_le.o: CC1FLAGS := -O1 -mthumb-interwork
+
+all: rom
+ @:
+
+rom: $(ROM)
+ifeq ($(COMPARE),1)
+ @$(SHA1) rom.sha1
+endif
+
+# For contributors to make sure a change didn't affect the contents of the ROM.
+compare: ; @$(MAKE) COMPARE=1
+
+clean: tidy
+ rm -f sound/direct_sound_samples/*.bin
+ rm -f $(SONG_OBJS) $(MID_OBJS) $(MID_SUBDIR)/*.s
+ find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} +
+
+tidy:
+ rm -f $(ROM) $(ELF) $(MAP)
+ rm -r build/*
+
+%.s: ;
+%.png: ;
+%.pal: ;
+%.aif: ;
+
+%.1bpp: %.png ; $(GFX) $< $@
+%.4bpp: %.png ; $(GFX) $< $@
+%.8bpp: %.png ; $(GFX) $< $@
+%.gbapal: %.pal ; $(GFX) $< $@
+%.gbapal: %.png ; $(GFX) $< $@
+%.lz: % ; $(GFX) $< $@
+%.rl: % ; $(GFX) $< $@
+
+
+ifeq ($(NODEP),1)
+$(C_BUILDDIR)/%.o: c_dep :=
+else
+$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c)
+endif
+
+$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
+ @$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i
+ @$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CC1FLAGS) -o $(C_BUILDDIR)/$*.s
+ @echo -e ".text\n\t.align\t2, 0\n" >> $(C_BUILDDIR)/$*.s
+ $(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s
+
+ifeq ($(NODEP),1)
+$(ASM_BUILDDIR)/%.o: asm_dep :=
+else
+$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) $(ASM_SUBDIR)/$*.s)
+endif
+
+$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep)
+ $(AS) $(ASFLAGS) -o $@ $<
+
+ifeq ($(NODEP),1)
+$(DATA_ASM_BUILDDIR)/%.o: data_dep :=
+else
+$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s)
+endif
+
+$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep)
+ $(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@
+
+$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s
+ $(AS) $(ASFLAGS) -I sound -o $@ $<
+
+$(OBJ_DIR)/sym_bss.ld: sym_bss.txt
+ $(RAMSCRGEN) .bss $< ENGLISH > $@
+
+$(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt)
+ $(RAMSCRGEN) COMMON $< ENGLISH -c $(C_BUILDDIR),common_syms,../../tools/agbcc/lib > $@
+
+$(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt
+ $(RAMSCRGEN) ewram_data $< ENGLISH > $@
+
+$(OBJ_DIR)/ld_script.ld: ld_script.txt $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld
+ cd $(OBJ_DIR) && sed -f ../../ld_script.sed ../$< | sed "s#tools/#../tools/#g" > ld_script.ld
+
+$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS)
+ cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../$@ $(LIB)
+
+$(ROM): $(ELF)
+ $(OBJCOPY) -O binary $< $@
+
diff --git a/berry_fix/payload/asm/crt0.s b/berry_fix/payload/asm/crt0.s
new file mode 100644
index 000000000..872a63018
--- /dev/null
+++ b/berry_fix/payload/asm/crt0.s
@@ -0,0 +1,82 @@
+ .include "asm/macros/function.inc"
+ .include "constants/gba_constants.inc"
+
+ .syntax unified
+
+ .text
+
+ .arm
+ .align 2, 0
+ .global Init
+Init:
+ mov r0, PSR_IRQ_MODE
+ msr cpsr_cf, r0
+ ldr sp, sp_irq
+ mov r0, PSR_SYS_MODE
+ msr cpsr_cf, r0
+ ldr sp, sp_sys
+ ldr r1, =INTR_VECTOR
+ ldr r0, =IntrMain
+ str r0, [r1]
+ ldr r1, =AgbMain + 1
+ mov lr, pc
+ bx r1
+ b Init
+
+ .align 2, 0
+sp_sys: .word IWRAM_END - 0x100
+sp_irq: .word IWRAM_END - 0x60
+
+ .pool
+ .size Init, .-Init
+
+ .arm
+ .align 2, 0
+ .global IntrMain
+IntrMain: @ 0x2010048
+ mov ip, REG_BASE
+ add r3, ip, OFFSET_REG_IE
+ ldr r2, [r3]
+ and r1, r2, r2, lsr #16
+ mov r2, #0
+ ands r0, r1, #0x2000
+ strbne r0, [r3, #-0x17c]
+_02010064:
+ bne _02010064
+ ands r0, r1, #0xc0
+ bne _020100DC
+ add r2, r2, #4
+ ands r0, r1, #1
+ strhne r0, [ip, #-8]
+ bne _020100DC
+ add r2, r2, #4
+ ands r0, r1, #2
+ bne _020100DC
+ add r2, r2, #4
+ ands r0, r1, #4
+ bne _020100DC
+ add r2, r2, #4
+ ands r0, r1, #0x100
+ bne _020100DC
+ add r2, r2, #4
+ ands r0, r1, #0x200
+ bne _020100DC
+ add r2, r2, #4
+ ands r0, r1, #0x400
+ bne _020100DC
+ add r2, r2, #4
+ ands r0, r1, #0x800
+ bne _020100DC
+ add r2, r2, #4
+ ands r0, r1, #0x1000
+ bne _020100DC
+ add r2, r2, #4
+ ands r0, r1, #8
+_020100DC:
+ strh r0, [r3, #2]
+ ldr r1, =gIntrTable
+ add r1, r1, r2
+ ldr r0, [r1]
+ bx r0
+ .pool
+ .size IntrMain, .-IntrMain
diff --git a/berry_fix/payload/asm/libagbsyscall.s b/berry_fix/payload/asm/libagbsyscall.s
new file mode 100644
index 000000000..ea8ef3e89
--- /dev/null
+++ b/berry_fix/payload/asm/libagbsyscall.s
@@ -0,0 +1,46 @@
+ .include "asm/macros/function.inc"
+ .include "constants/gba_constants.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start CpuSet
+CpuSet: @ 81E3B64
+ swi 0xB
+ bx lr
+ thumb_func_end CpuSet
+
+ thumb_func_start Div
+Div: @ 81E3B68
+ swi 0x6
+ bx lr
+ thumb_func_end Div
+
+ thumb_func_start Mod
+Mod:
+ swi 0x6
+ adds r0, r1, 0
+ bx lr
+ thumb_func_end Mod
+
+ thumb_func_start LZ77UnCompVram
+LZ77UnCompVram: @ 81E3B6C
+ swi 0x12
+ bx lr
+ thumb_func_end LZ77UnCompVram
+
+ thumb_func_start RegisterRamReset
+RegisterRamReset: @ 81E3B80
+ swi 0x1
+ bx lr
+ thumb_func_end RegisterRamReset
+
+ thumb_func_start VBlankIntrWait
+VBlankIntrWait: @ 81E3BA0
+ movs r2, 0
+ swi 0x5
+ bx lr
+ thumb_func_end VBlankIntrWait
+
+ .align 2, 0 @ Don't pad with nop.
diff --git a/berry_fix/payload/asm/macros/function.inc b/berry_fix/payload/asm/macros/function.inc
new file mode 100644
index 000000000..67fb373a8
--- /dev/null
+++ b/berry_fix/payload/asm/macros/function.inc
@@ -0,0 +1,29 @@
+ .macro arm_func_start name
+ .align 2, 0
+ .global \name
+ .arm
+ .type \name, function
+ .endm
+
+ .macro arm_func_end name
+ .size \name, .-\name
+ .endm
+
+ .macro thumb_func_start name
+ .align 2, 0
+ .global \name
+ .thumb
+ .thumb_func
+ .type \name, function
+ .endm
+
+ .macro non_word_aligned_thumb_func_start name
+ .global \name
+ .thumb
+ .thumb_func
+ .type \name, function
+ .endm
+
+ .macro thumb_func_end name
+ .size \name, .-\name
+ .endm
diff --git a/berry_fix/payload/charmap.txt b/berry_fix/payload/charmap.txt
new file mode 100644
index 000000000..a736b40f2
--- /dev/null
+++ b/berry_fix/payload/charmap.txt
@@ -0,0 +1,1067 @@
+' ' = 00
+'À' = 01
+'Á' = 02
+'Â' = 03
+'Ç' = 04
+'È' = 05
+'É' = 06
+'Ê' = 07
+'Ë' = 08
+'Ì' = 09
+'Î' = 0B
+'Ï' = 0C
+'Ò' = 0D
+'Ó' = 0E
+'Ô' = 0F
+'Œ' = 10
+'Ù' = 11
+'Ú' = 12
+'Û' = 13
+'Ñ' = 14
+'ß' = 15
+'à' = 16
+'á' = 17
+'ç' = 19
+'è' = 1A
+'é' = 1B
+'ê' = 1C
+'ë' = 1D
+'ì' = 1E
+'î' = 20
+'ï' = 21
+'ò' = 22
+'ó' = 23
+'ô' = 24
+'œ' = 25
+'ù' = 26
+'ú' = 27
+'û' = 28
+'ñ' = 29
+'º' = 2A
+'ª' = 2B
+SUPER_ER = 2C
+'&' = 2D
+'+' = 2E
+LV = 34
+'=' = 35
+';' = 36
+'¿' = 51
+'¡' = 52
+PK = 53
+PKMN = 53 54
+POKEBLOCK = 55 56 57 58 59
+'Í' = 5A
+'%' = 5B
+'(' = 5C
+')' = 5D
+'â' = 68
+'í' = 6F
+UNK_SPACER = 77
+UP_ARROW = 79
+DOWN_ARROW = 7A
+LEFT_ARROW = 7B
+RIGHT_ARROW = 7C
+'0' = A1
+'1' = A2
+'2' = A3
+'3' = A4
+'4' = A5
+'5' = A6
+'6' = A7
+'7' = A8
+'8' = A9
+'9' = AA
+'!' = AB
+'?' = AC
+'.' = AD
+'-' = AE
+'·' = AF
+'…' = B0
+'“' = B1
+'”' = B2
+'‘' = B3
+'’' = B4
+'♂' = B5
+'♀' = B6
+'¥' = B7
+',' = B8
+'×' = B9
+'/' = BA
+'A' = BB
+'B' = BC
+'C' = BD
+'D' = BE
+'E' = BF
+'F' = C0
+'G' = C1
+'H' = C2
+'I' = C3
+'J' = C4
+'K' = C5
+'L' = C6
+'M' = C7
+'N' = C8
+'O' = C9
+'P' = CA
+'Q' = CB
+'R' = CC
+'S' = CD
+'T' = CE
+'U' = CF
+'V' = D0
+'W' = D1
+'X' = D2
+'Y' = D3
+'Z' = D4
+'a' = D5
+'b' = D6
+'c' = D7
+'d' = D8
+'e' = D9
+'f' = DA
+'g' = DB
+'h' = DC
+'i' = DD
+'j' = DE
+'k' = DF
+'l' = E0
+'m' = E1
+'n' = E2
+'o' = E3
+'p' = E4
+'q' = E5
+'r' = E6
+'s' = E7
+'t' = E8
+'u' = E9
+'v' = EA
+'w' = EB
+'x' = EC
+'y' = ED
+'z' = EE
+'▶' = EF
+':' = F0
+'Ä' = F1
+'Ö' = F2
+'Ü' = F3
+'ä' = F4
+'ö' = F5
+'ü' = F6
+TALL_PLUS = FC 0C FB
+'$' = FF
+
+@ Hiragana
+'あ' = 01
+'い' = 02
+'う' = 03
+'え' = 04
+'お' = 05
+'か' = 06
+'き' = 07
+'く' = 08
+'け' = 09
+'こ' = 0A
+'さ' = 0B
+'し' = 0C
+'す' = 0D
+'せ' = 0E
+'そ' = 0F
+'た' = 10
+'ち' = 11
+'つ' = 12
+'て' = 13
+'と' = 14
+'な' = 15
+'に' = 16
+'ぬ' = 17
+'ね' = 18
+'の' = 19
+'は' = 1A
+'ひ' = 1B
+'ふ' = 1C
+'へ' = 1D
+'ほ' = 1E
+'ま' = 1F
+'み' = 20
+'む' = 21
+'め' = 22
+'も' = 23
+'や' = 24
+'ゆ' = 25
+'よ' = 26
+'ら' = 27
+'り' = 28
+'る' = 29
+'れ' = 2A
+'ろ' = 2B
+'わ' = 2C
+'を' = 2D
+'ん' = 2E
+'ぁ' = 2F
+'ぃ' = 30
+'ぅ' = 31
+'ぇ' = 32
+'ぉ' = 33
+'ゃ' = 34
+'ゅ' = 35
+'ょ' = 36
+'が' = 37
+'ぎ' = 38
+'ぐ' = 39
+'げ' = 3A
+'ご' = 3B
+'ざ' = 3C
+'じ' = 3D
+'ず' = 3E
+'ぜ' = 3F
+'ぞ' = 40
+'だ' = 41
+'ぢ' = 42
+'づ' = 43
+'で' = 44
+'ど' = 45
+'ば' = 46
+'び' = 47
+'ぶ' = 48
+'べ' = 49
+'ぼ' = 4A
+'ぱ' = 4B
+'ぴ' = 4C
+'ぷ' = 4D
+'ぺ' = 4E
+'ぽ' = 4F
+'っ' = 50
+
+@ Katakana
+'ア' = 51
+'イ' = 52
+'ウ' = 53
+'エ' = 54
+'オ' = 55
+'カ' = 56
+'キ' = 57
+'ク' = 58
+'ケ' = 59
+'コ' = 5A
+'サ' = 5B
+'シ' = 5C
+'ス' = 5D
+'セ' = 5E
+'ソ' = 5F
+'タ' = 60
+'チ' = 61
+'ツ' = 62
+'テ' = 63
+'ト' = 64
+'ナ' = 65
+'ニ' = 66
+'ヌ' = 67
+'ネ' = 68
+'ノ' = 69
+'ハ' = 6A
+'ヒ' = 6B
+'フ' = 6C
+'ヘ' = 6D
+'ホ' = 6E
+'マ' = 6F
+'ミ' = 70
+'ム' = 71
+'メ' = 72
+'モ' = 73
+'ヤ' = 74
+'ユ' = 75
+'ヨ' = 76
+'ラ' = 77
+'リ' = 78
+'ル' = 79
+'レ' = 7A
+'ロ' = 7B
+'ワ' = 7C
+'ヲ' = 7D
+'ン' = 7E
+'ァ' = 7F
+'ィ' = 80
+'ゥ' = 81
+'ェ' = 82
+'ォ' = 83
+'ャ' = 84
+'ュ' = 85
+'ョ' = 86
+'ガ' = 87
+'ギ' = 88
+'グ' = 89
+'ゲ' = 8A
+'ゴ' = 8B
+'ザ' = 8C
+'ジ' = 8D
+'ズ' = 8E
+'ゼ' = 8F
+'ゾ' = 90
+'ダ' = 91
+'ヂ' = 92
+'ヅ' = 93
+'デ' = 94
+'ド' = 95
+'バ' = 96
+'ビ' = 97
+'ブ' = 98
+'ベ' = 99
+'ボ' = 9A
+'パ' = 9B
+'ピ' = 9C
+'プ' = 9D
+'ペ' = 9E
+'ポ' = 9F
+'ッ' = A0
+
+@ Japanese punctuation
+' ' = 00
+'!' = AB
+'?' = AC
+'。' = AD
+'ー' = AE
+'⋯' = B0
+
+STRING = FD
+
+@ string placeholders
+PLAYER = FD 01
+STR_VAR_1 = FD 02
+STR_VAR_2 = FD 03
+STR_VAR_3 = FD 04
+KUN = FD 05
+RIVAL = FD 06
+@ version-dependent strings (originally made for Ruby/Sapphire differences)
+@ Emerald uses the Sapphire strings (except for VERSION).
+VERSION = FD 07 @ "EMERALD"
+AQUA = FD 08
+MAGMA = FD 09
+ARCHIE = FD 0A
+MAXIE = FD 0B
+KYOGRE = FD 0C
+GROUDON = FD 0D
+
+@ battle string placeholders
+
+B_BUFF1 = FD 00
+B_BUFF2 = FD 01
+B_COPY_VAR_1 = FD 02
+B_COPY_VAR_2 = FD 03
+B_COPY_VAR_3 = FD 04
+B_PLAYER_MON1_NAME = FD 05
+B_OPPONENT_MON1_NAME = FD 06
+B_PLAYER_MON2_NAME = FD 07
+B_OPPONENT_MON2_NAME = FD 08
+B_LINK_PLAYER_MON1_NAME = FD 09
+B_LINK_OPPONENT_MON1_NAME = FD 0A
+B_LINK_PLAYER_MON2_NAME = FD 0B
+B_LINK_OPPONENT_MON2_NAME = FD 0C
+B_ATK_NAME_WITH_PREFIX_MON1 = FD 0D
+B_ATK_PARTNER_NAME = FD 0E
+B_ATK_NAME_WITH_PREFIX = FD 0F
+B_DEF_NAME_WITH_PREFIX = FD 10
+B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBattler
+B_ACTIVE_NAME_WITH_PREFIX = FD 12
+B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13
+B_CURRENT_MOVE = FD 14
+B_LAST_MOVE = FD 15
+B_LAST_ITEM = FD 16
+B_LAST_ABILITY = FD 17
+B_ATK_ABILITY = FD 18
+B_DEF_ABILITY = FD 19
+B_SCR_ACTIVE_ABILITY = FD 1A
+B_EFF_ABILITY = FD 1B
+B_TRAINER1_CLASS = FD 1C
+B_TRAINER1_NAME = FD 1D
+B_LINK_PLAYER_NAME = FD 1E
+B_LINK_PARTNER_NAME = FD 1F
+B_LINK_OPPONENT1_NAME = FD 20
+B_LINK_OPPONENT2_NAME = FD 21
+B_LINK_SCR_TRAINER_NAME = FD 22
+B_PLAYER_NAME = FD 23
+B_TRAINER1_LOSE_TEXT = FD 24
+B_TRAINER1_WIN_TEXT = FD 25
+B_26 = FD 26
+B_PC_CREATOR_NAME = FD 27
+B_ATK_PREFIX1 = FD 28
+B_DEF_PREFIX1 = FD 29
+B_ATK_PREFIX2 = FD 2A
+B_DEF_PREFIX2 = FD 2B
+B_ATK_PREFIX3 = FD 2C
+B_DEF_PREFIX3 = FD 2D
+B_TRAINER2_CLASS = FD 2E
+B_TRAINER2_NAME = FD 2F
+B_TRAINER2_LOSE_TEXT = FD 30
+B_TRAINER2_WIN_TEXT = FD 31
+B_PARTNER_CLASS = FD 32
+B_PARTNER_NAME = FD 33
+B_BUFF3 = FD 34
+
+@ indicates the end of a town/city name (before " TOWN" or " CITY")
+NAME_END = FC 00
+
+@ special 0xF7 character
+SPECIAL_F7 = F7
+
+@ more text functions
+
+COLOR = FC 01 @ use a color listed below right after
+HIGHLIGHT = FC 02 @ same as fc 01
+SHADOW = FC 03 @ same as fc 01
+COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes
+PALETTE = FC 05 @ used in credits
+SIZE = FC 06 @ note that anything other than "SMALL" is invalid
+UNKNOWN_7 = FC 07
+PAUSE = FC 08 @ manually print the wait byte after this, havent mapped them
+PAUSE_UNTIL_PRESS = FC 09
+UNKNOWN_A = FC 0A
+PLAY_BGM = FC 0B
+ESCAPE = FC 0C
+SHIFT_TEXT = FC 0D
+UNKNOWN_E = FC 0E
+UNKNOWN_F = FC 0F
+PLAY_SE = FC 10
+CLEAR = FC 11
+SKIP = FC 12
+CLEAR_TO = FC 13
+UNKNOWN_14 = FC 14
+JPN = FC 15
+ENG = FC 16
+PAUSE_MUSIC = FC 17
+RESUME_MUSIC = FC 18
+
+@ colors
+
+TRANSPARENT = 00
+WHITE = 01
+DARK_GREY = 02
+LIGHT_GREY = 03
+RED = 04
+LIGHT_RED = 05
+GREEN = 06
+LIGHT_GREEN = 07
+BLUE = 08
+LIGHT_BLUE = 09
+@ these next colors can be set to anything arbitrary at runtime
+@ usually though they'll have the textbox border colors as described below
+DYNAMIC_COLOR1 = 0A @ white
+DYNAMIC_COLOR2 = 0B @ white with a tinge of green
+DYNAMIC_COLOR3 = 0C @ white 2
+DYNAMIC_COLOR4 = 0D @ aquamarine
+DYNAMIC_COLOR5 = 0E @ blue-green
+DYNAMIC_COLOR6 = 0F @ cerulean
+
+@ sound and music
+
+MUS_DUMMY = 00 00
+SE_KAIFUKU = 01 00
+SE_PC_LOGIN = 02 00
+SE_PC_OFF = 03 00
+SE_PC_ON = 04 00
+SE_SELECT = 05 00
+SE_WIN_OPEN = 06 00
+SE_WALL_HIT = 07 00
+SE_DOOR = 08 00
+SE_KAIDAN = 09 00
+SE_DANSA = 0A 00
+SE_JITENSYA = 0B 00
+SE_KOUKA_L = 0C 00
+SE_KOUKA_M = 0D 00
+SE_KOUKA_H = 0E 00
+SE_BOWA2 = 0F 00
+SE_POKE_DEAD = 10 00
+SE_NIGERU = 11 00
+SE_JIDO_DOA = 12 00
+SE_NAMINORI = 13 00
+SE_BAN = 14 00
+SE_PIN = 15 00
+SE_BOO = 16 00
+SE_BOWA = 17 00
+SE_JYUNI = 18 00
+SE_A = 19 00
+SE_I = 1A 00
+SE_U = 1B 00
+SE_E = 1C 00
+SE_O = 1D 00
+SE_N = 1E 00
+SE_SEIKAI = 1F 00
+SE_HAZURE = 20 00
+SE_EXP = 21 00
+SE_JITE_PYOKO = 22 00
+SE_MU_PACHI = 23 00
+SE_TK_KASYA = 24 00
+SE_FU_ZAKU = 25 00
+SE_FU_ZAKU2 = 26 00
+SE_FU_ZUZUZU = 27 00
+SE_RU_GASHIN = 28 00
+SE_RU_GASYAN = 29 00
+SE_RU_BARI = 2A 00
+SE_RU_HYUU = 2B 00
+SE_KI_GASYAN = 2C 00
+SE_TK_WARPIN = 2D 00
+SE_TK_WARPOUT = 2E 00
+SE_TU_SAA = 2F 00
+SE_HI_TURUN = 30 00
+SE_TRACK_MOVE = 31 00
+SE_TRACK_STOP = 32 00
+SE_TRACK_HAIKI = 33 00
+SE_TRACK_DOOR = 34 00
+SE_MOTER = 35 00
+SE_CARD = 36 00
+SE_SAVE = 37 00
+SE_KON = 38 00
+SE_KON2 = 39 00
+SE_KON3 = 3A 00
+SE_KON4 = 3B 00
+SE_SUIKOMU = 3C 00
+SE_NAGERU = 3D 00
+SE_TOY_C = 3E 00
+SE_TOY_D = 3F 00
+SE_TOY_E = 40 00
+SE_TOY_F = 41 00
+SE_TOY_G = 42 00
+SE_TOY_A = 43 00
+SE_TOY_B = 44 00
+SE_TOY_C1 = 45 00
+SE_MIZU = 46 00
+SE_HASHI = 47 00
+SE_DAUGI = 48 00
+SE_PINPON = 49 00
+SE_FUUSEN1 = 4A 00
+SE_FUUSEN2 = 4B 00
+SE_FUUSEN3 = 4C 00
+SE_TOY_KABE = 4D 00
+SE_TOY_DANGO = 4E 00
+SE_DOKU = 4F 00
+SE_ESUKA = 50 00
+SE_T_AME = 51 00
+SE_T_AME_E = 52 00
+SE_T_OOAME = 53 00
+SE_T_OOAME_E = 54 00
+SE_T_KOAME = 55 00
+SE_T_KOAME_E = 56 00
+SE_T_KAMI = 57 00
+SE_T_KAMI2 = 58 00
+SE_ELEBETA = 59 00
+SE_HINSI = 5A 00
+SE_EXPMAX = 5B 00
+SE_TAMAKORO = 5C 00
+SE_TAMAKORO_E = 5D 00
+SE_BASABASA = 5E 00
+SE_REGI = 5F 00
+SE_C_GAJI = 60 00
+SE_C_MAKU_U = 61 00
+SE_C_MAKU_D = 62 00
+SE_C_PASI = 63 00
+SE_C_SYU = 64 00
+SE_C_PIKON = 65 00
+SE_REAPOKE = 66 00
+SE_OP_BASYU = 67 00
+SE_BT_START = 68 00
+SE_DENDOU = 69 00
+SE_JIHANKI = 6A 00
+SE_TAMA = 6B 00
+SE_Z_SCROLL = 6C 00
+SE_Z_PAGE = 6D 00
+SE_PN_ON = 6E 00
+SE_PN_OFF = 6F 00
+SE_Z_SEARCH = 70 00
+SE_TAMAGO = 71 00
+SE_TB_START = 72 00
+SE_TB_KON = 73 00
+SE_TB_KARA = 74 00
+SE_BIDORO = 75 00
+SE_W085 = 76 00
+SE_W085B = 77 00
+SE_W231 = 78 00
+SE_W171 = 79 00
+SE_W233 = 7A 00
+SE_W233B = 7B 00
+SE_W145 = 7C 00
+SE_W145B = 7D 00
+SE_W145C = 7E 00
+SE_W240 = 7F 00
+SE_W015 = 80 00
+SE_W081 = 81 00
+SE_W081B = 82 00
+SE_W088 = 83 00
+SE_W016 = 84 00
+SE_W016B = 85 00
+SE_W003 = 86 00
+SE_W104 = 87 00
+SE_W013 = 88 00
+SE_W196 = 89 00
+SE_W086 = 8A 00
+SE_W004 = 8B 00
+SE_W025 = 8C 00
+SE_W025B = 8D 00
+SE_W152 = 8E 00
+SE_W026 = 8F 00
+SE_W172 = 90 00
+SE_W172B = 91 00
+SE_W053 = 92 00
+SE_W007 = 93 00
+SE_W092 = 94 00
+SE_W221 = 95 00
+SE_W221B = 96 00
+SE_W052 = 97 00
+SE_W036 = 98 00
+SE_W059 = 99 00
+SE_W059B = 9A 00
+SE_W010 = 9B 00
+SE_W011 = 9C 00
+SE_W017 = 9D 00
+SE_W019 = 9E 00
+SE_W028 = 9F 00
+SE_W013B = A0 00
+SE_W044 = A1 00
+SE_W029 = A2 00
+SE_W057 = A3 00
+SE_W056 = A4 00
+SE_W250 = A5 00
+SE_W030 = A6 00
+SE_W039 = A7 00
+SE_W054 = A8 00
+SE_W077 = A9 00
+SE_W020 = AA 00
+SE_W082 = AB 00
+SE_W047 = AC 00
+SE_W195 = AD 00
+SE_W006 = AE 00
+SE_W091 = AF 00
+SE_W146 = B0 00
+SE_W120 = B1 00
+SE_W153 = B2 00
+SE_W071B = B3 00
+SE_W071 = B4 00
+SE_W103 = B5 00
+SE_W062 = B6 00
+SE_W062B = B7 00
+SE_W048 = B8 00
+SE_W187 = B9 00
+SE_W118 = BA 00
+SE_W155 = BB 00
+SE_W122 = BC 00
+SE_W060 = BD 00
+SE_W185 = BE 00
+SE_W014 = BF 00
+SE_W043 = C0 00
+SE_W207 = C1 00
+SE_W207B = C2 00
+SE_W215 = C3 00
+SE_W109 = C4 00
+SE_W173 = C5 00
+SE_W280 = C6 00
+SE_W202 = C7 00
+SE_W060B = C8 00
+SE_W076 = C9 00
+SE_W080 = CA 00
+SE_W100 = CB 00
+SE_W107 = CC 00
+SE_W166 = CD 00
+SE_W129 = CE 00
+SE_W115 = CF 00
+SE_W112 = D0 00
+SE_W197 = D1 00
+SE_W199 = D2 00
+SE_W236 = D3 00
+SE_W204 = D4 00
+SE_W268 = D5 00
+SE_W070 = D6 00
+SE_W063 = D7 00
+SE_W127 = D8 00
+SE_W179 = D9 00
+SE_W151 = DA 00
+SE_W201 = DB 00
+SE_W161 = DC 00
+SE_W161B = DD 00
+SE_W227 = DE 00
+SE_W227B = DF 00
+SE_W226 = E0 00
+SE_W208 = E1 00
+SE_W213 = E2 00
+SE_W213B = E3 00
+SE_W234 = E4 00
+SE_W260 = E5 00
+SE_W328 = E6 00
+SE_W320 = E7 00
+SE_W255 = E8 00
+SE_W291 = E9 00
+SE_W089 = EA 00
+SE_W239 = EB 00
+SE_W230 = EC 00
+SE_W281 = ED 00
+SE_W327 = EE 00
+SE_W287 = EF 00
+SE_W257 = F0 00
+SE_W253 = F1 00
+SE_W258 = F2 00
+SE_W322 = F3 00
+SE_W298 = F4 00
+SE_W287B = F5 00
+SE_W114 = F6 00
+SE_W063B = F7 00
+SE_RG_W_DOOR = F8 00
+SE_RG_CARD1 = F9 00
+SE_RG_CARD2 = FA 00
+SE_RG_CARD3 = FB 00
+SE_RG_BAG1 = FC 00
+SE_RG_BAG2 = FD 00
+SE_RG_GETTING = FE 00
+SE_RG_SHOP = FF 00
+SE_RG_KITEKI = 00 01
+SE_RG_HELP_OP = 01 01
+SE_RG_HELP_CL = 02 01
+SE_RG_HELP_NG = 03 01
+SE_RG_DEOMOV = 04 01
+SE_RG_EXCELLENT = 05 01
+SE_RG_NAWAMISS = 06 01
+SE_TOREEYE = 07 01
+SE_TOREOFF = 08 01
+SE_HANTEI1 = 09 01
+SE_HANTEI2 = 0A 01
+SE_CURTAIN = 0B 01
+SE_CURTAIN1 = 0C 01
+SE_USSOKI = 0D 01
+MUS_TETSUJI = 5E 01
+MUS_FIELD13 = 5F 01
+MUS_KACHI22 = 60 01
+MUS_KACHI2 = 61 01
+MUS_KACHI3 = 62 01
+MUS_KACHI5 = 63 01
+MUS_PCC = 64 01
+MUS_NIBI = 65 01
+MUS_SUIKUN = 66 01
+MUS_DOORO1 = 67 01
+MUS_DOORO_X1 = 68 01
+MUS_DOORO_X3 = 69 01
+MUS_MACHI_S2 = 6A 01
+MUS_MACHI_S4 = 6B 01
+MUS_GIM = 6C 01
+MUS_NAMINORI = 6D 01
+MUS_DAN01 = 6E 01
+MUS_FANFA1 = 6F 01
+MUS_ME_ASA = 70 01
+MUS_ME_BACHI = 71 01
+MUS_FANFA4 = 72 01
+MUS_FANFA5 = 73 01
+MUS_ME_WAZA = 74 01
+MUS_BIJYUTU = 75 01
+MUS_DOORO_X4 = 76 01
+MUS_FUNE_KAN = 77 01
+MUS_ME_SHINKA = 78 01
+MUS_SHINKA = 79 01
+MUS_ME_WASURE = 7A 01
+MUS_SYOUJOEYE = 7B 01
+MUS_BOYEYE = 7C 01
+MUS_DAN02 = 7D 01
+MUS_MACHI_S3 = 7E 01
+MUS_ODAMAKI = 7F 01
+MUS_B_TOWER = 80 01
+MUS_SWIMEYE = 81 01
+MUS_DAN03 = 82 01
+MUS_ME_KINOMI = 83 01
+MUS_ME_TAMA = 84 01
+MUS_ME_B_BIG = 85 01
+MUS_ME_B_SMALL = 86 01
+MUS_ME_ZANNEN = 87 01
+MUS_BD_TIME = 88 01
+MUS_TEST1 = 89 01
+MUS_TEST2 = 8A 01
+MUS_TEST3 = 8B 01
+MUS_TEST4 = 8C 01
+MUS_TEST = 8D 01
+MUS_GOMACHI0 = 8E 01
+MUS_GOTOWN = 8F 01
+MUS_POKECEN = 90 01
+MUS_NEXTROAD = 91 01
+MUS_GRANROAD = 92 01
+MUS_CYCLING = 93 01
+MUS_FRIENDLY = 94 01
+MUS_MISHIRO = 95 01
+MUS_TOZAN = 96 01
+MUS_GIRLEYE = 97 01
+MUS_MINAMO = 98 01
+MUS_ASHROAD = 99 01
+MUS_EVENT0 = 9A 01
+MUS_DEEPDEEP = 9B 01
+MUS_KACHI1 = 9C 01
+MUS_TITLE3 = 9D 01
+MUS_DEMO1 = 9E 01
+MUS_GIRL_SUP = 9F 01
+MUS_HAGESHII = A0 01
+MUS_KAKKOII = A1 01
+MUS_KAZANBAI = A2 01
+MUS_AQA_0 = A3 01
+MUS_TSURETEK = A4 01
+MUS_BOY_SUP = A5 01
+MUS_RAINBOW = A6 01
+MUS_AYASII = A7 01
+MUS_KACHI4 = A8 01
+MUS_ROPEWAY = A9 01
+MUS_CASINO = AA 01
+MUS_HIGHTOWN = AB 01
+MUS_SAFARI = AC 01
+MUS_C_ROAD = AD 01
+MUS_AJITO = AE 01
+MUS_M_BOAT = AF 01
+MUS_M_DUNGON = B0 01
+MUS_FINECITY = B1 01
+MUS_MACHUPI = B2 01
+MUS_P_SCHOOL = B3 01
+MUS_DENDOU = B4 01
+MUS_TONEKUSA = B5 01
+MUS_MABOROSI = B6 01
+MUS_CON_FAN = B7 01
+MUS_CONTEST0 = B8 01
+MUS_MGM0 = B9 01
+MUS_T_BATTLE = BA 01
+MUS_OOAME = BB 01
+MUS_HIDERI = BC 01
+MUS_RUNECITY = BD 01
+MUS_CON_K = BE 01
+MUS_EIKOU_R = BF 01
+MUS_KARAKURI = C0 01
+MUS_HUTAGO = C1 01
+MUS_SITENNOU = C2 01
+MUS_YAMA_EYE = C3 01
+MUS_CONLOBBY = C4 01
+MUS_INTER_V = C5 01
+MUS_DAIGO = C6 01
+MUS_THANKFOR = C7 01
+MUS_END = C8 01
+MUS_B_FRONTIER = C9 01
+MUS_B_ARENA = CA 01
+MUS_ME_POINTGET = CB 01
+MUS_ME_TORE_EYE = CC 01
+MUS_PYRAMID = CD 01
+MUS_PYRAMID_TOP = CE 01
+MUS_B_PALACE = CF 01
+MUS_REKKUU_KOURIN = D0 01
+MUS_SATTOWER = D1 01
+MUS_ME_SYMBOLGET = D2 01
+MUS_B_DOME = D3 01
+MUS_B_TUBE = D4 01
+MUS_B_FACTORY = D5 01
+MUS_VS_REKKU = D6 01
+MUS_VS_FRONT = D7 01
+MUS_VS_MEW = D8 01
+MUS_B_DOME1 = D9 01
+MUS_BATTLE27 = DA 01
+MUS_BATTLE31 = DB 01
+MUS_BATTLE20 = DC 01
+MUS_BATTLE32 = DD 01
+MUS_BATTLE33 = DE 01
+MUS_BATTLE36 = DF 01
+MUS_BATTLE34 = E0 01
+MUS_BATTLE35 = E1 01
+MUS_BATTLE38 = E2 01
+MUS_BATTLE30 = E3 01
+MUS_RG_ANNAI = E4 01
+MUS_RG_SLOT = E5 01
+MUS_RG_AJITO = E6 01
+MUS_RG_GYM = E7 01
+MUS_RG_PURIN = E8 01
+MUS_RG_DEMO = E9 01
+MUS_RG_TITLE = EA 01
+MUS_RG_GUREN = EB 01
+MUS_RG_SHION = EC 01
+MUS_RG_KAIHUKU = ED 01
+MUS_RG_CYCLING = EE 01
+MUS_RG_ROCKET = EF 01
+MUS_RG_SHOUJO = F0 01
+MUS_RG_SHOUNEN = F1 01
+MUS_RG_DENDOU = F2 01
+MUS_RG_T_MORI = F3 01
+MUS_RG_OTSUKIMI = F4 01
+MUS_RG_POKEYASHI = F5 01
+MUS_RG_ENDING = F6 01
+MUS_RG_LOAD01 = F7 01
+MUS_RG_OPENING = F8 01
+MUS_RG_LOAD02 = F9 01
+MUS_RG_LOAD03 = FA 01
+MUS_RG_CHAMP_R = FB 01
+MUS_RG_VS_GYM = FC 01
+MUS_RG_VS_TORE = FD 01
+MUS_RG_VS_YASEI = FE 01
+MUS_RG_VS_LAST = FF 01
+MUS_RG_MASARA = 00 02
+MUS_RG_KENKYU = 01 02
+MUS_RG_OHKIDO = 02 02
+MUS_RG_POKECEN = 03 02
+MUS_RG_SANTOAN = 04 02
+MUS_RG_NAMINORI = 05 02
+MUS_RG_P_TOWER = 06 02
+MUS_RG_SHIRUHU = 07 02
+MUS_RG_HANADA = 08 02
+MUS_RG_TAMAMUSI = 09 02
+MUS_RG_WIN_TRE = 0A 02
+MUS_RG_WIN_YASEI = 0B 02
+MUS_RG_WIN_GYM = 0C 02
+MUS_RG_KUCHIBA = 0D 02
+MUS_RG_NIBI = 0E 02
+MUS_RG_RIVAL1 = 0F 02
+MUS_RG_RIVAL2 = 10 02
+MUS_RG_FAN2 = 11 02
+MUS_RG_FAN5 = 12 02
+MUS_RG_FAN6 = 13 02
+MUS_ME_RG_PHOTO = 14 02
+MUS_RG_TITLEROG = 15 02
+MUS_RG_GET_YASEI = 16 02
+MUS_RG_SOUSA = 17 02
+MUS_RG_SEKAIKAN = 18 02
+MUS_RG_SEIBETU = 19 02
+MUS_RG_JUMP = 1A 02
+MUS_RG_UNION = 1B 02
+MUS_RG_NETWORK = 1C 02
+MUS_RG_OKURIMONO = 1D 02
+MUS_RG_KINOMIKUI = 1E 02
+MUS_RG_NANADUNGEON = 1F 02
+MUS_RG_OSHIE_TV = 20 02
+MUS_RG_NANASHIMA = 21 02
+MUS_RG_NANAISEKI = 22 02
+MUS_RG_NANA123 = 23 02
+MUS_RG_NANA45 = 24 02
+MUS_RG_NANA67 = 25 02
+MUS_RG_POKEFUE = 26 02
+MUS_RG_VS_DEO = 27 02
+MUS_RG_VS_MYU2 = 28 02
+MUS_RG_VS_DEN = 29 02
+MUS_RG_EXEYE = 2A 02
+MUS_RG_DEOEYE = 2B 02
+MUS_RG_T_TOWER = 2C 02
+MUS_RG_SLOWMASARA = 2D 02
+MUS_RG_TVNOIZE = 2E 02
+PH_TRAP_BLEND = 2F 02
+PH_TRAP_HELD = 30 02
+PH_TRAP_SOLO = 31 02
+PH_FACE_BLEND = 32 02
+PH_FACE_HELD = 33 02
+PH_FACE_SOLO = 34 02
+PH_CLOTH_BLEND = 35 02
+PH_CLOTH_HELD = 36 02
+PH_CLOTH_SOLO = 37 02
+PH_DRESS_BLEND = 38 02
+PH_DRESS_HELD = 39 02
+PH_DRESS_SOLO = 3A 02
+PH_FLEECE_BLEND = 3B 02
+PH_FLEECE_HELD = 3C 02
+PH_FLEECE_SOLO = 3D 02
+PH_KIT_BLEND = 3E 02
+PH_KIT_HELD = 3F 02
+PH_KIT_SOLO = 40 02
+PH_PRICE_BLEND = 41 02
+PH_PRICE_HELD = 42 02
+PH_PRICE_SOLO = 43 02
+PH_LOT_BLEND = 44 02
+PH_LOT_HELD = 45 02
+PH_LOT_SOLO = 46 02
+PH_GOAT_BLEND = 47 02
+PH_GOAT_HELD = 48 02
+PH_GOAT_SOLO = 49 02
+PH_THOUGHT_BLEND = 4A 02
+PH_THOUGHT_HELD = 4B 02
+PH_THOUGHT_SOLO = 4C 02
+PH_CHOICE_BLEND = 4D 02
+PH_CHOICE_HELD = 4E 02
+PH_CHOICE_SOLO = 4F 02
+PH_MOUTH_BLEND = 50 02
+PH_MOUTH_HELD = 51 02
+PH_MOUTH_SOLO = 52 02
+PH_FOOT_BLEND = 53 02
+PH_FOOT_HELD = 54 02
+PH_FOOT_SOLO = 55 02
+PH_GOOSE_BLEND = 56 02
+PH_GOOSE_HELD = 57 02
+PH_GOOSE_SOLO = 58 02
+PH_STRUT_BLEND = 59 02
+PH_STRUT_HELD = 5A 02
+PH_STRUT_SOLO = 5B 02
+PH_CURE_BLEND = 5C 02
+PH_CURE_HELD = 5D 02
+PH_CURE_SOLO = 5E 02
+PH_NURSE_BLEND = 5F 02
+PH_NURSE_HELD = 60 02
+PH_NURSE_SOLO = 61 02
+
+A_BUTTON = F8 00
+B_BUTTON = F8 01
+DPAD_UPDOWN = F8 0A
+DPAD_NONE = F8 0C
+
+UP_ARROW_2 = F9 00
+DOWN_ARROW_2 = F9 01
+LEFT_ARROW_2 = F9 02
+RIGHT_ARROW_2 = F9 03
+PLUS = F9 04
+LV_2 = F9 05
+PP = F9 06
+ID = F9 07
+NO = F9 08
+UNDERSCORE = F9 09
+CIRCLE_1 = F9 0A
+CIRCLE_2 = F9 0B
+CIRCLE_3 = F9 0C
+CIRCLE_4 = F9 0D
+CIRCLE_5 = F9 0E
+CIRCLE_6 = F9 0F
+CIRCLE_7 = F9 10
+CIRCLE_8 = F9 11
+CIRCLE_9 = F9 12
+ROUND_LEFT_PAREN = F9 13
+ROUND_RIGHT_PAREN = F9 14
+CIRCLE_DOT = F9 15
+TRIANGLE = F9 16
+BIG_MULT_X = F9 17
+
+EMOJI_UNDERSCORE = F9 D0
+EMOJI_PIPE = F9 D1
+EMOJI_HIGHBAR = F9 D2
+EMOJI_TILDE = F9 D3
+EMOJI_LEFT_PAREN = F9 D4
+EMOJI_RIGHT_PAREN = F9 D5
+EMOJI_UNION = F9 D6 @ ⊂
+EMOJI_GREATER_THAN = F9 D7
+EMOJI_LEFT_EYE = F9 D8
+EMOJI_RIGHT_EYE = F9 D9
+EMOJI_AT = F9 DA
+EMOJI_SEMICOLON = F9 DB
+EMOJI_PLUS = F9 DC
+EMOJI_MINUS = F9 DD
+EMOJI_EQUALS = F9 DE
+EMOJI_SPIRAL = F9 DF
+EMOJI_TONGUE = F9 E0
+EMOJI_TRIANGLE_OUTLINE = F9 E1
+EMOJI_ACUTE = F9 E2
+EMOJI_GRAVE = F9 E3
+EMOJI_CIRCLE = F9 E4
+EMOJI_TRIANGLE = F9 E5
+EMOJI_SQUARE = F9 E6
+EMOJI_HEART = F9 E7
+EMOJI_MOON = F9 E8
+EMOJI_NOTE = F9 E9
+EMOJI_BALL = F9 EA
+EMOJI_BOLT = F9 EB
+EMOJI_LEAF = F9 EC
+EMOJI_FIRE = F9 ED
+EMOJI_WATER = F9 EE
+EMOJI_LEFT_FIST = F9 EF
+EMOJI_RIGHT_FIST = F9 F0
+EMOJI_BIGWHEEL = F9 F1
+EMOJI_SMALLWHEEL = F9 F2
+EMOJI_SPHERE = F9 F3
+EMOJI_IRRITATED = F9 F4
+EMOJI_MISCHIEVOUS = F9 F5
+EMOJI_HAPPY = F9 F6
+EMOJI_ANGRY = F9 F7
+EMOJI_SURPRISED = F9 F8
+EMOJI_BIGSMILE = F9 F9
+EMOJI_EVIL = F9 FA
+EMOJI_TIRED = F9 FB
+EMOJI_NEUTRAL = F9 FC
+EMOJI_SHOCKED = F9 FD
+EMOJI_BIGANGER = F9 FE
+
+'\l' = FA @ scroll up window text
+'\p' = FB @ new paragraph
+'\n' = FE @ new line
diff --git a/berry_fix/payload/common_syms/agb_flash.txt b/berry_fix/payload/common_syms/agb_flash.txt
new file mode 100644
index 000000000..cb421ec80
--- /dev/null
+++ b/berry_fix/payload/common_syms/agb_flash.txt
@@ -0,0 +1,10 @@
+gFlashTimeoutFlag
+PollFlashStatus
+WaitForFlashWrite
+ProgramFlashSector
+gFlash
+ProgramFlashByte
+gFlashNumRemainingBytes
+EraseFlashChip
+EraseFlashSector
+gFlashMaxTime
diff --git a/berry_fix/payload/common_syms/main.txt b/berry_fix/payload/common_syms/main.txt
new file mode 100644
index 000000000..b62c72124
--- /dev/null
+++ b/berry_fix/payload/common_syms/main.txt
@@ -0,0 +1,9 @@
+gIntrTable
+gHeldKeys
+gNewKeys
+gIntrVector
+gUpdateSuccessful
+gUnknown_3001194
+gUnknown_30011A0
+gMainCallbackState
+gGameVersion
diff --git a/berry_fix/payload/common_syms/rtc.txt b/berry_fix/payload/common_syms/rtc.txt
new file mode 100644
index 000000000..7aafbe65d
--- /dev/null
+++ b/berry_fix/payload/common_syms/rtc.txt
@@ -0,0 +1,2 @@
+gTimeSinceBerryUpdate
+gRtcUTCTime
diff --git a/berry_fix/payload/constants/gba_constants.inc b/berry_fix/payload/constants/gba_constants.inc
new file mode 100644
index 000000000..9d59c8fcd
--- /dev/null
+++ b/berry_fix/payload/constants/gba_constants.inc
@@ -0,0 +1,490 @@
+ .set PSR_USR_MODE, 0x00000010
+ .set PSR_FIQ_MODE, 0x00000011
+ .set PSR_IRQ_MODE, 0x00000012
+ .set PSR_SVC_MODE, 0x00000013
+ .set PSR_ABT_MODE, 0x00000017
+ .set PSR_UND_MODE, 0x0000001b
+ .set PSR_SYS_MODE, 0x0000001f
+ .set PSR_MODE_MASK, 0x0000001f
+ .set PSR_T_BIT, 0x00000020
+ .set PSR_F_BIT, 0x00000040
+ .set PSR_I_BIT, 0x00000080
+
+ .set EWRAM_START, 0x02000000
+ .set EWRAM_END, EWRAM_START + 0x40000
+ .set IWRAM_START, 0x03000000
+ .set IWRAM_END, IWRAM_START + 0x8000
+
+ .set PLTT, 0x5000000
+ .set BG_PLTT, PLTT
+ .set OBJ_PLTT, PLTT + 0x200
+
+ .set VRAM, 0x6000000
+ .set BG_VRAM, VRAM
+ .set OBJ_VRAM0, VRAM + 0x10000 @ text-mode BG
+ .set OBJ_VRAM1, VRAM + 0x14000 @ bitmap-mode BG
+
+ .set OAM, 0x7000000
+
+ .set SOUND_INFO_PTR, 0x3007FF0
+ .set INTR_CHECK, 0x3007FF8
+ .set INTR_VECTOR, 0x3007FFC
+
+ .set INTR_FLAG_VBLANK, 1 << 0
+ .set INTR_FLAG_HBLANK, 1 << 1
+ .set INTR_FLAG_VCOUNT, 1 << 2
+ .set INTR_FLAG_TIMER0, 1 << 3
+ .set INTR_FLAG_TIMER1, 1 << 4
+ .set INTR_FLAG_TIMER2, 1 << 5
+ .set INTR_FLAG_TIMER3, 1 << 6
+ .set INTR_FLAG_SERIAL, 1 << 7
+ .set INTR_FLAG_DMA0, 1 << 8
+ .set INTR_FLAG_DMA1, 1 << 9
+ .set INTR_FLAG_DMA2, 1 << 10
+ .set INTR_FLAG_DMA3, 1 << 11
+ .set INTR_FLAG_KEYPAD, 1 << 12
+ .set INTR_FLAG_GAMEPAK, 1 << 13
+
+ .set VCOUNT_VBLANK, 160
+ .set TOTAL_SCANLINES, 228
+
+ .set REG_BASE, 0x4000000 @ I/O register base address
+
+@ I/O register offsets
+ .set OFFSET_REG_DISPCNT, 0x0
+ .set OFFSET_REG_DISPSTAT, 0x4
+ .set OFFSET_REG_VCOUNT, 0x6
+ .set OFFSET_REG_BG0CNT, 0x8
+ .set OFFSET_REG_BG1CNT, 0xa
+ .set OFFSET_REG_BG2CNT, 0xc
+ .set OFFSET_REG_BG3CNT, 0xe
+ .set OFFSET_REG_BG0HOFS, 0x10
+ .set OFFSET_REG_BG0VOFS, 0x12
+ .set OFFSET_REG_BG1HOFS, 0x14
+ .set OFFSET_REG_BG1VOFS, 0x16
+ .set OFFSET_REG_BG2HOFS, 0x18
+ .set OFFSET_REG_BG2VOFS, 0x1a
+ .set OFFSET_REG_BG3HOFS, 0x1c
+ .set OFFSET_REG_BG3VOFS, 0x1e
+ .set OFFSET_REG_BG2PA, 0x20
+ .set OFFSET_REG_BG2PB, 0x22
+ .set OFFSET_REG_BG2PC, 0x24
+ .set OFFSET_REG_BG2PD, 0x26
+ .set OFFSET_REG_BG2X_L, 0x28
+ .set OFFSET_REG_BG2X_H, 0x2a
+ .set OFFSET_REG_BG2Y_L, 0x2c
+ .set OFFSET_REG_BG2Y_H, 0x2e
+ .set OFFSET_REG_BG3PA, 0x30
+ .set OFFSET_REG_BG3PB, 0x32
+ .set OFFSET_REG_BG3PC, 0x34
+ .set OFFSET_REG_BG3PD, 0x36
+ .set OFFSET_REG_BG3X_L, 0x38
+ .set OFFSET_REG_BG3X_H, 0x3a
+ .set OFFSET_REG_BG3Y_L, 0x3c
+ .set OFFSET_REG_BG3Y_H, 0x3e
+ .set OFFSET_REG_WIN0H, 0x40
+ .set OFFSET_REG_WIN1H, 0x42
+ .set OFFSET_REG_WIN0V, 0x44
+ .set OFFSET_REG_WIN1V, 0x46
+ .set OFFSET_REG_WININ, 0x48
+ .set OFFSET_REG_WINOUT, 0x4a
+ .set OFFSET_REG_MOSAIC, 0x4c
+ .set OFFSET_REG_BLDCNT, 0x50
+ .set OFFSET_REG_BLDALPHA, 0x52
+ .set OFFSET_REG_BLDY, 0x54
+
+ .set OFFSET_REG_SOUND1CNT, 0x60
+ .set OFFSET_REG_SOUND1CNT_L, 0x60
+ .set OFFSET_REG_NR10, 0x60
+ .set OFFSET_REG_SOUND1CNT_H, 0x62
+ .set OFFSET_REG_NR11, 0x62
+ .set OFFSET_REG_NR12, 0x63
+ .set OFFSET_REG_SOUND1CNT_X, 0x64
+ .set OFFSET_REG_NR13, 0x64
+ .set OFFSET_REG_NR14, 0x65
+ .set OFFSET_REG_SOUND2CNT, 0x68
+ .set OFFSET_REG_SOUND2CNT_L, 0x68
+ .set OFFSET_REG_NR21, 0x68
+ .set OFFSET_REG_NR22, 0x69
+ .set OFFSET_REG_SOUND2CNT_H, 0x6c
+ .set OFFSET_REG_NR23, 0x6c
+ .set OFFSET_REG_NR24, 0x6d
+ .set OFFSET_REG_SOUND3CNT, 0x70
+ .set OFFSET_REG_SOUND3CNT_L, 0x70
+ .set OFFSET_REG_NR30, 0x70
+ .set OFFSET_REG_SOUND3CNT_H, 0x72
+ .set OFFSET_REG_NR31, 0x72
+ .set OFFSET_REG_NR32, 0x73
+ .set OFFSET_REG_SOUND3CNT_X, 0x74
+ .set OFFSET_REG_NR33, 0x74
+ .set OFFSET_REG_NR34, 0x75
+ .set OFFSET_REG_SOUND4CNT, 0x78
+ .set OFFSET_REG_SOUND4CNT_L, 0x78
+ .set OFFSET_REG_NR41, 0x78
+ .set OFFSET_REG_NR42, 0x79
+ .set OFFSET_REG_SOUND4CNT_H, 0x7c
+ .set OFFSET_REG_NR43, 0x7c
+ .set OFFSET_REG_NR44, 0x7d
+ .set OFFSET_REG_SOUNDCNT, 0x80
+ .set OFFSET_REG_SOUNDCNT_L, 0x80
+ .set OFFSET_REG_NR50, 0x80
+ .set OFFSET_REG_NR51, 0x81
+ .set OFFSET_REG_SOUNDCNT_H, 0x82
+ .set OFFSET_REG_SOUNDCNT_X, 0x84
+ .set OFFSET_REG_NR52, 0x84
+ .set OFFSET_REG_SOUNDBIAS, 0x88
+ .set OFFSET_REG_WAVE_RAM, 0x90
+ .set OFFSET_REG_WAVE_RAM0, 0x90
+ .set OFFSET_REG_WAVE_RAM0_L, 0x90
+ .set OFFSET_REG_WAVE_RAM0_H, 0x92
+ .set OFFSET_REG_WAVE_RAM1, 0x94
+ .set OFFSET_REG_WAVE_RAM1_L, 0x94
+ .set OFFSET_REG_WAVE_RAM1_H, 0x96
+ .set OFFSET_REG_WAVE_RAM2, 0x98
+ .set OFFSET_REG_WAVE_RAM2_L, 0x98
+ .set OFFSET_REG_WAVE_RAM2_H, 0x9a
+ .set OFFSET_REG_WAVE_RAM3, 0x9c
+ .set OFFSET_REG_WAVE_RAM3_L, 0x9c
+ .set OFFSET_REG_WAVE_RAM3_H, 0x9e
+ .set OFFSET_REG_FIFO, 0xa0
+ .set OFFSET_REG_FIFO_A, 0xa0
+ .set OFFSET_REG_FIFO_A_L, 0xa0
+ .set OFFSET_REG_FIFO_A_H, 0xa2
+ .set OFFSET_REG_FIFO_B, 0xa4
+ .set OFFSET_REG_FIFO_B_L, 0xa4
+ .set OFFSET_REG_FIFO_B_H, 0xa6
+
+ .set OFFSET_REG_DMA0, 0xb0
+ .set OFFSET_REG_DMA0SAD, 0xb0
+ .set OFFSET_REG_DMA0SAD_L, 0xb0
+ .set OFFSET_REG_DMA0SAD_H, 0xb2
+ .set OFFSET_REG_DMA0DAD, 0xb4
+ .set OFFSET_REG_DMA0DAD_L, 0xb4
+ .set OFFSET_REG_DMA0DAD_H, 0xb6
+ .set OFFSET_REG_DMA0CNT, 0xb8
+ .set OFFSET_REG_DMA0CNT_L, 0xb8
+ .set OFFSET_REG_DMA0CNT_H, 0xba
+ .set OFFSET_REG_DMA1, 0xbc
+ .set OFFSET_REG_DMA1SAD, 0xbc
+ .set OFFSET_REG_DMA1SAD_L, 0xbc
+ .set OFFSET_REG_DMA1SAD_H, 0xbe
+ .set OFFSET_REG_DMA1DAD, 0xc0
+ .set OFFSET_REG_DMA1DAD_L, 0xc0
+ .set OFFSET_REG_DMA1DAD_H, 0xc2
+ .set OFFSET_REG_DMA1CNT, 0xc4
+ .set OFFSET_REG_DMA1CNT_L, 0xc4
+ .set OFFSET_REG_DMA1CNT_H, 0xc6
+ .set OFFSET_REG_DMA2, 0xc8
+ .set OFFSET_REG_DMA2SAD, 0xc8
+ .set OFFSET_REG_DMA2SAD_L, 0xc8
+ .set OFFSET_REG_DMA2SAD_H, 0xca
+ .set OFFSET_REG_DMA2DAD, 0xcc
+ .set OFFSET_REG_DMA2DAD_L, 0xcc
+ .set OFFSET_REG_DMA2DAD_H, 0xce
+ .set OFFSET_REG_DMA2CNT, 0xd0
+ .set OFFSET_REG_DMA2CNT_L, 0xd0
+ .set OFFSET_REG_DMA2CNT_H, 0xd2
+ .set OFFSET_REG_DMA3, 0xd4
+ .set OFFSET_REG_DMA3SAD, 0xd4
+ .set OFFSET_REG_DMA3SAD_L, 0xd4
+ .set OFFSET_REG_DMA3SAD_H, 0xd6
+ .set OFFSET_REG_DMA3DAD, 0xd8
+ .set OFFSET_REG_DMA3DAD_L, 0xd8
+ .set OFFSET_REG_DMA3DAD_H, 0xda
+ .set OFFSET_REG_DMA3CNT, 0xdc
+ .set OFFSET_REG_DMA3CNT_L, 0xdc
+ .set OFFSET_REG_DMA3CNT_H, 0xde
+
+ .set OFFSET_REG_TM0CNT, 0x100
+ .set OFFSET_REG_TM0CNT_L, 0x100
+ .set OFFSET_REG_TM0CNT_H, 0x102
+ .set OFFSET_REG_TM1CNT, 0x104
+ .set OFFSET_REG_TM1CNT_L, 0x104
+ .set OFFSET_REG_TM1CNT_H, 0x106
+ .set OFFSET_REG_TM2CNT, 0x108
+ .set OFFSET_REG_TM2CNT_L, 0x108
+ .set OFFSET_REG_TM2CNT_H, 0x10a
+ .set OFFSET_REG_TM3CNT, 0x10c
+ .set OFFSET_REG_TM3CNT_L, 0x10c
+ .set OFFSET_REG_TM3CNT_H, 0x10e
+
+ .set OFFSET_REG_SIOCNT, 0x128
+ .set OFFSET_REG_SIODATA8, 0x12a
+ .set OFFSET_REG_SIODATA32, 0x120
+ .set OFFSET_REG_SIOMLT_SEND, 0x12a
+ .set OFFSET_REG_SIOMLT_RECV, 0x120
+ .set OFFSET_REG_SIOMULTI0, 0x120
+ .set OFFSET_REG_SIOMULTI1, 0x122
+ .set OFFSET_REG_SIOMULTI2, 0x124
+ .set OFFSET_REG_SIOMULTI3, 0x126
+
+ .set OFFSET_REG_KEYINPUT, 0x130
+ .set OFFSET_REG_KEYCNT, 0x132
+
+ .set OFFSET_REG_RCNT, 0x134
+
+ .set OFFSET_REG_JOYCNT, 0x140
+ .set OFFSET_REG_JOYSTAT, 0x158
+ .set OFFSET_REG_JOY_RECV, 0x150
+ .set OFFSET_REG_JOY_RECV_L, 0x150
+ .set OFFSET_REG_JOY_RECV_H, 0x152
+ .set OFFSET_REG_JOY_TRANS, 0x154
+ .set OFFSET_REG_JOY_TRANS_L, 0x154
+ .set OFFSET_REG_JOY_TRANS_H, 0x156
+
+ .set OFFSET_REG_IME, 0x208
+ .set OFFSET_REG_IE, 0x200
+ .set OFFSET_REG_IF, 0x202
+
+ .set OFFSET_REG_WAITCNT, 0x204
+
+@ I/O register addresses
+ .set REG_DISPCNT, REG_BASE + OFFSET_REG_DISPCNT
+ .set REG_DISPSTAT, REG_BASE + OFFSET_REG_DISPSTAT
+ .set REG_VCOUNT, REG_BASE + OFFSET_REG_VCOUNT
+ .set REG_BG0CNT, REG_BASE + OFFSET_REG_BG0CNT
+ .set REG_BG1CNT, REG_BASE + OFFSET_REG_BG1CNT
+ .set REG_BG2CNT, REG_BASE + OFFSET_REG_BG2CNT
+ .set REG_BG3CNT, REG_BASE + OFFSET_REG_BG3CNT
+ .set REG_BG0HOFS, REG_BASE + OFFSET_REG_BG0HOFS
+ .set REG_BG0VOFS, REG_BASE + OFFSET_REG_BG0VOFS
+ .set REG_BG1HOFS, REG_BASE + OFFSET_REG_BG1HOFS
+ .set REG_BG1VOFS, REG_BASE + OFFSET_REG_BG1VOFS
+ .set REG_BG2HOFS, REG_BASE + OFFSET_REG_BG2HOFS
+ .set REG_BG2VOFS, REG_BASE + OFFSET_REG_BG2VOFS
+ .set REG_BG3HOFS, REG_BASE + OFFSET_REG_BG3HOFS
+ .set REG_BG3VOFS, REG_BASE + OFFSET_REG_BG3VOFS
+ .set REG_BG2PA, REG_BASE + OFFSET_REG_BG2PA
+ .set REG_BG2PB, REG_BASE + OFFSET_REG_BG2PB
+ .set REG_BG2PC, REG_BASE + OFFSET_REG_BG2PC
+ .set REG_BG2PD, REG_BASE + OFFSET_REG_BG2PD
+ .set REG_BG2X_L, REG_BASE + OFFSET_REG_BG2X_L
+ .set REG_BG2X_H, REG_BASE + OFFSET_REG_BG2X_H
+ .set REG_BG2Y_L, REG_BASE + OFFSET_REG_BG2Y_L
+ .set REG_BG2Y_H, REG_BASE + OFFSET_REG_BG2Y_H
+ .set REG_BG3PA, REG_BASE + OFFSET_REG_BG3PA
+ .set REG_BG3PB, REG_BASE + OFFSET_REG_BG3PB
+ .set REG_BG3PC, REG_BASE + OFFSET_REG_BG3PC
+ .set REG_BG3PD, REG_BASE + OFFSET_REG_BG3PD
+ .set REG_BG3X_L, REG_BASE + OFFSET_REG_BG3X_L
+ .set REG_BG3X_H, REG_BASE + OFFSET_REG_BG3X_H
+ .set REG_BG3Y_L, REG_BASE + OFFSET_REG_BG3Y_L
+ .set REG_BG3Y_H, REG_BASE + OFFSET_REG_BG3Y_H
+ .set REG_WIN0H, REG_BASE + OFFSET_REG_WIN0H
+ .set REG_WIN1H, REG_BASE + OFFSET_REG_WIN1H
+ .set REG_WIN0V, REG_BASE + OFFSET_REG_WIN0V
+ .set REG_WIN1V, REG_BASE + OFFSET_REG_WIN1V
+ .set REG_WININ, REG_BASE + OFFSET_REG_WININ
+ .set REG_WINOUT, REG_BASE + OFFSET_REG_WINOUT
+ .set REG_MOSAIC, REG_BASE + OFFSET_REG_MOSAIC
+ .set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT
+ .set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA
+ .set REG_BLDY, REG_BASE + OFFSET_REG_BLDY
+
+ .set REG_SOUND1CNT, REG_BASE + OFFSET_REG_SOUND1CNT
+ .set REG_SOUND1CNT_L, REG_BASE + OFFSET_REG_SOUND1CNT_L
+ .set REG_NR10, REG_BASE + OFFSET_REG_NR10
+ .set REG_SOUND1CNT_H, REG_BASE + OFFSET_REG_SOUND1CNT_H
+ .set REG_NR11, REG_BASE + OFFSET_REG_NR11
+ .set REG_NR12, REG_BASE + OFFSET_REG_NR12
+ .set REG_SOUND1CNT_X, REG_BASE + OFFSET_REG_SOUND1CNT_X
+ .set REG_NR13, REG_BASE + OFFSET_REG_NR13
+ .set REG_NR14, REG_BASE + OFFSET_REG_NR14
+ .set REG_SOUND2CNT, REG_BASE + OFFSET_REG_SOUND2CNT
+ .set REG_SOUND2CNT_L, REG_BASE + OFFSET_REG_SOUND2CNT_L
+ .set REG_NR21, REG_BASE + OFFSET_REG_NR21
+ .set REG_NR22, REG_BASE + OFFSET_REG_NR22
+ .set REG_SOUND2CNT_H, REG_BASE + OFFSET_REG_SOUND2CNT_H
+ .set REG_NR23, REG_BASE + OFFSET_REG_NR23
+ .set REG_NR24, REG_BASE + OFFSET_REG_NR24
+ .set REG_SOUND3CNT, REG_BASE + OFFSET_REG_SOUND3CNT
+ .set REG_SOUND3CNT_L, REG_BASE + OFFSET_REG_SOUND3CNT_L
+ .set REG_NR30, REG_BASE + OFFSET_REG_NR30
+ .set REG_SOUND3CNT_H, REG_BASE + OFFSET_REG_SOUND3CNT_H
+ .set REG_NR31, REG_BASE + OFFSET_REG_NR31
+ .set REG_NR32, REG_BASE + OFFSET_REG_NR32
+ .set REG_SOUND3CNT_X, REG_BASE + OFFSET_REG_SOUND3CNT_X
+ .set REG_NR33, REG_BASE + OFFSET_REG_NR33
+ .set REG_NR34, REG_BASE + OFFSET_REG_NR34
+ .set REG_SOUND4CNT, REG_BASE + OFFSET_REG_SOUND4CNT
+ .set REG_SOUND4CNT_L, REG_BASE + OFFSET_REG_SOUND4CNT_L
+ .set REG_NR41, REG_BASE + OFFSET_REG_NR41
+ .set REG_NR42, REG_BASE + OFFSET_REG_NR42
+ .set REG_SOUND4CNT_H, REG_BASE + OFFSET_REG_SOUND4CNT_H
+ .set REG_NR43, REG_BASE + OFFSET_REG_NR43
+ .set REG_NR44, REG_BASE + OFFSET_REG_NR44
+ .set REG_SOUNDCNT, REG_BASE + OFFSET_REG_SOUNDCNT
+ .set REG_SOUNDCNT_L, REG_BASE + OFFSET_REG_SOUNDCNT_L
+ .set REG_NR50, REG_BASE + OFFSET_REG_NR50
+ .set REG_NR51, REG_BASE + OFFSET_REG_NR51
+ .set REG_SOUNDCNT_H, REG_BASE + OFFSET_REG_SOUNDCNT_H
+ .set REG_SOUNDCNT_X, REG_BASE + OFFSET_REG_SOUNDCNT_X
+ .set REG_NR52, REG_BASE + OFFSET_REG_NR52
+ .set REG_SOUNDBIAS, REG_BASE + OFFSET_REG_SOUNDBIAS
+ .set REG_WAVE_RAM, REG_BASE + OFFSET_REG_WAVE_RAM
+ .set REG_WAVE_RAM0, REG_BASE + OFFSET_REG_WAVE_RAM0
+ .set REG_WAVE_RAM0_L, REG_BASE + OFFSET_REG_WAVE_RAM0_L
+ .set REG_WAVE_RAM0_H, REG_BASE + OFFSET_REG_WAVE_RAM0_H
+ .set REG_WAVE_RAM1, REG_BASE + OFFSET_REG_WAVE_RAM1
+ .set REG_WAVE_RAM1_L, REG_BASE + OFFSET_REG_WAVE_RAM1_L
+ .set REG_WAVE_RAM1_H, REG_BASE + OFFSET_REG_WAVE_RAM1_H
+ .set REG_WAVE_RAM2, REG_BASE + OFFSET_REG_WAVE_RAM2
+ .set REG_WAVE_RAM2_L, REG_BASE + OFFSET_REG_WAVE_RAM2_L
+ .set REG_WAVE_RAM2_H, REG_BASE + OFFSET_REG_WAVE_RAM2_H
+ .set REG_WAVE_RAM3, REG_BASE + OFFSET_REG_WAVE_RAM3
+ .set REG_WAVE_RAM3_L, REG_BASE + OFFSET_REG_WAVE_RAM3_L
+ .set REG_WAVE_RAM3_H, REG_BASE + OFFSET_REG_WAVE_RAM3_H
+ .set REG_FIFO, REG_BASE + OFFSET_REG_FIFO
+ .set REG_FIFO_A, REG_BASE + OFFSET_REG_FIFO_A
+ .set REG_FIFO_A_L, REG_BASE + OFFSET_REG_FIFO_A_L
+ .set REG_FIFO_A_H, REG_BASE + OFFSET_REG_FIFO_A_H
+ .set REG_FIFO_B, REG_BASE + OFFSET_REG_FIFO_B
+ .set REG_FIFO_B_L, REG_BASE + OFFSET_REG_FIFO_B_L
+ .set REG_FIFO_B_H, REG_BASE + OFFSET_REG_FIFO_B_H
+
+ .set REG_DMA0, REG_BASE + OFFSET_REG_DMA0
+ .set REG_DMA0SAD, REG_BASE + OFFSET_REG_DMA0SAD
+ .set REG_DMA0SAD_L, REG_BASE + OFFSET_REG_DMA0SAD_L
+ .set REG_DMA0SAD_H, REG_BASE + OFFSET_REG_DMA0SAD_H
+ .set REG_DMA0DAD, REG_BASE + OFFSET_REG_DMA0DAD
+ .set REG_DMA0DAD_L, REG_BASE + OFFSET_REG_DMA0DAD_L
+ .set REG_DMA0DAD_H, REG_BASE + OFFSET_REG_DMA0DAD_H
+ .set REG_DMA0CNT, REG_BASE + OFFSET_REG_DMA0CNT
+ .set REG_DMA0CNT_L, REG_BASE + OFFSET_REG_DMA0CNT_L
+ .set REG_DMA0CNT_H, REG_BASE + OFFSET_REG_DMA0CNT_H
+ .set REG_DMA1, REG_BASE + OFFSET_REG_DMA1
+ .set REG_DMA1SAD, REG_BASE + OFFSET_REG_DMA1SAD
+ .set REG_DMA1SAD_L, REG_BASE + OFFSET_REG_DMA1SAD_L
+ .set REG_DMA1SAD_H, REG_BASE + OFFSET_REG_DMA1SAD_H
+ .set REG_DMA1DAD, REG_BASE + OFFSET_REG_DMA1DAD
+ .set REG_DMA1DAD_L, REG_BASE + OFFSET_REG_DMA1DAD_L
+ .set REG_DMA1DAD_H, REG_BASE + OFFSET_REG_DMA1DAD_H
+ .set REG_DMA1CNT, REG_BASE + OFFSET_REG_DMA1CNT
+ .set REG_DMA1CNT_L, REG_BASE + OFFSET_REG_DMA1CNT_L
+ .set REG_DMA1CNT_H, REG_BASE + OFFSET_REG_DMA1CNT_H
+ .set REG_DMA2, REG_BASE + OFFSET_REG_DMA2
+ .set REG_DMA2SAD, REG_BASE + OFFSET_REG_DMA2SAD
+ .set REG_DMA2SAD_L, REG_BASE + OFFSET_REG_DMA2SAD_L
+ .set REG_DMA2SAD_H, REG_BASE + OFFSET_REG_DMA2SAD_H
+ .set REG_DMA2DAD, REG_BASE + OFFSET_REG_DMA2DAD
+ .set REG_DMA2DAD_L, REG_BASE + OFFSET_REG_DMA2DAD_L
+ .set REG_DMA2DAD_H, REG_BASE + OFFSET_REG_DMA2DAD_H
+ .set REG_DMA2CNT, REG_BASE + OFFSET_REG_DMA2CNT
+ .set REG_DMA2CNT_L, REG_BASE + OFFSET_REG_DMA2CNT_L
+ .set REG_DMA2CNT_H, REG_BASE + OFFSET_REG_DMA2CNT_H
+ .set REG_DMA3, REG_BASE + OFFSET_REG_DMA3
+ .set REG_DMA3SAD, REG_BASE + OFFSET_REG_DMA3SAD
+ .set REG_DMA3SAD_L, REG_BASE + OFFSET_REG_DMA3SAD_L
+ .set REG_DMA3SAD_H, REG_BASE + OFFSET_REG_DMA3SAD_H
+ .set REG_DMA3DAD, REG_BASE + OFFSET_REG_DMA3DAD
+ .set REG_DMA3DAD_L, REG_BASE + OFFSET_REG_DMA3DAD_L
+ .set REG_DMA3DAD_H, REG_BASE + OFFSET_REG_DMA3DAD_H
+ .set REG_DMA3CNT, REG_BASE + OFFSET_REG_DMA3CNT
+ .set REG_DMA3CNT_L, REG_BASE + OFFSET_REG_DMA3CNT_L
+ .set REG_DMA3CNT_H, REG_BASE + OFFSET_REG_DMA3CNT_H
+
+ .set REG_TM0CNT, REG_BASE + OFFSET_REG_TM0CNT
+ .set REG_TM0CNT_L, REG_BASE + OFFSET_REG_TM0CNT_L
+ .set REG_TM0CNT_H, REG_BASE + OFFSET_REG_TM0CNT_H
+ .set REG_TM1CNT, REG_BASE + OFFSET_REG_TM1CNT
+ .set REG_TM1CNT_L, REG_BASE + OFFSET_REG_TM1CNT_L
+ .set REG_TM1CNT_H, REG_BASE + OFFSET_REG_TM1CNT_H
+ .set REG_TM2CNT, REG_BASE + OFFSET_REG_TM2CNT
+ .set REG_TM2CNT_L, REG_BASE + OFFSET_REG_TM2CNT_L
+ .set REG_TM2CNT_H, REG_BASE + OFFSET_REG_TM2CNT_H
+ .set REG_TM3CNT, REG_BASE + OFFSET_REG_TM3CNT
+ .set REG_TM3CNT_L, REG_BASE + OFFSET_REG_TM3CNT_L
+ .set REG_TM3CNT_H, REG_BASE + OFFSET_REG_TM3CNT_H
+
+ .set REG_SIOCNT, REG_BASE + OFFSET_REG_SIOCNT
+ .set REG_SIODATA8, REG_BASE + OFFSET_REG_SIODATA8
+ .set REG_SIODATA32, REG_BASE + OFFSET_REG_SIODATA32
+ .set REG_SIOMLT_SEND, REG_BASE + OFFSET_REG_SIOMLT_SEND
+ .set REG_SIOMLT_RECV, REG_BASE + OFFSET_REG_SIOMLT_RECV
+ .set REG_SIOMULTI0, REG_BASE + OFFSET_REG_SIOMULTI0
+ .set REG_SIOMULTI1, REG_BASE + OFFSET_REG_SIOMULTI1
+ .set REG_SIOMULTI2, REG_BASE + OFFSET_REG_SIOMULTI2
+ .set REG_SIOMULTI3, REG_BASE + OFFSET_REG_SIOMULTI3
+
+ .set REG_KEYINPUT, REG_BASE + OFFSET_REG_KEYINPUT
+ .set REG_KEYCNT, REG_BASE + OFFSET_REG_KEYCNT
+
+ .set REG_RCNT, REG_BASE + OFFSET_REG_RCNT
+
+ .set REG_JOYCNT, REG_BASE + OFFSET_REG_JOYCNT
+ .set REG_JOYSTAT, REG_BASE + OFFSET_REG_JOYSTAT
+ .set REG_JOY_RECV, REG_BASE + OFFSET_REG_JOY_RECV
+ .set REG_JOY_RECV_L, REG_BASE + OFFSET_REG_JOY_RECV_L
+ .set REG_JOY_RECV_H, REG_BASE + OFFSET_REG_JOY_RECV_H
+ .set REG_JOY_TRANS, REG_BASE + OFFSET_REG_JOY_TRANS
+ .set REG_JOY_TRANS_L, REG_BASE + OFFSET_REG_JOY_TRANS_L
+ .set REG_JOY_TRANS_H, REG_BASE + OFFSET_REG_JOY_TRANS_H
+
+ .set REG_IME, REG_BASE + OFFSET_REG_IME
+ .set REG_IE, REG_BASE + OFFSET_REG_IE
+ .set REG_IF, REG_BASE + OFFSET_REG_IF
+
+ .set REG_WAITCNT, REG_BASE + OFFSET_REG_WAITCNT
+
+@ DMA register constants
+
+ .set DMA_DEST_INC, 0x0000
+ .set DMA_DEST_DEC, 0x0020
+ .set DMA_DEST_FIXED, 0x0040
+ .set DMA_DEST_RELOAD, 0x0060
+ .set DMA_SRC_INC, 0x0000
+ .set DMA_SRC_DEC, 0x0080
+ .set DMA_SRC_FIXED, 0x0100
+ .set DMA_REPEAT, 0x0200
+ .set DMA_16BIT, 0x0000
+ .set DMA_32BIT, 0x0400
+ .set DMA_DREQ_ON, 0x0800
+ .set DMA_START_NOW, 0x0000
+ .set DMA_START_VBLANK, 0x1000
+ .set DMA_START_HBLANK, 0x2000
+ .set DMA_START_SPECIAL, 0x3000
+ .set DMA_INTR_ENABLE, 0x4000
+ .set DMA_ENABLE, 0x8000
+
+@ OAM attribute constants
+
+ .set OAM_OBJ_NORMAL, 0x00000000
+ .set OAM_OBJ_BLEND, 0x00000400
+ .set OAM_OBJ_WINDOW, 0x00000800
+
+ .set OAM_AFFINE_NONE, 0x00000000
+ .set OAM_AFFINE_NORMAL_SIZE, 0x00000100
+ .set OAM_OBJ_DISABLED, 0x00000200
+ .set OAM_AFFINE_DOUBLE_SIZE, 0x00000300
+
+ .set OAM_MOSAIC_OFF, 0x00000000
+ .set OAM_MOSAIC_ON, 0x00001000
+
+ .set OAM_4BPP, 0x00000000
+ .set OAM_8BPP, 0x00002000
+
+ .set OAM_H_FLIP, 0x10000000
+ .set OAM_V_FLIP, 0x20000000
+
+ .set OAM_SQUARE, 0x00000000
+ .set OAM_H_RECTANGLE, 0x00004000
+ .set OAM_V_RECTANGLE, 0x00008000
+ .set OAM_SIZE_0, 0x00000000
+ .set OAM_SIZE_1, 0x40000000
+ .set OAM_SIZE_2, 0x80000000
+ .set OAM_SIZE_3, 0xc0000000
+
+ .set OAM_SIZE_8x8, OAM_SIZE_0 | OAM_SQUARE
+ .set OAM_SIZE_16x16, OAM_SIZE_1 | OAM_SQUARE
+ .set OAM_SIZE_32x32, OAM_SIZE_2 | OAM_SQUARE
+ .set OAM_SIZE_64x64, OAM_SIZE_3 | OAM_SQUARE
+
+ .set OAM_SIZE_16x8, OAM_SIZE_0 | OAM_H_RECTANGLE
+ .set OAM_SIZE_32x8, OAM_SIZE_1 | OAM_H_RECTANGLE
+ .set OAM_SIZE_32x16, OAM_SIZE_2 | OAM_H_RECTANGLE
+ .set OAM_SIZE_64x32, OAM_SIZE_3 | OAM_H_RECTANGLE
+
+ .set OAM_SIZE_8x16, OAM_SIZE_0 | OAM_V_RECTANGLE
+ .set OAM_SIZE_8x32, OAM_SIZE_1 | OAM_V_RECTANGLE
+ .set OAM_SIZE_16x32, OAM_SIZE_2 | OAM_V_RECTANGLE
+ .set OAM_SIZE_32x64, OAM_SIZE_3 | OAM_V_RECTANGLE
diff --git a/berry_fix/payload/graphics/debug_digits.png b/berry_fix/payload/graphics/debug_digits.png
new file mode 100644
index 000000000..edf0d36c9
--- /dev/null
+++ b/berry_fix/payload/graphics/debug_digits.png
Binary files differ
diff --git a/berry_fix/payload/graphics/msg_box.png b/berry_fix/payload/graphics/msg_box.png
new file mode 100644
index 000000000..00d1bbe37
--- /dev/null
+++ b/berry_fix/payload/graphics/msg_box.png
Binary files differ
diff --git a/berry_fix/payload/graphics/msg_box.tilemap b/berry_fix/payload/graphics/msg_box.tilemap
new file mode 100644
index 000000000..5b82401ba
--- /dev/null
+++ b/berry_fix/payload/graphics/msg_box.tilemap
Binary files differ
diff --git a/berry_fix/payload/include/constants/game_stat.h b/berry_fix/payload/include/constants/game_stat.h
new file mode 100644
index 000000000..47d703d85
--- /dev/null
+++ b/berry_fix/payload/include/constants/game_stat.h
@@ -0,0 +1,56 @@
+#ifndef GUARD_CONSTANTS_GAME_STAT_H
+#define GUARD_CONSTANTS_GAME_STAT_H
+
+#define GAME_STAT_SAVED_GAME 0
+#define GAME_STAT_FIRST_HOF_PLAY_TIME 1
+#define GAME_STAT_STARTED_TRENDS 2
+#define GAME_STAT_PLANTED_BERRIES 3
+#define GAME_STAT_TRADED_BIKES 4
+#define GAME_STAT_STEPS 5
+#define GAME_STAT_GOT_INTERVIEWED 6
+#define GAME_STAT_TOTAL_BATTLES 7
+#define GAME_STAT_WILD_BATTLES 8
+#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_HATCHED_EGGS 13
+#define GAME_STAT_EVOLVED_POKEMON 14
+#define GAME_STAT_USED_POKECENTER 15
+#define GAME_STAT_RESTED_AT_HOME 16
+#define GAME_STAT_ENTERED_SAFARI_ZONE 17
+#define GAME_STAT_USED_CUT 18
+#define GAME_STAT_USED_ROCK_SMASH 19
+#define GAME_STAT_MOVED_SECRET_BASE 20
+#define GAME_STAT_POKEMON_TRADES 21
+#define GAME_STAT_UNKNOWN_22 22
+#define GAME_STAT_LINK_BATTLE_WINS 23
+#define GAME_STAT_LINK_BATTLE_LOSSES 24
+#define GAME_STAT_LINK_BATTLE_DRAWS 25
+#define GAME_STAT_USED_SPLASH 26
+#define GAME_STAT_USED_STRUGGLE 27
+#define GAME_STAT_SLOT_JACKPOTS 28
+#define GAME_STAT_CONSECUTIVE_ROULETTE_WINS 29
+#define GAME_STAT_ENTERED_BATTLE_TOWER 30
+#define GAME_STAT_UNKNOWN_31 31
+#define GAME_STAT_BATTLE_TOWER_BEST_STREAK 32
+#define GAME_STAT_POKEBLOCKS 33
+#define GAME_STAT_POKEBLOCKS_WITH_FRIENDS 34
+#define GAME_STAT_WON_LINK_CONTEST 35
+#define GAME_STAT_ENTERED_CONTEST 36
+#define GAME_STAT_WON_CONTEST 37
+#define GAME_STAT_SHOPPED 38
+#define GAME_STAT_USED_ITEMFINDER 39
+#define GAME_STAT_GOT_RAINED_ON 40
+#define GAME_STAT_CHECKED_POKEDEX 41
+#define GAME_STAT_RECEIVED_RIBBONS 42
+#define GAME_STAT_JUMPED_DOWN_LEDGES 43
+#define GAME_STAT_WATCHED_TV 44
+#define GAME_STAT_CHECKED_CLOCK 45
+#define GAME_STAT_WON_POKEMON_LOTTERY 46
+#define GAME_STAT_USED_DAYCARE 47
+#define GAME_STAT_RODE_CABLE_CAR 48
+#define GAME_STAT_ENTERED_HOT_SPRINGS 49
+#define NUM_GAME_STATS 50
+
+#endif // GUARD_CONSTANTS_GAME_STAT_H
diff --git a/berry_fix/payload/include/constants/vars.h b/berry_fix/payload/include/constants/vars.h
new file mode 100644
index 000000000..4b40c1d8c
--- /dev/null
+++ b/berry_fix/payload/include/constants/vars.h
@@ -0,0 +1,196 @@
+#ifndef GUARD_CONSTANTS_VARS_H
+#define GUARD_CONSTANTS_VARS_H
+
+#define VAR_0x3F20 0x3F20
+
+#define VARS_START 0x4000
+
+// temporary vars
+// The first 0x10 vars are are temporary--they are cleared every time a map is loaded.
+#define VAR_TEMP_0 0x4000
+#define VAR_TEMP_1 0x4001
+#define VAR_TEMP_2 0x4002
+#define VAR_TEMP_3 0x4003
+#define VAR_TEMP_4 0x4004
+#define VAR_TEMP_5 0x4005
+#define VAR_TEMP_6 0x4006
+#define VAR_TEMP_7 0x4007
+#define VAR_TEMP_8 0x4008
+#define VAR_TEMP_9 0x4009
+#define VAR_TEMP_A 0x400A
+#define VAR_TEMP_B 0x400B
+#define VAR_TEMP_C 0x400C
+#define VAR_TEMP_D 0x400D
+#define VAR_TEMP_E 0x400E
+#define VAR_TEMP_F 0x400F
+
+// object gfx id vars
+// These 0x10 vars are used to dynamically control a event object's sprite.
+// For example, the rival's sprite id is dynamically set based on the player's gender.
+// See VarGetEventObjectGraphicsId().
+#define VAR_OBJ_GFX_ID_0 0x4010
+#define VAR_OBJ_GFX_ID_1 0x4011
+#define VAR_OBJ_GFX_ID_2 0x4012
+#define VAR_OBJ_GFX_ID_3 0x4013
+#define VAR_OBJ_GFX_ID_4 0x4014
+#define VAR_OBJ_GFX_ID_5 0x4015
+#define VAR_OBJ_GFX_ID_6 0x4016
+#define VAR_OBJ_GFX_ID_7 0x4017
+#define VAR_OBJ_GFX_ID_8 0x4018
+#define VAR_OBJ_GFX_ID_9 0x4019
+#define VAR_OBJ_GFX_ID_A 0x401A
+#define VAR_OBJ_GFX_ID_B 0x401B
+#define VAR_OBJ_GFX_ID_C 0x401C
+#define VAR_OBJ_GFX_ID_D 0x401D
+#define VAR_OBJ_GFX_ID_E 0x401E
+#define VAR_OBJ_GFX_ID_F 0x401F
+
+// general purpose vars
+#define VAR_RECYCLE_GOODS 0x4020
+#define VAR_REPEL_STEP_COUNT 0x4021
+#define VAR_ICE_STEP_COUNT 0x4022
+#define VAR_STARTER_MON 0x4023 // 0=Treecko, 1=Torchic, 2=Mudkip
+#define VAR_MIRAGE_RND_H 0x4024
+#define VAR_MIRAGE_RND_L 0x4025
+#define VAR_SECRET_BASE_MAP 0x4026
+#define VAR_CYCLING_ROAD_RECORD_COLLISIONS 0x4027
+#define VAR_CYCLING_ROAD_RECORD_TIME_L 0x4028
+#define VAR_CYCLING_ROAD_RECORD_TIME_H 0x4029
+#define VAR_HAPPINESS_STEP_COUNTER 0x402A
+#define VAR_POISON_STEP_COUNTER 0x402B
+#define VAR_RESET_RTC_ENABLE 0x402C
+#define VAR_ENIGMA_BERRY_AVAILABLE 0x402D
+
+#define VAR_DAYS 0x4040
+#define VAR_FANCLUB_UNKNOWN_1 0x4041 // TODO: document these two fanclub vars
+#define VAR_FANCLUB_UNKNOWN_2 0x4042
+#define VAR_DEPT_STORE_FLOOR 0x4043
+#define VAR_TRICK_HOUSE_ROOMS_COMPLETED 0x4044
+#define VAR_LOTTERY_PRIZE 0x4045
+#define VAR_NATIONAL_DEX 0x4046
+#define VAR_SHROOMISH_SIZE_RECORD 0x4047
+#define VAR_ASH_GATHER_COUNT 0x4048
+#define VAR_BIRCH_STATE 0x4049
+#define VAR_CRUISE_STEP_COUNT 0x404A
+#define VAR_LOTTERY_RND_L 0x404B
+#define VAR_LOTTERY_RND_H 0x404C
+
+#define VAR_BARBOACH_SIZE_RECORD 0x404F
+#define VAR_LITTLEROOT_STATE 0x4050
+#define VAR_ROUTE102_ACCESSIBLE 0x4051
+
+#define VAR_LAVARIDGE_RIVAL_STATE 0x4053
+#define VAR_CURRENT_SECRET_BASE 0x4054
+
+#define VAR_PETALBURG_STATE 0x4057
+#define VAR_SLATEPORT_STATE 0x4058
+
+#define VAR_RUSTBORO_STATE 0x405A
+
+#define VAR_SOOTOPOLIS_STATE 0x405E
+
+#define VAR_ROUTE101_STATE 0x4060
+
+#define VAR_ROUTE103_STATE 0x4062
+
+#define VAR_ROUTE110_STATE 0x4069
+
+#define VAR_ROUTE116_STATE 0x406F
+
+#define VAR_ROUTE118_STATE 0x4071
+#define VAR_ROUTE119_STATE 0x4072
+
+#define VAR_ROUTE121_STATE 0x4074
+#define VAR_ROUTE128_STATE 0x407B
+
+#define VAR_LITTLEROOT_HOUSES_STATE 0x4082 // TODO: needs more investigation
+
+#define VAR_BIRCH_LAB_STATE 0x4084
+#define VAR_PETALBURG_GYM_STATE 0x4085
+#define VAR_LINK_CONTEST_ROOM_STATE 0x4086
+#define VAR_CABLE_CLUB_STATE 0x4087
+#define VAR_CONTEST_LOCATION 0x4088
+#define VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F 0x4089 // TODO: related to decorations
+#define VAR_CONTEST_PRIZE_PICKUP 0x408A
+
+#define VAR_LITTLEROOT_HOUSES_STATE_2 0x408C // TODO: needs more investigation
+#define VAR_LITTLEROOT_RIVAL_STATE 0x408D
+#define VAR_BOARD_BRINEY_BOAT_ROUTE104_STATE 0x408E
+#define VAR_DEVON_CORP_3F_STATE 0x408F
+#define VAR_BRINEY_HOUSE_STATE 0x4090
+
+#define VAR_LITTLEROOT_INTRO_STATE 0x4092
+#define VAR_MAUVILLE_GYM_STATE 0x4093
+#define VAR_LILYCOVE_MUSEUM_2F_STATE 0x4094
+#define VAR_LILYCOVE_FAN_CLUB_STATE 0x4095
+#define VAR_BRINEY_LOCATION 0x4096
+#define VAR_0x4097 0x4097 // TODO: related to creating new secret base
+#define VAR_PETALBURG_WOODS_STATE 0x4098
+#define VAR_LILYCOVE_CONTEST_LOBBY_STATE 0x4099
+#define VAR_RUSTURF_TUNNEL_STATE 0x409a
+#define VAR_CAVE_OF_ORIGIN_B4F_STATE 0x409B
+#define VAR_ELITE_4_STATE 0x409C
+
+#define VAR_SLATEPORT_HARBOR_STATE 0x40A0
+
+#define VAR_SEAFLOOR_CAVERN_STATE 0x40A2
+#define VAR_CABLE_CAR_STATION_STATE 0x40A3
+#define VAR_SAFARI_ZONE_STATE 0x40A4
+#define VAR_TRICK_HOUSE_ENTRANCE_STATE 0x40A5
+#define VAR_TRICK_HOUSE_ENTRANCE_STATE_2 0x40A6
+#define VAR_TRICK_HOUSE_ENTRANCE_STATE_3 0x40A7
+
+#define VAR_CYCLING_CHALLENGE_STATE 0x40A9
+#define VAR_SLATEPORT_MUSEUM_1F_STATE 0x40AA
+#define VAR_TRICK_HOUSE_PUZZLE_1_STATE 0x40AB
+#define VAR_TRICK_HOUSE_PUZZLE_2_STATE 0x40AC
+#define VAR_TRICK_HOUSE_PUZZLE_3_STATE 0x40AD
+#define VAR_TRICK_HOUSE_PUZZLE_4_STATE 0x40AE
+#define VAR_TRICK_HOUSE_PUZZLE_5_STATE 0x40AF
+#define VAR_TRICK_HOUSE_PUZZLE_6_STATE 0x40B0
+#define VAR_TRICK_HOUSE_PUZZLE_7_STATE 0x40B1
+#define VAR_TRICK_HOUSE_PUZZLE_8_STATE 0x40B2
+#define VAR_WEATHER_INSTITUTE_STATE 0x40B3
+#define VAR_PORTHOLE_STATE 0x40B4
+#define VAR_TRICK_HOUSE_STATE 0x40B5 // TODO: needs some further investigation
+#define VAR_TRICK_HOUSE_PUZZLE_7_STATE_2 0x40B6
+#define VAR_SLATEPORT_FAN_CLUB_STATE 0x40B7
+
+#define VAR_MT_PYRE_STATE 0x40B9
+#define VAR_NEW_MAUVILLE_STATE 0x40BA
+
+#define VAR_BRAVO_TRAINER_BATTLE_TOWER_ON 0x40BC
+#define VAR_JAGGED_PASS_VOLCANIC_ASH_WEATHER 0x40BD
+#define VAR_GLASS_WORKSHOP_STATE 0x40BE
+#define VAR_METEOR_FALLS_STATE 0x40BF
+#define VAR_GAME_CORNER_STATE 0x40C0
+#define VAR_TRICK_HOUSE_PRIZE_PICKUP 0x40C1
+#define VAR_PACIFIDLOG_TM_RECEIVED_DAY 0x40C2
+#define VAR_VICTORY_ROAD_1F_STATE 0x40C3
+#define VAR_FOSSIL_RESURRECTION_STATE 0x40C4
+#define VAR_WHICH_FOSSIL_REVIVED 0x40C5
+#define VAR_STEVENS_HOUSE_STATE 0x40C6
+#define VAR_OLDALE_STATE 0x40C7
+
+// special vars
+// They are commonly used as parameters to commands, or return values from commands.
+#define VAR_SPECIAL_0 0x8000
+#define VAR_SPECIAL_1 0x8001
+#define VAR_SPECIAL_2 0x8002
+#define VAR_SPECIAL_3 0x8003
+#define VAR_SPECIAL_4 0x8004
+#define VAR_SPECIAL_5 0x8005
+#define VAR_SPECIAL_6 0x8006
+#define VAR_SPECIAL_7 0x8007
+#define VAR_SPECIAL_8 0x8008
+#define VAR_SPECIAL_9 0x8009
+#define VAR_SPECIAL_A 0x800A
+#define VAR_SPECIAL_B 0x800B
+#define FACING 0x800C
+#define RESULT 0x800D
+#define ITEM_ID 0x800E
+#define LAST_TALKED 0x800F
+#define CONTEST_RANK 0x8010
+#define CONTEST_CATEGORY 0x8011
+
+#endif // GUARD_CONSTANTS_VARS_H
diff --git a/berry_fix/payload/include/flash.h b/berry_fix/payload/include/flash.h
new file mode 100644
index 000000000..7fc35896d
--- /dev/null
+++ b/berry_fix/payload/include/flash.h
@@ -0,0 +1,55 @@
+#ifndef GUARD_FLASH_H
+#define GUARD_FLASH_H
+
+#include "gba/gba.h"
+
+enum
+{
+ SECTOR_DAMAGED,
+ SECTOR_OK,
+ SECTOR_CHECK, // unused
+};
+
+enum MsgBoxUpdateMessage
+{
+ MSGBOX_WILL_NOW_UPDATE = 0,
+ MSGBOX_HAS_BEEN_UPDATED,
+ MSGBOX_UNABLE_TO_UPDATE,
+ MSGBOX_NO_NEED_TO_UPDATE,
+ MSGBOX_UPDATING
+};
+
+struct SaveSector
+{
+ u8 data[0xFF4];
+ u16 id;
+ u16 checksum;
+ u32 signature;
+ u32 counter;
+}; // size is 0x1000
+
+// headless save section?
+struct UnkSaveSection
+{
+ u8 data[0xFF4];
+ u32 signature;
+}; // size is 0xFF8
+
+#define eSaveSection ((struct SaveSector *)0x2020000)
+
+#define NUM_SECTORS_PER_SAVE_SLOT 14 // Number of sectors occupied by a save slot
+#define FILE_SIGNATURE 0x08012025
+
+#define SAVE_STATUS_EMPTY 0
+#define SAVE_STATUS_OK 1
+#define SAVE_STATUS_NO_FLASH 4
+#define SAVE_STATUS_ERROR 0xFF
+
+bool32 flash_maincb_ident_is_valid(void);
+bool8 flash_maincb_read_save(u32);
+void msg_load_gfx(void);
+void msg_display(enum MsgBoxUpdateMessage);
+bool32 flash_maincb_check_need_reset_pacifidlog_tm(void);
+bool32 flash_maincb_reset_pacifidlog_tm(void);
+
+#endif //GUARD_FLASH_H
diff --git a/berry_fix/payload/include/gba/defines.h b/berry_fix/payload/include/gba/defines.h
new file mode 100644
index 000000000..289518cf3
--- /dev/null
+++ b/berry_fix/payload/include/gba/defines.h
@@ -0,0 +1,87 @@
+#ifndef GUARD_GBA_DEFINES
+#define GUARD_GBA_DEFINES
+
+#include <stddef.h>
+
+#define TRUE 1
+#define FALSE 0
+
+#define BSS_DATA __attribute__((section(".bss")))
+#define IWRAM_DATA __attribute__((section("iwram_data")))
+#define EWRAM_DATA __attribute__((section("ewram_data")))
+#define UNUSED __attribute__((unused))
+#define NAKED __attribute__((naked))
+
+#define ALIGNED(n) __attribute__((aligned(n)))
+
+#define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0)
+#define INTR_CHECK (*(u16 *)0x3007FF8)
+#define INTR_VECTOR (*(void **)0x3007FFC)
+
+#define EWRAM_START 0x02000000
+#define EWRAM_END (EWRAM_START + 0x40000)
+#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 OBJ_PLTT_SIZE 0x200
+
+#define VRAM 0x6000000
+#define VRAM_SIZE 0x18000
+
+#define BG_VRAM VRAM
+#define BG_VRAM_SIZE 0x10000
+#define BG_CHAR_SIZE 0x4000
+#define BG_SCREEN_SIZE 0x800
+#define BG_CHAR_ADDR(n) (void *)(BG_VRAM + (0x4000 * (n)))
+#define BG_SCREEN_ADDR(n) (void *)(BG_VRAM + (0x800 * (n)))
+#define BG_TILE_ADDR(n) (void *)(BG_VRAM + (0x80 * (n)))
+
+#define BG_TILE_H_FLIP(n) (0x400 + (n))
+#define BG_TILE_V_FLIP(n) (0x800 + (n))
+
+// text-mode BG
+#define OBJ_VRAM0 (void *)(VRAM + 0x10000)
+#define OBJ_VRAM0_SIZE 0x8000
+
+// bitmap-mode BG
+#define OBJ_VRAM1 (void *)(VRAM + 0x14000)
+#define OBJ_VRAM1_SIZE 0x4000
+
+#define OAM 0x7000000
+#define OAM_SIZE 0x400
+
+#define ROM_HEADER_SIZE 0xC0
+
+#define DISPLAY_WIDTH 240
+#define DISPLAY_HEIGHT 160
+
+#define TILE_SIZE_4BPP 32
+#define TILE_SIZE_8BPP 64
+
+#define TILE_OFFSET_4BPP(n) ((n) * TILE_SIZE_4BPP)
+#define TILE_OFFSET_8BPP(n) ((n) * TILE_SIZE_8BPP)
+
+#define TOTAL_OBJ_TILE_COUNT 1024
+
+#define RGB(r, g, b) ((r) | ((g) << 5) | ((b) << 10))
+#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r))
+#define _RGB(r, g, b) ((((b) & 0x1F) << 10) + (((g) & 0x1F) << 5) + ((r) & 0x1F))
+
+#define RGB_BLACK RGB(0, 0, 0)
+#define RGB_WHITE RGB(31, 31, 31)
+#define RGB_RED RGB(31, 0, 0)
+#define RGB_GREEN RGB(0, 31, 0)
+#define RGB_BLUE RGB(0, 0, 31)
+#define RGB_YELLOW RGB(31, 31, 0)
+#define RGB_MAGENTA RGB(31, 0, 31)
+#define RGB_CYAN RGB(0, 31, 31)
+#define RGB_WHITEALPHA (RGB_WHITE | 0x8000)
+
+#endif // GUARD_GBA_DEFINES
diff --git a/berry_fix/payload/include/gba/flash_internal.h b/berry_fix/payload/include/gba/flash_internal.h
new file mode 100644
index 000000000..6fbec31f1
--- /dev/null
+++ b/berry_fix/payload/include/gba/flash_internal.h
@@ -0,0 +1,85 @@
+#ifndef GUARD_GBA_FLASH_INTERNAL_H
+#define GUARD_GBA_FLASH_INTERNAL_H
+
+#include "gba/gba.h"
+
+#define FLASH_BASE ((u8 *)0xE000000)
+
+#define FLASH_WRITE(addr, data) ((*(vu8 *)(FLASH_BASE + (addr))) = (data))
+
+#define FLASH_ROM_SIZE_1M 131072 // 1 megabit ROM
+
+#define SECTORS_PER_BANK 16
+
+struct FlashSector
+{
+ u32 size;
+ u8 shift;
+ u16 count;
+ u16 top;
+};
+
+struct FlashType {
+ u32 romSize;
+ struct FlashSector sector;
+ u16 wait[2]; // game pak bus read/write wait
+
+ // TODO: add support for anonymous unions/structs if possible
+ union {
+ struct {
+ u8 makerId;
+ u8 deviceId;
+ } separate;
+ u16 joined;
+ } ids;
+};
+
+struct FlashSetupInfo
+{
+ u16 (*programFlashByte)(u16, u32, u8);
+ u16 (*programFlashSector)(u16, void *);
+ u16 (*eraseFlashChip)(void);
+ u16 (*eraseFlashSector)(u16);
+ u16 (*WaitForFlashWrite)(u8, u8 *, u8);
+ const u16 *maxTime;
+ struct FlashType type;
+};
+
+extern u16 gFlashNumRemainingBytes;
+
+extern u16 (*ProgramFlashByte)(u16, u32, u8);
+extern u16 (*ProgramFlashSector)(u16, void *);
+extern u16 (*EraseFlashChip)(void);
+extern u16 (*EraseFlashSector)(u16);
+extern u16 (*WaitForFlashWrite)(u8, u8 *, u8);
+extern const u16 *gFlashMaxTime;
+extern const struct FlashType *gFlash;
+
+extern u8 (*PollFlashStatus)(u8 *);
+extern u8 gFlashTimeoutFlag;
+
+extern const struct FlashSetupInfo MX29L010;
+extern const struct FlashSetupInfo LE26FV10N1TS;
+extern const struct FlashSetupInfo DefaultFlash;
+
+void SwitchFlashBank(u8 bankNum);
+u16 ReadFlashId(void);
+void StartFlashTimer(u8 phase);
+void SetReadFlash1(u16 *dest);
+void StopFlashTimer(void);
+u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));
+u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src);
+void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size);
+u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *dataSrc, u32 n);
+
+u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData);
+
+u16 EraseFlashChip_MX(void);
+u16 EraseFlashSector_MX(u16 sectorNum);
+u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data);
+u16 ProgramFlashSector_MX(u16 sectorNum, void *src);
+
+// agb_flash_1m
+u32 IdentifyFlash(void);
+
+#endif // GUARD_GBA_FLASH_INTERNAL_H
diff --git a/berry_fix/payload/include/gba/gba.h b/berry_fix/payload/include/gba/gba.h
new file mode 100644
index 000000000..349344031
--- /dev/null
+++ b/berry_fix/payload/include/gba/gba.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_GBA_GBA_H
+#define GUARD_GBA_GBA_H
+
+#include "gba/defines.h"
+#include "gba/io_reg.h"
+#include "gba/types.h"
+#include "gba/multiboot.h"
+#include "gba/syscall.h"
+#include "gba/macro.h"
+#include "gba/isagbprint.h"
+
+#endif // GUARD_GBA_GBA_H
diff --git a/berry_fix/payload/include/gba/io_reg.h b/berry_fix/payload/include/gba/io_reg.h
new file mode 100644
index 000000000..df79b084d
--- /dev/null
+++ b/berry_fix/payload/include/gba/io_reg.h
@@ -0,0 +1,770 @@
+#ifndef GUARD_GBA_IO_REG_H
+#define GUARD_GBA_IO_REG_H
+
+#define REG_BASE 0x4000000 // I/O register base address
+
+// I/O register offsets
+
+#define REG_OFFSET_DISPCNT 0x0
+#define REG_OFFSET_DISPSTAT 0x4
+#define REG_OFFSET_VCOUNT 0x6
+#define REG_OFFSET_BG0CNT 0x8
+#define REG_OFFSET_BG1CNT 0xa
+#define REG_OFFSET_BG2CNT 0xc
+#define REG_OFFSET_BG3CNT 0xe
+#define REG_OFFSET_BG0HOFS 0x10
+#define REG_OFFSET_BG0VOFS 0x12
+#define REG_OFFSET_BG1HOFS 0x14
+#define REG_OFFSET_BG1VOFS 0x16
+#define REG_OFFSET_BG2HOFS 0x18
+#define REG_OFFSET_BG2VOFS 0x1a
+#define REG_OFFSET_BG3HOFS 0x1c
+#define REG_OFFSET_BG3VOFS 0x1e
+#define REG_OFFSET_BG2PA 0x20
+#define REG_OFFSET_BG2PB 0x22
+#define REG_OFFSET_BG2PC 0x24
+#define REG_OFFSET_BG2PD 0x26
+#define REG_OFFSET_BG2X 0x28
+#define REG_OFFSET_BG2X_L 0x28
+#define REG_OFFSET_BG2X_H 0x2a
+#define REG_OFFSET_BG2Y 0x2c
+#define REG_OFFSET_BG2Y_L 0x2c
+#define REG_OFFSET_BG2Y_H 0x2e
+#define REG_OFFSET_BG3PA 0x30
+#define REG_OFFSET_BG3PB 0x32
+#define REG_OFFSET_BG3PC 0x34
+#define REG_OFFSET_BG3PD 0x36
+#define REG_OFFSET_BG3X 0x38
+#define REG_OFFSET_BG3X_L 0x38
+#define REG_OFFSET_BG3X_H 0x3a
+#define REG_OFFSET_BG3Y 0x3c
+#define REG_OFFSET_BG3Y_L 0x3c
+#define REG_OFFSET_BG3Y_H 0x3e
+#define REG_OFFSET_WIN0H 0x40
+#define REG_OFFSET_WIN1H 0x42
+#define REG_OFFSET_WIN0V 0x44
+#define REG_OFFSET_WIN1V 0x46
+#define REG_OFFSET_WININ 0x48
+#define REG_OFFSET_WINOUT 0x4a
+#define REG_OFFSET_MOSAIC 0x4c
+#define REG_OFFSET_BLDCNT 0x50
+#define REG_OFFSET_BLDALPHA 0x52
+#define REG_OFFSET_BLDY 0x54
+
+#define REG_OFFSET_SOUND1CNT_L 0x60
+#define REG_OFFSET_NR10 0x60
+#define REG_OFFSET_SOUND1CNT_H 0x62
+#define REG_OFFSET_NR11 0x62
+#define REG_OFFSET_NR12 0x63
+#define REG_OFFSET_SOUND1CNT_X 0x64
+#define REG_OFFSET_NR13 0x64
+#define REG_OFFSET_NR14 0x65
+#define REG_OFFSET_SOUND2CNT_L 0x68
+#define REG_OFFSET_NR21 0x68
+#define REG_OFFSET_NR22 0x69
+#define REG_OFFSET_SOUND2CNT_H 0x6c
+#define REG_OFFSET_NR23 0x6c
+#define REG_OFFSET_NR24 0x6d
+#define REG_OFFSET_SOUND3CNT_L 0x70
+#define REG_OFFSET_NR30 0x70
+#define REG_OFFSET_SOUND3CNT_H 0x72
+#define REG_OFFSET_NR31 0x72
+#define REG_OFFSET_NR32 0x73
+#define REG_OFFSET_SOUND3CNT_X 0x74
+#define REG_OFFSET_NR33 0x74
+#define REG_OFFSET_NR34 0x75
+#define REG_OFFSET_SOUND4CNT_L 0x78
+#define REG_OFFSET_NR41 0x78
+#define REG_OFFSET_NR42 0x79
+#define REG_OFFSET_SOUND4CNT_H 0x7c
+#define REG_OFFSET_NR43 0x7c
+#define REG_OFFSET_NR44 0x7d
+#define REG_OFFSET_SOUNDCNT_L 0x80
+#define REG_OFFSET_NR50 0x80
+#define REG_OFFSET_NR51 0x81
+#define REG_OFFSET_SOUNDCNT_H 0x82
+#define REG_OFFSET_SOUNDCNT_X 0x84
+#define REG_OFFSET_NR52 0x84
+#define REG_OFFSET_SOUNDBIAS 0x88
+#define REG_OFFSET_SOUNDBIAS_L 0x88
+#define REG_OFFSET_SOUNDBIAS_H 0x89
+#define REG_OFFSET_WAVE_RAM0 0x90
+#define REG_OFFSET_WAVE_RAM1 0x94
+#define REG_OFFSET_WAVE_RAM2 0x98
+#define REG_OFFSET_WAVE_RAM3 0x9c
+#define REG_OFFSET_FIFO_A 0xa0
+#define REG_OFFSET_FIFO_B 0xa4
+
+#define REG_OFFSET_DMA0 0xb0
+#define REG_OFFSET_DMA0SAD 0xb0
+#define REG_OFFSET_DMA0SAD_L 0xb0
+#define REG_OFFSET_DMA0SAD_H 0xb2
+#define REG_OFFSET_DMA0DAD 0xb4
+#define REG_OFFSET_DMA0DAD_L 0xb4
+#define REG_OFFSET_DMA0DAD_H 0xb6
+#define REG_OFFSET_DMA0CNT 0xb8
+#define REG_OFFSET_DMA0CNT_L 0xb8
+#define REG_OFFSET_DMA0CNT_H 0xba
+#define REG_OFFSET_DMA1 0xbc
+#define REG_OFFSET_DMA1SAD 0xbc
+#define REG_OFFSET_DMA1SAD_L 0xbc
+#define REG_OFFSET_DMA1SAD_H 0xbe
+#define REG_OFFSET_DMA1DAD 0xc0
+#define REG_OFFSET_DMA1DAD_L 0xc0
+#define REG_OFFSET_DMA1DAD_H 0xc2
+#define REG_OFFSET_DMA1CNT 0xc4
+#define REG_OFFSET_DMA1CNT_L 0xc4
+#define REG_OFFSET_DMA1CNT_H 0xc6
+#define REG_OFFSET_DMA2 0xc8
+#define REG_OFFSET_DMA2SAD 0xc8
+#define REG_OFFSET_DMA2SAD_L 0xc8
+#define REG_OFFSET_DMA2SAD_H 0xca
+#define REG_OFFSET_DMA2DAD 0xcc
+#define REG_OFFSET_DMA2DAD_L 0xcc
+#define REG_OFFSET_DMA2DAD_H 0xce
+#define REG_OFFSET_DMA2CNT 0xd0
+#define REG_OFFSET_DMA2CNT_L 0xd0
+#define REG_OFFSET_DMA2CNT_H 0xd2
+#define REG_OFFSET_DMA3 0xd4
+#define REG_OFFSET_DMA3SAD 0xd4
+#define REG_OFFSET_DMA3SAD_L 0xd4
+#define REG_OFFSET_DMA3SAD_H 0xd6
+#define REG_OFFSET_DMA3DAD 0xd8
+#define REG_OFFSET_DMA3DAD_L 0xd8
+#define REG_OFFSET_DMA3DAD_H 0xda
+#define REG_OFFSET_DMA3CNT 0xdc
+#define REG_OFFSET_DMA3CNT_L 0xdc
+#define REG_OFFSET_DMA3CNT_H 0xde
+
+#define REG_OFFSET_TMCNT 0x100
+#define REG_OFFSET_TMCNT_L 0x100
+#define REG_OFFSET_TMCNT_H 0x102
+#define REG_OFFSET_TM0CNT 0x100
+#define REG_OFFSET_TM0CNT_L 0x100
+#define REG_OFFSET_TM0CNT_H 0x102
+#define REG_OFFSET_TM1CNT 0x104
+#define REG_OFFSET_TM1CNT_L 0x104
+#define REG_OFFSET_TM1CNT_H 0x106
+#define REG_OFFSET_TM2CNT 0x108
+#define REG_OFFSET_TM2CNT_L 0x108
+#define REG_OFFSET_TM2CNT_H 0x10a
+#define REG_OFFSET_TM3CNT 0x10c
+#define REG_OFFSET_TM3CNT_L 0x10c
+#define REG_OFFSET_TM3CNT_H 0x10e
+
+#define REG_OFFSET_SIOCNT 0x128
+#define REG_OFFSET_SIODATA8 0x12a
+#define REG_OFFSET_SIODATA32 0x120
+#define REG_OFFSET_SIOMLT_SEND 0x12a
+#define REG_OFFSET_SIOMLT_RECV 0x120
+#define REG_OFFSET_SIOMULTI0 0x120
+#define REG_OFFSET_SIOMULTI1 0x122
+#define REG_OFFSET_SIOMULTI2 0x124
+#define REG_OFFSET_SIOMULTI3 0x126
+
+#define REG_OFFSET_KEYINPUT 0x130
+#define REG_OFFSET_KEYCNT 0x132
+
+#define REG_OFFSET_RCNT 0x134
+
+#define REG_OFFSET_JOYCNT 0x140
+#define REG_OFFSET_JOYSTAT 0x158
+#define REG_OFFSET_JOY_RECV 0x150
+#define REG_OFFSET_JOY_RECV_L 0x150
+#define REG_OFFSET_JOY_RECV_H 0x152
+#define REG_OFFSET_JOY_TRANS 0x154
+#define REG_OFFSET_JOY_TRANS_L 0x154
+#define REG_OFFSET_JOY_TRANS_H 0x156
+
+#define REG_OFFSET_IME 0x208
+#define REG_OFFSET_IE 0x200
+#define REG_OFFSET_IF 0x202
+
+#define REG_OFFSET_WAITCNT 0x204
+
+// I/O register addresses
+
+#define REG_ADDR_DISPCNT (REG_BASE + REG_OFFSET_DISPCNT)
+#define REG_ADDR_DISPSTAT (REG_BASE + REG_OFFSET_DISPSTAT)
+#define REG_ADDR_VCOUNT (REG_BASE + REG_OFFSET_VCOUNT)
+#define REG_ADDR_BG0CNT (REG_BASE + REG_OFFSET_BG0CNT)
+#define REG_ADDR_BG1CNT (REG_BASE + REG_OFFSET_BG1CNT)
+#define REG_ADDR_BG2CNT (REG_BASE + REG_OFFSET_BG2CNT)
+#define REG_ADDR_BG3CNT (REG_BASE + REG_OFFSET_BG3CNT)
+#define REG_ADDR_BG0HOFS (REG_BASE + REG_OFFSET_BG0HOFS)
+#define REG_ADDR_BG0VOFS (REG_BASE + REG_OFFSET_BG0VOFS)
+#define REG_ADDR_BG1HOFS (REG_BASE + REG_OFFSET_BG1HOFS)
+#define REG_ADDR_BG1VOFS (REG_BASE + REG_OFFSET_BG1VOFS)
+#define REG_ADDR_BG2HOFS (REG_BASE + REG_OFFSET_BG2HOFS)
+#define REG_ADDR_BG2VOFS (REG_BASE + REG_OFFSET_BG2VOFS)
+#define REG_ADDR_BG3HOFS (REG_BASE + REG_OFFSET_BG3HOFS)
+#define REG_ADDR_BG3VOFS (REG_BASE + REG_OFFSET_BG3VOFS)
+#define REG_ADDR_BG2PA (REG_BASE + REG_OFFSET_BG2PA)
+#define REG_ADDR_BG2PB (REG_BASE + REG_OFFSET_BG2PB)
+#define REG_ADDR_BG2PC (REG_BASE + REG_OFFSET_BG2PC)
+#define REG_ADDR_BG2PD (REG_BASE + REG_OFFSET_BG2PD)
+#define REG_ADDR_BG2X (REG_BASE + REG_OFFSET_BG2X)
+#define REG_ADDR_BG2X_L (REG_BASE + REG_OFFSET_BG2X_L)
+#define REG_ADDR_BG2X_H (REG_BASE + REG_OFFSET_BG2X_H)
+#define REG_ADDR_BG2Y (REG_BASE + REG_OFFSET_BG2Y)
+#define REG_ADDR_BG2Y_L (REG_BASE + REG_OFFSET_BG2Y_L)
+#define REG_ADDR_BG2Y_H (REG_BASE + REG_OFFSET_BG2Y_H)
+#define REG_ADDR_BG3PA (REG_BASE + REG_OFFSET_BG3PA)
+#define REG_ADDR_BG3PB (REG_BASE + REG_OFFSET_BG3PB)
+#define REG_ADDR_BG3PC (REG_BASE + REG_OFFSET_BG3PC)
+#define REG_ADDR_BG3PD (REG_BASE + REG_OFFSET_BG3PD)
+#define REG_ADDR_BG3X (REG_BASE + REG_OFFSET_BG3X)
+#define REG_ADDR_BG3X_L (REG_BASE + REG_OFFSET_BG3X_L)
+#define REG_ADDR_BG3X_H (REG_BASE + REG_OFFSET_BG3X_H)
+#define REG_ADDR_BG3Y (REG_BASE + REG_OFFSET_BG3Y)
+#define REG_ADDR_BG3Y_L (REG_BASE + REG_OFFSET_BG3Y_L)
+#define REG_ADDR_BG3Y_H (REG_BASE + REG_OFFSET_BG3Y_H)
+#define REG_ADDR_WIN0H (REG_BASE + REG_OFFSET_WIN0H)
+#define REG_ADDR_WIN1H (REG_BASE + REG_OFFSET_WIN1H)
+#define REG_ADDR_WIN0V (REG_BASE + REG_OFFSET_WIN0V)
+#define REG_ADDR_WIN1V (REG_BASE + REG_OFFSET_WIN1V)
+#define REG_ADDR_WININ (REG_BASE + REG_OFFSET_WININ)
+#define REG_ADDR_WINOUT (REG_BASE + REG_OFFSET_WINOUT)
+#define REG_ADDR_MOSAIC (REG_BASE + REG_OFFSET_MOSAIC)
+#define REG_ADDR_BLDCNT (REG_BASE + REG_OFFSET_BLDCNT)
+#define REG_ADDR_BLDALPHA (REG_BASE + REG_OFFSET_BLDALPHA)
+#define REG_ADDR_BLDY (REG_BASE + REG_OFFSET_BLDY)
+
+#define REG_ADDR_SOUND1CNT_L (REG_BASE + REG_OFFSET_SOUND1CNT_L)
+#define REG_ADDR_NR10 (REG_BASE + REG_OFFSET_NR10)
+#define REG_ADDR_SOUND1CNT_H (REG_BASE + REG_OFFSET_SOUND1CNT_H)
+#define REG_ADDR_NR11 (REG_BASE + REG_OFFSET_NR11)
+#define REG_ADDR_NR12 (REG_BASE + REG_OFFSET_NR12)
+#define REG_ADDR_SOUND1CNT_X (REG_BASE + REG_OFFSET_SOUND1CNT_X)
+#define REG_ADDR_NR13 (REG_BASE + REG_OFFSET_NR13)
+#define REG_ADDR_NR14 (REG_BASE + REG_OFFSET_NR14)
+#define REG_ADDR_SOUND2CNT_L (REG_BASE + REG_OFFSET_SOUND2CNT_L)
+#define REG_ADDR_NR21 (REG_BASE + REG_OFFSET_NR21)
+#define REG_ADDR_NR22 (REG_BASE + REG_OFFSET_NR22)
+#define REG_ADDR_SOUND2CNT_H (REG_BASE + REG_OFFSET_SOUND2CNT_H)
+#define REG_ADDR_NR23 (REG_BASE + REG_OFFSET_NR23)
+#define REG_ADDR_NR24 (REG_BASE + REG_OFFSET_NR24)
+#define REG_ADDR_SOUND3CNT_L (REG_BASE + REG_OFFSET_SOUND3CNT_L)
+#define REG_ADDR_NR30 (REG_BASE + REG_OFFSET_NR30)
+#define REG_ADDR_SOUND3CNT_H (REG_BASE + REG_OFFSET_SOUND3CNT_H)
+#define REG_ADDR_NR31 (REG_BASE + REG_OFFSET_NR31)
+#define REG_ADDR_NR32 (REG_BASE + REG_OFFSET_NR32)
+#define REG_ADDR_SOUND3CNT_X (REG_BASE + REG_OFFSET_SOUND3CNT_X)
+#define REG_ADDR_NR33 (REG_BASE + REG_OFFSET_NR33)
+#define REG_ADDR_NR34 (REG_BASE + REG_OFFSET_NR34)
+#define REG_ADDR_SOUND4CNT_L (REG_BASE + REG_OFFSET_SOUND4CNT_L)
+#define REG_ADDR_NR41 (REG_BASE + REG_OFFSET_NR41)
+#define REG_ADDR_NR42 (REG_BASE + REG_OFFSET_NR42)
+#define REG_ADDR_SOUND4CNT_H (REG_BASE + REG_OFFSET_SOUND4CNT_H)
+#define REG_ADDR_NR43 (REG_BASE + REG_OFFSET_NR43)
+#define REG_ADDR_NR44 (REG_BASE + REG_OFFSET_NR44)
+#define REG_ADDR_SOUNDCNT_L (REG_BASE + REG_OFFSET_SOUNDCNT_L)
+#define REG_ADDR_NR50 (REG_BASE + REG_OFFSET_NR50)
+#define REG_ADDR_NR51 (REG_BASE + REG_OFFSET_NR51)
+#define REG_ADDR_SOUNDCNT_H (REG_BASE + REG_OFFSET_SOUNDCNT_H)
+#define REG_ADDR_SOUNDCNT_X (REG_BASE + REG_OFFSET_SOUNDCNT_X)
+#define REG_ADDR_NR52 (REG_BASE + REG_OFFSET_NR52)
+#define REG_ADDR_SOUNDBIAS (REG_BASE + REG_OFFSET_SOUNDBIAS)
+#define REG_ADDR_SOUNDBIAS_L (REG_BASE + REG_OFFSET_SOUNDBIAS_L)
+#define REG_ADDR_SOUNDBIAS_H (REG_BASE + REG_OFFSET_SOUNDBIAS_H)
+#define REG_ADDR_WAVE_RAM0 (REG_BASE + REG_OFFSET_WAVE_RAM0)
+#define REG_ADDR_WAVE_RAM1 (REG_BASE + REG_OFFSET_WAVE_RAM1)
+#define REG_ADDR_WAVE_RAM2 (REG_BASE + REG_OFFSET_WAVE_RAM2)
+#define REG_ADDR_WAVE_RAM3 (REG_BASE + REG_OFFSET_WAVE_RAM3)
+#define REG_ADDR_FIFO_A (REG_BASE + REG_OFFSET_FIFO_A)
+#define REG_ADDR_FIFO_B (REG_BASE + REG_OFFSET_FIFO_B)
+
+#define REG_ADDR_DMA0 (REG_BASE + REG_OFFSET_DMA0)
+#define REG_ADDR_DMA0SAD (REG_BASE + REG_OFFSET_DMA0SAD)
+#define REG_ADDR_DMA0DAD (REG_BASE + REG_OFFSET_DMA0DAD)
+#define REG_ADDR_DMA0CNT (REG_BASE + REG_OFFSET_DMA0CNT)
+#define REG_ADDR_DMA0CNT_L (REG_BASE + REG_OFFSET_DMA0CNT_L)
+#define REG_ADDR_DMA0CNT_H (REG_BASE + REG_OFFSET_DMA0CNT_H)
+#define REG_ADDR_DMA1 (REG_BASE + REG_OFFSET_DMA1)
+#define REG_ADDR_DMA1SAD (REG_BASE + REG_OFFSET_DMA1SAD)
+#define REG_ADDR_DMA1DAD (REG_BASE + REG_OFFSET_DMA1DAD)
+#define REG_ADDR_DMA1CNT (REG_BASE + REG_OFFSET_DMA1CNT)
+#define REG_ADDR_DMA1CNT_L (REG_BASE + REG_OFFSET_DMA1CNT_L)
+#define REG_ADDR_DMA1CNT_H (REG_BASE + REG_OFFSET_DMA1CNT_H)
+#define REG_ADDR_DMA2 (REG_BASE + REG_OFFSET_DMA2)
+#define REG_ADDR_DMA2SAD (REG_BASE + REG_OFFSET_DMA2SAD)
+#define REG_ADDR_DMA2DAD (REG_BASE + REG_OFFSET_DMA2DAD)
+#define REG_ADDR_DMA2CNT (REG_BASE + REG_OFFSET_DMA2CNT)
+#define REG_ADDR_DMA2CNT_L (REG_BASE + REG_OFFSET_DMA2CNT_L)
+#define REG_ADDR_DMA2CNT_H (REG_BASE + REG_OFFSET_DMA2CNT_H)
+#define REG_ADDR_DMA3 (REG_BASE + REG_OFFSET_DMA3)
+#define REG_ADDR_DMA3SAD (REG_BASE + REG_OFFSET_DMA3SAD)
+#define REG_ADDR_DMA3DAD (REG_BASE + REG_OFFSET_DMA3DAD)
+#define REG_ADDR_DMA3CNT (REG_BASE + REG_OFFSET_DMA3CNT)
+#define REG_ADDR_DMA3CNT_L (REG_BASE + REG_OFFSET_DMA3CNT_L)
+#define REG_ADDR_DMA3CNT_H (REG_BASE + REG_OFFSET_DMA3CNT_H)
+
+#define REG_ADDR_TMCNT (REG_BASE + REG_OFFSET_TMCNT)
+#define REG_ADDR_TMCNT_L (REG_BASE + REG_OFFSET_TMCNT_L)
+#define REG_ADDR_TMCNT_H (REG_BASE + REG_OFFSET_TMCNT_H)
+#define REG_ADDR_TM0CNT (REG_BASE + REG_OFFSET_TM0CNT)
+#define REG_ADDR_TM0CNT_L (REG_BASE + REG_OFFSET_TM0CNT_L)
+#define REG_ADDR_TM0CNT_H (REG_BASE + REG_OFFSET_TM0CNT_H)
+#define REG_ADDR_TM1CNT (REG_BASE + REG_OFFSET_TM1CNT)
+#define REG_ADDR_TM1CNT_L (REG_BASE + REG_OFFSET_TM1CNT_L)
+#define REG_ADDR_TM1CNT_H (REG_BASE + REG_OFFSET_TM1CNT_H)
+#define REG_ADDR_TM2CNT (REG_BASE + REG_OFFSET_TM2CNT)
+#define REG_ADDR_TM2CNT_L (REG_BASE + REG_OFFSET_TM2CNT_L)
+#define REG_ADDR_TM2CNT_H (REG_BASE + REG_OFFSET_TM2CNT_H)
+#define REG_ADDR_TM3CNT (REG_BASE + REG_OFFSET_TM3CNT)
+#define REG_ADDR_TM3CNT_L (REG_BASE + REG_OFFSET_TM3CNT_L)
+#define REG_ADDR_TM3CNT_H (REG_BASE + REG_OFFSET_TM3CNT_H)
+
+#define REG_ADDR_SIOCNT (REG_BASE + REG_OFFSET_SIOCNT)
+#define REG_ADDR_SIODATA8 (REG_BASE + REG_OFFSET_SIODATA8)
+#define REG_ADDR_SIODATA32 (REG_BASE + REG_OFFSET_SIODATA32)
+#define REG_ADDR_SIOMLT_SEND (REG_BASE + REG_OFFSET_SIOMLT_SEND)
+#define REG_ADDR_SIOMLT_RECV (REG_BASE + REG_OFFSET_SIOMLT_RECV)
+#define REG_ADDR_SIOMULTI0 (REG_BASE + REG_OFFSET_SIOMULTI0)
+#define REG_ADDR_SIOMULTI1 (REG_BASE + REG_OFFSET_SIOMULTI1)
+#define REG_ADDR_SIOMULTI2 (REG_BASE + REG_OFFSET_SIOMULTI2)
+#define REG_ADDR_SIOMULTI3 (REG_BASE + REG_OFFSET_SIOMULTI3)
+
+#define REG_ADDR_KEYINPUT (REG_BASE + REG_OFFSET_KEYINPUT)
+#define REG_ADDR_KEYCNT (REG_BASE + REG_OFFSET_KEYCNT)
+
+#define REG_ADDR_RCNT (REG_BASE + REG_OFFSET_RCNT)
+
+#define REG_ADDR_JOYCNT (REG_BASE + REG_OFFSET_JOYCNT)
+#define REG_ADDR_JOYSTAT (REG_BASE + REG_OFFSET_JOYSTAT)
+#define REG_ADDR_JOY_RECV (REG_BASE + REG_OFFSET_JOY_RECV)
+#define REG_ADDR_JOY_RECV_L (REG_BASE + REG_OFFSET_JOY_RECV_L)
+#define REG_ADDR_JOY_RECV_H (REG_BASE + REG_OFFSET_JOY_RECV_H)
+#define REG_ADDR_JOY_TRANS (REG_BASE + REG_OFFSET_JOY_TRANS)
+#define REG_ADDR_JOY_TRANS_L (REG_BASE + REG_OFFSET_JOY_TRANS_L)
+#define REG_ADDR_JOY_TRANS_H (REG_BASE + REG_OFFSET_JOY_TRANS_H)
+
+#define REG_ADDR_IME (REG_BASE + REG_OFFSET_IME)
+#define REG_ADDR_IE (REG_BASE + REG_OFFSET_IE)
+#define REG_ADDR_IF (REG_BASE + REG_OFFSET_IF)
+
+#define REG_ADDR_WAITCNT (REG_BASE + REG_OFFSET_WAITCNT)
+
+// I/O registers
+
+#define REG_DISPCNT (*(vu16 *)REG_ADDR_DISPCNT)
+#define REG_DISPSTAT (*(vu16 *)REG_ADDR_DISPSTAT)
+#define REG_VCOUNT (*(vu16 *)REG_ADDR_VCOUNT)
+#define REG_BG0CNT (*(vu16 *)REG_ADDR_BG0CNT)
+#define REG_BG1CNT (*(vu16 *)REG_ADDR_BG1CNT)
+#define REG_BG2CNT (*(vu16 *)REG_ADDR_BG2CNT)
+#define REG_BG3CNT (*(vu16 *)REG_ADDR_BG3CNT)
+#define REG_BG0HOFS (*(vu16 *)REG_ADDR_BG0HOFS)
+#define REG_BG0VOFS (*(vu16 *)REG_ADDR_BG0VOFS)
+#define REG_BG1HOFS (*(vu16 *)REG_ADDR_BG1HOFS)
+#define REG_BG1VOFS (*(vu16 *)REG_ADDR_BG1VOFS)
+#define REG_BG2HOFS (*(vu16 *)REG_ADDR_BG2HOFS)
+#define REG_BG2VOFS (*(vu16 *)REG_ADDR_BG2VOFS)
+#define REG_BG3HOFS (*(vu16 *)REG_ADDR_BG3HOFS)
+#define REG_BG3VOFS (*(vu16 *)REG_ADDR_BG3VOFS)
+#define REG_BG2PA (*(vu16 *)REG_ADDR_BG2PA)
+#define REG_BG2PB (*(vu16 *)REG_ADDR_BG2PB)
+#define REG_BG2PC (*(vu16 *)REG_ADDR_BG2PC)
+#define REG_BG2PD (*(vu16 *)REG_ADDR_BG2PD)
+#define REG_BG2X (*(vu32 *)REG_ADDR_BG2X)
+#define REG_BG2X_L (*(vu16 *)REG_ADDR_BG2X_L)
+#define REG_BG2X_H (*(vu16 *)REG_ADDR_BG2X_H)
+#define REG_BG2Y (*(vu32 *)REG_ADDR_BG2Y)
+#define REG_BG2Y_L (*(vu16 *)REG_ADDR_BG2Y_L)
+#define REG_BG2Y_H (*(vu16 *)REG_ADDR_BG2Y_H)
+#define REG_BG3PA (*(vu16 *)REG_ADDR_BG3PA)
+#define REG_BG3PB (*(vu16 *)REG_ADDR_BG3PB)
+#define REG_BG3PC (*(vu16 *)REG_ADDR_BG3PC)
+#define REG_BG3PD (*(vu16 *)REG_ADDR_BG3PD)
+#define REG_BG3X (*(vu32 *)REG_ADDR_BG3X)
+#define REG_BG3X_L (*(vu16 *)REG_ADDR_BG3X_L)
+#define REG_BG3X_H (*(vu16 *)REG_ADDR_BG3X_H)
+#define REG_BG3Y (*(vu32 *)REG_ADDR_BG3Y)
+#define REG_BG3Y_L (*(vu16 *)REG_ADDR_BG3Y_L)
+#define REG_BG3Y_H (*(vu16 *)REG_ADDR_BG3Y_H)
+#define REG_WIN0H (*(vu16 *)REG_ADDR_WIN0H)
+#define REG_WIN1H (*(vu16 *)REG_ADDR_WIN1H)
+#define REG_WIN0V (*(vu16 *)REG_ADDR_WIN0V)
+#define REG_WIN1V (*(vu16 *)REG_ADDR_WIN1V)
+#define REG_WININ (*(vu16 *)REG_ADDR_WININ)
+#define REG_WINOUT (*(vu16 *)REG_ADDR_WINOUT)
+#define REG_MOSAIC (*(vu16 *)REG_ADDR_MOSAIC)
+#define REG_BLDCNT (*(vu16 *)REG_ADDR_BLDCNT)
+#define REG_BLDALPHA (*(vu16 *)REG_ADDR_BLDALPHA)
+#define REG_BLDY (*(vu16 *)REG_ADDR_BLDY)
+
+#define REG_SOUND1CNT_L (*(vu16 *)REG_ADDR_SOUND1CNT_L)
+#define REG_NR10 (*(vu8 *)REG_ADDR_NR10)
+#define REG_SOUND1CNT_H (*(vu16 *)REG_ADDR_SOUND1CNT_H)
+#define REG_NR11 (*(vu8 *)REG_ADDR_NR11)
+#define REG_NR12 (*(vu8 *)REG_ADDR_NR12)
+#define REG_SOUND1CNT_X (*(vu16 *)REG_ADDR_SOUND1CNT_X)
+#define REG_NR13 (*(vu8 *)REG_ADDR_NR13)
+#define REG_NR14 (*(vu8 *)REG_ADDR_NR14)
+#define REG_SOUND2CNT_L (*(vu16 *)REG_ADDR_SOUND2CNT_L)
+#define REG_NR21 (*(vu8 *)REG_ADDR_NR21)
+#define REG_NR22 (*(vu8 *)REG_ADDR_NR22)
+#define REG_SOUND2CNT_H (*(vu16 *)REG_ADDR_SOUND2CNT_H)
+#define REG_NR23 (*(vu8 *)REG_ADDR_NR23)
+#define REG_NR24 (*(vu8 *)REG_ADDR_NR24)
+#define REG_SOUND3CNT_L (*(vu16 *)REG_ADDR_SOUND3CNT_L)
+#define REG_NR30 (*(vu8 *)REG_ADDR_NR30)
+#define REG_SOUND3CNT_H (*(vu16 *)REG_ADDR_SOUND3CNT_H)
+#define REG_NR31 (*(vu8 *)REG_ADDR_NR31)
+#define REG_NR32 (*(vu8 *)REG_ADDR_NR32)
+#define REG_SOUND3CNT_X (*(vu16 *)REG_ADDR_SOUND3CNT_X)
+#define REG_NR33 (*(vu8 *)REG_ADDR_NR33)
+#define REG_NR34 (*(vu8 *)REG_ADDR_NR34)
+#define REG_SOUND4CNT_L (*(vu16 *)REG_ADDR_SOUND4CNT_L)
+#define REG_NR41 (*(vu8 *)REG_ADDR_NR41)
+#define REG_NR42 (*(vu8 *)REG_ADDR_NR42)
+#define REG_SOUND4CNT_H (*(vu16 *)REG_ADDR_SOUND4CNT_H)
+#define REG_NR43 (*(vu8 *)REG_ADDR_NR43)
+#define REG_NR44 (*(vu8 *)REG_ADDR_NR44)
+#define REG_SOUNDCNT_L (*(vu16 *)REG_ADDR_SOUNDCNT_L)
+#define REG_NR50 (*(vu8 *)REG_ADDR_NR50)
+#define REG_NR51 (*(vu8 *)REG_ADDR_NR51)
+#define REG_SOUNDCNT_H (*(vu16 *)REG_ADDR_SOUNDCNT_H)
+#define REG_SOUNDCNT_X (*(vu16 *)REG_ADDR_SOUNDCNT_X)
+#define REG_NR52 (*(vu8 *)REG_ADDR_NR52)
+#define REG_SOUNDBIAS (*(vu16 *)REG_ADDR_SOUNDBIAS)
+#define REG_SOUNDBIAS_L (*(vu8 *)REG_ADDR_SOUNDBIAS_L)
+#define REG_SOUNDBIAS_H (*(vu8 *)REG_ADDR_SOUNDBIAS_H)
+#define REG_WAVE_RAM0 (*(vu32 *)REG_ADDR_WAVE_RAM0)
+#define REG_WAVE_RAM1 (*(vu32 *)REG_ADDR_WAVE_RAM1)
+#define REG_WAVE_RAM2 (*(vu32 *)REG_ADDR_WAVE_RAM2)
+#define REG_WAVE_RAM3 (*(vu32 *)REG_ADDR_WAVE_RAM3)
+#define REG_FIFO_A (*(vu32 *)REG_ADDR_FIFO_A)
+#define REG_FIFO_B (*(vu32 *)REG_ADDR_FIFO_B)
+
+#define REG_DMA0SAD (*(vu32 *)REG_ADDR_DMA0SAD)
+#define REG_DMA0DAD (*(vu32 *)REG_ADDR_DMA0DAD)
+#define REG_DMA0CNT (*(vu32 *)REG_ADDR_DMA0CNT)
+#define REG_DMA0CNT_L (*(vu16 *)REG_ADDR_DMA0CNT_L)
+#define REG_DMA0CNT_H (*(vu16 *)REG_ADDR_DMA0CNT_H)
+
+#define REG_DMA1SAD (*(vu32 *)REG_ADDR_DMA1SAD)
+#define REG_DMA1DAD (*(vu32 *)REG_ADDR_DMA1DAD)
+#define REG_DMA1CNT (*(vu32 *)REG_ADDR_DMA1CNT)
+#define REG_DMA1CNT_L (*(vu16 *)REG_ADDR_DMA1CNT_L)
+#define REG_DMA1CNT_H (*(vu16 *)REG_ADDR_DMA1CNT_H)
+
+#define REG_DMA2SAD (*(vu32 *)REG_ADDR_DMA2SAD)
+#define REG_DMA2DAD (*(vu32 *)REG_ADDR_DMA2DAD)
+#define REG_DMA2CNT (*(vu32 *)REG_ADDR_DMA2CNT)
+#define REG_DMA2CNT_L (*(vu16 *)REG_ADDR_DMA2CNT_L)
+#define REG_DMA2CNT_H (*(vu16 *)REG_ADDR_DMA2CNT_H)
+
+#define REG_DMA3SAD (*(vu32 *)REG_ADDR_DMA3SAD)
+#define REG_DMA3DAD (*(vu32 *)REG_ADDR_DMA3DAD)
+#define REG_DMA3CNT (*(vu32 *)REG_ADDR_DMA3CNT)
+#define REG_DMA3CNT_L (*(vu16 *)REG_ADDR_DMA3CNT_L)
+#define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H)
+
+#define REG_TMCNT(n) (*(vu16 *)(REG_ADDR_TMCNT + ((n) * 4)))
+#define REG_TMCNT_L(n) (*(vu16 *)(REG_ADDR_TMCNT_L + ((n) * 4)))
+#define REG_TMCNT_H(n) (*(vu16 *)(REG_ADDR_TMCNT_H + ((n) * 4)))
+#define REG_TM0CNT (*(vu32 *)REG_ADDR_TM0CNT)
+#define REG_TM0CNT_L (*(vu16 *)REG_ADDR_TM0CNT_L)
+#define REG_TM0CNT_H (*(vu16 *)REG_ADDR_TM0CNT_H)
+#define REG_TM1CNT (*(vu32 *)REG_ADDR_TM1CNT)
+#define REG_TM1CNT_L (*(vu16 *)REG_ADDR_TM1CNT_L)
+#define REG_TM1CNT_H (*(vu16 *)REG_ADDR_TM1CNT_H)
+#define REG_TM2CNT (*(vu32 *)REG_ADDR_TM2CNT)
+#define REG_TM2CNT_L (*(vu16 *)REG_ADDR_TM2CNT_L)
+#define REG_TM2CNT_H (*(vu16 *)REG_ADDR_TM2CNT_H)
+#define REG_TM3CNT (*(vu32 *)REG_ADDR_TM3CNT)
+#define REG_TM3CNT_L (*(vu16 *)REG_ADDR_TM3CNT_L)
+#define REG_TM3CNT_H (*(vu16 *)REG_ADDR_TM3CNT_H)
+
+#define REG_SIOCNT (*(vu16 *)REG_ADDR_SIOCNT)
+#define REG_SIODATA8 (*(vu16 *)REG_ADDR_SIODATA8)
+#define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32)
+#define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND)
+#define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV)
+#define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0)
+#define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1)
+#define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2)
+#define REG_SIOMULTI3 (*(vu16 *)REG_ADDR_SIOMULTI3)
+
+#define REG_KEYINPUT (*(vu16 *)REG_ADDR_KEYINPUT)
+#define REG_KEYCNT (*(vu16 *)REG_ADDR_KEYCNT)
+
+#define REG_RCNT (*(vu16 *)REG_ADDR_RCNT)
+
+#define REG_IME (*(vu16 *)REG_ADDR_IME)
+#define REG_IE (*(vu16 *)REG_ADDR_IE)
+#define REG_IF (*(vu16 *)REG_ADDR_IF)
+
+#define REG_WAITCNT (*(vu16 *)REG_ADDR_WAITCNT)
+
+// I/O register fields
+
+// DISPCNT
+#define DISPCNT_MODE_0 0x0000 // BG0: text, BG1: text, BG2: text, BG3: text
+#define DISPCNT_MODE_1 0x0001 // BG0: text, BG1: text, BG2: affine, BG3: off
+#define DISPCNT_MODE_2 0x0002 // BG0: off, BG1: off, BG2: affine, BG3: affine
+#define DISPCNT_MODE_3 0x0003 // Bitmap mode, 240x160, BGR555 color
+#define DISPCNT_MODE_4 0x0004 // Bitmap mode, 240x160, 256 color palette
+#define DISPCNT_MODE_5 0x0005 // Bitmap mode, 160x128, BGR555 color
+#define DISPCNT_HBLANK_INTERVAL 0x0020 // Allow access to OAM during H-Blank
+#define DISPCNT_OBJ_1D_MAP 0x0040
+#define DISPCNT_FORCED_BLANK 0x0080
+#define DISPCNT_BG0_ON 0x0100
+#define DISPCNT_BG1_ON 0x0200
+#define DISPCNT_BG2_ON 0x0400
+#define DISPCNT_BG3_ON 0x0800
+#define DISPCNT_BG_ALL_ON 0x0F00
+#define DISPCNT_OBJ_ON 0x1000
+#define DISPCNT_WIN0_ON 0x2000
+#define DISPCNT_WIN1_ON 0x4000
+#define DISPCNT_OBJWIN_ON 0x8000
+
+// DISPSTAT
+#define DISPSTAT_VBLANK 0x0001 // in V-Blank
+#define DISPSTAT_HBLANK 0x0002 // in H-Blank
+#define DISPSTAT_VCOUNT 0x0004 // V-Count match
+#define DISPSTAT_VBLANK_INTR 0x0008 // V-Blank interrupt enabled
+#define DISPSTAT_HBLANK_INTR 0x0010 // H-Blank interrupt enabled
+#define DISPSTAT_VCOUNT_INTR 0x0020 // V-Count interrupt enabled
+
+// BGCNT
+#define BGCNT_PRIORITY(n) (n) // Values 0 - 3. Lower priority BGs will be drawn on top of higher priority BGs.
+#define BGCNT_CHARBASE(n) ((n) << 2) // Values 0 - 3. Base block for tile pixel data.
+#define BGCNT_MOSAIC 0x0040
+#define BGCNT_16COLOR 0x0000 // 4 bits per pixel
+#define BGCNT_256COLOR 0x0080 // 8 bits per pixel
+#define BGCNT_SCREENBASE(n) ((n) << 8) // Values 0 - 31. Base block for tile map.
+#define BGCNT_WRAP 0x2000 // Only affects affine BGs. Text BGs wrap by default.
+#define BGCNT_TXT256x256 0x0000 // Internal screen size size of text mode BG in pixels.
+#define BGCNT_TXT512x256 0x4000
+#define BGCNT_TXT256x512 0x8000
+#define BGCNT_TXT512x512 0xC000
+#define BGCNT_AFF128x128 0x0000 // Internal screen size size of affine mode BG in pixels.
+#define BGCNT_AFF256x256 0x4000
+#define BGCNT_AFF512x512 0x8000
+#define BGCNT_AFF1024x1024 0xC000
+
+// WININ/OUT
+#define WININ_WIN0_BG0 (1 << 0)
+#define WININ_WIN0_BG1 (1 << 1)
+#define WININ_WIN0_BG2 (1 << 2)
+#define WININ_WIN0_BG3 (1 << 3)
+#define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3)
+#define WININ_WIN0_OBJ (1 << 4)
+#define WININ_WIN0_CLR (1 << 5)
+#define WININ_WIN1_BG0 (1 << 8)
+#define WININ_WIN1_BG1 (1 << 9)
+#define WININ_WIN1_BG2 (1 << 10)
+#define WININ_WIN1_BG3 (1 << 11)
+#define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3)
+#define WININ_WIN1_OBJ (1 << 12)
+#define WININ_WIN1_CLR (1 << 13)
+
+#define WINOUT_WIN01_BG0 (1 << 0)
+#define WINOUT_WIN01_BG1 (1 << 1)
+#define WINOUT_WIN01_BG2 (1 << 2)
+#define WINOUT_WIN01_BG3 (1 << 3)
+#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3)
+#define WINOUT_WIN01_OBJ (1 << 4)
+#define WINOUT_WIN01_CLR (1 << 5)
+#define WINOUT_WINOBJ_BG0 (1 << 8)
+#define WINOUT_WINOBJ_BG1 (1 << 9)
+#define WINOUT_WINOBJ_BG2 (1 << 10)
+#define WINOUT_WINOBJ_BG3 (1 << 11)
+#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3)
+#define WINOUT_WINOBJ_OBJ (1 << 12)
+#define WINOUT_WINOBJ_CLR (1 << 13)
+
+#define WIN_RANGE(a, b) (((a) << 8) | (b))
+#define WIN_RANGE2(a, b) ((b) | ((a) << 8))
+
+// BLDCNT
+// Bits 0-5 select layers for the 1st target
+#define BLDCNT_TGT1_BG0 (1 << 0)
+#define BLDCNT_TGT1_BG1 (1 << 1)
+#define BLDCNT_TGT1_BG2 (1 << 2)
+#define BLDCNT_TGT1_BG3 (1 << 3)
+#define BLDCNT_TGT1_OBJ (1 << 4)
+#define BLDCNT_TGT1_BD (1 << 5)
+#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD)
+// Bits 6-7 select the special effect
+#define BLDCNT_EFFECT_NONE (0 << 6) // no special effect
+#define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA)
+#define BLDCNT_EFFECT_LIGHTEN (2 << 6) // 1st target becomes whiter (controlled by BLDY)
+#define BLDCNT_EFFECT_DARKEN (3 << 6) // 1st target becomes blacker (controlled by BLDY)
+// Bits 8-13 select layers for the 2nd target
+#define BLDCNT_TGT2_BG0 (1 << 8)
+#define BLDCNT_TGT2_BG1 (1 << 9)
+#define BLDCNT_TGT2_BG2 (1 << 10)
+#define BLDCNT_TGT2_BG3 (1 << 11)
+#define BLDCNT_TGT2_OBJ (1 << 12)
+#define BLDCNT_TGT2_BD (1 << 13)
+#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD)
+
+// BLDALPHA
+#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1))
+
+// SOUNDCNT_H
+#define SOUND_CGB_MIX_QUARTER 0x0000
+#define SOUND_CGB_MIX_HALF 0x0001
+#define SOUND_CGB_MIX_FULL 0x0002
+#define SOUND_A_MIX_HALF 0x0000
+#define SOUND_A_MIX_FULL 0x0004
+#define SOUND_B_MIX_HALF 0x0000
+#define SOUND_B_MIX_FULL 0x0008
+#define SOUND_ALL_MIX_FULL 0x000E
+#define SOUND_A_RIGHT_OUTPUT 0x0100
+#define SOUND_A_LEFT_OUTPUT 0x0200
+#define SOUND_A_TIMER_0 0x0000
+#define SOUND_A_TIMER_1 0x0400
+#define SOUND_A_FIFO_RESET 0x0800
+#define SOUND_B_RIGHT_OUTPUT 0x1000
+#define SOUND_B_LEFT_OUTPUT 0x2000
+#define SOUND_B_TIMER_0 0x0000
+#define SOUND_B_TIMER_1 0x4000
+#define SOUND_B_FIFO_RESET 0x8000
+
+// SOUNDCNT_X
+#define SOUND_1_ON 0x0001
+#define SOUND_2_ON 0x0002
+#define SOUND_3_ON 0x0004
+#define SOUND_4_ON 0x0008
+#define SOUND_MASTER_ENABLE 0x0080
+
+// DMA
+#define DMA_DEST_INC 0x0000
+#define DMA_DEST_DEC 0x0020
+#define DMA_DEST_FIXED 0x0040
+#define DMA_DEST_RELOAD 0x0060
+#define DMA_SRC_INC 0x0000
+#define DMA_SRC_DEC 0x0080
+#define DMA_SRC_FIXED 0x0100
+#define DMA_REPEAT 0x0200
+#define DMA_16BIT 0x0000
+#define DMA_32BIT 0x0400
+#define DMA_DREQ_ON 0x0800
+#define DMA_START_NOW 0x0000
+#define DMA_START_VBLANK 0x1000
+#define DMA_START_HBLANK 0x2000
+#define DMA_START_SPECIAL 0x3000
+#define DMA_START_MASK 0x3000
+#define DMA_INTR_ENABLE 0x4000
+#define DMA_ENABLE 0x8000
+
+// timer
+#define TIMER_1CLK 0x00
+#define TIMER_64CLK 0x01
+#define TIMER_256CLK 0x02
+#define TIMER_1024CLK 0x03
+#define TIMER_INTR_ENABLE 0x40
+#define TIMER_ENABLE 0x80
+
+// serial
+#define SIO_ID 0x0030 // Communication ID
+
+#define SIO_8BIT_MODE 0x0000 // Normal 8-bit communication mode
+#define SIO_32BIT_MODE 0x1000 // Normal 32-bit communication mode
+#define SIO_MULTI_MODE 0x2000 // Multi-player communication mode
+#define SIO_UART_MODE 0x3000 // UART communication mode
+
+#define SIO_9600_BPS 0x0000 // baud rate 9600 bps
+#define SIO_38400_BPS 0x0001 // 38400 bps
+#define SIO_57600_BPS 0x0002 // 57600 bps
+#define SIO_115200_BPS 0x0003 // 115200 bps
+
+#define SIO_MULTI_SI 0x0004 // Multi-player communication SI terminal
+#define SIO_MULTI_SD 0x0008 // SD terminal
+#define SIO_MULTI_BUSY 0x0080
+
+#define SIO_ERROR 0x0040 // Detect error
+#define SIO_START 0x0080 // Start transfer
+#define SIO_ENABLE 0x0080 // Enable SIO
+
+#define SIO_INTR_ENABLE 0x4000
+
+#define SIO_MULTI_SI_SHIFT 2
+#define SIO_MULTI_SI_MASK 0x1
+#define SIO_MULTI_DI_SHIFT 3
+#define SIO_MULTI_DI_MASK 0x1
+
+// keys
+#define A_BUTTON 0x0001
+#define B_BUTTON 0x0002
+#define SELECT_BUTTON 0x0004
+#define START_BUTTON 0x0008
+#define DPAD_RIGHT 0x0010
+#define DPAD_LEFT 0x0020
+#define DPAD_UP 0x0040
+#define DPAD_DOWN 0x0080
+#define R_BUTTON 0x0100
+#define L_BUTTON 0x0200
+#define KEYS_MASK 0x03FF
+#define KEY_INTR_ENABLE 0x0400
+#define KEY_OR_INTR 0x0000
+#define KEY_AND_INTR 0x8000
+#define DPAD_ANY ((DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN))
+#define JOY_EXCL_DPAD 0x030F
+
+// interrupt flags
+#define INTR_FLAG_VBLANK (1 << 0)
+#define INTR_FLAG_HBLANK (1 << 1)
+#define INTR_FLAG_VCOUNT (1 << 2)
+#define INTR_FLAG_TIMER0 (1 << 3)
+#define INTR_FLAG_TIMER1 (1 << 4)
+#define INTR_FLAG_TIMER2 (1 << 5)
+#define INTR_FLAG_TIMER3 (1 << 6)
+#define INTR_FLAG_SERIAL (1 << 7)
+#define INTR_FLAG_DMA0 (1 << 8)
+#define INTR_FLAG_DMA1 (1 << 9)
+#define INTR_FLAG_DMA2 (1 << 10)
+#define INTR_FLAG_DMA3 (1 << 11)
+#define INTR_FLAG_KEYPAD (1 << 12)
+#define INTR_FLAG_GAMEPAK (1 << 13)
+
+// WAITCNT
+#define WAITCNT_SRAM_4 (0 << 0)
+#define WAITCNT_SRAM_3 (1 << 0)
+#define WAITCNT_SRAM_2 (2 << 0)
+#define WAITCNT_SRAM_8 (3 << 0)
+#define WAITCNT_SRAM_MASK (3 << 0)
+
+#define WAITCNT_WS0_N_4 (0 << 2)
+#define WAITCNT_WS0_N_3 (1 << 2)
+#define WAITCNT_WS0_N_2 (2 << 2)
+#define WAITCNT_WS0_N_8 (3 << 2)
+#define WAITCNT_WS0_N_MASK (3 << 2)
+
+#define WAITCNT_WS0_S_2 (0 << 4)
+#define WAITCNT_WS0_S_1 (1 << 4)
+
+#define WAITCNT_WS1_N_4 (0 << 5)
+#define WAITCNT_WS1_N_3 (1 << 5)
+#define WAITCNT_WS1_N_2 (2 << 5)
+#define WAITCNT_WS1_N_8 (3 << 5)
+#define WAITCNT_WS1_N_MASK (3 << 5)
+
+#define WAITCNT_WS1_S_4 (0 << 7)
+#define WAITCNT_WS1_S_1 (1 << 7)
+
+#define WAITCNT_WS2_N_4 (0 << 8)
+#define WAITCNT_WS2_N_3 (1 << 8)
+#define WAITCNT_WS2_N_2 (2 << 8)
+#define WAITCNT_WS2_N_8 (3 << 8)
+#define WAITCNT_WS2_N_MASK (3 << 8)
+
+#define WAITCNT_WS2_S_8 (0 << 10)
+#define WAITCNT_WS2_S_1 (1 << 10)
+
+#define WAITCNT_PHI_OUT_NONE (0 << 11)
+#define WAITCNT_PHI_OUT_4MHZ (1 << 11)
+#define WAITCNT_PHI_OUT_8MHZ (2 << 11)
+#define WAITCNT_PHI_OUT_16MHZ (3 << 11)
+#define WAITCNT_PHI_OUT_MASK (3 << 11)
+
+#define WAITCNT_PREFETCH_ENABLE (1 << 14)
+
+#define WAITCNT_AGB (0 << 15)
+#define WAITCNT_CGB (1 << 15)
+
+#endif // GUARD_GBA_IO_REG_H
diff --git a/berry_fix/payload/include/gba/isagbprint.h b/berry_fix/payload/include/gba/isagbprint.h
new file mode 100644
index 000000000..c5eb456c3
--- /dev/null
+++ b/berry_fix/payload/include/gba/isagbprint.h
@@ -0,0 +1,50 @@
+#ifndef GUARD_GBA_ISAGBPRINT_H
+#define GUARD_GBA_ISAGBPRINT_H
+
+#ifdef NDEBUG
+#define AGBPrintInit()
+#define AGBPutc(cChr)
+#define AGBPrint(pBuf)
+#define AGBPrintf(pBuf, ...)
+#define AGBPrintFlush1Block()
+#define AGBPrintFlush()
+#define AGBAssert(pFile, nLine, pExpression, nStopProgram)
+#else
+void AGBPrintInit(void);
+void AGBPutc(const char cChr);
+void AGBPrint(const char *pBuf);
+void AGBPrintf(const char *pBuf, ...);
+void AGBPrintFlush1Block(void);
+void AGBPrintFlush(void);
+void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram);
+#endif
+
+#undef AGB_ASSERT
+#ifdef NDEBUG
+#define AGB_ASSERT(exp)
+#else
+#define AGB_ASSERT(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 1);
+#endif
+
+#undef AGB_WARNING
+#ifdef NDEBUG
+#define AGB_WARNING(exp)
+#else
+#define AGB_WARNING(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 0);
+#endif
+
+// for matching purposes
+
+#ifdef NDEBUG
+#define AGB_ASSERT_EX(exp, file, line)
+#else
+#define AGB_ASSERT_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 1);
+#endif
+
+#ifdef NDEBUG
+#define AGB_WARNING_EX(exp, file, line)
+#else
+#define AGB_WARNING_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 0);
+#endif
+
+#endif // GUARD_GBA_ISAGBPRINT_H
diff --git a/berry_fix/payload/include/gba/m4a_internal.h b/berry_fix/payload/include/gba/m4a_internal.h
new file mode 100644
index 000000000..339a0774e
--- /dev/null
+++ b/berry_fix/payload/include/gba/m4a_internal.h
@@ -0,0 +1,467 @@
+#ifndef GUARD_GBA_M4A_INTERNAL_H
+#define GUARD_GBA_M4A_INTERNAL_H
+
+#include "gba/gba.h"
+
+// ASCII encoding of 'Smsh' in reverse
+// This is presumably short for SMASH, the developer of MKS4AGB.
+#define ID_NUMBER 0x68736D53
+
+#define C_V 0x40 // center value for PAN, BEND, and TUNE
+
+#define SOUND_MODE_REVERB_VAL 0x0000007F
+#define SOUND_MODE_REVERB_SET 0x00000080
+#define SOUND_MODE_MAXCHN 0x00000F00
+#define SOUND_MODE_MAXCHN_SHIFT 8
+#define SOUND_MODE_MASVOL 0x0000F000
+#define SOUND_MODE_MASVOL_SHIFT 12
+#define SOUND_MODE_FREQ_05734 0x00010000
+#define SOUND_MODE_FREQ_07884 0x00020000
+#define SOUND_MODE_FREQ_10512 0x00030000
+#define SOUND_MODE_FREQ_13379 0x00040000
+#define SOUND_MODE_FREQ_15768 0x00050000
+#define SOUND_MODE_FREQ_18157 0x00060000
+#define SOUND_MODE_FREQ_21024 0x00070000
+#define SOUND_MODE_FREQ_26758 0x00080000
+#define SOUND_MODE_FREQ_31536 0x00090000
+#define SOUND_MODE_FREQ_36314 0x000A0000
+#define SOUND_MODE_FREQ_40137 0x000B0000
+#define SOUND_MODE_FREQ_42048 0x000C0000
+#define SOUND_MODE_FREQ 0x000F0000
+#define SOUND_MODE_FREQ_SHIFT 16
+#define SOUND_MODE_DA_BIT_9 0x00800000
+#define SOUND_MODE_DA_BIT_8 0x00900000
+#define SOUND_MODE_DA_BIT_7 0x00A00000
+#define SOUND_MODE_DA_BIT_6 0x00B00000
+#define SOUND_MODE_DA_BIT 0x00B00000
+#define SOUND_MODE_DA_BIT_SHIFT 20
+
+struct WaveData
+{
+ u16 type;
+ u16 status;
+ u32 freq;
+ u32 loopStart;
+ u32 size; // number of samples
+ s8 data[1]; // samples
+};
+
+#define TONEDATA_TYPE_CGB 0x07
+#define TONEDATA_TYPE_FIX 0x08
+#define TONEDATA_TYPE_SPL 0x40 // key split
+#define TONEDATA_TYPE_RHY 0x80 // rhythm
+
+#define TONEDATA_P_S_PAN 0xc0
+#define TONEDATA_P_S_PAM TONEDATA_P_S_PAN
+
+struct ToneData
+{
+ u8 type;
+ u8 key;
+ u8 length; // sound length (compatible sound)
+ u8 pan_sweep; // pan or sweep (compatible sound ch. 1)
+ struct WaveData *wav;
+ u8 attack;
+ u8 decay;
+ u8 sustain;
+ u8 release;
+};
+
+struct CgbChannel
+{
+ u8 sf;
+ u8 ty;
+ u8 rightVolume;
+ u8 leftVolume;
+ u8 at;
+ u8 de;
+ u8 su;
+ u8 re;
+ u8 ky;
+ u8 ev;
+ u8 eg;
+ u8 ec;
+ u8 echoVolume;
+ u8 echoLength;
+ u8 d1;
+ u8 d2;
+ u8 gt;
+ u8 mk;
+ u8 ve;
+ u8 pr;
+ u8 rp;
+ u8 d3[3];
+ u8 d5;
+ u8 sg;
+ u8 n4;
+ u8 pan;
+ u8 panMask;
+ u8 mo;
+ u8 le;
+ u8 sw;
+ u32 fr;
+ u32 wp;
+ u32 cp;
+ u32 tp;
+ u32 pp;
+ u32 np;
+ u8 d4[8];
+};
+
+struct MusicPlayerTrack;
+
+struct SoundChannel
+{
+ u8 status;
+ u8 type;
+ u8 rightVolume;
+ u8 leftVolume;
+ u8 attack;
+ u8 decay;
+ u8 sustain;
+ u8 release;
+ u8 ky;
+ u8 ev;
+ u8 er;
+ u8 el;
+ u8 echoVolume;
+ u8 echoLength;
+ u8 d1;
+ u8 d2;
+ u8 gt;
+ u8 mk;
+ u8 ve;
+ u8 pr;
+ u8 rp;
+ u8 d3[3];
+ u32 ct;
+ u32 fw;
+ u32 freq;
+ struct WaveData *wav;
+ u32 cp;
+ struct MusicPlayerTrack *track;
+ u32 pp;
+ u32 np;
+ u32 d4;
+ u16 xpi;
+ u16 xpc;
+};
+
+#define MAX_DIRECTSOUND_CHANNELS 12
+
+#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer
+
+struct SoundInfo
+{
+ // This field is normally equal to ID_NUMBER but it is set to other
+ // values during sensitive operations for locking purposes.
+ // This field should be volatile but isn't. This could potentially cause
+ // race conditions.
+ u32 ident;
+
+ vu8 pcmDmaCounter;
+
+ // Direct Sound
+ u8 reverb;
+ u8 maxChans;
+ u8 masterVolume;
+ u8 freq;
+
+ u8 mode;
+ u8 c15;
+ u8 pcmDmaPeriod; // number of V-blanks per PCM DMA
+ u8 maxLines;
+ u8 gap[3];
+ s32 pcmSamplesPerVBlank;
+ s32 pcmFreq;
+ s32 divFreq;
+ struct CgbChannel *cgbChans;
+ u32 func;
+ u32 intp;
+ void (*CgbSound)(void);
+ void (*CgbOscOff)(u8);
+ u32 (*MidiKeyToCgbFreq)(u8, u8, u8);
+ u32 MPlayJumpTable;
+ u32 plynote;
+ u32 ExtVolPit;
+ u8 gap2[16];
+ struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS];
+ s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2];
+};
+
+struct SongHeader
+{
+ u8 trackCount;
+ u8 blockCount;
+ u8 priority;
+ u8 reverb;
+ struct ToneData *tone;
+ u8 *part[1];
+};
+
+struct PokemonCrySong
+{
+ u8 trackCount;
+ u8 blockCount;
+ u8 priority;
+ u8 reverb;
+ struct ToneData *tone;
+ u8 *part[2];
+ u8 gap;
+ u8 part0; // 0x11
+ u8 tuneValue; // 0x12
+ u8 gotoCmd; // 0x13
+ u32 gotoTarget; // 0x14
+ u8 part1; // 0x18
+ u8 tuneValue2; // 0x19
+ u8 cont[2]; // 0x1A
+ u8 volCmd; // 0x1C
+ u8 volumeValue; // 0x1D
+ u8 unkCmd0D[2]; // 0x1E
+ u32 unkCmd0DParam; // 0x20
+ u8 xreleCmd[2]; // 0x24
+ u8 releaseValue; // 0x26
+ u8 panCmd;
+ u8 panValue; // 0x28
+ u8 tieCmd; // 0x29
+ u8 tieKeyValue; // 0x2A
+ u8 tieVelocityValue; // 0x2B
+ u8 unkCmd0C[2]; // 0x2C
+ u16 unkCmd0CParam; // 0x2E
+ u8 end[2]; // 0x30
+};
+
+#define MPT_FLG_VOLSET 0x01
+#define MPT_FLG_VOLCHG 0x03
+#define MPT_FLG_PITSET 0x04
+#define MPT_FLG_PITCHG 0x0C
+#define MPT_FLG_START 0x40
+#define MPT_FLG_EXIST 0x80
+
+struct MusicPlayerTrack
+{
+ u8 flags;
+ u8 wait;
+ u8 patternLevel;
+ u8 repN;
+ u8 gateTime;
+ u8 key;
+ u8 velocity;
+ u8 runningStatus;
+ u8 keyM;
+ u8 pitM;
+ s8 keyShift;
+ s8 keyShiftX;
+ s8 tune;
+ u8 pitX;
+ s8 bend;
+ u8 bendRange;
+ u8 volMR;
+ u8 volML;
+ u8 vol;
+ u8 volX;
+ s8 pan;
+ s8 panX;
+ s8 modM;
+ u8 mod;
+ u8 modT;
+ u8 lfoSpeed;
+ u8 lfoSpeedC;
+ u8 lfoDelay;
+ u8 lfoDelayC;
+ u8 priority;
+ u8 echoVolume;
+ u8 echoLength;
+ struct SoundChannel *chan;
+ struct ToneData tone;
+ u8 gap[10];
+ u16 unk_3A;
+ u32 unk_3C;
+ u8 *cmdPtr;
+ u8 *patternStack[3];
+};
+
+#define MUSICPLAYER_STATUS_TRACK 0x0000ffff
+#define MUSICPLAYER_STATUS_PAUSE 0x80000000
+
+#define MAX_MUSICPLAYER_TRACKS 16
+
+#define TEMPORARY_FADE 0x0001
+#define FADE_IN 0x0002
+#define FADE_VOL_MAX 64
+#define FADE_VOL_SHIFT 2
+
+struct MusicPlayerInfo
+{
+ struct SongHeader *songHeader;
+ u32 status;
+ u8 trackCount;
+ u8 priority;
+ u8 cmd;
+ u8 unk_B;
+ u32 clock;
+ u8 gap[8];
+ u8 *memAccArea;
+ u16 tempoD;
+ u16 tempoU;
+ u16 tempoI;
+ u16 tempoC;
+ u16 fadeOI;
+ u16 fadeOC;
+ u16 fadeOV;
+ struct MusicPlayerTrack *tracks;
+ struct ToneData *tone;
+ u32 ident;
+ u32 func;
+ u32 intp;
+};
+
+struct MusicPlayer
+{
+ struct MusicPlayerInfo *info;
+ struct MusicPlayerTrack *track;
+ u8 unk_8;
+ u16 unk_A;
+};
+
+struct Song
+{
+ struct SongHeader *header;
+ u16 ms;
+ u16 me;
+};
+
+extern const struct MusicPlayer gMPlayTable[];
+extern const struct Song gSongTable[];
+
+
+
+extern u8 gMPlayMemAccArea[];
+
+//u8 gPokemonCrySong[52];
+//u8 gPokemonCrySongs[52 * MAX_POKEMON_CRIES];
+
+#define MAX_POKEMON_CRIES 2
+
+extern struct PokemonCrySong gPokemonCrySong;
+extern struct PokemonCrySong gPokemonCrySongs[];
+
+extern struct MusicPlayerInfo gPokemonCryMusicPlayers[];
+extern struct MusicPlayerTrack gPokemonCryTracks[];
+
+extern char SoundMainRAM[];
+
+extern void *gMPlayJumpTable[];
+
+typedef void (*XcmdFunc)(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+extern const XcmdFunc gXcmdTable[];
+
+extern struct CgbChannel gCgbChans[];
+
+extern const u8 gScaleTable[];
+extern const u32 gFreqTable[];
+extern const u16 gPcmSamplesPerVBlankTable[];
+
+extern const u8 gCgbScaleTable[];
+extern const s16 gCgbFreqTable[];
+extern const u8 gNoiseTable[];
+
+extern const struct PokemonCrySong gPokemonCrySongTemplate;
+
+extern const struct ToneData voicegroup000;
+
+extern char gNumMusicPlayers[];
+extern char gMaxLines[];
+
+#define NUM_MUSIC_PLAYERS ((u16)gNumMusicPlayers)
+#define MAX_LINES ((u32)gMaxLines)
+
+u32 umul3232H32(u32 multiplier, u32 multiplicand);
+void SoundMain(void);
+void SoundMainBTM(void);
+void TrackStop(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
+void MPlayMain(void);
+void RealClearChain(void *x);
+
+void MPlayContinue(struct MusicPlayerInfo *mplayInfo);
+void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader);
+void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);
+void FadeOutBody(struct MusicPlayerInfo *mplayInfo);
+void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
+void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);
+void ClearChain(void *x);
+void Clear64byte(void *addr);
+void SoundInit(struct SoundInfo *soundInfo);
+void MPlayExtender(struct CgbChannel *cgbChans);
+void m4aSoundMode(u32 mode);
+void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track, u8 a3);
+void CgbSound(void);
+void CgbOscOff(u8);
+u32 MidiKeyToCgbFreq(u8, u8, u8);
+void DummyFunc(void);
+void MPlayJumpTableCopy(void **mplayJumpTable);
+void SampleFreqSet(u32 freq);
+void m4aSoundVSyncOn(void);
+void m4aSoundVSyncOff(void);
+
+void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo);
+void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);
+void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch);
+void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan);
+void ClearModM(struct MusicPlayerTrack *track);
+void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth);
+void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed);
+
+struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone);
+void SetPokemonCryVolume(u8 val);
+void SetPokemonCryPanpot(s8 val);
+void SetPokemonCryPitch(s16 val);
+void SetPokemonCryLength(u16 val);
+void SetPokemonCryRelease(u8 val);
+void SetPokemonCryProgress(u32 val);
+int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo);
+void SetPokemonCryChorus(s8 val);
+void SetPokemonCryStereo(u32 val);
+void SetPokemonCryPriority(u8 val);
+
+// sound command handler functions
+void ply_fine(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_goto(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_patt(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_pend(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_rept(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_memacc(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_prio(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_tempo(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_keysh(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_voice(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_vol(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_pan(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_bend(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_bendr(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_lfos(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_lfodl(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_mod(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_modt(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+
+// extended sound command handler functions
+void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xwave(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xtype(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xatta(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xdeca(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xsust(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xrele(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xiecv(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xiecl(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xleng(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xswee(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xcmd_0C(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xcmd_0D(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+
+#endif // GUARD_GBA_M4A_INTERNAL_H
diff --git a/berry_fix/payload/include/gba/macro.h b/berry_fix/payload/include/gba/macro.h
new file mode 100644
index 000000000..6f9c55f2e
--- /dev/null
+++ b/berry_fix/payload/include/gba/macro.h
@@ -0,0 +1,247 @@
+#ifndef GUARD_GBA_MACRO_H
+#define GUARD_GBA_MACRO_H
+
+#define CPU_FILL(value, dest, size, bit) \
+{ \
+ vu##bit tmp = (vu##bit)(value); \
+ CpuSet((void *)&tmp, \
+ dest, \
+ CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size)/(bit/8) & 0x1FFFFF)); \
+}
+
+#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 CpuCopy16(src, dest, size) CPU_COPY(src, dest, size, 16)
+#define CpuCopy32(src, dest, size) CPU_COPY(src, dest, size, 32)
+
+#define CpuFastFill(value, dest, size) \
+{ \
+ vu32 tmp = (vu32)(value); \
+ CpuFastSet((void *)&tmp, \
+ dest, \
+ CPU_FAST_SET_SRC_FIXED | ((size)/(32/8) & 0x1FFFFF)); \
+}
+
+#define CpuFastFill16(value, dest, size) CpuFastFill(((value) << 16) | (value), (dest), (size))
+
+#define CpuFastFill8(value, dest, size) CpuFastFill(((value) << 24) | ((value) << 16) | ((value) << 8) | (value), (dest), (size))
+
+#define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF))
+
+#define DmaSet(dmaNum, src, dest, control) \
+{ \
+ vu32 *dmaRegs = (vu32 *)REG_ADDR_DMA##dmaNum; \
+ dmaRegs[0] = (vu32)(src); \
+ dmaRegs[1] = (vu32)(dest); \
+ dmaRegs[2] = (vu32)(control); \
+ dmaRegs[2]; \
+}
+
+#define DMA_FILL(dmaNum, value, dest, size, bit) \
+{ \
+ vu##bit tmp = (vu##bit)(value); \
+ DmaSet(dmaNum, \
+ &tmp, \
+ dest, \
+ (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_FIXED | DMA_DEST_INC) << 16 \
+ | ((size)/(bit/8))); \
+}
+
+#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)
+
+// Note that the DMA clear macros cause the DMA control value to be calculated
+// at runtime rather than compile time. The size is divided by the DMA transfer
+// 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) \
+{ \
+ vu##bit *_dest = (vu##bit *)(dest); \
+ u32 _size = size; \
+ DmaFill##bit(dmaNum, 0, _dest, _size); \
+}
+
+#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) \
+ DmaSet(dmaNum, \
+ src, \
+ dest, \
+ (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 \
+ | ((size)/(bit/8)))
+
+#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)
+
+#define DmaCopyLarge(dmaNum, src, dest, size, block, bit) \
+{ \
+ const void *_src = src; \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ DmaCopy##bit(dmaNum, _src, _dest, (block)); \
+ _src += (block); \
+ _dest += (block); \
+ _size -= (block); \
+ if (_size <= (block)) \
+ { \
+ DmaCopy##bit(dmaNum, _src, _dest, _size); \
+ break; \
+ } \
+ } \
+}
+
+#define DmaCopyLarge16(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 16)
+
+#define DmaCopyLarge32(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 32)
+
+#define DmaFillLarge(dmaNum, value, dest, size, block, bit) \
+{ \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ DmaFill##bit(dmaNum, value, _dest, (block)); \
+ _dest += (block); \
+ _size -= (block); \
+ if (_size <= (block)) \
+ { \
+ DmaFill##bit(dmaNum, value, _dest, _size); \
+ break; \
+ } \
+ } \
+}
+
+#define DmaFillLarge16(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 16)
+
+#define DmaFillLarge32(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 32)
+
+#define DmaClearLarge(dmaNum, dest, size, block, bit) \
+{ \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ DmaFill##bit(dmaNum, 0, _dest, (block)); \
+ _dest += (block); \
+ _size -= (block); \
+ if (_size <= (block)) \
+ { \
+ DmaFill##bit(dmaNum, 0, _dest, _size); \
+ break; \
+ } \
+ } \
+}
+
+#define DmaClearLarge16(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 16)
+
+#define DmaClearLarge32(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 32)
+
+#define DmaCopyDefvars(dmaNum, src, dest, size, bit) \
+{ \
+ const void *_src = src; \
+ void *_dest = (void *)(dest); \
+ u32 _size = size; \
+ DmaCopy##bit(dmaNum, _src, _dest, _size); \
+}
+
+#define DmaCopy16Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 16)
+#define DmaCopy32Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 32)
+
+#define DmaFillDefvars(dmaNum, value, dest, size, bit) \
+{ \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ DmaFill##bit(dmaNum, value, _dest, _size); \
+}
+
+#define DmaFill16Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 16)
+#define DmaFill32Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 32)
+
+#define DmaClearDefvars(dmaNum, dest, size, bit) \
+{ \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ DmaClear##bit(dmaNum, _dest, _size); \
+}
+
+#define DmaClear16Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 16)
+#define DmaClear32Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 32)
+
+#define DmaStop(dmaNum) \
+{ \
+ vu16 *dmaRegs = (vu16 *)REG_ADDR_DMA##dmaNum; \
+ dmaRegs[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT); \
+ dmaRegs[5] &= ~DMA_ENABLE; \
+ dmaRegs[5]; \
+}
+
+#define IntrEnable(flags) \
+{ \
+ u16 imeTemp; \
+ \
+ imeTemp = REG_IME; \
+ REG_IME = 0; \
+ REG_IE |= flags; \
+ REG_IME = imeTemp; \
+} \
+// from pokeemerald
+// Maximum amount of data we will transfer in one operation
+#define MAX_DMA_BLOCK_SIZE 0x1000
+
+#define MAX_DMA_REQUESTS 128
+
+#define DMA_REQUEST_COPY32 1
+#define DMA_REQUEST_FILL32 2
+#define DMA_REQUEST_COPY16 3
+#define DMA_REQUEST_FILL16 4
+
+#define Dma3CopyLarge_(src, dest, size, bit) \
+{ \
+ const void *_src = src; \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaCopy##bit(3, _src, _dest, _size); \
+ break; \
+ } \
+ DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \
+ _src += MAX_DMA_BLOCK_SIZE; \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16)
+#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32)
+
+#define Dma3FillLarge_(value, dest, size, bit) \
+{ \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaFill##bit(3, value, _dest, _size); \
+ break; \
+ } \
+ DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
+#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
+
+#endif // GUARD_GBA_MACRO_H
diff --git a/berry_fix/payload/include/gba/multiboot.h b/berry_fix/payload/include/gba/multiboot.h
new file mode 100644
index 000000000..14b6594b2
--- /dev/null
+++ b/berry_fix/payload/include/gba/multiboot.h
@@ -0,0 +1,55 @@
+#ifndef GUARD_GBA_MULTIBOOT_H
+#define GUARD_GBA_MULTIBOOT_H
+
+#define MULTIBOOT_NCHILD 3 // Maximum number of slaves
+#define MULTIBOOT_HEADER_SIZE 0xc0 // Header size
+#define MULTIBOOT_SEND_SIZE_MIN 0x100 // Minimum transmission size
+#define MULTIBOOT_SEND_SIZE_MAX 0x40000 // Maximum transmission size
+
+struct MultiBootParam
+{
+ u32 system_work[5]; // 00
+ u8 handshake_data; // 14
+ u8 padding; // 15
+ u16 handshake_timeout; // 16
+ u8 probe_count; // 18
+ u8 client_data[MULTIBOOT_NCHILD]; // 19
+ u8 palette_data; // 1c
+ u8 response_bit; // 1d
+ u8 client_bit; // 1e
+ u8 reserved1; // 1f
+ const u8 *boot_srcp; // 20
+ const u8 *boot_endp; // 24
+ const u8 *masterp;
+ u8 *reserved2[MULTIBOOT_NCHILD];
+ u32 system_work2[4];
+ u8 sendflag;
+ u8 probe_target_bit;
+ u8 check_wait;
+ u8 server_type;
+};
+
+#define MULTIBOOT_ERROR_04 0x04
+#define MULTIBOOT_ERROR_08 0x08
+#define MULTIBOOT_ERROR_0c 0x0c
+#define MULTIBOOT_ERROR_40 0x40
+#define MULTIBOOT_ERROR_44 0x44
+#define MULTIBOOT_ERROR_48 0x48
+#define MULTIBOOT_ERROR_4c 0x4c
+#define MULTIBOOT_ERROR_80 0x80
+#define MULTIBOOT_ERROR_84 0x84
+#define MULTIBOOT_ERROR_88 0x88
+#define MULTIBOOT_ERROR_8c 0x8c
+#define MULTIBOOT_ERROR_NO_PROBE_TARGET 0x50
+#define MULTIBOOT_ERROR_NO_DLREADY 0x60
+#define MULTIBOOT_ERROR_BOOT_FAILURE 0x70
+#define MULTIBOOT_ERROR_HANDSHAKE_FAILURE 0x71
+
+#define MULTIBOOT_CONNECTION_CHECK_WAIT 15
+
+#define MULTIBOOT_SERVER_TYPE_NORMAL 0
+#define MULTIBOOT_SERVER_TYPE_QUICK 1
+
+#define MULTIBOOT_HANDSHAKE_TIMEOUT 400
+
+#endif // GUARD_GBA_MULTIBOOT_H
diff --git a/berry_fix/payload/include/gba/syscall.h b/berry_fix/payload/include/gba/syscall.h
new file mode 100644
index 000000000..eb1bd4e20
--- /dev/null
+++ b/berry_fix/payload/include/gba/syscall.h
@@ -0,0 +1,57 @@
+#ifndef GUARD_GBA_SYSCALL_H
+#define GUARD_GBA_SYSCALL_H
+
+#include "gba/types.h"
+
+#define RESET_EWRAM 0x01
+#define RESET_IWRAM 0x02
+#define RESET_PALETTE 0x04
+#define RESET_VRAM 0x08
+#define RESET_OAM 0x10
+#define RESET_SIO_REGS 0x20
+#define RESET_SOUND_REGS 0x40
+#define RESET_REGS 0x80
+#define RESET_ALL 0xFF
+
+void SoftReset(u32 resetFlags);
+
+void RegisterRamReset(u32 resetFlags);
+
+void VBlankIntrWait(void);
+
+u16 Sqrt(u32 num);
+
+u16 ArcTan2(s16 x, s16 y);
+
+#define CPU_SET_SRC_FIXED 0x01000000
+#define CPU_SET_16BIT 0x00000000
+#define CPU_SET_32BIT 0x04000000
+
+void CpuSet(const void *src, void *dest, u32 control);
+
+#define CPU_FAST_SET_SRC_FIXED 0x01000000
+
+void CpuFastSet(const void *src, void *dest, u32 control);
+
+void BgAffineSet(struct BgAffineSrcData *src, struct BgAffineDstData *dest, s32 count);
+
+void ObjAffineSet(struct ObjAffineSrcData *src, void *dest, s32 count, s32 offset);
+
+void LZ77UnCompWram(const void *src, void *dest);
+
+void LZ77UnCompVram(const void *src, void *dest);
+
+void RLUnCompWram(const void *src, void *dest);
+
+void RLUnCompVram(const void *src, void *dest);
+
+int MultiBoot(struct MultiBootParam *mp);
+
+void SoundBiasReset(void);
+
+void SoundBiasSet(void);
+
+u32 Div(u32 divisor, u32 dividend);
+u32 Mod(u32 divisor, u32 dividend);
+
+#endif // GUARD_GBA_SYSCALL_H
diff --git a/berry_fix/payload/include/gba/types.h b/berry_fix/payload/include/gba/types.h
new file mode 100644
index 000000000..e919abc22
--- /dev/null
+++ b/berry_fix/payload/include/gba/types.h
@@ -0,0 +1,146 @@
+#ifndef GUARD_GBA_TYPES_H
+#define GUARD_GBA_TYPES_H
+
+#include <stdint.h>
+
+typedef uint8_t u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+typedef uint64_t u64;
+typedef int8_t s8;
+typedef int16_t s16;
+typedef int32_t s32;
+typedef int64_t s64;
+
+typedef volatile u8 vu8;
+typedef volatile u16 vu16;
+typedef volatile u32 vu32;
+typedef volatile u64 vu64;
+typedef volatile s8 vs8;
+typedef volatile s16 vs16;
+typedef volatile s32 vs32;
+typedef volatile s64 vs64;
+
+typedef float f32;
+typedef double f64;
+
+typedef u8 bool8;
+typedef u16 bool16;
+typedef u32 bool32;
+
+struct BgCnt
+{
+ u16 priority:2;
+ u16 charBaseBlock:2;
+ u16 dummy:2;
+ u16 mosaic:1;
+ u16 palettes:1;
+ u16 screenBaseBlock:5;
+ u16 areaOverflowMode:1;
+ u16 screenSize:2;
+};
+typedef volatile struct BgCnt vBgCnt;
+
+struct PlttData
+{
+ u16 r:5; // red
+ u16 g:5; // green
+ u16 b:5; // blue
+ u16 unused_15:1;
+};
+
+struct OamData
+{
+ /*0x00*/ u32 y:8;
+ /*0x01*/ u32 affineMode:2; // 0x1, 0x2 -> 0x4
+ u32 objMode:2; // 0x4, 0x8 -> 0xC
+ u32 mosaic:1; // 0x10
+ u32 bpp:1; // 0x20
+ u32 shape:2; // 0x40, 0x80 -> 0xC0
+
+ /*0x02*/ u32 x:9;
+ u32 matrixNum:5; // bits 3/4 are h-flip/v-flip if not in affine mode
+ u32 size:2;
+
+ /*0x04*/ u16 tileNum:10; // 0x3FF
+ u16 priority:2; // 0x400, 0x800 -> 0xC00
+ u16 paletteNum:4;
+ /*0x06*/ u16 affineParam;
+};
+
+#define ST_OAM_OBJ_NORMAL 0
+#define ST_OAM_OBJ_BLEND 1
+#define ST_OAM_OBJ_WINDOW 2
+
+#define ST_OAM_AFFINE_OFF 0
+#define ST_OAM_AFFINE_NORMAL 1
+#define ST_OAM_AFFINE_ERASE 2
+#define ST_OAM_AFFINE_DOUBLE 3
+
+#define ST_OAM_AFFINE_ON_MASK 1
+#define ST_OAM_AFFINE_DOUBLE_MASK 2
+
+#define ST_OAM_4BPP 0
+#define ST_OAM_8BPP 1
+
+#define ST_OAM_SQUARE 0
+#define ST_OAM_H_RECTANGLE 1
+#define ST_OAM_V_RECTANGLE 2
+
+struct BgAffineSrcData
+{
+ s32 texX;
+ s32 texY;
+ s16 scrX;
+ s16 scrY;
+ s16 sx;
+ s16 sy;
+ u16 alpha;
+};
+
+struct BgAffineDstData
+{
+ s16 pa;
+ s16 pb;
+ s16 pc;
+ s16 pd;
+ s32 dx;
+ s32 dy;
+};
+
+struct ObjAffineSrcData
+{
+ s16 xScale;
+ s16 yScale;
+ u16 rotation;
+};
+
+// Multi-player SIO Control Structure
+struct SioMultiCnt
+{
+ u16 baudRate:2; // baud rate
+ u16 si:1; // SI terminal
+ u16 sd:1; // SD terminal
+ u16 id:2; // ID
+ u16 error:1; // error flag
+ u16 enable:1; // SIO enable
+ u16 unused_11_8:4;
+ u16 mode:2; // communication mode (should equal 2)
+ u16 intrEnable:1; // IRQ enable
+ u16 unused_15:1;
+ u16 data; // data
+};
+
+#define ST_SIO_MULTI_MODE 2 // Multi-player communication mode
+
+// baud rate
+#define ST_SIO_9600_BPS 0 // 9600 bps
+#define ST_SIO_38400_BPS 1 // 38400 bps
+#define ST_SIO_57600_BPS 2 // 57600 bps
+#define ST_SIO_115200_BPS 3 // 115200 bps
+
+typedef void (*MainCallback)(void);
+typedef void (*IntrCallback)(void);
+typedef void (*IntrFunc)(void);
+
+#endif // GUARD_GBA_TYPES_H
diff --git a/berry_fix/payload/include/global.berry.h b/berry_fix/payload/include/global.berry.h
new file mode 100644
index 000000000..8f185c8f9
--- /dev/null
+++ b/berry_fix/payload/include/global.berry.h
@@ -0,0 +1,62 @@
+#ifndef GUARD_GLOBAL_BERRY_H
+#define GUARD_GLOBAL_BERRY_H
+
+struct Berry
+{
+ /*0x00*/ u8 name[7];
+ /*0x07*/ u8 firmness;
+ /*0x08*/ u16 size;
+ /*0x0A*/ u8 maxYield;
+ /*0x0B*/ u8 minYield;
+ /*0x0C*/ const u8 *description1;
+ /*0x10*/ const u8 *description2;
+ /*0x14*/ u8 stageDuration;
+ /*0x15*/ u8 spicy;
+ /*0x16*/ u8 dry;
+ /*0x17*/ u8 sweet;
+ /*0x18*/ u8 bitter;
+ /*0x19*/ u8 sour;
+ /*0x1A*/ u8 smoothness;
+};
+
+struct EnigmaBerry
+{
+ /*0x000*/ struct Berry berry;
+ /*0x01B*/ u8 pic[(6 * 6) * TILE_SIZE_4BPP];
+ /*0x49C*/ u16 palette[16];
+ /*0x4BC*/ u8 description1[45];
+ /*0x4E9*/ u8 description2[45];
+ /*0x516*/ u8 itemEffect[18];
+ /*0x528*/ u8 holdEffect;
+ /*0x529*/ u8 holdEffectParam;
+ /*0x52C*/ u32 checksum;
+};
+
+struct BattleEnigmaBerry
+{
+ /*0x00*/ u8 name[7];
+ /*0x07*/ u8 holdEffect;
+ /*0x08*/ u8 itemEffect[18];
+ /*0x1A*/ u8 holdEffectParam;
+};
+
+struct BerryTree
+{
+ /*0x00*/ u8 berry;
+ /*0x01*/ u8 stage:7;
+ /*
+ A berry sparkle is a state that a berry tree
+ can be in after growing within the player's
+ viewport.
+ */
+ /*0x01*/ bool8 growthSparkle:1;
+ /*0x02*/ u16 minutesUntilNextStage;
+ /*0x04*/ u8 berryYield;
+ /*0x05*/ u8 regrowthCount:4;
+ /*0x05*/ u8 watered1:1;
+ /*0x05*/ u8 watered2:1;
+ /*0x05*/ u8 watered3:1;
+ /*0x05*/ u8 watered4:1;
+};
+
+#endif // GUARD_GLOBAL_BERRY_H
diff --git a/berry_fix/payload/include/global.fieldmap.h b/berry_fix/payload/include/global.fieldmap.h
new file mode 100644
index 000000000..f876e5a56
--- /dev/null
+++ b/berry_fix/payload/include/global.fieldmap.h
@@ -0,0 +1,317 @@
+#ifndef GUARD_GLOBAL_FIELDMAP_H
+#define GUARD_GLOBAL_FIELDMAP_H
+
+enum
+{
+ CONNECTION_SOUTH = 1,
+ CONNECTION_NORTH,
+ CONNECTION_WEST,
+ CONNECTION_EAST,
+ CONNECTION_DIVE,
+ CONNECTION_EMERGE
+};
+
+typedef void (*TilesetCB)(void);
+
+struct Tileset
+{
+ /*0x00*/ bool8 isCompressed;
+ /*0x01*/ bool8 isSecondary;
+ /*0x04*/ void *tiles;
+ /*0x08*/ void *palettes;
+ /*0x0c*/ void *metatiles;
+ /*0x10*/ void *metatileAttributes;
+ /*0x14*/ TilesetCB callback;
+};
+
+struct MapLayout
+{
+ /*0x00*/ s32 width;
+ /*0x04*/ s32 height;
+ /*0x08*/ u16 *border;
+ /*0x0c*/ u16 *map;
+ /*0x10*/ struct Tileset *primaryTileset;
+ /*0x14*/ struct Tileset *secondaryTileset;
+};
+
+struct BackupMapLayout
+{
+ s32 width;
+ s32 height;
+ u16 *map;
+};
+
+struct EventObjectTemplate
+{
+ /*0x00*/ u8 localId;
+ /*0x01*/ u8 graphicsId;
+ /*0x02*/ u8 unk2;
+ /*0x04*/ s16 x;
+ /*0x06*/ s16 y;
+ /*0x08*/ u8 elevation;
+ /*0x09*/ u8 movementType;
+ /*0x0A*/ u8 movementRangeX:4;
+ u8 movementRangeY:4;
+ /*0x0C*/ u16 trainerType;
+ /*0x0E*/ u16 trainerRange_berryTreeId;
+ /*0x10*/ u8 *script;
+ /*0x14*/ u16 flagId;
+};
+
+struct WarpEvent
+{
+ s16 x, y;
+ u8 elevation;
+ u8 warpId;
+ u8 mapNum;
+ u8 mapGroup;
+};
+
+struct CoordEvent
+{
+ s16 x, y;
+ u8 elevation;
+ u16 trigger;
+ u16 index;
+ u8 filler_A[0x2];
+ u8 *script;
+};
+
+struct BgEvent
+{
+ /*0x00*/u16 x;
+ /*0x02*/u16 y;
+ /*0x04*/u8 elevation;
+ /*0x05*/u8 kind;
+ /*0x08*/union { // carried over from diego's FR/LG work, seems to be the same struct
+ // in gen 3, "kind" (0x3 in BgEvent struct) determines the method to read the union.
+ u8 *script;
+
+ // hidden item type
+ struct {
+ u16 item;
+ u16 hiddenItemId; // flag offset to determine flag lookup
+ } hiddenItem;
+
+ // secret base type
+ u32 secretBaseId;
+
+ } bgUnion;
+};
+
+struct MapEvents
+{
+ u8 eventObjectCount;
+ u8 warpCount;
+ u8 coordEventCount;
+ u8 bgEventCount;
+
+ struct EventObjectTemplate *eventObjects;
+ struct WarpEvent *warps;
+ struct CoordEvent *coordEvents;
+ struct BgEvent *bgEvents;
+};
+
+struct MapConnection
+{
+ /*0x00*/ u8 direction;
+ /*0x01*/ u32 offset;
+ /*0x05*/ u8 mapGroup;
+ /*0x06*/ u8 mapNum;
+};
+
+struct MapConnections
+{
+ s32 count;
+ struct MapConnection *connections;
+};
+
+struct MapHeader
+{
+ /* 0x00 */ struct MapLayout *mapLayout;
+ /* 0x04 */ struct MapEvents *events;
+ /* 0x08 */ u8 *mapScripts;
+ /* 0x0C */ struct MapConnections *connections;
+ /* 0x10 */ u16 music;
+ /* 0x12 */ u16 mapLayoutId;
+ /* 0x14 */ u8 regionMapSectionId;
+ /* 0x15 */ u8 cave;
+ /* 0x16 */ u8 weather;
+ /* 0x17 */ u8 mapType;
+ /* 0x18 */ u8 filler_18;
+ /* 0x19 */ u8 escapeRope;
+ /* 0x1A */ u8 flags;
+ /* 0x1B */ u8 battleType;
+};
+
+struct EventObject
+{
+ /*0x00*/ u32 active:1;
+ u32 singleMovementActive:1;
+ u32 triggerGroundEffectsOnMove:1;
+ u32 triggerGroundEffectsOnStop:1;
+ u32 disableCoveringGroundEffects:1; // disables ground effects that cover parts of the object's sprite
+ u32 landingJump:1;
+ u32 heldMovementActive:1;
+ u32 heldMovementFinished:1;
+ /*0x01*/ u32 frozen:1;
+ u32 facingDirectionLocked:1;
+ u32 disableAnim:1; // used to disable forced movement sliding animations (like on ice)
+ u32 enableAnim:1;
+ u32 inanimate:1;
+ u32 invisible:1;
+ u32 offScreen:1;
+ u32 trackedByCamera:1; // only set for the player object
+ /*0x02*/ u32 isPlayer:1;
+ u32 hasReflection:1;
+ u32 inShortGrass:1;
+ u32 inShallowFlowingWater:1;
+ u32 inSandPile:1;
+ u32 inHotSprings:1;
+ u32 hasShadow:1;
+ u32 spriteAnimPausedBackup:1;
+ /*0x03*/ u32 spriteAffineAnimPausedBackup:1;
+ u32 disableJumpLandingGroundEffect:1;
+ u32 fixedPriority:1;
+ /*0x04*/ u8 spriteId;
+ /*0x05*/ u8 graphicsId;
+ /*0x06*/ u8 movementType;
+ /*0x07*/ u8 trainerType;
+ /*0x08*/ u8 localId;
+ /*0x09*/ u8 mapNum;
+ /*0x0A*/ u8 mapGroup;
+ /*0x0B*/ u8 currentElevation:4;
+ u8 previousElevation:4;
+ /*0x0C*/ struct Coords16 initialCoords;
+ /*0x10*/ struct Coords16 currentCoords;
+ /*0x14*/ struct Coords16 previousCoords;
+ /*0x18*/ u8 facingDirection:4;
+ /*0x18*/ u8 movementDirection:4;
+ /*0x19*/ union __attribute__((packed)) {
+ u8 as_byte;
+ struct __attribute__((packed)) {
+ u16 x:4;
+ u16 y:4;
+ } as_nybbles;
+ } range;
+ /*0x1A*/ u8 fieldEffectSpriteId;
+ /*0x1B*/ u8 warpArrowSpriteId;
+ /*0x1C*/ u8 movementActionId;
+ /*0x1D*/ u8 trainerRange_berryTreeId;
+ /*0x1E*/ u8 currentMetatileBehavior;
+ /*0x1F*/ u8 previousMetatileBehavior;
+ /*0x20*/ u8 previousMovementDirection;
+ /*0x21*/ u8 directionSequenceIndex;
+ /*0x22*/ u8 playerCopyableMovement; // used as an index to gCopyPlayerMovementFuncs for the "copy player" movement types
+ /*size = 0x24*/
+};
+
+struct EventObjectGraphicsInfo
+{
+ /*0x00*/ u16 tileTag;
+ /*0x02*/ u16 paletteTag;
+ /*0x04*/ u16 bridgeReflectionPaletteTag;
+ /*0x06*/ u16 size;
+ /*0x08*/ s16 width;
+ /*0x0A*/ s16 height;
+ /*0x0C*/ u8 paletteSlot:4;
+ u8 shadowSize:2;
+ u8 inanimate:1;
+ u8 disableReflectionPaletteLoad:1;
+ /*0x0D*/ u8 tracks;
+ /*0x10*/ const struct OamData *oam;
+ /*0x14*/ const struct SubspriteTable *subspriteTables;
+ /*0x18*/ const union AnimCmd *const *anims;
+ /*0x1C*/ const struct SpriteFrameImage *images;
+ /*0x20*/ const union AffineAnimCmd *const *affineAnims;
+};
+
+#define PLAYER_AVATAR_FLAG_ON_FOOT (1 << 0)
+#define PLAYER_AVATAR_FLAG_MACH_BIKE (1 << 1)
+#define PLAYER_AVATAR_FLAG_ACRO_BIKE (1 << 2)
+#define PLAYER_AVATAR_FLAG_SURFING (1 << 3)
+#define PLAYER_AVATAR_FLAG_UNDERWATER (1 << 4)
+#define PLAYER_AVATAR_FLAG_5 (1 << 5)
+#define PLAYER_AVATAR_FLAG_6 (1 << 6)
+#define PLAYER_AVATAR_FLAG_DASH (1 << 7)
+
+enum
+{
+ ACRO_BIKE_NORMAL,
+ ACRO_BIKE_TURNING,
+ ACRO_BIKE_WHEELIE_STANDING,
+ ACRO_BIKE_BUNNY_HOP,
+ ACRO_BIKE_WHEELIE_MOVING,
+ ACRO_BIKE_STATE5,
+ ACRO_BIKE_STATE6,
+};
+
+enum
+{
+ DIR_NONE,
+ DIR_SOUTH,
+ DIR_NORTH,
+ DIR_WEST,
+ DIR_EAST,
+ DIR_SOUTHWEST,
+ DIR_SOUTHEAST,
+ DIR_NORTHWEST,
+ DIR_NORTHEAST,
+};
+
+enum
+{
+ COLLISION_LEDGE_JUMP = 6
+};
+
+// player running states
+enum
+{
+ NOT_MOVING,
+ TURN_DIRECTION, // not the same as turning! turns your avatar without moving. also known as a turn frame in some circles
+ MOVING,
+};
+
+// player tile transition states
+enum
+{
+ T_NOT_MOVING,
+ T_TILE_TRANSITION,
+ T_TILE_CENTER, // player is on a frame in which they are centered on a tile during which the player either stops or keeps their momentum and keeps going, changing direction if necessary.
+};
+
+struct PlayerAvatar /* 0x202E858 */
+{
+ /*0x00*/ u8 flags;
+ /*0x01*/ u8 unk1; // used to be named bike, but its definitely not that. seems to be some transition flags
+ /*0x02*/ u8 runningState; // this is a static running state. 00 is not moving, 01 is turn direction, 02 is moving.
+ /*0x03*/ u8 tileTransitionState; // this is a transition running state: 00 is not moving, 01 is transition between tiles, 02 means you are on the frame in which you have centered on a tile but are about to keep moving, even if changing directions. 2 is also used for a ledge hop, since you are transitioning.
+ /*0x04*/ u8 spriteId;
+ /*0x05*/ u8 eventObjectId;
+ /*0x06*/ bool8 preventStep;
+ /*0x07*/ u8 gender;
+ /*0x08*/ u8 acroBikeState; // 00 is normal, 01 is turning, 02 is standing wheelie, 03 is hopping wheelie
+ /*0x09*/ u8 newDirBackup; // during bike movement, the new direction as opposed to player's direction is backed up here.
+ /*0x0A*/ u8 bikeFrameCounter; // on the mach bike, when this value is 1, the bike is moving but not accelerating yet for 1 tile. on the acro bike, this acts as a timer for acro bike.
+ /*0x0B*/ u8 bikeSpeed;
+ // acro bike only
+ /*0x0C*/ u32 directionHistory; // up/down/left/right history is stored in each nybble, but using the field directions and not the io inputs.
+ /*0x10*/ u32 abStartSelectHistory; // same as above but for A + B + start + select only
+ // these two are timer history arrays which [0] is the active timer for acro bike. every element is backed up to the next element upon update.
+ /*0x14*/ u8 dirTimerHistory[8];
+ /*0x1C*/ u8 abStartSelectTimerHistory[8];
+};
+
+struct Camera
+{
+ bool8 active:1;
+ s32 x;
+ s32 y;
+};
+
+extern struct EventObject gMapObjects[];
+extern u8 gSelectedEventObject;
+extern struct MapHeader gMapHeader;
+extern struct PlayerAvatar gPlayerAvatar;
+
+#endif // GUARD_GLOBAL_FIELDMAP_H
diff --git a/berry_fix/payload/include/global.h b/berry_fix/payload/include/global.h
new file mode 100644
index 000000000..c218b5f4e
--- /dev/null
+++ b/berry_fix/payload/include/global.h
@@ -0,0 +1,875 @@
+#ifndef GUARD_GLOBAL_H
+#define GUARD_GLOBAL_H
+
+#include "gba/gba.h"
+
+// global.h from pokemon ruby
+
+// IDE support
+#if defined(__APPLE__) || defined(__CYGWIN__)
+#define _(x) x
+#define __(x) x
+#define INCBIN(x) {0}
+#define INCBIN_U8 INCBIN
+#define INCBIN_U16 INCBIN
+#define INCBIN_U32 INCBIN
+#define INCBIN_S8 INCBIN
+#define INCBIN_S16 INCBIN
+#define INCBIN_S32 INCBIN
+#endif
+
+// Prevent cross-jump optimization.
+#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\n")
+
+#define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0]))
+
+
+#define POKEMON_SLOTS_NUMBER 412
+#define POKEMON_NAME_LENGTH 10
+#define OT_NAME_LENGTH 7
+
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#define max(a, b) ((a) >= (b) ? (a) : (b))
+
+// why does GF hate 2d arrays
+#define MULTI_DIM_ARR(x, dim, y) ((x) * dim + (y))
+
+// dim access enums
+enum
+{
+ B_8 = 1,
+ B_16 = 2,
+ B_32 = 4
+};
+
+// There are many quirks in the source code which have overarching behavioral differences from
+// a number of other files. For example, diploma.c seems to declare rodata before each use while
+// other files declare out of order and must be at the beginning. There are also a number of
+// macros which differ from one file to the next due to the method of obtaining the result, such
+// as these below. Because of this, there is a theory (Two Team Theory) that states that these
+// programming projects had more than 1 "programming team" which utilized different macros for
+// each of the files that were worked on.
+#define T1_READ_8(ptr) ((ptr)[0])
+#define T1_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8))
+#define T1_READ_32(ptr) ((ptr)[0] | ((ptr)[1] << 8) | ((ptr)[2] << 16) | ((ptr)[3] << 24))
+#define T1_READ_PTR(ptr) (u8*) T1_READ_32(ptr)
+
+// T2_READ_8 is a duplicate to remain consistent with each group.
+#define T2_READ_8(ptr) ((ptr)[0])
+#define T2_READ_16(ptr) ((ptr)[0] + ((ptr)[1] << 8))
+#define T2_READ_32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24))
+#define T2_READ_PTR(ptr) (void*) T2_READ_32(ptr)
+
+// Credits to Made (dolphin emoji)
+#define S16TOPOSFLOAT(val) \
+({ \
+ s16 v = (val); \
+ float f = (float)v; \
+ if(v < 0) f += 65536.0f; \
+ f; \
+})
+
+enum
+{
+ VERSION_SAPPHIRE = 1,
+ VERSION_RUBY = 2,
+ VERSION_EMERALD = 3,
+};
+
+enum LanguageId
+{
+ LANGUAGE_JAPANESE = 1,
+ LANGUAGE_ENGLISH = 2,
+ LANGUAGE_GERMAN = 5,
+};
+
+// capacities of various saveblock objects
+#define DAYCARE_MON_COUNT 2
+#define POKEBLOCKS_COUNT 40
+#define PARTY_SIZE 6
+#define EVENT_OBJECTS_COUNT 16
+#define BERRY_TREES_COUNT 128
+#define FLAGS_COUNT 288
+#define VARS_COUNT 256
+#define MAIL_COUNT 16
+#define SECRET_BASES_COUNT 20
+#define TV_SHOWS_COUNT 25
+#define POKE_NEWS_COUNT 16
+#define PC_ITEMS_COUNT 50
+#define BAG_ITEMS_COUNT 20
+#define BAG_KEYITEMS_COUNT 20
+#define BAG_POKEBALLS_COUNT 16
+#define BAG_TMHM_COUNT 64
+#define BAG_BERRIES_COUNT 46
+
+enum
+{
+ MALE,
+ FEMALE
+};
+
+enum
+{
+ OPTIONS_BUTTON_MODE_NORMAL,
+ OPTIONS_BUTTON_MODE_LR,
+ OPTIONS_BUTTON_MODE_L_EQUALS_A
+};
+
+enum
+{
+ OPTIONS_TEXT_SPEED_SLOW,
+ OPTIONS_TEXT_SPEED_MID,
+ OPTIONS_TEXT_SPEED_FAST
+};
+
+enum
+{
+ OPTIONS_SOUND_MONO,
+ OPTIONS_SOUND_STEREO
+};
+
+enum
+{
+ OPTIONS_BATTLE_STYLE_SHIFT,
+ OPTIONS_BATTLE_STYLE_SET
+};
+
+enum
+{
+ BAG_ITEMS = 1,
+ BAG_POKEBALLS,
+ BAG_TMsHMs,
+ BAG_BERRIES,
+ BAG_KEYITEMS
+};
+
+struct Coords16
+{
+ s16 x;
+ s16 y;
+};
+
+struct UCoords16
+{
+ u16 x;
+ u16 y;
+};
+
+struct SecretBaseRecord
+{
+ /*0x1A08*/ u8 secretBaseId;
+ /*0x1A09*/ u8 sbr_field_1_0:4;
+ /*0x1A09*/ u8 gender:1;
+ /*0x1A09*/ u8 sbr_field_1_5:1;
+ /*0x1A09*/ u8 sbr_field_1_6:2;
+ /*0x1A0A*/ u8 playerName[OT_NAME_LENGTH];
+ /*0x1A11*/ u8 trainerId[4]; // byte 0 is used for determining trainer class
+ /*0x1A16*/ u16 sbr_field_e;
+ /*0x1A18*/ u8 sbr_field_10;
+ /*0x1A19*/ u8 sbr_field_11;
+ /*0x1A1A*/ u8 decorations[16];
+ /*0x1A2A*/ u8 decorationPos[16];
+ /*0x1A3C*/ u32 partyPersonality[6];
+ /*0x1A54*/ u16 partyMoves[6 * 4];
+ /*0x1A84*/ u16 partySpecies[6];
+ /*0x1A90*/ u16 partyHeldItems[6];
+ /*0x1A9C*/ u8 partyLevels[6];
+ /*0x1AA2*/ u8 partyEVs[6];
+};
+
+#include "constants/game_stat.h"
+#include "global.fieldmap.h"
+#include "global.berry.h"
+#include "pokemon.h"
+
+struct WarpData
+{
+ s8 mapGroup;
+ s8 mapNum;
+ s8 warpId;
+ s16 x, y;
+};
+
+struct ItemSlot
+{
+ u16 itemId;
+ u16 quantity;
+};
+
+struct Pokeblock
+{
+ u8 color;
+ u8 spicy;
+ u8 dry;
+ u8 sweet;
+ u8 bitter;
+ u8 sour;
+ u8 feel;
+};
+
+struct Roamer
+{
+ /*0x00*/ u32 ivs;
+ /*0x04*/ u32 personality;
+ /*0x08*/ u16 species;
+ /*0x0A*/ u16 hp;
+ /*0x0C*/ u8 level;
+ /*0x0D*/ u8 status;
+ /*0x0E*/ u8 cool;
+ /*0x0F*/ u8 beauty;
+ /*0x10*/ u8 cute;
+ /*0x11*/ u8 smart;
+ /*0x12*/ u8 tough;
+ /*0x13*/ bool8 active;
+ /*0x14*/ u8 filler[0x8];
+};
+
+struct RamScriptData
+{
+ u8 magic;
+ u8 mapGroup;
+ u8 mapNum;
+ u8 objectId;
+ u8 script[995];
+};
+
+struct RamScript
+{
+ u32 checksum;
+ struct RamScriptData data;
+};
+
+struct EasyChatPair
+{
+ u16 unk0_0:7;
+ u16 unk0_7:7;
+ u16 unk1_6:1;
+ u16 unk2;
+ u16 words[2];
+}; /*size = 0x8*/
+
+struct TVShowCommon
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u8 pad02[20];
+ /*0x16*/ u16 var16[3];
+ /*0x1C*/ u8 srcTrainerId3Lo;
+ /*0x1D*/ u8 srcTrainerId3Hi;
+ /*0x1E*/ u8 srcTrainerId2Lo;
+ /*0x1F*/ u8 srcTrainerId2Hi;
+ /*0x20*/ u8 srcTrainerIdLo;
+ /*0x21*/ u8 srcTrainerIdHi;
+ /*0x22*/ u8 trainerIdLo;
+ /*0x23*/ u8 trainerIdHi;
+};
+
+struct TVShowFanClubLetter
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u16 species;
+ /*0x04*/ u16 pad04[6];
+ /*0x10*/ u8 playerName[8];
+ /*0x18*/ u8 language;
+};
+
+struct TVShowRecentHappenings
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u16 var02;
+ /*0x04*/ u16 var04[6];
+ /*0x10*/ u8 playerName[8];
+ /*0x18*/ u8 language;
+ /*0x19*/ u8 pad19[10];
+};
+
+struct TVShowFanclubOpinions
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u16 var02;
+ /*0x04*/ u8 var04A:4;
+ /*0x04*/ u8 var04B:4;
+ /*0x05*/ u8 playerName[8];
+ /*0x0D*/ u8 language;
+ /*0x0E*/ u8 var0E;
+ /*0x0F*/ u8 var0F;
+ /*0x10*/ u8 var10[8];
+ /*0x18*/ u16 var18[2];
+ /*0x1C*/ u16 var1C[4];
+};
+
+struct TVShowUnknownType04
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u8 pad02[4];
+ /*0x06*/ u16 var06;
+};
+
+struct TVShowNameRaterShow
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u16 species;
+ /*0x04*/ u8 pokemonName[11];
+ /*0x0F*/ u8 trainerName[11];
+ /*0x1A*/ u8 random;
+ /*0x1B*/ u8 random2;
+ /*0x1C*/ u16 var1C;
+ /*0x1E*/ u8 language;
+ /*0x1F*/ u8 pokemonNameLanguage;
+};
+
+struct TVShowBravoTrainerPokemonProfiles
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u16 species;
+ /*0x04*/ u16 var04[2];
+ /*0x08*/ u8 pokemonNickname[11];
+ /*0x13*/ u8 contestCategory:3;
+ /*0x13*/ u8 contestRank:2;
+ /*0x13*/ u8 contestResult:2;
+ /*0x13*/ u8 var13_7:1;
+ /*0x14*/ u16 var14;
+ /*0x16*/ u8 playerName[8];
+ /*0x1E*/ u8 language;
+ /*0x1F*/ u8 var1f;
+};
+
+struct TVShowBravoTrainerBattleTowerSpotlight
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u8 trainerName[8];
+ /*0x0A*/ u16 species;
+ /*0x0C*/ u8 enemyTrainerName[8];
+ /*0x14*/ u16 defeatedSpecies;
+ /*0x16*/ u16 var16;
+ /*0x18*/ u16 var18[1];
+ /*0x1A*/ u8 btLevel;
+ /*0x1B*/ u8 var1b;
+ /*0x1C*/ u8 var1c;
+ /*0x1D*/ u8 language;
+};
+
+struct TVShowPokemonToday
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u8 language;
+ /*0x03*/ u8 language2;
+ /*0x04*/ u8 nickname[11];
+ /*0x0F*/ u8 ball;
+ /*0x10*/ u16 species;
+ /*0x12*/ u8 var12;
+ /*0x13*/ u8 playerName[8];
+};
+
+struct TVShowSmartShopper
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u8 priceReduced;
+ /*0x03*/ u8 language;
+ /*0x04*/ u8 pad04[2];
+ /*0x06*/ u16 itemIds[3];
+ /*0x0C*/ u16 itemAmounts[3];
+ /*0x12*/ u8 shopLocation;
+ /*0x13*/ u8 playerName[8];
+};
+
+struct TVShowPokemonTodayFailed
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u8 language;
+ /*0x03*/ u8 pad03[9];
+ /*0x0c*/ u16 species;
+ /*0x0e*/ u16 species2;
+ /*0x10*/ u8 var10;
+ /*0x11*/ u8 var11;
+ /*0x12*/ u8 var12;
+ /*0x13*/ u8 playerName[8];
+};
+
+struct TVShowPokemonAngler
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u8 var02;
+ /*0x03*/ u8 var03;
+ /*0x04*/ u16 var04;
+ /*0x06*/ u8 language;
+ u8 pad07[12];
+ /*0x13*/ u8 playerName[8];
+};
+
+struct TVShowWorldOfMasters
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u16 var02;
+ /*0x04*/ u16 var04;
+ /*0x06*/ u16 var06;
+ /*0x08*/ u16 var08;
+ /*0x0a*/ u8 var0a;
+ /*0x0b*/ u8 language;
+ u8 pad0c[7];
+ /*0x13*/ u8 playerName[8];
+};
+
+struct TVShowMassOutbreak
+{
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u8 var02;
+ /*0x03*/ u8 var03;
+ /*0x04*/ u16 moves[4];
+ /*0x0C*/ u16 species;
+ /*0x0E*/ u16 var0E;
+ /*0x10*/ u8 locationMapNum;
+ /*0x11*/ u8 locationMapGroup;
+ /*0x12*/ u8 var12;
+ /*0x13*/ u8 probability;
+ /*0x14*/ u8 level;
+ /*0x15*/ u8 var15;
+ /*0x16*/ u16 daysLeft;
+ /*0x18*/ u8 language;
+ u8 pad19[11];
+};
+
+typedef union TVShow
+{
+ struct TVShowCommon common;
+ struct TVShowFanClubLetter fanclubLetter;
+ struct TVShowRecentHappenings recentHappenings;
+ struct TVShowFanclubOpinions fanclubOpinions;
+ struct TVShowUnknownType04 unkShow04;
+ struct TVShowNameRaterShow nameRaterShow;
+ struct TVShowBravoTrainerPokemonProfiles bravoTrainer;
+ struct TVShowBravoTrainerBattleTowerSpotlight bravoTrainerTower;
+ struct TVShowPokemonToday pokemonToday;
+ struct TVShowSmartShopper smartshopperShow;
+ struct TVShowPokemonTodayFailed pokemonTodayFailed;
+ struct TVShowPokemonAngler pokemonAngler;
+ struct TVShowWorldOfMasters worldOfMasters;
+ struct TVShowMassOutbreak massOutbreak;
+} TVShow;
+
+struct MailStruct
+{
+ /*0x00*/ u16 words[9];
+ /*0x12*/ u8 playerName[8];
+ /*0x1A*/ u8 trainerId[4];
+ /*0x1E*/ u16 species;
+ /*0x20*/ u16 itemId;
+};
+
+
+// Mauville Pokemon Center men
+
+struct MauvilleManCommon
+{
+ u8 id;
+};
+
+struct MauvilleManBard
+{
+ /*0x00*/ u8 id;
+ /*0x02*/ u16 songLyrics[6];
+ /*0x0E*/ u16 temporaryLyrics[6];
+ /*0x1A*/ u8 playerName[8];
+ /*0x22*/ u8 filler_2DB6[0x3];
+ /*0x25*/ u8 playerTrainerId[4];
+ /*0x29*/ bool8 hasChangedSong;
+}; /*size = 0x2C*/
+
+struct MauvilleManHipster
+{
+ u8 id;
+ bool8 alreadySpoken;
+};
+
+struct MauvilleManTrader
+{
+ u8 id;
+ u8 unk1[4];
+ u8 unk5[4][11];
+ bool8 alreadyTraded;
+};
+
+struct MauvilleManStoryteller
+{
+ u8 id;
+ bool8 alreadyRecorded;
+ u8 filler2[2];
+ u8 gameStatIDs[4];
+ u8 trainerNames[4][7];
+ u8 statValues[4][4];
+};
+
+struct MauvilleManGiddy
+{
+ /*0x00*/ u8 id;
+ /*0x01*/ u8 taleCounter;
+ /*0x02*/ u8 questionNum;
+ /*0x04*/ u16 randomWords[10];
+ /*0x18*/ u8 questionList[12];
+}; /*size = 0x2C*/
+
+
+union MauvilleMan
+{
+ struct MauvilleManCommon common;
+ struct MauvilleManBard bard;
+ struct MauvilleManHipster hipster;
+ struct MauvilleManTrader trader;
+ struct MauvilleManStoryteller storyteller;
+ struct MauvilleManGiddy giddy;
+ u8 filler[0x40]; // needed to pad out the struct
+};
+
+struct PokeNews
+{
+ u8 kind;
+ u8 state;
+ u16 days;
+};
+
+struct GabbyAndTyData
+{
+ /*2b10*/ u16 mon1;
+ /*2b12*/ u16 mon2;
+ /*2b14*/ u16 lastMove;
+ /*2b16*/ u16 quote;
+ /*2b18*/ u8 mapnum;
+ /*2b19*/ u8 battleNum;
+ /*2b1a*/ u8 valA_0:1;
+ /*2b1a*/ u8 valA_1:1;
+ /*2b1a*/ u8 valA_2:1;
+ /*2b1a*/ u8 valA_3:1;
+ /*2b1a*/ u8 valA_4:1;
+ /*2b1a*/ u8 valA_5:3;
+ /*2b1b*/ u8 valB_0:1;
+ /*2b1b*/ u8 valB_1:1;
+ /*2b1b*/ u8 valB_2:1;
+ /*2b1b*/ u8 valB_3:1;
+ /*2b1b*/ u8 valB_4:1;
+ /*2b1b*/ u8 valB_5:3;
+};
+
+struct DayCareMail
+{
+ /*0x00*/ struct MailStruct message;
+ /*0x24*/ u8 names[19];
+};
+
+struct DayCareStepCountersEtc {
+ u32 steps[DAYCARE_MON_COUNT];
+ u16 pendingEggPersonality;
+ u8 eggCycleStepsRemaining;
+};
+
+struct RecordMixingDayCareMail
+{
+ struct DayCareMail mail[DAYCARE_MON_COUNT];
+ u32 numDaycareMons;
+ u16 itemsHeld[DAYCARE_MON_COUNT]; // marks whether or not each daycare mon is currently holding an item.
+};
+
+struct DayCareMisc
+{
+ struct DayCareMail mail[DAYCARE_MON_COUNT];
+ struct DayCareStepCountersEtc countersEtc;
+};
+
+struct DayCare {
+ struct BoxPokemon mons[DAYCARE_MON_COUNT];
+ struct DayCareMisc misc;
+};
+
+struct LinkBattleRecord
+{
+ u8 name[8];
+ u16 trainerId;
+ u16 wins;
+ u16 losses;
+ u16 draws;
+};
+
+struct RecordMixingGiftData
+{
+ u8 unk0;
+ u8 quantity;
+ u16 itemId;
+ u8 filler4[8];
+};
+
+struct RecordMixingGift
+{
+ int checksum;
+ struct RecordMixingGiftData data;
+};
+
+struct ContestWinner
+{
+ /*0x00*/ u32 personality; // personality
+ /*0x04*/ u32 otId; // otId
+ /*0x08*/ u16 species; // species
+ /*0x0A*/ u8 contestCategory;
+ /*0x0B*/ u8 nickname[11];
+ /*0x16*/ u8 trainerName[8];
+};
+
+// there should be enough flags for all 412 slots
+// each slot takes up 8 flags
+// if the value is not divisible by 8, we need to account for the reminder as well
+#define DEX_FLAGS_NO ((POKEMON_SLOTS_NUMBER / 8) + ((POKEMON_SLOTS_NUMBER % 8) ? 1 : 0))
+
+struct SaveBlock1 /* 0x02025734 */
+{
+ /*0x00*/ struct Coords16 pos;
+ /*0x04*/ struct WarpData location;
+ /*0x0C*/ struct WarpData warp1;
+ /*0x14*/ struct WarpData warp2;
+ /*0x1C*/ struct WarpData lastHealLocation;
+ /*0x24*/ struct WarpData warp4;
+ /*0x2C*/ u16 savedMusic;
+ /*0x2E*/ u8 weather;
+ /*0x2F*/ u8 weatherCycleStage;
+ /*0x30*/ u8 flashLevel; // flash level on current map, 0 being normal and 4 being the darkest
+ /*0x32*/ u16 mapLayoutId;
+ /*0x34*/ u16 mapView[0x100];
+ /*0x234*/ u8 playerPartyCount;
+ /*0x238*/ struct Pokemon playerParty[6];
+ /*0x490*/ u32 money;
+ /*0x494*/ u16 coins;
+ /*0x496*/ u16 registeredItem; // registered for use with SELECT button
+ /*0x498*/ struct ItemSlot pcItems[PC_ITEMS_COUNT];
+ /*0x560*/ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT];
+ /*0x5B0*/ struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT];
+ /*0x600*/ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT];
+ /*0x640*/ struct ItemSlot bagPocket_TMHM[BAG_TMHM_COUNT];
+ /*0x740*/ struct ItemSlot bagPocket_Berries[BAG_BERRIES_COUNT];
+ /*0x7F8*/ struct Pokeblock pokeblocks[POKEBLOCKS_COUNT];
+ /*0x938*/ u8 dexSeen2[DEX_FLAGS_NO];
+ /*0x96C*/ u16 berryBlenderRecords[3];
+ /*0x972*/ u8 filler_972[0x6];
+ /*0x978*/ u16 trainerRematchStepCounter;
+ /*0x97A*/ u8 trainerRematches[100];
+ /*0x9E0*/ struct EventObject eventObjects[EVENT_OBJECTS_COUNT];
+ /*0xC20*/ struct EventObjectTemplate eventObjectTemplates[64];
+ /*0x1220*/ u8 flags[FLAGS_COUNT];
+ /*0x1340*/ u16 vars[VARS_COUNT];
+ /*0x1540*/ u32 gameStats[NUM_GAME_STATS];
+ /*0x1608*/ struct BerryTree berryTrees[BERRY_TREES_COUNT];
+ /*0x1A08*/ struct SecretBaseRecord secretBases[SECRET_BASES_COUNT];
+ /*0x2688*/ u8 playerRoomDecor[12];
+ /*0x2694*/ u8 playerRoomDecorPos[12];
+ /*0x26A0*/ u8 decorDesk[10];
+ /*0x26AA*/ u8 decorChair[10];
+ /*0x26B4*/ u8 decorPlant[10];
+ /*0x26BE*/ u8 decorOrnament[30];
+ /*0x26DC*/ u8 decorMat[30];
+ /*0x26FA*/ u8 decorPoster[10];
+ /*0x2704*/ u8 decorDoll[40];
+ /*0x272C*/ u8 decorCushion[10];
+ /*0x2736*/ u8 padding_2736[2];
+ /*0x2738*/ TVShow tvShows[TV_SHOWS_COUNT];
+ /*0x2ABC*/ struct PokeNews pokeNews[POKE_NEWS_COUNT];
+ /*0x2AFC*/ u16 outbreakPokemonSpecies;
+ /*0x2AFE*/ u8 outbreakLocationMapNum;
+ /*0x2AFF*/ u8 outbreakLocationMapGroup;
+ /*0x2B00*/ u8 outbreakPokemonLevel;
+ /*0x2B01*/ u8 outbreakUnk1;
+ /*0x2B02*/ u16 outbreakUnk2;
+ /*0x2B04*/ u16 outbreakPokemonMoves[4];
+ /*0x2B0C*/ u8 outbreakUnk4;
+ /*0x2B0D*/ u8 outbreakPokemonProbability;
+ /*0x2B0E*/ u16 outbreakUnk5;
+ /*0x2B10*/ struct GabbyAndTyData gabbyAndTyData;
+ /*0x2B1C*/ struct {
+ /*0x2B1C*/ u16 unk2B1C[6];
+ /*0x2B28*/ u16 unk2B28[6];
+ /*0x2B34*/ u16 unk2B34[6];
+ /*0x2B40*/ u16 unk2B40[6];
+ } easyChats;
+ /*0x2B4C*/ struct MailStruct mail[MAIL_COUNT];
+ /*0x2D8C*/ u8 unk2D8C[4]; // What is this? Apparently it's supposed to be 64 bytes in size.
+ /*0x2D90*/ u8 filler_2D90[0x4];
+ /*0x2D94*/ union MauvilleMan mauvilleMan;
+ /*0x2DD4*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff
+ /*0x2DFC*/ struct ContestWinner contestWinners[8];
+ /*0x2EFC*/ struct ContestWinner museumPortraits[5];
+ /*0x2F9C*/ struct DayCare daycare;
+ /*0x30B8*/ struct LinkBattleRecord linkBattleRecords[5];
+ struct {
+ /*0x3108*/ u8 unknown1[8];
+ /*0x3110*/ u8 giftRibbons[11];
+ /*0x311B*/ u8 unknown2[8];
+ /*0x3123*/ u32 currentPokeCoupons;
+ /*0x3127*/ u32 totalEarnedPokeCoupons;
+ /*0x312B*/ u8 unknown3[6];
+ /*0x3131*/ u8 receivedWishmakerJirachi;
+ /*0x3132*/ u8 unknown4[18];
+ } __attribute__((packed)) externalReservedData;
+ /*0x3144*/ struct Roamer roamer;
+ /*0x3160*/ struct EnigmaBerry enigmaBerry;
+ /*0x3690*/ struct RamScript ramScript;
+ /*0x3A7C*/ struct RecordMixingGift recordMixingGift;
+ /*0x3A8C*/ u8 dexSeen3[DEX_FLAGS_NO];
+};
+
+extern struct SaveBlock1 gSaveBlock1;
+
+struct Time
+{
+ /*0x00*/ s16 days;
+ /*0x02*/ s8 hours;
+ /*0x03*/ s8 minutes;
+ /*0x04*/ s8 seconds;
+};
+
+struct Pokedex
+{
+ /*0x00*/ u8 order;
+ /*0x01*/ u8 unknown1;
+ /*0x02*/ u8 nationalMagic; // must equal 0xDA in order to have National mode
+ /*0x03*/ u8 unknown2;
+ /*0x04*/ u32 unownPersonality; // set when you first see Unown
+ /*0x08*/ u32 spindaPersonality; // set when you first see Spinda
+ /*0x0C*/ u32 unknown3;
+ /*0x10*/ u8 owned[DEX_FLAGS_NO];
+ /*0x44*/ u8 seen[DEX_FLAGS_NO];
+};
+
+struct BattleTowerTrainer
+{
+ /*0x00*/ u8 trainerClass;
+ /*0x01*/ u8 name[8];
+ /*0x09*/ u8 teamFlags;
+ u8 filler0A[2];
+ /*0x0C*/ u16 greeting[6];
+};
+
+struct BattleTowerRecord // record mixing
+{
+ /*0x00*/ u8 battleTowerLevelType; // 0 = level 50, 1 = level 100
+ /*0x01*/ u8 trainerClass;
+ /*0x02*/ u16 winStreak;
+ /*0x04*/ u8 name[8];
+ /*0x0C*/ u8 trainerId[4];
+ /*0x10*/ u16 greeting[6];
+ /*0x1C*/ struct BattleTowerPokemon party[3];
+ /*0xA0*/ u32 checksum;
+};
+
+struct BattleTowerEReaderTrainer
+{
+ /*0x00*/ u8 unk0;
+ /*0x01*/ u8 trainerClass;
+ /*0x02*/ u16 winStreak;
+ /*0x04*/ u8 name[8];
+ /*0x0C*/ u8 trainerId[4];
+ /*0x10*/ u16 greeting[6];
+ /*0x1C*/ u16 farewellPlayerLost[6];
+ /*0x28*/ u16 farewellPlayerWon[6];
+ /*0x34*/ struct BattleTowerPokemon party[3];
+ /*0xB8*/ u32 checksum;
+};
+
+struct BattleTowerData
+{
+ /*0x0000, 0x00A8*/ struct BattleTowerRecord playerRecord;
+ /*0x00A4, 0x014C*/ struct BattleTowerRecord records[5]; // from record mixing
+ /*0x03D8, 0x0480*/ u16 firstMonSpecies; // species of the first pokemon in the player's battle tower party
+ /*0x03DA, 0x0482*/ u16 defeatedBySpecies; // species of the pokemon that defated the player
+ /*0x03DC, 0x0484*/ u8 defeatedByTrainerName[8];
+ /*0x03E4, 0x048C*/ u8 firstMonNickname[POKEMON_NAME_LENGTH]; // nickname of the first pokemon in the player's battle tower party
+ /*0x03F0, 0x0498*/ struct BattleTowerEReaderTrainer ereaderTrainer;
+ /*0x04AC, 0x0554*/ u8 battleTowerLevelType:1; // 0 = level 50; 1 = level 100
+ /*0x04AC, 0x0554*/ u8 unk_554:1;
+ /*0x04AD, 0x0555*/ u8 battleOutcome;
+ /*0x04AE, 0x0556*/ u8 var_4AE[2];
+ /*0x04B0, 0x0558*/ u16 curChallengeBattleNum[2]; // 1-based index of battle in the current challenge. (challenges consist of 7 battles)
+ /*0x04B4, 0x055C*/ u16 curStreakChallengesNum[2]; // 1-based index of the current challenge in the current streak.
+ /*0x04B8, 0x0560*/ u16 recordWinStreaks[2];
+ /*0x04BC, 0x0564*/ u8 battleTowerTrainerId; // index for gBattleTowerTrainers table
+ /*0x04BD, 0x0565*/ u8 selectedPartyMons[0x3]; // indices of the 3 selected player party mons.
+ /*0x04C0, 0x0568*/ u16 prizeItem;
+ /*0x04C2, 0x056A*/ u8 battledTrainerIds[6];
+ /*0x04C8, 0x0570*/ u16 totalBattleTowerWins;
+ /*0x04CA, 0x0572*/ u16 bestBattleTowerWinStreak;
+ /*0x04CC, 0x0574*/ u16 currentWinStreaks[2];
+ /*0x04D0, 0x0578*/ u8 lastStreakLevelType; // 0 = level 50, 1 = level 100. level type of the last streak. Used by tv to report the level mode.
+ /*0x04D1, 0x0579*/ u8 filler_4D1[0x317];
+};
+
+struct SaveBlock2 /* 0x02024EA4 */
+{
+ /*0x00*/ u8 playerName[8];
+ /*0x08*/ u8 playerGender; // MALE, FEMALE
+ /*0x09*/ u8 specialSaveWarp;
+ /*0x0A*/ u8 playerTrainerId[4];
+ /*0x0E*/ u16 playTimeHours;
+ /*0x10*/ u8 playTimeMinutes;
+ /*0x11*/ u8 playTimeSeconds;
+ /*0x12*/ u8 playTimeVBlanks;
+ /*0x13*/ u8 optionsButtonMode; // OPTIONS_BUTTON_MODE_[NORMAL/LR/L_EQUALS_A]
+ /*0x14*/ u16 optionsTextSpeed:3; // OPTIONS_TEXT_SPEED_[SLOW/MID/FAST]
+ u16 optionsWindowFrameType:5; // Specifies one of the 20 decorative borders for text boxes
+ u16 optionsSound:1; // OPTIONS_SOUND_[MONO/STEREO]
+ u16 optionsBattleStyle:1; // OPTIONS_BATTLE_STYLE_[SHIFT/SET]
+ u16 optionsBattleSceneOff:1; // whether battle animations are disabled
+ u16 regionMapZoom:1; // whether the map is zoomed in
+ /*0x18*/ struct Pokedex pokedex;
+ /*0x90*/ u8 filler_90[0x8];
+ /*0x98*/ struct Time localTimeOffset;
+ /*0xA0*/ struct Time lastBerryTreeUpdate;
+ /*0xA8*/ struct BattleTowerData battleTower;
+};
+
+struct MapPosition
+{
+ s16 x;
+ s16 y;
+ s8 height;
+};
+
+struct UnkStruct_8054FF8
+{
+ u8 a;
+ u8 b;
+ u8 c;
+ u8 d;
+ struct MapPosition sub;
+ u16 field_C;
+};
+
+// wasnt defined so I had to define it
+struct HallOfFame
+{
+ u8 filler[0x1F00];
+};
+
+extern struct SaveBlock2 gSaveBlock2;
+
+#define RomHeaderGameTitle ((const char *)0x080000A0)
+#define RomHeaderGameCode ((const char *)0x080000AC)
+#define RomHeaderMakerCode ((const char *)0x080000B0)
+#define RomHeaderMagic ((const u8 *) 0x080000B2)
+#define RomHeaderSoftwareVersion ((const u8 *) 0x080000BC)
+
+#define LocalTimeOffset ((struct Time *)0x02028098)
+#define LastBerryTreeUpdate ((struct Time *)0x020280A0)
+
+#endif //GUARD_GLOBAL_H
diff --git a/berry_fix/payload/include/main.h b/berry_fix/payload/include/main.h
new file mode 100644
index 000000000..cb58d5982
--- /dev/null
+++ b/berry_fix/payload/include/main.h
@@ -0,0 +1,45 @@
+#ifndef GUARD_MAIN_H
+#define GUARD_MAIN_H
+
+#include "gba/gba.h"
+
+enum RomHeaderValidationResult
+{
+ SAPPHIRE_UPDATABLE = 2,
+ RUBY_UPDATABLE,
+ SAPPHIRE_NONEED,
+ RUBY_NONEED,
+ INVALID
+};
+
+enum MainCallbackState
+{
+ MAINCB_INIT = 0,
+ MAINCB_CHECK_RTC,
+ MAINCB_CHECK_FLASH,
+ MAINCB_READ_SAVE,
+ MAINCB_CHECK_TIME,
+ MAINCB_FIX_DATE,
+ MAINCB_NO_NEED_TO_FIX,
+ MAINCB_YEAR_MAKES_NO_SENSE,
+ MAINCB_FINISHED,
+ MAINCB_CHECK_PACIFIDLOG_TM,
+ MAINCB_FIX_PACIFIDLOG_TM,
+ MAINCB_ERROR
+};
+
+extern IntrFunc gIntrTable[];
+extern u16 gHeldKeys;
+extern u16 gNewKeys;
+extern u8 gIntrVector[];
+extern u32 gUpdateSuccessful;
+extern u32 gUnknown_3001194;
+extern u32 gUnknown_30011A0[];
+extern u32 gMainCallbackState;
+extern u32 gGameVersion;
+
+extern u8 gSharedMem[0x8000];
+
+extern const IntrFunc gIntrFuncPointers[];
+
+#endif //GUARD_MAIN_H
diff --git a/berry_fix/payload/include/pokemon.h b/berry_fix/payload/include/pokemon.h
new file mode 100644
index 000000000..d3a14ffff
--- /dev/null
+++ b/berry_fix/payload/include/pokemon.h
@@ -0,0 +1,154 @@
+#ifndef GUARD_POKEMON_H
+#define GUARD_POKEMON_H
+
+struct PokemonSubstruct0
+{
+ u16 species;
+ u16 heldItem;
+ u32 experience;
+ u8 ppBonuses;
+ u8 friendship;
+};
+
+struct PokemonSubstruct1
+{
+ u16 moves[4];
+ u8 pp[4];
+};
+
+struct PokemonSubstruct2
+{
+ u8 hpEV;
+ u8 attackEV;
+ u8 defenseEV;
+ u8 speedEV;
+ u8 spAttackEV;
+ u8 spDefenseEV;
+ u8 cool;
+ u8 beauty;
+ u8 cute;
+ u8 smart;
+ u8 tough;
+ u8 sheen;
+};
+
+struct PokemonSubstruct3
+{
+ /*0x00*/ u8 pokerus;
+ /*0x01*/ u8 metLocation;
+
+ /*0x02*/ u16 metLevel:7;
+ /*0x02*/ u16 metGame:4;
+ /*0x03*/ u16 pokeball:4;
+ /*0x03*/ u16 otGender:1;
+
+ /*0x04*/ u32 hpIV:5;
+ /*0x04*/ u32 attackIV:5;
+ /*0x05*/ u32 defenseIV:5;
+ /*0x05*/ u32 speedIV:5;
+ /*0x05*/ u32 spAttackIV:5;
+ /*0x06*/ u32 spDefenseIV:5;
+ /*0x07*/ u32 isEgg:1;
+ /*0x07*/ u32 altAbility:1;
+
+ /*0x08*/ u32 coolRibbon:3;
+ /*0x08*/ u32 beautyRibbon:3;
+ /*0x08*/ u32 cuteRibbon:3;
+ /*0x09*/ u32 smartRibbon:3;
+ /*0x09*/ u32 toughRibbon:3;
+ /*0x09*/ u32 championRibbon:1;
+ /*0x0A*/ u32 winningRibbon:1;
+ /*0x0A*/ u32 victoryRibbon:1;
+ /*0x0A*/ u32 artistRibbon:1;
+ /*0x0A*/ u32 effortRibbon:1;
+ /*0x0A*/ u32 giftRibbon1:1;
+ /*0x0A*/ u32 giftRibbon2:1;
+ /*0x0A*/ u32 giftRibbon3:1;
+ /*0x0A*/ u32 giftRibbon4:1;
+ /*0x0B*/ u32 giftRibbon5:1;
+ /*0x0B*/ u32 giftRibbon6:1;
+ /*0x0B*/ u32 giftRibbon7:1;
+ /*0x0B*/ u32 fatefulEncounter:5; // unused in Ruby/Sapphire, but the high bit must be set for Mew/Deoxys to obey in FR/LG/Emerald
+};
+
+union PokemonSubstruct
+{
+ struct PokemonSubstruct0 type0;
+ struct PokemonSubstruct1 type1;
+ struct PokemonSubstruct2 type2;
+ struct PokemonSubstruct3 type3;
+ u16 raw[6];
+};
+
+struct BoxPokemon
+{
+ /*0x00*/ u32 personality;
+ /*0x04*/ u32 otId;
+ /*0x08*/ u8 nickname[POKEMON_NAME_LENGTH];
+ /*0x12*/ u8 language;
+ /*0x13*/ u8 isBadEgg:1;
+ u8 hasSpecies:1;
+ u8 isEgg:1;
+ /*0x14*/ u8 otName[OT_NAME_LENGTH];
+ /*0x1B*/ u8 markings;
+ /*0x1C*/ u16 checksum;
+ /*0x1E*/ u16 unknown;
+
+ union
+ {
+ u32 raw[12];
+ union PokemonSubstruct substructs[4];
+ } secure;
+}; /*size = 0x50*/
+
+struct Pokemon
+{
+ /*0x00*/ struct BoxPokemon box;
+ /*0x50*/ u32 status;
+ /*0x54*/ u8 level;
+ /*0x55*/ u8 mail;
+ /*0x56*/ u16 hp;
+ /*0x58*/ u16 maxHP;
+ /*0x5A*/ u16 attack;
+ /*0x5C*/ u16 defense;
+ /*0x5E*/ u16 speed;
+ /*0x60*/ u16 spAttack;
+ /*0x62*/ u16 spDefense;
+};
+
+struct BattleTowerPokemon
+{
+ /*0x00*/u16 species;
+ /*0x02*/u16 heldItem;
+ /*0x04*/u16 moves[4];
+ /*0x0C*/u8 level;
+ /*0x0D*/u8 ppBonuses;
+ /*0x0E*/u8 hpEV;
+ /*0x0F*/u8 attackEV;
+ /*0x10*/u8 defenseEV;
+ /*0x11*/u8 speedEV;
+ /*0x12*/u8 spAttackEV;
+ /*0x13*/u8 spDefenseEV;
+ /*0x14*/u32 otId;
+ /*0x18*/u32 hpIV:5;
+ /*0x18*/u32 attackIV:5;
+ /*0x19*/u32 defenseIV:5;
+ /*0x19*/u32 speedIV:5;
+ /*0x1A*/u32 spAttackIV:5;
+ /*0x1A*/u32 spDefenseIV:5;
+ /*0x1B*/u32 gap:1;
+ /*0x1B*/u32 altAbility:1;
+ /*0x1C*/u32 personality;
+ /*0x20*/u8 nickname[POKEMON_NAME_LENGTH + 1];
+ /*0x2B*/u8 friendship;
+};
+
+struct PokemonStorage
+{
+ /*0x0000*/ u8 currentBox;
+ /*0x0004*/ struct BoxPokemon boxes[14][30];
+ /*0x8344*/ u8 boxNames[14][9];
+ /*0x83c2*/ u8 wallpaper[14];
+};
+
+#endif // GUARD_POKEMON_H
diff --git a/berry_fix/payload/include/rtc.h b/berry_fix/payload/include/rtc.h
new file mode 100644
index 000000000..35654d866
--- /dev/null
+++ b/berry_fix/payload/include/rtc.h
@@ -0,0 +1,15 @@
+#ifndef GUARD_RTC_H
+#define GUARD_RTC_H
+
+#include "gba/gba.h"
+#include "siirtc.h"
+#include "global.h"
+
+extern struct Time gTimeSinceBerryUpdate;
+extern struct Time gRtcUTCTime;
+
+bool32 rtc_maincb_is_rtc_working(void);
+bool32 rtc_maincb_is_time_since_last_berry_update_positive(u8 *);
+void rtc_maincb_fix_date(void);
+
+#endif //GUARD_RTC_H
diff --git a/berry_fix/payload/include/siirtc.h b/berry_fix/payload/include/siirtc.h
new file mode 100644
index 000000000..de4fd634d
--- /dev/null
+++ b/berry_fix/payload/include/siirtc.h
@@ -0,0 +1,54 @@
+#ifndef GUARD_RTC_H
+#define GUARD_RTC_H
+
+#include "gba/gba.h"
+
+#define SIIRTCINFO_INTFE 0x01 // frequency interrupt enable
+#define SIIRTCINFO_INTME 0x02 // per-minute interrupt enable
+#define SIIRTCINFO_INTAE 0x04 // alarm interrupt enable
+#define SIIRTCINFO_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode
+#define SIIRTCINFO_POWER 0x80 // power on or power failure occurred
+
+enum
+{
+ MONTH_JAN = 1,
+ MONTH_FEB,
+ MONTH_MAR,
+ MONTH_APR,
+ MONTH_MAY,
+ MONTH_JUN,
+ MONTH_JUL,
+ MONTH_AUG,
+ MONTH_SEP,
+ MONTH_OCT,
+ MONTH_NOV,
+ MONTH_DEC
+};
+
+struct SiiRtcInfo
+{
+ u8 year;
+ u8 month;
+ u8 day;
+ u8 dayOfWeek;
+ u8 hour;
+ u8 minute;
+ u8 second;
+ u8 status;
+ u8 alarmHour;
+ u8 alarmMinute;
+};
+
+void SiiRtcUnprotect(void);
+void SiiRtcProtect(void);
+u8 SiiRtcProbe(void);
+bool8 SiiRtcReset(void);
+bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc);
+bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc);
+
+#endif // GUARD_RTC_H
diff --git a/berry_fix/payload/ld_script.sed b/berry_fix/payload/ld_script.sed
new file mode 100644
index 000000000..b91542b6f
--- /dev/null
+++ b/berry_fix/payload/ld_script.sed
@@ -0,0 +1,14 @@
+/<EWRAM>/ {
+ r sym_ewram.ld
+ d
+}
+
+/<BSS>/ {
+ r sym_bss.ld
+ d
+}
+
+/<COMMON>/ {
+ r sym_common.ld
+ d
+}
diff --git a/berry_fix/payload/ld_script.txt b/berry_fix/payload/ld_script.txt
new file mode 100644
index 000000000..d0a0af9ed
--- /dev/null
+++ b/berry_fix/payload/ld_script.txt
@@ -0,0 +1,107 @@
+ENTRY(Init)
+
+SECTIONS {
+ . = 0x2010000;
+
+ .text :
+ ALIGN(4)
+ {
+ asm/crt0.o(.text);
+ src/main.o(.text);
+ src/rtc.o(.text);
+ src/flash.o(.text);
+ } =0
+
+ lib_text :
+ ALIGN(4)
+ {
+ src/agb_flash.o(.text);
+ src/agb_flash_1m.o(.text);
+ src/agb_flash_mx.o(.text);
+ asm/libagbsyscall.o(.text);
+ src/siirtc.o(.text);
+ *libgcc.a:_call_via_rX.o(.text);
+ *libgcc.a:_modsi3.o(.text);
+ *libgcc.a:_umodsi3.o(.text);
+ *libgcc.a:_dvmd_tls.o(.text);
+ } =0
+
+ .rodata :
+ ALIGN(4)
+ {
+ src/main.o(.rodata);
+ src/rtc.o(.rodata);
+ src/flash.o(.rodata);
+ } =0
+
+ lib_rodata :
+ ALIGN(4)
+ {
+ src/agb_flash.o(.rodata);
+ src/agb_flash_1m.o(.rodata);
+ src/agb_flash_mx.o(.rodata);
+ src/agb_flash_le.o(.rodata);
+ src/siirtc.o(.rodata);
+ }
+
+ . = 0x2020000;
+
+ ewram (NOLOAD) :
+ ALIGN(4)
+ {
+<EWRAM>
+ }
+
+ . = 0x3001000;
+
+ iwram (NOLOAD) :
+ ALIGN(4)
+ {
+<BSS>
+ . = 0x40;
+<COMMON>
+ end = .;
+ }
+
+ . = 0x8000000;
+
+ RS_Rom (NOLOAD) :
+ ALIGN(4)
+ {
+ _start = .;
+ . += 4;
+ RomHeaderNintendoLogo = .;
+ . += 156;
+ RS_RomHeader = .;
+ RomHeaderGameTitle = .;
+ . += 12;
+ RomHeaderGameCode = .;
+ . += 4;
+ RomHeaderMakerCode = .;
+ . += 2;
+ RomHeaderMagic = .;
+ . += 1;
+ RomHeaderMainUnitCode = .;
+ . += 1;
+ RomHeaderDeviceType = .;
+ . += 1;
+ RomHeaderReserved1 = .;
+ . += 7;
+ RomHeaderSoftwareVersion = .;
+ . += 1;
+ RomHeaderChecksum = .;
+ . += 1;
+ RomHeaderReserved2 = .;
+ . += 6;
+ GPIOPortData = .;
+ . += 2;
+ GPIOPortDirection = .;
+ . += 2;
+ GPIOPortReadEnable = .;
+ } =0
+
+ /DISCARD/ :
+ {
+ *(*);
+ }
+}
diff --git a/berry_fix/payload/rom.sha1 b/berry_fix/payload/rom.sha1
new file mode 100644
index 000000000..92eee7e87
--- /dev/null
+++ b/berry_fix/payload/rom.sha1
@@ -0,0 +1 @@
+866991e2b5a8de02d12f53abe0ee9af03a2b6e01 payload.gba
diff --git a/berry_fix/payload/src/agb_flash.c b/berry_fix/payload/src/agb_flash.c
new file mode 100644
index 000000000..2c2c96e6e
--- /dev/null
+++ b/berry_fix/payload/src/agb_flash.c
@@ -0,0 +1,296 @@
+#include "gba/gba.h"
+#include "gba/flash_internal.h"
+
+static u8 sTimerNum;
+static u16 sTimerCount;
+static vu16 *sTimerReg;
+static u16 sSavedIme;
+
+u8 gFlashTimeoutFlag;
+u8 (*PollFlashStatus)(u8 *);
+const struct FlashType *gFlash;
+u16 gFlashNumRemainingBytes;
+const u16 *gFlashMaxTime;
+
+u16 (*ProgramFlashByte)(u16, u32, u8);
+u16 (*ProgramFlashSector)(u16, void *);
+u16 (*EraseFlashChip)(void);
+u16 (*EraseFlashSector)(u16);
+u16 (*WaitForFlashWrite)(u8, u8 *, u8);
+
+void SetReadFlash1(u16 *dest);
+
+void SwitchFlashBank(u8 bankNum)
+{
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0xB0);
+ FLASH_WRITE(0x0000, bankNum);
+}
+
+#define DELAY() \
+do { \
+ vu16 i; \
+ for (i = 20000; i != 0; i--) \
+ ; \
+} while (0)
+
+u16 ReadFlashId(void)
+{
+ u16 flashId;
+ u16 readFlash1Buffer[0x20];
+ u8 (*readFlash1)(u8 *);
+
+ SetReadFlash1(readFlash1Buffer);
+ readFlash1 = (u8 (*)(u8 *))((s32)readFlash1Buffer + 1);
+
+ // Enter ID mode.
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0x90);
+ DELAY();
+
+ flashId = readFlash1(FLASH_BASE + 1) << 8;
+ flashId |= readFlash1(FLASH_BASE);
+
+ // Leave ID mode.
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0xF0);
+ FLASH_WRITE(0x5555, 0xF0);
+ DELAY();
+
+ return flashId;
+}
+
+void FlashTimerIntr(void)
+{
+ if (sTimerCount != 0 && --sTimerCount == 0)
+ gFlashTimeoutFlag = 1;
+}
+
+u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void))
+{
+ if (timerNum >= 4)
+ return 1;
+
+ sTimerNum = timerNum;
+ sTimerReg = &REG_TMCNT(sTimerNum);
+ *intrFunc = FlashTimerIntr;
+ return 0;
+}
+
+void StartFlashTimer(u8 phase)
+{
+ const u16 *maxTime = &gFlashMaxTime[phase * 3];
+ sSavedIme = REG_IME;
+ REG_IME = 0;
+ sTimerReg[1] = 0;
+ REG_IE |= (INTR_FLAG_TIMER0 << sTimerNum);
+ gFlashTimeoutFlag = 0;
+ sTimerCount = *maxTime++;
+ *sTimerReg++ = *maxTime++;
+ *sTimerReg-- = *maxTime++;
+ REG_IF = (INTR_FLAG_TIMER0 << sTimerNum);
+ REG_IME = 1;
+}
+
+void StopFlashTimer(void)
+{
+ REG_IME = 0;
+ *sTimerReg++ = 0;
+ *sTimerReg-- = 0;
+ REG_IE &= ~(INTR_FLAG_TIMER0 << sTimerNum);
+ REG_IME = sSavedIme;
+}
+
+u8 ReadFlash1(u8 *addr)
+{
+ return *addr;
+}
+
+void SetReadFlash1(u16 *dest)
+{
+ u16 *src;
+ u16 i;
+
+ PollFlashStatus = (u8 (*)(u8 *))((s32)dest + 1);
+
+ src = (u16 *)ReadFlash1;
+ src = (u16 *)((s32)src ^ 1);
+
+ i = ((s32)SetReadFlash1 - (s32)ReadFlash1) >> 1;
+
+ while (i != 0)
+ {
+ *dest++ = *src++;
+ i--;
+ }
+}
+
+void ReadFlash_Core(u8 *src, u8 *dest, u32 size)
+{
+ while (size-- != 0)
+ {
+ *dest++ = *src++;
+ }
+}
+
+void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size)
+{
+ u8 *src;
+ u16 i;
+ u16 readFlash_Core_Buffer[0x40];
+ u16 *funcSrc;
+ u16 *funcDest;
+ void (*readFlash_Core)(u8 *, u8 *, u32);
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ if (gFlash->romSize == FLASH_ROM_SIZE_1M)
+ {
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+ }
+
+ funcSrc = (u16 *)ReadFlash_Core;
+ funcSrc = (u16 *)((s32)funcSrc ^ 1);
+ funcDest = readFlash_Core_Buffer;
+
+ i = ((s32)ReadFlash - (s32)ReadFlash_Core) >> 1;
+
+ while (i != 0)
+ {
+ *funcDest++ = *funcSrc++;
+ i--;
+ }
+
+ readFlash_Core = (void (*)(u8 *, u8 *, u32))((s32)readFlash_Core_Buffer + 1);
+
+ src = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset;
+
+ readFlash_Core(src, dest, size);
+}
+
+u32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size)
+{
+ while (size-- != 0)
+ {
+ if (*tgt++ != *src++)
+ return (u32)(tgt - 1);
+ }
+
+ return 0;
+}
+
+u32 VerifyFlashSector(u16 sectorNum, u8 *src)
+{
+ u16 i;
+ u16 verifyFlashSector_Core_Buffer[0x80];
+ u16 *funcSrc;
+ u16 *funcDest;
+ u8 *tgt;
+ u16 size;
+ u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32);
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ if (gFlash->romSize == FLASH_ROM_SIZE_1M)
+ {
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+ }
+
+ funcSrc = (u16 *)VerifyFlashSector_Core;
+ funcSrc = (u16 *)((s32)funcSrc ^ 1);
+ funcDest = verifyFlashSector_Core_Buffer;
+
+ i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1;
+
+ while (i != 0)
+ {
+ *funcDest++ = *funcSrc++;
+ i--;
+ }
+
+ verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1);
+
+ tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift);
+ size = gFlash->sector.size;
+
+ return verifyFlashSector_Core(src, tgt, size);
+}
+
+u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n)
+{
+ u16 i;
+ u16 verifyFlashSector_Core_Buffer[0x80];
+ u16 *funcSrc;
+ u16 *funcDest;
+ u8 *tgt;
+ u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32);
+
+ if (gFlash->romSize == FLASH_ROM_SIZE_1M)
+ {
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+ }
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ funcSrc = (u16 *)VerifyFlashSector_Core;
+ funcSrc = (u16 *)((s32)funcSrc ^ 1);
+ funcDest = verifyFlashSector_Core_Buffer;
+
+ i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1;
+
+ while (i != 0)
+ {
+ *funcDest++ = *funcSrc++;
+ i--;
+ }
+
+ verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1);
+
+ tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift);
+
+ return verifyFlashSector_Core(src, tgt, n);
+}
+
+u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src)
+{
+ u8 i;
+ u32 result;
+
+ for (i = 0; i < 3; i++)
+ {
+ result = ProgramFlashSector(sectorNum, src);
+ if (result != 0)
+ continue;
+
+ result = VerifyFlashSector(sectorNum, src);
+ if (result == 0)
+ break;
+ }
+
+ return result;
+}
+
+u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *src, u32 n)
+{
+ u8 i;
+ u32 result;
+
+ for (i = 0; i < 3; i++)
+ {
+ result = ProgramFlashSector(sectorNum, src);
+ if (result != 0)
+ continue;
+
+ result = VerifyFlashSectorNBytes(sectorNum, src, n);
+ if (result == 0)
+ break;
+ }
+
+ return result;
+}
diff --git a/berry_fix/payload/src/agb_flash_1m.c b/berry_fix/payload/src/agb_flash_1m.c
new file mode 100644
index 000000000..7f8bdeb5f
--- /dev/null
+++ b/berry_fix/payload/src/agb_flash_1m.c
@@ -0,0 +1,86 @@
+#include "gba/gba.h"
+#include "gba/flash_internal.h"
+
+static const char AgbLibFlashVersion[] = "FLASH1M_V103";
+
+const struct FlashSetupInfo * const sSetupInfos[] =
+{
+ &MX29L010,
+ &LE26FV10N1TS,
+ &DefaultFlash
+};
+
+u32 IdentifyFlash(void)
+{
+ u16 result;
+ u16 flashId;
+ const struct FlashSetupInfo * const *setupInfo;
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ flashId = ReadFlashId();
+
+ setupInfo = sSetupInfos;
+ result = 1;
+
+ for (;;)
+ {
+ if ((*setupInfo)->type.ids.separate.makerId == 0)
+ break;
+
+ if (flashId == (*setupInfo)->type.ids.joined)
+ {
+ result = 0;
+ break;
+ }
+
+ setupInfo++;
+ }
+
+ ProgramFlashByte = (*setupInfo)->programFlashByte;
+ ProgramFlashSector = (*setupInfo)->programFlashSector;
+ EraseFlashChip = (*setupInfo)->eraseFlashChip;
+ EraseFlashSector = (*setupInfo)->eraseFlashSector;
+ WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite;
+ gFlashMaxTime = (*setupInfo)->maxTime;
+ gFlash = &(*setupInfo)->type;
+
+ return result;
+}
+
+u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData)
+{
+ u16 result = 0;
+ u8 status;
+
+ StartFlashTimer(phase);
+
+ while ((status = PollFlashStatus(addr)) != lastData)
+ {
+ if (status & 0x20)
+ {
+ // The write operation exceeded the flash chip's time limit.
+
+ if (PollFlashStatus(addr) == lastData)
+ break;
+
+ FLASH_WRITE(0x5555, 0xF0);
+ result = phase | 0xA000u;
+ break;
+ }
+
+ if (gFlashTimeoutFlag)
+ {
+ if (PollFlashStatus(addr) == lastData)
+ break;
+
+ FLASH_WRITE(0x5555, 0xF0);
+ result = phase | 0xC000u;
+ break;
+ }
+ }
+
+ StopFlashTimer();
+
+ return result;
+}
diff --git a/berry_fix/payload/src/agb_flash_le.c b/berry_fix/payload/src/agb_flash_le.c
new file mode 100644
index 000000000..39d956e27
--- /dev/null
+++ b/berry_fix/payload/src/agb_flash_le.c
@@ -0,0 +1,31 @@
+#include "gba/gba.h"
+#include "gba/flash_internal.h"
+
+const u16 leMaxTime[] =
+{
+ 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+};
+
+const struct FlashSetupInfo LE26FV10N1TS =
+{
+ ProgramFlashByte_MX,
+ ProgramFlashSector_MX,
+ EraseFlashChip_MX,
+ EraseFlashSector_MX,
+ WaitForFlashWrite_Common,
+ leMaxTime,
+ {
+ 131072, // ROM size
+ {
+ 4096, // sector size
+ 12, // bit shift to multiply by sector size (4096 == 1 << 12)
+ 32, // number of sectors
+ 0 // appears to be unused
+ },
+ { 3, 1 }, // wait state setup data
+ { { 0x62, 0x13 } } // ID
+ }
+};
diff --git a/berry_fix/payload/src/agb_flash_mx.c b/berry_fix/payload/src/agb_flash_mx.c
new file mode 100644
index 000000000..68eb00cd8
--- /dev/null
+++ b/berry_fix/payload/src/agb_flash_mx.c
@@ -0,0 +1,193 @@
+#include "gba/gba.h"
+#include "gba/flash_internal.h"
+
+const u16 mxMaxTime[] =
+{
+ 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+};
+
+const struct FlashSetupInfo MX29L010 =
+{
+ ProgramFlashByte_MX,
+ ProgramFlashSector_MX,
+ EraseFlashChip_MX,
+ EraseFlashSector_MX,
+ WaitForFlashWrite_Common,
+ mxMaxTime,
+ {
+ 131072, // ROM size
+ {
+ 4096, // sector size
+ 12, // bit shift to multiply by sector size (4096 == 1 << 12)
+ 32, // number of sectors
+ 0 // appears to be unused
+ },
+ { 3, 1 }, // wait state setup data
+ { { 0xC2, 0x09 } } // ID
+ }
+};
+
+const struct FlashSetupInfo DefaultFlash =
+{
+ ProgramFlashByte_MX,
+ ProgramFlashSector_MX,
+ EraseFlashChip_MX,
+ EraseFlashSector_MX,
+ WaitForFlashWrite_Common,
+ mxMaxTime,
+ {
+ 131072, // ROM size
+ {
+ 4096, // sector size
+ 12, // bit shift to multiply by sector size (4096 == 1 << 12)
+ 32, // number of sectors
+ 0 // appears to be unused
+ },
+ { 3, 1 }, // wait state setup data
+ { { 0x00, 0x00 } } // ID of 0
+ }
+};
+
+u16 EraseFlashChip_MX(void)
+{
+ u16 result;
+ u16 readFlash1Buffer[0x20];
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
+
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0x80);
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0x10);
+
+ SetReadFlash1(readFlash1Buffer);
+
+ result = WaitForFlashWrite(3, FLASH_BASE, 0xFF);
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ return result;
+}
+
+u16 EraseFlashSector_MX(u16 sectorNum)
+{
+ u16 numTries;
+ u16 result;
+ u8 *addr;
+ u16 readFlash1Buffer[0x20];
+
+ if (sectorNum >= gFlash->sector.count)
+ return 0x80FF;
+
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+
+ numTries = 0;
+
+try_erase:
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
+
+ addr = FLASH_BASE + (sectorNum << gFlash->sector.shift);
+
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0x80);
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ *addr = 0x30;
+
+ SetReadFlash1(readFlash1Buffer);
+
+ result = WaitForFlashWrite(2, addr, 0xFF);
+
+ if (!(result & 0xA000) || numTries > 3)
+ goto done;
+
+ numTries++;
+
+ goto try_erase;
+
+done:
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ return result;
+}
+
+u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data)
+{
+ u8 *addr;
+ u16 readFlash1Buffer[0x20];
+
+ if (offset >= gFlash->sector.size)
+ return 0x8000;
+
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+
+ addr = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset;
+
+ SetReadFlash1(readFlash1Buffer);
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
+
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0xA0);
+ *addr = data;
+
+ return WaitForFlashWrite(1, addr, data);
+}
+
+static u16 ProgramByte(u8 *src, u8 *dest)
+{
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0xA0);
+ *dest = *src;
+
+ return WaitForFlashWrite(1, dest, *src);
+}
+
+u16 ProgramFlashSector_MX(u16 sectorNum, void *src)
+{
+ u16 result;
+ u8 *dest;
+ u16 readFlash1Buffer[0x20];
+
+ if (sectorNum >= gFlash->sector.count)
+ return 0x80FF;
+
+ result = EraseFlashSector_MX(sectorNum);
+
+ if (result != 0)
+ return result;
+
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+
+ SetReadFlash1(readFlash1Buffer);
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
+
+ gFlashNumRemainingBytes = gFlash->sector.size;
+ dest = FLASH_BASE + (sectorNum << gFlash->sector.shift);
+
+ while (gFlashNumRemainingBytes > 0)
+ {
+ result = ProgramByte(src, dest);
+
+ if (result != 0)
+ break;
+
+ gFlashNumRemainingBytes--;
+ src++;
+ dest++;
+ }
+
+ return result;
+}
diff --git a/berry_fix/payload/src/flash.c b/berry_fix/payload/src/flash.c
new file mode 100644
index 000000000..1f09d0b8f
--- /dev/null
+++ b/berry_fix/payload/src/flash.c
@@ -0,0 +1,752 @@
+#include "gba/gba.h"
+#include "gba/flash_internal.h"
+#include "constants/vars.h"
+#include "global.h"
+#include "main.h"
+#include "flash.h"
+#include "rtc.h"
+
+struct SaveBlockChunk
+{
+ u8 * data;
+ u16 size;
+};
+
+u8 WriteSaveBlockChunks(u16 a0, const struct SaveBlockChunk * a1);
+u8 WriteSingleChunk(u16 a0, const struct SaveBlockChunk * a1);
+u8 TryWriteSector(u8, u8 *);
+u8 EraseCurrentChunk(u16 a0, const struct SaveBlockChunk * a1);
+u8 TryReadAllSaveSectorsCurrentSlot(u16 a0, const struct SaveBlockChunk * a1);
+u8 ReadAllSaveSectorsCurrentSlot(u16 a0, const struct SaveBlockChunk * a1);
+u8 GetSaveValidStatus(const struct SaveBlockChunk * a1);
+u32 DoReadFlashWholeSection(u8 a0, struct SaveSector * a1);
+u16 CalculateChecksum(const void *, u16);
+
+u16 gFirstSaveSector;
+u32 gPrevSaveCounter;
+u16 gLastKnownGoodSector;
+u32 gDamagedSaveSectors;
+u32 gSaveCounter;
+struct SaveSector * gFastSaveSection;
+u16 gCurSaveChunk;
+bool32 gFlashIdentIsValid;
+
+EWRAM_DATA struct SaveBlock2 gSaveBlock2 = {};
+EWRAM_DATA struct SaveBlock1 gSaveBlock1 = {};
+EWRAM_DATA struct PokemonStorage gPokemonStorage = {};
+
+// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer
+#define SECTOR_DATA_SIZE 3968
+#define SECTOR_FOOTER_SIZE 128
+
+#define SAVEBLOCK_CHUNK(structure, chunkNum) \
+{ \
+ (u8 *)&structure + chunkNum * SECTOR_DATA_SIZE, \
+ min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) \
+} \
+
+static const struct SaveBlockChunk sSaveBlockChunks[] =
+{
+ SAVEBLOCK_CHUNK(gSaveBlock2, 0),
+
+ SAVEBLOCK_CHUNK(gSaveBlock1, 0),
+ SAVEBLOCK_CHUNK(gSaveBlock1, 1),
+ SAVEBLOCK_CHUNK(gSaveBlock1, 2),
+ SAVEBLOCK_CHUNK(gSaveBlock1, 3),
+
+ SAVEBLOCK_CHUNK(gPokemonStorage, 0),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 1),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 2),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 3),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 4),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 5),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 6),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 7),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 8),
+};
+
+const u16 gInfoMessagesPal[] = INCBIN_U16("graphics/msg_box.gbapal");
+const u8 gInfoMessagesTilemap[] = INCBIN_U8("graphics/msg_box.tilemap.lz");
+const u8 gInfoMessagesGfx[] = INCBIN_U8("graphics/msg_box.4bpp.lz");
+
+bool32 flash_maincb_ident_is_valid(void)
+{
+ gFlashIdentIsValid = TRUE;
+ if (!IdentifyFlash())
+ {
+ SetFlashTimerIntr(0, &((IntrFunc *)gIntrFuncPointers)[9]);
+ return TRUE;
+ }
+ gFlashIdentIsValid = FALSE;
+ return FALSE;
+}
+
+void Call_ReadFlash(u16 sectorNum, ptrdiff_t offset, void * dest, size_t size)
+{
+ ReadFlash(sectorNum, offset, dest, size);
+}
+
+u8 Call_WriteSaveBlockChunks(u16 a0, const struct SaveBlockChunk * a1)
+{
+ return WriteSaveBlockChunks(a0, a1);
+}
+
+u8 Call_TryReadAllSaveSectorsCurrentSlot(u16 a0, const struct SaveBlockChunk * a1)
+{
+ return TryReadAllSaveSectorsCurrentSlot(a0, a1);
+}
+
+u32 * GetDamagedSaveSectorsPtr(void)
+{
+ return &gDamagedSaveSectors;
+}
+
+s32 flash_write_save_block_chunks(u8 a0)
+{
+ u8 i;
+
+ switch (a0)
+ {
+ case 0:
+ default:
+ Call_WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks);
+ break;
+ case 1:
+ for (i = 0; i < 5; i++)
+ {
+ Call_WriteSaveBlockChunks(i, sSaveBlockChunks);
+ }
+ break;
+ case 2:
+ Call_WriteSaveBlockChunks(0, sSaveBlockChunks);
+ break;
+ }
+
+ return 0;
+}
+
+u8 flash_write_save_block_chunks_check_damage(u8 a0)
+{
+ flash_write_save_block_chunks(a0);
+ if (*GetDamagedSaveSectorsPtr() == 0)
+ return 1;
+ return 0xFF;
+}
+
+u8 flash_maincb_read_save(u32 unused)
+{
+ return Call_TryReadAllSaveSectorsCurrentSlot(0xFFFF, sSaveBlockChunks);
+}
+
+void msg_load_gfx(void)
+{
+ REG_DISPCNT = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BLDCNT = 0;
+ LZ77UnCompVram(gInfoMessagesGfx, (void *)BG_VRAM);
+ LZ77UnCompVram(gInfoMessagesTilemap, (void *)BG_SCREEN_ADDR(28));
+ CpuCopy16(gInfoMessagesPal, (void *)BG_PLTT, 0x200);
+ REG_BG0CNT = BGCNT_SCREENBASE(28) | BGCNT_TXT512x512;
+ REG_DISPCNT = DISPCNT_BG0_ON;
+}
+
+void msg_display(enum MsgBoxUpdateMessage a0)
+{
+ switch (a0)
+ {
+ case MSGBOX_WILL_NOW_UPDATE:
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ break;
+ case MSGBOX_HAS_BEEN_UPDATED:
+ REG_BG0HOFS = 0x100;
+ REG_BG0VOFS = 0;
+ break;
+ case MSGBOX_UNABLE_TO_UPDATE:
+ REG_BG0HOFS = 0x100;
+ REG_BG0VOFS = 0xB0;
+ break;
+ case MSGBOX_NO_NEED_TO_UPDATE:
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0xB0;
+ break;
+ case MSGBOX_UPDATING:
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0x160;
+ break;
+ }
+}
+
+void Save_EraseAllData(void)
+{
+ u16 i;
+ for (i = 0; i < 32; i++)
+ EraseFlashSector(i);
+}
+
+void Save_ResetSaveCounters(void)
+{
+ gSaveCounter = 0;
+ gFirstSaveSector = 0;
+ gDamagedSaveSectors = 0;
+}
+
+bool32 SetSectorDamagedStatus(u8 op, u8 sectorNum)
+{
+ bool32 retVal = FALSE;
+
+ switch (op)
+ {
+ case SECTOR_DAMAGED:
+ gDamagedSaveSectors |= (1 << sectorNum);
+ break;
+ case SECTOR_OK:
+ gDamagedSaveSectors &= ~(1 << sectorNum);
+ break;
+ case SECTOR_CHECK: // unused
+ if (gDamagedSaveSectors & (1 << sectorNum))
+ retVal = TRUE;
+ break;
+ }
+
+ return retVal;
+}
+
+u8 WriteSaveBlockChunks(u16 chunkId, const struct SaveBlockChunk *chunks)
+{
+ u32 retVal;
+ u16 i;
+
+ gFastSaveSection = eSaveSection;
+
+ if (chunkId != 0xFFFF) // write single chunk
+ {
+ retVal = WriteSingleChunk(chunkId, chunks);
+ }
+ else // write all chunks
+ {
+ gLastKnownGoodSector = gFirstSaveSector;
+ gPrevSaveCounter = gSaveCounter;
+ gFirstSaveSector++;
+ gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT;
+ gSaveCounter++;
+ retVal = SAVE_STATUS_OK;
+
+ for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++)
+ WriteSingleChunk(i, chunks);
+
+ // Check for any bad sectors
+ if (gDamagedSaveSectors != 0) // skip the damaged sector.
+ {
+ retVal = SAVE_STATUS_ERROR;
+ gFirstSaveSector = gLastKnownGoodSector;
+ gSaveCounter = gPrevSaveCounter;
+ }
+ }
+
+ return retVal;
+}
+
+u8 WriteSingleChunk(u16 chunkId, const struct SaveBlockChunk * chunks)
+{
+ u16 i;
+ u16 sectorNum;
+ u8 *chunkData;
+ u16 chunkSize;
+
+ // select sector number
+ sectorNum = chunkId + gFirstSaveSector;
+ sectorNum %= NUM_SECTORS_PER_SAVE_SLOT;
+ // select save slot
+ sectorNum += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2);
+
+ chunkData = chunks[chunkId].data;
+ chunkSize = chunks[chunkId].size;
+
+ // clear save section.
+ for (i = 0; i < sizeof(struct SaveSector); i++)
+ ((u8 *)gFastSaveSection)[i] = 0;
+
+ gFastSaveSection->id = chunkId;
+ gFastSaveSection->signature = FILE_SIGNATURE;
+ gFastSaveSection->counter = gSaveCounter;
+ for (i = 0; i < chunkSize; i++)
+ gFastSaveSection->data[i] = chunkData[i];
+ gFastSaveSection->checksum = CalculateChecksum(chunkData, chunkSize);
+
+ return TryWriteSector(sectorNum, gFastSaveSection->data);
+}
+
+u8 HandleWriteSectorNBytes(u8 sectorNum, u8 *data, u16 size)
+{
+ u16 i;
+ struct SaveSector *section = eSaveSection;
+
+ for (i = 0; i < sizeof(struct SaveSector); i++)
+ ((char *)section)[i] = 0;
+
+ section->signature = FILE_SIGNATURE;
+ for (i = 0; i < size; i++)
+ section->data[i] = data[i];
+ section->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used.
+
+ return TryWriteSector(sectorNum, section->data);
+}
+
+u8 TryWriteSector(u8 sectorNum, u8 *data)
+{
+ if (ProgramFlashSectorAndVerify(sectorNum, data) != 0) // is damaged?
+ {
+ SetSectorDamagedStatus(SECTOR_DAMAGED, sectorNum); // set damaged sector bits.
+ return SAVE_STATUS_ERROR;
+ }
+ else
+ {
+ SetSectorDamagedStatus(SECTOR_OK, sectorNum); // unset damaged sector bits. it's safe now.
+ return SAVE_STATUS_OK;
+ }
+}
+
+u32 RestoreSaveBackupVarsAndIncrement(const struct SaveBlockChunk *chunk) // chunk is unused
+{
+ gFastSaveSection = eSaveSection;
+ gLastKnownGoodSector = gFirstSaveSector;
+ gPrevSaveCounter = gSaveCounter;
+ gFirstSaveSector++;
+ gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT;
+ gSaveCounter++;
+ gCurSaveChunk = 0;
+ gDamagedSaveSectors = 0;
+ return 0;
+}
+
+u32 RestoreSaveBackupVars(const struct SaveBlockChunk *chunk)
+{
+ gFastSaveSection = eSaveSection;
+ gLastKnownGoodSector = gFirstSaveSector;
+ gPrevSaveCounter = gSaveCounter;
+ gCurSaveChunk = 0;
+ gDamagedSaveSectors = 0;
+ return 0;
+}
+
+u8 WriteSingleChunkAndIncrement(u16 a1, const struct SaveBlockChunk * chunk)
+{
+ u8 retVal;
+
+ if (gCurSaveChunk < a1 - 1)
+ {
+ retVal = SAVE_STATUS_OK;
+ WriteSingleChunk(gCurSaveChunk, chunk);
+ gCurSaveChunk++;
+ if (gDamagedSaveSectors)
+ {
+ retVal = SAVE_STATUS_ERROR;
+ gFirstSaveSector = gLastKnownGoodSector;
+ gSaveCounter = gPrevSaveCounter;
+ }
+ }
+ else
+ {
+ retVal = SAVE_STATUS_ERROR;
+ }
+
+ return retVal;
+}
+
+u8 ErasePreviousChunk(u16 a1, const struct SaveBlockChunk *chunk)
+{
+ u8 retVal = SAVE_STATUS_OK;
+
+ EraseCurrentChunk(a1 - 1, chunk);
+
+ if (gDamagedSaveSectors)
+ {
+ retVal = SAVE_STATUS_ERROR;
+ gFirstSaveSector = gLastKnownGoodSector;
+ gSaveCounter = gPrevSaveCounter;
+ }
+ return retVal;
+}
+
+u8 EraseCurrentChunk(u16 chunkId, const struct SaveBlockChunk *chunks)
+{
+ u16 i;
+ u16 sector;
+ u8 *data;
+ u16 size;
+ u8 status;
+
+ // select sector number
+ sector = chunkId + gFirstSaveSector;
+ sector %= NUM_SECTORS_PER_SAVE_SLOT;
+ // select save slot
+ sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2);
+
+ data = chunks[chunkId].data;
+ size = chunks[chunkId].size;
+
+ // clear temp save section.
+ for (i = 0; i < sizeof(struct SaveSector); i++)
+ ((char *)gFastSaveSection)[i] = 0;
+
+ gFastSaveSection->id = chunkId;
+ gFastSaveSection->signature = FILE_SIGNATURE;
+ gFastSaveSection->counter = gSaveCounter;
+
+ // set temp section's data.
+ for (i = 0; i < size; i++)
+ gFastSaveSection->data[i] = data[i];
+
+ // calculate checksum.
+ gFastSaveSection->checksum = CalculateChecksum(data, size);
+
+ EraseFlashSector(sector);
+
+ status = SAVE_STATUS_OK;
+
+ for (i = 0; i < sizeof(struct UnkSaveSection); i++)
+ {
+ if (ProgramFlashByte(sector, i, gFastSaveSection->data[i]))
+ {
+ status = SAVE_STATUS_ERROR;
+ break;
+ }
+ }
+
+ if (status == SAVE_STATUS_ERROR)
+ {
+ SetSectorDamagedStatus(SECTOR_DAMAGED, sector);
+ return SAVE_STATUS_ERROR;
+ }
+ else
+ {
+ status = SAVE_STATUS_OK;
+
+ for (i = 0; i < 7; i++)
+ {
+ if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i]))
+ {
+ status = SAVE_STATUS_ERROR;
+ break;
+ }
+ }
+
+ if (status == SAVE_STATUS_ERROR)
+ {
+ SetSectorDamagedStatus(SECTOR_DAMAGED, sector);
+ return SAVE_STATUS_ERROR;
+ }
+ else
+ {
+ SetSectorDamagedStatus(SECTOR_OK, sector);
+ return SAVE_STATUS_OK;
+ }
+ }
+}
+
+u8 WriteSomeFlashByteToPrevSector(u16 a1, const struct SaveBlockChunk *chunk)
+{
+ u16 sector;
+
+ // select sector number
+ sector = a1 + gFirstSaveSector - 1;
+ sector %= NUM_SECTORS_PER_SAVE_SLOT;
+ // select save slot
+ sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2);
+
+ if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)]))
+ {
+ // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
+ SetSectorDamagedStatus(SECTOR_DAMAGED, sector);
+ gFirstSaveSector = gLastKnownGoodSector;
+ gSaveCounter = gPrevSaveCounter;
+ return SAVE_STATUS_ERROR;
+ }
+ else
+ {
+ SetSectorDamagedStatus(SECTOR_OK, sector);
+ return SAVE_STATUS_OK;
+ }
+}
+
+u8 WriteSomeFlashByte0x25ToPrevSector(u16 a1, const struct SaveBlockChunk *chunk)
+{
+ u16 sector;
+
+ sector = a1 + gFirstSaveSector - 1;
+ sector %= NUM_SECTORS_PER_SAVE_SLOT;
+ sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2);
+
+ if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25))
+ {
+ // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
+ SetSectorDamagedStatus(SECTOR_DAMAGED, sector);
+ gFirstSaveSector = gLastKnownGoodSector;
+ gSaveCounter = gPrevSaveCounter;
+ return SAVE_STATUS_ERROR;
+ }
+ else
+ {
+ SetSectorDamagedStatus(SECTOR_OK, sector);
+ return SAVE_STATUS_OK;
+ }
+}
+
+u8 TryReadAllSaveSectorsCurrentSlot(u16 a1, const struct SaveBlockChunk *chunk)
+{
+ u8 retVal;
+ gFastSaveSection = eSaveSection;
+ if (a1 != 0xFFFF)
+ {
+ retVal = SAVE_STATUS_ERROR;
+ }
+ else
+ {
+ retVal = GetSaveValidStatus(chunk);
+ ReadAllSaveSectorsCurrentSlot(0xFFFF, chunk);
+ }
+
+ return retVal;
+}
+
+u8 ReadAllSaveSectorsCurrentSlot(u16 a1, const struct SaveBlockChunk *chunks)
+{
+ u16 i;
+ u16 checksum;
+ u16 sector = NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2);
+ u16 id;
+
+ for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++)
+ {
+ DoReadFlashWholeSection(i + sector, gFastSaveSection);
+ id = gFastSaveSection->id;
+ if (id == 0)
+ gFirstSaveSector = i;
+ checksum = CalculateChecksum(gFastSaveSection->data, chunks[id].size);
+ if (gFastSaveSection->signature == FILE_SIGNATURE
+ && gFastSaveSection->checksum == checksum)
+ {
+ u16 j;
+ for (j = 0; j < chunks[id].size; j++)
+ chunks[id].data[j] = gFastSaveSection->data[j];
+ }
+ }
+
+ return 1;
+}
+
+u8 GetSaveValidStatus(const struct SaveBlockChunk *chunks)
+{
+ u16 sector;
+ bool8 signatureValid;
+ u16 checksum;
+ u32 slot1saveCounter = 0;
+ u32 slot2saveCounter = 0;
+ u8 slot1Status;
+ u8 slot2Status;
+ u32 validSectors;
+ const u32 ALL_SECTORS = (1 << NUM_SECTORS_PER_SAVE_SLOT) - 1; // bitmask of all saveblock sectors
+
+ // check save slot 1.
+ validSectors = 0;
+ signatureValid = FALSE;
+ for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++)
+ {
+ DoReadFlashWholeSection(sector, gFastSaveSection);
+ if (gFastSaveSection->signature == FILE_SIGNATURE)
+ {
+ signatureValid = TRUE;
+ checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size);
+ if (gFastSaveSection->checksum == checksum)
+ {
+ slot1saveCounter = gFastSaveSection->counter;
+ validSectors |= 1 << gFastSaveSection->id;
+ }
+ }
+ }
+
+ if (signatureValid)
+ {
+ if (validSectors == ALL_SECTORS)
+ slot1Status = SAVE_STATUS_OK;
+ else
+ slot1Status = SAVE_STATUS_ERROR;
+ }
+ else
+ {
+ slot1Status = SAVE_STATUS_EMPTY;
+ }
+
+ // check save slot 2.
+ validSectors = 0;
+ signatureValid = FALSE;
+ for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++)
+ {
+ DoReadFlashWholeSection(NUM_SECTORS_PER_SAVE_SLOT + sector, gFastSaveSection);
+ if (gFastSaveSection->signature == FILE_SIGNATURE)
+ {
+ signatureValid = TRUE;
+ checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size);
+ if (gFastSaveSection->checksum == checksum)
+ {
+ slot2saveCounter = gFastSaveSection->counter;
+ validSectors |= 1 << gFastSaveSection->id;
+ }
+ }
+ }
+
+ if (signatureValid)
+ {
+ if (validSectors == ALL_SECTORS)
+ slot2Status = SAVE_STATUS_OK;
+ else
+ slot2Status = SAVE_STATUS_ERROR;
+ }
+ else
+ {
+ slot2Status = SAVE_STATUS_EMPTY;
+ }
+
+ if (slot1Status == SAVE_STATUS_OK && slot2Status == SAVE_STATUS_OK)
+ {
+ // Choose counter of the most recent save file
+ if ((slot1saveCounter == -1 && slot2saveCounter == 0) || (slot1saveCounter == 0 && slot2saveCounter == -1))
+ {
+ if ((unsigned)(slot1saveCounter + 1) < (unsigned)(slot2saveCounter + 1))
+ gSaveCounter = slot2saveCounter;
+ else
+ gSaveCounter = slot1saveCounter;
+ }
+ else
+ {
+ if (slot1saveCounter < slot2saveCounter)
+ gSaveCounter = slot2saveCounter;
+ else
+ gSaveCounter = slot1saveCounter;
+ }
+ return SAVE_STATUS_OK;
+ }
+
+ if (slot1Status == SAVE_STATUS_OK)
+ {
+ gSaveCounter = slot1saveCounter;
+ if (slot2Status == SAVE_STATUS_ERROR)
+ return SAVE_STATUS_ERROR;
+ else
+ return SAVE_STATUS_OK;
+ }
+
+ if (slot2Status == SAVE_STATUS_OK)
+ {
+ gSaveCounter = slot2saveCounter;
+ if (slot1Status == SAVE_STATUS_ERROR)
+ return SAVE_STATUS_ERROR;
+ else
+ return SAVE_STATUS_OK;
+ }
+
+ if (slot1Status == SAVE_STATUS_EMPTY && slot2Status == SAVE_STATUS_EMPTY)
+ {
+ gSaveCounter = 0;
+ gFirstSaveSector = 0;
+ return SAVE_STATUS_EMPTY;
+ }
+
+ gSaveCounter = 0;
+ gFirstSaveSector = 0;
+ return 2;
+}
+
+u8 ReadSomeUnknownSectorAndVerify(u8 sector, u8 *data, u16 size)
+{
+ u16 i;
+ struct SaveSector *section = eSaveSection;
+
+ DoReadFlashWholeSection(sector, section);
+ if (section->signature == FILE_SIGNATURE)
+ {
+ u16 checksum = CalculateChecksum(section->data, size);
+ if (section->id == checksum)
+ {
+ for (i = 0; i < size; i++)
+ data[i] = section->data[i];
+ return SAVE_STATUS_OK;
+ }
+ else
+ {
+ return 2;
+ }
+ }
+ else
+ {
+ return SAVE_STATUS_EMPTY;
+ }
+}
+
+u32 DoReadFlashWholeSection(u8 sector, struct SaveSector *section)
+{
+ ReadFlash(sector, 0, section->data, sizeof(struct SaveSector));
+ return 1;
+}
+
+u16 CalculateChecksum(const void *data, u16 size)
+{
+ u16 i;
+ u32 checksum = 0;
+
+ for (i = 0; i < (size / 4); i++)
+ {
+ checksum += *((u32 *)data);
+ data += sizeof(u32);
+ }
+
+ return ((checksum >> 16) + checksum);
+}
+
+void nullsub_0201182C()
+{
+}
+
+void nullsub_02011830()
+{
+}
+
+void nullsub_02011834()
+{
+}
+
+u16 * get_var_addr(u16 a0)
+{
+ if (a0 < VARS_START)
+ return NULL;
+ if (a0 < VAR_SPECIAL_0)
+ return &gSaveBlock1.vars[a0 - VARS_START];
+ return NULL;
+}
+
+bool32 flash_maincb_check_need_reset_pacifidlog_tm(void)
+{
+ u8 sp0;
+ u16 * data = get_var_addr(VAR_PACIFIDLOG_TM_RECEIVED_DAY);
+ rtc_maincb_is_time_since_last_berry_update_positive(&sp0);
+ if (*data <= gRtcUTCTime.days)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool32 flash_maincb_reset_pacifidlog_tm(void)
+{
+ u8 sp0;
+ if (flash_maincb_check_need_reset_pacifidlog_tm() == TRUE)
+ return TRUE;
+ rtc_maincb_is_time_since_last_berry_update_positive(&sp0);
+ if (gRtcUTCTime.days < 0)
+ return FALSE;
+ *get_var_addr(VAR_PACIFIDLOG_TM_RECEIVED_DAY) = 1;
+ if (flash_write_save_block_chunks_check_damage(0) != TRUE)
+ return FALSE;
+ return TRUE;
+}
diff --git a/berry_fix/payload/src/main.c b/berry_fix/payload/src/main.c
new file mode 100644
index 000000000..325d3830e
--- /dev/null
+++ b/berry_fix/payload/src/main.c
@@ -0,0 +1,289 @@
+#include "gba/gba.h"
+#include "global.h"
+#include "main.h"
+#include "rtc.h"
+#include "flash.h"
+
+static s32 gInitialWaitTimer;
+IntrFunc gIntrTable[16];
+u16 gHeldKeys;
+u16 gNewKeys;
+u8 gIntrVector[0x100];
+u32 gUpdateSuccessful;
+u32 gUnknown_3001194;
+u32 gUnknown_30011A0[0x19];
+u32 gMainCallbackState;
+u32 gGameVersion;
+
+EWRAM_DATA u8 gSharedMem[0x8000] = {};
+
+void IntrMain(void);
+void ReadKeys(void);
+void dummy_intr_0(void);
+void dummy_intr_1(void);
+void main_callback(u32 *, void *, void *);
+
+
+const char gBerryFixGameCode[] = "AGBJ";
+const IntrFunc gIntrFuncPointers[] = {
+ dummy_intr_0,
+ dummy_intr_1,
+ dummy_intr_0,
+ dummy_intr_0,
+ dummy_intr_0,
+ dummy_intr_0,
+ dummy_intr_0,
+ dummy_intr_0,
+ dummy_intr_0,
+ dummy_intr_0,
+ NULL,
+ NULL,
+ NULL
+};
+const char gVersionData[][2] = {
+ {'J', 1},
+ {'E', 2},
+ {'D', 1},
+ {'F', 1},
+ {'I', 1},
+ {'S', 1}
+};
+const char gRubyTitleAndCode[] = "POKEMON RUBYAXV";
+const char gSapphireTitleAndCode[] = "POKEMON SAPPAXP";
+const u16 sDebugPals[20] = {
+ RGB(00, 00, 00),
+ RGB(31, 00, 00),
+ RGB(00, 31, 00),
+ RGB(00, 00, 31)
+};
+const u16 sDebugDigitsGfx[] = INCBIN_U16("graphics/debug_digits.4bpp");
+
+void AgbMain(void)
+{
+ RegisterRamReset(0x1E);
+ DmaCopy32(3, gIntrFuncPointers, gIntrTable, sizeof gIntrFuncPointers);
+ DmaCopy32(3, IntrMain, gIntrVector, sizeof(gIntrVector));
+ INTR_VECTOR = gIntrVector;
+ REG_IE = INTR_FLAG_VBLANK;
+ if (*RomHeaderMagic == 0x96 && *(u32 *)RomHeaderGameCode == *(u32 *)gBerryFixGameCode)
+ REG_IE |= INTR_FLAG_GAMEPAK;
+ REG_DISPSTAT = DISPSTAT_VBLANK_INTR;
+ REG_IME = INTR_FLAG_VBLANK;
+ msg_load_gfx();
+ gMainCallbackState = MAINCB_INIT;
+ gUnknown_3001194 = 0;
+ for (;;)
+ {
+ VBlankIntrWait();
+ ReadKeys();
+ main_callback(&gMainCallbackState, gUnknown_30011A0, gSharedMem);
+ }
+}
+
+void dummy_intr_1(void)
+{}
+
+void dummy_intr_0(void)
+{}
+
+void ReadKeys(void)
+{
+ u16 keyInput = REG_KEYINPUT ^ KEYS_MASK;
+ gNewKeys = keyInput & ~gHeldKeys;
+ gHeldKeys = keyInput;
+}
+
+void fill_palette(const u8 * src, u16 * dest, u8 value)
+{
+ s32 i;
+ for (i = 0; src[i] != 0; i++)
+ dest[i] = src[i] | value << 12;
+}
+
+bool32 berry_fix_memcmp(const char * src1, const char * src2, size_t size)
+{
+ s32 i;
+ for (i = 0; i < size; i++)
+ {
+ if (src1[i] != src2[i])
+ return FALSE;
+ }
+ return TRUE;
+}
+
+s32 validate_rom_header_internal(void)
+{
+ char languageCode = *(RomHeaderGameCode + 3);
+ s32 softwareVersion = *RomHeaderSoftwareVersion;
+ s32 shouldUpdate = -1;
+ s32 i;
+ for (i = 0; i < ARRAY_COUNT(gVersionData); i++)
+ {
+ if (languageCode == gVersionData[i][0])
+ {
+ if (softwareVersion >= gVersionData[i][1])
+ {
+ shouldUpdate = 0;
+ }
+ else
+ {
+ shouldUpdate = 1;
+ }
+ break;
+ }
+ }
+ if (shouldUpdate != -1)
+ {
+ if (berry_fix_memcmp(RomHeaderGameTitle, gRubyTitleAndCode, 15) == TRUE)
+ {
+ if (shouldUpdate == 0)
+ return RUBY_NONEED;
+ else
+ {
+ gGameVersion = VERSION_RUBY;
+ return RUBY_UPDATABLE;
+ }
+ }
+ else if (berry_fix_memcmp(RomHeaderGameTitle, gSapphireTitleAndCode, 15) == TRUE)
+ {
+ if (shouldUpdate == 0)
+ return SAPPHIRE_NONEED;
+ else
+ {
+ gGameVersion = VERSION_SAPPHIRE;
+ return SAPPHIRE_UPDATABLE;
+ }
+ }
+ }
+ return INVALID;
+}
+
+s32 validate_rom_header(void)
+{
+ if (*RomHeaderMakerCode == '0' && *(RomHeaderMakerCode + 1) == '1' && *RomHeaderMagic == 0x96)
+ return validate_rom_header_internal();
+ else
+ return INVALID;
+}
+
+void main_callback(u32 * state, void * unused1, void * unused2)
+{
+ u8 year;
+ switch (*state)
+ {
+ case MAINCB_INIT:
+ msg_display(MSGBOX_WILL_NOW_UPDATE);
+ if (++gInitialWaitTimer >= 180)
+ {
+ gInitialWaitTimer = 0;
+ gUpdateSuccessful = 0;
+ switch (validate_rom_header())
+ {
+ case SAPPHIRE_UPDATABLE:
+ case RUBY_UPDATABLE: // Should Update Ruby
+ ++(*state); // MAINCB_CHECK_RTC
+ break;
+ case INVALID: // Invalid header
+ *state = MAINCB_ERROR;
+ break;
+ case SAPPHIRE_NONEED: // Should not update Sapphire
+ case RUBY_NONEED: // Should not update Ruby
+ *state = MAINCB_NO_NEED_TO_FIX;
+ break;
+ }
+ }
+ break;
+ case MAINCB_CHECK_RTC:
+ if (!rtc_maincb_is_rtc_working())
+ *state = MAINCB_ERROR;
+ else
+ ++(*state); // MAINCB_CHECK_FLASH
+ break;
+ case MAINCB_CHECK_FLASH:
+ if (flash_maincb_ident_is_valid() == TRUE)
+ ++(*state); // MAINCB_READ_SAVE
+ else
+ *state = MAINCB_ERROR;
+ break;
+ case MAINCB_READ_SAVE:
+ if (flash_maincb_read_save(0) == SAVE_STATUS_OK)
+ ++(*state); // MAINCB_CHECK_TIME
+ else
+ *state = MAINCB_ERROR;
+ break;
+ case MAINCB_CHECK_TIME:
+ if (rtc_maincb_is_time_since_last_berry_update_positive(&year) == TRUE)
+ {
+ if (year == 0)
+ ++(*state); // MAINCB_FIX_DATE
+ else
+ *state = MAINCB_CHECK_PACIFIDLOG_TM;
+ }
+ else
+ {
+ if (year != 1)
+ *state = MAINCB_YEAR_MAKES_NO_SENSE;
+ else
+ ++(*state); // MAINCB_FIX_DATE
+ }
+ break;
+ case MAINCB_FIX_DATE:
+ rtc_maincb_fix_date();
+ gUpdateSuccessful |= 1;
+ *state = MAINCB_CHECK_PACIFIDLOG_TM;
+ break;
+ case MAINCB_CHECK_PACIFIDLOG_TM:
+ if (flash_maincb_check_need_reset_pacifidlog_tm() == TRUE)
+ *state = MAINCB_FINISHED;
+ else
+ *state = MAINCB_FIX_PACIFIDLOG_TM;
+ break;
+ case MAINCB_FIX_PACIFIDLOG_TM:
+ msg_display(MSGBOX_UPDATING);
+ if (flash_maincb_reset_pacifidlog_tm() == TRUE)
+ {
+ gUpdateSuccessful |= 1;
+ *state = MAINCB_FINISHED;
+ }
+ else
+ *state = MAINCB_ERROR;
+ break;
+ case MAINCB_FINISHED:
+ if (gUpdateSuccessful == 0)
+ *state = MAINCB_NO_NEED_TO_FIX;
+ else
+ msg_display(MSGBOX_HAS_BEEN_UPDATED);
+ break;
+ case MAINCB_NO_NEED_TO_FIX:
+ msg_display(MSGBOX_NO_NEED_TO_UPDATE);
+ break;
+ case MAINCB_YEAR_MAKES_NO_SENSE:
+ msg_display(MSGBOX_UNABLE_TO_UPDATE);
+ break;
+ case MAINCB_ERROR:
+ msg_display(MSGBOX_UNABLE_TO_UPDATE);
+ break;
+ }
+}
+
+void DBG_LoadDigitsPal(void)
+{
+ const u16 * src;
+ s32 i;
+ register vu16 * dest asm("r3") = (vu16 *)BG_PLTT + 1;
+ DmaFill16(3, RGB(31, 31, 31), (vu16 *)BG_PLTT, BG_PLTT_SIZE);
+ src = sDebugPals;
+ for (i = 0; i < 4; i++)
+ {
+ *dest = *src;
+ dest += 16;
+ src++;
+ }
+}
+
+void DBG_LoadDigits(void)
+{
+ DmaFill16(3, 0x1111, (void *)VRAM + 0x8420, 0x1800);
+ DmaCopy32(3, sDebugDigitsGfx, (void *)VRAM + 0x8600, 0x200);
+ DBG_LoadDigitsPal();
+}
diff --git a/berry_fix/payload/src/rtc.c b/berry_fix/payload/src/rtc.c
new file mode 100644
index 000000000..e73f522aa
--- /dev/null
+++ b/berry_fix/payload/src/rtc.c
@@ -0,0 +1,346 @@
+#include "gba/gba.h"
+#include "siirtc.h"
+#include "global.h"
+#include "main.h"
+
+struct Time gTimeSinceBerryUpdate;
+struct Time gRtcUTCTime;
+
+static u16 sRtcProbeStatus;
+static struct SiiRtcInfo sRtcInfoBuffer;
+static u8 sRtcProbeCode;
+static u16 sImeBak;
+static struct SiiRtcInfo sRtcInfoWork;
+
+const struct SiiRtcInfo sDefaultRTC = {
+ .year = 0, // 2000
+ .month = 1, // January
+ .day = 1, // 01
+ .dayOfWeek = 0,
+ .hour = 0,
+ .minute = 0,
+ .second = 0,
+ .status = 0,
+ .alarmHour = 0,
+ .alarmMinute = 0
+};
+const s32 sDaysPerMonth[] = {
+ 31,
+ 28,
+ 31,
+ 30,
+ 31,
+ 30,
+ 31,
+ 31,
+ 30,
+ 31,
+ 30,
+ 31
+};
+
+void rtc_get_status_and_datetime(struct SiiRtcInfo *);
+u16 rtc_validate_datetime(struct SiiRtcInfo *);
+
+
+void rtc_intr_disable(void)
+{
+ sImeBak = REG_IME;
+ REG_IME = 0;
+}
+
+void rtc_intr_enable(void)
+{
+ REG_IME = sImeBak;
+}
+
+s32 bcd_to_hex(u8 a0)
+{
+ if (a0 >= 0xa0 || (a0 & 0xF) >= 10)
+ return 0xFF;
+ return ((a0 >> 4) & 0xF) * 10 + (a0 & 0xF);
+}
+
+bool8 is_leap_year(u8 year)
+{
+ if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
+ return TRUE;
+ return FALSE;
+}
+
+u16 rtc_count_days_parameterized(u8 year, u8 month, u8 day)
+{
+ u16 numDays = 0;
+ s32 i;
+ for (i = year - 1; i > 0; i--)
+ {
+ numDays += 365;
+ if (is_leap_year(i) == TRUE)
+ numDays++;
+ }
+ for (i = 0; i < month - 1; i++)
+ numDays += sDaysPerMonth[i];
+ if (month > MONTH_FEB && is_leap_year(year) == TRUE)
+ numDays++;
+ numDays += day;
+ return numDays;
+}
+
+u16 rtc_count_days_from_info(struct SiiRtcInfo *info)
+{
+ return rtc_count_days_parameterized(bcd_to_hex(info->year), bcd_to_hex(info->month), bcd_to_hex(info->day));
+}
+
+static void rtc_probe_status(void)
+{
+ sRtcProbeStatus = 0;
+ rtc_intr_disable();
+ SiiRtcUnprotect();
+ sRtcProbeCode = SiiRtcProbe();
+ rtc_intr_enable();
+ if ((sRtcProbeCode & 0xF) != 1)
+ sRtcProbeStatus = 1;
+ else
+ {
+ if (sRtcProbeCode & 0xF0)
+ sRtcProbeStatus = 2;
+ else
+ sRtcProbeStatus = 0;
+ rtc_get_status_and_datetime(&sRtcInfoBuffer);
+ sRtcProbeStatus = rtc_validate_datetime(&sRtcInfoBuffer);
+ }
+}
+
+u16 rtc_get_probe_status(void)
+{
+ return sRtcProbeStatus;
+}
+
+void sub_020106EC(struct SiiRtcInfo * info)
+{
+ if (sRtcProbeStatus & 0xFF0)
+ *info = sDefaultRTC;
+ else
+ rtc_get_status_and_datetime(info);
+}
+
+void rtc_get_datetime(struct SiiRtcInfo * info)
+{
+ rtc_intr_disable();
+ SiiRtcGetDateTime(info);
+ rtc_intr_enable();
+}
+
+void rtc_get_status(struct SiiRtcInfo * info)
+{
+ rtc_intr_disable();
+ SiiRtcGetStatus(info);
+ rtc_intr_enable();
+}
+
+void rtc_get_status_and_datetime(struct SiiRtcInfo * info)
+{
+ rtc_get_status(info);
+ rtc_get_datetime(info);
+}
+
+u16 rtc_validate_datetime(struct SiiRtcInfo * info)
+{
+ s32 year, month, day;
+ u16 r4 = (info->status & SIIRTCINFO_POWER) ? 0x20 : 0;
+ if (!(info->status & SIIRTCINFO_24HOUR))
+ r4 |= 0x10;
+ year = bcd_to_hex(info->year);
+ if (year == 0xFF)
+ r4 |= 0x40;
+ month = bcd_to_hex(info->month);
+ if (month == 0xFF || month == 0 || month > 12)
+ r4 |= 0x80;
+ day = bcd_to_hex(info->day);
+ if (day == 0xFF)
+ r4 |= 0x100;
+ if (month == MONTH_FEB)
+ {
+ if (day > is_leap_year(year) + sDaysPerMonth[1])
+ r4 |= 0x100;
+ }
+ else
+ {
+ if (day > sDaysPerMonth[month - 1])
+ r4 |= 0x100;
+ }
+ day = bcd_to_hex(info->hour);
+ if (day > 24)
+ r4 |= 0x200;
+ day = bcd_to_hex(info->minute);
+ if (day > 60)
+ r4 |= 0x400;
+ day = bcd_to_hex(info->second);
+ if (day > 60)
+ r4 |= 0x800;
+ return r4;
+}
+
+void rtc_reset(void)
+{
+ rtc_intr_disable();
+ SiiRtcReset();
+ rtc_intr_enable();
+}
+
+void rtc_sub_time_from_datetime(struct SiiRtcInfo * datetime, struct Time * dest, struct Time * timediff)
+{
+ u16 r4 = rtc_count_days_from_info(datetime);
+ dest->seconds = bcd_to_hex(datetime->second) - timediff->seconds;
+ dest->minutes = bcd_to_hex(datetime->minute) - timediff->minutes;
+ dest->hours = bcd_to_hex(datetime->hour) - timediff->hours;
+ dest->days = r4 - timediff->days;
+ if (dest->seconds < 0)
+ {
+ dest->seconds += 60;
+ dest->minutes--;
+ }
+ if (dest->minutes < 0)
+ {
+ dest->minutes += 60;
+ dest->hours--;
+ }
+ if (dest->hours < 0)
+ {
+ dest->hours += 24;
+ dest->days--;
+ }
+}
+
+void rtc_sub_time_from_time(struct Time * dest, struct Time * diff, struct Time * src)
+{
+ dest->seconds = src->seconds - diff->seconds;
+ dest->minutes = src->minutes - diff->minutes;
+ dest->hours = src->hours - diff->hours;
+ dest->days = src->days - diff->days;
+ if (dest->seconds < 0)
+ {
+ dest->seconds += 60;
+ dest->minutes--;
+ }
+ if (dest->minutes < 0)
+ {
+ dest->minutes += 60;
+ dest->hours--;
+ }
+ if (dest->hours < 0)
+ {
+ dest->hours += 24;
+ dest->days--;
+ }
+}
+
+bool32 rtc_maincb_is_rtc_working(void)
+{
+ rtc_probe_status();
+ if (rtc_get_probe_status() & 0xFF0)
+ return FALSE;
+ return TRUE;
+}
+
+void rtc_set_datetime(struct SiiRtcInfo * info)
+{
+ vu16 imeBak = REG_IME;
+ REG_IME = 0;
+ SiiRtcSetDateTime(info);
+ REG_IME = imeBak;
+}
+
+bool32 rtc_maincb_is_time_since_last_berry_update_positive(u8 * a0)
+{
+ rtc_get_status_and_datetime(&sRtcInfoWork);
+ *a0 = bcd_to_hex(sRtcInfoWork.year);
+ rtc_sub_time_from_datetime(&sRtcInfoWork, &gRtcUTCTime, LocalTimeOffset);
+ rtc_sub_time_from_time(&gTimeSinceBerryUpdate, LastBerryTreeUpdate, &gRtcUTCTime);
+ if (gTimeSinceBerryUpdate.days * 1440 + gTimeSinceBerryUpdate.hours * 60 + gTimeSinceBerryUpdate.minutes >= 0)
+ return TRUE;
+ return FALSE;
+}
+
+u32 hex_to_bcd(u8 a0)
+{
+ u32 r4;
+ if (a0 > 99)
+ return 0xFF;
+ r4 = Div(a0, 10) << 4;
+ r4 |= Mod(a0, 10);
+ return r4;
+}
+
+void sii_rtc_inc(u8 * a0)
+{
+ *a0 = hex_to_bcd(bcd_to_hex(*a0) + 1);
+}
+
+void sii_rtc_inc_month(struct SiiRtcInfo * a0)
+{
+ sii_rtc_inc(&a0->month);
+ if (bcd_to_hex(a0->month) > 12)
+ {
+ sii_rtc_inc(&a0->year);
+ a0->month = MONTH_JAN;
+ }
+}
+
+void sii_rtc_inc_day(struct SiiRtcInfo * a0)
+{
+ sii_rtc_inc(&a0->day);
+ if (bcd_to_hex(a0->day) > sDaysPerMonth[bcd_to_hex(a0->month) - 1])
+ {
+ if (!is_leap_year(bcd_to_hex(a0->year)) || bcd_to_hex(a0->month) != MONTH_FEB || bcd_to_hex(a0->day) != 29)
+ {
+ a0->day = 1;
+ sii_rtc_inc_month(a0);
+ }
+ }
+}
+
+bool32 rtc_is_past_feb_28_2000(struct SiiRtcInfo * a0)
+{
+ if (bcd_to_hex(a0->year) == 0)
+ {
+ if (bcd_to_hex(a0->month) == MONTH_JAN)
+ return FALSE;
+ if (bcd_to_hex(a0->month) > MONTH_FEB)
+ return TRUE;
+ if (bcd_to_hex(a0->day) == 29)
+ return TRUE;
+ return FALSE;
+ }
+ if (bcd_to_hex(a0->year) == 1)
+ return TRUE;
+ return FALSE;
+}
+
+void rtc_maincb_fix_date(void)
+{
+ rtc_get_status_and_datetime(&sRtcInfoWork);
+ if (bcd_to_hex(sRtcInfoWork.year) == 0 || bcd_to_hex(sRtcInfoWork.year) == 1)
+ {
+ if (bcd_to_hex(sRtcInfoWork.year) == 1)
+ {
+ sRtcInfoWork.year = 2;
+ sRtcInfoWork.month = MONTH_JAN;
+ sRtcInfoWork.day = 2;
+ rtc_set_datetime(&sRtcInfoWork);
+ }
+ else
+ {
+ if (rtc_is_past_feb_28_2000(&sRtcInfoWork) == TRUE)
+ {
+ sii_rtc_inc_day(&sRtcInfoWork);
+ sii_rtc_inc(&sRtcInfoWork.year);
+ }
+ else
+ {
+ sii_rtc_inc(&sRtcInfoWork.year);
+ }
+ rtc_set_datetime(&sRtcInfoWork);
+ }
+ }
+}
diff --git a/berry_fix/payload/src/siirtc.c b/berry_fix/payload/src/siirtc.c
new file mode 100644
index 000000000..965a068f1
--- /dev/null
+++ b/berry_fix/payload/src/siirtc.c
@@ -0,0 +1,432 @@
+// Ruby/Sapphire/Emerald cartridges contain a Seiko Instruments Inc. (SII)
+// S-3511A real-time clock (RTC). This library ("SIIRTC_V001") is for
+// communicating with the RTC.
+
+#include "gba/gba.h"
+#include "siirtc.h"
+
+#define STATUS_INTFE 0x02 // frequency interrupt enable
+#define STATUS_INTME 0x08 // per-minute interrupt enable
+#define STATUS_INTAE 0x20 // alarm interrupt enable
+#define STATUS_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode
+#define STATUS_POWER 0x80 // power on or power failure occurred
+
+#define TEST_MODE 0x80 // flag in the "second" byte
+
+#define ALARM_AM 0x00
+#define ALARM_PM 0x80
+
+#define OFFSET_YEAR offsetof(struct SiiRtcInfo, year)
+#define OFFSET_MONTH offsetof(struct SiiRtcInfo, month)
+#define OFFSET_DAY offsetof(struct SiiRtcInfo, day)
+#define OFFSET_DAY_OF_WEEK offsetof(struct SiiRtcInfo, dayOfWeek)
+#define OFFSET_HOUR offsetof(struct SiiRtcInfo, hour)
+#define OFFSET_MINUTE offsetof(struct SiiRtcInfo, minute)
+#define OFFSET_SECOND offsetof(struct SiiRtcInfo, second)
+#define OFFSET_STATUS offsetof(struct SiiRtcInfo, status)
+#define OFFSET_ALARM_HOUR offsetof(struct SiiRtcInfo, alarmHour)
+#define OFFSET_ALARM_MINUTE offsetof(struct SiiRtcInfo, alarmMinute)
+
+#define INFO_BUF(info, index) (*((u8 *)(info) + (index)))
+
+#define DATETIME_BUF(info, index) INFO_BUF(info, OFFSET_YEAR + index)
+#define DATETIME_BUF_LEN (OFFSET_SECOND - OFFSET_YEAR + 1)
+
+#define TIME_BUF(info, index) INFO_BUF(info, OFFSET_HOUR + index)
+#define TIME_BUF_LEN (OFFSET_SECOND - OFFSET_HOUR + 1)
+
+#define WR 0 // command for writing data
+#define RD 1 // command for reading data
+
+#define CMD(n) (0x60 | (n << 1))
+
+#define CMD_RESET CMD(0)
+#define CMD_STATUS CMD(1)
+#define CMD_DATETIME CMD(2)
+#define CMD_TIME CMD(3)
+#define CMD_ALARM CMD(4)
+
+#define GPIO_PORT_DATA (*(vu16 *)0x80000C4)
+#define GPIO_PORT_DIRECTION (*(vu16 *)0x80000C6)
+#define GPIO_PORT_READ_ENABLE (*(vu16 *)0x80000C8)
+
+extern vu16 GPIOPortDirection;
+
+static u16 sDummy; // unused variable
+static bool8 sLocked;
+
+static int WriteCommand(u8 value);
+static int WriteData(u8 value);
+static u8 ReadData();
+static void EnableGpioPortRead();
+static void DisableGpioPortRead();
+
+static const char AgbLibRtcVersion[] = "SIIRTC_V001";
+
+void SiiRtcUnprotect()
+{
+ EnableGpioPortRead();
+ sLocked = FALSE;
+}
+
+void SiiRtcProtect()
+{
+ DisableGpioPortRead();
+ sLocked = TRUE;
+}
+
+u8 SiiRtcProbe()
+{
+ u8 errorCode;
+ struct SiiRtcInfo rtc;
+
+ if (!SiiRtcGetStatus(&rtc))
+ return 0;
+
+ errorCode = 0;
+
+ if ((rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == SIIRTCINFO_POWER
+ || (rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == 0)
+ {
+ // The RTC is in 12-hour mode. Reset it and switch to 24-hour mode.
+
+ // Note that the conditions are redundant and equivalent to simply
+ // "(rtc.status & SIIRTCINFO_24HOUR) == 0". It's possible that this
+ // was also intended to handle resetting the clock after power failure
+ // but a mistake was made.
+
+ if (!SiiRtcReset())
+ return 0;
+
+ errorCode++;
+ }
+
+ SiiRtcGetTime(&rtc);
+
+ if (rtc.second & TEST_MODE)
+ {
+ // The RTC is in test mode. Reset it to leave test mode.
+
+ if (!SiiRtcReset())
+ return (errorCode << 4) & 0xF0;
+
+ errorCode++;
+ }
+
+ return (errorCode << 4) | 1;
+}
+
+bool8 SiiRtcReset()
+{
+ u8 result;
+ struct SiiRtcInfo rtc;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_RESET | WR);
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ rtc.status = SIIRTCINFO_24HOUR;
+
+ result = SiiRtcSetStatus(&rtc);
+
+ return result;
+}
+
+bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc)
+{
+ u8 statusData;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_STATUS | RD);
+
+ GPIO_PORT_DIRECTION = 5;
+
+ statusData = ReadData();
+
+ rtc->status = (statusData & (STATUS_POWER | STATUS_24HOUR))
+ | ((statusData & STATUS_INTAE) >> 3)
+ | ((statusData & STATUS_INTME) >> 2)
+ | ((statusData & STATUS_INTFE) >> 1);
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc)
+{
+ u8 statusData;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ statusData = STATUS_24HOUR
+ | ((rtc->status & SIIRTCINFO_INTAE) << 3)
+ | ((rtc->status & SIIRTCINFO_INTME) << 2)
+ | ((rtc->status & SIIRTCINFO_INTFE) << 1);
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_STATUS | WR);
+
+ WriteData(statusData);
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc)
+{
+ u8 i;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_DATETIME | RD);
+
+ GPIO_PORT_DIRECTION = 5;
+
+ for (i = 0; i < DATETIME_BUF_LEN; i++)
+ DATETIME_BUF(rtc, i) = ReadData();
+
+ INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc)
+{
+ u8 i;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_DATETIME | WR);
+
+ for (i = 0; i < DATETIME_BUF_LEN; i++)
+ WriteData(DATETIME_BUF(rtc, i));
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc)
+{
+ u8 i;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_TIME | RD);
+
+ GPIO_PORT_DIRECTION = 5;
+
+ for (i = 0; i < TIME_BUF_LEN; i++)
+ TIME_BUF(rtc, i) = ReadData();
+
+ INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc)
+{
+ u8 i;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_TIME | WR);
+
+ for (i = 0; i < TIME_BUF_LEN; i++)
+ WriteData(TIME_BUF(rtc, i));
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc)
+{
+ u8 i;
+ u8 alarmData[2];
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ // Decode BCD.
+ alarmData[0] = (rtc->alarmHour & 0xF) + 10 * ((rtc->alarmHour >> 4) & 0xF);
+
+ // The AM/PM flag must be set correctly even in 24-hour mode.
+
+ if (alarmData[0] < 12)
+ alarmData[0] = rtc->alarmHour | ALARM_AM;
+ else
+ alarmData[0] = rtc->alarmHour | ALARM_PM;
+
+ alarmData[1] = rtc->alarmMinute;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIOPortDirection = 7; // Why is this the only instance that uses a symbol?
+
+ WriteCommand(CMD_ALARM | WR);
+
+ for (i = 0; i < 2; i++)
+ WriteData(alarmData[i]);
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+static int WriteCommand(u8 value)
+{
+ u8 i;
+ u8 temp;
+
+ for (i = 0; i < 8; i++)
+ {
+ temp = ((value >> (7 - i)) & 1);
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 5;
+ }
+
+ // control reaches end of non-void function
+}
+
+static int WriteData(u8 value)
+{
+ u8 i;
+ u8 temp;
+
+ for (i = 0; i < 8; i++)
+ {
+ temp = ((value >> i) & 1);
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 5;
+ }
+
+ // control reaches end of non-void function
+}
+
+static u8 ReadData()
+{
+ u8 i;
+ u8 temp;
+ u8 value;
+
+ for (i = 0; i < 8; i++)
+ {
+ GPIO_PORT_DATA = 4;
+ GPIO_PORT_DATA = 4;
+ GPIO_PORT_DATA = 4;
+ GPIO_PORT_DATA = 4;
+ GPIO_PORT_DATA = 4;
+ GPIO_PORT_DATA = 5;
+
+ temp = ((GPIO_PORT_DATA & 2) >> 1);
+ value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var
+ }
+
+ return value;
+}
+
+static void EnableGpioPortRead()
+{
+ GPIO_PORT_READ_ENABLE = 1;
+}
+
+static void DisableGpioPortRead()
+{
+ GPIO_PORT_READ_ENABLE = 0;
+}
diff --git a/berry_fix/payload/sym_bss.txt b/berry_fix/payload/sym_bss.txt
new file mode 100644
index 000000000..3b1c62ae9
--- /dev/null
+++ b/berry_fix/payload/sym_bss.txt
@@ -0,0 +1,5 @@
+ .include "src/main.o"
+ .include "src/rtc.o"
+ .include "src/flash.o"
+ .include "src/agb_flash.o"
+ .include "src/siirtc.o"
diff --git a/berry_fix/payload/sym_common.txt b/berry_fix/payload/sym_common.txt
new file mode 100644
index 000000000..28b47f52e
--- /dev/null
+++ b/berry_fix/payload/sym_common.txt
@@ -0,0 +1,29 @@
+ .include "main.o"
+ .include "rtc.o"
+
+ .align 4
+gFirstSaveSector: @ 0x03001220
+ .space 0x4
+
+gPrevSaveCounter: @ 0x03001224
+ .space 0x4
+
+gLastKnownGoodSector: @ 0x03001228
+ .space 0x4
+
+gDamagedSaveSectors: @ 0x0300122C
+ .space 0x4
+
+gSaveCounter: @ 0x03001230
+ .space 0x4
+
+gFastSaveSection: @ 0x03001234
+ .space 0x4
+
+gCurSaveChunk:
+ .space 0x4
+
+gFlashIdentIsValid: @ 0x0300123C
+ .space 0x4
+
+ .include "agb_flash.o"
diff --git a/berry_fix/payload/sym_ewram.txt b/berry_fix/payload/sym_ewram.txt
new file mode 100644
index 000000000..2c61f5e7e
--- /dev/null
+++ b/berry_fix/payload/sym_ewram.txt
@@ -0,0 +1,3 @@
+ .include "src/main.o"
+ .include "src/rtc.o"
+ .include "src/flash.o"
diff --git a/berry_fix/rom.sha1 b/berry_fix/rom.sha1
new file mode 100644
index 000000000..145b083b2
--- /dev/null
+++ b/berry_fix/rom.sha1
@@ -0,0 +1 @@
+2eb0a94a913bebfb4cb59ceb57f3f965da55ef6d berry_fix.gba
diff --git a/data/berry_fix.mb b/data/berry_fix.mb
deleted file mode 100644
index 0afff07f5..000000000
--- a/data/berry_fix.mb
+++ /dev/null
Binary files differ
diff --git a/data/event_scripts.s b/data/event_scripts.s
index c58ca1547..5e05b3c79 100644
--- a/data/event_scripts.s
+++ b/data/event_scripts.s
@@ -1,6 +1,7 @@
#include "constants/global.h"
#include "constants/battle_frontier.h"
#include "constants/battle_setup.h"
+#include "constants/contest.h"
#include "constants/easy_chat.h"
#include "constants/event_objects.h"
#include "constants/event_object_movement_constants.h"
@@ -19,6 +20,7 @@
#include "constants/vars.h"
#include "constants/weather.h"
#include "constants/trainer_hill.h"
+#include "constants/lilycove_lady.h"
#include "constants/battle.h"
#include "constants/metatile_labels.h"
.include "asm/macros.inc"
@@ -4329,23 +4331,23 @@ GraniteCave_B1F_Movement_2A8369: @ 82A8369
step_end
LilycoveCity_PokemonCenter_1F_EventScript_2A836B:: @ 82A836B
- special sub_818DAEC
+ special Script_GetLilycoveLadyId
switch VAR_RESULT
- case 0, LilycoveCity_PokemonCenter_1F_EventScript_2A8554
- case 1, LilycoveCity_PokemonCenter_1F_EventScript_2A8395
- case 2, LilycoveCity_PokemonCenter_1F_EventScript_2A882A
+ case LILYCOVE_LADY_QUIZ, LilycoveCity_PokemonCenter_1F_EventScript_2A8554
+ case LILYCOVE_LADY_FAVOR, LilycoveCity_PokemonCenter_1F_EventScript_2A8395
+ case LILYCOVE_LADY_CONTEST, LilycoveCity_PokemonCenter_1F_EventScript_2A882A
end
LilycoveCity_PokemonCenter_1F_EventScript_2A8395:: @ 82A8395
lock
faceplayer
msgbox LilycoveCity_PokemonCenter_1F_Text_2A8A69, MSGBOX_DEFAULT
- specialvar VAR_RESULT, sub_818DBE8
- compare VAR_RESULT, 0
+ specialvar VAR_RESULT, GetFavorLadyState
+ compare VAR_RESULT, LILYCOVE_LADY_STATE_READY
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A83D0
- compare VAR_RESULT, 1
+ compare VAR_RESULT, LILYCOVE_LADY_STATE_COMPLETED
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A83C6
- compare VAR_RESULT, 2
+ compare VAR_RESULT, LILYCOVE_LADY_STATE_PRIZE
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8510
end
@@ -4355,9 +4357,9 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A83C6:: @ 82A83C6
end
LilycoveCity_PokemonCenter_1F_EventScript_2A83D0:: @ 82A83D0
- special sub_818DC2C
+ special BufferFavorLadyRequest
msgbox LilycoveCity_PokemonCenter_1F_Text_2A8A7D, MSGBOX_DEFAULT
- specialvar VAR_RESULT, sub_818DC60
+ specialvar VAR_RESULT, HasAnotherPlayerGivenFavorLadyItem
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8435
compare VAR_RESULT, 1
@@ -4365,9 +4367,9 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A83D0:: @ 82A83D0
end
LilycoveCity_PokemonCenter_1F_EventScript_2A83F7:: @ 82A83F7
- special sub_818DCC8
- special sub_818DD14
- specialvar VAR_RESULT, sub_818DD54
+ special BufferFavorLadyItemName
+ special BufferFavorLadyPlayerName
+ specialvar VAR_RESULT, DidFavorLadyLikeItem
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8419
compare VAR_RESULT, 1
@@ -4405,7 +4407,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A845E:: @ 82A845E
LilycoveCity_PokemonCenter_1F_EventScript_2A846C:: @ 82A846C
fadescreen 1
setvar VAR_RESULT, 0
- special sub_818DD78
+ special Script_FavorLadyOpenBagMenu
waitstate
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A848E
@@ -4422,7 +4424,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A848E:: @ 82A848E
end
LilycoveCity_PokemonCenter_1F_EventScript_2A84AD:: @ 82A84AD
- specialvar VAR_RESULT, sub_818DE44
+ specialvar VAR_RESULT, Script_DoesFavorLadyLikeItem
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A84C9
compare VAR_RESULT, 1
@@ -4430,13 +4432,13 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A84AD:: @ 82A84AD
end
LilycoveCity_PokemonCenter_1F_EventScript_2A84C9:: @ 82A84C9
- special sub_818DC2C
+ special BufferFavorLadyRequest
msgbox LilycoveCity_PokemonCenter_1F_Text_2A8C0F, MSGBOX_DEFAULT
release
end
LilycoveCity_PokemonCenter_1F_EventScript_2A84D6:: @ 82A84D6
- specialvar VAR_RESULT, sub_818DE5C
+ specialvar VAR_RESULT, IsFavorLadyThresholdMet
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A84F2
compare VAR_RESULT, 1
@@ -4444,20 +4446,20 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A84D6:: @ 82A84D6
end
LilycoveCity_PokemonCenter_1F_EventScript_2A84F2:: @ 82A84F2
- special sub_818DC2C
+ special BufferFavorLadyRequest
msgbox LilycoveCity_PokemonCenter_1F_Text_2A8C6F, MSGBOX_DEFAULT
release
end
LilycoveCity_PokemonCenter_1F_EventScript_2A84FF:: @ 82A84FF
- special sub_818DC2C
+ special BufferFavorLadyRequest
msgbox LilycoveCity_PokemonCenter_1F_Text_2A8CC8, MSGBOX_DEFAULT
goto LilycoveCity_PokemonCenter_1F_EventScript_2A8510
end
LilycoveCity_PokemonCenter_1F_EventScript_2A8510:: @ 82A8510
setvar VAR_0x8004, 0
- specialvar VAR_0x8004, sub_818DEA0
+ specialvar VAR_0x8004, FavorLadyGetPrize
msgbox LilycoveCity_PokemonCenter_1F_Text_2A8D5D, MSGBOX_DEFAULT
giveitem_std VAR_0x8004
compare VAR_RESULT, 0
@@ -4472,7 +4474,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8545:: @ 82A8545
end
LilycoveCity_PokemonCenter_1F_EventScript_2A854F:: @ 82A854F
- special sub_818DEDC
+ special SetFavorLadyState_Complete
release
end
@@ -4480,27 +4482,27 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8554:: @ 82A8554
lock
faceplayer
msgbox LilycoveCity_PokemonCenter_1F_Text_2A8E2B, MSGBOX_DEFAULT
- specialvar VAR_RESULT, sub_818E038
- compare VAR_RESULT, 0
+ specialvar VAR_RESULT, GetQuizLadyState
+ compare VAR_RESULT, LILYCOVE_LADY_STATE_READY
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8585
- compare VAR_RESULT, 1
+ compare VAR_RESULT, LILYCOVE_LADY_STATE_COMPLETED
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A85AC
- compare VAR_RESULT, 2
+ compare VAR_RESULT, LILYCOVE_LADY_STATE_PRIZE
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A86EC
end
LilycoveCity_PokemonCenter_1F_EventScript_2A8585:: @ 82A8585
- specialvar VAR_RESULT, sub_818E06C
- compare VAR_RESULT, 0
+ specialvar VAR_RESULT, GetQuizAuthor
+ compare VAR_RESULT, QUIZ_AUTHOR_PLAYER
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A85C8
- compare VAR_RESULT, 1
+ compare VAR_RESULT, QUIZ_AUTHOR_OTHER_PLAYER
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A85D2
- compare VAR_RESULT, 2
+ compare VAR_RESULT, QUIZ_AUTHOR_LADY
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A85E0
end
LilycoveCity_PokemonCenter_1F_EventScript_2A85AC:: @ 82A85AC
- specialvar VAR_RESULT, sub_818E2D8
+ specialvar VAR_RESULT, IsQuizLadyWaitingForChallenger
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8759
compare VAR_RESULT, 1
@@ -4537,7 +4539,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8612:: @ 82A8612
end
LilycoveCity_PokemonCenter_1F_EventScript_2A861C:: @ 82A861C
- special sub_818E3BC
+ special ClearQuizLadyPlayerAnswer
compare VAR_0x8004, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A864C
compare VAR_0x8004, EASY_CHAT_TYPE_QUIZ_ANSWER
@@ -4551,13 +4553,13 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8635:: @ 82A8635
end
LilycoveCity_PokemonCenter_1F_EventScript_2A864C:: @ 82A864C
- special sub_811A858
+ special QuizLadyShowQuizQuestion
waitstate
goto LilycoveCity_PokemonCenter_1F_EventScript_2A8635
end
LilycoveCity_PokemonCenter_1F_EventScript_2A8656:: @ 82A8656
- special sub_818E2FC
+ special QuizLadyGetPlayerAnswer
waitstate
goto LilycoveCity_PokemonCenter_1F_EventScript_2A8635
end
@@ -4576,9 +4578,9 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A867F:: @ 82A867F
end
LilycoveCity_PokemonCenter_1F_EventScript_2A8689:: @ 82A8689
- special sub_818E37C
+ special SetQuizLadyState_Complete
msgbox LilycoveCity_PokemonCenter_1F_Text_2A8F4D, MSGBOX_DEFAULT
- specialvar VAR_RESULT, sub_818E308
+ specialvar VAR_RESULT, IsQuizAnswerCorrect
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A86C7
compare VAR_RESULT, 1
@@ -4594,8 +4596,8 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A86B0:: @ 82A86B0
end
LilycoveCity_PokemonCenter_1F_EventScript_2A86C7:: @ 82A86C7
- special sub_818E538
- special sub_818E274
+ special BufferQuizCorrectAnswer
+ special BufferQuizPrizeName
playse SE_HAZURE
delay 10
playse SE_HAZURE
@@ -4604,8 +4606,9 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A86C7:: @ 82A86C7
goto LilycoveCity_PokemonCenter_1F_EventScript_2A8759
end
+@ VAR_RESULT is essentially ignored, both jumps are identical
LilycoveCity_PokemonCenter_1F_EventScript_2A86EC:: @ 82A86EC
- specialvar VAR_RESULT, sub_818E298
+ specialvar VAR_RESULT, BufferQuizAuthorNameAndCheckIfLady
compare VAR_RESULT, 1
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8708
compare VAR_RESULT, 0
@@ -4624,8 +4627,8 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8716:: @ 82A8716
LilycoveCity_PokemonCenter_1F_EventScript_2A8724:: @ 82A8724
setvar VAR_0x8005, 0
- special sub_818E358
- special sub_818E37C
+ special BufferQuizPrizeItem
+ special SetQuizLadyState_Complete
giveitem_std VAR_0x8005
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A874C
@@ -4634,7 +4637,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8724:: @ 82A8724
LilycoveCity_PokemonCenter_1F_EventScript_2A874C:: @ 82A874C
msgbox LilycoveCity_PokemonCenter_1F_Text_2A906A, MSGBOX_DEFAULT
- special sub_818E39C
+ special SetQuizLadyState_GivePrize
release
end
@@ -4647,7 +4650,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8759:: @ 82A8759
end
LilycoveCity_PokemonCenter_1F_EventScript_2A8778:: @ 82A8778
- special sub_818E3EC
+ special QuizLadyPickNewQuestion
msgbox LilycoveCity_PokemonCenter_1F_Text_2A9131, MSGBOX_DEFAULT
release
end
@@ -4658,7 +4661,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8785:: @ 82A8785
LilycoveCity_PokemonCenter_1F_EventScript_2A878D:: @ 82A878D
fadescreen 1
setvar VAR_RESULT, 0
- special sub_818E3E0
+ special Script_QuizLadyOpenBagMenu
waitstate
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A87AF
@@ -4676,13 +4679,13 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A87AF:: @ 82A87AF
LilycoveCity_PokemonCenter_1F_EventScript_2A87CE:: @ 82A87CE
msgbox LilycoveCity_PokemonCenter_1F_Text_2A9270, MSGBOX_DEFAULT
- special sub_818E430
- special sub_818E3BC
- setvar VAR_0x8004, 16
+ special ClearQuizLadyQuestionAndAnswer
+ special ClearQuizLadyPlayerAnswer
+ setvar VAR_0x8004, EASY_CHAT_TYPE_QUIZ_QUESTION
LilycoveCity_PokemonCenter_1F_EventScript_2A87E1:: @ 82A87E1
fadescreen 1
- special sub_818E47C
+ special QuizLadySetCustomQuestion
waitstate
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A87F8
@@ -4698,9 +4701,9 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A87F8:: @ 82A87F8
end
LilycoveCity_PokemonCenter_1F_EventScript_2A8817:: @ 82A8817
- special sub_818E490
- special sub_818E4A4
- special sub_818E510
+ special QuizLadyTakePrizeForCustomQuiz
+ special QuizLadyRecordCustomQuizData
+ special QuizLadySetWaitingForChallenger
msgbox LilycoveCity_PokemonCenter_1F_Text_2A9336, MSGBOX_DEFAULT
release
end
@@ -4709,15 +4712,16 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A882A:: @ 82A882A
lock
faceplayer
msgbox LilycoveCity_PokemonCenter_1F_Text_2A93A7, MSGBOX_DEFAULT
- specialvar VAR_RESULT, sub_818E8B4
+ specialvar VAR_RESULT, HasPlayerGivenContestLadyPokeblock
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8850
compare VAR_RESULT, 1
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A886C
end
+@ Redundant with above script, VAR_RESULT will always be 0 here
LilycoveCity_PokemonCenter_1F_EventScript_2A8850:: @ 82A8850
- specialvar VAR_RESULT, sub_818E8E0
+ specialvar VAR_RESULT, ShouldContestLadyShowGoOnAir
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8876
compare VAR_RESULT, 1
@@ -4730,7 +4734,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A886C:: @ 82A886C
end
LilycoveCity_PokemonCenter_1F_EventScript_2A8876:: @ 82A8876
- special sub_818E914
+ special Script_BufferContestLadyCategoryAndMonName
msgbox LilycoveCity_PokemonCenter_1F_Text_2A93F4, MSGBOX_DEFAULT
checkitem ITEM_POKEBLOCK_CASE, 1
compare VAR_RESULT, 0
@@ -4749,7 +4753,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A88B0:: @ 82A88B0
LilycoveCity_PokemonCenter_1F_EventScript_2A88BA:: @ 82A88BA
fadescreen 1
- special sub_818E92C
+ special OpenPokeblockCaseForContestLady
waitstate
compare VAR_RESULT, 65535
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A88D7
@@ -4767,11 +4771,12 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A88D7:: @ 82A88D7
LilycoveCity_PokemonCenter_1F_EventScript_2A88F6:: @ 82A88F6
msgbox LilycoveCity_PokemonCenter_1F_Text_2A9571, MSGBOX_DEFAULT
- special sub_818E940
- special sub_818E960
+ special SetContestLadyGivenPokeblock
+ special GetContestLadyMonSpecies
goto LilycoveCity_PokemonCenter_1F_EventScript_2A890A
end
+@ VAR_0x8004 here is the return value from GivePokeblockToContestLady
LilycoveCity_PokemonCenter_1F_EventScript_2A890A:: @ 82A890A
applymovement 4, LilycoveCity_PokemonCenter_1F_Movement_2A89B8
waitmovement 0
@@ -4793,6 +4798,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A893F:: @ 82A893F
waitmovement 0
delay 60
+@ VAR_0x8004 here is the return value from GivePokeblockToContestLady
LilycoveCity_PokemonCenter_1F_EventScript_2A894C:: @ 82A894C
applymovement 4, LilycoveCity_PokemonCenter_1F_Movement_2A89C0
waitmovement 0
@@ -4809,13 +4815,13 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8970:: @ 82A8970
end
LilycoveCity_PokemonCenter_1F_EventScript_2A897E:: @ 82A897E
- special sub_818E914
+ special Script_BufferContestLadyCategoryAndMonName
msgbox LilycoveCity_PokemonCenter_1F_Text_2A9605, MSGBOX_DEFAULT
goto LilycoveCity_PokemonCenter_1F_EventScript_2A898F
end
LilycoveCity_PokemonCenter_1F_EventScript_2A898F:: @ 82A898F
- specialvar VAR_RESULT, sub_818E8E0
+ specialvar VAR_RESULT, ShouldContestLadyShowGoOnAir
compare VAR_RESULT, 1
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A89A1
release
@@ -4858,18 +4864,18 @@ LilycoveCity_PokemonCenter_1F_Movement_2A89C2: @ 82A89C2
step_end
LilycoveCity_PokemonCenter_1F_EventScript_2A89C7:: @ 82A89C7
- specialvar VAR_RESULT, sub_818E990
- special sub_818E914
- special sub_818E960
- compare VAR_RESULT, 0
+ specialvar VAR_RESULT, GetContestLadyCategory
+ special Script_BufferContestLadyCategoryAndMonName
+ special GetContestLadyMonSpecies
+ compare VAR_RESULT, CONTEST_CATEGORY_COOL
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A0A
- compare VAR_RESULT, 1
+ compare VAR_RESULT, CONTEST_CATEGORY_BEAUTY
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A1D
- compare VAR_RESULT, 2
+ compare VAR_RESULT, CONTEST_CATEGORY_CUTE
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A30
- compare VAR_RESULT, 3
+ compare VAR_RESULT, CONTEST_CATEGORY_SMART
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A43
- compare VAR_RESULT, 4
+ compare VAR_RESULT, CONTEST_CATEGORY_TOUGH
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A56
end
diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc
index 96e9f86f5..59a010691 100644
--- a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc
+++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc
@@ -595,76 +595,76 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_24C52F:: @ 824C52F
return
BattleFrontier_BattleDomeBattleRoom_EventScript_24C530:: @ 824C530
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, 1
- createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, 1
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, 1
- createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, 1
- createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 0, 3, 1
- createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, 1
- createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, 1
- createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, 1
- createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, 1
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, DIR_SOUTH
return
BattleFrontier_BattleDomeBattleRoom_EventScript_24C594:: @ 824C594
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, 1
- createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, 1
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_2, 7, 9, 0, 3, 1
- createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, 1
- createvobject EVENT_OBJ_GFX_LASS, 10, 12, 0, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, 1
- createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 0, 3, 1
- createvobject EVENT_OBJ_GFX_GENTLEMAN, 15, 2, 1, 3, 1
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 16, 3, 1, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_2, 17, 4, 1, 3, 1
- createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, 1
- createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 9, 1, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 23, 13, 1, 3, 1
- createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, 1
- createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, 1
- createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 5, 2, 3, 1
- createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, 1
- createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 6, 2, 3, 1
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_2, 7, 9, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_LASS, 10, 12, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_GENTLEMAN, 15, 2, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 16, 3, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_2, 17, 4, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 9, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 23, 13, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 5, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 6, 2, 3, DIR_SOUTH
createvobject EVENT_OBJ_GFX_WOMAN_5, 31, 8, 2, 3, 1
return
BattleFrontier_BattleDomeBattleRoom_EventScript_24C652:: @ 824C652
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 0, 2, 0, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, 1
- createvobject EVENT_OBJ_GFX_BEAUTY, 2, 15, 0, 3, 1
- createvobject EVENT_OBJ_GFX_MAN_5, 3, 5, 0, 3, 1
- createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 5, 7, 0, 3, 1
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_2, 7, 9, 0, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_3, 8, 10, 0, 3, 1
- createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, 1
- createvobject EVENT_OBJ_GFX_LASS, 10, 12, 0, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, 1
- createvobject EVENT_OBJ_GFX_BEAUTY, 12, 14, 0, 3, 1
- createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 2, 3, 1
- createvobject EVENT_OBJ_GFX_HIKER, 14, 12, 2, 3, 1
- createvobject EVENT_OBJ_GFX_GENTLEMAN, 15, 2, 1, 3, 1
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 16, 3, 1, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_2, 17, 4, 1, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_3, 18, 6, 1, 3, 1
- createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, 1
- createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 9, 1, 3, 1
- createvobject EVENT_OBJ_GFX_MAN_2, 21, 10, 1, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 23, 13, 1, 3, 1
- createvobject EVENT_OBJ_GFX_GENTLEMAN, 24, 14, 1, 3, 1
- createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, 1
- createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, 1
- createvobject EVENT_OBJ_GFX_FAT_MAN, 27, 3, 2, 3, 1
- createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 5, 2, 3, 1
- createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, 1
- createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 6, 2, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_5, 31, 8, 2, 3, 1
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 0, 2, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_BEAUTY, 2, 15, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_MAN_5, 3, 5, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 5, 7, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_2, 7, 9, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_3, 8, 10, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_LASS, 10, 12, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_BEAUTY, 12, 14, 0, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_HIKER, 14, 12, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_GENTLEMAN, 15, 2, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 16, 3, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_2, 17, 4, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_3, 18, 6, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 9, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_MAN_2, 21, 10, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 23, 13, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_GENTLEMAN, 24, 14, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_FAT_MAN, 27, 3, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 5, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 6, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_5, 31, 8, 2, 3, DIR_SOUTH
return
BattleFrontier_BattleArenaBattleRoom_Movement_24C773: @ 824C773
diff --git a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc
index 0bc74b1bd..f09166f5a 100644
--- a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc
+++ b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc
@@ -63,7 +63,7 @@ BattleFrontier_BattleTowerMultiBattleRoom_EventScript_243E41:: @ 8243E41
waitmovement 0
applymovement 1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_243E77
waitmovement 0
- moveobjectoffscreen 1
+ copyobjectxytoperm 1
applymovement EVENT_OBJ_ID_PLAYER, Common_Movement_WalkInPlaceUp
waitmovement 0
msgbox BattleFrontier_BattleTowerMultiBattleRoom_Text_244056, MSGBOX_DEFAULT
diff --git a/data/maps/DewfordTown/scripts.inc b/data/maps/DewfordTown/scripts.inc
index 0f764b9c8..f5830ed45 100644
--- a/data/maps/DewfordTown/scripts.inc
+++ b/data/maps/DewfordTown/scripts.inc
@@ -180,7 +180,7 @@ DewfordTown_EventScript_1E96E7:: @ 81E96E7
copyvar VAR_BRINEY_LOCATION, VAR_0x8008
resetobjectpriority EVENT_OBJ_ID_PLAYER, MAP_DEWFORD_TOWN
resetobjectpriority 2, MAP_ROUTE109
- moveobjectoffscreen 2
+ copyobjectxytoperm 2
release
end
diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc
index c59e7458b..25899420f 100644
--- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc
+++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc
@@ -67,8 +67,8 @@ EverGrandeCity_PokemonLeague_1F_EventScript_229636:: @ 8229636
waitmessage
waitfanfare
closemessage
- moveobjectoffscreen 3
- moveobjectoffscreen 4
+ copyobjectxytoperm 3
+ copyobjectxytoperm 4
setflag FLAG_ENTERED_ELITE_FOUR
releaseall
end
diff --git a/data/maps/FarawayIsland_Interior/scripts.inc b/data/maps/FarawayIsland_Interior/scripts.inc
index a0c6b07b6..f8394f161 100644
--- a/data/maps/FarawayIsland_Interior/scripts.inc
+++ b/data/maps/FarawayIsland_Interior/scripts.inc
@@ -62,7 +62,7 @@ FarawayIsland_Interior_EventScript_267DA2:: @ 8267DA2
waitmovement 0
applymovement 1, FarawayIsland_Interior_Movement_267DCE
waitmovement 0
- moveobjectoffscreen 1
+ copyobjectxytoperm 1
setvar VAR_TEMP_1, 1
releaseall
end
diff --git a/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc b/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc
index 96b8e3fdd..54578616b 100644
--- a/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc
+++ b/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc
@@ -144,7 +144,6 @@ LilycoveCity_DepartmentStoreRooftop_EventScript_22032F:: @ 822032F
compare VAR_TEMP_1, 2
call_if_eq LilycoveCity_DepartmentStoreRooftop_EventScript_220328
updatemoneybox 0, 0
- nop
bufferitemname 0, VAR_TEMP_0
playse SE_JIHANKI
msgbox LilycoveCity_DepartmentStoreRooftop_Text_2205A1, MSGBOX_DEFAULT
diff --git a/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc b/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc
index 134e17818..615153530 100644
--- a/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc
+++ b/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc
@@ -9,7 +9,7 @@ LilycoveCity_PokemonCenter_1F_OnTransition: @ 821C5BD
end
LilycoveCity_PokemonCenter_1F_EventScript_21C5C6:: @ 821C5C6
- special sub_818D9C0
+ special SetLilycoveLadyGfx
compare VAR_RESULT, 0
goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_21C5E0
compare VAR_RESULT, 1
diff --git a/data/maps/LinkContestRoom1/scripts.inc b/data/maps/LinkContestRoom1/scripts.inc
index e0cd24eff..9fb83a7a9 100644
--- a/data/maps/LinkContestRoom1/scripts.inc
+++ b/data/maps/LinkContestRoom1/scripts.inc
@@ -172,131 +172,131 @@ LinkContestRoom1_EventScript_23B8F8:: @ 823B8F8
end
LinkContestRoom1_EventScript_23BA6B:: @ 823BA6B
- setvar VAR_TEMP_1, 5
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_NINJA_BOY
return
LinkContestRoom1_EventScript_23BA71:: @ 823BA71
- setvar VAR_TEMP_1, 6
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_TWIN
return
LinkContestRoom1_EventScript_23BA77:: @ 823BA77
- setvar VAR_TEMP_1, 7
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_BOY_1
return
LinkContestRoom1_EventScript_23BA7D:: @ 823BA7D
- setvar VAR_TEMP_1, 8
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_GIRL_1
return
LinkContestRoom1_EventScript_23BA83:: @ 823BA83
- setvar VAR_TEMP_1, 10
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_GIRL_2
return
LinkContestRoom1_EventScript_23BA89:: @ 823BA89
- setvar VAR_TEMP_1, 11
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_LITTLE_BOY
return
LinkContestRoom1_EventScript_23BA8F:: @ 823BA8F
- setvar VAR_TEMP_1, 12
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_LITTLE_GIRL
return
LinkContestRoom1_EventScript_23BA95:: @ 823BA95
- setvar VAR_TEMP_1, 13
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_BOY_3
return
LinkContestRoom1_EventScript_23BA9B:: @ 823BA9B
- setvar VAR_TEMP_1, 14
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_GIRL_3
return
LinkContestRoom1_EventScript_23BAA1:: @ 823BAA1
- setvar VAR_TEMP_1, 15
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_RICH_BOY
return
LinkContestRoom1_EventScript_23BAA7:: @ 823BAA7
- setvar VAR_TEMP_1, 17
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_FAT_MAN
return
LinkContestRoom1_EventScript_23BAAD:: @ 823BAAD
- setvar VAR_TEMP_1, 18
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_POKEFAN_F
return
LinkContestRoom1_EventScript_23BAB3:: @ 823BAB3
- setvar VAR_TEMP_1, 19
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_MAN_1
return
LinkContestRoom1_EventScript_23BAB9:: @ 823BAB9
- setvar VAR_TEMP_1, 20
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_WOMAN_2
return
LinkContestRoom1_EventScript_23BABF:: @ 823BABF
- setvar VAR_TEMP_1, 21
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_EXPERT_M
return
LinkContestRoom1_EventScript_23BAC5:: @ 823BAC5
- setvar VAR_TEMP_1, 22
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_EXPERT_F
return
LinkContestRoom1_EventScript_23BACB:: @ 823BACB
- setvar VAR_TEMP_1, 25
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_POKEFAN_M
return
LinkContestRoom1_EventScript_23BAD1:: @ 823BAD1
- setvar VAR_TEMP_1, 26
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_WOMAN_4
return
LinkContestRoom1_EventScript_23BAD7:: @ 823BAD7
- setvar VAR_TEMP_1, 27
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_COOK
return
LinkContestRoom1_EventScript_23BADD:: @ 823BADD
- setvar VAR_TEMP_1, 47
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_LASS
return
LinkContestRoom1_EventScript_23BAE3:: @ 823BAE3
- setvar VAR_TEMP_1, 30
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_OLD_WOMAN
return
LinkContestRoom1_EventScript_23BAE9:: @ 823BAE9
- setvar VAR_TEMP_1, 31
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_CAMPER
return
LinkContestRoom1_EventScript_23BAEF:: @ 823BAEF
- setvar VAR_TEMP_1, 32
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_PICNICKER
return
LinkContestRoom1_EventScript_23BAF5:: @ 823BAF5
- setvar VAR_TEMP_1, 33
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_MAN_3
return
LinkContestRoom1_EventScript_23BAFB:: @ 823BAFB
- setvar VAR_TEMP_1, 34
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_WOMAN_5
return
LinkContestRoom1_EventScript_23BB01:: @ 823BB01
- setvar VAR_TEMP_1, 35
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_YOUNGSTER
return
LinkContestRoom1_EventScript_23BB07:: @ 823BB07
- setvar VAR_TEMP_1, 36
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_BUG_CATCHER
return
LinkContestRoom1_EventScript_23BB0D:: @ 823BB0D
- setvar VAR_TEMP_1, 37
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_PSYCHIC_M
return
LinkContestRoom1_EventScript_23BB13:: @ 823BB13
- setvar VAR_TEMP_1, 38
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_SCHOOL_KID_M
return
LinkContestRoom1_EventScript_23BB19:: @ 823BB19
- setvar VAR_TEMP_1, 44
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_BLACK_BELT
return
LinkContestRoom1_EventScript_23BB1F:: @ 823BB1F
- setvar VAR_TEMP_1, 45
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_BEAUTY
return
LinkContestRoom1_EventScript_23BB25:: @ 823BB25
- setvar VAR_TEMP_1, 46
+ setvar VAR_TEMP_1, EVENT_OBJ_GFX_SCIENTIST_1
return
LinkContestRoom1_EventScript_23BB2B:: @ 823BB2B
@@ -312,97 +312,97 @@ LinkContestRoom1_EventScript_23BB2B:: @ 823BB2B
return
LinkContestRoom1_EventScript_23BB78:: @ 823BB78
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 20, 3, 2, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, 1
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 20, 3, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, DIR_SOUTH
return
LinkContestRoom1_EventScript_23BB8B:: @ 823BB8B
- createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, 4
- createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, 4
- createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, 4
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 3, 2, 8, 3, 4
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, 3
- createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, 3
- createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, 3
- createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 13, 12, 8, 3, 3
- createvobject EVENT_OBJ_GFX_LASS, 20, 3, 2, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, 1
+ createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 3, 2, 8, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 13, 12, 8, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_LASS, 20, 3, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, DIR_SOUTH
return
LinkContestRoom1_EventScript_23BBE6:: @ 823BBE6
- createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, 4
- createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, 4
- createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, 4
- createvobject EVENT_OBJ_GFX_GENTLEMAN, 3, 2, 8, 3, 4
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, 3
- createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, 3
- createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, 3
- createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, 3
- createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 3, 2, 3, 1
- createvobject EVENT_OBJ_GFX_MAN_2, 20, 6, 2, 3, 1
- createvobject EVENT_OBJ_GFX_WOMAN_5, 20, 7, 2, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 8, 2, 3, 1
- createvobject EVENT_OBJ_GFX_GENTLEMAN, 24, 11, 2, 3, 1
- createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 3, 9, 3, 2
- createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 4, 9, 3, 2
- createvobject EVENT_OBJ_GFX_FAT_MAN, 27, 5, 9, 3, 2
- createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 9, 9, 3, 2
- createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 10, 9, 3, 2
- createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 11, 9, 3, 2
+ createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_GENTLEMAN, 3, 2, 8, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 3, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_MAN_2, 20, 6, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_WOMAN_5, 20, 7, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 8, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_GENTLEMAN, 24, 11, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 3, 9, 3, DIR_NORTH
+ createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 4, 9, 3, DIR_NORTH
+ createvobject EVENT_OBJ_GFX_FAT_MAN, 27, 5, 9, 3, DIR_NORTH
+ createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 9, 9, 3, DIR_NORTH
+ createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 10, 9, 3, DIR_NORTH
+ createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 11, 9, 3, DIR_NORTH
return
LinkContestRoom1_EventScript_23BC92:: @ 823BC92
- createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, 4
- createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, 4
- createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, 4
- createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 3, 2, 8, 3, 4
- createvobject EVENT_OBJ_GFX_MANIAC, 4, 1, 3, 3, 4
- createvobject EVENT_OBJ_GFX_WOMAN_5, 6, 1, 5, 3, 4
- createvobject EVENT_OBJ_GFX_WOMAN_4, 7, 1, 6, 3, 4
- createvobject EVENT_OBJ_GFX_GENTLEMAN, 9, 1, 8, 3, 4
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, 3
- createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, 3
- createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, 3
- createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, 3
- createvobject EVENT_OBJ_GFX_FISHERMAN, 14, 13, 3, 3, 3
- createvobject EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F, 15, 13, 4, 3, 3
- createvobject EVENT_OBJ_GFX_MAN_4, 17, 13, 6, 3, 3
- createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 18, 13, 7, 3, 3
- createvobject EVENT_OBJ_GFX_DEVON_EMPLOYEE, 19, 13, 8, 3, 3
- createvobject EVENT_OBJ_GFX_POKEFAN_M, 20, 3, 2, 3, 1
- createvobject EVENT_OBJ_GFX_CAMPER, 21, 6, 2, 3, 1
- createvobject EVENT_OBJ_GFX_MAN_3, 22, 7, 2, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, 1
- createvobject EVENT_OBJ_GFX_SAILOR, 25, 3, 9, 3, 2
- createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 4, 9, 3, 2
- createvobject EVENT_OBJ_GFX_GENTLEMAN, 27, 5, 9, 3, 2
- createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 9, 9, 3, 2
- createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 10, 9, 3, 2
- createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 11, 9, 3, 2
+ createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 3, 2, 8, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_MANIAC, 4, 1, 3, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_WOMAN_5, 6, 1, 5, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_WOMAN_4, 7, 1, 6, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_GENTLEMAN, 9, 1, 8, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_FISHERMAN, 14, 13, 3, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F, 15, 13, 4, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_MAN_4, 17, 13, 6, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 18, 13, 7, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_DEVON_EMPLOYEE, 19, 13, 8, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_POKEFAN_M, 20, 3, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_CAMPER, 21, 6, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_MAN_3, 22, 7, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SAILOR, 25, 3, 9, 3, DIR_NORTH
+ createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 4, 9, 3, DIR_NORTH
+ createvobject EVENT_OBJ_GFX_GENTLEMAN, 27, 5, 9, 3, DIR_NORTH
+ createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 9, 9, 3, DIR_NORTH
+ createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 10, 9, 3, DIR_NORTH
+ createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 11, 9, 3, DIR_NORTH
return
LinkContestRoom1_EventScript_23BD86:: @ 823BD86
- createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, 4
- createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, 4
- createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, 4
- createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 3, 2, 8, 3, 4
- createvobject EVENT_OBJ_GFX_MANIAC, 4, 1, 3, 3, 4
- createvobject EVENT_OBJ_GFX_WOMAN_5, 6, 1, 5, 3, 4
- createvobject EVENT_OBJ_GFX_WOMAN_4, 7, 1, 6, 3, 4
- createvobject EVENT_OBJ_GFX_GENTLEMAN, 9, 1, 8, 3, 4
- createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, 3
- createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, 3
- createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, 3
- createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, 3
- createvobject EVENT_OBJ_GFX_FISHERMAN, 14, 13, 3, 3, 3
- createvobject EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F, 15, 13, 4, 3, 3
- createvobject EVENT_OBJ_GFX_MAN_4, 17, 13, 6, 3, 3
- createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 18, 13, 7, 3, 3
- createvobject EVENT_OBJ_GFX_DEVON_EMPLOYEE, 19, 13, 8, 3, 3
- createvobject EVENT_OBJ_GFX_POKEFAN_M, 20, 3, 2, 3, 1
- createvobject EVENT_OBJ_GFX_CAMPER, 21, 6, 2, 3, 1
- createvobject EVENT_OBJ_GFX_MAN_3, 22, 7, 2, 3, 1
- createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, 1
+ createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 3, 2, 8, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_MANIAC, 4, 1, 3, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_WOMAN_5, 6, 1, 5, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_WOMAN_4, 7, 1, 6, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_GENTLEMAN, 9, 1, 8, 3, DIR_EAST
+ createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_FISHERMAN, 14, 13, 3, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F, 15, 13, 4, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_MAN_4, 17, 13, 6, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 18, 13, 7, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_DEVON_EMPLOYEE, 19, 13, 8, 3, DIR_WEST
+ createvobject EVENT_OBJ_GFX_POKEFAN_M, 20, 3, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_CAMPER, 21, 6, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_MAN_3, 22, 7, 2, 3, DIR_SOUTH
+ createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, DIR_SOUTH
return
LinkContestRoom1_EventScript_23BE44:: @ 823BE44
diff --git a/data/maps/MauvilleCity_GameCorner/scripts.inc b/data/maps/MauvilleCity_GameCorner/scripts.inc
index 88b1ded16..0df7afe54 100644
--- a/data/maps/MauvilleCity_GameCorner/scripts.inc
+++ b/data/maps/MauvilleCity_GameCorner/scripts.inc
@@ -40,7 +40,6 @@ MauvilleCity_GameCorner_EventScript_20FC33:: @ 820FC33
givecoins 50
takemoney 0x3e8, 0
updatemoneybox 0, 0
- nop
updatecoinsbox 1, 6
playse SE_REGI
msgbox MauvilleCity_GameCorner_Text_210529, MSGBOX_DEFAULT
@@ -61,7 +60,6 @@ MauvilleCity_GameCorner_EventScript_20FC75:: @ 820FC75
givecoins 500
takemoney 0x2710, 0
updatemoneybox 0, 0
- nop
updatecoinsbox 1, 6
playse SE_REGI
msgbox MauvilleCity_GameCorner_Text_210529, MSGBOX_DEFAULT
diff --git a/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc b/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc
index b129e137e..144113d72 100644
--- a/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc
+++ b/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc
@@ -236,7 +236,7 @@ MossdeepCity_SpaceCenter_1F_EventScript_22321F:: @ 822321F
msgbox MossdeepCity_SpaceCenter_1F_Text_223B90, MSGBOX_DEFAULT
trainerbattle_no_intro TRAINER_GRUNT_23, MossdeepCity_SpaceCenter_1F_Text_223BC2
setflag FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F
- moveobjectoffscreen 9
+ copyobjectxytoperm 9
switch VAR_FACING
case 3, MossdeepCity_SpaceCenter_1F_EventScript_223278
case 3, MossdeepCity_SpaceCenter_1F_EventScript_223289
diff --git a/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc b/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc
index 11abafa0c..8dcc74116 100644
--- a/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc
+++ b/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc
@@ -70,9 +70,9 @@ MossdeepCity_SpaceCenter_2F_EventScript_223E09:: @ 8223E09
applymovement 7, MossdeepCity_SpaceCenter_2F_Movement_223E89
waitmovement 0
setvar VAR_MOSSDEEP_SPACE_CENTER_STATE_2, 2
- moveobjectoffscreen 5
- moveobjectoffscreen 7
- moveobjectoffscreen 6
+ copyobjectxytoperm 5
+ copyobjectxytoperm 7
+ copyobjectxytoperm 6
releaseall
end
diff --git a/data/maps/MtChimney/scripts.inc b/data/maps/MtChimney/scripts.inc
index d770f095c..717973eba 100644
--- a/data/maps/MtChimney/scripts.inc
+++ b/data/maps/MtChimney/scripts.inc
@@ -131,7 +131,6 @@ MtChimney_EventScript_22EF51:: @ 822EF51
MtChimney_EventScript_22EF5E:: @ 822EF5E
takemoney 0xc8, 0
updatemoneybox 0, 0
- nop
return
MtChimney_EventScript_22EF69:: @ 822EF69
diff --git a/data/maps/Route104/scripts.inc b/data/maps/Route104/scripts.inc
index a308368c1..2a7965331 100644
--- a/data/maps/Route104/scripts.inc
+++ b/data/maps/Route104/scripts.inc
@@ -114,7 +114,7 @@ Route104_EventScript_1ECD4B:: @ 81ECD4B
waitmovement 0
applymovement 34, Route104_Movement_1ECDCA
waitmovement 0
- moveobjectoffscreen 34
+ copyobjectxytoperm 34
msgbox Route104_Text_1EDCED, MSGBOX_YESNO
compare VAR_RESULT, 1
goto_if_eq Route104_EventScript_1ECDED
@@ -203,7 +203,7 @@ Route104_EventScript_1ECE6F:: @ 81ECE6F
waitmovement 0
applymovement 34, Route104_Movement_1ECDCA
waitmovement 0
- moveobjectoffscreen 34
+ copyobjectxytoperm 34
msgbox Route104_Text_1EE009, MSGBOX_YESNO
compare VAR_RESULT, 1
goto_if_eq Route104_EventScript_1ECF09
@@ -416,7 +416,7 @@ Route104_EventScript_1ED139:: @ 81ED139
copyvar VAR_BRINEY_LOCATION, VAR_0x8008
resetobjectpriority EVENT_OBJ_ID_PLAYER, MAP_ROUTE104
resetobjectpriority 2, MAP_DEWFORD_TOWN
- moveobjectoffscreen 2
+ copyobjectxytoperm 2
setvar VAR_BOARD_BRINEY_BOAT_STATE, 0
goto_if_unset FLAG_DELIVERED_STEVEN_LETTER, Route104_EventScript_1ED1B4
goto_if_set FLAG_DELIVERED_STEVEN_LETTER, Route104_EventScript_1ED1BE
diff --git a/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc b/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc
index 39b21b3c5..0b8d2217f 100644
--- a/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc
+++ b/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc
@@ -88,7 +88,7 @@ Route104_PrettyPetalFlowerShop_EventScript_22A442:: @ 822A442
goto_if_set FLAG_DAILY_FLOWER_SHOP_RECEIVED_BERRY, Route104_PrettyPetalFlowerShop_EventScript_22A482
msgbox Route104_PrettyPetalFlowerShop_Text_2A7A98, MSGBOX_DEFAULT
random 8
- addvar VAR_RESULT, 133
+ addvar VAR_RESULT, FIRST_BERRY_INDEX
giveitem_std VAR_RESULT
compare VAR_RESULT, 0
goto_if_eq Common_EventScript_ShowBagIsFull
diff --git a/data/maps/Route109/scripts.inc b/data/maps/Route109/scripts.inc
index 5c0cf2c6c..c91d0f0ab 100644
--- a/data/maps/Route109/scripts.inc
+++ b/data/maps/Route109/scripts.inc
@@ -58,7 +58,7 @@ Route109_EventScript_1EE7D5:: @ 81EE7D5
copyvar VAR_BRINEY_LOCATION, VAR_0x8008
resetobjectpriority EVENT_OBJ_ID_PLAYER, MAP_ROUTE109
resetobjectpriority 2, MAP_DEWFORD_TOWN
- moveobjectoffscreen 2
+ copyobjectxytoperm 2
release
end
diff --git a/data/maps/Route109_SeashoreHouse/scripts.inc b/data/maps/Route109_SeashoreHouse/scripts.inc
index e52ab08f9..79d021334 100644
--- a/data/maps/Route109_SeashoreHouse/scripts.inc
+++ b/data/maps/Route109_SeashoreHouse/scripts.inc
@@ -58,7 +58,6 @@ Route109_SeashoreHouse_EventScript_269484:: @ 8269484
msgbox Route109_SeashoreHouse_Text_2697C8, MSGBOX_DEFAULT
takemoney 0x12c, 0
updatemoneybox 0, 0
- nop
giveitem_std ITEM_SODA_POP
hidemoneybox
nop
diff --git a/data/maps/Route119_WeatherInstitute_2F/scripts.inc b/data/maps/Route119_WeatherInstitute_2F/scripts.inc
index 00262fe39..c4d92c172 100644
--- a/data/maps/Route119_WeatherInstitute_2F/scripts.inc
+++ b/data/maps/Route119_WeatherInstitute_2F/scripts.inc
@@ -77,7 +77,7 @@ Route119_WeatherInstitute_2F_EventScript_26FFC8:: @ 826FFC8
fadescreen 0
applymovement 5, Route119_WeatherInstitute_2F_Movement_270187
waitmovement 0
- moveobjectoffscreen 5
+ copyobjectxytoperm 5
goto Route119_WeatherInstitute_2F_EventScript_27004D
end
diff --git a/data/maps/Route121_SafariZoneEntrance/scripts.inc b/data/maps/Route121_SafariZoneEntrance/scripts.inc
index 69f5ea80d..85b6c6c36 100644
--- a/data/maps/Route121_SafariZoneEntrance/scripts.inc
+++ b/data/maps/Route121_SafariZoneEntrance/scripts.inc
@@ -68,7 +68,6 @@ Route121_SafariZoneEntrance_EventScript_22BC48:: @ 822BC48
msgbox Route121_SafariZoneEntrance_Text_2A501B, MSGBOX_DEFAULT
takemoney 0x1f4, 0
updatemoneybox 0, 0
- nop
msgbox Route121_SafariZoneEntrance_Text_2A5036, MSGBOX_DEFAULT
playfanfare MUS_FANFA4
message Route121_SafariZoneEntrance_Text_2A5052
diff --git a/data/maps/RustboroCity/scripts.inc b/data/maps/RustboroCity/scripts.inc
index cd5f4c84d..22177c783 100644
--- a/data/maps/RustboroCity/scripts.inc
+++ b/data/maps/RustboroCity/scripts.inc
@@ -494,7 +494,7 @@ RustboroCity_EventScript_1E0B2E:: @ 81E0B2E
call_if_eq RustboroCity_EventScript_1E0BF3
setflag FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN
setvar VAR_RUSTBORO_CITY_STATE, 3
- moveobjectoffscreen 9
+ copyobjectxytoperm 9
msgbox RustboroCity_Text_1E183E, MSGBOX_DEFAULT
releaseall
end
diff --git a/data/maps/RusturfTunnel/scripts.inc b/data/maps/RusturfTunnel/scripts.inc
index 8d2a4be80..8cb20e372 100644
--- a/data/maps/RusturfTunnel/scripts.inc
+++ b/data/maps/RusturfTunnel/scripts.inc
@@ -285,8 +285,8 @@ RusturfTunnel_EventScript_22D083:: @ 822D083
applymovement 6, RusturfTunnel_Movement_22D0AB
applymovement 7, RusturfTunnel_Movement_22D0AB
waitmovement 0
- moveobjectoffscreen 6
- moveobjectoffscreen 7
+ copyobjectxytoperm 6
+ copyobjectxytoperm 7
setvar VAR_RUSTURF_TUNNEL_STATE, 3
releaseall
end
diff --git a/data/maps/SeafloorCavern_Entrance/scripts.inc b/data/maps/SeafloorCavern_Entrance/scripts.inc
index 1bf570549..bc4f04b7f 100644
--- a/data/maps/SeafloorCavern_Entrance/scripts.inc
+++ b/data/maps/SeafloorCavern_Entrance/scripts.inc
@@ -26,7 +26,7 @@ SeafloorCavern_Entrance_EventScript_234485:: @ 8234485
call_if_eq SeafloorCavern_Entrance_EventScript_234539
delay 30
setvar VAR_HAS_TALKED_TO_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, 1
- moveobjectoffscreen 1
+ copyobjectxytoperm 1
msgbox SeafloorCavern_Entrance_Text_234544, MSGBOX_DEFAULT
closemessage
applymovement 1, Common_Movement_WalkInPlaceUp
diff --git a/data/maps/SlateportCity_Harbor/scripts.inc b/data/maps/SlateportCity_Harbor/scripts.inc
index 32fa9fa5d..c46923bb0 100644
--- a/data/maps/SlateportCity_Harbor/scripts.inc
+++ b/data/maps/SlateportCity_Harbor/scripts.inc
@@ -77,7 +77,7 @@ SlateportCity_Harbor_EventScript_20C9F5:: @ 820C9F5
closemessage
setflag FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNT_1_BLOCKING_ENTRANCE
setflag FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNT_2_BLOCKING_ENTRANCE
- moveobjectoffscreen 4
+ copyobjectxytoperm 4
setobjectmovementtype 4, MOVEMENT_TYPE_FACE_RIGHT
releaseall
end
diff --git a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc
index 5a4947c8a..90d42ccae 100644
--- a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc
+++ b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc
@@ -40,7 +40,6 @@ SlateportCity_OceanicMuseum_1F_EventScript_20ADE8:: @ 820ADE8
playse SE_REGI
takemoney 0x32, 0
updatemoneybox 0, 0
- nop
msgbox SlateportCity_OceanicMuseum_1F_Text_20B026, MSGBOX_DEFAULT
setvar VAR_SLATEPORT_MUSEUM_1F_STATE, 1
hidemoneybox
diff --git a/data/maps/SootopolisCity/scripts.inc b/data/maps/SootopolisCity/scripts.inc
index 7d2143346..2f3ef0434 100644
--- a/data/maps/SootopolisCity/scripts.inc
+++ b/data/maps/SootopolisCity/scripts.inc
@@ -1366,14 +1366,14 @@ SootopolisCity_EventScript_1E646F:: @ 81E646F
SootopolisCity_EventScript_1E64B2:: @ 81E64B2
applymovement 18, SootopolisCity_Movement_1E64EC
waitmovement 0
- moveobjectoffscreen 18
+ copyobjectxytoperm 18
setvar VAR_SOOTOPOLIS_WALLACE_STATE, 1
return
SootopolisCity_EventScript_1E64C5:: @ 81E64C5
applymovement 18, SootopolisCity_Movement_1E64EF
waitmovement 0
- moveobjectoffscreen 18
+ copyobjectxytoperm 18
setvar VAR_SOOTOPOLIS_WALLACE_STATE, 2
return
diff --git a/data/maps/SootopolisCity_Gym_1F/scripts.inc b/data/maps/SootopolisCity_Gym_1F/scripts.inc
index 7d6a8dc94..fa69aadc2 100644
--- a/data/maps/SootopolisCity_Gym_1F/scripts.inc
+++ b/data/maps/SootopolisCity_Gym_1F/scripts.inc
@@ -222,6 +222,10 @@ SootopolisCity_Gym_1F_Text_225268: @ 8225268
.string "A grand illusion of water sculpted\n"
.string "by POKéMON and myself!$"
+@ NOTE: This defeat text actually causes a buffer overflow. It's about 50 bytes too long for
+@ the gDisplayedStringBattle buffer that it's put into, and it stomps all over the gBattleTextBuffs
+@ after, as well as the otherwise unused array after that. One wonders if that's the reason for
+@ the existence of that unused array of ints.
SootopolisCity_Gym_1F_Text_225432: @ 8225432
.string "Ahahaha, excellent!\n"
.string "Very well, you are the winner.\p"
diff --git a/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc b/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc
index 5f2352645..78938b7d8 100644
--- a/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc
+++ b/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc
@@ -36,7 +36,7 @@ SootopolisCity_MysteryEventsHouse_1F_EventScript_2279B7:: @ 82279B7
waitmovement 0
applymovement 1, SootopolisCity_MysteryEventsHouse_1F_Movement_227A21
waitmovement 0
- moveobjectoffscreen 1
+ copyobjectxytoperm 1
applymovement EVENT_OBJ_ID_PLAYER, Common_Movement_WalkInPlaceUp
waitmovement 0
compare VAR_SOOTOPOLIS_MYSTERY_EVENTS_STATE, 1
diff --git a/data/maps/UnknownLinkContestRoom_25_29/map.json b/data/maps/UnknownLinkContestRoom_25_29/map.json
index 956a68158..3e4387b6a 100644
--- a/data/maps/UnknownLinkContestRoom_25_29/map.json
+++ b/data/maps/UnknownLinkContestRoom_25_29/map.json
@@ -1,5 +1,5 @@
{
- "id": "MAP_UNKNOWN_MAP_25_29",
+ "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_29",
"name": "UnknownLinkContestRoom_25_29",
"layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_29",
"music": "MUS_NIBI",
diff --git a/data/maps/UnknownLinkContestRoom_25_30/map.json b/data/maps/UnknownLinkContestRoom_25_30/map.json
index 526c6de2a..42a719c17 100644
--- a/data/maps/UnknownLinkContestRoom_25_30/map.json
+++ b/data/maps/UnknownLinkContestRoom_25_30/map.json
@@ -1,5 +1,5 @@
{
- "id": "MAP_UNKNOWN_MAP_25_30",
+ "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_30",
"name": "UnknownLinkContestRoom_25_30",
"layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_30",
"music": "MUS_NIBI",
diff --git a/data/maps/UnknownLinkContestRoom_25_31/map.json b/data/maps/UnknownLinkContestRoom_25_31/map.json
index 9548c1125..ad18b00af 100644
--- a/data/maps/UnknownLinkContestRoom_25_31/map.json
+++ b/data/maps/UnknownLinkContestRoom_25_31/map.json
@@ -1,5 +1,5 @@
{
- "id": "MAP_UNKNOWN_MAP_25_31",
+ "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_31",
"name": "UnknownLinkContestRoom_25_31",
"layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_31",
"music": "MUS_NIBI",
diff --git a/data/maps/UnknownLinkContestRoom_25_32/map.json b/data/maps/UnknownLinkContestRoom_25_32/map.json
index 27411d28e..0e1528e59 100644
--- a/data/maps/UnknownLinkContestRoom_25_32/map.json
+++ b/data/maps/UnknownLinkContestRoom_25_32/map.json
@@ -1,5 +1,5 @@
{
- "id": "MAP_UNKNOWN_MAP_25_32",
+ "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_32",
"name": "UnknownLinkContestRoom_25_32",
"layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_32",
"music": "MUS_NIBI",
diff --git a/data/maps/UnknownLinkContestRoom_25_33/map.json b/data/maps/UnknownLinkContestRoom_25_33/map.json
index 1a15ae6d6..8765e9771 100644
--- a/data/maps/UnknownLinkContestRoom_25_33/map.json
+++ b/data/maps/UnknownLinkContestRoom_25_33/map.json
@@ -1,5 +1,5 @@
{
- "id": "MAP_UNKNOWN_MAP_25_33",
+ "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_33",
"name": "UnknownLinkContestRoom_25_33",
"layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_33",
"music": "MUS_NIBI",
diff --git a/data/maps/UnknownLinkContestRoom_25_34/map.json b/data/maps/UnknownLinkContestRoom_25_34/map.json
index 4c90858b9..c7220897b 100644
--- a/data/maps/UnknownLinkContestRoom_25_34/map.json
+++ b/data/maps/UnknownLinkContestRoom_25_34/map.json
@@ -1,5 +1,5 @@
{
- "id": "MAP_UNKNOWN_MAP_25_34",
+ "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_34",
"name": "UnknownLinkContestRoom_25_34",
"layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_34",
"music": "MUS_NIBI",
diff --git a/data/maps/VictoryRoad_1F/scripts.inc b/data/maps/VictoryRoad_1F/scripts.inc
index 5214edc44..b6983eac0 100644
--- a/data/maps/VictoryRoad_1F/scripts.inc
+++ b/data/maps/VictoryRoad_1F/scripts.inc
@@ -44,7 +44,7 @@ VictoryRoad_1F_EventScript_235DE1:: @ 8235DE1
trainerbattle_no_intro TRAINER_WALLY_1, VictoryRoad_1F_Text_235FFC
msgbox VictoryRoad_1F_Text_236020, MSGBOX_DEFAULT
clearflag FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY
- moveobjectoffscreen 4
+ copyobjectxytoperm 4
setflag FLAG_DEFEATED_WALLY_VICTORY_ROAD
copyvar VAR_VICTORY_ROAD_1F_STATE, VAR_0x8008
releaseall
diff --git a/data/multiboot_berry_glitch_fix.s b/data/multiboot_berry_glitch_fix.s
index c77fc2c5e..57757090a 100644
--- a/data/multiboot_berry_glitch_fix.s
+++ b/data/multiboot_berry_glitch_fix.s
@@ -1,5 +1,5 @@
.section .rodata
gMultiBootProgram_BerryGlitchFix_Start:: @ 89A6550
- .incbin "data/berry_fix.mb"
+ .incbin "berry_fix/berry_fix.gba"
gMultiBootProgram_BerryGlitchFix_End:: @ 89AA144
diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc
index e9a14437a..910227a92 100644
--- a/data/script_cmd_table.inc
+++ b/data/script_cmd_table.inc
@@ -100,7 +100,7 @@ gScriptCmdTable:: @ 81DB67C
.4byte ScrCmd_settrainerflag
.4byte ScrCmd_cleartrainerflag
.4byte ScrCmd_setobjectxyperm
- .4byte ScrCmd_moveobjectoffscreen
+ .4byte ScrCmd_copyobjectxytoperm
.4byte ScrCmd_setobjectmovementtype
.4byte ScrCmd_waitmessage
.4byte ScrCmd_message
diff --git a/data/scripts/apprentice.inc b/data/scripts/apprentice.inc
index d6713cde4..b75a3c579 100644
--- a/data/scripts/apprentice.inc
+++ b/data/scripts/apprentice.inc
@@ -553,7 +553,7 @@ gText_082B7D18:: @ 82B7D18
.string "time with someone like me.$"
gText_082B7DD4:: @ 82B7DD4
- .string "Oh! You're {PLAYER}{STRING 5}, aren't you?\p"
+ .string "Oh! You're {PLAYER}{KUN}, aren't you?\p"
.string "I've heard that you're tough at\n"
.string "POKéMON!\p"
.string "I'm {STR_VAR_1}!\n"
@@ -576,19 +576,19 @@ gText_082B7F35:: @ 82B7F35
.string "You know that the BATTLE TOWER has\n"
.string "Level 50 and Open Level Rooms?\p"
.string "Which do you think would be good\n"
- .string "for me, {PLAYER}{STRING 5}?$"
+ .string "for me, {PLAYER}{KUN}?$"
gText_082B7FE8:: @ 82B7FE8
.string "Okay, {STR_VAR_1} is suitable for me?\n"
.string "Thank you!\p"
.string "Knowing that you made the decision,\n"
- .string "{PLAYER}{STRING 5}, I won't be so upset if\l"
+ .string "{PLAYER}{KUN}, I won't be so upset if\l"
.string "I lose.\p"
.string "Okay, I'll look to you for advice again.\n"
.string "Bye!$"
gText_082B8087:: @ 82B8087
- .string "Oh, hi, there! {PLAYER}{STRING 5}!\n"
+ .string "Oh, hi, there! {PLAYER}{KUN}!\n"
.string "I know you because you're famous!\l"
.string "Call me {STR_VAR_1}! Glad to meet you!\p"
.string "I'm a TRIATHLETE, so I keep myself\n"
@@ -599,13 +599,13 @@ gText_082B8087:: @ 82B8087
.string "me to become a decent TRAINER.\p"
.string "So, I have a proposition!\p"
.string "There must be a reason why we met.\n"
- .string "So, {PLAYER}{STRING 5}, how about sharing your\l"
+ .string "So, {PLAYER}{KUN}, how about sharing your\l"
.string "wisdom with me every so often?$"
gText_082B822B:: @ 82B822B
.string "Oh, but, please?\n"
.string "A guy like me needs someone like\l"
- .string "you, {PLAYER}{STRING 5}!\p"
+ .string "you, {PLAYER}{KUN}!\p"
.string "Honestly, I need your advice!$"
gText_082B8286:: @ 82B8286
@@ -741,15 +741,15 @@ gText_082B8C20:: @ 82B8C20
gText_082B8CAA:: @ 82B8CAA
.string "Whoa! Could you be…\n"
- .string "Might you be… {PLAYER}{STRING 5}?!\l"
+ .string "Might you be… {PLAYER}{KUN}?!\l"
.string "That strong and famous TRAINER?\l"
.string "Well, hello, aren't I just the luckiest!\p"
.string "Hello, the name's {STR_VAR_1}!\p"
.string "I've been on the lookout for\n"
.string "a POKéMON teacher.\p"
.string "And with impeccably good timing,\n"
- .string "along came you, {PLAYER}{STRING 5}!\p"
- .string "So, there you have it, {PLAYER}{STRING 5}!\n"
+ .string "along came you, {PLAYER}{KUN}!\p"
+ .string "So, there you have it, {PLAYER}{KUN}!\n"
.string "Let me apprentice under you!$"
gText_082B8DD3:: @ 82B8DD3
@@ -774,7 +774,7 @@ gText_082B8ED5:: @ 82B8ED5
.string "Adios!$"
gText_082B8F45:: @ 82B8F45
- .string "Oh, hey, {PLAYER}{STRING 5}, right?\n"
+ .string "Oh, hey, {PLAYER}{KUN}, right?\n"
.string "The police were looking for you!\p"
.string "… … …\n"
.string "Of course I'm lying!\p"
@@ -822,7 +822,7 @@ gText_082B929C:: @ 82B929C
.string "Your turn now, tell me a little about\n"
.string "yourself, give it a try!\p"
.string "Uh-huh, uh-huh!\n"
- .string "{PLAYER}{STRING 5}'s your name,\l"
+ .string "{PLAYER}{KUN}'s your name,\l"
.string "and POKéMON's your game!\p"
.string "And you're at a delicate age\n"
.string "when all the world's your stage!\p"
@@ -901,7 +901,7 @@ gText_082B992D:: @ 82B992D
.string "not built to take the abuse…\p"
.string "I decided I'll battle POKéMON and\n"
.string "toughen myself up.\p"
- .string "You're {PLAYER}{STRING 5}, aren't you?\n"
+ .string "You're {PLAYER}{KUN}, aren't you?\n"
.string "The POKéMON LEAGUE CHAMP?\p"
.string "Listen, can I get you to give me\n"
.string "advice?$"
@@ -927,7 +927,7 @@ gText_082B9B76:: @ 82B9B76
gText_082B9BF2:: @ 82B9BF2
.string "Er… Um…\n"
- .string "{PLAYER}{STRING 5}…?\p"
+ .string "{PLAYER}{KUN}…?\p"
.string "Please, don't look at me that way.\n"
.string "You're making me all self-conscious.\p"
.string "I… I'm {STR_VAR_1}.\p"
@@ -935,7 +935,7 @@ gText_082B9BF2:: @ 82B9BF2
.string "but I explore ancient ruins and such.\p"
.string "I'm even more embarrassed to admit\n"
.string "I'm interested in the BATTLE FRONTIER.\p"
- .string "{PLAYER}{STRING 5}, you have a reputation as\n"
+ .string "{PLAYER}{KUN}, you have a reputation as\n"
.string "a tough TRAINER…\p"
.string "It's hard for me to say this,\n"
.string "but I want to ask something.\p"
@@ -962,18 +962,18 @@ gText_082B9EAA:: @ 82B9EAA
.string "I'll try my hand at that.\p"
.string "I hope I can make a valiant challenge\n"
.string "without getting all flustered…\p"
- .string "Thank you, {PLAYER}{STRING 5}.\n"
+ .string "Thank you, {PLAYER}{KUN}.\n"
.string "If we meet again, I hope you will be\l"
.string "as helpful.$"
gText_082B9F55:: @ 82B9F55
- .string "Hm? You appear to be {PLAYER}{STRING 5}…\n"
+ .string "Hm? You appear to be {PLAYER}{KUN}…\n"
.string "But are you really real?\p"
.string "You may call me {STR_VAR_1}.\p"
.string "I have been toying with the idea of\n"
.string "apprenticing under a strong TRAINER.\p"
.string "So, I must say I'm lucky you came along!\n"
- .string "…You really are {PLAYER}{STRING 5}, yes?\p"
+ .string "…You really are {PLAYER}{KUN}, yes?\p"
.string "No, no, if you are real, it's fine.\n"
.string "I merely want you to recognize me\l"
.string "as your apprentice.$"
@@ -1130,7 +1130,7 @@ gText_082BAA81:: @ 82BAA81
.string "my {STR_VAR_2} hold anything?$"
gText_082BAB22:: @ 82BAB22
- .string "Oh, {PLAYER}{STRING 5}.\n"
+ .string "Oh, {PLAYER}{KUN}.\n"
.string "There's something I wanted to ask you.\p"
.string "You know how you decided which\n"
.string "POKéMON I should have for me?\p"
@@ -1148,7 +1148,7 @@ gText_082BAC43:: @ 82BAC43
gText_082BAC78:: @ 82BAC78
.string "If you think that's best, I'll do that.\p"
.string "Knowing that you made the decision,\n"
- .string "{PLAYER}{STRING 5}, I won't be so upset if\l"
+ .string "{PLAYER}{KUN}, I won't be so upset if\l"
.string "I lose.\p"
.string "Okay, I'll look to you for advice again.\n"
.string "Bye!$"
@@ -1157,7 +1157,7 @@ gText_082BAD17:: @ 82BAD17
.string "The item {STR_VAR_1}, huh?\n"
.string "Not bad. I'll use it!\p"
.string "Knowing that you made the decision,\n"
- .string "{PLAYER}{STRING 5}, I won't be so upset if\l"
+ .string "{PLAYER}{KUN}, I won't be so upset if\l"
.string "I lose.\p"
.string "Okay, I'll look to you for advice again.\n"
.string "Bye!$"
@@ -1170,7 +1170,7 @@ gText_082BADB6:: @ 82BADB6
.string "do the best it can empty-handed?$"
gText_082BAE36:: @ 82BAE36
- .string "Yo, {PLAYER}{STRING 5}!\p"
+ .string "Yo, {PLAYER}{KUN}!\p"
.string "We're both busy, but we seem to run\n"
.string "into each other often anyway!\p"
.string "Today I have to do some walking,\n"
@@ -1315,7 +1315,7 @@ gText_082BB84A:: @ 82BB84A
gText_082BB8CD:: @ 82BB8CD
.string "Hola!\n"
- .string "My maestro, {PLAYER}{STRING 5}!\p"
+ .string "My maestro, {PLAYER}{KUN}!\p"
.string "I want to hit you up for advice on\n"
.string "POKéMON tools.\p"
.string "What do you think would be good for\n"
@@ -1348,7 +1348,7 @@ gText_082BBA6C:: @ 82BBA6C
.string "can win without holding any item?$"
gText_082BBB01:: @ 82BBB01
- .string "{PLAYER}{STRING 5}, something unbelievable\n"
+ .string "{PLAYER}{KUN}, something unbelievable\n"
.string "has happened!\p"
.string "I woke up this morning, and my POKéMON\n"
.string "had 10 NUGGETS!\p"
@@ -1465,14 +1465,14 @@ gText_082BC373:: @ 82BC373
.string "Doesn't need to hold anything?$"
gText_082BC40E:: @ 82BC40E
- .string "Gwah! Ouch! {PLAYER}{STRING 5}, my arm's broken!\n"
+ .string "Gwah! Ouch! {PLAYER}{KUN}, my arm's broken!\n"
.string "Don't touch it, please!\p"
.string "I must've broken it while I was trying\n"
.string "out different hold items with my posse\l"
.string "of POKéMON.\p"
.string "So, things being this way,\n"
.string "I need you to decide for me.\p"
- .string "{PLAYER}{STRING 5}, what do you think would be\n"
+ .string "{PLAYER}{KUN}, what do you think would be\n"
.string "good for my {STR_VAR_1} to hold?$"
gText_082BC514:: @ 82BC514
@@ -1504,14 +1504,14 @@ gText_082BC666:: @ 82BC666
gText_082BC714:: @ 82BC714
.string "Er… Um…\n"
- .string "{PLAYER}{STRING 5}…\p"
+ .string "{PLAYER}{KUN}…\p"
.string "Please, don't look at me that way.\n"
.string "My POKéMON don't have anything.\p"
.string "I… I'm really embarrassed about this,\n"
.string "but I really need your advice.\p"
.string "I can't decide what hold item would\n"
.string "make my {STR_VAR_1} strong.\p"
- .string "{PLAYER}{STRING 5}, what do you think would\n"
+ .string "{PLAYER}{KUN}, what do you think would\n"
.string "be good?$"
gText_082BC808:: @ 82BC808
@@ -1523,7 +1523,7 @@ gText_082BC84D:: @ 82BC84D
.string "I'll go without an item.\p"
.string "This is nerve-racking, though.\n"
.string "Wouldn't it be too cool?\p"
- .string "Thank you, {PLAYER}{STRING 5}.\n"
+ .string "Thank you, {PLAYER}{KUN}.\n"
.string "If we meet again, I hope you will be\l"
.string "as helpful.$"
@@ -1532,7 +1532,7 @@ gText_082BC8EA:: @ 82BC8EA
.string "I'll go with that {STR_VAR_1}.\p"
.string "This is nerve-racking, though.\n"
.string "Wouldn't it be too cool?\p"
- .string "Thank you, {PLAYER}{STRING 5}.\n"
+ .string "Thank you, {PLAYER}{KUN}.\n"
.string "If we meet again, I hope you will be\l"
.string "as helpful.$"
@@ -1545,7 +1545,7 @@ gText_082BC984:: @ 82BC984
.string "my {STR_VAR_2} didn't have an item?$"
gText_082BCA4D:: @ 82BCA4D
- .string "Hm? You appear to be {PLAYER}{STRING 5}…\n"
+ .string "Hm? You appear to be {PLAYER}{KUN}…\n"
.string "But are you really?\l"
.string "Perhaps you're a twin?\p"
.string "Oh, no, no, no, don't worry!\n"
@@ -1647,7 +1647,7 @@ gText_082BD18A:: @ 82BD18A
.string "speak with me… Thank you!$"
gText_082BD222:: @ 82BD222
- .string "Oh, {PLAYER}{STRING 5}! It's me!\n"
+ .string "Oh, {PLAYER}{KUN}! It's me!\n"
.string "I'm so glad to see you because I have\l"
.string "this little problem.\p"
.string "I can't decide how my POKéMON should\n"
@@ -1660,13 +1660,13 @@ gText_082BD222:: @ 82BD222
gText_082BD325:: @ 82BD325
.string "My {STR_VAR_1}? That's great!\p"
.string "Knowing that you made the decision,\n"
- .string "{PLAYER}{STRING 5}, I won't be so upset if\l"
+ .string "{PLAYER}{KUN}, I won't be so upset if\l"
.string "I lose.\p"
.string "Okay, I'll look to you for advice again.\n"
.string "Bye!$"
gText_082BD3B1:: @ 82BD3B1
- .string "Hi, my teacher {PLAYER}{STRING 5}!\n"
+ .string "Hi, my teacher {PLAYER}{KUN}!\n"
.string "I'm busy again today!\p"
.string "I have to do some cycling, shopping,\n"
.string "and humming.\p"
@@ -1740,13 +1740,13 @@ gText_082BD8F5:: @ 82BD8F5
gText_082BD9BE:: @ 82BD9BE
.string "Hello, hello!\n"
- .string "My mentor, {PLAYER}{STRING 5}!\l"
+ .string "My mentor, {PLAYER}{KUN}!\l"
.string "Hit me with your sage advice today!\p"
.string "You see, I pulled together a team of\n"
.string "three POKéMON. So far so good.\p"
.string "But the team's battling order's not\n"
.string "settled yet.\p"
- .string "This is where you come in, {PLAYER}{STRING 5}!\n"
+ .string "This is where you come in, {PLAYER}{KUN}!\n"
.string "You decide which POKéMON leads off!\p"
.string "Don't be shy now.\n"
.string "Let's blurt it out!$"
@@ -1759,7 +1759,7 @@ gText_082BDAE1:: @ 82BDAE1
.string "Adios!$"
gText_082BDB4E:: @ 82BDB4E
- .string "{PLAYER}{STRING 5}, listen!\n"
+ .string "{PLAYER}{KUN}, listen!\n"
.string "It's a crisis!\p"
.string "My POKéMON, all three of them, go into\n"
.string "battle at once!\p"
@@ -1815,7 +1815,7 @@ gText_082BDF4D:: @ 82BDF4D
.string "See you again, my smart friend!$"
gText_082BDFD8:: @ 82BDFD8
- .string "…Oof…ooch… {PLAYER}{STRING 5}…\n"
+ .string "…Oof…ooch… {PLAYER}{KUN}…\n"
.string "My stomach's hurting all of a sudden…\p"
.string "…It's getting better now…\p"
.string "I must've worried myself sick racking\n"
@@ -1823,7 +1823,7 @@ gText_082BDFD8:: @ 82BDFD8
.string "my posse of POKéMON.\p"
.string "So, things being this way,\n"
.string "I need you to decide for me.\p"
- .string "{PLAYER}{STRING 5}, which of my POKéMON should\n"
+ .string "{PLAYER}{KUN}, which of my POKéMON should\n"
.string "go first? So I'd win, I mean.$"
gText_082BE0FD:: @ 82BE0FD
@@ -1836,7 +1836,7 @@ gText_082BE0FD:: @ 82BE0FD
gText_082BE189:: @ 82BE189
.string "Er… Um…\n"
- .string "{PLAYER}{STRING 5}?\p"
+ .string "{PLAYER}{KUN}?\p"
.string "Please, don't look at me that way.\n"
.string "You're making me feel all flustered.\p"
.string "Um…\n"
@@ -1852,12 +1852,12 @@ gText_082BE2A5:: @ 82BE2A5
.string "I'll lead with my {STR_VAR_1}.\p"
.string "I hope I can do my best without\n"
.string "getting all flustered.\p"
- .string "Thank you, {PLAYER}{STRING 5}.\n"
+ .string "Thank you, {PLAYER}{KUN}.\n"
.string "If we meet again, I hope you will be\l"
.string "as helpful.$"
gText_082BE33E:: @ 82BE33E
- .string "Hm? You appear to be {PLAYER}{STRING 5}…\n"
+ .string "Hm? You appear to be {PLAYER}{KUN}…\n"
.string "But are you really?\l"
.string "Perhaps you're a clever look-alike?\p"
.string "Oh, no, no, no, don't worry!\n"
@@ -1949,7 +1949,7 @@ gText_082BE99C:: @ 82BE99C
.string "Thank you!$"
gText_082BEA1B:: @ 82BEA1B
- .string "Oh, {PLAYER}{STRING 5}! I'm so glad to see you!\n"
+ .string "Oh, {PLAYER}{KUN}! I'm so glad to see you!\n"
.string "I was about to go looking for you!\p"
.string "Can you decide what kind of POKéMON\n"
.string "I should use?\p"
@@ -1962,20 +1962,20 @@ gText_082BEA1B:: @ 82BEA1B
gText_082BEAE9:: @ 82BEAE9
.string "{STR_VAR_1}? That's great!\p"
.string "Knowing that you made the decision,\n"
- .string "{PLAYER}{STRING 5}, I won't be so upset if\l"
+ .string "{PLAYER}{KUN}, I won't be so upset if\l"
.string "I lose.\p"
.string "Okay, I'll look to you for advice again.\n"
.string "Bye!$"
gText_082BEB72:: @ 82BEB72
- .string "If it isn't {PLAYER}{STRING 5}! How's it going?\n"
+ .string "If it isn't {PLAYER}{KUN}! How's it going?\n"
.string "I'm busy again as always!\p"
.string "I want to do good with POKéMON, too,\n"
.string "but I haven't been able to decide\l"
.string "which POKéMON I should use.\p"
.string "You know how {STR_VAR_1} look strong?\n"
.string "But {STR_VAR_2} are tough to ignore.\p"
- .string "{PLAYER}{STRING 5}, give me some of your good\n"
+ .string "{PLAYER}{KUN}, give me some of your good\n"
.string "advice! Which one'd be good for me?$"
gText_082BEC8E:: @ 82BEC8E
@@ -2046,7 +2046,7 @@ gText_082BF11D:: @ 82BF11D
gText_082BF1A8:: @ 82BF1A8
.string "Hey, hey!\n"
- .string "My mentor, {PLAYER}{STRING 5}!\p"
+ .string "My mentor, {PLAYER}{KUN}!\p"
.string "Hello, I've been looking for you\n"
.string "for some more of your sage advice!\p"
.string "Which kind of POKéMON would be right\n"
@@ -2062,7 +2062,7 @@ gText_082BF268:: @ 82BF268
.string "Adios!$"
gText_082BF2D1:: @ 82BF2D1
- .string "{PLAYER}{STRING 5}, listen! Big news!\n"
+ .string "{PLAYER}{KUN}, listen! Big news!\n"
.string "I caught a mirage POKéMON!\p"
.string "Of course I'm lying!\n"
.string "Wahahaha!\p"
@@ -2120,13 +2120,13 @@ gText_082BF6E5:: @ 82BF6E5
.string "See you again, my smart friend!$"
gText_082BF773:: @ 82BF773
- .string "Oh, hi, {PLAYER}{STRING 5}…\n"
+ .string "Oh, hi, {PLAYER}{KUN}…\n"
.string "I have this horrible headache…\p"
.string "I must've worried too much about\n"
.string "the kind of POKéMON I should raise.\p"
.string "So, things being this way,\n"
.string "I need you to decide for me.\p"
- .string "{PLAYER}{STRING 5}, if I had to choose between\n"
+ .string "{PLAYER}{KUN}, if I had to choose between\n"
.string "the POKéMON {STR_VAR_1} and\l"
.string "{STR_VAR_2}, which should it be?$"
@@ -2138,7 +2138,7 @@ gText_082BF869:: @ 82BF869
gText_082BF8DD:: @ 82BF8DD
.string "Er… Um…\n"
- .string "{PLAYER}{STRING 5}…?\p"
+ .string "{PLAYER}{KUN}…?\p"
.string "Please, don't look at me that way.\n"
.string "I'm getting all flustered…\l"
.string "I… I need your advice.\p"
@@ -2152,12 +2152,12 @@ gText_082BF9BA:: @ 82BF9BA
.string "I'll do my best with one {STR_VAR_1}.\p"
.string "I hope I can do my best without\n"
.string "getting all flustered.\p"
- .string "Thank you, {PLAYER}{STRING 5}.\n"
+ .string "Thank you, {PLAYER}{KUN}.\n"
.string "If we meet again, I hope you will be\l"
.string "as helpful.$"
gText_082BFA5A:: @ 82BFA5A
- .string "Hm? You appear to be {PLAYER}{STRING 5}…\n"
+ .string "Hm? You appear to be {PLAYER}{KUN}…\n"
.string "But are you really real?\p"
.string "No, no, if you are real, it's fine.\n"
.string "Incidentally, I would like to obtain\l"
@@ -2250,7 +2250,7 @@ gText_082C0032:: @ 82C0032
.string "Thank you!$"
gText_082C0090:: @ 82C0090
- .string "Oh, {PLAYER}{STRING 5}!\n"
+ .string "Oh, {PLAYER}{KUN}!\n"
.string "I was just hoping to see you, too!\p"
.string "I was wondering what move would\n"
.string "be suitable for my {STR_VAR_1}.\p"
@@ -2263,14 +2263,14 @@ gText_082C0090:: @ 82C0090
gText_082C016E:: @ 82C016E
.string "{STR_VAR_1}? That's great!\p"
.string "Knowing that you made the decision,\n"
- .string "{PLAYER}{STRING 5}, I won't be so upset if\l"
+ .string "{PLAYER}{KUN}, I won't be so upset if\l"
.string "I lose.\p"
.string "Okay, I'll look to you for advice again.\n"
.string "Bye!$"
gText_082C01F7:: @ 82C01F7
.string "How could things be this busy?\n"
- .string "Hey, if it isn't {PLAYER}{STRING 5}!\l"
+ .string "Hey, if it isn't {PLAYER}{KUN}!\l"
.string "How's it going?\p"
.string "Since I got up this morning, I've done\n"
.string "my jogging, swimming, and cooking!\p"
@@ -2279,7 +2279,7 @@ gText_082C01F7:: @ 82C01F7
.string "my {STR_VAR_1} should learn!\p"
.string "{STR_VAR_2} looks good, huh?\n"
.string "But {STR_VAR_3}'s also decent.\p"
- .string "{PLAYER}{STRING 5}, give me some of your good\n"
+ .string "{PLAYER}{KUN}, give me some of your good\n"
.string "advice! Which move'd be good for me?$"
gText_082C034C:: @ 82C034C
@@ -2344,7 +2344,7 @@ gText_082C06D8:: @ 82C06D8
.string "some more another time.$"
gText_082C074A:: @ 82C074A
- .string "Hola, {PLAYER}{STRING 5}, bueno!\n"
+ .string "Hola, {PLAYER}{KUN}, bueno!\n"
.string "I'm hoping for some more of\l"
.string "your sage advice today!\p"
.string "What would be the best move for\n"
@@ -2362,7 +2362,7 @@ gText_082C0809:: @ 82C0809
.string "Adios!$"
gText_082C086E:: @ 82C086E
- .string "{PLAYER}{STRING 5}, it's completely wild!\p"
+ .string "{PLAYER}{KUN}, it's completely wild!\p"
.string "My POKéMON!\n"
.string "It learned six moves!\p"
.string "Of course I'm lying!\n"
@@ -2420,13 +2420,13 @@ gText_082C0C7D:: @ 82C0C7D
.string "See you again, my smart friend!$"
gText_082C0D0B:: @ 82C0D0B
- .string "Gahack! Gaah! Oh, {PLAYER}{STRING 5}…\n"
+ .string "Gahack! Gaah! Oh, {PLAYER}{KUN}…\n"
.string "I have this lousy cold, I do…\p"
.string "I want to pick a move for my POKéMON,\n"
.string "but I'm not up to it…\p"
.string "So, things being this way,\n"
.string "I need you to decide for me.\p"
- .string "{PLAYER}{STRING 5}, if I had to choose between\n"
+ .string "{PLAYER}{KUN}, if I had to choose between\n"
.string "{STR_VAR_2} and {STR_VAR_3} for\l"
.string "my {STR_VAR_1}, which would it be?$"
@@ -2438,7 +2438,7 @@ gText_082C0DFE:: @ 82C0DFE
gText_082C0E71:: @ 82C0E71
.string "Er… Um…\n"
- .string "{PLAYER}{STRING 5}…?\p"
+ .string "{PLAYER}{KUN}…?\p"
.string "Please, don't look at me that way.\n"
.string "I'm getting all flustered…\l"
.string "I… I need your advice.\p"
@@ -2454,12 +2454,12 @@ gText_082C0F6D:: @ 82C0F6D
.string "I'll try that {STR_VAR_1}.\p"
.string "I hope I can teach that move…\n"
.string "This is so nerve-racking…\p"
- .string "Thank you, {PLAYER}{STRING 5}.\n"
+ .string "Thank you, {PLAYER}{KUN}.\n"
.string "If we meet again, I hope you will be\l"
.string "as helpful.$"
gText_082C1003:: @ 82C1003
- .string "Hm? You appear to be {PLAYER}{STRING 5}…\n"
+ .string "Hm? You appear to be {PLAYER}{KUN}…\n"
.string "But are you really real?\p"
.string "Perhaps you're one of those popular\n"
.string "mimics?\p"
@@ -2569,7 +2569,7 @@ gText_082C174F:: @ 82C174F
.string "somewhere again!$"
gText_082C1862:: @ 82C1862
- .string "Oh, {PLAYER}{STRING 5}.\n"
+ .string "Oh, {PLAYER}{KUN}.\n"
.string "There's something I want you to hear.\p"
.string "I know that I don't always sound\n"
.string "nice or polite…\p"
@@ -2595,7 +2595,7 @@ gText_082C19A0:: @ 82C19A0
gText_082C1A76:: @ 82C1A76
.string "Oh, I can't get over how busy I am!\n"
- .string "Oh, hey, I was looking for you, {PLAYER}{STRING 5}.\p"
+ .string "Oh, hey, I was looking for you, {PLAYER}{KUN}.\p"
.string "Are you well as usual?\n"
.string "Things haven't changed for me at all.\p"
.string "I've got running, fighting, and mapping\n"
@@ -2605,7 +2605,7 @@ gText_082C1A76:: @ 82C1A76
.string "from a win without saying a word.\p"
.string "So, what would be a cool saying to\n"
.string "underline my coolness when I'm done\l"
- .string "and walking away? {PLAYER}{STRING 5}, help me!$"
+ .string "and walking away? {PLAYER}{KUN}, help me!$"
gText_082C1C16:: @ 82C1C16
.string "{STR_VAR_1}\p"
@@ -2615,7 +2615,7 @@ gText_082C1C16:: @ 82C1C16
.string "like you.\p"
.string "I'm going to make time somehow so\n"
.string "I can get into battling.\p"
- .string "Thanks for everything, {PLAYER}{STRING 5}!\n"
+ .string "Thanks for everything, {PLAYER}{KUN}!\n"
.string "We have to battle, you and me, one day!$"
gText_082C1CF5:: @ 82C1CF5
@@ -2694,7 +2694,7 @@ gText_082C21FF:: @ 82C21FF
gText_082C231C:: @ 82C231C
.string "Hola, bueno!\n"
- .string "{PLAYER}{STRING 5}!\p"
+ .string "{PLAYER}{KUN}!\p"
.string "You know, I'm getting the itch to roam\n"
.string "and battle where I may.\p"
.string "But before I do, I want your advice\n"
@@ -2714,7 +2714,7 @@ gText_082C2407:: @ 82C2407
.string "Adios!$"
gText_082C24B5:: @ 82C24B5
- .string "{PLAYER}{STRING 5}, there's big trouble!\p"
+ .string "{PLAYER}{KUN}, there's big trouble!\p"
.string "When I win a battle, I brag about it\n"
.string "for an hour at least!\p"
.string "Of course I'm lying!\n"
@@ -2793,14 +2793,14 @@ gText_082C2A0B:: @ 82C2A0B
.string "Love ya!$"
gText_082C2B50:: @ 82C2B50
- .string "{PLAYER}{STRING 5}, I'm finished…\n"
+ .string "{PLAYER}{KUN}, I'm finished…\n"
.string "My nose won't stop dripping…\p"
.string "I was trying to think up something\n"
.string "cool to say when I win a battle.\p"
.string "It inspired me so much, it made me cry,\n"
.string "and now my nose won't stop running…\p"
.string "So, things being this way,\n"
- .string "I need you to decide for me, {PLAYER}{STRING 5}.\p"
+ .string "I need you to decide for me, {PLAYER}{KUN}.\p"
.string "When I win a battle,\n"
.string "what should I say?$"
@@ -2812,13 +2812,13 @@ gText_082C2C77:: @ 82C2C77
.string "But in spite of my tears and runny\n"
.string "nose, I will use that saying!\p"
.string "I'm plumb out of things to ask you,\n"
- .string "{PLAYER}{STRING 5}.\p"
+ .string "{PLAYER}{KUN}.\p"
.string "From now on, we're rivals!\n"
.string "Thanks for everything!$"
gText_082C2D67:: @ 82C2D67
.string "Er… Um…\n"
- .string "{PLAYER}{STRING 5}…\p"
+ .string "{PLAYER}{KUN}…\p"
.string "Please, don't look at me that way.\n"
.string "You're making me all nervous.\p"
.string "I… I need your advice again.\n"
@@ -2832,13 +2832,13 @@ gText_082C2E41:: @ 82C2E41
.string "Oh… Okay!\n"
.string "I'll try to say that!\l"
.string "I might be too nervous to say it…\p"
- .string "Thank you, {PLAYER}{STRING 5}.\n"
+ .string "Thank you, {PLAYER}{KUN}.\n"
.string "I have to say good-bye now.\p"
.string "I'll obey all that you've taught me,\n"
- .string "{PLAYER}{STRING 5}, and do the best I can.$"
+ .string "{PLAYER}{KUN}, and do the best I can.$"
gText_082C2EF5:: @ 82C2EF5
- .string "Hm? You appear to be {PLAYER}{STRING 5}…\n"
+ .string "Hm? You appear to be {PLAYER}{KUN}…\n"
.string "But are you really?\l"
.string "Perhaps a clever {PLAYER} DOLL?\p"
.string "Oh, no, no, no, don't worry!\n"
diff --git a/data/specials.inc b/data/specials.inc
index b8c891113..fb66bb0a6 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -372,47 +372,47 @@ gSpecials:: @ 81DBA64
def_special SetSecretBaseSecretsTvFlags_LargeDecorationSpot
def_special SetSecretBaseSecretsTvFlags_SmallDecorationSpot
def_special SetSecretBaseSecretsTvFlags_Poster
- def_special sub_818D9C0
- def_special sub_818DAEC
- def_special sub_818DBE8
- def_special sub_818DC2C
- def_special sub_818DC60
- def_special sub_818DCC8
- def_special sub_818DD14
- def_special sub_818DD54
- def_special sub_818DD78
- def_special sub_818DE44
- def_special sub_818DE5C
- def_special sub_818DEA0
- def_special sub_818DEDC
- def_special sub_818E038
- def_special sub_818E06C
- def_special sub_818E2D8
- def_special sub_811A858
- def_special sub_818E2FC
- def_special sub_818E308
- def_special sub_818E358
- def_special sub_818E37C
- def_special sub_818E298
- def_special sub_818E39C
- def_special sub_818E3BC
- def_special sub_818E3E0
- def_special sub_818E430
- def_special sub_818E47C
- def_special sub_818E490
+ def_special SetLilycoveLadyGfx
+ def_special Script_GetLilycoveLadyId
+ def_special GetFavorLadyState
+ def_special BufferFavorLadyRequest
+ def_special HasAnotherPlayerGivenFavorLadyItem
+ def_special BufferFavorLadyItemName
+ def_special BufferFavorLadyPlayerName
+ def_special DidFavorLadyLikeItem
+ def_special Script_FavorLadyOpenBagMenu
+ def_special Script_DoesFavorLadyLikeItem
+ def_special IsFavorLadyThresholdMet
+ def_special FavorLadyGetPrize
+ def_special SetFavorLadyState_Complete
+ def_special GetQuizLadyState
+ def_special GetQuizAuthor
+ def_special IsQuizLadyWaitingForChallenger
+ def_special QuizLadyShowQuizQuestion
+ def_special QuizLadyGetPlayerAnswer
+ def_special IsQuizAnswerCorrect
+ def_special BufferQuizPrizeItem
+ def_special SetQuizLadyState_Complete
+ def_special BufferQuizAuthorNameAndCheckIfLady
+ def_special SetQuizLadyState_GivePrize
+ def_special ClearQuizLadyPlayerAnswer
+ def_special Script_QuizLadyOpenBagMenu
+ def_special ClearQuizLadyQuestionAndAnswer
+ def_special QuizLadySetCustomQuestion
+ def_special QuizLadyTakePrizeForCustomQuiz
def_special sub_813986C
- def_special sub_818E4A4
- def_special sub_818E510
- def_special sub_818E538
- def_special sub_818E274
- def_special sub_818E3EC
- def_special sub_818E8E0
- def_special sub_818E8B4
- def_special sub_818E914
- def_special sub_818E92C
- def_special sub_818E940
- def_special sub_818E960
- def_special sub_818E990
+ def_special QuizLadyRecordCustomQuizData
+ def_special QuizLadySetWaitingForChallenger
+ def_special BufferQuizCorrectAnswer
+ def_special BufferQuizPrizeName
+ def_special QuizLadyPickNewQuestion
+ def_special ShouldContestLadyShowGoOnAir
+ def_special HasPlayerGivenContestLadyPokeblock
+ def_special Script_BufferContestLadyCategoryAndMonName
+ def_special OpenPokeblockCaseForContestLady
+ def_special SetContestLadyGivenPokeblock
+ def_special GetContestLadyMonSpecies
+ def_special GetContestLadyCategory
def_special PutLilycoveContestLadyShowOnTheAir
def_special sub_813B880
def_special CallApprenticeFunction
diff --git a/data/text/match_call.inc b/data/text/match_call.inc
index b25b72ebf..376f36750 100644
--- a/data/text/match_call.inc
+++ b/data/text/match_call.inc
@@ -1,5 +1,5 @@
MatchCall_WildBattleText1:: @ 82A971C
- .string "Hi! {PLAYER}{STRING 5}, hello!\n"
+ .string "Hi! {PLAYER}{KUN}, hello!\n"
.string "This is {STR_VAR_1}.\p"
.string "I saw this {STR_VAR_2} a while back\n"
.string "but I couldn't catch it.\p"
@@ -7,7 +7,7 @@ MatchCall_WildBattleText1:: @ 82A971C
.string "Well, see you again!$"
MatchCall_WildBattleText2:: @ 82A9798
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's {STR_VAR_1}.\p"
.string "I tried to catch a nice {STR_VAR_2}\n"
.string "a little while ago.\p"
@@ -25,7 +25,7 @@ MatchCall_WildBattleText3:: @ 82A9813
.string "All right, see you!$"
MatchCall_WildBattleText4:: @ 82A98A8
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\p"
.string "You know the POKéMON {STR_VAR_2}?\n"
.string "I came close to getting one.\p"
@@ -36,7 +36,7 @@ MatchCall_WildBattleText4:: @ 82A98A8
.string "Okay, catch you later.$"
MatchCall_WildBattleText5:: @ 82A9977
- .string "Hiya, {PLAYER}{STRING 5}!\n"
+ .string "Hiya, {PLAYER}{KUN}!\n"
.string "It's {STR_VAR_1}.\l"
.string "Catching any POKéMON lately?\p"
.string "A little while ago I came close to\n"
@@ -44,7 +44,7 @@ MatchCall_WildBattleText5:: @ 82A9977
.string "Right, take care!$"
MatchCall_WildBattleText6:: @ 82A99FD
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\l"
.string "Caught any POKéMON lately?\p"
.string "I nearly nabbed one the other day.\n"
@@ -52,7 +52,7 @@ MatchCall_WildBattleText6:: @ 82A99FD
.string "You take care.$"
MatchCall_WildBattleText7:: @ 82A9A78
- .string "…Uh, {PLAYER}{STRING 5}?\n"
+ .string "…Uh, {PLAYER}{KUN}?\n"
.string "It's me, {STR_VAR_1}.\p"
.string "Oh, wait! Wait!\n"
.string "I can catch this {STR_VAR_2}…\p"
@@ -60,7 +60,7 @@ MatchCall_WildBattleText7:: @ 82A9A78
.string "That wasn't just close!$"
MatchCall_WildBattleText8:: @ 82A9AE8
- .string "Oh, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1} speaking.\p"
.string "Have you had success catching\n"
.string "POKéMON lately?\p"
@@ -70,7 +70,7 @@ MatchCall_WildBattleText8:: @ 82A9AE8
.string "See you again!$"
MatchCall_WildBattleText9:: @ 82A9BA7
- .string "Oh, {PLAYER}{STRING 5}, hi there!\n"
+ .string "Oh, {PLAYER}{KUN}, hi there!\n"
.string "This is {STR_VAR_1}!\p"
.string "So? Are you getting more POKéMON\n"
.string "together?\p"
@@ -79,7 +79,7 @@ MatchCall_WildBattleText9:: @ 82A9BA7
.string "See you!$"
MatchCall_WildBattleText10:: @ 82A9C36
- .string "Oh, {PLAYER}{STRING 5}, hello…\n"
+ .string "Oh, {PLAYER}{KUN}, hello…\n"
.string "This is {STR_VAR_1}.\p"
.string "Listen, I came within a whisker of\n"
.string "catching this {STR_VAR_2}…\p"
@@ -88,7 +88,7 @@ MatchCall_WildBattleText10:: @ 82A9C36
.string "See you around.$"
MatchCall_WildBattleText11:: @ 82A9CC8
- .string "Ah, {PLAYER}{STRING 5}.\n"
+ .string "Ah, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\l"
.string "How are things with you?\p"
.string "I tried to catch a wild {STR_VAR_2}\n"
@@ -96,7 +96,7 @@ MatchCall_WildBattleText11:: @ 82A9CC8
.string "I feel defeated…$"
MatchCall_WildBattleText12:: @ 82A9D44
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's me, {STR_VAR_1}.\l"
.string "Are you still catching POKéMON?\p"
.string "I've been trying to catch them\n"
@@ -104,7 +104,7 @@ MatchCall_WildBattleText12:: @ 82A9D44
.string "The way of POKéMON is deep!$"
MatchCall_WildBattleText13:: @ 82A9DD7
- .string "Ah, hello, {PLAYER}{STRING 5}!\n"
+ .string "Ah, hello, {PLAYER}{KUN}!\n"
.string "This is {STR_VAR_1}!\l"
.string "Have you been catching POKéMON?\p"
.string "I've been trying to catch them\n"
@@ -112,7 +112,7 @@ MatchCall_WildBattleText13:: @ 82A9DD7
.string "The way of POKéMON is deep!$"
MatchCall_WildBattleText14:: @ 82A9E70
- .string "Oh, hi, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, hi, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1}.\p"
.string "Just now, I tried to catch a cute\n"
.string "{STR_VAR_2}.\p"
@@ -131,7 +131,7 @@ MatchCall_WildBattleText15:: @ 82A9EFD
.string "See you around!$"
MatchCall_NegativeBattleText1:: @ 82A9FAB
- .string "Hi! {PLAYER}{STRING 5}, hello!\n"
+ .string "Hi! {PLAYER}{KUN}, hello!\n"
.string "This is {STR_VAR_1}.\p"
.string "I tried battling another TRAINER,\n"
.string "but I lost.\p"
@@ -139,7 +139,7 @@ MatchCall_NegativeBattleText1:: @ 82A9FAB
.string "Well, see you again!$"
MatchCall_NegativeBattleText2:: @ 82AA028
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's {STR_VAR_1}.\p"
.string "I challenged someone else after\n"
.string "we battled.\p"
@@ -188,7 +188,7 @@ MatchCall_NegativeBattleText7:: @ 82AA2A1
.string "See you.$"
MatchCall_NegativeBattleText8:: @ 82AA31B
- .string "Oh, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1} speaking.\p"
.string "How are your POKéMON doing?\n"
.string "I lost a match the other day.\p"
@@ -196,7 +196,7 @@ MatchCall_NegativeBattleText8:: @ 82AA31B
.string "See you again!$"
MatchCall_NegativeBattleText9:: @ 82AA3A8
- .string "Oh, {PLAYER}{STRING 5}, hi there!\n"
+ .string "Oh, {PLAYER}{KUN}, hi there!\n"
.string "This is {STR_VAR_1}!\p"
.string "Listen, listen, you have to hear\n"
.string "this!\p"
@@ -205,7 +205,7 @@ MatchCall_NegativeBattleText9:: @ 82AA3A8
.string "Oh, it burns me up!$"
MatchCall_NegativeBattleText10:: @ 82AA442
- .string "Oh, {PLAYER}{STRING 5}, hello…\n"
+ .string "Oh, {PLAYER}{KUN}, hello…\n"
.string "This is {STR_VAR_1}.\p"
.string "A little earlier, I was in a battle.\n"
.string "I lost, though.\p"
@@ -213,14 +213,14 @@ MatchCall_NegativeBattleText10:: @ 82AA442
.string "See you around.$"
MatchCall_NegativeBattleText11:: @ 82AA4C5
- .string "Ah, {PLAYER}{STRING 5}.\n"
+ .string "Ah, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\l"
.string "How are your POKéMON?\p"
.string "I just lost yet another battle.\p"
.string "Well, see you!$"
MatchCall_NegativeBattleText12:: @ 82AA520
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's me, {STR_VAR_1}.\l"
.string "Are you still battling hard?\p"
.string "As for me, I lost recently, so I've\n"
@@ -228,16 +228,16 @@ MatchCall_NegativeBattleText12:: @ 82AA520
.string "Let's meet again.$"
MatchCall_NegativeBattleText13:: @ 82AA5AD
- .string "Ah, hello, {PLAYER}{STRING 5}!\n"
+ .string "Ah, hello, {PLAYER}{KUN}!\n"
.string "This is {STR_VAR_1}!\p"
.string "I hope you've been keeping well.\p"
.string "I was in a battle just a little\n"
.string "while before this.\p"
- .string "{PLAYER}{STRING 5}, try to be active like me.\n"
+ .string "{PLAYER}{KUN}, try to be active like me.\n"
.string "See you again!$"
MatchCall_NegativeBattleText14:: @ 82AA64D
- .string "Oh, hi, {PLAYER}{STRING 5}.\n"
+ .string "Oh, hi, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "Are you doing good?\p"
.string "You should go home every so often,\n"
@@ -245,7 +245,7 @@ MatchCall_NegativeBattleText14:: @ 82AA64D
.string "Bye-bye!$"
MatchCall_PositiveBattleText1:: @ 82AA6AF
- .string "Hi! {PLAYER}{STRING 5}, hello!\n"
+ .string "Hi! {PLAYER}{KUN}, hello!\n"
.string "This is {STR_VAR_1}!\p"
.string "I battled another TRAINER earlier.\n"
.string "I won! I won!\p"
@@ -253,7 +253,7 @@ MatchCall_PositiveBattleText1:: @ 82AA6AF
.string "for me. This is so great!$"
MatchCall_PositiveBattleText2:: @ 82AA730
- .string "Hello, {PLAYER}{STRING 5}!\n"
+ .string "Hello, {PLAYER}{KUN}!\n"
.string "It's {STR_VAR_1}!\p"
.string "I had a battle yesterday and\n"
.string "I won! It's fantastic!$"
@@ -276,7 +276,7 @@ MatchCall_PositiveBattleText4:: @ 82AA81C
.string "inspired showing.$"
MatchCall_PositiveBattleText5:: @ 82AA88C
- .string "Hiya, {PLAYER}{STRING 5}!\n"
+ .string "Hiya, {PLAYER}{KUN}!\n"
.string "It's {STR_VAR_1}.\p"
.string "How are things with you?\n"
.string "Battling much?\p"
@@ -286,7 +286,7 @@ MatchCall_PositiveBattleText5:: @ 82AA88C
.string "next time! Right, take care!$"
MatchCall_PositiveBattleText6:: @ 82AA934
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\p"
.string "How's it going for you?\p"
.string "I've been riding a hot streak.\n"
@@ -295,7 +295,7 @@ MatchCall_PositiveBattleText6:: @ 82AA934
.string "I'm sure not going to lose!$"
MatchCall_PositiveBattleText7:: @ 82AA9D3
- .string "{PLAYER}{STRING 5}?\n"
+ .string "{PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here.\p"
.string "My {STR_VAR_2} is a force!\n"
.string "It won me another battle just now!\p"
@@ -303,7 +303,7 @@ MatchCall_PositiveBattleText7:: @ 82AA9D3
.string "with you.$"
MatchCall_PositiveBattleText8:: @ 82AAA40
- .string "Oh, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1} speaking.\p"
.string "I hope you've been well.\n"
.string "I wanted to tell you I just won.\p"
@@ -312,7 +312,7 @@ MatchCall_PositiveBattleText8:: @ 82AAA40
.string "See you again!$"
MatchCall_PositiveBattleText9:: @ 82AAAE4
- .string "Oh, {PLAYER}{STRING 5}, hi there!\n"
+ .string "Oh, {PLAYER}{KUN}, hi there!\n"
.string "This is {STR_VAR_1}!\p"
.string "How are your POKéMON holding up?\n"
.string "Mine just won a battle!\p"
@@ -322,7 +322,7 @@ MatchCall_PositiveBattleText9:: @ 82AAAE4
.string "See you again!$"
MatchCall_PositiveBattleText10:: @ 82AAB8C
- .string "Oh, {PLAYER}{STRING 5}, hello…\n"
+ .string "Oh, {PLAYER}{KUN}, hello…\n"
.string "This is {STR_VAR_1}.\p"
.string "How has life been treating you?\p"
.string "My POKéMON appear to be charged\n"
@@ -331,7 +331,7 @@ MatchCall_PositiveBattleText10:: @ 82AAB8C
.string "See you around.$"
MatchCall_PositiveBattleText11:: @ 82AAC25
- .string "Ah, {PLAYER}{STRING 5}.\n"
+ .string "Ah, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "Been in any battles lately?\n"
.string "I just won another one today!\p"
@@ -339,7 +339,7 @@ MatchCall_PositiveBattleText11:: @ 82AAC25
.string "Well, see you!$"
MatchCall_PositiveBattleText12:: @ 82AAC9D
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's me, {STR_VAR_1}.\p"
.string "I trust you've been well?\n"
.string "I'm still bursting with life!\p"
@@ -348,7 +348,7 @@ MatchCall_PositiveBattleText12:: @ 82AAC9D
.string "youngsters yet!$"
MatchCall_PositiveBattleText13:: @ 82AAD41
- .string "Ah, hello, {PLAYER}{STRING 5}!\n"
+ .string "Ah, hello, {PLAYER}{KUN}!\n"
.string "This is {STR_VAR_1}!\p"
.string "I hope you've been keeping well.\n"
.string "I still have a bounce in my step!\p"
@@ -358,12 +358,12 @@ MatchCall_PositiveBattleText13:: @ 82AAD41
.string "See you again!$"
MatchCall_PositiveBattleText14:: @ 82AAE00
- .string "Oh, hi, {PLAYER}{STRING 5}.\n"
+ .string "Oh, hi, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "I was in a battle recently, and my\n"
.string "{STR_VAR_2} was exceptional!\p"
.string "I wish you could have seen it,\n"
- .string "{PLAYER}{STRING 5}. Bye-bye!$"
+ .string "{PLAYER}{KUN}. Bye-bye!$"
MatchCall_SameRouteBattleRequestText1:: @ 82AAE7F
.string "Hi! {PLAYER}, hello!\n"
@@ -392,7 +392,7 @@ MatchCall_SameRouteBattleRequestText3:: @ 82AAF69
.string "I'll be waiting! Catch you soon!$"
MatchCall_SameRouteBattleRequestText4:: @ 82AB010
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\p"
.string "Whereabouts are you now?\n"
.string "Huh? {STR_VAR_2}?\p"
@@ -400,7 +400,7 @@ MatchCall_SameRouteBattleRequestText4:: @ 82AB010
.string "I'll wait for you. See you!$"
MatchCall_SameRouteBattleRequestText5:: @ 82AB076
- .string "Hiya, {PLAYER}{STRING 5}!\n"
+ .string "Hiya, {PLAYER}{KUN}!\n"
.string "It's {STR_VAR_1}.\l"
.string "How are things with you?\p"
.string "You're where now?\n"
@@ -411,7 +411,7 @@ MatchCall_SameRouteBattleRequestText5:: @ 82AB076
.string "See you soon!$"
MatchCall_SameRouteBattleRequestText6:: @ 82AB11A
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\l"
.string "How are your POKéMON keeping?\p"
.string "Oh, is that right? You're around\n"
@@ -422,7 +422,7 @@ MatchCall_SameRouteBattleRequestText6:: @ 82AB11A
.string "See you!$"
MatchCall_SameRouteBattleRequestText7:: @ 82AB1B4
- .string "…Er, {PLAYER}{STRING 5}?\n"
+ .string "…Er, {PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here…\p"
.string "Oh, you happen to be around\n"
.string "{STR_VAR_2}?\p"
@@ -432,7 +432,7 @@ MatchCall_SameRouteBattleRequestText7:: @ 82AB1B4
.string "I'll wait for you.$"
MatchCall_SameRouteBattleRequestText8:: @ 82AB23D
- .string "Oh, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1} speaking.\p"
.string "I hope you're doing well.\n"
.string "Oh, you're near {STR_VAR_2}.\p"
@@ -442,7 +442,7 @@ MatchCall_SameRouteBattleRequestText8:: @ 82AB23D
.string "See you soon!$"
MatchCall_SameRouteBattleRequestText9:: @ 82AB2E9
- .string "Oh, {PLAYER}{STRING 5}, hi there!\n"
+ .string "Oh, {PLAYER}{KUN}, hi there!\n"
.string "This is {STR_VAR_1}!\p"
.string "Are you keeping up?\n"
.string "Oh, you're near {STR_VAR_2}?\p"
@@ -451,7 +451,7 @@ MatchCall_SameRouteBattleRequestText9:: @ 82AB2E9
.string "Don't keep me waiting too long!$"
MatchCall_SameRouteBattleRequestText10:: @ 82AB382
- .string "Oh, {PLAYER}{STRING 5}, hello…\n"
+ .string "Oh, {PLAYER}{KUN}, hello…\n"
.string "This is {STR_VAR_1}.\p"
.string "How are things with you?\n"
.string "Oh, you're near {STR_VAR_2}.\p"
@@ -460,7 +460,7 @@ MatchCall_SameRouteBattleRequestText10:: @ 82AB382
.string "Be quick!$"
MatchCall_SameRouteBattleRequestText11:: @ 82AB410
- .string "Ah, {PLAYER}{STRING 5}.\n"
+ .string "Ah, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "Ah, so where you are now is\n"
.string "{STR_VAR_2}?\p"
@@ -470,7 +470,7 @@ MatchCall_SameRouteBattleRequestText11:: @ 82AB410
.string "See you real quick!$"
MatchCall_SameRouteBattleRequestText12:: @ 82AB4B0
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's me, {STR_VAR_1}.\l"
.string "Where might you be now?\p"
.string "{STR_VAR_2}?\n"
@@ -481,7 +481,7 @@ MatchCall_SameRouteBattleRequestText12:: @ 82AB4B0
.string "See you!$"
MatchCall_SameRouteBattleRequestText13:: @ 82AB538
- .string "Ah, hello, {PLAYER}{STRING 5}!\n"
+ .string "Ah, hello, {PLAYER}{KUN}!\n"
.string "This is {STR_VAR_1}!\p"
.string "I hope you've been keeping well.\n"
.string "Oh, you're near {STR_VAR_2}?\p"
@@ -491,7 +491,7 @@ MatchCall_SameRouteBattleRequestText13:: @ 82AB538
.string "Bye for now.$"
MatchCall_SameRouteBattleRequestText14:: @ 82AB5E4
- .string "Oh, hi, {PLAYER}{STRING 5}.\n"
+ .string "Oh, hi, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "You're what? …{STR_VAR_2}?\n"
.string "That's very close.\p"
@@ -527,7 +527,7 @@ MatchCall_DifferentRouteBattleRequestText3:: @ 82AB73C
.string "{STR_VAR_2}.$"
MatchCall_DifferentRouteBattleRequestText4:: @ 82AB808
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\l"
.string "How are things with you?\p"
.string "My POKéMON have grown pretty\n"
@@ -538,7 +538,7 @@ MatchCall_DifferentRouteBattleRequestText4:: @ 82AB808
.string "{STR_VAR_2}, okay?$"
MatchCall_DifferentRouteBattleRequestText5:: @ 82AB8B7
- .string "Hiya, {PLAYER}{STRING 5}!\n"
+ .string "Hiya, {PLAYER}{KUN}!\n"
.string "It's {STR_VAR_1}.\p"
.string "My POKéMON are growing up in\n"
.string "decent ways.\p"
@@ -548,7 +548,7 @@ MatchCall_DifferentRouteBattleRequestText5:: @ 82AB8B7
.string "{STR_VAR_2}. See you soon!$"
MatchCall_DifferentRouteBattleRequestText6:: @ 82AB95D
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\l"
.string "I hope you're on top of things.\p"
.string "I was thinking I'd like another\n"
@@ -558,7 +558,7 @@ MatchCall_DifferentRouteBattleRequestText6:: @ 82AB95D
.string "See you!$"
MatchCall_DifferentRouteBattleRequestText7:: @ 82ABA03
- .string "…Er, {PLAYER}{STRING 5}?\n"
+ .string "…Er, {PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here…\l"
.string "So? Are your POKéMON growing?\p"
.string "Mine sure got stronger.\n"
@@ -568,7 +568,7 @@ MatchCall_DifferentRouteBattleRequestText7:: @ 82ABA03
.string "See you around.$"
MatchCall_DifferentRouteBattleRequestText8:: @ 82ABA9F
- .string "Oh, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1} speaking.\p"
.string "I hope you're doing well.\n"
.string "My POKéMON are very frisky.\p"
@@ -578,48 +578,48 @@ MatchCall_DifferentRouteBattleRequestText8:: @ 82ABA9F
.string "Until then, good-bye!$"
MatchCall_DifferentRouteBattleRequestText9:: @ 82ABB62
- .string "Oh, {PLAYER}{STRING 5}, hi there!\n"
+ .string "Oh, {PLAYER}{KUN}, hi there!\n"
.string "This is {STR_VAR_1}!\l"
.string "How are your POKéMON doing?\p"
.string "My POKéMON keep getting better.\n"
- .string "I'd like to show you, {PLAYER}{STRING 5}.\p"
+ .string "I'd like to show you, {PLAYER}{KUN}.\p"
.string "I'm around {STR_VAR_2} now,\n"
.string "so let's battle if you're close by.\p"
.string "Hope I see you soon!$"
MatchCall_DifferentRouteBattleRequestText10:: @ 82ABC26
- .string "Oh, {PLAYER}{STRING 5}, hello…\n"
+ .string "Oh, {PLAYER}{KUN}, hello…\n"
.string "This is {STR_VAR_1}.\l"
.string "So, how are things with you?\p"
.string "My POKéMON have grown much\n"
.string "stronger than before.\p"
.string "I'd love another battle with you,\n"
- .string "{PLAYER}{STRING 5}.\p"
+ .string "{PLAYER}{KUN}.\p"
.string "I'll be around {STR_VAR_2}.\n"
.string "Come see me if you're close.$"
MatchCall_DifferentRouteBattleRequestText11:: @ 82ABCE9
- .string "Ah, {PLAYER}{STRING 5}.\n"
+ .string "Ah, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\l"
.string "Where might you be now?\p"
.string "My POKéMON are full of life.\n"
.string "They appear to be looking forward\l"
- .string "to seeing your POKéMON, {PLAYER}{STRING 5}.\p"
+ .string "to seeing your POKéMON, {PLAYER}{KUN}.\p"
.string "I'm around {STR_VAR_2} now.\n"
.string "I hope you'll seek us out.$"
MatchCall_DifferentRouteBattleRequestText12:: @ 82ABDA2
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's me, {STR_VAR_1}.\p"
.string "I should tell you, my POKéMON have\n"
.string "grown to be quite robust lately.\p"
.string "I would like to see them in a battle\n"
- .string "with you, {PLAYER}{STRING 5}.\p"
+ .string "with you, {PLAYER}{KUN}.\p"
.string "We'll be around {STR_VAR_2}.\n"
.string "Come see us anytime!$"
MatchCall_DifferentRouteBattleRequestText13:: @ 82ABE5E
- .string "Ah, hello, {PLAYER}{STRING 5}!\n"
+ .string "Ah, hello, {PLAYER}{KUN}!\n"
.string "This is {STR_VAR_1}!\l"
.string "Are your POKéMON keeping well?\p"
.string "My POKéMON have been so healthy,\n"
@@ -630,13 +630,13 @@ MatchCall_DifferentRouteBattleRequestText13:: @ 82ABE5E
.string "do come see us.$"
MatchCall_DifferentRouteBattleRequestText14:: @ 82ABF36
- .string "Oh, hi, {PLAYER}{STRING 5}.\n"
+ .string "Oh, hi, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\l"
.string "Keeping well, I hope.\p"
.string "Oh, yes! My POKéMON are\n"
.string "much stronger than before.\p"
.string "Don't you think we ought to have\n"
- .string "a battle, {PLAYER}{STRING 5}?\p"
+ .string "a battle, {PLAYER}{KUN}?\p"
.string "We'll be waiting for you around\n"
.string "{STR_VAR_2}.\p"
.string "Come see us anytime, okay?$"
@@ -884,14 +884,14 @@ MatchCall_PersonalizedText23:: @ 82AD2A8
.string "When there's a strong TRAINER\n"
.string "nearby, I can sometimes sense that\l"
.string "somehow.\p"
- .string "Did you pass close by, {PLAYER}{STRING 5}?\n"
+ .string "Did you pass close by, {PLAYER}{KUN}?\n"
.string "Maybe it was you.\p"
.string "I'll be waiting for your visit.\n"
.string "Bye!$"
MatchCall_PersonalizedText24:: @ 82AD34F
.string "Hello, this is {STR_VAR_1}.\n"
- .string "You sound well, {PLAYER}{STRING 5}.\p"
+ .string "You sound well, {PLAYER}{KUN}.\p"
.string "I've traveled around the world,\n"
.string "but I must say I've taken a great\l"
.string "shine to this region.\p"
@@ -1007,7 +1007,7 @@ MatchCall_PersonalizedText32:: @ 82ADC92
.string "It's kind of hard to explain, but…\l"
.string "How would I say this now…\l"
.string "My shorts feel silkier!\p"
- .string "And when I battled you, {PLAYER}{STRING 5},\n"
+ .string "And when I battled you, {PLAYER}{KUN},\n"
.string "my shorts felt icky and coarse.\p"
.string "… … … … … …\n"
.string "You didn't really believe that?\l"
@@ -1117,7 +1117,7 @@ MatchCall_PersonalizedText40:: @ 82AE5CD
.string "test of human endurance! Bye!$"
MatchCall_PersonalizedText41:: @ 82AE698
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\p"
.string "How are your POKéMON doing?\p"
.string "My DRAGON POKéMON appear to be\n"
@@ -1171,7 +1171,7 @@ MatchCall_PersonalizedText46:: @ 82AE998
.string "I'd better go!$"
MatchCall_PersonalizedText47:: @ 82AEA8F
- .string "Oh, {PLAYER}{STRING 5}, hello!\n"
+ .string "Oh, {PLAYER}{KUN}, hello!\n"
.string "This is {STR_VAR_1}.\l"
.string "I'm up in the mountains now.\p"
.string "But the ground is too bumpy.\n"
@@ -1241,7 +1241,7 @@ MatchCall_PersonalizedText53:: @ 82AEEF4
MatchCall_PersonalizedText54:: @ 82AEFDA
.string "Hi, it's {STR_VAR_1}. You know,\n"
.string "the TRAINER who's always prepared!\p"
- .string "{PLAYER}{STRING 5}, do you have enough items?\n"
+ .string "{PLAYER}{KUN}, do you have enough items?\n"
.string "Are your POKéMON fit for action?\p"
.string "Keeping everything perfect around\n"
.string "you all the time is the secret to\l"
@@ -1326,7 +1326,7 @@ MatchCall_PersonalizedText60:: @ 82AF671
.string "enjoy POKéMON whatever your age.\p"
.string "Wouldn't it be good if you had\n"
.string "a partnership like ours?\p"
- .string "Of course, {PLAYER}{STRING 5}, you already\n"
+ .string "Of course, {PLAYER}{KUN}, you already\n"
.string "enjoy the trust and companionship\l"
.string "of your POKéMON now.\p"
.string "You have the makings of long and\n"
@@ -1344,7 +1344,7 @@ MatchCall_PersonalizedText61:: @ 82AF7D8
.string "was weak to make an impression!\p"
.string "She always chews me out whether\n"
.string "we win or lose!\p"
- .string "{PLAYER}{STRING 5}, can you say something\n"
+ .string "{PLAYER}{KUN}, can you say something\n"
.string "to her next time?\p"
.string "Okay, see you!$"
@@ -1412,7 +1412,7 @@ MatchCall_BattleFrontierStreakText3:: @ 82AFCFF
.string "Catch you soon!$"
MatchCall_BattleFrontierStreakText4:: @ 82AFDA7
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here. What's up?\p"
.string "There's a rumor going around that\n"
.string "you strung together {STR_VAR_3} straight\l"
@@ -1421,7 +1421,7 @@ MatchCall_BattleFrontierStreakText4:: @ 82AFDA7
.string "See you!$"
MatchCall_BattleFrontierStreakText5:: @ 82AFE3D
- .string "Hiya, {PLAYER}{STRING 5}!\n"
+ .string "Hiya, {PLAYER}{KUN}!\n"
.string "It's {STR_VAR_1}.\p"
.string "You were at the {STR_VAR_2}\n"
.string "and won {STR_VAR_3} battles in a row?\l"
@@ -1430,7 +1430,7 @@ MatchCall_BattleFrontierStreakText5:: @ 82AFE3D
.string "See you soon!$"
MatchCall_BattleFrontierStreakText6:: @ 82AFECA
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here. How are you?\p"
.string "By the way, I heard you pulled off\n"
.string "the feat of {STR_VAR_3} straight wins at\l"
@@ -1439,7 +1439,7 @@ MatchCall_BattleFrontierStreakText6:: @ 82AFECA
.string "raising my team.$"
MatchCall_BattleFrontierStreakText7:: @ 82AFF64
- .string "…Er, {PLAYER}{STRING 5}?\n"
+ .string "…Er, {PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here…\p"
.string "Oh, yeah, you were over at\n"
.string "the {STR_VAR_2}, right?\p"
@@ -1448,7 +1448,7 @@ MatchCall_BattleFrontierStreakText7:: @ 82AFF64
.string "I have to go!$"
MatchCall_BattleFrontierStreakText8:: @ 82AFFF0
- .string "Oh, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1} speaking.\l"
.string "I hope you're doing well.\p"
.string "Oh, but, you are. I've heard that\n"
@@ -1458,7 +1458,7 @@ MatchCall_BattleFrontierStreakText8:: @ 82AFFF0
.string "I hope you stay successful.$"
MatchCall_BattleFrontierStreakText9:: @ 82B00B5
- .string "Oh, {PLAYER}{STRING 5}, hi there!\n"
+ .string "Oh, {PLAYER}{KUN}, hi there!\n"
.string "This is {STR_VAR_1}!\p"
.string "I heard! Your {STR_VAR_3}-win streak at\n"
.string "the {STR_VAR_2}!\p"
@@ -1466,7 +1466,7 @@ MatchCall_BattleFrontierStreakText9:: @ 82B00B5
.string "I'd better try harder, too!$"
MatchCall_BattleFrontierStreakText10:: @ 82B0129
- .string "Oh, {PLAYER}{STRING 5}, hello…\n"
+ .string "Oh, {PLAYER}{KUN}, hello…\n"
.string "This is {STR_VAR_1}.\p"
.string "You won {STR_VAR_3} straight battles at\n"
.string "the {STR_VAR_2}?\p"
@@ -1474,7 +1474,7 @@ MatchCall_BattleFrontierStreakText10:: @ 82B0129
.string "I need to work harder.$"
MatchCall_BattleFrontierStreakText11:: @ 82B01A5
- .string "Ah, {PLAYER}{STRING 5}.\n"
+ .string "Ah, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "I hear you're the terror of\n"
.string "the {STR_VAR_2}?\p"
@@ -1484,7 +1484,7 @@ MatchCall_BattleFrontierStreakText11:: @ 82B01A5
.string "I wonder how many I can win?$"
MatchCall_BattleFrontierStreakText12:: @ 82B0232
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's me, {STR_VAR_1}.\l"
.string "Are you keeping well?\p"
.string "Someone passed on word about you.\n"
@@ -1494,7 +1494,7 @@ MatchCall_BattleFrontierStreakText12:: @ 82B0232
.string "See you!$"
MatchCall_BattleFrontierStreakText13:: @ 82B02D9
- .string "Ah, hello, {PLAYER}{STRING 5}!\n"
+ .string "Ah, hello, {PLAYER}{KUN}!\n"
.string "This is {STR_VAR_1}!\l"
.string "I hope you've been keeping well.\p"
.string "They say you won {STR_VAR_3} straight\n"
@@ -1503,7 +1503,7 @@ MatchCall_BattleFrontierStreakText13:: @ 82B02D9
.string "Bye now.$"
MatchCall_BattleFrontierStreakText14:: @ 82B0366
- .string "Oh, hi, {PLAYER}{STRING 5}.\n"
+ .string "Oh, hi, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "I heard about you!\n"
.string "Didn't you just win {STR_VAR_3} battles in\l"
@@ -1538,7 +1538,7 @@ MatchCall_BattleFrontierRecordStreakText3:: @ 82B04DE
.string "Catch you soon!$"
MatchCall_BattleFrontierRecordStreakText4:: @ 82B0586
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here. What's up?\p"
.string "There's a rumor going around that\n"
.string "you strung together {STR_VAR_3} straight\l"
@@ -1547,7 +1547,7 @@ MatchCall_BattleFrontierRecordStreakText4:: @ 82B0586
.string "See you!$"
MatchCall_BattleFrontierRecordStreakText5:: @ 82B061C
- .string "Hiya, {PLAYER}{STRING 5}!\n"
+ .string "Hiya, {PLAYER}{KUN}!\n"
.string "It's {STR_VAR_1}.\p"
.string "You were at the {STR_VAR_2}\n"
.string "and won {STR_VAR_3} battles in a row?\l"
@@ -1556,7 +1556,7 @@ MatchCall_BattleFrontierRecordStreakText5:: @ 82B061C
.string "See you soon!$"
MatchCall_BattleFrontierRecordStreakText6:: @ 82B06A3
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here. How are you?\p"
.string "By the way, I heard you pulled off\n"
.string "the feat of {STR_VAR_3} straight wins at\l"
@@ -1565,7 +1565,7 @@ MatchCall_BattleFrontierRecordStreakText6:: @ 82B06A3
.string "See you soon!$"
MatchCall_BattleFrontierRecordStreakText7:: @ 82B073B
- .string "…Er, {PLAYER}{STRING 5}?\n"
+ .string "…Er, {PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here…\p"
.string "Oh, yeah, you were over at\n"
.string "the {STR_VAR_2}, right?\p"
@@ -1574,7 +1574,7 @@ MatchCall_BattleFrontierRecordStreakText7:: @ 82B073B
.string "I have to go!$"
MatchCall_BattleFrontierRecordStreakText8:: @ 82B07C7
- .string "Oh, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1} speaking.\l"
.string "I hope you're doing well.\p"
.string "Oh, but, you are. I've heard that\n"
@@ -1584,7 +1584,7 @@ MatchCall_BattleFrontierRecordStreakText8:: @ 82B07C7
.string "I'd better work on my POKéMON, too!$"
MatchCall_BattleFrontierRecordStreakText9:: @ 82B0894
- .string "Oh, {PLAYER}{STRING 5}, hi there!\n"
+ .string "Oh, {PLAYER}{KUN}, hi there!\n"
.string "This is {STR_VAR_1}!\p"
.string "I heard! Your {STR_VAR_3}-win streak at\n"
.string "the {STR_VAR_2}!\p"
@@ -1592,7 +1592,7 @@ MatchCall_BattleFrontierRecordStreakText9:: @ 82B0894
.string "I'd better try harder, too!$"
MatchCall_BattleFrontierRecordStreakText10:: @ 82B0908
- .string "Oh, {PLAYER}{STRING 5}, hello…\n"
+ .string "Oh, {PLAYER}{KUN}, hello…\n"
.string "This is {STR_VAR_1}.\p"
.string "You won {STR_VAR_3} straight battles at\n"
.string "the {STR_VAR_2}?\p"
@@ -1600,7 +1600,7 @@ MatchCall_BattleFrontierRecordStreakText10:: @ 82B0908
.string "I need to work harder.$"
MatchCall_BattleFrontierRecordStreakText11:: @ 82B0984
- .string "Ah, {PLAYER}{STRING 5}.\n"
+ .string "Ah, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "I hear you're the terror of\n"
.string "the {STR_VAR_2}?\p"
@@ -1610,7 +1610,7 @@ MatchCall_BattleFrontierRecordStreakText11:: @ 82B0984
.string "I wonder how many I can win?$"
MatchCall_BattleFrontierRecordStreakText12:: @ 82B0A11
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's me, {STR_VAR_1}.\l"
.string "Are you keeping well?\p"
.string "Someone passed on word about you.\n"
@@ -1620,7 +1620,7 @@ MatchCall_BattleFrontierRecordStreakText12:: @ 82B0A11
.string "See you!$"
MatchCall_BattleFrontierRecordStreakText13:: @ 82B0AB8
- .string "Ah, hello, {PLAYER}{STRING 5}!\n"
+ .string "Ah, hello, {PLAYER}{KUN}!\n"
.string "This is {STR_VAR_1}!\l"
.string "I hope you've been keeping well.\p"
.string "They say you won {STR_VAR_3} straight\n"
@@ -1629,7 +1629,7 @@ MatchCall_BattleFrontierRecordStreakText13:: @ 82B0AB8
.string "Bye now.$"
MatchCall_BattleFrontierRecordStreakText14:: @ 82B0B45
- .string "Oh, hi, {PLAYER}{STRING 5}.\n"
+ .string "Oh, hi, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\l"
.string "I heard about you!\p"
.string "Didn't you just win {STR_VAR_3} battles in\n"
@@ -1664,7 +1664,7 @@ MatchCall_BattleDomeText3:: @ 82B0CC7
.string "Catch you soon!$"
MatchCall_BattleDomeText4:: @ 82B0D4A
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\p"
.string "I heard you became the champion\n"
.string "at the {STR_VAR_2} {STR_VAR_3} times.\p"
@@ -1672,7 +1672,7 @@ MatchCall_BattleDomeText4:: @ 82B0D4A
.string "I'll try to keep up!$"
MatchCall_BattleDomeText5:: @ 82B0DC8
- .string "Hiya, {PLAYER}{STRING 5}!\n"
+ .string "Hiya, {PLAYER}{KUN}!\n"
.string "It's {STR_VAR_1}.\p"
.string "I heard you won {STR_VAR_3} times\n"
.string "outright at the {STR_VAR_2}.\p"
@@ -1680,7 +1680,7 @@ MatchCall_BattleDomeText5:: @ 82B0DC8
.string "See you soon!$"
MatchCall_BattleDomeText6:: @ 82B0E35
- .string "Hey, {PLAYER}{STRING 5}?\n"
+ .string "Hey, {PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here. How are you?\p"
.string "By the way, I heard you became\n"
.string "the champion {STR_VAR_3} times at\l"
@@ -1689,7 +1689,7 @@ MatchCall_BattleDomeText6:: @ 82B0E35
.string "you pull farther ahead.$"
MatchCall_BattleDomeText7:: @ 82B0ED1
- .string "{PLAYER}{STRING 5}?\n"
+ .string "{PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here.\p"
.string "You were at the {STR_VAR_2}\n"
.string "and became the champ {STR_VAR_3} times?\p"
@@ -1699,7 +1699,7 @@ MatchCall_BattleDomeText7:: @ 82B0ED1
.string "Okay, bye.$"
MatchCall_BattleDomeText8:: @ 82B0F72
- .string "Oh, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1} speaking.\l"
.string "I hope you're doing well.\l"
.string "Oh, but, you are.\p"
@@ -1709,7 +1709,7 @@ MatchCall_BattleDomeText8:: @ 82B0F72
.string "See you again.$"
MatchCall_BattleDomeText9:: @ 82B102A
- .string "Oh, {PLAYER}{STRING 5}, hi there!\n"
+ .string "Oh, {PLAYER}{KUN}, hi there!\n"
.string "This is {STR_VAR_1}!\p"
.string "I heard! You took the title\n"
.string "{STR_VAR_3} times at the {STR_VAR_2}!\p"
@@ -1717,7 +1717,7 @@ MatchCall_BattleDomeText9:: @ 82B102A
.string "I'd better try harder, too!$"
MatchCall_BattleDomeText10:: @ 82B10A7
- .string "Oh, {PLAYER}{STRING 5}, hello.\n"
+ .string "Oh, {PLAYER}{KUN}, hello.\n"
.string "This is {STR_VAR_1}.\p"
.string "You won {STR_VAR_3} straight times at\n"
.string "the {STR_VAR_2}?\p"
@@ -1725,7 +1725,7 @@ MatchCall_BattleDomeText10:: @ 82B10A7
.string "I need to work harder.$"
MatchCall_BattleDomeText11:: @ 82B1121
- .string "Ah, {PLAYER}{STRING 5}.\n"
+ .string "Ah, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "I hear you're the terror of\n"
.string "the {STR_VAR_2}?\p"
@@ -1737,7 +1737,7 @@ MatchCall_BattleDomeText11:: @ 82B1121
.string "Well, see you!$"
MatchCall_BattleDomeText12:: @ 82B11D3
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's me, {STR_VAR_1}.\l"
.string "Are you keeping well?\p"
.string "You've won {STR_VAR_3} events at a place\n"
@@ -1746,7 +1746,7 @@ MatchCall_BattleDomeText12:: @ 82B11D3
.string "See you!$"
MatchCall_BattleDomeText13:: @ 82B124D
- .string "Ah, hello, {PLAYER}{STRING 5}!\n"
+ .string "Ah, hello, {PLAYER}{KUN}!\n"
.string "This is {STR_VAR_1}!\l"
.string "I hope you've been keeping well.\p"
.string "They say you won {STR_VAR_3} events\n"
@@ -1755,7 +1755,7 @@ MatchCall_BattleDomeText13:: @ 82B124D
.string "Bye now.$"
MatchCall_BattleDomeText14:: @ 82B12D0
- .string "Oh, hi, {PLAYER}{STRING 5}.\n"
+ .string "Oh, hi, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\l"
.string "I heard about you!\p"
.string "Didn't you win {STR_VAR_3} titles\n"
@@ -1790,7 +1790,7 @@ MatchCall_BattlePikeText3:: @ 82B142B
.string "Catch you soon!$"
MatchCall_BattlePikeText4:: @ 82B14B4
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\p"
.string "I heard you blew through {STR_VAR_3} rooms\n"
.string "at the {STR_VAR_2}.\p"
@@ -1798,7 +1798,7 @@ MatchCall_BattlePikeText4:: @ 82B14B4
.string "try to keep up!$"
MatchCall_BattlePikeText5:: @ 82B1525
- .string "Hiya, {PLAYER}{STRING 5}!\n"
+ .string "Hiya, {PLAYER}{KUN}!\n"
.string "It's {STR_VAR_1}.\p"
.string "I heard you got past {STR_VAR_3} rooms\n"
.string "at the {STR_VAR_2}.\p"
@@ -1806,7 +1806,7 @@ MatchCall_BattlePikeText5:: @ 82B1525
.string "See you soon!$"
MatchCall_BattlePikeText6:: @ 82B158E
- .string "Hey, {PLAYER}{STRING 5}?\n"
+ .string "Hey, {PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here. How are you?\p"
.string "By the way, I heard you got through\n"
.string "{STR_VAR_3} rooms at the {STR_VAR_2}.\p"
@@ -1814,7 +1814,7 @@ MatchCall_BattlePikeText6:: @ 82B158E
.string "you pull further ahead.$"
MatchCall_BattlePikeText7:: @ 82B1622
- .string "{PLAYER}{STRING 5}?\n"
+ .string "{PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here.\p"
.string "You were at the {STR_VAR_2}\n"
.string "and won your way past {STR_VAR_3} rooms?\p"
@@ -1823,7 +1823,7 @@ MatchCall_BattlePikeText7:: @ 82B1622
.string "Okay, bye.$"
MatchCall_BattlePikeText8:: @ 82B169D
- .string "Oh, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1} speaking.\l"
.string "I hope you're doing well.\l"
.string "Oh, but, you are.\p"
@@ -1834,7 +1834,7 @@ MatchCall_BattlePikeText8:: @ 82B169D
.string "See you again.$"
MatchCall_BattlePikeText9:: @ 82B1775
- .string "Oh, {PLAYER}{STRING 5}, hi there!\n"
+ .string "Oh, {PLAYER}{KUN}, hi there!\n"
.string "This is {STR_VAR_1}!\p"
.string "I heard! You won your way through\n"
.string "{STR_VAR_3} rooms at the {STR_VAR_2}!\p"
@@ -1842,7 +1842,7 @@ MatchCall_BattlePikeText9:: @ 82B1775
.string "I'd better try harder, too!$"
MatchCall_BattlePikeText10:: @ 82B17F8
- .string "Oh, {PLAYER}{STRING 5}, hello.\n"
+ .string "Oh, {PLAYER}{KUN}, hello.\n"
.string "This is {STR_VAR_1}.\p"
.string "You won your way past {STR_VAR_3} rooms\n"
.string "at the {STR_VAR_2}?\p"
@@ -1850,7 +1850,7 @@ MatchCall_BattlePikeText10:: @ 82B17F8
.string "I need to work harder.$"
MatchCall_BattlePikeText11:: @ 82B1877
- .string "Ah, {PLAYER}{STRING 5}.\n"
+ .string "Ah, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "I hear you're the terror of\n"
.string "the {STR_VAR_2}?\p"
@@ -1862,7 +1862,7 @@ MatchCall_BattlePikeText11:: @ 82B1877
.string "Well, see you!$"
MatchCall_BattlePikeText12:: @ 82B1946
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's me, {STR_VAR_1}.\l"
.string "Are you keeping well?\p"
.string "You've won through {STR_VAR_3} rooms at\n"
@@ -1871,7 +1871,7 @@ MatchCall_BattlePikeText12:: @ 82B1946
.string "See you!$"
MatchCall_BattlePikeText13:: @ 82B19C7
- .string "Ah, hello, {PLAYER}{STRING 5}!\n"
+ .string "Ah, hello, {PLAYER}{KUN}!\n"
.string "This is {STR_VAR_1}!\l"
.string "I hope you've been keeping well.\p"
.string "They say you won in {STR_VAR_3} rooms\n"
@@ -1880,7 +1880,7 @@ MatchCall_BattlePikeText13:: @ 82B19C7
.string "Bye now.$"
MatchCall_BattlePikeText14:: @ 82B1A4C
- .string "Oh, hi, {PLAYER}{STRING 5}.\n"
+ .string "Oh, hi, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\l"
.string "I heard about you!\p"
.string "Didn't you get through {STR_VAR_3} rooms\n"
@@ -1915,7 +1915,7 @@ MatchCall_BattlePyramidText3:: @ 82B1BE4
.string "Catch you soon!$"
MatchCall_BattlePyramidText4:: @ 82B1C6A
- .string "Hey, {PLAYER}{STRING 5}.\n"
+ .string "Hey, {PLAYER}{KUN}.\n"
.string "{STR_VAR_1} here.\p"
.string "I heard you scaled {STR_VAR_3} floors\n"
.string "in the {STR_VAR_2}.\p"
@@ -1923,7 +1923,7 @@ MatchCall_BattlePyramidText4:: @ 82B1C6A
.string "to keep up!$"
MatchCall_BattlePyramidText5:: @ 82B1CCF
- .string "Hiya, {PLAYER}{STRING 5}!\n"
+ .string "Hiya, {PLAYER}{KUN}!\n"
.string "It's {STR_VAR_1}.\p"
.string "I heard you climbed {STR_VAR_3} floors\n"
.string "in the {STR_VAR_2}.\p"
@@ -1931,7 +1931,7 @@ MatchCall_BattlePyramidText5:: @ 82B1CCF
.string "See you soon!$"
MatchCall_BattlePyramidText6:: @ 82B1D38
- .string "Hey, {PLAYER}{STRING 5}?\n"
+ .string "Hey, {PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here. How are you?\p"
.string "By the way, I heard you got through\n"
.string "{STR_VAR_3} floors in the {STR_VAR_2}.\p"
@@ -1939,7 +1939,7 @@ MatchCall_BattlePyramidText6:: @ 82B1D38
.string "you pull further ahead.$"
MatchCall_BattlePyramidText7:: @ 82B1DCD
- .string "{PLAYER}{STRING 5}?\n"
+ .string "{PLAYER}{KUN}?\n"
.string "{STR_VAR_1} here.\p"
.string "You were at the {STR_VAR_2}\n"
.string "and won your way up {STR_VAR_3} floors?\p"
@@ -1949,7 +1949,7 @@ MatchCall_BattlePyramidText7:: @ 82B1DCD
.string "Okay, bye.$"
MatchCall_BattlePyramidText8:: @ 82B1E4B
- .string "Oh, {PLAYER}{STRING 5}, how do you do?\n"
+ .string "Oh, {PLAYER}{KUN}, how do you do?\n"
.string "This is {STR_VAR_1} speaking.\l"
.string "I hope you're doing well.\l"
.string "Oh, but, you are.\p"
@@ -1960,7 +1960,7 @@ MatchCall_BattlePyramidText8:: @ 82B1E4B
.string "See you again.$"
MatchCall_BattlePyramidText9:: @ 82B1F24
- .string "Oh, {PLAYER}{STRING 5}, hi there!\n"
+ .string "Oh, {PLAYER}{KUN}, hi there!\n"
.string "This is {STR_VAR_1}!\p"
.string "I heard! You won your way through\n"
.string "{STR_VAR_3} floors in the {STR_VAR_2}!\p"
@@ -1968,7 +1968,7 @@ MatchCall_BattlePyramidText9:: @ 82B1F24
.string "I'd better try harder, too!$"
MatchCall_BattlePyramidText10:: @ 82B1FA8
- .string "Oh, {PLAYER}{STRING 5}, hello.\n"
+ .string "Oh, {PLAYER}{KUN}, hello.\n"
.string "This is {STR_VAR_1}.\p"
.string "You climbed {STR_VAR_3} floors inside\n"
.string "the {STR_VAR_2}?\p"
@@ -1976,7 +1976,7 @@ MatchCall_BattlePyramidText10:: @ 82B1FA8
.string "I need to work harder.$"
MatchCall_BattlePyramidText11:: @ 82B2022
- .string "Ah, {PLAYER}{STRING 5}.\n"
+ .string "Ah, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\p"
.string "I hear you're the terror of\n"
.string "the {STR_VAR_2}?\p"
@@ -1988,7 +1988,7 @@ MatchCall_BattlePyramidText11:: @ 82B2022
.string "Well, see you!$"
MatchCall_BattlePyramidText12:: @ 82B20F3
- .string "Hello, {PLAYER}{STRING 5}.\n"
+ .string "Hello, {PLAYER}{KUN}.\n"
.string "It's me, {STR_VAR_1}.\l"
.string "Are you keeping well?\p"
.string "You've won through {STR_VAR_3} floors in\n"
@@ -1997,7 +1997,7 @@ MatchCall_BattlePyramidText12:: @ 82B20F3
.string "See you!$"
MatchCall_BattlePyramidText13:: @ 82B2175
- .string "Ah, hello, {PLAYER}{STRING 5}!\n"
+ .string "Ah, hello, {PLAYER}{KUN}!\n"
.string "This is {STR_VAR_1}!\l"
.string "I hope you've been keeping well.\p"
.string "They say you climbed {STR_VAR_3} floors\n"
@@ -2006,7 +2006,7 @@ MatchCall_BattlePyramidText13:: @ 82B2175
.string "Bye now.$"
MatchCall_BattlePyramidText14:: @ 82B21FC
- .string "Oh, hi, {PLAYER}{STRING 5}.\n"
+ .string "Oh, hi, {PLAYER}{KUN}.\n"
.string "This is {STR_VAR_1}.\l"
.string "I heard about you!\p"
.string "Didn't you get through {STR_VAR_3} floors\n"
@@ -2068,7 +2068,7 @@ gText_Roxanne_Pokenav_2B2607:: @ 82B2607
.string "is a matter of pride.$"
gText_Brawly_Pokenav_2B2659:: @ 82B2659
- .string "BRAWLY: Hey, there, {PLAYER}{STRING 5}!\p"
+ .string "BRAWLY: Hey, there, {PLAYER}{KUN}!\p"
.string "I learned a lot from the battle we\n"
.string "had together.\p"
.string "I intend to do my training over,\n"
@@ -2079,7 +2079,7 @@ gText_Brawly_Pokenav_2B2659:: @ 82B2659
.string "I want you to challenge us again.$"
gText_Brawly_Pokenav_2B275D:: @ 82B275D
- .string "BRAWLY: Hey, {PLAYER}{STRING 5}!\n"
+ .string "BRAWLY: Hey, {PLAYER}{KUN}!\n"
.string "Congratulations!\p"
.string "Word about your exploits arrived\n"
.string "on tidal winds!\p"
@@ -2091,13 +2091,13 @@ gText_Brawly_Pokenav_2B275D:: @ 82B275D
.string "I want you to challenge us again.$"
gText_Brawly_Pokenav_2B286F:: @ 82B286F
- .string "BRAWLY: Hey, {PLAYER}{STRING 5}!\n"
+ .string "BRAWLY: Hey, {PLAYER}{KUN}!\n"
.string "My GYM's ready for action!\p"
.string "Come back to DEWFORD anytime\n"
.string "for another challenge!$"
gText_Brawly_Pokenav_2B28D1:: @ 82B28D1
- .string "BRAWLY: {PLAYER}{STRING 5}, I don't think\n"
+ .string "BRAWLY: {PLAYER}{KUN}, I don't think\n"
.string "I'll ever get bored of battling you!$"
gText_Wattson_Pokenav_2B2912:: @ 82B2912
@@ -2225,7 +2225,7 @@ gText_TateLiza_Pokenav_2B31CD:: @ 82B31CD
gText_Juan_Pokenav_2B3249:: @ 82B3249
.string "JUAN: Hmm…\n"
- .string "{PLAYER}{STRING 5}… Was it?\p"
+ .string "{PLAYER}{KUN}… Was it?\p"
.string "Our battle together--it brought\n"
.string "to me memories of when I first\l"
.string "encountered WALLACE.\p"
@@ -2233,7 +2233,7 @@ gText_Juan_Pokenav_2B3249:: @ 82B3249
.string "yet surpass WALLACE!$"
gText_Juan_Pokenav_2B32EC:: @ 82B32EC
- .string "JUAN: Fufu… {PLAYER}{STRING 5}…\n"
+ .string "JUAN: Fufu… {PLAYER}{KUN}…\n"
.string "You've finally achieved your goal.\p"
.string "My eye for appraising talent wasn't\n"
.string "mistaken…\p"
@@ -2242,14 +2242,14 @@ gText_Juan_Pokenav_2B32EC:: @ 82B32EC
.string "of power and prestige.$"
gText_Juan_Pokenav_2B33AA:: @ 82B33AA
- .string "JUAN: Hoho… {PLAYER}{STRING 5}…\p"
+ .string "JUAN: Hoho… {PLAYER}{KUN}…\p"
.string "Our SOOTOPOLIS GYM has finally\n"
.string "reopened.\p"
.string "If you wish to see me, you are\n"
.string "welcome to visit anytime.$"
gText_Juan_Pokenav_2B341E:: @ 82B341E
- .string "JUAN: {PLAYER}{STRING 5}…\p"
+ .string "JUAN: {PLAYER}{KUN}…\p"
.string "Like the finest music, the battles\n"
.string "we wage together strike chords\l"
.string "of inspiration in my heart…\p"
@@ -2293,7 +2293,7 @@ gText_Drake_Pokenav_2B368B:: @ 82B368B
.string "Don't you agree, {PLAYER}?$"
gText_Wallace_Pokenav_2B3790:: @ 82B3790
- .string "WALLACE: Hello, {PLAYER}{STRING 5}.\n"
+ .string "WALLACE: Hello, {PLAYER}{KUN}.\n"
.string "Have you met STEVEN?\p"
.string "He is…\n"
.string "Actually incredibly skilled.\p"
@@ -2336,14 +2336,14 @@ MossdeepCity_SpaceCenter_2F_Text_2B39C6: @ 82B39C6
.string "… … … … … Click!$"
gText_May_Pokenav_2B3AB3:: @ 2B3AB3
- .string "MAY: Hi, {PLAYER}{STRING 5}!\p"
+ .string "MAY: Hi, {PLAYER}{KUN}!\p"
.string "MR. BRINEY retired as a SAILOR,\n"
.string "but I still see him out on the sea\l"
.string "with his pet PEEKO sometimes.\p"
.string "He must love the sea still.$"
gText_May_Pokenav_2B3B3F:: @ 2B3B3F
- .string "MAY: Hi, {PLAYER}{STRING 5}!\p"
+ .string "MAY: Hi, {PLAYER}{KUN}!\p"
.string "You know how little towns like\n"
.string "PETALBURG and DEWFORD have GYMS?\p"
.string "For some reason, the big port of\n"
@@ -2352,7 +2352,7 @@ gText_May_Pokenav_2B3B3F:: @ 2B3B3F
.string "I should apply to be the LEADER.$"
gText_May_Pokenav_2B3C13:: @ 2B3C13
- .string "MAY: Hi, {PLAYER}{STRING 5}!\p"
+ .string "MAY: Hi, {PLAYER}{KUN}!\p"
.string "Do you remember a man named\n"
.string "the CUTTER in RUSTBORO?\l"
.string "He had a house there, remember?\p"
@@ -2364,13 +2364,13 @@ gText_May_Pokenav_2B3C13:: @ 2B3C13
.string "The ROCK SMASH GUY!$"
gText_May_Pokenav_2B3CF3:: @ 2B3CF3
- .string "MAY: {PLAYER}{STRING 5}?\p"
+ .string "MAY: {PLAYER}{KUN}?\p"
.string "RUSTURF TUNNEL…\n"
.string "They named it that because it\l"
.string "joins RUSTBORO and VERDANTURF.$"
gText_May_Pokenav_2B3D4B:: @ 2B3D4B
- .string "MAY: {PLAYER}{STRING 5}, how are you?\p"
+ .string "MAY: {PLAYER}{KUN}, how are you?\p"
.string "I'm out on ROUTE 111 now.\p"
.string "I'm going to get a rest at an old\n"
.string "lady's house.\p"
@@ -2378,7 +2378,7 @@ gText_May_Pokenav_2B3D4B:: @ 2B3D4B
.string "the desert.$"
gText_May_Pokenav_2B3DD1:: @ 2B3DD1
- .string "MAY: Hi, {PLAYER}{STRING 5}!\p"
+ .string "MAY: Hi, {PLAYER}{KUN}!\p"
.string "Did you know about the MIRAGE\n"
.string "TOWER in the desert?\p"
.string "They say, like a mirage, it seems\n"
@@ -2386,21 +2386,21 @@ gText_May_Pokenav_2B3DD1:: @ 2B3DD1
.string "I wish I could see it.$"
gText_May_Pokenav_2B3E69:: @ 2B3E69
- .string "MAY: {PLAYER}{STRING 5}, yahoo!\n"
+ .string "MAY: {PLAYER}{KUN}, yahoo!\n"
.string "I'm on ROUTE 119 now.\p"
.string "There's a big river here, and\n"
.string "it often rains.\p"
.string "I got soaked!$"
gText_May_Pokenav_2B3ECD:: @ 2B3ECD
- .string "MAY: {PLAYER}{STRING 5}, hi.\p"
+ .string "MAY: {PLAYER}{KUN}, hi.\p"
.string "MT. PYRE is a memorial to POKéMON\n"
.string "whose lives have ended.\p"
.string "Maybe as a result, it's infested\n"
.string "with many GHOST-type POKéMON!$"
gText_May_Pokenav_2B3F2B:: @ 2B3F2B
- .string "MAY: Hi, {PLAYER}{STRING 5}!\p"
+ .string "MAY: Hi, {PLAYER}{KUN}!\p"
.string "I was thinking of going to the hot\n"
.string "spring in LAVARIDGE.\p"
.string "But on the way, around JAGGED\n"
@@ -2408,14 +2408,14 @@ gText_May_Pokenav_2B3F2B:: @ 2B3F2B
.string "characters. The mood was ugly!$"
gText_May_Pokenav_2B3FFB:: @ 2B3FFB
- .string "MAY: Hi, {PLAYER}{STRING 5}!\n"
+ .string "MAY: Hi, {PLAYER}{KUN}!\n"
.string "Did you see the news?\p"
.string "They say CAPT. STERN discovered\n"
.string "the SEAFLOOR CAVERN while on his\l"
.string "submarine expedition.$"
gText_May_Pokenav_2B402B:: @ 2B402B
- .string "MAY: Hi, {PLAYER}{STRING 5}!\n"
+ .string "MAY: Hi, {PLAYER}{KUN}!\n"
.string "Don't you think it's neat?\p"
.string "Even if you don't have a boat,\n"
.string "you can cross the sea using\l"
@@ -2425,7 +2425,7 @@ gText_May_Pokenav_2B402B:: @ 2B402B
.string "you go to the bottom of the sea.$"
gText_May_Pokenav_2B414B:: @ 2B414B
- .string "MAY: Hi, {PLAYER}{STRING 5}!\n"
+ .string "MAY: Hi, {PLAYER}{KUN}!\n"
.string "Hope things are okay!\p"
.string "Have you been on the sea and\n"
.string "found your way to the other side\l"
@@ -2436,7 +2436,7 @@ gText_May_Pokenav_2B414B:: @ 2B414B
.string "come up to the surface. Easy!$"
gText_May_Pokenav_2B4228:: @ 2B4228
- .string "MAY: Hi, {PLAYER}{STRING 5}!\p"
+ .string "MAY: Hi, {PLAYER}{KUN}!\p"
.string "How's it going?\n"
.string "Are you filling your POKéDEX?\p"
.string "I heard a rumor that there are\n"
@@ -2445,7 +2445,7 @@ gText_May_Pokenav_2B4228:: @ 2B4228
.string "I would love to see even one…$"
gText_May_Pokenav_2B42E0:: @ 2B42E0
- .string "MAY: {PLAYER}{STRING 5}!\n"
+ .string "MAY: {PLAYER}{KUN}!\n"
.string "I heard the rumors!\p"
.string "You beat the SOOTOPOLIS GYM\n"
.string "LEADER?\p"
@@ -2455,9 +2455,9 @@ gText_May_Pokenav_2B42E0:: @ 2B42E0
gText_May_Pokenav_2B4350:: @ 2B4350
.string "MAY: There isn't a single TRAINER\n"
.string "left in HOENN who doesn't know who\l"
- .string "you are, {PLAYER}{STRING 5}!\p"
+ .string "you are, {PLAYER}{KUN}!\p"
.string "When I tell people that I'm friends\n"
- .string "with you, {PLAYER}{STRING 5}, they're all\l"
+ .string "with you, {PLAYER}{KUN}, they're all\l"
.string "surprised!$"
gText_Brendan_Pokenav_2B43EF:: @ 2B43EF
@@ -2641,7 +2641,7 @@ gText_Wally_Pokenav_2B5100:: @ 2B5100
.string "Thank you…$"
gText_Scott_Pokenav_2B5184:: @ 2B5184
- .string "SCOTT: Howdy, {PLAYER}{STRING 5}!\p"
+ .string "SCOTT: Howdy, {PLAYER}{KUN}!\p"
.string "You know how POKéMON can be found\n"
.string "everywhere?\p"
.string "Like in the mountains, in the sea,\n"
@@ -2660,7 +2660,7 @@ gText_Scott_Pokenav_2B5275:: @ 2B5275
.string "makes me all ticklish!$"
gText_Scott_Pokenav_2B5323:: @ 2B5323
- .string "SCOTT: Hi, hi, {PLAYER}{STRING 5}!\p"
+ .string "SCOTT: Hi, hi, {PLAYER}{KUN}!\p"
.string "Have you had the chance to climb\n"
.string "MT. PYRE?\p"
.string "The place is a memorial to POKéMON\n"
@@ -2669,7 +2669,7 @@ gText_Scott_Pokenav_2B5323:: @ 2B5323
.string "should climb to the top of once.$"
gText_Scott_Pokenav_2B53DB:: @ 2B53DB
- .string "SCOTT: Hi, {PLAYER}{STRING 5}!\p"
+ .string "SCOTT: Hi, {PLAYER}{KUN}!\p"
.string "I've been hearing about these odd\n"
.string "gangs being a nuisance.\p"
.string "TEAM MAGMA and TEAM AQUA,\n"
@@ -2679,7 +2679,7 @@ gText_Scott_Pokenav_2B53DB:: @ 2B53DB
.string "…But if they're thugs…$"
gText_Scott_Pokenav_2B54A5:: @ 2B54A5
- .string "SCOTT: Oh, hi, {PLAYER}{STRING 5}.\p"
+ .string "SCOTT: Oh, hi, {PLAYER}{KUN}.\p"
.string "Might there be tough TRAINERS\n"
.string "at the bottom of the sea?\p"
.string "I can't go check for myself.\n"
@@ -2687,7 +2687,7 @@ gText_Scott_Pokenav_2B54A5:: @ 2B54A5
.string "And I don't raise POKéMON…$"
gText_Scott_Pokenav_2B5541:: @ 2B5541
- .string "SCOTT: Hi, hi, {PLAYER}{STRING 5}!\p"
+ .string "SCOTT: Hi, hi, {PLAYER}{KUN}!\p"
.string "You know that you can challenge\n"
.string "the POKéMON LEAGUE when you've\l"
.string "collected all the GYM BADGES?\p"
@@ -2774,7 +2774,7 @@ gText_Norman_Pokenav_2B5B5E:: @ 82B5B5E
.string "How much higher will you soar?$"
gText_Steven_Pokenav_2B5B95:: @ 82B5B95
- .string "STEVEN: Hi, {PLAYER}{STRING 5}!\p"
+ .string "STEVEN: Hi, {PLAYER}{KUN}!\p"
.string "Have you been to MAUVILLE\n"
.string "already?\p"
.string "You should visit the BIKE SHOP\n"
@@ -2785,14 +2785,14 @@ gText_Steven_Pokenav_2B5B95:: @ 82B5B95
.string "there.$"
gText_Steven_Pokenav_2B5C53:: @ 82B5C53
- .string "STEVEN: Hi, {PLAYER}{STRING 5}!\p"
+ .string "STEVEN: Hi, {PLAYER}{KUN}!\p"
.string "I've met a lot of different\n"
.string "TRAINERS so far.\p"
.string "But you're one of a kind.\n"
.string "You're not like anyone else.$"
gText_Steven_Pokenav_2B5CC9:: @ 82B5CC9
- .string "STEVEN: Hi, {PLAYER}{STRING 5}!\p"
+ .string "STEVEN: Hi, {PLAYER}{KUN}!\p"
.string "When you're on an adventure with\n"
.string "your POKéMON, what do you think?\p"
.string "Do you consider them to be strong\n"
@@ -2804,7 +2804,7 @@ gText_Steven_Pokenav_2B5CC9:: @ 82B5CC9
gText_Steven_Pokenav_2B5DB4:: @ 82B5DB4
.string "STEVEN: Hello?\n"
- .string "{PLAYER}{STRING 5}?\p"
+ .string "{PLAYER}{KUN}?\p"
.string "I'm involved in a spot of trouble\n"
.string "at the SPACE CENTER.\p"
.string "I'm sorry, but I can't talk now.\n"
@@ -2812,7 +2812,7 @@ gText_Steven_Pokenav_2B5DB4:: @ 82B5DB4
gText_Steven_Pokenav_2B5E26:: @ 82B5E26
.string "STEVEN: Oh!\n"
- .string "{PLAYER}{STRING 5}!\p"
+ .string "{PLAYER}{KUN}!\p"
.string "There's no need to talk.\n"
.string "It's past time for talking.\p"
.string "You have to believe in yourself\n"
@@ -2824,7 +2824,7 @@ gText_Steven_Pokenav_2B5EA2:: @ 82B5EA2
.string "the call…$"
gText_Steven_Pokenav_2B5ED9:: @ 82B5ED9
- .string "STEVEN: {PLAYER}{STRING 5}… Congratulations\n"
+ .string "STEVEN: {PLAYER}{KUN}… Congratulations\n"
.string "for entering the HALL OF FAME.\p"
.string "… … … … … …\n"
.string "… … … … … …\p"
@@ -2851,7 +2851,7 @@ Route101_Text_2B603A: @ 82B603A
.string "POKéMON becomes more fun, eh?$"
gText_MrStone_Pokenav_2B60C0:: @ 82B60C0
- .string "MR. STONE: Oh? {PLAYER}{STRING 5}!\p"
+ .string "MR. STONE: Oh? {PLAYER}{KUN}!\p"
.string "Since you called me, the POKéNAV\n"
.string "must be working properly!\p"
.string "Other people will be registered,\n"
@@ -2866,7 +2866,7 @@ gText_MrStone_Pokenav_2B60C0:: @ 82B60C0
.string "See you again!$"
gText_MrStone_Pokenav_2B61E6:: @ 82B61E6
- .string "MR. STONE: Oh? {PLAYER}{STRING 5}!\p"
+ .string "MR. STONE: Oh? {PLAYER}{KUN}!\p"
.string "What's wrong? Have you forgotten\n"
.string "about that little errand of mine?\p"
.string "I need you to deliver my letter\n"
@@ -2878,7 +2878,7 @@ gText_MrStone_Pokenav_2B61E6:: @ 82B61E6
.string "I have to go! Bye-bye!$"
gText_MrStone_Pokenav_2B6302:: @ 82B6302
- .string "MR. STONE: Oh! {PLAYER}{STRING 5}!\p"
+ .string "MR. STONE: Oh! {PLAYER}{KUN}!\p"
.string "Ah, so you've met STEVEN!\n"
.string "I'd better reward you, then!\p"
.string "When you visit RUSTBORO again,\n"
@@ -2886,7 +2886,7 @@ gText_MrStone_Pokenav_2B6302:: @ 82B6302
.string "I'll be waiting for you!$"
gText_MrStone_Pokenav_2B63A0:: @ 82B63A0
- .string "MR. STONE: Oh! {PLAYER}{STRING 5}!\p"
+ .string "MR. STONE: Oh! {PLAYER}{KUN}!\p"
.string "Did you know that DEVON was\n"
.string "digging the RUSTURF TUNNEL?\p"
.string "But we shut down the operation to\n"
@@ -2897,7 +2897,7 @@ gText_MrStone_Pokenav_2B63A0:: @ 82B63A0
.string "own convenience.$"
gText_MrStone_Pokenav_2B64A2:: @ 82B64A2
- .string "MR. STONE: Hello, hello, {PLAYER}{STRING 5}!\p"
+ .string "MR. STONE: Hello, hello, {PLAYER}{KUN}!\p"
.string "I heard from someone in PETALBURG\n"
.string "that you're NORMAN's child!\p"
.string "No wonder you're such a capable\n"
@@ -2935,7 +2935,7 @@ gText_MrStone_Pokenav_2B66B1:: @ 82B66B1
.string "BZZZZ…$"
gText_MrStone_Pokenav_2B6703:: @ 82B6703
- .string "MR. STONE: {PLAYER}{STRING 5}! It's me!\p"
+ .string "MR. STONE: {PLAYER}{KUN}! It's me!\p"
.string "You were apparently involved in all\n"
.string "sorts of things, but I, being busy,\l"
.string "haven't a clue exactly what!\p"
@@ -2946,7 +2946,7 @@ gText_MrStone_Pokenav_2B6703:: @ 82B6703
gText_MrStone_Pokenav_2B67ED:: @ 82B67ED
.string "MR. STONE: … … … … … …\n"
- .string "Is this maybe {PLAYER}{STRING 5}?\p"
+ .string "Is this maybe {PLAYER}{KUN}?\p"
.string "Your voice is so full of confidence,\n"
.string "I didn't recognize you right off!\p"
.string "Hm! You must come visit us at DEVON\n"
diff --git a/include/constants/contest.h b/include/constants/contest.h
new file mode 100644
index 000000000..d3296222b
--- /dev/null
+++ b/include/constants/contest.h
@@ -0,0 +1,19 @@
+#ifndef GUARD_CONSTANTS_CONTEST_H
+#define GUARD_CONSTANTS_CONTEST_H
+
+#define CONTESTANT_COUNT 4
+#define APPLAUSE_METER_SIZE 5
+#define CONTEST_TURN_COUNT 5
+
+#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)
+
+#define CONTEST_CATEGORY_COOL 0
+#define CONTEST_CATEGORY_BEAUTY 1
+#define CONTEST_CATEGORY_CUTE 2
+#define CONTEST_CATEGORY_SMART 3
+#define CONTEST_CATEGORY_TOUGH 4
+#define CONTEST_CATEGORIES_COUNT 5
+
+#endif // GUARD_CONSTANTS_CONTEST_H
diff --git a/include/constants/global.h b/include/constants/global.h
index ff28d6a4b..a862ecad2 100644
--- a/include/constants/global.h
+++ b/include/constants/global.h
@@ -50,6 +50,8 @@
#define PYRAMID_BAG_ITEMS_COUNT 10
#define HALL_FACILITIES_COUNT 9 // 7 facilities for single mode + tower double mode + tower multi mode.
+#define TRAINER_ID_LENGTH 4
+
// string lengths
#define ITEM_NAME_LENGTH 14
#define POKEMON_NAME_LENGTH 10
@@ -74,4 +76,14 @@
#define OPTIONS_BATTLE_STYLE_SHIFT 0
#define OPTIONS_BATTLE_STYLE_SET 1
+#define DIR_NONE 0
+#define DIR_SOUTH 1
+#define DIR_NORTH 2
+#define DIR_WEST 3
+#define DIR_EAST 4
+#define DIR_SOUTHWEST 5
+#define DIR_SOUTHEAST 6
+#define DIR_NORTHWEST 7
+#define DIR_NORTHEAST 8
+
#endif // GUARD_CONSTANTS_GLOBAL_H
diff --git a/include/constants/lilycove_lady.h b/include/constants/lilycove_lady.h
new file mode 100644
index 000000000..01f60ccf4
--- /dev/null
+++ b/include/constants/lilycove_lady.h
@@ -0,0 +1,26 @@
+#ifndef GUARD_LILYCOVE_LADY_CONSTANTS_H
+#define GUARD_LILYCOVE_LADY_CONSTANTS_H
+
+#define LILYCOVE_LADY_QUIZ 0
+#define LILYCOVE_LADY_FAVOR 1
+#define LILYCOVE_LADY_CONTEST 2
+#define LILYCOVE_LADY_COUNT 3
+
+#define LILYCOVE_LADY_STATE_READY 0
+#define LILYCOVE_LADY_STATE_COMPLETED 1
+#define LILYCOVE_LADY_STATE_PRIZE 2
+
+#define LILYCOVE_LADY_GIFT_THRESHOLD 5
+
+#define QUIZ_AUTHOR_PLAYER 0
+#define QUIZ_AUTHOR_OTHER_PLAYER 1
+#define QUIZ_AUTHOR_LADY 2
+
+// Would be redundant with the above set if GF hadn't mixed the order
+#define QUIZ_AUTHOR_NAME_LADY 0
+#define QUIZ_AUTHOR_NAME_PLAYER 1
+#define QUIZ_AUTHOR_NAME_OTHER_PLAYER 2
+
+#define QUIZ_QUESTION_LEN 9
+
+#endif
diff --git a/include/constants/map_groups.h b/include/constants/map_groups.h
index dc2ac2f32..6a3276b44 100755
--- a/include/constants/map_groups.h
+++ b/include/constants/map_groups.h
@@ -398,67 +398,67 @@
#define MAP_METEOR_FALLS_STEVENS_CAVE (107 | (24 << 8))
// Map Group 25
-#define MAP_SECRET_BASE_RED_CAVE1 (0 | (25 << 8))
-#define MAP_SECRET_BASE_BROWN_CAVE1 (1 | (25 << 8))
-#define MAP_SECRET_BASE_BLUE_CAVE1 (2 | (25 << 8))
-#define MAP_SECRET_BASE_YELLOW_CAVE1 (3 | (25 << 8))
-#define MAP_SECRET_BASE_TREE1 (4 | (25 << 8))
-#define MAP_SECRET_BASE_SHRUB1 (5 | (25 << 8))
-#define MAP_SECRET_BASE_RED_CAVE2 (6 | (25 << 8))
-#define MAP_SECRET_BASE_BROWN_CAVE2 (7 | (25 << 8))
-#define MAP_SECRET_BASE_BLUE_CAVE2 (8 | (25 << 8))
-#define MAP_SECRET_BASE_YELLOW_CAVE2 (9 | (25 << 8))
-#define MAP_SECRET_BASE_TREE2 (10 | (25 << 8))
-#define MAP_SECRET_BASE_SHRUB2 (11 | (25 << 8))
-#define MAP_SECRET_BASE_RED_CAVE3 (12 | (25 << 8))
-#define MAP_SECRET_BASE_BROWN_CAVE3 (13 | (25 << 8))
-#define MAP_SECRET_BASE_BLUE_CAVE3 (14 | (25 << 8))
-#define MAP_SECRET_BASE_YELLOW_CAVE3 (15 | (25 << 8))
-#define MAP_SECRET_BASE_TREE3 (16 | (25 << 8))
-#define MAP_SECRET_BASE_SHRUB3 (17 | (25 << 8))
-#define MAP_SECRET_BASE_RED_CAVE4 (18 | (25 << 8))
-#define MAP_SECRET_BASE_BROWN_CAVE4 (19 | (25 << 8))
-#define MAP_SECRET_BASE_BLUE_CAVE4 (20 | (25 << 8))
-#define MAP_SECRET_BASE_YELLOW_CAVE4 (21 | (25 << 8))
-#define MAP_SECRET_BASE_TREE4 (22 | (25 << 8))
-#define MAP_SECRET_BASE_SHRUB4 (23 | (25 << 8))
-#define MAP_SINGLE_BATTLE_COLOSSEUM (24 | (25 << 8))
-#define MAP_TRADE_CENTER (25 | (25 << 8))
-#define MAP_RECORD_CORNER (26 | (25 << 8))
-#define MAP_DOUBLE_BATTLE_COLOSSEUM (27 | (25 << 8))
-#define MAP_LINK_CONTEST_ROOM1 (28 | (25 << 8))
-#define MAP_UNKNOWN_MAP_25_29 (29 | (25 << 8))
-#define MAP_UNKNOWN_MAP_25_30 (30 | (25 << 8))
-#define MAP_UNKNOWN_MAP_25_31 (31 | (25 << 8))
-#define MAP_UNKNOWN_MAP_25_32 (32 | (25 << 8))
-#define MAP_UNKNOWN_MAP_25_33 (33 | (25 << 8))
-#define MAP_UNKNOWN_MAP_25_34 (34 | (25 << 8))
-#define MAP_LINK_CONTEST_ROOM2 (35 | (25 << 8))
-#define MAP_LINK_CONTEST_ROOM3 (36 | (25 << 8))
-#define MAP_LINK_CONTEST_ROOM4 (37 | (25 << 8))
-#define MAP_LINK_CONTEST_ROOM5 (38 | (25 << 8))
-#define MAP_LINK_CONTEST_ROOM6 (39 | (25 << 8))
-#define MAP_INSIDE_OF_TRUCK (40 | (25 << 8))
-#define MAP_SS_TIDAL_CORRIDOR (41 | (25 << 8))
-#define MAP_SS_TIDAL_LOWER_DECK (42 | (25 << 8))
-#define MAP_SS_TIDAL_ROOMS (43 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE01 (44 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE02 (45 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE03 (46 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE04 (47 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE05 (48 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE06 (49 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE07 (50 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE08 (51 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE09 (52 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE10 (53 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE11 (54 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE12 (55 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE13 (56 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE14 (57 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE15 (58 | (25 << 8))
-#define MAP_BATTLE_PYRAMID_SQUARE16 (59 | (25 << 8))
-#define MAP_UNION_ROOM (60 | (25 << 8))
+#define MAP_SECRET_BASE_RED_CAVE1 (0 | (25 << 8))
+#define MAP_SECRET_BASE_BROWN_CAVE1 (1 | (25 << 8))
+#define MAP_SECRET_BASE_BLUE_CAVE1 (2 | (25 << 8))
+#define MAP_SECRET_BASE_YELLOW_CAVE1 (3 | (25 << 8))
+#define MAP_SECRET_BASE_TREE1 (4 | (25 << 8))
+#define MAP_SECRET_BASE_SHRUB1 (5 | (25 << 8))
+#define MAP_SECRET_BASE_RED_CAVE2 (6 | (25 << 8))
+#define MAP_SECRET_BASE_BROWN_CAVE2 (7 | (25 << 8))
+#define MAP_SECRET_BASE_BLUE_CAVE2 (8 | (25 << 8))
+#define MAP_SECRET_BASE_YELLOW_CAVE2 (9 | (25 << 8))
+#define MAP_SECRET_BASE_TREE2 (10 | (25 << 8))
+#define MAP_SECRET_BASE_SHRUB2 (11 | (25 << 8))
+#define MAP_SECRET_BASE_RED_CAVE3 (12 | (25 << 8))
+#define MAP_SECRET_BASE_BROWN_CAVE3 (13 | (25 << 8))
+#define MAP_SECRET_BASE_BLUE_CAVE3 (14 | (25 << 8))
+#define MAP_SECRET_BASE_YELLOW_CAVE3 (15 | (25 << 8))
+#define MAP_SECRET_BASE_TREE3 (16 | (25 << 8))
+#define MAP_SECRET_BASE_SHRUB3 (17 | (25 << 8))
+#define MAP_SECRET_BASE_RED_CAVE4 (18 | (25 << 8))
+#define MAP_SECRET_BASE_BROWN_CAVE4 (19 | (25 << 8))
+#define MAP_SECRET_BASE_BLUE_CAVE4 (20 | (25 << 8))
+#define MAP_SECRET_BASE_YELLOW_CAVE4 (21 | (25 << 8))
+#define MAP_SECRET_BASE_TREE4 (22 | (25 << 8))
+#define MAP_SECRET_BASE_SHRUB4 (23 | (25 << 8))
+#define MAP_SINGLE_BATTLE_COLOSSEUM (24 | (25 << 8))
+#define MAP_TRADE_CENTER (25 | (25 << 8))
+#define MAP_RECORD_CORNER (26 | (25 << 8))
+#define MAP_DOUBLE_BATTLE_COLOSSEUM (27 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM1 (28 | (25 << 8))
+#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_29 (29 | (25 << 8))
+#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_30 (30 | (25 << 8))
+#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_31 (31 | (25 << 8))
+#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_32 (32 | (25 << 8))
+#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_33 (33 | (25 << 8))
+#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_34 (34 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM2 (35 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM3 (36 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM4 (37 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM5 (38 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM6 (39 | (25 << 8))
+#define MAP_INSIDE_OF_TRUCK (40 | (25 << 8))
+#define MAP_SS_TIDAL_CORRIDOR (41 | (25 << 8))
+#define MAP_SS_TIDAL_LOWER_DECK (42 | (25 << 8))
+#define MAP_SS_TIDAL_ROOMS (43 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE01 (44 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE02 (45 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE03 (46 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE04 (47 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE05 (48 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE06 (49 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE07 (50 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE08 (51 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE09 (52 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE10 (53 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE11 (54 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE12 (55 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE13 (56 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE14 (57 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE15 (58 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE16 (59 | (25 << 8))
+#define MAP_UNION_ROOM (60 | (25 << 8))
// Map Group 26
#define MAP_SAFARI_ZONE_NORTHWEST (0 | (26 << 8))
diff --git a/include/contest.h b/include/contest.h
index a4e209bcb..8ef208aea 100644
--- a/include/contest.h
+++ b/include/contest.h
@@ -2,10 +2,7 @@
#define GUARD_CONTEST_H
#include "palette.h"
-
-#define CONTESTANT_COUNT 4
-#define APPLAUSE_METER_SIZE 5
-#define CONTEST_TURN_COUNT 5
+#include "constants/contest.h"
enum
{
@@ -18,20 +15,6 @@ enum
CONTEST_DEBUG_MODE_PRINT_UNK_D
};
-#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)
-
-enum
-{
- CONTEST_CATEGORY_COOL,
- CONTEST_CATEGORY_BEAUTY,
- CONTEST_CATEGORY_CUTE,
- CONTEST_CATEGORY_SMART,
- CONTEST_CATEGORY_TOUGH,
- CONTEST_CATEGORIES_COUNT,
-};
-
enum
{
CONTEST_EFFECT_HIGHLY_APPEALING,
diff --git a/include/credits.h b/include/credits.h
index e7e58415b..f7dfa9997 100644
--- a/include/credits.h
+++ b/include/credits.h
@@ -7,6 +7,6 @@
extern EWRAM_DATA bool8 gHasHallOfFameRecords;
// Exported ROM declarations
-void sub_8175620(void);
+void CB2_StartCreditsSequence(void);
#endif // GUARD_CREDITS_H
diff --git a/include/gba/types.h b/include/gba/types.h
index 9f2594703..7163f925f 100644
--- a/include/gba/types.h
+++ b/include/gba/types.h
@@ -68,6 +68,10 @@ struct OamData
/*0x06*/ u16 affineParam;
};
+#define ST_OAM_HFLIP 0x08
+#define ST_OAM_VFLIP 0x10
+#define ST_OAM_MNUM_FLIP_MASK 0x18
+
#define ST_OAM_OBJ_NORMAL 0
#define ST_OAM_OBJ_BLEND 1
#define ST_OAM_OBJ_WINDOW 2
diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h
index b5a86e311..a17180589 100644
--- a/include/global.fieldmap.h
+++ b/include/global.fieldmap.h
@@ -267,19 +267,6 @@ enum
enum
{
- DIR_NONE,
- DIR_SOUTH,
- DIR_NORTH,
- DIR_WEST,
- DIR_EAST,
- DIR_SOUTHWEST,
- DIR_SOUTHEAST,
- DIR_NORTHWEST,
- DIR_NORTHEAST,
-};
-
-enum
-{
COLLISION_LEDGE_JUMP = 6
};
diff --git a/include/global.h b/include/global.h
index 14377d8bb..a82fe5861 100644
--- a/include/global.h
+++ b/include/global.h
@@ -224,7 +224,7 @@ struct Apprentice
u8 number;
struct ApprenticeMon party[3];
u16 easyChatWords[6];
- u8 playerId[4];
+ u8 playerId[TRAINER_ID_LENGTH];
u8 playerName[PLAYER_NAME_LENGTH];
u8 language;
u32 checksum;
@@ -263,7 +263,7 @@ struct EmeraldBattleTowerRecord
/*0x01*/ u8 facilityClass;
/*0x02*/ u16 winStreak;
/*0x04*/ u8 name[PLAYER_NAME_LENGTH + 1];
- /*0x0C*/ u8 trainerId[4];
+ /*0x0C*/ u8 trainerId[TRAINER_ID_LENGTH];
/*0x10*/ u16 greeting[6];
/*0x1C*/ u16 speechWon[6];
/*0x28*/ u16 speechLost[6];
@@ -278,7 +278,7 @@ struct BattleTowerEReaderTrainer
/*0x01*/ u8 facilityClass;
/*0x02*/ u16 winStreak;
/*0x04*/ u8 name[PLAYER_NAME_LENGTH + 1];
- /*0x0C*/ u8 trainerId[4];
+ /*0x0C*/ u8 trainerId[TRAINER_ID_LENGTH];
/*0x10*/ u16 greeting[6];
/*0x1C*/ u16 farewellPlayerLost[6];
/*0x28*/ u16 farewellPlayerWon[6];
@@ -425,7 +425,7 @@ struct PlayersApprentice
struct RankingHall1P
{
- u8 id[4];
+ u8 id[TRAINER_ID_LENGTH];
u16 winStreak;
u8 name[PLAYER_NAME_LENGTH + 1];
u8 language;
@@ -433,8 +433,8 @@ struct RankingHall1P
struct RankingHall2P
{
- u8 id1[4];
- u8 id2[4];
+ u8 id1[TRAINER_ID_LENGTH];
+ u8 id2[TRAINER_ID_LENGTH];
u16 winStreak;
u8 name1[PLAYER_NAME_LENGTH + 1];
u8 name2[PLAYER_NAME_LENGTH + 1];
@@ -446,7 +446,7 @@ struct SaveBlock2
/*0x00*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x08*/ u8 playerGender; // MALE, FEMALE
/*0x09*/ u8 specialSaveWarpFlags;
- /*0x0A*/ u8 playerTrainerId[4];
+ /*0x0A*/ u8 playerTrainerId[TRAINER_ID_LENGTH];
/*0x0E*/ u16 playTimeHours;
/*0x10*/ u8 playTimeMinutes;
/*0x11*/ u8 playTimeSeconds;
@@ -495,7 +495,7 @@ struct SecretBase
/*0x1A9D*/ u8 battledOwnerToday:1;
/*0x1A9D*/ u8 registryStatus:2;
/*0x1A9E*/ u8 trainerName[PLAYER_NAME_LENGTH];
- /*0x1AA5*/ u8 trainerId[4]; // byte 0 is used for determining trainer class
+ /*0x1AA5*/ u8 trainerId[TRAINER_ID_LENGTH]; // byte 0 is used for determining trainer class
/*0x1AA9*/ u8 language;
/*0x1AAA*/ u16 numSecretBasesReceived;
/*0x1AAC*/ u8 numTimesEntered;
@@ -581,7 +581,7 @@ struct MailStruct
{
/*0x00*/ u16 words[MAIL_WORDS_COUNT];
/*0x12*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
- /*0x1A*/ u8 trainerId[4];
+ /*0x1A*/ u8 trainerId[TRAINER_ID_LENGTH];
/*0x1E*/ u16 species;
/*0x20*/ u16 itemId;
};
@@ -598,7 +598,7 @@ struct MauvilleManBard
/*0x0E*/ u16 temporaryLyrics[6];
/*0x1A*/ u8 playerName[8];
/*0x22*/ u8 filler_2DB6[0x3];
- /*0x25*/ u8 playerTrainerId[4];
+ /*0x25*/ u8 playerTrainerId[TRAINER_ID_LENGTH];
/*0x29*/ bool8 hasChangedSong;
/*0x2A*/ u8 language;
}; /*size = 0x2C*/
@@ -737,50 +737,43 @@ struct RecordMixingDayCareMail
bool16 holdsItem[DAYCARE_MON_COUNT];
};
-enum
-{
- LILYCOVE_LADY_QUIZ,
- LILYCOVE_LADY_FAVOUR,
- LILYCOVE_LADY_CONTEST
-};
-
struct LilycoveLadyQuiz
{
/*0x000*/ u8 id;
- /*0x001*/ u8 phase;
- /*0x002*/ u16 unk_002[9];
- /*0x014*/ u16 unk_014;
- /*0x016*/ u16 unk_016;
+ /*0x001*/ u8 state;
+ /*0x002*/ u16 question[9];
+ /*0x014*/ u16 correctAnswer;
+ /*0x016*/ u16 playerAnswer;
/*0x018*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
- /*0x020*/ u16 playerTrainerId[4];
- /*0x028*/ u16 itemId;
- /*0x02a*/ u8 unk_02a;
- /*0x02b*/ u8 unk_02b;
- /*0x02c*/ u8 unk_02c;
+ /*0x020*/ u16 playerTrainerId[TRAINER_ID_LENGTH];
+ /*0x028*/ u16 prize;
+ /*0x02a*/ bool8 waitingForChallenger;
+ /*0x02b*/ u8 questionId;
+ /*0x02c*/ u8 prevQuestionId;
/*0x02d*/ u8 language;
};
-struct LilycoveLadyFavour
+struct LilycoveLadyFavor
{
/*0x000*/ u8 id;
- /*0x001*/ u8 phase;
- /*0x002*/ u8 unk_002;
- /*0x003*/ u8 unk_003;
+ /*0x001*/ u8 state;
+ /*0x002*/ bool8 likedItem;
+ /*0x003*/ u8 numItemsGiven;
/*0x004*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
- /*0x00c*/ u8 unk_00c;
+ /*0x00c*/ u8 favorId;
/*0x00e*/ u16 itemId;
- /*0x010*/ u16 unk_010;
+ /*0x010*/ u16 bestItem;
/*0x012*/ u8 language;
};
struct LilycoveLadyContest
{
/*0x000*/ u8 id;
- /*0x001*/ u8 phase;
- /*0x002*/ u8 fave_pkblk;
- /*0x003*/ u8 other_pkblk;
+ /*0x001*/ bool8 givenPokeblock;
+ /*0x002*/ u8 numGoodPokeblocksGiven;
+ /*0x003*/ u8 numOtherPokeblocksGiven;
/*0x004*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
- /*0x00c*/ u8 max_sheen;
+ /*0x00c*/ u8 maxSheen;
/*0x00d*/ u8 category;
/*0x00e*/ u8 language;
};
@@ -788,7 +781,7 @@ struct LilycoveLadyContest
typedef union // 3b58
{
struct LilycoveLadyQuiz quiz;
- struct LilycoveLadyFavour favour;
+ struct LilycoveLadyFavor favor;
struct LilycoveLadyContest contest;
u8 id;
u8 pad[0x40];
diff --git a/include/item_menu.h b/include/item_menu.h
index 5580fa4b4..b1275549d 100644
--- a/include/item_menu.h
+++ b/include/item_menu.h
@@ -69,8 +69,8 @@ extern u16 gSpecialVar_ItemId;
// Exported ROM declarations
void sub_81AAC14(void);
-void sub_81AAC50(void);
-void sub_81AAC70(void);
+void FavorLadyOpenBagMenu(void);
+void QuizLadyOpenBagMenu(void);
void sub_81AAC28(void);
void sub_81AABB0(void);
void SetInitialScrollAndCursorPositions(u8 pocketId);
diff --git a/include/lilycove_lady.h b/include/lilycove_lady.h
index f26285d68..1ec327be9 100644
--- a/include/lilycove_lady.h
+++ b/include/lilycove_lady.h
@@ -2,16 +2,16 @@
#define GUARD_LILYCOVE_LADY_H
u8 GetLilycoveLadyId(void);
-void SetLilycoveLady(void);
-void sub_818DA78(void);
-void sub_818DEF4(void);
-void sub_818E564(void);
-void sub_818E570(const LilycoveLady *lilycoveLady);
+void InitLilycoveLady(void);
+void ResetLilycoveLadyForRecordMix(void);
+void FieldCallback_FavorLadyEnableScriptContexts(void);
+void FieldCallback_QuizLadyEnableScriptContexts(void);
+void QuizLadyClearQuestionForRecordMix(const LilycoveLady *lilycoveLady);
bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock);
-void sub_818E7E0(u8 *dest1, u8 *dest2);
-void sub_818E81C(u8 *dest);
-void sub_818E848(u8 *dest);
-void sub_818E868(u8 *dest, u8 category);
+void BufferContestLadyMonName(u8 *dest1, u8 *dest2);
+void BufferContestLadyPlayerName(u8 *dest);
+void BufferContestLadyLanguage(u8 *dest);
+void BufferContestName(u8 *dest, u8 category);
u8 sub_818E880(void);
#endif //GUARD_LILYCOVE_LADY_H
diff --git a/include/pokedex.h b/include/pokedex.h
index a1b7378bf..532c823ee 100644
--- a/include/pokedex.h
+++ b/include/pokedex.h
@@ -4,6 +4,7 @@
extern u8 gUnusedPokedexU8;
extern void (*gUnknown_030060B4)(void);
+#define KANTO_DEX_COUNT 151
#define HOENN_DEX_COUNT 202
#define NATIONAL_DEX_COUNT 386
@@ -43,7 +44,7 @@ s8 GetSetPokedexFlag(u16 nationalNum, u8 caseId);
u16 CreateMonSpriteFromNationalDexNumber(u16, s16, s16, u16);
bool16 HasAllHoennMons(void);
void ResetPokedexScrollPositions(void);
-u16 sub_80C0944(void);
+bool16 HasAllMons(void);
void CB2_Pokedex(void);
#endif // GUARD_POKEDEX_H
diff --git a/include/pokemon.h b/include/pokemon.h
index 07bcff2e3..ec125573c 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -506,7 +506,7 @@ u8 CalculatePlayerPartyCount(void);
u8 CalculateEnemyPartyCount(void);
u8 GetMonsStateToDoubles(void);
u8 GetMonsStateToDoubles_2(void);
-u8 GetAbilityBySpecies(u16 species, bool8 abilityNum);
+u8 GetAbilityBySpecies(u16 species, u8 abilityNum);
u8 GetMonAbility(struct Pokemon *mon);
void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord);
u8 GetSecretBaseTrainerPicIndex(void);
diff --git a/include/pokenav.h b/include/pokenav.h
index db32e3029..b1c3287f1 100644
--- a/include/pokenav.h
+++ b/include/pokenav.h
@@ -56,6 +56,32 @@ enum
POKENAV_MENU_E,
};
+enum
+{
+ MC_HEADER_MR_STONE,
+ MC_HEADER_PROF_BIRCH,
+ MC_HEADER_BRENDAN,
+ MC_HEADER_MAY,
+ MC_HEADER_WALLY,
+ MC_HEADER_NORMAN,
+ MC_HEADER_MOM,
+ MC_HEADER_STEVEN,
+ MC_HEADER_SCOTT,
+ MC_HEADER_ROXANNE,
+ MC_HEADER_BRAWLY,
+ MC_HEADER_WATTSON,
+ MC_HEADER_FLANNERY,
+ MC_HEADER_WINONA,
+ MC_HEADER_TATE_LIZA,
+ MC_HEADER_JUAN,
+ MC_HEADER_SIDNEY,
+ MC_HEADER_PHOEBE,
+ MC_HEADER_GLACIA,
+ MC_HEADER_DRAKE,
+ MC_HEADER_WALLACE,
+ MC_HEADER_COUNT
+};
+
// pokenav.c
void sub_81C7694(u32);
u32 sub_81C76AC(void);
@@ -109,15 +135,15 @@ bool32 sub_81C81D4(const struct BgTemplate *arg0, struct MatchCallListTemplate *
void sub_81C8234(void);
// pokenav_match_call_data.c
-bool32 sub_81D17E8(u32 idx);
+bool32 MatchCall_HasCheckPage(u32 idx);
u8 MatchCallMapSecGetByIndex(u32 idx);
bool32 sub_81D1BF8(u32 idx);
bool32 MatchCallFlagGetByIndex(u32 idx);
u32 MatchCall_GetRematchTableIdx(u32 idx);
u32 GetTrainerIdxByRematchIdx(u32 rematchIdx);
-int sub_81D1BD0(u32 idx);
+int MatchCall_GetOverrideFacilityClass(u32 idx);
void MatchCall_GetMessage(u32 idx, u8 *dest);
-const u8 *sub_81D1B40(u32 idx, u32 offset);
+const u8 *MatchCall_GetOverrideFlavorText(u32 idx, u32 offset);
void sub_81D1A78(u32 idx, const u8 **desc, const u8 **name);
// pokenav_main_menu.c
diff --git a/include/strings.h b/include/strings.h
index 7e7fcd322..78ae2c140 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -2744,6 +2744,31 @@ extern const u8 gText_JumpsInARow[];
extern const u8 gText_BestScore2[];
extern const u8 gText_ExcellentsInARow[];
+// Lilycove Lady
+extern const u8 gText_ContestLady_Handsome[];
+extern const u8 gText_ContestLady_Vinny[];
+extern const u8 gText_ContestLady_Moreme[];
+extern const u8 gText_ContestLady_Ironhard[];
+extern const u8 gText_ContestLady_Muscle[];
+extern const u8 gText_ContestLady_Coolness[];
+extern const u8 gText_ContestLady_Beauty[];
+extern const u8 gText_ContestLady_Cuteness[];
+extern const u8 gText_ContestLady_Smartness[];
+extern const u8 gText_ContestLady_Toughness[];
+extern const u8 gText_QuizLady_Lady[];
+extern const u8 gText_FavorLady_Slippery[];
+extern const u8 gText_FavorLady_Roundish[];
+extern const u8 gText_FavorLady_Whamish[];
+extern const u8 gText_FavorLady_Shiny[];
+extern const u8 gText_FavorLady_Sticky[];
+extern const u8 gText_FavorLady_Pointy[];
+
+extern const u8 gText_CoolnessContest[];
+extern const u8 gText_BeautyContest[];
+extern const u8 gText_CutenessContest[];
+extern const u8 gText_SmartnessContest[];
+extern const u8 gText_ToughnessContest[];
+
// Pokenav Match Call
extern const u8 gText_CallCantBeMadeHere[];
extern const u8 gText_NumberRegistered[];
diff --git a/ld_script.txt b/ld_script.txt
index 8d451338c..a044ecdab 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -47,7 +47,7 @@ SECTIONS {
.text :
ALIGN(4)
{
- asm/crt0.o(.text);
+ src/crt0.o(.text);
src/main.o(.text);
src/alloc.o(.text);
src/dma3_manager.o(.text);
@@ -348,8 +348,8 @@ SECTIONS {
lib_text :
ALIGN(4)
{
- asm/libgcnmultiboot.o(.text);
- asm/m4a_1.o(.text);
+ src/libgcnmultiboot.o(.text);
+ src/m4a_1.o(.text);
src/m4a.o(.text);
src/agb_flash.o(.text);
src/agb_flash_1m.o(.text);
@@ -360,7 +360,7 @@ SECTIONS {
asm/librfu_intr.o(.text);
src/librfu_rfu.o(.text);
asm/librfu.o(.text);
- asm/libagbsyscall.o(.text);
+ src/libagbsyscall.o(.text);
*libgcc.a:_call_via_rX.o(.text);
*libgcc.a:_divdi3.o(.text);
*libgcc.a:_divsi3.o(.text);
diff --git a/ld_script_modern.txt b/ld_script_modern.txt
index 98ef16b17..5157e81dc 100644
--- a/ld_script_modern.txt
+++ b/ld_script_modern.txt
@@ -25,7 +25,6 @@ SECTIONS {
{
/* .bss starts at 0x3000000 */
src/*.o(.bss);
- asm/m4a_1.o(.bss);
/* .bss.code starts at 0x3001AA8 */
src/m4a.o(.bss.code);
@@ -42,7 +41,7 @@ SECTIONS {
.text :
ALIGN(4)
{
- asm/crt0.o(.text);
+ src/crt0.o(.text);
src/*.o(.text);
asm/*.o(.text);
} =0
@@ -56,8 +55,8 @@ SECTIONS {
lib_text :
ALIGN(4)
{
- asm/libgcnmultiboot.o(.text);
- asm/m4a_1.o(.text);
+ src/libgcnmultiboot.o(.text);
+ src/m4a_1.o(.text);
src/m4a.o(.text);
src/agb_flash.o(.text);
src/agb_flash_1m.o(.text);
@@ -68,7 +67,7 @@ SECTIONS {
asm/librfu_intr.o(.text);
src/librfu_rfu.o(.text);
asm/librfu.o(.text);
- asm/libagbsyscall.o(.text);
+ src/libagbsyscall.o(.text);
*libgcc.a:*.o(.text*);
*libc.a:*.o(.text*);
src/libisagbprn.o(.text);
diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c
index b3a67a509..dfe5f0f3d 100644
--- a/src/battle_anim_effects_1.c
+++ b/src/battle_anim_effects_1.c
@@ -2547,7 +2547,7 @@ static void AnimPetalDanceSmallFlowerStep(struct Sprite* sprite)
{
sprite->pos2.x += Sin(sprite->data[5], 8);
if ((u16)(sprite->data[5] - 59) < 5 || (u16)(sprite->data[5] - 187) < 5)
- sprite->oam.matrixNum ^= 0x8; // horizontal flip
+ sprite->oam.matrixNum ^= ST_OAM_HFLIP;
sprite->data[5] += 5;
sprite->data[5] &= 0xFF;
@@ -4380,19 +4380,19 @@ void sub_8101898(struct Sprite* sprite)
{
sprite->pos1.x -= 0x18;
sprite->pos1.y += 0x18;
- sprite->oam.matrixNum = 16;
+ sprite->oam.matrixNum = ST_OAM_VFLIP;
}
else if ((s16)sprite->oam.affineParam == 3)
{
sprite->pos1.x += 0x18;
sprite->pos1.y -= 0x18;
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
}
else
{
sprite->pos1.x += 0x18;
sprite->pos1.y += 0x18;
- sprite->oam.matrixNum = 24;
+ sprite->oam.matrixNum = ST_OAM_HFLIP | ST_OAM_VFLIP;
}
sprite->oam.tileNum = (sprite->oam.tileNum + 16);
@@ -5105,7 +5105,7 @@ void sub_8102844(struct Sprite* sprite)
sprite->data[7] = sprite->pos1.y;
if (IsContest())
{
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
sprite->pos1.x += 40;
sprite->pos1.y += 20;
sprite->data[2] = sprite->pos1.x << 7;
@@ -5130,7 +5130,7 @@ void sub_8102844(struct Sprite* sprite)
sprite->data[3] = -0x1400 / sprite->data[1];
sprite->data[4] = sprite->pos1.y << 7;
sprite->data[5] = 0xA00 / sprite->data[1];
- sprite->oam.matrixNum = 24;
+ sprite->oam.matrixNum = (ST_OAM_HFLIP | ST_OAM_VFLIP);
}
sprite->callback = sub_810296C;
@@ -5387,7 +5387,7 @@ void sub_8102FB8(struct Sprite* sprite)
s16 a;
if (gBattleAnimArgs[0] == 1)
{
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
a = 16;
}
else
diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c
index 65cc55604..3b7d26aab 100755
--- a/src/battle_anim_effects_2.c
+++ b/src/battle_anim_effects_2.c
@@ -1609,10 +1609,10 @@ static void sub_8103C0C(u8 taskId)
switch (gTasks[taskId].data[4])
{
case 1:
- sprite->oam.matrixNum |= 24;
+ sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP);
break;
case 2:
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
break;
}
diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c
index 5d79a9e6b..79b728e61 100755
--- a/src/battle_anim_effects_3.c
+++ b/src/battle_anim_effects_3.c
@@ -1618,7 +1618,7 @@ void sub_815AAA4(struct Sprite *sprite)
if (gBattleAnimArgs[2] == 0)
{
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
sprite->pos2.x = -12;
sprite->data[1] = 2;
}
@@ -4167,7 +4167,7 @@ void AnimSmellingSaltsHand(struct Sprite *sprite)
sprite->pos1.y = GetBattlerSpriteCoord(battler, 3);
if (gBattleAnimArgs[1] == 0)
{
- sprite->oam.matrixNum |= 0x8;
+ sprite->oam.matrixNum |= ST_OAM_HFLIP;
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8;
}
else
@@ -4317,7 +4317,7 @@ void AnimHelpingHandClap(struct Sprite *sprite)
{
if (gBattleAnimArgs[0] == 0)
{
- sprite->oam.matrixNum |= 0x8; // horizontal flip
+ sprite->oam.matrixNum |= ST_OAM_HFLIP;
sprite->pos1.x = 100;
sprite->data[7] = 1;
}
@@ -4545,7 +4545,7 @@ void AnimForesightMagnifyingGlass(struct Sprite *sprite)
}
if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT)
- sprite->oam.matrixNum = 8; // horizontal flip
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]);
sprite->oam.objMode = ST_OAM_OBJ_BLEND;
diff --git a/src/battle_controllers.c b/src/battle_controllers.c
index 4b5bb7a8a..1225d1953 100644
--- a/src/battle_controllers.c
+++ b/src/battle_controllers.c
@@ -64,7 +64,7 @@ void SetUpBattleVarsAndBirchZigzagoon(void)
if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
{
ZeroEnemyPartyMons();
- CreateMon(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, 32, 0, 0, 0, 0);
+ CreateMon(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, 32, 0, 0, OT_ID_PLAYER_ID, 0);
i = 0;
SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &i);
}
diff --git a/src/battle_factory.c b/src/battle_factory.c
index 6c249bccc..bc47b1fda 100644
--- a/src/battle_factory.c
+++ b/src/battle_factory.c
@@ -415,7 +415,7 @@ static void SetPlayerAndOpponentParties(void)
monLevel,
ivs,
TRUE, gSaveBlock2Ptr->frontier.rentalMons[i].personality,
- 0, 0);
+ OT_ID_PLAYER_ID, 0);
count = 0;
bits = gFacilityTrainerMons[monSetId].evSpread;
@@ -456,7 +456,7 @@ static void SetPlayerAndOpponentParties(void)
monLevel,
ivs,
TRUE, gSaveBlock2Ptr->frontier.rentalMons[i + 3].personality,
- 0, 0);
+ OT_ID_PLAYER_ID, 0);
count = 0;
bits = gFacilityTrainerMons[monSetId].evSpread;
diff --git a/src/battle_interface.c b/src/battle_interface.c
index 922437597..8fabfed68 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -1536,7 +1536,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
if (isOpponent)
{
gSprites[summaryBarSpriteId].pos1.x -= 96;
- gSprites[summaryBarSpriteId].oam.matrixNum = 8;
+ gSprites[summaryBarSpriteId].oam.matrixNum = ST_OAM_HFLIP;
}
else
{
diff --git a/src/battle_main.c b/src/battle_main.c
index 61b6a5a12..92e21db75 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -2004,7 +2004,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
personalityValue += nameHash << 8;
fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0);
+ CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
for (j = 0; j < MAX_MON_MOVES; j++)
{
@@ -2022,7 +2022,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
personalityValue += nameHash << 8;
fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0);
+ CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
break;
@@ -2036,7 +2036,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
personalityValue += nameHash << 8;
fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0);
+ CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
diff --git a/src/battle_setup.c b/src/battle_setup.c
index 288fdb3e9..c2d7cb6c6 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -231,86 +231,93 @@ static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[]
{&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
};
+#define REMATCH(trainer1, trainer2, trainer3, trainer4, trainer5, map) \
+{ \
+ .trainerIds = {trainer1, trainer2, trainer3, trainer4, trainer5}, \
+ .mapGroup = MAP_GROUP(map), \
+ .mapNum = MAP_NUM(map), \
+}
+
const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] =
{
- [REMATCH_ROSE] = {{TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_3, TRAINER_ROSE_4, TRAINER_ROSE_5}, 0x0, 0x21},
- [REMATCH_ANDRES] = {{TRAINER_ANDRES_1, TRAINER_ANDRES_2, TRAINER_ANDRES_3, TRAINER_ANDRES_4, TRAINER_ANDRES_5}, 0x0, 0x14},
- [REMATCH_DUSTY] = {{TRAINER_DUSTY_1, TRAINER_DUSTY_2, TRAINER_DUSTY_3, TRAINER_DUSTY_4, TRAINER_DUSTY_5}, 0x0, 0x1a},
- [REMATCH_LOLA] = {{TRAINER_LOLA_1, TRAINER_LOLA_2, TRAINER_LOLA_3, TRAINER_LOLA_4, TRAINER_LOLA_5}, 0x0, 0x18},
- [REMATCH_RICKY] = {{TRAINER_RICKY_1, TRAINER_RICKY_2, TRAINER_RICKY_3, TRAINER_RICKY_4, TRAINER_RICKY_5}, 0x0, 0x18},
- [REMATCH_LILA_AND_ROY] = {{TRAINER_LILA_AND_ROY_1, TRAINER_LILA_AND_ROY_2, TRAINER_LILA_AND_ROY_3, TRAINER_LILA_AND_ROY_4, TRAINER_LILA_AND_ROY_5}, 0x0, 0x27},
- [REMATCH_CRISTIN] = {{TRAINER_CRISTIN_1, TRAINER_CRISTIN_2, TRAINER_CRISTIN_3, TRAINER_CRISTIN_4, TRAINER_CRISTIN_5}, 0x0, 0x24},
- [REMATCH_BROOKE] = {{TRAINER_BROOKE_1, TRAINER_BROOKE_2, TRAINER_BROOKE_3, TRAINER_BROOKE_4, TRAINER_BROOKE_5}, 0x0, 0x1a},
- [REMATCH_WILTON] = {{TRAINER_WILTON_1, TRAINER_WILTON_2, TRAINER_WILTON_3, TRAINER_WILTON_4, TRAINER_WILTON_5}, 0x0, 0x1a},
- [REMATCH_VALERIE] = {{TRAINER_VALERIE_1, TRAINER_VALERIE_2, TRAINER_VALERIE_3, TRAINER_VALERIE_4, TRAINER_VALERIE_5}, 0x18, 0x14},
- [REMATCH_CINDY] = {{TRAINER_CINDY_1, TRAINER_CINDY_3, TRAINER_CINDY_4, TRAINER_CINDY_5, TRAINER_CINDY_6}, 0x0, 0x13},
- [REMATCH_THALIA] = {{TRAINER_THALIA_1, TRAINER_THALIA_2, TRAINER_THALIA_3, TRAINER_THALIA_4, TRAINER_THALIA_5}, 0x18, 0x38},
- [REMATCH_JESSICA] = {{TRAINER_JESSICA_1, TRAINER_JESSICA_2, TRAINER_JESSICA_3, TRAINER_JESSICA_4, TRAINER_JESSICA_5}, 0x0, 0x24},
- [REMATCH_WINSTON] = {{TRAINER_WINSTON_1, TRAINER_WINSTON_2, TRAINER_WINSTON_3, TRAINER_WINSTON_4, TRAINER_WINSTON_5}, 0x0, 0x13},
- [REMATCH_STEVE] = {{TRAINER_STEVE_1, TRAINER_STEVE_2, TRAINER_STEVE_3, TRAINER_STEVE_4, TRAINER_STEVE_5}, 0x0, 0x1d},
- [REMATCH_TONY] = {{TRAINER_TONY_1, TRAINER_TONY_2, TRAINER_TONY_3, TRAINER_TONY_4, TRAINER_TONY_5}, 0x0, 0x16},
- [REMATCH_NOB] = {{TRAINER_NOB_1, TRAINER_NOB_2, TRAINER_NOB_3, TRAINER_NOB_4, TRAINER_NOB_5}, 0x0, 0x1e},
- [REMATCH_KOJI] = {{TRAINER_KOJI_1, TRAINER_KOJI_2, TRAINER_KOJI_3, TRAINER_KOJI_4, TRAINER_KOJI_5}, 0x0, 0x2a},
- [REMATCH_FERNANDO] = {{TRAINER_FERNANDO_1, TRAINER_FERNANDO_2, TRAINER_FERNANDO_3, TRAINER_FERNANDO_4, TRAINER_FERNANDO_5}, 0x0, 0x26},
- [REMATCH_DALTON] = {{TRAINER_DALTON_1, TRAINER_DALTON_2, TRAINER_DALTON_3, TRAINER_DALTON_4, TRAINER_DALTON_5}, 0x0, 0x21},
- [REMATCH_BERNIE] = {{TRAINER_BERNIE_1, TRAINER_BERNIE_2, TRAINER_BERNIE_3, TRAINER_BERNIE_4, TRAINER_BERNIE_5}, 0x0, 0x1d},
- [REMATCH_ETHAN] = {{TRAINER_ETHAN_1, TRAINER_ETHAN_2, TRAINER_ETHAN_3, TRAINER_ETHAN_4, TRAINER_ETHAN_5}, 0x18, 0xd},
- [REMATCH_JOHN_AND_JAY] = {{TRAINER_JOHN_AND_JAY_1, TRAINER_JOHN_AND_JAY_2, TRAINER_JOHN_AND_JAY_3, TRAINER_JOHN_AND_JAY_4, TRAINER_JOHN_AND_JAY_5}, 0x18, 0x1},
- [REMATCH_JEFFREY] = {{TRAINER_JEFFREY_1, TRAINER_JEFFREY_2, TRAINER_JEFFREY_3, TRAINER_JEFFREY_4, TRAINER_JEFFREY_5}, 0x0, 0x23},
- [REMATCH_CAMERON] = {{TRAINER_CAMERON_1, TRAINER_CAMERON_2, TRAINER_CAMERON_3, TRAINER_CAMERON_4, TRAINER_CAMERON_5}, 0x0, 0x26},
- [REMATCH_JACKI] = {{TRAINER_JACKI_1, TRAINER_JACKI_2, TRAINER_JACKI_3, TRAINER_JACKI_4, TRAINER_JACKI_5}, 0x0, 0x26},
- [REMATCH_WALTER] = {{TRAINER_WALTER_1, TRAINER_WALTER_2, TRAINER_WALTER_3, TRAINER_WALTER_4, TRAINER_WALTER_5}, 0x0, 0x24},
- [REMATCH_KAREN] = {{TRAINER_KAREN_1, TRAINER_KAREN_2, TRAINER_KAREN_3, TRAINER_KAREN_4, TRAINER_KAREN_5}, 0x0, 0x1f},
- [REMATCH_JERRY] = {{TRAINER_JERRY_1, TRAINER_JERRY_2, TRAINER_JERRY_3, TRAINER_JERRY_4, TRAINER_JERRY_5}, 0x0, 0x1f},
- [REMATCH_ANNA_AND_MEG] = {{TRAINER_ANNA_AND_MEG_1, TRAINER_ANNA_AND_MEG_2, TRAINER_ANNA_AND_MEG_3, TRAINER_ANNA_AND_MEG_4, TRAINER_ANNA_AND_MEG_5}, 0x0, 0x20},
- [REMATCH_ISABEL] = {{TRAINER_ISABEL_1, TRAINER_ISABEL_2, TRAINER_ISABEL_3, TRAINER_ISABEL_4, TRAINER_ISABEL_5}, 0x0, 0x19},
- [REMATCH_MIGUEL] = {{TRAINER_MIGUEL_1, TRAINER_MIGUEL_2, TRAINER_MIGUEL_3, TRAINER_MIGUEL_4, TRAINER_MIGUEL_5}, 0x0, 0x12},
- [REMATCH_TIMOTHY] = {{TRAINER_TIMOTHY_1, TRAINER_TIMOTHY_2, TRAINER_TIMOTHY_3, TRAINER_TIMOTHY_4, TRAINER_TIMOTHY_5}, 0x0, 0x1e},
- [REMATCH_SHELBY] = {{TRAINER_SHELBY_1, TRAINER_SHELBY_2, TRAINER_SHELBY_3, TRAINER_SHELBY_4, TRAINER_SHELBY_5}, 0x18, 0xc},
- [REMATCH_CALVIN] = {{TRAINER_CALVIN_1, TRAINER_CALVIN_2, TRAINER_CALVIN_3, TRAINER_CALVIN_4, TRAINER_CALVIN_5}, 0x0, 0x11},
- [REMATCH_ELLIOT] = {{TRAINER_ELLIOT_1, TRAINER_ELLIOT_2, TRAINER_ELLIOT_3, TRAINER_ELLIOT_4, TRAINER_ELLIOT_5}, 0x0, 0x15},
- [REMATCH_ISAIAH] = {{TRAINER_ISAIAH_1, TRAINER_ISAIAH_2, TRAINER_ISAIAH_3, TRAINER_ISAIAH_4, TRAINER_ISAIAH_5}, 0x0, 0x2b},
- [REMATCH_MARIA] = {{TRAINER_MARIA_1, TRAINER_MARIA_2, TRAINER_MARIA_3, TRAINER_MARIA_4, TRAINER_MARIA_5}, 0x0, 0x20},
- [REMATCH_ABIGAIL] = {{TRAINER_ABIGAIL_1, TRAINER_ABIGAIL_2, TRAINER_ABIGAIL_3, TRAINER_ABIGAIL_4, TRAINER_ABIGAIL_5}, 0x0, 0x19},
- [REMATCH_DYLAN] = {{TRAINER_DYLAN_1, TRAINER_DYLAN_2, TRAINER_DYLAN_3, TRAINER_DYLAN_4, TRAINER_DYLAN_5}, 0x0, 0x20},
- [REMATCH_KATELYN] = {{TRAINER_KATELYN_1, TRAINER_KATELYN_2, TRAINER_KATELYN_3, TRAINER_KATELYN_4, TRAINER_KATELYN_5}, 0x0, 0x2b},
- [REMATCH_BENJAMIN] = {{TRAINER_BENJAMIN_1, TRAINER_BENJAMIN_2, TRAINER_BENJAMIN_3, TRAINER_BENJAMIN_4, TRAINER_BENJAMIN_5}, 0x0, 0x19},
- [REMATCH_PABLO] = {{TRAINER_PABLO_1, TRAINER_PABLO_2, TRAINER_PABLO_3, TRAINER_PABLO_4, TRAINER_PABLO_5}, 0x0, 0x29},
- [REMATCH_NICOLAS] = {{TRAINER_NICOLAS_1, TRAINER_NICOLAS_2, TRAINER_NICOLAS_3, TRAINER_NICOLAS_4, TRAINER_NICOLAS_5}, 0x18, 0x1},
- [REMATCH_ROBERT] = {{TRAINER_ROBERT_1, TRAINER_ROBERT_2, TRAINER_ROBERT_3, TRAINER_ROBERT_4, TRAINER_ROBERT_5}, 0x0, 0x23},
- [REMATCH_LAO] = {{TRAINER_LAO_1, TRAINER_LAO_2, TRAINER_LAO_3, TRAINER_LAO_4, TRAINER_LAO_5}, 0x0, 0x1c},
- [REMATCH_CYNDY] = {{TRAINER_CYNDY_1, TRAINER_CYNDY_2, TRAINER_CYNDY_3, TRAINER_CYNDY_4, TRAINER_CYNDY_5}, 0x0, 0x1e},
- [REMATCH_MADELINE] = {{TRAINER_MADELINE_1, TRAINER_MADELINE_2, TRAINER_MADELINE_3, TRAINER_MADELINE_4, TRAINER_MADELINE_5}, 0x0, 0x1c},
- [REMATCH_JENNY] = {{TRAINER_JENNY_1, TRAINER_JENNY_2, TRAINER_JENNY_3, TRAINER_JENNY_4, TRAINER_JENNY_5}, 0x0, 0x27},
- [REMATCH_DIANA] = {{TRAINER_DIANA_1, TRAINER_DIANA_2, TRAINER_DIANA_3, TRAINER_DIANA_4, TRAINER_DIANA_5}, 0x18, 0xd},
- [REMATCH_AMY_AND_LIV] = {{TRAINER_AMY_AND_LIV_1, TRAINER_AMY_AND_LIV_2, TRAINER_AMY_AND_LIV_4, TRAINER_AMY_AND_LIV_5, TRAINER_AMY_AND_LIV_6}, 0x0, 0x12},
- [REMATCH_ERNEST] = {{TRAINER_ERNEST_1, TRAINER_ERNEST_2, TRAINER_ERNEST_3, TRAINER_ERNEST_4, TRAINER_ERNEST_5}, 0x0, 0x28},
- [REMATCH_CORY] = {{TRAINER_CORY_1, TRAINER_CORY_2, TRAINER_CORY_3, TRAINER_CORY_4, TRAINER_CORY_5}, 0x0, 0x17},
- [REMATCH_EDWIN] = {{TRAINER_EDWIN_1, TRAINER_EDWIN_2, TRAINER_EDWIN_3, TRAINER_EDWIN_4, TRAINER_EDWIN_5}, 0x0, 0x19},
- [REMATCH_LYDIA] = {{TRAINER_LYDIA_1, TRAINER_LYDIA_2, TRAINER_LYDIA_3, TRAINER_LYDIA_4, TRAINER_LYDIA_5}, 0x0, 0x20},
- [REMATCH_ISAAC] = {{TRAINER_ISAAC_1, TRAINER_ISAAC_2, TRAINER_ISAAC_3, TRAINER_ISAAC_4, TRAINER_ISAAC_5}, 0x0, 0x20},
- [REMATCH_GABRIELLE] = {{TRAINER_GABRIELLE_1, TRAINER_GABRIELLE_2, TRAINER_GABRIELLE_3, TRAINER_GABRIELLE_4, TRAINER_GABRIELLE_5}, 0x18, 0x11},
- [REMATCH_CATHERINE] = {{TRAINER_CATHERINE_1, TRAINER_CATHERINE_2, TRAINER_CATHERINE_3, TRAINER_CATHERINE_4, TRAINER_CATHERINE_5}, 0x0, 0x22},
- [REMATCH_JACKSON] = {{TRAINER_JACKSON_1, TRAINER_JACKSON_2, TRAINER_JACKSON_3, TRAINER_JACKSON_4, TRAINER_JACKSON_5}, 0x0, 0x22},
- [REMATCH_HALEY] = {{TRAINER_HALEY_1, TRAINER_HALEY_2, TRAINER_HALEY_3, TRAINER_HALEY_4, TRAINER_HALEY_5}, 0x0, 0x13},
- [REMATCH_JAMES] = {{TRAINER_JAMES_1, TRAINER_JAMES_2, TRAINER_JAMES_3, TRAINER_JAMES_4, TRAINER_JAMES_5}, 0x18, 0xb},
- [REMATCH_TRENT] = {{TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5}, 0x0, 0x1b},
- [REMATCH_SAWYER] = {{TRAINER_SAWYER_1, TRAINER_SAWYER_2, TRAINER_SAWYER_3, TRAINER_SAWYER_4, TRAINER_SAWYER_5}, 0x18, 0xc},
- [REMATCH_KIRA_AND_DAN] = {{TRAINER_KIRA_AND_DAN_1, TRAINER_KIRA_AND_DAN_2, TRAINER_KIRA_AND_DAN_3, TRAINER_KIRA_AND_DAN_4, TRAINER_KIRA_AND_DAN_5}, 0x18, 0x3e},
- [REMATCH_WALLY_3] = {{TRAINER_WALLY_3, TRAINER_WALLY_4, TRAINER_WALLY_5, TRAINER_WALLY_6, TRAINER_WALLY_6}, 0x18, 0x2b},
- [REMATCH_ROXANNE] = {{TRAINER_ROXANNE_1, TRAINER_ROXANNE_2, TRAINER_ROXANNE_3, TRAINER_ROXANNE_4, TRAINER_ROXANNE_5}, 0x0, 0x3},
- [REMATCH_BRAWLY] = {{TRAINER_BRAWLY_1, TRAINER_BRAWLY_2, TRAINER_BRAWLY_3, TRAINER_BRAWLY_4, TRAINER_BRAWLY_5}, 0x0, 0xb},
- [REMATCH_WATTSON] = {{TRAINER_WATTSON_1, TRAINER_WATTSON_2, TRAINER_WATTSON_3, TRAINER_WATTSON_4, TRAINER_WATTSON_5}, 0x0, 0x2},
- [REMATCH_FLANNERY] = {{TRAINER_FLANNERY_1, TRAINER_FLANNERY_2, TRAINER_FLANNERY_3, TRAINER_FLANNERY_4, TRAINER_FLANNERY_5}, 0x0, 0xc},
- [REMATCH_NORMAN] = {{TRAINER_NORMAN_1, TRAINER_NORMAN_2, TRAINER_NORMAN_3, TRAINER_NORMAN_4, TRAINER_NORMAN_5}, 0x0, 0x0},
- [REMATCH_WINONA] = {{TRAINER_WINONA_1, TRAINER_WINONA_2, TRAINER_WINONA_3, TRAINER_WINONA_4, TRAINER_WINONA_5}, 0x0, 0x4},
- [REMATCH_TATE_AND_LIZA] = {{TRAINER_TATE_AND_LIZA_1, TRAINER_TATE_AND_LIZA_2, TRAINER_TATE_AND_LIZA_3, TRAINER_TATE_AND_LIZA_4, TRAINER_TATE_AND_LIZA_5}, 0x0, 0x6},
- [REMATCH_JUAN] = {{TRAINER_JUAN_1, TRAINER_JUAN_2, TRAINER_JUAN_3, TRAINER_JUAN_4, TRAINER_JUAN_5}, 0x0, 0x7},
- [REMATCH_SIDNEY] = {{TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY}, 0x0, 0x8},
- [REMATCH_PHOEBE] = {{TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE}, 0x0, 0x8},
- [REMATCH_GLACIA] = {{TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA}, 0x0, 0x8},
- [REMATCH_DRAKE] = {{TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE}, 0x0, 0x8},
- [REMATCH_WALLACE] = {{TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE}, 0x0, 0x8},
+ [REMATCH_ROSE] = REMATCH(TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_3, TRAINER_ROSE_4, TRAINER_ROSE_5, ROUTE118),
+ [REMATCH_ANDRES] = REMATCH(TRAINER_ANDRES_1, TRAINER_ANDRES_2, TRAINER_ANDRES_3, TRAINER_ANDRES_4, TRAINER_ANDRES_5, ROUTE105),
+ [REMATCH_DUSTY] = REMATCH(TRAINER_DUSTY_1, TRAINER_DUSTY_2, TRAINER_DUSTY_3, TRAINER_DUSTY_4, TRAINER_DUSTY_5, ROUTE111),
+ [REMATCH_LOLA] = REMATCH(TRAINER_LOLA_1, TRAINER_LOLA_2, TRAINER_LOLA_3, TRAINER_LOLA_4, TRAINER_LOLA_5, ROUTE109),
+ [REMATCH_RICKY] = REMATCH(TRAINER_RICKY_1, TRAINER_RICKY_2, TRAINER_RICKY_3, TRAINER_RICKY_4, TRAINER_RICKY_5, ROUTE109),
+ [REMATCH_LILA_AND_ROY] = REMATCH(TRAINER_LILA_AND_ROY_1, TRAINER_LILA_AND_ROY_2, TRAINER_LILA_AND_ROY_3, TRAINER_LILA_AND_ROY_4, TRAINER_LILA_AND_ROY_5, ROUTE124),
+ [REMATCH_CRISTIN] = REMATCH(TRAINER_CRISTIN_1, TRAINER_CRISTIN_2, TRAINER_CRISTIN_3, TRAINER_CRISTIN_4, TRAINER_CRISTIN_5, ROUTE121),
+ [REMATCH_BROOKE] = REMATCH(TRAINER_BROOKE_1, TRAINER_BROOKE_2, TRAINER_BROOKE_3, TRAINER_BROOKE_4, TRAINER_BROOKE_5, ROUTE111),
+ [REMATCH_WILTON] = REMATCH(TRAINER_WILTON_1, TRAINER_WILTON_2, TRAINER_WILTON_3, TRAINER_WILTON_4, TRAINER_WILTON_5, ROUTE111),
+ [REMATCH_VALERIE] = REMATCH(TRAINER_VALERIE_1, TRAINER_VALERIE_2, TRAINER_VALERIE_3, TRAINER_VALERIE_4, TRAINER_VALERIE_5, MT_PYRE_6F),
+ [REMATCH_CINDY] = REMATCH(TRAINER_CINDY_1, TRAINER_CINDY_3, TRAINER_CINDY_4, TRAINER_CINDY_5, TRAINER_CINDY_6, ROUTE104),
+ [REMATCH_THALIA] = REMATCH(TRAINER_THALIA_1, TRAINER_THALIA_2, TRAINER_THALIA_3, TRAINER_THALIA_4, TRAINER_THALIA_5, ABANDONED_SHIP_ROOMS_1F),
+ [REMATCH_JESSICA] = REMATCH(TRAINER_JESSICA_1, TRAINER_JESSICA_2, TRAINER_JESSICA_3, TRAINER_JESSICA_4, TRAINER_JESSICA_5, ROUTE121),
+ [REMATCH_WINSTON] = REMATCH(TRAINER_WINSTON_1, TRAINER_WINSTON_2, TRAINER_WINSTON_3, TRAINER_WINSTON_4, TRAINER_WINSTON_5, ROUTE104),
+ [REMATCH_STEVE] = REMATCH(TRAINER_STEVE_1, TRAINER_STEVE_2, TRAINER_STEVE_3, TRAINER_STEVE_4, TRAINER_STEVE_5, ROUTE114),
+ [REMATCH_TONY] = REMATCH(TRAINER_TONY_1, TRAINER_TONY_2, TRAINER_TONY_3, TRAINER_TONY_4, TRAINER_TONY_5, ROUTE107),
+ [REMATCH_NOB] = REMATCH(TRAINER_NOB_1, TRAINER_NOB_2, TRAINER_NOB_3, TRAINER_NOB_4, TRAINER_NOB_5, ROUTE115),
+ [REMATCH_KOJI] = REMATCH(TRAINER_KOJI_1, TRAINER_KOJI_2, TRAINER_KOJI_3, TRAINER_KOJI_4, TRAINER_KOJI_5, ROUTE127),
+ [REMATCH_FERNANDO] = REMATCH(TRAINER_FERNANDO_1, TRAINER_FERNANDO_2, TRAINER_FERNANDO_3, TRAINER_FERNANDO_4, TRAINER_FERNANDO_5, ROUTE123),
+ [REMATCH_DALTON] = REMATCH(TRAINER_DALTON_1, TRAINER_DALTON_2, TRAINER_DALTON_3, TRAINER_DALTON_4, TRAINER_DALTON_5, ROUTE118),
+ [REMATCH_BERNIE] = REMATCH(TRAINER_BERNIE_1, TRAINER_BERNIE_2, TRAINER_BERNIE_3, TRAINER_BERNIE_4, TRAINER_BERNIE_5, ROUTE114),
+ [REMATCH_ETHAN] = REMATCH(TRAINER_ETHAN_1, TRAINER_ETHAN_2, TRAINER_ETHAN_3, TRAINER_ETHAN_4, TRAINER_ETHAN_5, JAGGED_PASS),
+ [REMATCH_JOHN_AND_JAY] = REMATCH(TRAINER_JOHN_AND_JAY_1, TRAINER_JOHN_AND_JAY_2, TRAINER_JOHN_AND_JAY_3, TRAINER_JOHN_AND_JAY_4, TRAINER_JOHN_AND_JAY_5, METEOR_FALLS_1F_2R),
+ [REMATCH_JEFFREY] = REMATCH(TRAINER_JEFFREY_1, TRAINER_JEFFREY_2, TRAINER_JEFFREY_3, TRAINER_JEFFREY_4, TRAINER_JEFFREY_5, ROUTE120),
+ [REMATCH_CAMERON] = REMATCH(TRAINER_CAMERON_1, TRAINER_CAMERON_2, TRAINER_CAMERON_3, TRAINER_CAMERON_4, TRAINER_CAMERON_5, ROUTE123),
+ [REMATCH_JACKI] = REMATCH(TRAINER_JACKI_1, TRAINER_JACKI_2, TRAINER_JACKI_3, TRAINER_JACKI_4, TRAINER_JACKI_5, ROUTE123),
+ [REMATCH_WALTER] = REMATCH(TRAINER_WALTER_1, TRAINER_WALTER_2, TRAINER_WALTER_3, TRAINER_WALTER_4, TRAINER_WALTER_5, ROUTE121),
+ [REMATCH_KAREN] = REMATCH(TRAINER_KAREN_1, TRAINER_KAREN_2, TRAINER_KAREN_3, TRAINER_KAREN_4, TRAINER_KAREN_5, ROUTE116),
+ [REMATCH_JERRY] = REMATCH(TRAINER_JERRY_1, TRAINER_JERRY_2, TRAINER_JERRY_3, TRAINER_JERRY_4, TRAINER_JERRY_5, ROUTE116),
+ [REMATCH_ANNA_AND_MEG] = REMATCH(TRAINER_ANNA_AND_MEG_1, TRAINER_ANNA_AND_MEG_2, TRAINER_ANNA_AND_MEG_3, TRAINER_ANNA_AND_MEG_4, TRAINER_ANNA_AND_MEG_5, ROUTE117),
+ [REMATCH_ISABEL] = REMATCH(TRAINER_ISABEL_1, TRAINER_ISABEL_2, TRAINER_ISABEL_3, TRAINER_ISABEL_4, TRAINER_ISABEL_5, ROUTE110),
+ [REMATCH_MIGUEL] = REMATCH(TRAINER_MIGUEL_1, TRAINER_MIGUEL_2, TRAINER_MIGUEL_3, TRAINER_MIGUEL_4, TRAINER_MIGUEL_5, ROUTE103),
+ [REMATCH_TIMOTHY] = REMATCH(TRAINER_TIMOTHY_1, TRAINER_TIMOTHY_2, TRAINER_TIMOTHY_3, TRAINER_TIMOTHY_4, TRAINER_TIMOTHY_5, ROUTE115),
+ [REMATCH_SHELBY] = REMATCH(TRAINER_SHELBY_1, TRAINER_SHELBY_2, TRAINER_SHELBY_3, TRAINER_SHELBY_4, TRAINER_SHELBY_5, MT_CHIMNEY),
+ [REMATCH_CALVIN] = REMATCH(TRAINER_CALVIN_1, TRAINER_CALVIN_2, TRAINER_CALVIN_3, TRAINER_CALVIN_4, TRAINER_CALVIN_5, ROUTE102),
+ [REMATCH_ELLIOT] = REMATCH(TRAINER_ELLIOT_1, TRAINER_ELLIOT_2, TRAINER_ELLIOT_3, TRAINER_ELLIOT_4, TRAINER_ELLIOT_5, ROUTE106),
+ [REMATCH_ISAIAH] = REMATCH(TRAINER_ISAIAH_1, TRAINER_ISAIAH_2, TRAINER_ISAIAH_3, TRAINER_ISAIAH_4, TRAINER_ISAIAH_5, ROUTE128),
+ [REMATCH_MARIA] = REMATCH(TRAINER_MARIA_1, TRAINER_MARIA_2, TRAINER_MARIA_3, TRAINER_MARIA_4, TRAINER_MARIA_5, ROUTE117),
+ [REMATCH_ABIGAIL] = REMATCH(TRAINER_ABIGAIL_1, TRAINER_ABIGAIL_2, TRAINER_ABIGAIL_3, TRAINER_ABIGAIL_4, TRAINER_ABIGAIL_5, ROUTE110),
+ [REMATCH_DYLAN] = REMATCH(TRAINER_DYLAN_1, TRAINER_DYLAN_2, TRAINER_DYLAN_3, TRAINER_DYLAN_4, TRAINER_DYLAN_5, ROUTE117),
+ [REMATCH_KATELYN] = REMATCH(TRAINER_KATELYN_1, TRAINER_KATELYN_2, TRAINER_KATELYN_3, TRAINER_KATELYN_4, TRAINER_KATELYN_5, ROUTE128),
+ [REMATCH_BENJAMIN] = REMATCH(TRAINER_BENJAMIN_1, TRAINER_BENJAMIN_2, TRAINER_BENJAMIN_3, TRAINER_BENJAMIN_4, TRAINER_BENJAMIN_5, ROUTE110),
+ [REMATCH_PABLO] = REMATCH(TRAINER_PABLO_1, TRAINER_PABLO_2, TRAINER_PABLO_3, TRAINER_PABLO_4, TRAINER_PABLO_5, ROUTE126),
+ [REMATCH_NICOLAS] = REMATCH(TRAINER_NICOLAS_1, TRAINER_NICOLAS_2, TRAINER_NICOLAS_3, TRAINER_NICOLAS_4, TRAINER_NICOLAS_5, METEOR_FALLS_1F_2R),
+ [REMATCH_ROBERT] = REMATCH(TRAINER_ROBERT_1, TRAINER_ROBERT_2, TRAINER_ROBERT_3, TRAINER_ROBERT_4, TRAINER_ROBERT_5, ROUTE120),
+ [REMATCH_LAO] = REMATCH(TRAINER_LAO_1, TRAINER_LAO_2, TRAINER_LAO_3, TRAINER_LAO_4, TRAINER_LAO_5, ROUTE113),
+ [REMATCH_CYNDY] = REMATCH(TRAINER_CYNDY_1, TRAINER_CYNDY_2, TRAINER_CYNDY_3, TRAINER_CYNDY_4, TRAINER_CYNDY_5, ROUTE115),
+ [REMATCH_MADELINE] = REMATCH(TRAINER_MADELINE_1, TRAINER_MADELINE_2, TRAINER_MADELINE_3, TRAINER_MADELINE_4, TRAINER_MADELINE_5, ROUTE113),
+ [REMATCH_JENNY] = REMATCH(TRAINER_JENNY_1, TRAINER_JENNY_2, TRAINER_JENNY_3, TRAINER_JENNY_4, TRAINER_JENNY_5, ROUTE124),
+ [REMATCH_DIANA] = REMATCH(TRAINER_DIANA_1, TRAINER_DIANA_2, TRAINER_DIANA_3, TRAINER_DIANA_4, TRAINER_DIANA_5, JAGGED_PASS),
+ [REMATCH_AMY_AND_LIV] = REMATCH(TRAINER_AMY_AND_LIV_1, TRAINER_AMY_AND_LIV_2, TRAINER_AMY_AND_LIV_4, TRAINER_AMY_AND_LIV_5, TRAINER_AMY_AND_LIV_6, ROUTE103),
+ [REMATCH_ERNEST] = REMATCH(TRAINER_ERNEST_1, TRAINER_ERNEST_2, TRAINER_ERNEST_3, TRAINER_ERNEST_4, TRAINER_ERNEST_5, ROUTE125),
+ [REMATCH_CORY] = REMATCH(TRAINER_CORY_1, TRAINER_CORY_2, TRAINER_CORY_3, TRAINER_CORY_4, TRAINER_CORY_5, ROUTE108),
+ [REMATCH_EDWIN] = REMATCH(TRAINER_EDWIN_1, TRAINER_EDWIN_2, TRAINER_EDWIN_3, TRAINER_EDWIN_4, TRAINER_EDWIN_5, ROUTE110),
+ [REMATCH_LYDIA] = REMATCH(TRAINER_LYDIA_1, TRAINER_LYDIA_2, TRAINER_LYDIA_3, TRAINER_LYDIA_4, TRAINER_LYDIA_5, ROUTE117),
+ [REMATCH_ISAAC] = REMATCH(TRAINER_ISAAC_1, TRAINER_ISAAC_2, TRAINER_ISAAC_3, TRAINER_ISAAC_4, TRAINER_ISAAC_5, ROUTE117),
+ [REMATCH_GABRIELLE] = REMATCH(TRAINER_GABRIELLE_1, TRAINER_GABRIELLE_2, TRAINER_GABRIELLE_3, TRAINER_GABRIELLE_4, TRAINER_GABRIELLE_5, MT_PYRE_3F),
+ [REMATCH_CATHERINE] = REMATCH(TRAINER_CATHERINE_1, TRAINER_CATHERINE_2, TRAINER_CATHERINE_3, TRAINER_CATHERINE_4, TRAINER_CATHERINE_5, ROUTE119),
+ [REMATCH_JACKSON] = REMATCH(TRAINER_JACKSON_1, TRAINER_JACKSON_2, TRAINER_JACKSON_3, TRAINER_JACKSON_4, TRAINER_JACKSON_5, ROUTE119),
+ [REMATCH_HALEY] = REMATCH(TRAINER_HALEY_1, TRAINER_HALEY_2, TRAINER_HALEY_3, TRAINER_HALEY_4, TRAINER_HALEY_5, ROUTE104),
+ [REMATCH_JAMES] = REMATCH(TRAINER_JAMES_1, TRAINER_JAMES_2, TRAINER_JAMES_3, TRAINER_JAMES_4, TRAINER_JAMES_5, PETALBURG_WOODS),
+ [REMATCH_TRENT] = REMATCH(TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5, ROUTE112),
+ [REMATCH_SAWYER] = REMATCH(TRAINER_SAWYER_1, TRAINER_SAWYER_2, TRAINER_SAWYER_3, TRAINER_SAWYER_4, TRAINER_SAWYER_5, MT_CHIMNEY),
+ [REMATCH_KIRA_AND_DAN] = REMATCH(TRAINER_KIRA_AND_DAN_1, TRAINER_KIRA_AND_DAN_2, TRAINER_KIRA_AND_DAN_3, TRAINER_KIRA_AND_DAN_4, TRAINER_KIRA_AND_DAN_5, ABANDONED_SHIP_ROOMS2_1F),
+ [REMATCH_WALLY_3] = REMATCH(TRAINER_WALLY_3, TRAINER_WALLY_4, TRAINER_WALLY_5, TRAINER_WALLY_6, TRAINER_WALLY_6, VICTORY_ROAD_1F),
+ [REMATCH_ROXANNE] = REMATCH(TRAINER_ROXANNE_1, TRAINER_ROXANNE_2, TRAINER_ROXANNE_3, TRAINER_ROXANNE_4, TRAINER_ROXANNE_5, RUSTBORO_CITY),
+ [REMATCH_BRAWLY] = REMATCH(TRAINER_BRAWLY_1, TRAINER_BRAWLY_2, TRAINER_BRAWLY_3, TRAINER_BRAWLY_4, TRAINER_BRAWLY_5, DEWFORD_TOWN),
+ [REMATCH_WATTSON] = REMATCH(TRAINER_WATTSON_1, TRAINER_WATTSON_2, TRAINER_WATTSON_3, TRAINER_WATTSON_4, TRAINER_WATTSON_5, MAUVILLE_CITY),
+ [REMATCH_FLANNERY] = REMATCH(TRAINER_FLANNERY_1, TRAINER_FLANNERY_2, TRAINER_FLANNERY_3, TRAINER_FLANNERY_4, TRAINER_FLANNERY_5, LAVARIDGE_TOWN),
+ [REMATCH_NORMAN] = REMATCH(TRAINER_NORMAN_1, TRAINER_NORMAN_2, TRAINER_NORMAN_3, TRAINER_NORMAN_4, TRAINER_NORMAN_5, PETALBURG_CITY),
+ [REMATCH_WINONA] = REMATCH(TRAINER_WINONA_1, TRAINER_WINONA_2, TRAINER_WINONA_3, TRAINER_WINONA_4, TRAINER_WINONA_5, FORTREE_CITY),
+ [REMATCH_TATE_AND_LIZA] = REMATCH(TRAINER_TATE_AND_LIZA_1, TRAINER_TATE_AND_LIZA_2, TRAINER_TATE_AND_LIZA_3, TRAINER_TATE_AND_LIZA_4, TRAINER_TATE_AND_LIZA_5, MOSSDEEP_CITY),
+ [REMATCH_JUAN] = REMATCH(TRAINER_JUAN_1, TRAINER_JUAN_2, TRAINER_JUAN_3, TRAINER_JUAN_4, TRAINER_JUAN_5, SOOTOPOLIS_CITY),
+ [REMATCH_SIDNEY] = REMATCH(TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, EVER_GRANDE_CITY),
+ [REMATCH_PHOEBE] = REMATCH(TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, EVER_GRANDE_CITY),
+ [REMATCH_GLACIA] = REMATCH(TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, EVER_GRANDE_CITY),
+ [REMATCH_DRAKE] = REMATCH(TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, EVER_GRANDE_CITY),
+ [REMATCH_WALLACE] = REMATCH(TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, EVER_GRANDE_CITY),
};
static const u16 sBadgeFlags[8] =
diff --git a/src/battle_tower.c b/src/battle_tower.c
index 6f8e3e25f..8ef848e39 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -3190,7 +3190,7 @@ static void FillPartnerParty(u16 trainerId)
sStevenMons[i].level,
sStevenMons[i].fixedIV,
TRUE, i, // BUG: personality was stored in the 'j' variable. As a result, Steven's pokemon do not have the intended natures.
- TRUE, STEVEN_OTID);
+ OT_ID_PRESET, STEVEN_OTID);
for (j = 0; j < 6; j++)
SetMonData(&gPlayerParty[3 + i], MON_DATA_HP_EV + j, &sStevenMons[i].evs[j]);
for (j = 0; j < MAX_MON_MOVES; j++)
diff --git a/src/contest_painting.c b/src/contest_painting.c
index 66127cbbc..1b95e1ed9 100644
--- a/src/contest_painting.c
+++ b/src/contest_painting.c
@@ -292,7 +292,7 @@ static void PrintContestPaintingCaption(u8 contestType, u8 arg1)
category = gUnknown_030061C0->contestCategory;
if (contestType < 8)
{
- sub_818E868(gStringVar1, category);
+ BufferContestName(gStringVar1, category);
StringAppend(gStringVar1, gText_Space);
StringAppend(gStringVar1, gContestRankTextPointers[gUnknown_030061C0->contestRank]);
StringCopy(gStringVar2, gUnknown_030061C0->trainerName);
diff --git a/src/credits.c b/src/credits.c
index 1e96514b1..44fa2002c 100644
--- a/src/credits.c
+++ b/src/credits.c
@@ -143,7 +143,7 @@ struct Unk201C000
struct CreditsEntry
{
u8 var_0;
- u8 var_1;
+ bool8 isTitle;
const u8 *text;
};
@@ -165,7 +165,7 @@ static const u32 gCreditsCopyrightEnd_Gfx[] = INCBIN_U32("graphics/credits/the_e
static void sub_81772B8(struct Sprite *sprite);
-static const u8 gUnknown_085E5BAC[] =
+static const u8 sTheEnd_LetterTMap[] =
{
0, 1, 0,
0xFF, 1, 0xFF,
@@ -174,7 +174,7 @@ static const u8 gUnknown_085E5BAC[] =
0xFF, 1, 0xFF,
};
-static const u8 gUnknown_085E5BBB[] =
+static const u8 sTheEnd_LetterHMap[] =
{
1, 0xFF, 1,
1, 0xFF, 1,
@@ -183,7 +183,7 @@ static const u8 gUnknown_085E5BBB[] =
1, 0xFF, 1,
};
-static const u8 gUnknown_085E5BCA[] =
+static const u8 sTheEnd_LetterEMap[] =
{
1, 0, 0,
1, 0xFF, 0xFF,
@@ -192,7 +192,7 @@ static const u8 gUnknown_085E5BCA[] =
1, 0x80, 0x80,
};
-static const u8 gUnknown_085E5BD9[] =
+static const u8 sTheEnd_LetterNMap[] =
{
1, 3, 1,
1, 4, 1,
@@ -201,7 +201,7 @@ static const u8 gUnknown_085E5BD9[] =
1, 0xC3, 1,
};
-static const u8 gUnknown_085E5BE8[] =
+static const u8 sTheEnd_LetterDMap[] =
{
1, 6, 7,
1, 8, 9,
@@ -369,165 +369,165 @@ static const u8 gCreditsText_MotoyasuTojima[] = _("Motoyasu Tojima");
static const u8 gCreditsText_NicolaPrattBarlow[] = _("Nicola Pratt-Barlow");
static const u8 gCreditsText_ShellieDow[] = _("Shellie Dow");
static const u8 gCreditsText_ErikJohnson[] = _("Erik Johnson");
-static const struct CreditsEntry gCreditsEntry_EmptyString[] = {0, 0, gCreditsText_EmptyString};
-static const struct CreditsEntry gCreditsEntry_PkmnEmeraldVersion[] = {7, 1, gCreditsText_PkmnEmeraldVersion};
-static const struct CreditsEntry gCreditsEntry_Credits[] = {11, 1, gCreditsText_Credits};
-static const struct CreditsEntry gCreditsEntry_ExecutiveDirector[] = {8, 1, gCreditsText_ExecutiveDirector};
-static const struct CreditsEntry gCreditsEntry_Director[] = {12, 1, gCreditsText_Director};
-static const struct CreditsEntry gCreditsEntry_ArtDirector[] = {10, 1, gCreditsText_ArtDirector};
-static const struct CreditsEntry gCreditsEntry_BattleDirector[] = {10, 1, gCreditsText_BattleDirector};
-static const struct CreditsEntry gCreditsEntry_MainProgrammer[] = {10, 1, gCreditsText_MainProgrammer};
-static const struct CreditsEntry gCreditsEntry_BattleSystemPgrms[] = {8, 1, gCreditsText_BattleSystemPgrms};
-static const struct CreditsEntry gCreditsEntry_FieldSystemPgrms[] = {7, 1, gCreditsText_FieldSystemPgrms};
-static const struct CreditsEntry gCreditsEntry_Programmers[] = {12, 1, gCreditsText_Programmers};
-static const struct CreditsEntry gCreditsEntry_MainGraphicDesigner[] = {7, 1, gCreditsText_MainGraphicDesigner};
-static const struct CreditsEntry gCreditsEntry_GraphicDesigners[] = {9, 1, gCreditsText_GraphicDesigners};
-static const struct CreditsEntry gCreditsEntry_PkmnDesigners[] = {10, 1, gCreditsText_PkmnDesigners};
-static const struct CreditsEntry gCreditsEntry_MusicComposition[] = {13, 1, gCreditsText_MusicComposition};
-static const struct CreditsEntry gCreditsEntry_SoundEffectsAndPkmnVoices[] = {4, 1, gCreditsText_SoundEffectsAndPkmnVoices};
-static const struct CreditsEntry gCreditsEntry_GameDesigners[] = {11, 1, gCreditsText_GameDesigners};
-static const struct CreditsEntry gCreditsEntry_ScenarioPlot[] = {11, 1, gCreditsText_ScenarioPlot};
-static const struct CreditsEntry gCreditsEntry_Scenario[] = {13, 1, gCreditsText_Scenario};
-static const struct CreditsEntry gCreditsEntry_ScriptDesigners[] = {10, 1, gCreditsText_ScriptDesigners};
-static const struct CreditsEntry gCreditsEntry_MapDesigners[] = {11, 1, gCreditsText_MapDesigners};
-static const struct CreditsEntry gCreditsEntry_MapDataDesigners[] = {9, 1, gCreditsText_MapDataDesigners};
-static const struct CreditsEntry gCreditsEntry_ParametricDesigners[] = {9, 1, gCreditsText_ParametricDesigners};
-static const struct CreditsEntry gCreditsEntry_PokedexText[] = {11, 1, gCreditsText_PokedexText};
-static const struct CreditsEntry gCreditsEntry_EnvAndToolPgrms[] = {6, 1, gCreditsText_EnvAndToolPgrms};
-static const struct CreditsEntry gCreditsEntry_NCLProductTesting[] = {11, 1, gCreditsText_NCLProductTesting};
-static const struct CreditsEntry gCreditsEntry_SpecialThanks[] = {10, 1, gCreditsText_SpecialThanks};
-static const struct CreditsEntry gCreditsEntry_Coordinators[] = {11, 1, gCreditsText_Coordinators};
-static const struct CreditsEntry gCreditsEntry_Producers[] = {11, 1, gCreditsText_Producers};
-static const struct CreditsEntry gCreditsEntry_ExecProducers[] = {7, 1, gCreditsText_ExecProducers};
-static const struct CreditsEntry gCreditsEntry_InfoSupervisors[] = {10, 1, gCreditsText_InfoSupervisors};
-static const struct CreditsEntry gCreditsEntry_TaskManagers[] = {8, 1, gCreditsText_TaskManagers};
-static const struct CreditsEntry gCreditsEntry_BrailleCodeCheck[] = {10, 1, gCreditsText_BrailleCodeCheck};
-static const struct CreditsEntry gCreditsEntry_WorldDirector[] = {10, 1, gCreditsText_WorldDirector};
-static const struct CreditsEntry gCreditsEntry_BattleFrontierData[] = {8, 1, gCreditsText_BattleFrontierData};
-static const struct CreditsEntry gCreditsEntry_SupportProgrammers[] = {10, 1, gCreditsText_SupportProgrammers};
-static const struct CreditsEntry gCreditsEntry_Artwork[] = {12, 1, gCreditsText_Artwork};
-static const struct CreditsEntry gCreditsEntry_LeadProgrammer[] = {10, 1, gCreditsText_LeadProgrammer};
-static const struct CreditsEntry gCreditsEntry_LeadGraphicArtist[] = {9, 1, gCreditsText_LeadGraphicArtist};
-static const struct CreditsEntry gCreditsEntry_SatoshiTajiri[] = {11, 0, gCreditsText_SatoshiTajiri};
-static const struct CreditsEntry gCreditsEntry_JunichiMasuda[] = {11, 0, gCreditsText_JunichiMasuda};
-static const struct CreditsEntry gCreditsEntry_KenSugimori[] = {11, 0, gCreditsText_KenSugimori};
-static const struct CreditsEntry gCreditsEntry_ShigekiMorimoto[] = {11, 0, gCreditsText_ShigekiMorimoto};
-static const struct CreditsEntry gCreditsEntry_TetsuyaWatanabe[] = {11, 0, gCreditsText_TetsuyaWatanabe};
-static const struct CreditsEntry gCreditsEntry_HisashiSogabe[] = {11, 0, gCreditsText_HisashiSogabe};
-static const struct CreditsEntry gCreditsEntry_SosukeTamada[] = {11, 0, gCreditsText_SosukeTamada};
-static const struct CreditsEntry gCreditsEntry_AkitoMori[] = {11, 0, gCreditsText_AkitoMori};
-static const struct CreditsEntry gCreditsEntry_KeitaKagaya[] = {11, 0, gCreditsText_KeitaKagaya};
-static const struct CreditsEntry gCreditsEntry_YoshinoriMatsuda[] = {11, 0, gCreditsText_YoshinoriMatsuda};
-static const struct CreditsEntry gCreditsEntry_HiroyukiNakamura[] = {11, 0, gCreditsText_HiroyukiNakamura};
-static const struct CreditsEntry gCreditsEntry_MasaoTaya[] = {11, 0, gCreditsText_MasaoTaya};
-static const struct CreditsEntry gCreditsEntry_SatoshiNohara[] = {11, 0, gCreditsText_SatoshiNohara};
-static const struct CreditsEntry gCreditsEntry_TomomichiOhta[] = {11, 0, gCreditsText_TomomichiOhta};
-static const struct CreditsEntry gCreditsEntry_MiyukiIwasawa[] = {11, 0, gCreditsText_MiyukiIwasawa};
-static const struct CreditsEntry gCreditsEntry_TakenoriOhta[] = {11, 0, gCreditsText_TakenoriOhta};
-static const struct CreditsEntry gCreditsEntry_HironobuYoshida[] = {11, 0, gCreditsText_HironobuYoshida};
-static const struct CreditsEntry gCreditsEntry_MotofumiFujiwara[] = {11, 0, gCreditsText_MotofumiFujiwara};
-static const struct CreditsEntry gCreditsEntry_SatoshiOhta[] = {11, 0, gCreditsText_SatoshiOhta};
-static const struct CreditsEntry gCreditsEntry_AsukaIwashita[] = {11, 0, gCreditsText_AsukaIwashita};
-static const struct CreditsEntry gCreditsEntry_AimiTomita[] = {11, 0, gCreditsText_AimiTomita};
-static const struct CreditsEntry gCreditsEntry_TakaoUnno[] = {11, 0, gCreditsText_TakaoUnno};
-static const struct CreditsEntry gCreditsEntry_KanakoEo[] = {11, 0, gCreditsText_KanakoEo};
-static const struct CreditsEntry gCreditsEntry_JunOkutani[] = {11, 0, gCreditsText_JunOkutani};
-static const struct CreditsEntry gCreditsEntry_AtsukoNishida[] = {11, 0, gCreditsText_AtsukoNishida};
-static const struct CreditsEntry gCreditsEntry_MuneoSaito[] = {11, 0, gCreditsText_MuneoSaito};
-static const struct CreditsEntry gCreditsEntry_RenaYoshikawa[] = {11, 0, gCreditsText_RenaYoshikawa};
-static const struct CreditsEntry gCreditsEntry_GoIchinose[] = {11, 0, gCreditsText_GoIchinose};
-static const struct CreditsEntry gCreditsEntry_MorikazuAoki[] = {11, 0, gCreditsText_MorikazuAoki};
-static const struct CreditsEntry gCreditsEntry_KojiNishino[] = {11, 0, gCreditsText_KojiNishino};
-static const struct CreditsEntry gCreditsEntry_KenjiMatsushima[] = {11, 0, gCreditsText_KenjiMatsushima};
-static const struct CreditsEntry gCreditsEntry_TetsujiOhta[] = {11, 0, gCreditsText_TetsujiOhta};
-static const struct CreditsEntry gCreditsEntry_HitomiSato[] = {11, 0, gCreditsText_HitomiSato};
-static const struct CreditsEntry gCreditsEntry_TakeshiKawachimaru[] = {11, 0, gCreditsText_TakeshiKawachimaru};
-static const struct CreditsEntry gCreditsEntry_TeruyukiShimoyamada[] = {11, 0, gCreditsText_TeruyukiShimoyamada};
-static const struct CreditsEntry gCreditsEntry_ShigeruOhmori[] = {11, 0, gCreditsText_ShigeruOhmori};
-static const struct CreditsEntry gCreditsEntry_TadashiTakahashi[] = {11, 0, gCreditsText_TadashiTakahashi};
-static const struct CreditsEntry gCreditsEntry_ToshinobuMatsumiya[] = {11, 0, gCreditsText_ToshinobuMatsumiya};
-static const struct CreditsEntry gCreditsEntry_AkihitoTomisawa[] = {11, 0, gCreditsText_AkihitoTomisawa};
-static const struct CreditsEntry gCreditsEntry_HirokiEnomoto[] = {11, 0, gCreditsText_HirokiEnomoto};
-static const struct CreditsEntry gCreditsEntry_KazuyukiTerada[] = {11, 0, gCreditsText_KazuyukiTerada};
-static const struct CreditsEntry gCreditsEntry_YuriSakurai[] = {11, 0, gCreditsText_YuriSakurai};
-static const struct CreditsEntry gCreditsEntry_HiromiSagawa[] = {11, 0, gCreditsText_HiromiSagawa};
-static const struct CreditsEntry gCreditsEntry_KenjiTominaga[] = {11, 0, gCreditsText_KenjiTominaga};
-static const struct CreditsEntry gCreditsEntry_YoshioTajiri[] = {11, 0, gCreditsText_YoshioTajiri};
-static const struct CreditsEntry gCreditsEntry_TeikoSasaki[] = {11, 0, gCreditsText_TeikoSasaki};
-static const struct CreditsEntry gCreditsEntry_SachikoHamano[] = {11, 0, gCreditsText_SachikoHamano};
-static const struct CreditsEntry gCreditsEntry_ChieMatsumiya[] = {11, 0, gCreditsText_ChieMatsumiya};
-static const struct CreditsEntry gCreditsEntry_AkikoShinozaki[] = {11, 0, gCreditsText_AkikoShinozaki};
-static const struct CreditsEntry gCreditsEntry_AstukoFujii[] = {11, 0, gCreditsText_AstukoFujii};
-static const struct CreditsEntry gCreditsEntry_NozomuSaito[] = {11, 0, gCreditsText_NozomuSaito};
-static const struct CreditsEntry gCreditsEntry_KenkichiToyama[] = {11, 0, gCreditsText_KenkichiToyama};
-static const struct CreditsEntry gCreditsEntry_SuguruNakatsui[] = {11, 0, gCreditsText_SuguruNakatsui};
-static const struct CreditsEntry gCreditsEntry_YumiFunasaka[] = {11, 0, gCreditsText_YumiFunasaka};
-static const struct CreditsEntry gCreditsEntry_NaokoYanase[] = {11, 0, gCreditsText_NaokoYanase};
-static const struct CreditsEntry gCreditsEntry_NCLSuperMarioClub[] = {11, 0, gCreditsText_NCLSuperMarioClub};
-static const struct CreditsEntry gCreditsEntry_AtsushiTada[] = {11, 0, gCreditsText_AtsushiTada};
-static const struct CreditsEntry gCreditsEntry_TakahiroOhnishi[] = {11, 0, gCreditsText_TakahiroOhnishi};
-static const struct CreditsEntry gCreditsEntry_NorihideOkamura[] = {11, 0, gCreditsText_NorihideOkamura};
-static const struct CreditsEntry gCreditsEntry_HiroNakamura[] = {11, 0, gCreditsText_HiroNakamura};
-static const struct CreditsEntry gCreditsEntry_HiroyukiUesugi[] = {11, 0, gCreditsText_HiroyukiUesugi};
-static const struct CreditsEntry gCreditsEntry_TerukiMurakawa[] = {11, 0, gCreditsText_TerukiMurakawa};
-static const struct CreditsEntry gCreditsEntry_AkiraKinashi[] = {11, 0, gCreditsText_AkiraKinashi};
-static const struct CreditsEntry gCreditsEntry_MichikoTakizawa[] = {11, 0, gCreditsText_MichikoTakizawa};
-static const struct CreditsEntry gCreditsEntry_MakikoTakada[] = {11, 0, gCreditsText_MakikoTakada};
-static const struct CreditsEntry gCreditsEntry_TakanaoKondo[] = {11, 0, gCreditsText_TakanaoKondo};
-static const struct CreditsEntry gCreditsEntry_AiMashima[] = {11, 0, gCreditsText_AiMashima};
-static const struct CreditsEntry gCreditsEntry_GakujiNomoto[] = {11, 0, gCreditsText_GakujiNomoto};
-static const struct CreditsEntry gCreditsEntry_TakehiroIzushi[] = {11, 0, gCreditsText_TakehiroIzushi};
-static const struct CreditsEntry gCreditsEntry_HitoshiYamagami[] = {11, 0, gCreditsText_HitoshiYamagami};
-static const struct CreditsEntry gCreditsEntry_KyokoWatanabe[] = {11, 0, gCreditsText_KyokoWatanabe};
-static const struct CreditsEntry gCreditsEntry_TakaoNakano[] = {11, 0, gCreditsText_TakaoNakano};
-static const struct CreditsEntry gCreditsEntry_HiroyukiJinnai[] = {11, 0, gCreditsText_HiroyukiJinnai};
-static const struct CreditsEntry gCreditsEntry_HiroakiTsuru[] = {11, 0, gCreditsText_HiroakiTsuru};
-static const struct CreditsEntry gCreditsEntry_TsunekazIshihara[] = {11, 0, gCreditsText_TsunekazIshihara};
-static const struct CreditsEntry gCreditsEntry_SatoruIwata[] = {11, 0, gCreditsText_SatoruIwata};
-static const struct CreditsEntry gCreditsEntry_KazuyaSuyama[] = {11, 0, gCreditsText_KazuyaSuyama};
-static const struct CreditsEntry gCreditsEntry_SatoshiMitsuhara[] = {11, 0, gCreditsText_SatoshiMitsuhara};
-static const struct CreditsEntry gCreditsEntry_JapanBrailleLibrary[] = {9, 0, gCreditsText_JapanBrailleLibrary};
-static const struct CreditsEntry gCreditsEntry_TomotakaKomura[] = {11, 0, gCreditsText_TomotakaKomura};
-static const struct CreditsEntry gCreditsEntry_MikikoOhhashi[] = {11, 0, gCreditsText_MikikoOhhashi};
-static const struct CreditsEntry gCreditsEntry_DaisukeHoshino[] = {11, 0, gCreditsText_DaisukeHoshino};
-static const struct CreditsEntry gCreditsEntry_KenjiroIto[] = {11, 0, gCreditsText_KenjiroIto};
-static const struct CreditsEntry gCreditsEntry_RuiKawaguchi[] = {11, 0, gCreditsText_RuiKawaguchi};
-static const struct CreditsEntry gCreditsEntry_ShunsukeKohori[] = {11, 0, gCreditsText_ShunsukeKohori};
-static const struct CreditsEntry gCreditsEntry_SachikoNakamichi[] = {11, 0, gCreditsText_SachikoNakamichi};
-static const struct CreditsEntry gCreditsEntry_FujikoNomura[] = {11, 0, gCreditsText_FujikoNomura};
-static const struct CreditsEntry gCreditsEntry_KazukiYoshihara[] = {11, 0, gCreditsText_KazukiYoshihara};
-static const struct CreditsEntry gCreditsEntry_RetsujiNomoto[] = {11, 0, gCreditsText_RetsujiNomoto};
-static const struct CreditsEntry gCreditsEntry_AzusaTajima[] = {11, 0, gCreditsText_AzusaTajima};
-static const struct CreditsEntry gCreditsEntry_ShusakuEgami[] = {11, 0, gCreditsText_ShusakuEgami};
-static const struct CreditsEntry gCreditsEntry_PackageAndManual[] = {0, 1, gCreditsText_PackageAndManual};
-static const struct CreditsEntry gCreditsEntry_EnglishVersion[] = {0, 1, gCreditsText_EnglishVersion};
-static const struct CreditsEntry gCreditsEntry_Translator[] = {0, 1, gCreditsText_Translator};
-static const struct CreditsEntry gCreditsEntry_TextEditor[] = {0, 1, gCreditsText_TextEditor};
-static const struct CreditsEntry gCreditsEntry_NCLCoordinator[] = {0, 1, gCreditsText_NCLCoordinator};
-static const struct CreditsEntry gCreditsEntry_GraphicDesigner[] = {0, 1, gCreditsText_GraphicDesigner};
-static const struct CreditsEntry gCreditsEntry_NOAProductTesting[] = {0, 1, gCreditsText_NOAProductTesting};
-static const struct CreditsEntry gCreditsEntry_HideyukiNakajima[] = {0, 0, gCreditsText_HideyukiNakajima};
-static const struct CreditsEntry gCreditsEntry_HidenoriSaeki[] = {0, 0, gCreditsText_HidenoriSaeki};
-static const struct CreditsEntry gCreditsEntry_YokoWatanabe[] = {0, 0, gCreditsText_YokoWatanabe};
-static const struct CreditsEntry gCreditsEntry_SakaeKimura[] = {0, 0, gCreditsText_SakaeKimura};
-static const struct CreditsEntry gCreditsEntry_ChiakiShinkai[] = {0, 0, gCreditsText_ChiakiShinkai};
-static const struct CreditsEntry gCreditsEntry_SethMcMahill[] = {0, 0, gCreditsText_SethMcMahill};
-static const struct CreditsEntry gCreditsEntry_NobOgasawara[] = {0, 0, gCreditsText_NobOgasawara};
-static const struct CreditsEntry gCreditsEntry_TeresaLillygren[] = {0, 0, gCreditsText_TeresaLillygren};
-static const struct CreditsEntry gCreditsEntry_KimikoNakamichi[] = {0, 0, gCreditsText_KimikoNakamichi};
-static const struct CreditsEntry gCreditsEntry_SouichiYamamoto[] = {0, 0, gCreditsText_SouichiYamamoto};
-static const struct CreditsEntry gCreditsEntry_YuichiroIto[] = {0, 0, gCreditsText_YuichiroIto};
-static const struct CreditsEntry gCreditsEntry_ThomasHertzog[] = {0, 0, gCreditsText_ThomasHertzog};
-static const struct CreditsEntry gCreditsEntry_MikaKurosawa[] = {0, 0, gCreditsText_MikaKurosawa};
-static const struct CreditsEntry gCreditsEntry_NationalFederationBlind[] = {0, 0, gCreditsText_NationalFederationBlind};
-static const struct CreditsEntry gCreditsEntry_PatriciaAMaurer[] = {0, 0, gCreditsText_PatriciaAMaurer};
-static const struct CreditsEntry gCreditsEntry_EuropeanBlindUnion[] = {0, 0, gCreditsText_EuropeanBlindUnion};
-static const struct CreditsEntry gCreditsEntry_AustralianBrailleAuthority[] = {0, 0, gCreditsText_AustralianBrailleAuthority};
-static const struct CreditsEntry gCreditsEntry_RoyalNewZealandFederationBlind[] = {0, 0, gCreditsText_RoyalNewZealandFederationBlind};
-static const struct CreditsEntry gCreditsEntry_MotoyasuTojima[] = {0, 0, gCreditsText_MotoyasuTojima};
-static const struct CreditsEntry gCreditsEntry_NicolaPrattBarlow[] = {0, 0, gCreditsText_NicolaPrattBarlow};
-static const struct CreditsEntry gCreditsEntry_ShellieDow[] = {0, 0, gCreditsText_ShellieDow};
-static const struct CreditsEntry gCreditsEntry_ErikJohnson[] = {0, 0, gCreditsText_ErikJohnson};
+static const struct CreditsEntry gCreditsEntry_EmptyString[] = {0, FALSE, gCreditsText_EmptyString};
+static const struct CreditsEntry gCreditsEntry_PkmnEmeraldVersion[] = {7, TRUE, gCreditsText_PkmnEmeraldVersion};
+static const struct CreditsEntry gCreditsEntry_Credits[] = {11, TRUE, gCreditsText_Credits};
+static const struct CreditsEntry gCreditsEntry_ExecutiveDirector[] = {8, TRUE, gCreditsText_ExecutiveDirector};
+static const struct CreditsEntry gCreditsEntry_Director[] = {12, TRUE, gCreditsText_Director};
+static const struct CreditsEntry gCreditsEntry_ArtDirector[] = {10, TRUE, gCreditsText_ArtDirector};
+static const struct CreditsEntry gCreditsEntry_BattleDirector[] = {10, TRUE, gCreditsText_BattleDirector};
+static const struct CreditsEntry gCreditsEntry_MainProgrammer[] = {10, TRUE, gCreditsText_MainProgrammer};
+static const struct CreditsEntry gCreditsEntry_BattleSystemPgrms[] = {8, TRUE, gCreditsText_BattleSystemPgrms};
+static const struct CreditsEntry gCreditsEntry_FieldSystemPgrms[] = {7, TRUE, gCreditsText_FieldSystemPgrms};
+static const struct CreditsEntry gCreditsEntry_Programmers[] = {12, TRUE, gCreditsText_Programmers};
+static const struct CreditsEntry gCreditsEntry_MainGraphicDesigner[] = {7, TRUE, gCreditsText_MainGraphicDesigner};
+static const struct CreditsEntry gCreditsEntry_GraphicDesigners[] = {9, TRUE, gCreditsText_GraphicDesigners};
+static const struct CreditsEntry gCreditsEntry_PkmnDesigners[] = {10, TRUE, gCreditsText_PkmnDesigners};
+static const struct CreditsEntry gCreditsEntry_MusicComposition[] = {13, TRUE, gCreditsText_MusicComposition};
+static const struct CreditsEntry gCreditsEntry_SoundEffectsAndPkmnVoices[] = {4, TRUE, gCreditsText_SoundEffectsAndPkmnVoices};
+static const struct CreditsEntry gCreditsEntry_GameDesigners[] = {11, TRUE, gCreditsText_GameDesigners};
+static const struct CreditsEntry gCreditsEntry_ScenarioPlot[] = {11, TRUE, gCreditsText_ScenarioPlot};
+static const struct CreditsEntry gCreditsEntry_Scenario[] = {13, TRUE, gCreditsText_Scenario};
+static const struct CreditsEntry gCreditsEntry_ScriptDesigners[] = {10, TRUE, gCreditsText_ScriptDesigners};
+static const struct CreditsEntry gCreditsEntry_MapDesigners[] = {11, TRUE, gCreditsText_MapDesigners};
+static const struct CreditsEntry gCreditsEntry_MapDataDesigners[] = {9, TRUE, gCreditsText_MapDataDesigners};
+static const struct CreditsEntry gCreditsEntry_ParametricDesigners[] = {9, TRUE, gCreditsText_ParametricDesigners};
+static const struct CreditsEntry gCreditsEntry_PokedexText[] = {11, TRUE, gCreditsText_PokedexText};
+static const struct CreditsEntry gCreditsEntry_EnvAndToolPgrms[] = {6, TRUE, gCreditsText_EnvAndToolPgrms};
+static const struct CreditsEntry gCreditsEntry_NCLProductTesting[] = {11, TRUE, gCreditsText_NCLProductTesting};
+static const struct CreditsEntry gCreditsEntry_SpecialThanks[] = {10, TRUE, gCreditsText_SpecialThanks};
+static const struct CreditsEntry gCreditsEntry_Coordinators[] = {11, TRUE, gCreditsText_Coordinators};
+static const struct CreditsEntry gCreditsEntry_Producers[] = {11, TRUE, gCreditsText_Producers};
+static const struct CreditsEntry gCreditsEntry_ExecProducers[] = {7, TRUE, gCreditsText_ExecProducers};
+static const struct CreditsEntry gCreditsEntry_InfoSupervisors[] = {10, TRUE, gCreditsText_InfoSupervisors};
+static const struct CreditsEntry gCreditsEntry_TaskManagers[] = {8, TRUE, gCreditsText_TaskManagers};
+static const struct CreditsEntry gCreditsEntry_BrailleCodeCheck[] = {10, TRUE, gCreditsText_BrailleCodeCheck};
+static const struct CreditsEntry gCreditsEntry_WorldDirector[] = {10, TRUE, gCreditsText_WorldDirector};
+static const struct CreditsEntry gCreditsEntry_BattleFrontierData[] = {8, TRUE, gCreditsText_BattleFrontierData};
+static const struct CreditsEntry gCreditsEntry_SupportProgrammers[] = {10, TRUE, gCreditsText_SupportProgrammers};
+static const struct CreditsEntry gCreditsEntry_Artwork[] = {12, TRUE, gCreditsText_Artwork};
+static const struct CreditsEntry gCreditsEntry_LeadProgrammer[] = {10, TRUE, gCreditsText_LeadProgrammer};
+static const struct CreditsEntry gCreditsEntry_LeadGraphicArtist[] = {9, TRUE, gCreditsText_LeadGraphicArtist};
+static const struct CreditsEntry gCreditsEntry_SatoshiTajiri[] = {11, FALSE, gCreditsText_SatoshiTajiri};
+static const struct CreditsEntry gCreditsEntry_JunichiMasuda[] = {11, FALSE, gCreditsText_JunichiMasuda};
+static const struct CreditsEntry gCreditsEntry_KenSugimori[] = {11, FALSE, gCreditsText_KenSugimori};
+static const struct CreditsEntry gCreditsEntry_ShigekiMorimoto[] = {11, FALSE, gCreditsText_ShigekiMorimoto};
+static const struct CreditsEntry gCreditsEntry_TetsuyaWatanabe[] = {11, FALSE, gCreditsText_TetsuyaWatanabe};
+static const struct CreditsEntry gCreditsEntry_HisashiSogabe[] = {11, FALSE, gCreditsText_HisashiSogabe};
+static const struct CreditsEntry gCreditsEntry_SosukeTamada[] = {11, FALSE, gCreditsText_SosukeTamada};
+static const struct CreditsEntry gCreditsEntry_AkitoMori[] = {11, FALSE, gCreditsText_AkitoMori};
+static const struct CreditsEntry gCreditsEntry_KeitaKagaya[] = {11, FALSE, gCreditsText_KeitaKagaya};
+static const struct CreditsEntry gCreditsEntry_YoshinoriMatsuda[] = {11, FALSE, gCreditsText_YoshinoriMatsuda};
+static const struct CreditsEntry gCreditsEntry_HiroyukiNakamura[] = {11, FALSE, gCreditsText_HiroyukiNakamura};
+static const struct CreditsEntry gCreditsEntry_MasaoTaya[] = {11, FALSE, gCreditsText_MasaoTaya};
+static const struct CreditsEntry gCreditsEntry_SatoshiNohara[] = {11, FALSE, gCreditsText_SatoshiNohara};
+static const struct CreditsEntry gCreditsEntry_TomomichiOhta[] = {11, FALSE, gCreditsText_TomomichiOhta};
+static const struct CreditsEntry gCreditsEntry_MiyukiIwasawa[] = {11, FALSE, gCreditsText_MiyukiIwasawa};
+static const struct CreditsEntry gCreditsEntry_TakenoriOhta[] = {11, FALSE, gCreditsText_TakenoriOhta};
+static const struct CreditsEntry gCreditsEntry_HironobuYoshida[] = {11, FALSE, gCreditsText_HironobuYoshida};
+static const struct CreditsEntry gCreditsEntry_MotofumiFujiwara[] = {11, FALSE, gCreditsText_MotofumiFujiwara};
+static const struct CreditsEntry gCreditsEntry_SatoshiOhta[] = {11, FALSE, gCreditsText_SatoshiOhta};
+static const struct CreditsEntry gCreditsEntry_AsukaIwashita[] = {11, FALSE, gCreditsText_AsukaIwashita};
+static const struct CreditsEntry gCreditsEntry_AimiTomita[] = {11, FALSE, gCreditsText_AimiTomita};
+static const struct CreditsEntry gCreditsEntry_TakaoUnno[] = {11, FALSE, gCreditsText_TakaoUnno};
+static const struct CreditsEntry gCreditsEntry_KanakoEo[] = {11, FALSE, gCreditsText_KanakoEo};
+static const struct CreditsEntry gCreditsEntry_JunOkutani[] = {11, FALSE, gCreditsText_JunOkutani};
+static const struct CreditsEntry gCreditsEntry_AtsukoNishida[] = {11, FALSE, gCreditsText_AtsukoNishida};
+static const struct CreditsEntry gCreditsEntry_MuneoSaito[] = {11, FALSE, gCreditsText_MuneoSaito};
+static const struct CreditsEntry gCreditsEntry_RenaYoshikawa[] = {11, FALSE, gCreditsText_RenaYoshikawa};
+static const struct CreditsEntry gCreditsEntry_GoIchinose[] = {11, FALSE, gCreditsText_GoIchinose};
+static const struct CreditsEntry gCreditsEntry_MorikazuAoki[] = {11, FALSE, gCreditsText_MorikazuAoki};
+static const struct CreditsEntry gCreditsEntry_KojiNishino[] = {11, FALSE, gCreditsText_KojiNishino};
+static const struct CreditsEntry gCreditsEntry_KenjiMatsushima[] = {11, FALSE, gCreditsText_KenjiMatsushima};
+static const struct CreditsEntry gCreditsEntry_TetsujiOhta[] = {11, FALSE, gCreditsText_TetsujiOhta};
+static const struct CreditsEntry gCreditsEntry_HitomiSato[] = {11, FALSE, gCreditsText_HitomiSato};
+static const struct CreditsEntry gCreditsEntry_TakeshiKawachimaru[] = {11, FALSE, gCreditsText_TakeshiKawachimaru};
+static const struct CreditsEntry gCreditsEntry_TeruyukiShimoyamada[] = {11, FALSE, gCreditsText_TeruyukiShimoyamada};
+static const struct CreditsEntry gCreditsEntry_ShigeruOhmori[] = {11, FALSE, gCreditsText_ShigeruOhmori};
+static const struct CreditsEntry gCreditsEntry_TadashiTakahashi[] = {11, FALSE, gCreditsText_TadashiTakahashi};
+static const struct CreditsEntry gCreditsEntry_ToshinobuMatsumiya[] = {11, FALSE, gCreditsText_ToshinobuMatsumiya};
+static const struct CreditsEntry gCreditsEntry_AkihitoTomisawa[] = {11, FALSE, gCreditsText_AkihitoTomisawa};
+static const struct CreditsEntry gCreditsEntry_HirokiEnomoto[] = {11, FALSE, gCreditsText_HirokiEnomoto};
+static const struct CreditsEntry gCreditsEntry_KazuyukiTerada[] = {11, FALSE, gCreditsText_KazuyukiTerada};
+static const struct CreditsEntry gCreditsEntry_YuriSakurai[] = {11, FALSE, gCreditsText_YuriSakurai};
+static const struct CreditsEntry gCreditsEntry_HiromiSagawa[] = {11, FALSE, gCreditsText_HiromiSagawa};
+static const struct CreditsEntry gCreditsEntry_KenjiTominaga[] = {11, FALSE, gCreditsText_KenjiTominaga};
+static const struct CreditsEntry gCreditsEntry_YoshioTajiri[] = {11, FALSE, gCreditsText_YoshioTajiri};
+static const struct CreditsEntry gCreditsEntry_TeikoSasaki[] = {11, FALSE, gCreditsText_TeikoSasaki};
+static const struct CreditsEntry gCreditsEntry_SachikoHamano[] = {11, FALSE, gCreditsText_SachikoHamano};
+static const struct CreditsEntry gCreditsEntry_ChieMatsumiya[] = {11, FALSE, gCreditsText_ChieMatsumiya};
+static const struct CreditsEntry gCreditsEntry_AkikoShinozaki[] = {11, FALSE, gCreditsText_AkikoShinozaki};
+static const struct CreditsEntry gCreditsEntry_AstukoFujii[] = {11, FALSE, gCreditsText_AstukoFujii};
+static const struct CreditsEntry gCreditsEntry_NozomuSaito[] = {11, FALSE, gCreditsText_NozomuSaito};
+static const struct CreditsEntry gCreditsEntry_KenkichiToyama[] = {11, FALSE, gCreditsText_KenkichiToyama};
+static const struct CreditsEntry gCreditsEntry_SuguruNakatsui[] = {11, FALSE, gCreditsText_SuguruNakatsui};
+static const struct CreditsEntry gCreditsEntry_YumiFunasaka[] = {11, FALSE, gCreditsText_YumiFunasaka};
+static const struct CreditsEntry gCreditsEntry_NaokoYanase[] = {11, FALSE, gCreditsText_NaokoYanase};
+static const struct CreditsEntry gCreditsEntry_NCLSuperMarioClub[] = {11, FALSE, gCreditsText_NCLSuperMarioClub};
+static const struct CreditsEntry gCreditsEntry_AtsushiTada[] = {11, FALSE, gCreditsText_AtsushiTada};
+static const struct CreditsEntry gCreditsEntry_TakahiroOhnishi[] = {11, FALSE, gCreditsText_TakahiroOhnishi};
+static const struct CreditsEntry gCreditsEntry_NorihideOkamura[] = {11, FALSE, gCreditsText_NorihideOkamura};
+static const struct CreditsEntry gCreditsEntry_HiroNakamura[] = {11, FALSE, gCreditsText_HiroNakamura};
+static const struct CreditsEntry gCreditsEntry_HiroyukiUesugi[] = {11, FALSE, gCreditsText_HiroyukiUesugi};
+static const struct CreditsEntry gCreditsEntry_TerukiMurakawa[] = {11, FALSE, gCreditsText_TerukiMurakawa};
+static const struct CreditsEntry gCreditsEntry_AkiraKinashi[] = {11, FALSE, gCreditsText_AkiraKinashi};
+static const struct CreditsEntry gCreditsEntry_MichikoTakizawa[] = {11, FALSE, gCreditsText_MichikoTakizawa};
+static const struct CreditsEntry gCreditsEntry_MakikoTakada[] = {11, FALSE, gCreditsText_MakikoTakada};
+static const struct CreditsEntry gCreditsEntry_TakanaoKondo[] = {11, FALSE, gCreditsText_TakanaoKondo};
+static const struct CreditsEntry gCreditsEntry_AiMashima[] = {11, FALSE, gCreditsText_AiMashima};
+static const struct CreditsEntry gCreditsEntry_GakujiNomoto[] = {11, FALSE, gCreditsText_GakujiNomoto};
+static const struct CreditsEntry gCreditsEntry_TakehiroIzushi[] = {11, FALSE, gCreditsText_TakehiroIzushi};
+static const struct CreditsEntry gCreditsEntry_HitoshiYamagami[] = {11, FALSE, gCreditsText_HitoshiYamagami};
+static const struct CreditsEntry gCreditsEntry_KyokoWatanabe[] = {11, FALSE, gCreditsText_KyokoWatanabe};
+static const struct CreditsEntry gCreditsEntry_TakaoNakano[] = {11, FALSE, gCreditsText_TakaoNakano};
+static const struct CreditsEntry gCreditsEntry_HiroyukiJinnai[] = {11, FALSE, gCreditsText_HiroyukiJinnai};
+static const struct CreditsEntry gCreditsEntry_HiroakiTsuru[] = {11, FALSE, gCreditsText_HiroakiTsuru};
+static const struct CreditsEntry gCreditsEntry_TsunekazIshihara[] = {11, FALSE, gCreditsText_TsunekazIshihara};
+static const struct CreditsEntry gCreditsEntry_SatoruIwata[] = {11, FALSE, gCreditsText_SatoruIwata};
+static const struct CreditsEntry gCreditsEntry_KazuyaSuyama[] = {11, FALSE, gCreditsText_KazuyaSuyama};
+static const struct CreditsEntry gCreditsEntry_SatoshiMitsuhara[] = {11, FALSE, gCreditsText_SatoshiMitsuhara};
+static const struct CreditsEntry gCreditsEntry_JapanBrailleLibrary[] = {9, FALSE, gCreditsText_JapanBrailleLibrary};
+static const struct CreditsEntry gCreditsEntry_TomotakaKomura[] = {11, FALSE, gCreditsText_TomotakaKomura};
+static const struct CreditsEntry gCreditsEntry_MikikoOhhashi[] = {11, FALSE, gCreditsText_MikikoOhhashi};
+static const struct CreditsEntry gCreditsEntry_DaisukeHoshino[] = {11, FALSE, gCreditsText_DaisukeHoshino};
+static const struct CreditsEntry gCreditsEntry_KenjiroIto[] = {11, FALSE, gCreditsText_KenjiroIto};
+static const struct CreditsEntry gCreditsEntry_RuiKawaguchi[] = {11, FALSE, gCreditsText_RuiKawaguchi};
+static const struct CreditsEntry gCreditsEntry_ShunsukeKohori[] = {11, FALSE, gCreditsText_ShunsukeKohori};
+static const struct CreditsEntry gCreditsEntry_SachikoNakamichi[] = {11, FALSE, gCreditsText_SachikoNakamichi};
+static const struct CreditsEntry gCreditsEntry_FujikoNomura[] = {11, FALSE, gCreditsText_FujikoNomura};
+static const struct CreditsEntry gCreditsEntry_KazukiYoshihara[] = {11, FALSE, gCreditsText_KazukiYoshihara};
+static const struct CreditsEntry gCreditsEntry_RetsujiNomoto[] = {11, FALSE, gCreditsText_RetsujiNomoto};
+static const struct CreditsEntry gCreditsEntry_AzusaTajima[] = {11, FALSE, gCreditsText_AzusaTajima};
+static const struct CreditsEntry gCreditsEntry_ShusakuEgami[] = {11, FALSE, gCreditsText_ShusakuEgami};
+static const struct CreditsEntry gCreditsEntry_PackageAndManual[] = {0, TRUE, gCreditsText_PackageAndManual};
+static const struct CreditsEntry gCreditsEntry_EnglishVersion[] = {0, TRUE, gCreditsText_EnglishVersion};
+static const struct CreditsEntry gCreditsEntry_Translator[] = {0, TRUE, gCreditsText_Translator};
+static const struct CreditsEntry gCreditsEntry_TextEditor[] = {0, TRUE, gCreditsText_TextEditor};
+static const struct CreditsEntry gCreditsEntry_NCLCoordinator[] = {0, TRUE, gCreditsText_NCLCoordinator};
+static const struct CreditsEntry gCreditsEntry_GraphicDesigner[] = {0, TRUE, gCreditsText_GraphicDesigner};
+static const struct CreditsEntry gCreditsEntry_NOAProductTesting[] = {0, TRUE, gCreditsText_NOAProductTesting};
+static const struct CreditsEntry gCreditsEntry_HideyukiNakajima[] = {0, FALSE, gCreditsText_HideyukiNakajima};
+static const struct CreditsEntry gCreditsEntry_HidenoriSaeki[] = {0, FALSE, gCreditsText_HidenoriSaeki};
+static const struct CreditsEntry gCreditsEntry_YokoWatanabe[] = {0, FALSE, gCreditsText_YokoWatanabe};
+static const struct CreditsEntry gCreditsEntry_SakaeKimura[] = {0, FALSE, gCreditsText_SakaeKimura};
+static const struct CreditsEntry gCreditsEntry_ChiakiShinkai[] = {0, FALSE, gCreditsText_ChiakiShinkai};
+static const struct CreditsEntry gCreditsEntry_SethMcMahill[] = {0, FALSE, gCreditsText_SethMcMahill};
+static const struct CreditsEntry gCreditsEntry_NobOgasawara[] = {0, FALSE, gCreditsText_NobOgasawara};
+static const struct CreditsEntry gCreditsEntry_TeresaLillygren[] = {0, FALSE, gCreditsText_TeresaLillygren};
+static const struct CreditsEntry gCreditsEntry_KimikoNakamichi[] = {0, FALSE, gCreditsText_KimikoNakamichi};
+static const struct CreditsEntry gCreditsEntry_SouichiYamamoto[] = {0, FALSE, gCreditsText_SouichiYamamoto};
+static const struct CreditsEntry gCreditsEntry_YuichiroIto[] = {0, FALSE, gCreditsText_YuichiroIto};
+static const struct CreditsEntry gCreditsEntry_ThomasHertzog[] = {0, FALSE, gCreditsText_ThomasHertzog};
+static const struct CreditsEntry gCreditsEntry_MikaKurosawa[] = {0, FALSE, gCreditsText_MikaKurosawa};
+static const struct CreditsEntry gCreditsEntry_NationalFederationBlind[] = {0, FALSE, gCreditsText_NationalFederationBlind};
+static const struct CreditsEntry gCreditsEntry_PatriciaAMaurer[] = {0, FALSE, gCreditsText_PatriciaAMaurer};
+static const struct CreditsEntry gCreditsEntry_EuropeanBlindUnion[] = {0, FALSE, gCreditsText_EuropeanBlindUnion};
+static const struct CreditsEntry gCreditsEntry_AustralianBrailleAuthority[] = {0, FALSE, gCreditsText_AustralianBrailleAuthority};
+static const struct CreditsEntry gCreditsEntry_RoyalNewZealandFederationBlind[] = {0, FALSE, gCreditsText_RoyalNewZealandFederationBlind};
+static const struct CreditsEntry gCreditsEntry_MotoyasuTojima[] = {0, FALSE, gCreditsText_MotoyasuTojima};
+static const struct CreditsEntry gCreditsEntry_NicolaPrattBarlow[] = {0, FALSE, gCreditsText_NicolaPrattBarlow};
+static const struct CreditsEntry gCreditsEntry_ShellieDow[] = {0, FALSE, gCreditsText_ShellieDow};
+static const struct CreditsEntry gCreditsEntry_ErikJohnson[] = {0, FALSE, gCreditsText_ErikJohnson};
#define _ gCreditsEntry_EmptyString
static const struct CreditsEntry *const gCreditsEntryPointerTable[][5] =
@@ -934,7 +934,7 @@ static const struct CreditsEntry *const gCreditsEntryPointerTable[][5] =
};
#undef _
-static const struct BgTemplate gUnknown_085E6F68[] =
+static const struct BgTemplate sBackgroundTemplates[] =
{
{
.bg = 0,
@@ -946,7 +946,7 @@ static const struct BgTemplate gUnknown_085E6F68[] =
.baseTile = 0
},
};
-static const struct WindowTemplate gUnknown_085E6F6C[] =
+static const struct WindowTemplate sWindowTemplates[] =
{
{
.bg = 0,
@@ -1102,51 +1102,51 @@ static const struct SpriteTemplate gUnknown_085E7068 =
.callback = sub_81772B8,
};
-static void sub_8175744(u8 taskIdA);
-static void sub_8175774(u8 taskIdA);
+static void Task_WaitPaletteFade(u8 taskIdA);
+static void Task_ProgressCreditTasks(u8 taskIdA);
static void sub_8175808(u8 taskIdA);
static void c2_080C9BFC(u8 taskIdA);
-static void sub_81758E4(u8 taskIdA);
+static void Task_CreditsLoadGrassScene(u8 taskIdA);
static void sub_81758A4(u8 taskIdA);
-static void sub_8175A9C(u8 taskIdA);
-static void sub_8175AE4(u8 taskIdA);
-static void sub_8175B1C(u8 taskIdA);
-static void sub_8175B90(u8 taskIdA);
-static void sub_8175BD8(u8 taskIdA);
-static void sub_8175C34(u8 taskIdA);
-static void sub_8175CC8(u8 taskIdA);
-static void sub_8175CE4(void);
+static void Task_CreditsTheEnd1(u8 taskIdA);
+static void Task_CreditsTheEnd2(u8 taskIdA);
+static void Task_CreditsTheEnd3(u8 taskIdA);
+static void Task_CreditsTheEnd4(u8 taskIdA);
+static void Task_CreditsTheEnd5(u8 taskIdA);
+static void Task_CreditsTheEnd6(u8 taskIdA);
+static void Task_CreditsSoftReset(u8 taskIdA);
+static void ResetGpuAndVram(void);
static void sub_8175DA0(u8 taskIdB);
-static u8 sub_817603C(u8 page, u8 taskIdA);
+static u8 CheckChangeScene(u8 page, u8 taskIdA);
static void sub_81760FC(u8 taskIdA);
static void sub_817651C(u8 taskIdA);
static void sub_817624C(u8 taskIdA);
static bool8 sub_8176AB0(u8 data, u8 taskIdA);
-static void sub_8176CA0(u8 taskIdA);
-static void sub_8176D1C(u16, u16, u16);
+static void ResetCreditsTasks(u8 taskIdA);
+static void LoadTheEndScreen(u16, u16, u16);
static void sub_8176E40(u16 arg0, u16 palette);
static void sub_8176EE8(struct Sprite *sprite);
static void sub_8176F90(struct Sprite *sprite);
static u8 sub_8177224(u16 species, s16 x, s16 y, u16 position);
static void sub_8177388(void);
-static void sub_81754C8(void)
+static void CreditsVBlankCallback(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-static void sub_81754DC(void)
+static void CB2_RunCreditsSequence(void)
{
RunTasks();
AnimateSprites();
if ((gMain.heldKeys & B_BUTTON)
&& gHasHallOfFameRecords != 0
- && gTasks[gUnknown_0203BCE2].func == sub_8175774)
+ && gTasks[gUnknown_0203BCE2].func == Task_ProgressCreditTasks)
{
- sub_81754C8();
+ CreditsVBlankCallback();
RunTasks();
AnimateSprites();
gUnknown_0203BCE5 = 1;
@@ -1158,10 +1158,10 @@ static void sub_81754DC(void)
static void sub_8175548(void)
{
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_085E6F68, 1);
+ InitBgsFromTemplates(0, sBackgroundTemplates, 1);
SetBgTilemapBuffer(0, AllocZeroed(0x800));
LoadPalette(gUnknown_085E56F0, 0x80, 0x40);
- InitWindows(gUnknown_085E6F6C);
+ InitWindows(sWindowTemplates);
DeactivateAllTextPrinters();
PutWindowTilemap(0);
CopyWindowToVram(0, 3);
@@ -1177,14 +1177,14 @@ static void sub_81755A4(void)
Free(ptr);
}
-static void sub_81755BC(const u8 *string, u8 y, u8 a2)
+static void PrintCreditsText(const u8 *string, u8 y, bool8 isTitle)
{
u8 x;
u8 color[3];
color[0] = 0;
- if (a2 == 1)
+ if (isTitle == TRUE)
{
color[1] = 3;
color[2] = 4;
@@ -1199,20 +1199,20 @@ static void sub_81755BC(const u8 *string, u8 y, u8 a2)
AddTextPrinterParameterized4(0, 1, x, y, 1, 0, color, -1, string);
}
-void sub_8175620(void)
+void CB2_StartCreditsSequence(void)
{
u8 taskIdA;
s16 taskIdC;
u8 taskIdB;
- sub_8175CE4();
+ ResetGpuAndVram();
SetVBlankCallback(NULL);
InitHeap(gHeap, HEAP_SIZE);
ResetPaletteFade();
ResetTasks();
sub_8175548();
- taskIdA = CreateTask(sub_8175744, 0);
+ taskIdA = CreateTask(Task_WaitPaletteFade, 0);
gTasks[taskIdA].data[TDA_4] = 0;
gTasks[taskIdA].data[TDA_7] = 0;
@@ -1237,9 +1237,9 @@ void sub_8175620(void)
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
EnableInterrupts(INTR_FLAG_VBLANK);
- SetVBlankCallback(sub_81754C8);
+ SetVBlankCallback(CreditsVBlankCallback);
m4aSongNumStart(MUS_THANKFOR);
- SetMainCallback2(sub_81754DC);
+ SetMainCallback2(CB2_RunCreditsSequence);
gUnknown_0203BCE5 = 0;
gUnknown_0203BCE8 = AllocZeroed(sizeof(struct Unk201C000));
@@ -1252,13 +1252,13 @@ void sub_8175620(void)
gUnknown_0203BCE2 = taskIdA;
}
-static void sub_8175744(u8 taskIdA)
+static void Task_WaitPaletteFade(u8 taskIdA)
{
if (!gPaletteFade.active)
- gTasks[taskIdA].func = sub_8175774;
+ gTasks[taskIdA].func = Task_ProgressCreditTasks;
}
-static void sub_8175774(u8 taskIdA)
+static void Task_ProgressCreditTasks(u8 taskIdA)
{
u16 data1;
@@ -1270,7 +1270,7 @@ static void sub_8175774(u8 taskIdA)
gTasks[taskIdC].data[TDC_0] = 30;
gTasks[taskIdA].data[TDA_12] = 0x100;
- gTasks[taskIdA].func = sub_8175A9C;
+ gTasks[taskIdA].func = Task_CreditsTheEnd1;
return;
}
@@ -1298,7 +1298,7 @@ static void sub_8175808(u8 taskIdA)
if (!gPaletteFade.active)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
- sub_8176CA0(taskIdA);
+ ResetCreditsTasks(taskIdA);
gTasks[taskIdA].func = c2_080C9BFC;
}
}
@@ -1313,8 +1313,8 @@ static void c2_080C9BFC(u8 taskIdA)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
EnableInterrupts(INTR_FLAG_VBLANK);
- SetVBlankCallback(sub_81754C8);
- gTasks[taskIdA].func = sub_8175744;
+ SetVBlankCallback(CreditsVBlankCallback);
+ gTasks[taskIdA].func = Task_WaitPaletteFade;
}
}
@@ -1323,12 +1323,12 @@ static void sub_81758A4(u8 taskIdA)
if (!gPaletteFade.active)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
- sub_8176CA0(taskIdA);
- gTasks[taskIdA].func = sub_81758E4;
+ ResetCreditsTasks(taskIdA);
+ gTasks[taskIdA].func = Task_CreditsLoadGrassScene;
}
}
-static void sub_81758E4(u8 taskIdA)
+static void Task_CreditsLoadGrassScene(u8 taskIdA)
{
switch (gMain.state)
{
@@ -1387,12 +1387,12 @@ static void sub_81758E4(u8 taskIdA)
gMain.state = 0;
gUnknown_0203BD28 = 0;
- gTasks[taskIdA].func = sub_8175744;
+ gTasks[taskIdA].func = Task_WaitPaletteFade;
break;
}
}
-static void sub_8175A9C(u8 taskIdA)
+static void Task_CreditsTheEnd1(u8 taskIdA)
{
if (gTasks[taskIdA].data[TDA_12])
{
@@ -1401,23 +1401,23 @@ static void sub_8175A9C(u8 taskIdA)
}
BeginNormalPaletteFade(0xFFFFFFFF, 12, 0, 16, RGB_BLACK);
- gTasks[taskIdA].func = sub_8175AE4;
+ gTasks[taskIdA].func = Task_CreditsTheEnd2;
}
-static void sub_8175AE4(u8 taskIdA)
+static void Task_CreditsTheEnd2(u8 taskIdA)
{
if (!gPaletteFade.active)
{
- sub_8176CA0(taskIdA);
- gTasks[taskIdA].func = sub_8175B1C;
+ ResetCreditsTasks(taskIdA);
+ gTasks[taskIdA].func = Task_CreditsTheEnd3;
}
}
-static void sub_8175B1C(u8 taskIdA)
+static void Task_CreditsTheEnd3(u8 taskIdA)
{
- sub_8175CE4();
+ ResetGpuAndVram();
ResetPaletteFade();
- sub_8176D1C(0, 0x3800, 0);
+ LoadTheEndScreen(0, 0x3800, 0);
ResetSpriteData();
FreeAllSpritePalettes();
BeginNormalPaletteFade(0xFFFFFFFF, 8, 16, 0, RGB_BLACK);
@@ -1432,11 +1432,11 @@ static void sub_8175B1C(u8 taskIdA)
| DISPCNT_OBJ_1D_MAP
| DISPCNT_BG0_ON);
- gTasks[taskIdA].data[TDA_0] = 0xEB;
- gTasks[taskIdA].func = sub_8175B90;
+ gTasks[taskIdA].data[TDA_0] = 235; //set this to 215 to actually show "THE END" in time to the last song beat
+ gTasks[taskIdA].func = Task_CreditsTheEnd4;
}
-static void sub_8175B90(u8 taskIdA)
+static void Task_CreditsTheEnd4(u8 taskIdA)
{
if (gTasks[taskIdA].data[TDA_0])
{
@@ -1445,10 +1445,10 @@ static void sub_8175B90(u8 taskIdA)
}
BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 16, RGB_BLACK);
- gTasks[taskIdA].func = sub_8175BD8;
+ gTasks[taskIdA].func = Task_CreditsTheEnd5;
}
-static void sub_8175BD8(u8 taskIdA)
+static void Task_CreditsTheEnd5(u8 taskIdA)
{
if (!gPaletteFade.active)
{
@@ -1456,11 +1456,11 @@ static void sub_8175BD8(u8 taskIdA)
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0, RGB_BLACK);
gTasks[taskIdA].data[TDA_0] = 7200;
- gTasks[taskIdA].func = sub_8175C34;
+ gTasks[taskIdA].func = Task_CreditsTheEnd6;
}
}
-static void sub_8175C34(u8 taskIdA)
+static void Task_CreditsTheEnd6(u8 taskIdA)
{
if (!gPaletteFade.active)
{
@@ -1468,7 +1468,7 @@ static void sub_8175C34(u8 taskIdA)
{
FadeOutBGM(4);
BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 16, RGB_WHITEALPHA);
- gTasks[taskIdA].func = sub_8175CC8;
+ gTasks[taskIdA].func = Task_CreditsSoftReset;
return;
}
@@ -1482,13 +1482,13 @@ static void sub_8175C34(u8 taskIdA)
}
}
-static void sub_8175CC8(u8 taskIdA)
+static void Task_CreditsSoftReset(u8 taskIdA)
{
if (!gPaletteFade.active)
SoftReset(0xFF);
}
-static void sub_8175CE4(void)
+static void ResetGpuAndVram(void)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
@@ -1539,12 +1539,15 @@ static void sub_8175DA0(u8 taskIdB)
gTasks[taskIdB].data[TDB_0] += 1;
return;
case 2:
- if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == sub_8175774)
+ if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == Task_ProgressCreditTasks)
{
if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT)
{
for (i = 0; i < 5; i++)
- sub_81755BC(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 5 + i * 16, gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->var_1);
+ PrintCreditsText(
+ gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text,
+ 5 + i * 16,
+ gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->isTitle);
CopyWindowToVram(0, 2);
@@ -1578,7 +1581,7 @@ static void sub_8175DA0(u8 taskIdB)
return;
}
- if (sub_817603C((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID]))
+ if (CheckChangeScene((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID]))
{
gTasks[taskIdB].data[TDB_0] += 1;
return;
@@ -1606,7 +1609,7 @@ static void sub_8175DA0(u8 taskIdB)
}
}
-static u8 sub_817603C(u8 page, u8 taskIdA)
+static u8 CheckChangeScene(u8 page, u8 taskIdA)
{
// Starts with bike + ocean + morning
@@ -1685,7 +1688,7 @@ static void sub_81760FC(u8 taskIdD)
gTasks[taskIdD].data[TDD_STATE]++;
break;
case 2:
- if (gUnknown_0203BCE8->unk8E == 71 || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != sub_8175774)
+ if (gUnknown_0203BCE8->unk8E == 71 || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != Task_ProgressCreditTasks)
break;
r2 = sub_8177224(gUnknown_0203BCE8->unk0[gUnknown_0203BCE8->unk92], gUnknown_085E6F7C[gUnknown_0203BCE8->unk90][0], gUnknown_085E6F7C[gUnknown_0203BCE8->unk90][1], gUnknown_0203BCE8->unk90);
if (gUnknown_0203BCE8->unk92 < gUnknown_0203BCE8->unk94 - 1)
@@ -2006,7 +2009,7 @@ static bool8 sub_8176AB0(u8 data, u8 taskIdA)
return FALSE;
}
-static void sub_8176CA0(u8 taskIdA)
+static void ResetCreditsTasks(u8 taskIdA)
{
if (gTasks[taskIdA].data[TDA_0] != 0)
{
@@ -2035,7 +2038,7 @@ static void sub_8176CA0(u8 taskIdA)
gUnknown_0203BD28 = 1;
}
-static void sub_8176D1C(u16 arg0, u16 arg1, u16 arg2)
+static void LoadTheEndScreen(u16 arg0, u16 arg1, u16 arg2)
{
u16 baseTile;
u16 i;
@@ -2084,12 +2087,12 @@ static void sub_8176E40(u16 arg0, u16 palette)
for (pos = 0; pos < 32 * 32; pos++)
((u16 *) (VRAM + arg0))[pos] = baseTile + 1;
- sub_8176DBC(gUnknown_085E5BAC, 3, 7, arg0, palette);
- sub_8176DBC(gUnknown_085E5BBB, 7, 7, arg0, palette);
- sub_8176DBC(gUnknown_085E5BCA, 11, 7, arg0, palette);
- sub_8176DBC(gUnknown_085E5BCA, 16, 7, arg0, palette);
- sub_8176DBC(gUnknown_085E5BD9, 20, 7, arg0, palette);
- sub_8176DBC(gUnknown_085E5BE8, 24, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterTMap, 3, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterHMap, 7, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterEMap, 11, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterEMap, 16, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterNMap, 20, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterDMap, 24, 7, arg0, palette);
}
static void sub_8176EE8(struct Sprite *sprite)
diff --git a/asm/crt0.s b/src/crt0.s
index 9ed678968..9ed678968 100644
--- a/asm/crt0.s
+++ b/src/crt0.s
diff --git a/src/data/field_event_obj/event_object_graphics_info_pointers.h b/src/data/field_event_obj/event_object_graphics_info_pointers.h
index 2f504737a..0b8aa79b2 100755
--- a/src/data/field_event_obj/event_object_graphics_info_pointers.h
+++ b/src/data/field_event_obj/event_object_graphics_info_pointers.h
@@ -247,245 +247,245 @@ const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldM
const struct EventObjectGraphicsInfo *const gEventObjectGraphicsInfoPointers[] = {
- &gEventObjectGraphicsInfo_BrendanNormal,
- &gEventObjectGraphicsInfo_BrendanMachBike,
- &gEventObjectGraphicsInfo_BrendanSurfing,
- &gEventObjectGraphicsInfo_BrendanFieldMove,
- &gEventObjectGraphicsInfo_QuintyPlump,
- &gEventObjectGraphicsInfo_NinjaBoy,
- &gEventObjectGraphicsInfo_Twin,
- &gEventObjectGraphicsInfo_Boy1,
- &gEventObjectGraphicsInfo_Girl1,
- &gEventObjectGraphicsInfo_Boy2,
- &gEventObjectGraphicsInfo_Girl2,
- &gEventObjectGraphicsInfo_LittleBoy,
- &gEventObjectGraphicsInfo_LittleGirl,
- &gEventObjectGraphicsInfo_Boy3,
- &gEventObjectGraphicsInfo_Girl3,
- &gEventObjectGraphicsInfo_RichBoy,
- &gEventObjectGraphicsInfo_Woman1,
- &gEventObjectGraphicsInfo_FatMan,
- &gEventObjectGraphicsInfo_PokefanF,
- &gEventObjectGraphicsInfo_Man1,
- &gEventObjectGraphicsInfo_Woman2,
- &gEventObjectGraphicsInfo_ExpertM,
- &gEventObjectGraphicsInfo_ExpertF,
- &gEventObjectGraphicsInfo_Man2,
- &gEventObjectGraphicsInfo_Woman3,
- &gEventObjectGraphicsInfo_PokefanM,
- &gEventObjectGraphicsInfo_Woman4,
- &gEventObjectGraphicsInfo_Cook,
- &gEventObjectGraphicsInfo_LinkReceptionist,
- &gEventObjectGraphicsInfo_OldMan,
- &gEventObjectGraphicsInfo_OldWoman,
- &gEventObjectGraphicsInfo_Camper,
- &gEventObjectGraphicsInfo_Picnicker,
- &gEventObjectGraphicsInfo_Man3,
- &gEventObjectGraphicsInfo_Woman5,
- &gEventObjectGraphicsInfo_Youngster,
- &gEventObjectGraphicsInfo_BugCatcher,
- &gEventObjectGraphicsInfo_PsychicM,
- &gEventObjectGraphicsInfo_SchoolKidM,
- &gEventObjectGraphicsInfo_Maniac,
- &gEventObjectGraphicsInfo_HexManiac,
- &gEventObjectGraphicsInfo_Rayquaza1,
- &gEventObjectGraphicsInfo_SwimmerM,
- &gEventObjectGraphicsInfo_SwimmerF,
- &gEventObjectGraphicsInfo_BlackBelt,
- &gEventObjectGraphicsInfo_Beauty,
- &gEventObjectGraphicsInfo_Scientist1,
- &gEventObjectGraphicsInfo_Lass,
- &gEventObjectGraphicsInfo_Gentleman,
- &gEventObjectGraphicsInfo_Sailor,
- &gEventObjectGraphicsInfo_Fisherman,
- &gEventObjectGraphicsInfo_RunningTriathleteM,
- &gEventObjectGraphicsInfo_RunningTriathleteF,
- &gEventObjectGraphicsInfo_TuberF,
- &gEventObjectGraphicsInfo_TuberM,
- &gEventObjectGraphicsInfo_Hiker,
- &gEventObjectGraphicsInfo_CyclingTriathleteM,
- &gEventObjectGraphicsInfo_CyclingTriathleteF,
- &gEventObjectGraphicsInfo_Nurse,
- &gEventObjectGraphicsInfo_ItemBall,
- &gEventObjectGraphicsInfo_BerryTree,
- &gEventObjectGraphicsInfo_BerryTreeEarlyStages,
- &gEventObjectGraphicsInfo_BerryTreeLateStages,
- &gEventObjectGraphicsInfo_BrendanAcroBike,
- &gEventObjectGraphicsInfo_ProfBirch,
- &gEventObjectGraphicsInfo_Man4,
- &gEventObjectGraphicsInfo_Man5,
- &gEventObjectGraphicsInfo_ReporterM,
- &gEventObjectGraphicsInfo_ReporterF,
- &gEventObjectGraphicsInfo_Bard,
- &gEventObjectGraphicsInfo_Anabel,
- &gEventObjectGraphicsInfo_Tucker,
- &gEventObjectGraphicsInfo_Greta,
- &gEventObjectGraphicsInfo_Spenser,
- &gEventObjectGraphicsInfo_Noland,
- &gEventObjectGraphicsInfo_Lucy,
- &gEventObjectGraphicsInfo_UnusedNatuDoll,
- &gEventObjectGraphicsInfo_UnusedMagnemiteDoll,
- &gEventObjectGraphicsInfo_UnusedSquirtleDoll,
- &gEventObjectGraphicsInfo_UnusedWooperDoll,
- &gEventObjectGraphicsInfo_UnusedPikachuDoll,
- &gEventObjectGraphicsInfo_UnusedPorygon2Doll,
- &gEventObjectGraphicsInfo_CuttableTree,
- &gEventObjectGraphicsInfo_MartEmployee,
- &gEventObjectGraphicsInfo_RooftopSaleWoman,
- &gEventObjectGraphicsInfo_Teala,
- &gEventObjectGraphicsInfo_BreakableRock,
- &gEventObjectGraphicsInfo_PushableBoulder,
- &gEventObjectGraphicsInfo_MrBrineysBoat,
- &gEventObjectGraphicsInfo_MayNormal,
- &gEventObjectGraphicsInfo_MayMachBike,
- &gEventObjectGraphicsInfo_MayAcroBike,
- &gEventObjectGraphicsInfo_MaySurfing,
- &gEventObjectGraphicsInfo_MayFieldMove,
- &gEventObjectGraphicsInfo_Truck,
- &gEventObjectGraphicsInfo_VigorothCarryingBox,
- &gEventObjectGraphicsInfo_VigorothFacingAway,
- &gEventObjectGraphicsInfo_BirchsBag,
- &gEventObjectGraphicsInfo_EnemyZigzagoon,
- &gEventObjectGraphicsInfo_Artist,
- &gEventObjectGraphicsInfo_RivalBrendanNormal,
- &gEventObjectGraphicsInfo_RivalBrendanMachBike,
- &gEventObjectGraphicsInfo_RivalBrendanAcroBike,
- &gEventObjectGraphicsInfo_RivalBrendanSurfing,
- &gEventObjectGraphicsInfo_RivalBrendanFieldMove,
- &gEventObjectGraphicsInfo_RivalMayNormal,
- &gEventObjectGraphicsInfo_RivalMayMachBike,
- &gEventObjectGraphicsInfo_RivalMayAcroBike,
- &gEventObjectGraphicsInfo_RivalMaySurfing,
- &gEventObjectGraphicsInfo_RivalMayFieldMove,
- &gEventObjectGraphicsInfo_Cameraman,
- &gEventObjectGraphicsInfo_BrendanUnderwater,
- &gEventObjectGraphicsInfo_MayUnderwater,
- &gEventObjectGraphicsInfo_MovingBox,
- &gEventObjectGraphicsInfo_CableCar,
- &gEventObjectGraphicsInfo_Scientist2,
- &gEventObjectGraphicsInfo_DevonEmployee,
- &gEventObjectGraphicsInfo_AquaMemberM,
- &gEventObjectGraphicsInfo_AquaMemberF,
- &gEventObjectGraphicsInfo_MagmaMemberM,
- &gEventObjectGraphicsInfo_MagmaMemberF,
- &gEventObjectGraphicsInfo_Sidney,
- &gEventObjectGraphicsInfo_Phoebe,
- &gEventObjectGraphicsInfo_Glacia,
- &gEventObjectGraphicsInfo_Drake,
- &gEventObjectGraphicsInfo_Roxanne,
- &gEventObjectGraphicsInfo_Brawly,
- &gEventObjectGraphicsInfo_Wattson,
- &gEventObjectGraphicsInfo_Flannery,
- &gEventObjectGraphicsInfo_Norman,
- &gEventObjectGraphicsInfo_Winona,
- &gEventObjectGraphicsInfo_Liza,
- &gEventObjectGraphicsInfo_Tate,
- &gEventObjectGraphicsInfo_Wallace,
- &gEventObjectGraphicsInfo_Steven,
- &gEventObjectGraphicsInfo_Wally,
- &gEventObjectGraphicsInfo_RubySapphireLittleBoy,
- &gEventObjectGraphicsInfo_BrendanFishing,
- &gEventObjectGraphicsInfo_MayFishing,
- &gEventObjectGraphicsInfo_HotSpringsOldWoman,
- &gEventObjectGraphicsInfo_SSTidal,
- &gEventObjectGraphicsInfo_SubmarineShadow,
- &gEventObjectGraphicsInfo_PichuDoll,
- &gEventObjectGraphicsInfo_PikachuDoll,
- &gEventObjectGraphicsInfo_MarillDoll,
- &gEventObjectGraphicsInfo_TogepiDoll,
- &gEventObjectGraphicsInfo_CyndaquilDoll,
- &gEventObjectGraphicsInfo_ChikoritaDoll,
- &gEventObjectGraphicsInfo_TotodileDoll,
- &gEventObjectGraphicsInfo_JigglypuffDoll,
- &gEventObjectGraphicsInfo_MeowthDoll,
- &gEventObjectGraphicsInfo_ClefairyDoll,
- &gEventObjectGraphicsInfo_DittoDoll,
- &gEventObjectGraphicsInfo_SmoochumDoll,
- &gEventObjectGraphicsInfo_TreeckoDoll,
- &gEventObjectGraphicsInfo_TorchicDoll,
- &gEventObjectGraphicsInfo_MudkipDoll,
- &gEventObjectGraphicsInfo_DuskullDoll,
- &gEventObjectGraphicsInfo_WynautDoll,
- &gEventObjectGraphicsInfo_BaltoyDoll,
- &gEventObjectGraphicsInfo_KecleonDoll,
- &gEventObjectGraphicsInfo_AzurillDoll,
- &gEventObjectGraphicsInfo_SkittyDoll,
- &gEventObjectGraphicsInfo_SwabluDoll,
- &gEventObjectGraphicsInfo_GulpinDoll,
- &gEventObjectGraphicsInfo_LotadDoll,
- &gEventObjectGraphicsInfo_SeedotDoll,
- &gEventObjectGraphicsInfo_PikaCushion,
- &gEventObjectGraphicsInfo_RoundCushion,
- &gEventObjectGraphicsInfo_KissCushion,
- &gEventObjectGraphicsInfo_ZigzagCushion,
- &gEventObjectGraphicsInfo_SpinCushion,
- &gEventObjectGraphicsInfo_DiamondCushion,
- &gEventObjectGraphicsInfo_BallCushion,
- &gEventObjectGraphicsInfo_GrassCushion,
- &gEventObjectGraphicsInfo_FireCushion,
- &gEventObjectGraphicsInfo_WaterCushion,
- &gEventObjectGraphicsInfo_BigSnorlaxDoll,
- &gEventObjectGraphicsInfo_BigRhydonDoll,
- &gEventObjectGraphicsInfo_BigLaprasDoll,
- &gEventObjectGraphicsInfo_BigVenusaurDoll,
- &gEventObjectGraphicsInfo_BigCharizardDoll,
- &gEventObjectGraphicsInfo_BigBlastoiseDoll,
- &gEventObjectGraphicsInfo_BigWailmerDoll,
- &gEventObjectGraphicsInfo_BigRegirockDoll,
- &gEventObjectGraphicsInfo_BigRegiceDoll,
- &gEventObjectGraphicsInfo_BigRegisteelDoll,
- &gEventObjectGraphicsInfo_Latias,
- &gEventObjectGraphicsInfo_Latios,
- &gEventObjectGraphicsInfo_GameboyKid,
- &gEventObjectGraphicsInfo_ContestJudge,
- &gEventObjectGraphicsInfo_BrendanWatering,
- &gEventObjectGraphicsInfo_MayWatering,
- &gEventObjectGraphicsInfo_BrendanDecorating,
- &gEventObjectGraphicsInfo_MayDecorating,
- &gEventObjectGraphicsInfo_Archie,
- &gEventObjectGraphicsInfo_Maxie,
- &gEventObjectGraphicsInfo_Kyogre1,
- &gEventObjectGraphicsInfo_Groudon1,
- &gEventObjectGraphicsInfo_Fossil,
- &gEventObjectGraphicsInfo_Regirock,
- &gEventObjectGraphicsInfo_Regice,
- &gEventObjectGraphicsInfo_Registeel,
- &gEventObjectGraphicsInfo_Skitty,
- &gEventObjectGraphicsInfo_Kecleon1,
- &gEventObjectGraphicsInfo_Kyogre2,
- &gEventObjectGraphicsInfo_Groudon2,
- &gEventObjectGraphicsInfo_Rayquaza2,
- &gEventObjectGraphicsInfo_Zigzagoon,
- &gEventObjectGraphicsInfo_Pikachu,
- &gEventObjectGraphicsInfo_Azumarill,
- &gEventObjectGraphicsInfo_Wingull,
- &gEventObjectGraphicsInfo_Kecleon2,
- &gEventObjectGraphicsInfo_TuberMSwimming,
- &gEventObjectGraphicsInfo_Azurill,
- &gEventObjectGraphicsInfo_Mom,
- &gEventObjectGraphicsInfo_LinkBrendan,
- &gEventObjectGraphicsInfo_LinkMay,
- &gEventObjectGraphicsInfo_Juan,
- &gEventObjectGraphicsInfo_Scott,
- &gEventObjectGraphicsInfo_Poochyena,
- &gEventObjectGraphicsInfo_Kyogre3,
- &gEventObjectGraphicsInfo_Groudon3,
- &gEventObjectGraphicsInfo_MysteryEventDeliveryman,
- &gEventObjectGraphicsInfo_Statue,
- &gEventObjectGraphicsInfo_Kirlia,
- &gEventObjectGraphicsInfo_Dusclops,
- &gEventObjectGraphicsInfo_UnionRoomAttendant,
- &gEventObjectGraphicsInfo_Sudowoodo,
- &gEventObjectGraphicsInfo_Mew,
- &gEventObjectGraphicsInfo_Red,
- &gEventObjectGraphicsInfo_Leaf,
- &gEventObjectGraphicsInfo_Deoxys,
- &gEventObjectGraphicsInfo_BirthIslandStone,
- &gEventObjectGraphicsInfo_Brandon,
- &gEventObjectGraphicsInfo_RubySapphireBrendan,
- &gEventObjectGraphicsInfo_RubySapphireMay,
- &gEventObjectGraphicsInfo_Lugia,
- &gEventObjectGraphicsInfo_HoOh,
+ [EVENT_OBJ_GFX_BRENDAN_NORMAL] = &gEventObjectGraphicsInfo_BrendanNormal,
+ [EVENT_OBJ_GFX_BRENDAN_MACH_BIKE] = &gEventObjectGraphicsInfo_BrendanMachBike,
+ [EVENT_OBJ_GFX_BRENDAN_SURFING] = &gEventObjectGraphicsInfo_BrendanSurfing,
+ [EVENT_OBJ_GFX_BRENDAN_FIELD_MOVE] = &gEventObjectGraphicsInfo_BrendanFieldMove,
+ [EVENT_OBJ_GFX_QUINTY_PLUMP] = &gEventObjectGraphicsInfo_QuintyPlump,
+ [EVENT_OBJ_GFX_NINJA_BOY] = &gEventObjectGraphicsInfo_NinjaBoy,
+ [EVENT_OBJ_GFX_TWIN] = &gEventObjectGraphicsInfo_Twin,
+ [EVENT_OBJ_GFX_BOY_1] = &gEventObjectGraphicsInfo_Boy1,
+ [EVENT_OBJ_GFX_GIRL_1] = &gEventObjectGraphicsInfo_Girl1,
+ [EVENT_OBJ_GFX_BOY_2] = &gEventObjectGraphicsInfo_Boy2,
+ [EVENT_OBJ_GFX_GIRL_2] = &gEventObjectGraphicsInfo_Girl2,
+ [EVENT_OBJ_GFX_LITTLE_BOY] = &gEventObjectGraphicsInfo_LittleBoy,
+ [EVENT_OBJ_GFX_LITTLE_GIRL] = &gEventObjectGraphicsInfo_LittleGirl,
+ [EVENT_OBJ_GFX_BOY_3] = &gEventObjectGraphicsInfo_Boy3,
+ [EVENT_OBJ_GFX_GIRL_3] = &gEventObjectGraphicsInfo_Girl3,
+ [EVENT_OBJ_GFX_RICH_BOY] = &gEventObjectGraphicsInfo_RichBoy,
+ [EVENT_OBJ_GFX_WOMAN_1] = &gEventObjectGraphicsInfo_Woman1,
+ [EVENT_OBJ_GFX_FAT_MAN] = &gEventObjectGraphicsInfo_FatMan,
+ [EVENT_OBJ_GFX_POKEFAN_F] = &gEventObjectGraphicsInfo_PokefanF,
+ [EVENT_OBJ_GFX_MAN_1] = &gEventObjectGraphicsInfo_Man1,
+ [EVENT_OBJ_GFX_WOMAN_2] = &gEventObjectGraphicsInfo_Woman2,
+ [EVENT_OBJ_GFX_EXPERT_M] = &gEventObjectGraphicsInfo_ExpertM,
+ [EVENT_OBJ_GFX_EXPERT_F] = &gEventObjectGraphicsInfo_ExpertF,
+ [EVENT_OBJ_GFX_MAN_2] = &gEventObjectGraphicsInfo_Man2,
+ [EVENT_OBJ_GFX_WOMAN_3] = &gEventObjectGraphicsInfo_Woman3,
+ [EVENT_OBJ_GFX_POKEFAN_M] = &gEventObjectGraphicsInfo_PokefanM,
+ [EVENT_OBJ_GFX_WOMAN_4] = &gEventObjectGraphicsInfo_Woman4,
+ [EVENT_OBJ_GFX_COOK] = &gEventObjectGraphicsInfo_Cook,
+ [EVENT_OBJ_GFX_LINK_RECEPTIONIST] = &gEventObjectGraphicsInfo_LinkReceptionist,
+ [EVENT_OBJ_GFX_OLD_MAN] = &gEventObjectGraphicsInfo_OldMan,
+ [EVENT_OBJ_GFX_OLD_WOMAN] = &gEventObjectGraphicsInfo_OldWoman,
+ [EVENT_OBJ_GFX_CAMPER] = &gEventObjectGraphicsInfo_Camper,
+ [EVENT_OBJ_GFX_PICNICKER] = &gEventObjectGraphicsInfo_Picnicker,
+ [EVENT_OBJ_GFX_MAN_3] = &gEventObjectGraphicsInfo_Man3,
+ [EVENT_OBJ_GFX_WOMAN_5] = &gEventObjectGraphicsInfo_Woman5,
+ [EVENT_OBJ_GFX_YOUNGSTER] = &gEventObjectGraphicsInfo_Youngster,
+ [EVENT_OBJ_GFX_BUG_CATCHER] = &gEventObjectGraphicsInfo_BugCatcher,
+ [EVENT_OBJ_GFX_PSYCHIC_M] = &gEventObjectGraphicsInfo_PsychicM,
+ [EVENT_OBJ_GFX_SCHOOL_KID_M] = &gEventObjectGraphicsInfo_SchoolKidM,
+ [EVENT_OBJ_GFX_MANIAC] = &gEventObjectGraphicsInfo_Maniac,
+ [EVENT_OBJ_GFX_HEX_MANIAC] = &gEventObjectGraphicsInfo_HexManiac,
+ [EVENT_OBJ_GFX_RAYQUAZA_1] = &gEventObjectGraphicsInfo_Rayquaza1,
+ [EVENT_OBJ_GFX_SWIMMER_M] = &gEventObjectGraphicsInfo_SwimmerM,
+ [EVENT_OBJ_GFX_SWIMMER_F] = &gEventObjectGraphicsInfo_SwimmerF,
+ [EVENT_OBJ_GFX_BLACK_BELT] = &gEventObjectGraphicsInfo_BlackBelt,
+ [EVENT_OBJ_GFX_BEAUTY] = &gEventObjectGraphicsInfo_Beauty,
+ [EVENT_OBJ_GFX_SCIENTIST_1] = &gEventObjectGraphicsInfo_Scientist1,
+ [EVENT_OBJ_GFX_LASS] = &gEventObjectGraphicsInfo_Lass,
+ [EVENT_OBJ_GFX_GENTLEMAN] = &gEventObjectGraphicsInfo_Gentleman,
+ [EVENT_OBJ_GFX_SAILOR] = &gEventObjectGraphicsInfo_Sailor,
+ [EVENT_OBJ_GFX_FISHERMAN] = &gEventObjectGraphicsInfo_Fisherman,
+ [EVENT_OBJ_GFX_RUNNING_TRIATHLETE_M] = &gEventObjectGraphicsInfo_RunningTriathleteM,
+ [EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F] = &gEventObjectGraphicsInfo_RunningTriathleteF,
+ [EVENT_OBJ_GFX_TUBER_F] = &gEventObjectGraphicsInfo_TuberF,
+ [EVENT_OBJ_GFX_TUBER_M] = &gEventObjectGraphicsInfo_TuberM,
+ [EVENT_OBJ_GFX_HIKER] = &gEventObjectGraphicsInfo_Hiker,
+ [EVENT_OBJ_GFX_CYCLING_TRIATHLETE_M] = &gEventObjectGraphicsInfo_CyclingTriathleteM,
+ [EVENT_OBJ_GFX_CYCLING_TRIATHLETE_F] = &gEventObjectGraphicsInfo_CyclingTriathleteF,
+ [EVENT_OBJ_GFX_NURSE] = &gEventObjectGraphicsInfo_Nurse,
+ [EVENT_OBJ_GFX_ITEM_BALL] = &gEventObjectGraphicsInfo_ItemBall,
+ [EVENT_OBJ_GFX_BERRY_TREE] = &gEventObjectGraphicsInfo_BerryTree,
+ [EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES] = &gEventObjectGraphicsInfo_BerryTreeEarlyStages,
+ [EVENT_OBJ_GFX_BERRY_TREE_LATE_STAGES] = &gEventObjectGraphicsInfo_BerryTreeLateStages,
+ [EVENT_OBJ_GFX_BRENDAN_ACRO_BIKE] = &gEventObjectGraphicsInfo_BrendanAcroBike,
+ [EVENT_OBJ_GFX_PROF_BIRCH] = &gEventObjectGraphicsInfo_ProfBirch,
+ [EVENT_OBJ_GFX_MAN_4] = &gEventObjectGraphicsInfo_Man4,
+ [EVENT_OBJ_GFX_MAN_5] = &gEventObjectGraphicsInfo_Man5,
+ [EVENT_OBJ_GFX_REPORTER_M] = &gEventObjectGraphicsInfo_ReporterM,
+ [EVENT_OBJ_GFX_REPORTER_F] = &gEventObjectGraphicsInfo_ReporterF,
+ [EVENT_OBJ_GFX_BARD] = &gEventObjectGraphicsInfo_Bard,
+ [EVENT_OBJ_GFX_ANABEL] = &gEventObjectGraphicsInfo_Anabel,
+ [EVENT_OBJ_GFX_TUCKER] = &gEventObjectGraphicsInfo_Tucker,
+ [EVENT_OBJ_GFX_GRETA] = &gEventObjectGraphicsInfo_Greta,
+ [EVENT_OBJ_GFX_SPENSER] = &gEventObjectGraphicsInfo_Spenser,
+ [EVENT_OBJ_GFX_NOLAND] = &gEventObjectGraphicsInfo_Noland,
+ [EVENT_OBJ_GFX_LUCY] = &gEventObjectGraphicsInfo_Lucy,
+ [EVENT_OBJ_GFX_UNUSED_NATU_DOLL] = &gEventObjectGraphicsInfo_UnusedNatuDoll,
+ [EVENT_OBJ_GFX_UNUSED_MAGNEMITE_DOLL] = &gEventObjectGraphicsInfo_UnusedMagnemiteDoll,
+ [EVENT_OBJ_GFX_UNUSED_SQUIRTLE_DOLL] = &gEventObjectGraphicsInfo_UnusedSquirtleDoll,
+ [EVENT_OBJ_GFX_UNUSED_WOOPER_DOLL] = &gEventObjectGraphicsInfo_UnusedWooperDoll,
+ [EVENT_OBJ_GFX_UNUSED_PIKACHU_DOLL] = &gEventObjectGraphicsInfo_UnusedPikachuDoll,
+ [EVENT_OBJ_GFX_UNUSED_PORYGON2_DOLL] = &gEventObjectGraphicsInfo_UnusedPorygon2Doll,
+ [EVENT_OBJ_GFX_CUTTABLE_TREE] = &gEventObjectGraphicsInfo_CuttableTree,
+ [EVENT_OBJ_GFX_MART_EMPLOYEE] = &gEventObjectGraphicsInfo_MartEmployee,
+ [EVENT_OBJ_GFX_ROOFTOP_SALE_WOMAN] = &gEventObjectGraphicsInfo_RooftopSaleWoman,
+ [EVENT_OBJ_GFX_TEALA] = &gEventObjectGraphicsInfo_Teala,
+ [EVENT_OBJ_GFX_BREAKABLE_ROCK] = &gEventObjectGraphicsInfo_BreakableRock,
+ [EVENT_OBJ_GFX_PUSHABLE_BOULDER] = &gEventObjectGraphicsInfo_PushableBoulder,
+ [EVENT_OBJ_GFX_MR_BRINEYS_BOAT] = &gEventObjectGraphicsInfo_MrBrineysBoat,
+ [EVENT_OBJ_GFX_MAY_NORMAL] = &gEventObjectGraphicsInfo_MayNormal,
+ [EVENT_OBJ_GFX_MAY_MACH_BIKE] = &gEventObjectGraphicsInfo_MayMachBike,
+ [EVENT_OBJ_GFX_MAY_ACRO_BIKE] = &gEventObjectGraphicsInfo_MayAcroBike,
+ [EVENT_OBJ_GFX_MAY_SURFING] = &gEventObjectGraphicsInfo_MaySurfing,
+ [EVENT_OBJ_GFX_MAY_FIELD_MOVE] = &gEventObjectGraphicsInfo_MayFieldMove,
+ [EVENT_OBJ_GFX_TRUCK] = &gEventObjectGraphicsInfo_Truck,
+ [EVENT_OBJ_GFX_VIGOROTH_CARRYING_BOX] = &gEventObjectGraphicsInfo_VigorothCarryingBox,
+ [EVENT_OBJ_GFX_VIGOROTH_FACING_AWAY] = &gEventObjectGraphicsInfo_VigorothFacingAway,
+ [EVENT_OBJ_GFX_BIRCHS_BAG] = &gEventObjectGraphicsInfo_BirchsBag,
+ [EVENT_OBJ_GFX_ZIGZAGOON_1] = &gEventObjectGraphicsInfo_EnemyZigzagoon,
+ [EVENT_OBJ_GFX_ARTIST] = &gEventObjectGraphicsInfo_Artist,
+ [EVENT_OBJ_GFX_RIVAL_BRENDAN_NORMAL] = &gEventObjectGraphicsInfo_RivalBrendanNormal,
+ [EVENT_OBJ_GFX_RIVAL_BRENDAN_MACH_BIKE] = &gEventObjectGraphicsInfo_RivalBrendanMachBike,
+ [EVENT_OBJ_GFX_RIVAL_BRENDAN_ACRO_BIKE] = &gEventObjectGraphicsInfo_RivalBrendanAcroBike,
+ [EVENT_OBJ_GFX_RIVAL_BRENDAN_SURFING] = &gEventObjectGraphicsInfo_RivalBrendanSurfing,
+ [EVENT_OBJ_GFX_RIVAL_BRENDAN_FIELD_MOVE] = &gEventObjectGraphicsInfo_RivalBrendanFieldMove,
+ [EVENT_OBJ_GFX_RIVAL_MAY_NORMAL] = &gEventObjectGraphicsInfo_RivalMayNormal,
+ [EVENT_OBJ_GFX_RIVAL_MAY_MACH_BIKE] = &gEventObjectGraphicsInfo_RivalMayMachBike,
+ [EVENT_OBJ_GFX_RIVAL_MAY_ACRO_BIKE] = &gEventObjectGraphicsInfo_RivalMayAcroBike,
+ [EVENT_OBJ_GFX_RIVAL_MAY_SURFING] = &gEventObjectGraphicsInfo_RivalMaySurfing,
+ [EVENT_OBJ_GFX_RIVAL_MAY_FIELD_MOVE] = &gEventObjectGraphicsInfo_RivalMayFieldMove,
+ [EVENT_OBJ_GFX_CAMERAMAN] = &gEventObjectGraphicsInfo_Cameraman,
+ [EVENT_OBJ_GFX_BRENDAN_UNDERWATER] = &gEventObjectGraphicsInfo_BrendanUnderwater,
+ [EVENT_OBJ_GFX_MAY_UNDERWATER] = &gEventObjectGraphicsInfo_MayUnderwater,
+ [EVENT_OBJ_GFX_MOVING_BOX] = &gEventObjectGraphicsInfo_MovingBox,
+ [EVENT_OBJ_GFX_CABLE_CAR] = &gEventObjectGraphicsInfo_CableCar,
+ [EVENT_OBJ_GFX_SCIENTIST_2] = &gEventObjectGraphicsInfo_Scientist2,
+ [EVENT_OBJ_GFX_DEVON_EMPLOYEE] = &gEventObjectGraphicsInfo_DevonEmployee,
+ [EVENT_OBJ_GFX_AQUA_MEMBER_M] = &gEventObjectGraphicsInfo_AquaMemberM,
+ [EVENT_OBJ_GFX_AQUA_MEMBER_F] = &gEventObjectGraphicsInfo_AquaMemberF,
+ [EVENT_OBJ_GFX_MAGMA_MEMBER_M] = &gEventObjectGraphicsInfo_MagmaMemberM,
+ [EVENT_OBJ_GFX_MAGMA_MEMBER_F] = &gEventObjectGraphicsInfo_MagmaMemberF,
+ [EVENT_OBJ_GFX_SIDNEY] = &gEventObjectGraphicsInfo_Sidney,
+ [EVENT_OBJ_GFX_PHOEBE] = &gEventObjectGraphicsInfo_Phoebe,
+ [EVENT_OBJ_GFX_GLACIA] = &gEventObjectGraphicsInfo_Glacia,
+ [EVENT_OBJ_GFX_DRAKE] = &gEventObjectGraphicsInfo_Drake,
+ [EVENT_OBJ_GFX_ROXANNE] = &gEventObjectGraphicsInfo_Roxanne,
+ [EVENT_OBJ_GFX_BRAWLY] = &gEventObjectGraphicsInfo_Brawly,
+ [EVENT_OBJ_GFX_WATTSON] = &gEventObjectGraphicsInfo_Wattson,
+ [EVENT_OBJ_GFX_FLANNERY] = &gEventObjectGraphicsInfo_Flannery,
+ [EVENT_OBJ_GFX_NORMAN] = &gEventObjectGraphicsInfo_Norman,
+ [EVENT_OBJ_GFX_WINONA] = &gEventObjectGraphicsInfo_Winona,
+ [EVENT_OBJ_GFX_LIZA] = &gEventObjectGraphicsInfo_Liza,
+ [EVENT_OBJ_GFX_TATE] = &gEventObjectGraphicsInfo_Tate,
+ [EVENT_OBJ_GFX_WALLACE] = &gEventObjectGraphicsInfo_Wallace,
+ [EVENT_OBJ_GFX_STEVEN] = &gEventObjectGraphicsInfo_Steven,
+ [EVENT_OBJ_GFX_WALLY] = &gEventObjectGraphicsInfo_Wally,
+ [EVENT_OBJ_GFX_LITTLE_BOY_3] = &gEventObjectGraphicsInfo_RubySapphireLittleBoy,
+ [EVENT_OBJ_GFX_BRENDAN_FISHING] = &gEventObjectGraphicsInfo_BrendanFishing,
+ [EVENT_OBJ_GFX_MAY_FISHING] = &gEventObjectGraphicsInfo_MayFishing,
+ [EVENT_OBJ_GFX_HOT_SPRINGS_OLD_WOMAN] = &gEventObjectGraphicsInfo_HotSpringsOldWoman,
+ [EVENT_OBJ_GFX_SS_TIDAL] = &gEventObjectGraphicsInfo_SSTidal,
+ [EVENT_OBJ_GFX_SUBMARINE_SHADOW] = &gEventObjectGraphicsInfo_SubmarineShadow,
+ [EVENT_OBJ_GFX_PICHU_DOLL] = &gEventObjectGraphicsInfo_PichuDoll,
+ [EVENT_OBJ_GFX_PIKACHU_DOLL] = &gEventObjectGraphicsInfo_PikachuDoll,
+ [EVENT_OBJ_GFX_MARILL_DOLL] = &gEventObjectGraphicsInfo_MarillDoll,
+ [EVENT_OBJ_GFX_TOGEPI_DOLL] = &gEventObjectGraphicsInfo_TogepiDoll,
+ [EVENT_OBJ_GFX_CYNDAQUIL_DOLL] = &gEventObjectGraphicsInfo_CyndaquilDoll,
+ [EVENT_OBJ_GFX_CHIKORITA_DOLL] = &gEventObjectGraphicsInfo_ChikoritaDoll,
+ [EVENT_OBJ_GFX_TOTODILE_DOLL] = &gEventObjectGraphicsInfo_TotodileDoll,
+ [EVENT_OBJ_GFX_JIGGLYPUFF_DOLL] = &gEventObjectGraphicsInfo_JigglypuffDoll,
+ [EVENT_OBJ_GFX_MEOWTH_DOLL] = &gEventObjectGraphicsInfo_MeowthDoll,
+ [EVENT_OBJ_GFX_CLEFAIRY_DOLL] = &gEventObjectGraphicsInfo_ClefairyDoll,
+ [EVENT_OBJ_GFX_DITTO_DOLL] = &gEventObjectGraphicsInfo_DittoDoll,
+ [EVENT_OBJ_GFX_SMOOCHUM_DOLL] = &gEventObjectGraphicsInfo_SmoochumDoll,
+ [EVENT_OBJ_GFX_TREECKO_DOLL] = &gEventObjectGraphicsInfo_TreeckoDoll,
+ [EVENT_OBJ_GFX_TORCHIC_DOLL] = &gEventObjectGraphicsInfo_TorchicDoll,
+ [EVENT_OBJ_GFX_MUDKIP_DOLL] = &gEventObjectGraphicsInfo_MudkipDoll,
+ [EVENT_OBJ_GFX_DUSKULL_DOLL] = &gEventObjectGraphicsInfo_DuskullDoll,
+ [EVENT_OBJ_GFX_WYNAUT_DOLL] = &gEventObjectGraphicsInfo_WynautDoll,
+ [EVENT_OBJ_GFX_BALTOY_DOLL] = &gEventObjectGraphicsInfo_BaltoyDoll,
+ [EVENT_OBJ_GFX_KECLEON_DOLL] = &gEventObjectGraphicsInfo_KecleonDoll,
+ [EVENT_OBJ_GFX_AZURILL_DOLL] = &gEventObjectGraphicsInfo_AzurillDoll,
+ [EVENT_OBJ_GFX_SKITTY_DOLL] = &gEventObjectGraphicsInfo_SkittyDoll,
+ [EVENT_OBJ_GFX_SWABLU_DOLL] = &gEventObjectGraphicsInfo_SwabluDoll,
+ [EVENT_OBJ_GFX_GULPIN_DOLL] = &gEventObjectGraphicsInfo_GulpinDoll,
+ [EVENT_OBJ_GFX_LOTAD_DOLL] = &gEventObjectGraphicsInfo_LotadDoll,
+ [EVENT_OBJ_GFX_SEEDOT_DOLL] = &gEventObjectGraphicsInfo_SeedotDoll,
+ [EVENT_OBJ_GFX_PIKA_CUSHION] = &gEventObjectGraphicsInfo_PikaCushion,
+ [EVENT_OBJ_GFX_ROUND_CUSHION] = &gEventObjectGraphicsInfo_RoundCushion,
+ [EVENT_OBJ_GFX_KISS_CUSHION] = &gEventObjectGraphicsInfo_KissCushion,
+ [EVENT_OBJ_GFX_ZIGZAG_CUSHION] = &gEventObjectGraphicsInfo_ZigzagCushion,
+ [EVENT_OBJ_GFX_SPIN_CUSHION] = &gEventObjectGraphicsInfo_SpinCushion,
+ [EVENT_OBJ_GFX_DIAMOND_CUSHION] = &gEventObjectGraphicsInfo_DiamondCushion,
+ [EVENT_OBJ_GFX_BALL_CUSHION] = &gEventObjectGraphicsInfo_BallCushion,
+ [EVENT_OBJ_GFX_GRASS_CUSHION] = &gEventObjectGraphicsInfo_GrassCushion,
+ [EVENT_OBJ_GFX_FIRE_CUSHION] = &gEventObjectGraphicsInfo_FireCushion,
+ [EVENT_OBJ_GFX_WATER_CUSHION] = &gEventObjectGraphicsInfo_WaterCushion,
+ [EVENT_OBJ_GFX_BIG_SNORLAX_DOLL] = &gEventObjectGraphicsInfo_BigSnorlaxDoll,
+ [EVENT_OBJ_GFX_BIG_RHYDON_DOLL] = &gEventObjectGraphicsInfo_BigRhydonDoll,
+ [EVENT_OBJ_GFX_BIG_LAPRAS_DOLL] = &gEventObjectGraphicsInfo_BigLaprasDoll,
+ [EVENT_OBJ_GFX_BIG_VENUSAUR_DOLL] = &gEventObjectGraphicsInfo_BigVenusaurDoll,
+ [EVENT_OBJ_GFX_BIG_CHARIZARD_DOLL] = &gEventObjectGraphicsInfo_BigCharizardDoll,
+ [EVENT_OBJ_GFX_BIG_BLASTOISE_DOLL] = &gEventObjectGraphicsInfo_BigBlastoiseDoll,
+ [EVENT_OBJ_GFX_BIG_WAILMER_DOLL] = &gEventObjectGraphicsInfo_BigWailmerDoll,
+ [EVENT_OBJ_GFX_BIG_REGIROCK_DOLL] = &gEventObjectGraphicsInfo_BigRegirockDoll,
+ [EVENT_OBJ_GFX_BIG_REGICE_DOLL] = &gEventObjectGraphicsInfo_BigRegiceDoll,
+ [EVENT_OBJ_GFX_BIG_REGISTEEL_DOLL] = &gEventObjectGraphicsInfo_BigRegisteelDoll,
+ [EVENT_OBJ_GFX_LATIAS] = &gEventObjectGraphicsInfo_Latias,
+ [EVENT_OBJ_GFX_LATIOS] = &gEventObjectGraphicsInfo_Latios,
+ [EVENT_OBJ_GFX_GAMEBOY_KID] = &gEventObjectGraphicsInfo_GameboyKid,
+ [EVENT_OBJ_GFX_CONTEST_JUDGE] = &gEventObjectGraphicsInfo_ContestJudge,
+ [EVENT_OBJ_GFX_BRENDAN_WATERING] = &gEventObjectGraphicsInfo_BrendanWatering,
+ [EVENT_OBJ_GFX_MAY_WATERING] = &gEventObjectGraphicsInfo_MayWatering,
+ [EVENT_OBJ_GFX_BRENDAN_DECORATING] = &gEventObjectGraphicsInfo_BrendanDecorating,
+ [EVENT_OBJ_GFX_MAY_DECORATING] = &gEventObjectGraphicsInfo_MayDecorating,
+ [EVENT_OBJ_GFX_ARCHIE] = &gEventObjectGraphicsInfo_Archie,
+ [EVENT_OBJ_GFX_MAXIE] = &gEventObjectGraphicsInfo_Maxie,
+ [EVENT_OBJ_GFX_KYOGRE_1] = &gEventObjectGraphicsInfo_Kyogre1,
+ [EVENT_OBJ_GFX_GROUDON_1] = &gEventObjectGraphicsInfo_Groudon1,
+ [EVENT_OBJ_GFX_FOSSIL] = &gEventObjectGraphicsInfo_Fossil,
+ [EVENT_OBJ_GFX_REGIROCK] = &gEventObjectGraphicsInfo_Regirock,
+ [EVENT_OBJ_GFX_REGICE] = &gEventObjectGraphicsInfo_Regice,
+ [EVENT_OBJ_GFX_REGISTEEL] = &gEventObjectGraphicsInfo_Registeel,
+ [EVENT_OBJ_GFX_SKITTY] = &gEventObjectGraphicsInfo_Skitty,
+ [EVENT_OBJ_GFX_KECLEON_1] = &gEventObjectGraphicsInfo_Kecleon1,
+ [EVENT_OBJ_GFX_KYOGRE_2] = &gEventObjectGraphicsInfo_Kyogre2,
+ [EVENT_OBJ_GFX_GROUDON_2] = &gEventObjectGraphicsInfo_Groudon2,
+ [EVENT_OBJ_GFX_RAYQUAZA_2] = &gEventObjectGraphicsInfo_Rayquaza2,
+ [EVENT_OBJ_GFX_ZIGZAGOON_2] = &gEventObjectGraphicsInfo_Zigzagoon,
+ [EVENT_OBJ_GFX_PIKACHU] = &gEventObjectGraphicsInfo_Pikachu,
+ [EVENT_OBJ_GFX_AZUMARILL] = &gEventObjectGraphicsInfo_Azumarill,
+ [EVENT_OBJ_GFX_WINGULL] = &gEventObjectGraphicsInfo_Wingull,
+ [EVENT_OBJ_GFX_KECLEON_2] = &gEventObjectGraphicsInfo_Kecleon2,
+ [EVENT_OBJ_GFX_TUBER_M_SWIMMING] = &gEventObjectGraphicsInfo_TuberMSwimming,
+ [EVENT_OBJ_GFX_AZURILL] = &gEventObjectGraphicsInfo_Azurill,
+ [EVENT_OBJ_GFX_MOM] = &gEventObjectGraphicsInfo_Mom,
+ [EVENT_OBJ_GFX_LINK_BRENDAN] = &gEventObjectGraphicsInfo_LinkBrendan,
+ [EVENT_OBJ_GFX_LINK_MAY] = &gEventObjectGraphicsInfo_LinkMay,
+ [EVENT_OBJ_GFX_JUAN] = &gEventObjectGraphicsInfo_Juan,
+ [EVENT_OBJ_GFX_SCOTT] = &gEventObjectGraphicsInfo_Scott,
+ [EVENT_OBJ_GFX_POOCHYENA] = &gEventObjectGraphicsInfo_Poochyena,
+ [EVENT_OBJ_GFX_KYOGRE_3] = &gEventObjectGraphicsInfo_Kyogre3,
+ [EVENT_OBJ_GFX_GROUDON_3] = &gEventObjectGraphicsInfo_Groudon3,
+ [EVENT_OBJ_GFX_MYSTERY_GIFT_MAN] = &gEventObjectGraphicsInfo_MysteryEventDeliveryman,
+ [EVENT_OBJ_GFX_TRICK_HOUSE_STATUE] = &gEventObjectGraphicsInfo_Statue,
+ [EVENT_OBJ_GFX_KIRLIA] = &gEventObjectGraphicsInfo_Kirlia,
+ [EVENT_OBJ_GFX_DUSCLOPS] = &gEventObjectGraphicsInfo_Dusclops,
+ [EVENT_OBJ_GFX_UNION_ROOM_NURSE] = &gEventObjectGraphicsInfo_UnionRoomAttendant,
+ [EVENT_OBJ_GFX_SUDOWOODO] = &gEventObjectGraphicsInfo_Sudowoodo,
+ [EVENT_OBJ_GFX_MEW] = &gEventObjectGraphicsInfo_Mew,
+ [EVENT_OBJ_GFX_RED] = &gEventObjectGraphicsInfo_Red,
+ [EVENT_OBJ_GFX_LEAF] = &gEventObjectGraphicsInfo_Leaf,
+ [EVENT_OBJ_GFX_DEOXYS] = &gEventObjectGraphicsInfo_Deoxys,
+ [EVENT_OBJ_GFX_DEOXYS_TRIANGLE] = &gEventObjectGraphicsInfo_BirthIslandStone,
+ [EVENT_OBJ_GFX_BRANDON] = &gEventObjectGraphicsInfo_Brandon,
+ [EVENT_OBJ_GFX_LINK_RS_BRENDAN] = &gEventObjectGraphicsInfo_RubySapphireBrendan,
+ [EVENT_OBJ_GFX_LINK_RS_MAY] = &gEventObjectGraphicsInfo_RubySapphireMay,
+ [EVENT_OBJ_GFX_LUGIA] = &gEventObjectGraphicsInfo_Lugia,
+ [EVENT_OBJ_GFX_HOOH] = &gEventObjectGraphicsInfo_HoOh,
};
const struct EventObjectGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[] = {
diff --git a/src/data/lilycove_lady.h b/src/data/lilycove_lady.h
new file mode 100644
index 000000000..f60e527a5
--- /dev/null
+++ b/src/data/lilycove_lady.h
@@ -0,0 +1,470 @@
+#include "constants/easy_chat.h"
+#include "constants/event_objects.h"
+#include "constants/items.h"
+#include "constants/species.h"
+#include "constants/moves.h"
+
+static const u16 sContestLadyMonGfxId[] =
+{
+ EVENT_OBJ_GFX_ZIGZAGOON_1,
+ EVENT_OBJ_GFX_SKITTY,
+ EVENT_OBJ_GFX_POOCHYENA,
+ EVENT_OBJ_GFX_KECLEON_1,
+ EVENT_OBJ_GFX_PIKACHU
+};
+
+static const u16 sLilycoveLadyGfxId[] =
+{
+ EVENT_OBJ_GFX_WOMAN_4,
+ EVENT_OBJ_GFX_WOMAN_2,
+ EVENT_OBJ_GFX_GIRL_2
+};
+
+// Quiz Lady data
+static const u16 sQuizLadyQuestion1[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_STORES,
+ EC_WORD_INFORMATION,
+ EC_WORD_ON,
+ EC_WORD_POKEMON,
+ EC_WORD_QUES,
+ EC_WORD_CAMERA,
+ EC_WORD_POKEDEX,
+ EC_WORD_POKENAV
+};
+
+static const u16 sQuizLadyQuestion2[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_ISN_T,
+ EC_WORD_A,
+ EC_WORD_GAME,
+ EC_WORD_VERSION,
+ EC_WORD_QUES,
+ EC_WORD_RUBY,
+ EC_WORD_SAPPHIRE,
+ EC_WORD_DARK
+};
+
+static const u16 sQuizLadyQuestion3[] =
+{
+ EC_WORD_HOW,
+ EC_WORD_DO,
+ EC_WORD_POKEMON,
+ EC_WORD_EVOLVE,
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_LEVEL,
+ EC_WORD_INSOMNIA,
+ EC_WORD_CUTE_CHARM
+};
+
+static const u16 sQuizLadyQuestion4[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_IS,
+ EC_WORD_THE,
+ EC_WORD_PRETTY,
+ EC_WORD_ITEM,
+ EC_WORD_QUES,
+ EC_WORD_COLD,
+ EC_WORD_FLOWERS,
+ EC_WORD_MACHINE
+};
+
+static const u16 sQuizLadyQuestion5[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_ITEM,
+ EC_WORD_DO,
+ EC_WORD_YOU,
+ EC_WORD_BREAK,
+ EC_WORD_QUES,
+ EC_WORD_EGG,
+ EC_WORD_MAIL,
+ EC_WORD_PHONE
+};
+
+static const u16 sQuizLadyQuestion6[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_WILL,
+ EC_WORD_STOP,
+ EC_MOVE2(CONFUSION),
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_ILLUMINATE,
+ EC_WORD_OWN_TEMPO,
+ EC_WORD_SWIFT_SWIM
+};
+
+static const u16 sQuizLadyQuestion7[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_OF,
+ EC_WORD_THESE,
+ EC_WORD_IS,
+ EC_WORD_MUSIC,
+ EC_WORD_QUES,
+ EC_WORD_FLYING,
+ EC_WORD_STEEL,
+ EC_WORD_ROCK
+};
+
+static const u16 sQuizLadyQuestion8[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_WILL,
+ EC_MOVE2(BLOCK),
+ EC_WORD_ESCAPE,
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_RUN_AWAY,
+ EC_WORD_SHADOW_TAG,
+ EC_WORD_WONDER_GUARD
+};
+
+static const u16 sQuizLadyQuestion9[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_WILL,
+ EC_WORD_STOP,
+ EC_WORD_POISON,
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_GUTS,
+ EC_WORD_IMMUNITY,
+ EC_WORD_SHED_SKIN
+};
+
+static const u16 sQuizLadyQuestion10[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_GOES,
+ EC_WORD_WITH,
+ EC_WORD_CENTER,
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_POKEDEX,
+ EC_WORD_POKEMON,
+ EC_WORD_POKENAV
+};
+
+static const u16 sQuizLadyQuestion11[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_STORES,
+ EC_WORD_YOUR,
+ EC_WORD_POKEMON,
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_PC,
+ EC_WORD_DEPT_STORE,
+ EC_WORD_TELEVISION
+};
+
+static const u16 sQuizLadyQuestion12[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_MACHINE,
+ EC_WORD_GIVES,
+ EC_WORD_YOU,
+ EC_WORD_INFORMATION,
+ EC_WORD_QUES,
+ EC_WORD_BIKE,
+ EC_WORD_LOCOMOTIVE,
+ EC_WORD_TELEVISION
+};
+
+static const u16 sQuizLadyQuestion13[] =
+{
+ EC_WORD_A,
+ EC_WORD_POKEMON,
+ EC_WORD_WAS,
+ EC_WORD_ONCE,
+ EC_WORD_THIS,
+ EC_WORD_QUES,
+ EC_WORD_PHONE,
+ EC_WORD_PLUSH_DOLL,
+ EC_WORD_LETTER
+};
+
+static const u16 sQuizLadyQuestion14[] =
+{
+ EC_WORD_STEEL,
+ EC_WORD_IS,
+ EC_WORD_STRONG,
+ EC_WORD_VERSUS,
+ EC_WORD_WHICH,
+ EC_WORD_QUES,
+ EC_WORD_ICE,
+ EC_WORD_GROUND,
+ 0xFFFF
+};
+
+static const u16 sQuizLadyQuestion15[] =
+{
+ EC_WORD_DARK,
+ EC_WORD_IS,
+ EC_WORD_WEAK,
+ EC_WORD_VERSUS,
+ EC_WORD_WHICH,
+ EC_WORD_QUES,
+ EC_WORD_PSYCHIC,
+ EC_WORD_FIGHTING,
+ 0xFFFF
+};
+
+static const u16 sQuizLadyQuestion16[] =
+{
+ EC_WORD_GHOST,
+ EC_WORD_IS,
+ EC_WORD_WEAK,
+ EC_WORD_VERSUS,
+ EC_WORD_WHICH,
+ EC_WORD_QUES,
+ EC_WORD_NORMAL,
+ EC_WORD_DARK,
+ 0xFFFF
+};
+
+static const u16 *const sQuizLadyQuizQuestions[] =
+{
+ sQuizLadyQuestion1,
+ sQuizLadyQuestion2,
+ sQuizLadyQuestion3,
+ sQuizLadyQuestion4,
+ sQuizLadyQuestion5,
+ sQuizLadyQuestion6,
+ sQuizLadyQuestion7,
+ sQuizLadyQuestion8,
+ sQuizLadyQuestion9,
+ sQuizLadyQuestion10,
+ sQuizLadyQuestion11,
+ sQuizLadyQuestion12,
+ sQuizLadyQuestion13,
+ sQuizLadyQuestion14,
+ sQuizLadyQuestion15,
+ sQuizLadyQuestion16
+};
+
+static const u16 sQuizLadyQuizAnswers[] =
+{
+ EC_WORD_POKEDEX,
+ EC_WORD_DARK,
+ EC_WORD_LEVEL,
+ EC_WORD_FLOWERS,
+ EC_WORD_EGG,
+ EC_WORD_OWN_TEMPO,
+ EC_WORD_ROCK,
+ EC_WORD_SHADOW_TAG,
+ EC_WORD_IMMUNITY,
+ EC_WORD_POKEMON,
+ EC_WORD_PC,
+ EC_WORD_TELEVISION,
+ EC_WORD_PLUSH_DOLL,
+ EC_WORD_ICE,
+ EC_WORD_FIGHTING,
+ EC_WORD_DARK
+};
+
+static const u16 sQuizLadyPrizes[] =
+{
+ ITEM_GLITTER_MAIL,
+ ITEM_BEAD_MAIL,
+ ITEM_TROPIC_MAIL,
+ ITEM_MAX_ETHER,
+ ITEM_MAX_ETHER,
+ ITEM_MAX_ETHER,
+ ITEM_WATMEL_BERRY,
+ ITEM_BELUE_BERRY,
+ ITEM_DURIN_BERRY,
+ ITEM_LUXURY_BALL,
+ ITEM_TM15_HYPER_BEAM,
+ ITEM_BIG_PEARL,
+ ITEM_STAR_PIECE,
+ ITEM_RARE_CANDY,
+ ITEM_RARE_CANDY,
+ ITEM_PREMIER_BALL
+};
+
+// Favor Lady data
+static const u8 *const sFavorLadyRequests[] =
+{
+ gText_FavorLady_Slippery,
+ gText_FavorLady_Roundish,
+ gText_FavorLady_Whamish,
+ gText_FavorLady_Shiny,
+ gText_FavorLady_Sticky,
+ gText_FavorLady_Pointy
+};
+
+static const u16 sFavorLadyAcceptedItems_Slippery[] =
+{
+ ITEM_REPEL,
+ ITEM_SUPER_REPEL,
+ ITEM_MAX_REPEL,
+ ITEM_ANTIDOTE,
+ ITEM_PARALYZE_HEAL,
+ ITEM_BURN_HEAL,
+ ITEM_BELUE_BERRY,
+ ITEM_AWAKENING,
+ ITEM_ICE_HEAL,
+ ITEM_REVIVE,
+ ITEM_MAX_REVIVE,
+ ITEM_ENERGY_POWDER,
+ ITEM_NONE
+};
+
+static const u16 sFavorLadyAcceptedItems_Roundish[] =
+{
+ ITEM_FLUFFY_TAIL,
+ ITEM_PEARL,
+ ITEM_BIG_PEARL,
+ ITEM_HARD_STONE,
+ ITEM_SMOKE_BALL,
+ ITEM_SHOAL_SHELL,
+ ITEM_TINY_MUSHROOM,
+ ITEM_BIG_MUSHROOM,
+ ITEM_PECHA_BERRY,
+ ITEM_ASPEAR_BERRY,
+ ITEM_ORAN_BERRY,
+ ITEM_GREPA_BERRY,
+ ITEM_MAGOST_BERRY,
+ ITEM_WATMEL_BERRY,
+ ITEM_POKE_BALL,
+ ITEM_ULTRA_BALL,
+ ITEM_NONE
+};
+
+static const u16 sFavorLadyAcceptedItems_Whamish[] =
+{
+ ITEM_REVIVAL_HERB,
+ ITEM_POTION,
+ ITEM_FRESH_WATER,
+ ITEM_SODA_POP,
+ ITEM_LEMONADE,
+ ITEM_HARD_STONE,
+ ITEM_LIGHT_BALL,
+ ITEM_LAVA_COOKIE,
+ ITEM_CHESTO_BERRY,
+ ITEM_NANAB_BERRY,
+ ITEM_WEPEAR_BERRY,
+ ITEM_KELPSY_BERRY,
+ ITEM_NOMEL_BERRY,
+ ITEM_DURIN_BERRY,
+ ITEM_NONE
+};
+
+static const u16 sFavorLadyAcceptedItems_Shiny[] =
+{
+ ITEM_HEAL_POWDER,
+ ITEM_X_SPEED,
+ ITEM_X_ATTACK,
+ ITEM_X_DEFEND,
+ ITEM_BLUE_FLUTE,
+ ITEM_YELLOW_FLUTE,
+ ITEM_RED_FLUTE,
+ ITEM_BLACK_FLUTE,
+ ITEM_WHITE_FLUTE,
+ ITEM_NUGGET,
+ ITEM_SUN_STONE,
+ ITEM_STARDUST,
+ ITEM_STAR_PIECE,
+ ITEM_PEARL,
+ ITEM_BIG_PEARL,
+ ITEM_TWISTED_SPOON,
+ ITEM_SILVER_POWDER,
+ ITEM_BRIGHT_POWDER,
+ ITEM_LUXURY_BALL,
+ ITEM_PREMIER_BALL,
+ ITEM_NONE
+};
+
+static const u16 sFavorLadyAcceptedItems_Sticky[] =
+{
+ ITEM_ENERGY_ROOT,
+ ITEM_FULL_RESTORE,
+ ITEM_MAX_POTION,
+ ITEM_DIRE_HIT,
+ ITEM_X_ACCURACY,
+ ITEM_GUARD_SPEC,
+ ITEM_WATMEL_BERRY,
+ ITEM_LEFTOVERS,
+ ITEM_TINY_MUSHROOM,
+ ITEM_HEART_SCALE,
+ ITEM_NONE
+};
+
+static const u16 sFavorLadyAcceptedItems_Pointy[] =
+{
+ ITEM_QUICK_CLAW,
+ ITEM_POISON_BARB,
+ ITEM_SHARP_BEAK,
+ ITEM_DRAGON_FANG,
+ ITEM_TAMATO_BERRY,
+ ITEM_DURIN_BERRY,
+ ITEM_PETAYA_BERRY,
+ ITEM_SALAC_BERRY,
+ ITEM_STARDUST,
+ ITEM_STAR_PIECE,
+ ITEM_NONE
+};
+
+static const u16 *const sFavorLadyAcceptedItemLists[] =
+{
+ sFavorLadyAcceptedItems_Slippery,
+ sFavorLadyAcceptedItems_Roundish,
+ sFavorLadyAcceptedItems_Whamish,
+ sFavorLadyAcceptedItems_Shiny,
+ sFavorLadyAcceptedItems_Sticky,
+ sFavorLadyAcceptedItems_Pointy
+};
+
+static const u16 sFavorLadyPrizes[] =
+{
+ ITEM_LUXURY_BALL,
+ ITEM_NUGGET,
+ ITEM_PROTEIN,
+ ITEM_HEART_SCALE,
+ ITEM_RARE_CANDY,
+ ITEM_PP_MAX
+};
+
+
+static const u8 *const sContestLadyMonNames[] =
+{
+ gText_ContestLady_Handsome,
+ gText_ContestLady_Vinny,
+ gText_ContestLady_Moreme,
+ gText_ContestLady_Ironhard,
+ gText_ContestLady_Muscle
+};
+
+static const u8 *const sContestLadyCategoryNames[] =
+{
+ gText_ContestLady_Coolness,
+ gText_ContestLady_Beauty,
+ gText_ContestLady_Cuteness,
+ gText_ContestLady_Smartness,
+ gText_ContestLady_Toughness
+};
+
+static const u8 *const sContestNames[] =
+{
+ gText_CoolnessContest,
+ gText_BeautyContest,
+ gText_CutenessContest,
+ gText_SmartnessContest,
+ gText_ToughnessContest
+};
+
+static const u16 sContestLadyMonSpecies[] =
+{
+ SPECIES_ZIGZAGOON,
+ SPECIES_SKITTY,
+ SPECIES_POOCHYENA,
+ SPECIES_KECLEON,
+ SPECIES_PIKACHU
+};
diff --git a/src/daycare.c b/src/daycare.c
index 885ac31a1..2d05035d7 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -835,7 +835,7 @@ void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation)
u8 metLocation;
u8 isEgg;
- CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, FALSE, 0, FALSE, 0);
+ CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0);
metLevel = 0;
ball = ITEM_POKE_BALL;
language = LANGUAGE_JAPANESE;
@@ -862,7 +862,7 @@ static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *
u8 language;
personality = daycare->offspringPersonality;
- CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, TRUE, personality, FALSE, 0);
+ CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, TRUE, personality, OT_ID_PLAYER_ID, 0);
metLevel = 0;
ball = ITEM_POKE_BALL;
language = LANGUAGE_JAPANESE;
diff --git a/src/diploma.c b/src/diploma.c
index 92c7df703..8e0901fa8 100644
--- a/src/diploma.c
+++ b/src/diploma.c
@@ -127,7 +127,7 @@ static void Task_DiplomaFadeOut(u8 taskId)
static void DisplayDiplomaText(void)
{
- if (sub_80C0944())
+ if (HasAllMons())
{
SetGpuReg(REG_OFFSET_BG1HOFS, DISPCNT_BG0_ON);
StringCopy(gStringVar1, gText_DexNational);
diff --git a/src/easy_chat.c b/src/easy_chat.c
index 93456631a..ba54de783 100644
--- a/src/easy_chat.c
+++ b/src/easy_chat.c
@@ -30,6 +30,7 @@
#include "constants/easy_chat.h"
#include "constants/event_objects.h"
#include "constants/flags.h"
+#include "constants/lilycove_lady.h"
#include "constants/songs.h"
#include "constants/species.h"
#include "constants/rgb.h"
@@ -240,6 +241,7 @@ struct Unk8597530
MainCallback callback;
};
+// Lilycove Quiz Lady
static const struct Unk8597530 sUnknown_08597530[] = {
{
.word = 26,
@@ -1305,15 +1307,15 @@ void ShowEasyChatScreen(void)
displayedPersonType = EASY_CHAT_PERSON_BOY;
break;
case EASY_CHAT_TYPE_QUIZ_ANSWER:
- words = &gSaveBlock1Ptr->lilycoveLady.quiz.unk_016;
+ words = &gSaveBlock1Ptr->lilycoveLady.quiz.playerAnswer;
break;
case EASY_CHAT_TYPE_QUIZ_QUESTION:
return;
case EASY_CHAT_TYPE_QUIZ_SET_QUESTION:
- words = gSaveBlock1Ptr->lilycoveLady.quiz.unk_002;
+ words = gSaveBlock1Ptr->lilycoveLady.quiz.question;
break;
case EASY_CHAT_TYPE_QUIZ_SET_ANSWER:
- words = &gSaveBlock1Ptr->lilycoveLady.quiz.unk_014;
+ words = &gSaveBlock1Ptr->lilycoveLady.quiz.correctAnswer;
break;
case EASY_CHAT_TYPE_APPRENTICE:
words = gSaveBlock2Ptr->apprentices[0].easyChatWords;
@@ -1329,7 +1331,7 @@ void ShowEasyChatScreen(void)
DoEasyChatScreen(gSpecialVar_0x8004, words, CB2_ReturnToFieldContinueScript, displayedPersonType);
}
-static void sub_811A7E4(void)
+static void CB2_QuizLadyQuestion(void)
{
LilycoveLady *lilycoveLady;
@@ -1343,7 +1345,7 @@ static void sub_811A7E4(void)
if (!gPaletteFade.active)
{
lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
- lilycoveLady->quiz.unk_016 = -1;
+ lilycoveLady->quiz.playerAnswer = -1;
CleanupOverworldWindowsAndTilemaps();
DoQuizQuestionEasyChatScreen();
}
@@ -1352,9 +1354,9 @@ static void sub_811A7E4(void)
gMain.state ++;
}
-void sub_811A858(void)
+void QuizLadyShowQuizQuestion(void)
{
- SetMainCallback2(sub_811A7E4);
+ SetMainCallback2(CB2_QuizLadyQuestion);
}
static int sub_811A868(u16 word)
@@ -1387,7 +1389,7 @@ static void DoQuizAnswerEasyChatScreen(void)
{
DoEasyChatScreen(
EASY_CHAT_TYPE_QUIZ_ANSWER,
- &gSaveBlock1Ptr->lilycoveLady.quiz.unk_016,
+ &gSaveBlock1Ptr->lilycoveLady.quiz.playerAnswer,
CB2_ReturnToFieldContinueScript,
EASY_CHAT_PERSON_DISPLAY_NONE);
}
@@ -1395,7 +1397,7 @@ static void DoQuizAnswerEasyChatScreen(void)
static void DoQuizQuestionEasyChatScreen(void)
{
DoEasyChatScreen(EASY_CHAT_TYPE_QUIZ_QUESTION,
- gSaveBlock1Ptr->lilycoveLady.quiz.unk_002,
+ gSaveBlock1Ptr->lilycoveLady.quiz.question,
CB2_ReturnToFieldContinueScript,
EASY_CHAT_PERSON_DISPLAY_NONE);
}
@@ -1403,7 +1405,7 @@ static void DoQuizQuestionEasyChatScreen(void)
static void DoQuizSetAnswerEasyChatScreen(void)
{
DoEasyChatScreen(EASY_CHAT_TYPE_QUIZ_SET_ANSWER,
- &gSaveBlock1Ptr->lilycoveLady.quiz.unk_014,
+ &gSaveBlock1Ptr->lilycoveLady.quiz.correctAnswer,
CB2_ReturnToFieldContinueScript,
EASY_CHAT_PERSON_DISPLAY_NONE);
}
@@ -1411,7 +1413,7 @@ static void DoQuizSetAnswerEasyChatScreen(void)
static void DoQuizSetQuestionEasyChatScreen(void)
{
DoEasyChatScreen(EASY_CHAT_TYPE_QUIZ_SET_QUESTION,
- gSaveBlock1Ptr->lilycoveLady.quiz.unk_002,
+ gSaveBlock1Ptr->lilycoveLady.quiz.question,
CB2_ReturnToFieldContinueScript,
EASY_CHAT_PERSON_DISPLAY_NONE);
}
@@ -2660,9 +2662,9 @@ static int sub_811BD64(void)
return sub_811BCF4();
saveBlock1 = gSaveBlock1Ptr;
- for (i = 0; i < 9; i++)
+ for (i = 0; i < QUIZ_QUESTION_LEN; i++)
{
- if (saveBlock1->lilycoveLady.quiz.unk_002[i] != 0xFFFF)
+ if (saveBlock1->lilycoveLady.quiz.question[i] != 0xFFFF)
return 0;
}
@@ -2676,7 +2678,7 @@ static int sub_811BDB0(void)
return sub_811BCF4();
quiz = &gSaveBlock1Ptr->lilycoveLady.quiz;
- return quiz->unk_014 == 0xFFFF ? 1 : 0;
+ return quiz->correctAnswer == 0xFFFF ? 1 : 0;
}
static void sub_811BDF0(u8 *arg0)
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
index 835141ef2..5e16f1479 100644
--- a/src/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -322,7 +322,7 @@ static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp)
pokerus = GetMonData(egg, MON_DATA_POKERUS);
obedience = GetMonData(egg, MON_DATA_OBEDIENCE);
- CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, 0, 0);
+ CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, OT_ID_PLAYER_ID, 0);
for (i = 0; i < 4; i++)
{
diff --git a/src/electric.c b/src/electric.c
index 5e7729842..4b93119dc 100644
--- a/src/electric.c
+++ b/src/electric.c
@@ -667,9 +667,9 @@ static void sub_810A75C(struct Sprite *sprite)
sprite->oam.tileNum += gBattleAnimArgs[3] * 4;
if (gBattleAnimArgs[3] == 1)
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
else if (gBattleAnimArgs[3] == 2)
- sprite->oam.matrixNum = 16;
+ sprite->oam.matrixNum = ST_OAM_VFLIP;
sprite->data[0] = gBattleAnimArgs[2];
sprite->callback = WaitAnimForDuration;
diff --git a/src/field_specials.c b/src/field_specials.c
index be39f80d0..cb02f1f96 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -1442,7 +1442,7 @@ void SetShoalItemFlag(u16 v0)
void PutZigzagoonInPlayerParty(void)
{
u16 monData;
- CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, FALSE, 0);
+ CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0);
monData = TRUE;
SetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM, &monData);
monData = MOVE_TACKLE;
diff --git a/src/fight.c b/src/fight.c
index c924effae..5230c2f39 100644
--- a/src/fight.c
+++ b/src/fight.c
@@ -912,9 +912,9 @@ void sub_810D874(struct Sprite *sprite)
}
if (IsContest())
- sprite->oam.matrixNum |= 0x8;
+ sprite->oam.matrixNum |= ST_OAM_HFLIP;
else if (GetBattlerSide(battler) == B_SIDE_PLAYER)
- sprite->oam.matrixNum |= 0x18;
+ sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP);
sprite->data[0] = 16;
sprite->data[1] = sprite->pos1.x;
diff --git a/src/flying.c b/src/flying.c
index a157582e9..3d04a543c 100644
--- a/src/flying.c
+++ b/src/flying.c
@@ -1800,7 +1800,7 @@ void sub_810EEF8(struct Sprite *sprite)
sprite->data[2] = gBattleAnimArgs[0];
if (sprite->data[2])
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
if (gBattleAnimArgs[1] == 0)
{
diff --git a/src/frontier_util.c b/src/frontier_util.c
index 4dd8159cb..536e23e30 100644
--- a/src/frontier_util.c
+++ b/src/frontier_util.c
@@ -2503,7 +2503,7 @@ void CreateFrontierBrainPokemon(void)
monLevel,
sFrontierBrainsMons[facility][symbol][i].fixedIV,
TRUE, j,
- TRUE, FRONTIER_BRAIN_OTID);
+ OT_ID_PRESET, FRONTIER_BRAIN_OTID);
SetMonData(&gEnemyParty[monPartyId], MON_DATA_HELD_ITEM, &sFrontierBrainsMons[facility][symbol][i].heldItem);
for (j = 0; j < NUM_STATS; j++)
SetMonData(&gEnemyParty[monPartyId], MON_DATA_HP_EV + j, &sFrontierBrainsMons[facility][symbol][i].evs[j]);
diff --git a/src/ghost.c b/src/ghost.c
index dd29fb7ca..41621ff54 100644
--- a/src/ghost.c
+++ b/src/ghost.c
@@ -1039,7 +1039,7 @@ static void sub_81129F0(struct Sprite *sprite)
{
xDelta = 24;
xDelta2 = -2;
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
}
else
{
diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c
index fdf2020ff..ac37b2ece 100644
--- a/src/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -755,7 +755,7 @@ static void Task_Hof_HandleExit(u8 taskId)
static void SetCallback2AfterHallOfFameDisplay(void)
{
- SetMainCallback2(sub_8175620);
+ SetMainCallback2(CB2_StartCreditsSequence);
}
#undef tDontSaveData
diff --git a/src/item_menu.c b/src/item_menu.c
index 5b47a567b..12f03b328 100755
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -118,9 +118,9 @@ void sub_81AD9C0(u8);
void sub_81ADB14(u8);
void sub_81ADA7C(u8);
void sub_81ADC0C(u8);
-void bag_menu_leave_maybe_3(void);
-void bag_menu_leave_maybe_2(void);
void bag_menu_leave_maybe(void);
+void CB2_FavorLadyExitBagMenu(void);
+void CB2_QuizLadyExitBagMenu(void);
void sub_81ABA6C(void);
static void SetPocketListPositions(void);
void sub_81ABAE0(void);
@@ -493,20 +493,20 @@ void sub_81AAC14(void)
void sub_81AAC28(void)
{
- GoToBagMenu(RETURN_LOCATION_FIELD_6, POCKETS_COUNT, bag_menu_leave_maybe_3);
+ GoToBagMenu(RETURN_LOCATION_FIELD_6, POCKETS_COUNT, bag_menu_leave_maybe);
gSpecialVar_0x8005 = 0;
gSpecialVar_Result = 0;
}
-void sub_81AAC50(void)
+void FavorLadyOpenBagMenu(void)
{
- GoToBagMenu(RETURN_LOCATION_FIELD_4, POCKETS_COUNT, bag_menu_leave_maybe_2);
+ GoToBagMenu(RETURN_LOCATION_FIELD_4, POCKETS_COUNT, CB2_FavorLadyExitBagMenu);
gSpecialVar_Result = 0;
}
-void sub_81AAC70(void)
+void QuizLadyOpenBagMenu(void)
{
- GoToBagMenu(RETURN_LOCATION_FIELD_5, POCKETS_COUNT, bag_menu_leave_maybe);
+ GoToBagMenu(RETURN_LOCATION_FIELD_5, POCKETS_COUNT, CB2_QuizLadyExitBagMenu);
gSpecialVar_Result = 0;
}
@@ -2202,7 +2202,7 @@ void unknown_ItemMenu_Show(u8 taskId)
unknown_ItemMenu_Confirm(taskId);
}
-void bag_menu_leave_maybe_3(void)
+void bag_menu_leave_maybe(void)
{
gFieldCallback = Apprentice_EnableBothScriptContexts;
SetMainCallback2(CB2_ReturnToField);
@@ -2216,9 +2216,9 @@ void unknown_ItemMenu_Give2(u8 taskId)
unknown_ItemMenu_Confirm(taskId);
}
-void bag_menu_leave_maybe_2(void)
+void CB2_FavorLadyExitBagMenu(void)
{
- gFieldCallback = sub_818DEF4;
+ gFieldCallback = FieldCallback_FavorLadyEnableScriptContexts;
SetMainCallback2(CB2_ReturnToField);
}
@@ -2229,9 +2229,9 @@ void unknown_ItemMenu_Confirm2(u8 taskId)
unknown_ItemMenu_Confirm(taskId);
}
-void bag_menu_leave_maybe(void)
+void CB2_QuizLadyExitBagMenu(void)
{
- gFieldCallback = sub_818E564;
+ gFieldCallback = FieldCallback_QuizLadyEnableScriptContexts;
SetMainCallback2(CB2_ReturnToField);
}
diff --git a/asm/libagbsyscall.s b/src/libagbsyscall.s
index d5639f689..d5639f689 100644
--- a/asm/libagbsyscall.s
+++ b/src/libagbsyscall.s
diff --git a/asm/libgcnmultiboot.s b/src/libgcnmultiboot.s
index 0e418e51f..0e418e51f 100644
--- a/asm/libgcnmultiboot.s
+++ b/src/libgcnmultiboot.s
diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c
index dc38d8848..011d9fdfd 100644
--- a/src/lilycove_lady.c
+++ b/src/lilycove_lady.c
@@ -1,7 +1,3 @@
-//
-// Created by Scott Norton on 9/19/17.
-//
-
#include "global.h"
#include "main.h"
#include "overworld.h"
@@ -18,215 +14,25 @@
#include "text.h"
#include "easy_chat.h"
#include "lilycove_lady.h"
-
-static void SetLilycoveQuizLady(void);
-static void SetLilycoveFavourLady(void);
-static void SetLilycoveContestLady(void);
-static void sub_818E004(void);
-static void sub_818DBC4(void);
-static void sub_818E674(void);
-static u8 sub_818E13C(void);
-static bool8 sub_818E1F4(void);
-static u8 sub_818E258(const u8 *);
-
-extern const u8 gText_Lady2[];
-
-static const u16 sUnknown_0860B074[] = {
- 0x62, 0xcb, 0xdc, 0xcc, 0xd1
-};
-static const u16 sUnknown_0860B07E[] = {
- 0x1a, 0x14, 0x0a
-};
-
-static const u16 Unknown_0860B084[] = {
- 0x101b, 0x1623, 0x1812, 0x102c, 0x020e, 0x0c03, 0x1a0b, 0x0210, 0x020d
-};
-
-static const u16 Unknown_0860B096[] = {
- 0x101b, 0x1013, 0x1020, 0x1a0f, 0x020c, 0x0c03, 0x0211, 0x0203, 0x0400
-};
-
-static const u16 Unknown_0860B0A8[] = {
- 0x0e0f, 0x1018, 0x020e, 0x0204, 0x0c03, 0xffff, 0x0212, 0x0451, 0x0463
-};
-
-static const u16 Unknown_0860B0BA[] = {
- 0x101b, 0x100b, 0x0e0d, 0x141a, 0x181d, 0x0c03, 0x141e, 0x1a26, 0x1823
-};
-
-static const u16 Unknown_0860B0CC[] = {
- 0x101b, 0x181d, 0x1018, 0x0a02, 0x2014, 0x0c03, 0x0208, 0x1824, 0x181c
-};
-
-static const u16 Unknown_0860B0DE[] = {
- 0x101b, 0x1000, 0x1c19, 0x265d, 0x0c03, 0xffff, 0x0447, 0x045d, 0x042c
-};
-
-static const u16 Unknown_0860B0F0[] = {
- 0x101b, 0x1034, 0x1e11, 0x100b, 0x1a08, 0x0c03, 0x044b, 0x0446, 0x040a
-};
-
-static const u16 Unknown_0860B102[] = {
- 0x101b, 0x1000, 0x274f, 0x0626, 0x0c03, 0xffff, 0x0442, 0x0411, 0x0450
-};
-
-static const u16 Unknown_0860B114[] = {
- 0x101b, 0x1000, 0x1c19, 0x043c, 0x0c03, 0xffff, 0x0421, 0x0464, 0x0435
-};
-
-static const u16 Unknown_0860B126[] = {
- 0x101b, 0x1203, 0x1030, 0x0207, 0x0c03, 0xffff, 0x0210, 0x020e, 0x020d
-};
-
-static const u16 Unknown_0860B138[] = {
- 0x101b, 0x1623, 0x0a05, 0x020e, 0x0c03, 0xffff, 0x1a25, 0x181a, 0x181b
-};
-
-static const u16 Unknown_0860B14A[] = {
- 0x101b, 0x1823, 0x1603, 0x0a02, 0x1812, 0x0c03, 0x1a15, 0x1a23, 0x181b
-};
-
-static const u16 Unknown_0860B15C[] = {
- 0x1020, 0x020e, 0x1010, 0x1043, 0x1e0f, 0x0c03, 0x181c, 0x1a24, 0x1816
-};
-
-static const u16 Unknown_0860B16E[] = {
- 0x0446, 0x100b, 0x0620, 0x061c, 0x101b, 0x0c03, 0x0420, 0x0426, 0xffff
-};
-
-static const u16 Unknown_0860B180[] = {
- 0x0400, 0x100b, 0x0639, 0x061c, 0x101b, 0x0c03, 0x040e, 0x0410, 0xffff
-};
-
-static const u16 Unknown_0860B192[] = {
- 0x041f, 0x100b, 0x0639, 0x061c, 0x101b, 0x0c03, 0x0445, 0x0400, 0xffff
-};
-
-static const u16 *const gUnknown_0860B1A4[] = {
- Unknown_0860B084,
- Unknown_0860B096,
- Unknown_0860B0A8,
- Unknown_0860B0BA,
- Unknown_0860B0CC,
- Unknown_0860B0DE,
- Unknown_0860B0F0,
- Unknown_0860B102,
- Unknown_0860B114,
- Unknown_0860B126,
- Unknown_0860B138,
- Unknown_0860B14A,
- Unknown_0860B15C,
- Unknown_0860B16E,
- Unknown_0860B180,
- Unknown_0860B192
-};
-
-static const u16 sUnknown_0860B1E4[] = {
- 0x0210, 0x0400, 0x0212, 0x1a26, 0x0208, 0x045d, 0x040a, 0x0411, 0x0464, 0x020e, 0x1a25, 0x181b, 0x1a24, 0x0420, 0x0410, 0x0400
-};
-
-static const u16 sUnknown_0860B204[] = {
- 0x007b, 0x007f, 0x0081, 0x0023, 0x0023, 0x0023, 0x00a5, 0x00a7, 0x00a6, 0x000b, 0x012f, 0x006b, 0x006d, 0x0044, 0x0044, 0x000c
-};
-
-extern const u8 gUnknown_085EEB83[];
-extern const u8 gUnknown_085EEB8C[];
-extern const u8 gUnknown_085EEB95[];
-extern const u8 gUnknown_085EEB9E[];
-extern const u8 gUnknown_085EEBA4[];
-extern const u8 gUnknown_085EEBAB[];
-
-static const u8 *const gUnknown_0860B224[] = {
- gUnknown_085EEB83,
- gUnknown_085EEB8C,
- gUnknown_085EEB95,
- gUnknown_085EEB9E,
- gUnknown_085EEBA4,
- gUnknown_085EEBAB
-};
-
-static const u16 Unknown_0860B23C[] = {
- 0x0056, 0x0053, 0x0054, 0x000e, 0x0012, 0x000f, 0x00a7, 0x0011, 0x0010, 0x0018, 0x0019, 0x001e, 0x0000
-};
-
-static const u16 Unknown_0860B256[] = {
- 0x0051, 0x006a, 0x006b, 0x00cc, 0x00c2, 0x002f, 0x0067, 0x0068, 0x0087, 0x0089, 0x008b, 0x009d, 0x00a0, 0x00a5, 0x0004, 0x0002, 0x0000
-};
-
-static const u16 Unknown_0860B278[] = {
- 0x0021, 0x000d, 0x001a, 0x001b, 0x001c, 0x00cc, 0x00ca, 0x0026, 0x0086, 0x0096, 0x0097, 0x009a, 0x00a2, 0x00a6, 0x0000
-};
-
-static const u16 Unknown_0860B296[] = {
- 0x0020, 0x004d, 0x004b, 0x004c, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x006e, 0x005d, 0x006c, 0x006d, 0x006a, 0x006b, 0x00d6, 0x00bc, 0x00b3, 0x000b, 0x000c, 0x0000
-};
-
-static const u16 Unknown_0860B2C0[] = {
- 0x001f, 0x0013, 0x0014, 0x004a, 0x004e, 0x0049, 0x00a5, 0x00c8, 0x0067, 0x006f, 0x0000
-};
-
-static const u16 Unknown_0860B2D6[] = {
- 0x00b7, 0x00d3, 0x00d2, 0x00d8, 0x009e, 0x00a6, 0x00ab, 0x00aa, 0x006c, 0x006d, 0x0000
-};
-
-static const u16 *const gUnknown_0860B2EC[] = {
- Unknown_0860B23C,
- Unknown_0860B256,
- Unknown_0860B278,
- Unknown_0860B296,
- Unknown_0860B2C0,
- Unknown_0860B2D6
-};
-
-static const u16 sUnknown_0860B304[] = {
- 0x0b, 0x6e, 0x40, 0x6f, 0x44, 0x47
-};
-
-extern const u8 gUnknown_085EEB2B[];
-extern const u8 gUnknown_085EEB34[];
-extern const u8 gUnknown_085EEB3A[];
-extern const u8 gUnknown_085EEB41[];
-extern const u8 gUnknown_085EEB4A[];
-extern const u8 gUnknown_085EEB51[];
-extern const u8 gUnknown_085EEB5A[];
-extern const u8 gUnknown_085EEB61[];
-extern const u8 gUnknown_085EEB6A[];
-extern const u8 gUnknown_085EEB74[];
-extern const u8 gUnknown_085EADA4[];
-extern const u8 gUnknown_085EADB5[];
-extern const u8 gUnknown_085EADC4[];
-extern const u8 gUnknown_085EADD5[];
-extern const u8 gUnknown_085EADE7[];
-
-static const u8 *const gUnknown_0860B310[] = {
- gUnknown_085EEB2B,
- gUnknown_085EEB34,
- gUnknown_085EEB3A,
- gUnknown_085EEB41,
- gUnknown_085EEB4A
-};
-static const u8 *const gUnknown_0860B324[] = {
- gUnknown_085EEB51,
- gUnknown_085EEB5A,
- gUnknown_085EEB61,
- gUnknown_085EEB6A,
- gUnknown_085EEB74
-};
-static const u8 *const gUnknown_0860B338[] = {
- gUnknown_085EADA4,
- gUnknown_085EADB5,
- gUnknown_085EADC4,
- gUnknown_085EADD5,
- gUnknown_085EADE7
-};
-
-static const u16 sUnknown_0860B34C[] = {
- 0x0120, 0x013b, 0x011e, 0x013d, 0x0019
-};
-
-static EWRAM_DATA struct LilycoveLadyFavour *gUnknown_0203CD64 = NULL;
-static EWRAM_DATA struct LilycoveLadyQuiz *gUnknown_0203CD68 = NULL;
-static EWRAM_DATA struct LilycoveLadyContest *gUnknown_0203CD6C = NULL;
+#include "contest.h"
+#include "strings.h"
+#include "constants/lilycove_lady.h"
+
+#include "data/lilycove_lady.h"
+
+static void InitLilycoveQuizLady(void);
+static void InitLilycoveFavorLady(void);
+static void InitLilycoveContestLady(void);
+static void ResetQuizLadyForRecordMix(void);
+static void ResetFavorLadyForRecordMix(void);
+static void ResetContestLadyForRecordMix(void);
+static u8 BufferQuizAuthorName(void);
+static bool8 IsQuizTrainerIdNotPlayer(void);
+static u8 GetPlayerNameLength(const u8 *);
+
+static EWRAM_DATA struct LilycoveLadyFavor *sFavorLadyPtr = NULL;
+static EWRAM_DATA struct LilycoveLadyQuiz *sQuizLadyPtr = NULL;
+static EWRAM_DATA struct LilycoveLadyContest *sContestLadyPtr = NULL;
extern EWRAM_DATA u16 gSpecialVar_ItemId;
@@ -235,15 +41,15 @@ u8 GetLilycoveLadyId(void)
return gSaveBlock1Ptr->lilycoveLady.id;
}
-void sub_818D9C0(void)
+void SetLilycoveLadyGfx(void)
{
LilycoveLady *lilycoveLady;
- VarSet(VAR_OBJ_GFX_ID_0, sUnknown_0860B07E[GetLilycoveLadyId()]);
+ VarSet(VAR_OBJ_GFX_ID_0, sLilycoveLadyGfxId[GetLilycoveLadyId()]);
if (GetLilycoveLadyId() == LILYCOVE_LADY_CONTEST)
{
lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
- VarSet(VAR_OBJ_GFX_ID_1, sUnknown_0860B074[lilycoveLady->contest.category]);
+ VarSet(VAR_OBJ_GFX_ID_1, sContestLadyMonGfxId[lilycoveLady->contest.category]);
gSpecialVar_Result = TRUE;
}
else
@@ -252,718 +58,722 @@ void sub_818D9C0(void)
}
}
-void SetLilycoveLady(void)
+void InitLilycoveLady(void)
{
- u16 id;
-
- id = ((gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]);
+ u16 id = ((gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]);
id %= 6;
id >>= 1;
switch (id)
{
case LILYCOVE_LADY_QUIZ:
- SetLilycoveQuizLady();
+ InitLilycoveQuizLady();
break;
- case LILYCOVE_LADY_FAVOUR:
- SetLilycoveFavourLady();
+ case LILYCOVE_LADY_FAVOR:
+ InitLilycoveFavorLady();
break;
case LILYCOVE_LADY_CONTEST:
- SetLilycoveContestLady();
+ InitLilycoveContestLady();
break;
}
}
-void sub_818DA78(void)
+void ResetLilycoveLadyForRecordMix(void)
{
switch (GetLilycoveLadyId())
{
case LILYCOVE_LADY_QUIZ:
- sub_818E004();
+ ResetQuizLadyForRecordMix();
break;
- case LILYCOVE_LADY_FAVOUR:
- sub_818DBC4();
+ case LILYCOVE_LADY_FAVOR:
+ ResetFavorLadyForRecordMix();
break;
case LILYCOVE_LADY_CONTEST:
- sub_818E674();
+ ResetContestLadyForRecordMix();
break;
}
}
-void SetLilycoveLadyRandomly(void)
+// Unused
+void InitLilycoveLadyRandomly(void)
{
- u8 id;
+ u8 lady = Random() % LILYCOVE_LADY_COUNT;
- id = Random() % 3;
- switch (id)
+ switch (lady)
{
case LILYCOVE_LADY_QUIZ:
- SetLilycoveQuizLady();
+ InitLilycoveQuizLady();
break;
- case LILYCOVE_LADY_FAVOUR:
- SetLilycoveFavourLady();
+ case LILYCOVE_LADY_FAVOR:
+ InitLilycoveFavorLady();
break;
case LILYCOVE_LADY_CONTEST:
- SetLilycoveContestLady();
+ InitLilycoveContestLady();
break;
}
}
-void sub_818DAEC(void)
+void Script_GetLilycoveLadyId(void)
{
gSpecialVar_Result = GetLilycoveLadyId();
}
-static u8 sub_818DB04(const u16 *data)
+static u8 GetNumAcceptedItems(const u16 *itemsArray)
{
- u8 len;
+ u8 items;
- for (len = 0; *data != 0; len ++, data ++);
- return len;
+ for (items = 0; *itemsArray != ITEM_NONE; items ++, itemsArray ++);
+ return items;
}
-static void sub_818DB20(void)
+static void FavorLadyPickFavorAndBestItem(void)
{
- u8 size;
- u8 idx;
+ u8 numItems;
+ u8 bestItem;
- gUnknown_0203CD64->unk_00c = Random() % 6;
- size = sub_818DB04(gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c]);
- idx = Random() % size;
- gUnknown_0203CD64->unk_010 = gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c][idx];
+ sFavorLadyPtr->favorId = Random() % ARRAY_COUNT(sFavorLadyRequests);
+ numItems = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]);
+ bestItem = Random() % numItems;
+ sFavorLadyPtr->bestItem = sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][bestItem];
}
-static void SetLilycoveFavourLady(void)
+static void InitLilycoveFavorLady(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- gUnknown_0203CD64->id = LILYCOVE_LADY_FAVOUR;
- gUnknown_0203CD64->phase = 0;
- gUnknown_0203CD64->playerName[0] = EOS;
- gUnknown_0203CD64->unk_002 = 0;
- gUnknown_0203CD64->unk_003= 0;
- gUnknown_0203CD64->itemId = ITEM_NONE;
- gUnknown_0203CD64->language = gGameLanguage;
- sub_818DB20();
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ sFavorLadyPtr->id = LILYCOVE_LADY_FAVOR;
+ sFavorLadyPtr->state = LILYCOVE_LADY_STATE_READY;
+ sFavorLadyPtr->playerName[0] = EOS;
+ sFavorLadyPtr->likedItem = FALSE;
+ sFavorLadyPtr->numItemsGiven = 0;
+ sFavorLadyPtr->itemId = ITEM_NONE;
+ sFavorLadyPtr->language = gGameLanguage;
+ FavorLadyPickFavorAndBestItem();
}
-static void sub_818DBC4(void)
+static void ResetFavorLadyForRecordMix(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- gUnknown_0203CD64->id = LILYCOVE_LADY_FAVOUR;
- gUnknown_0203CD64->phase = 0;
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ sFavorLadyPtr->id = LILYCOVE_LADY_FAVOR;
+ sFavorLadyPtr->state = LILYCOVE_LADY_STATE_READY;
}
-u8 sub_818DBE8(void)
+u8 GetFavorLadyState(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- if (gUnknown_0203CD64->phase == 2)
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ if (sFavorLadyPtr->state == LILYCOVE_LADY_STATE_PRIZE)
{
- return 2;
+ return LILYCOVE_LADY_STATE_PRIZE;
}
- else if (gUnknown_0203CD64->phase == 1)
+ else if (sFavorLadyPtr->state == LILYCOVE_LADY_STATE_COMPLETED)
{
- return 1;
+ return LILYCOVE_LADY_STATE_COMPLETED;
}
else
{
- return 0;
+ return LILYCOVE_LADY_STATE_READY;
}
}
-static const u8 *sub_818DC1C(u8 idx)
+static const u8 *GetFavorLadyRequest(u8 idx)
{
- return gUnknown_0860B224[idx];
+ return sFavorLadyRequests[idx];
}
-void sub_818DC2C(void)
+void BufferFavorLadyRequest(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- StringCopy(gStringVar1, sub_818DC1C(gUnknown_0203CD64->unk_00c));
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ StringCopy(gStringVar1, GetFavorLadyRequest(sFavorLadyPtr->favorId));
}
-bool8 sub_818DC60(void)
+bool8 HasAnotherPlayerGivenFavorLadyItem(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- if (gUnknown_0203CD64->playerName[0] != EOS)
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ if (sFavorLadyPtr->playerName[0] != EOS)
{
- StringCopy7(gStringVar3, gUnknown_0203CD64->playerName);
- ConvertInternationalString(gStringVar3, gUnknown_0203CD64->language);
+ StringCopy7(gStringVar3, sFavorLadyPtr->playerName);
+ ConvertInternationalString(gStringVar3, sFavorLadyPtr->language);
return TRUE;
}
return FALSE;
}
-static void sub_818DCAC(u8 *dest, u16 itemId)
+static void BufferItemName(u8 *dest, u16 itemId)
{
StringCopy(dest, ItemId_GetName(itemId));
}
-void sub_818DCC8(void)
+void BufferFavorLadyItemName(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- sub_818DCAC(gStringVar2, gUnknown_0203CD64->itemId);
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ BufferItemName(gStringVar2, sFavorLadyPtr->itemId);
}
-static void sub_818DCF4(const u8 *src, u8 *dest)
+static void SetFavorLadyPlayerName(const u8 *src, u8 *dest)
{
memset(dest, 0xFF, 8);
StringCopy7(dest, src);
}
-void sub_818DD14(void)
+void BufferFavorLadyPlayerName(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- sub_818DCF4(gUnknown_0203CD64->playerName, gStringVar3);
- ConvertInternationalString(gStringVar3, gUnknown_0203CD64->language);
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ SetFavorLadyPlayerName(sFavorLadyPtr->playerName, gStringVar3);
+ ConvertInternationalString(gStringVar3, sFavorLadyPtr->language);
}
-bool8 sub_818DD54(void)
+// Only used to determine if a record-mixed player had given her an item she liked
+bool8 DidFavorLadyLikeItem(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- return gUnknown_0203CD64->unk_002 ? TRUE : FALSE;
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ return sFavorLadyPtr->likedItem ? TRUE : FALSE;
}
-void sub_818DD78(void)
+void Script_FavorLadyOpenBagMenu(void)
{
- sub_81AAC50();
+ FavorLadyOpenBagMenu();
}
-static bool8 sub_818DD84(u16 itemId)
+static bool8 DoesFavorLadyLikeItem(u16 itemId)
{
- u8 len;
+ u8 numItems;
u8 i;
- bool8 response;
-
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- len = sub_818DB04(gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c]);
- gUnknown_0203CD64->phase = 1;
- sub_818DCAC(gStringVar2, itemId);
- gUnknown_0203CD64->itemId = itemId;
- sub_818DCF4(gSaveBlock2Ptr->playerName, gUnknown_0203CD64->playerName);
- gUnknown_0203CD64->language = gGameLanguage;
- response = FALSE;
- for (i = 0; i < len; i ++)
- {
- if (gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c][i] == itemId)
+ bool8 likedItem;
+
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ numItems = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]);
+ sFavorLadyPtr->state = LILYCOVE_LADY_STATE_COMPLETED;
+ BufferItemName(gStringVar2, itemId);
+ sFavorLadyPtr->itemId = itemId;
+ SetFavorLadyPlayerName(gSaveBlock2Ptr->playerName, sFavorLadyPtr->playerName);
+ sFavorLadyPtr->language = gGameLanguage;
+ likedItem = FALSE;
+ for (i = 0; i < numItems; i ++)
+ {
+ if (sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][i] == itemId)
{
- response = TRUE;
- gUnknown_0203CD64->unk_003 ++;
- gUnknown_0203CD64->unk_002 = 1;
- if (gUnknown_0203CD64->unk_010 == itemId)
+ likedItem = TRUE;
+ sFavorLadyPtr->numItemsGiven++;
+ sFavorLadyPtr->likedItem = TRUE;
+ if (sFavorLadyPtr->bestItem == itemId)
{
- gUnknown_0203CD64->unk_003 = 5;
+ sFavorLadyPtr->numItemsGiven = LILYCOVE_LADY_GIFT_THRESHOLD;
}
break;
}
- gUnknown_0203CD64->unk_002 = 0;
+ sFavorLadyPtr->likedItem = FALSE;
}
- return response;
+ return likedItem;
}
-bool8 sub_818DE44(void)
+bool8 Script_DoesFavorLadyLikeItem(void)
{
- return sub_818DD84(gSpecialVar_ItemId);
+ return DoesFavorLadyLikeItem(gSpecialVar_ItemId);
}
-bool8 sub_818DE5C(void)
+bool8 IsFavorLadyThresholdMet(void)
{
- u8 checkval;
+ u8 numItemsGiven;
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- checkval = gUnknown_0203CD64->unk_003;
- return checkval < 5 ? FALSE : TRUE;
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ numItemsGiven = sFavorLadyPtr->numItemsGiven;
+ return numItemsGiven < LILYCOVE_LADY_GIFT_THRESHOLD ? FALSE : TRUE;
}
-static void sub_818DE88(u16 itemId)
+static void FavorLadyBufferPrizeName(u16 prize)
{
- sub_818DCAC(gStringVar2, itemId);
+ BufferItemName(gStringVar2, prize);
}
-u16 sub_818DEA0(void)
+u16 FavorLadyGetPrize(void)
{
- u16 itemId;
+ u16 prize;
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- itemId = sUnknown_0860B304[gUnknown_0203CD64->unk_00c];
- sub_818DE88(itemId);
- gUnknown_0203CD64->phase = 2;
- return itemId;
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ prize = sFavorLadyPrizes[sFavorLadyPtr->favorId];
+ FavorLadyBufferPrizeName(prize);
+ sFavorLadyPtr->state = LILYCOVE_LADY_STATE_PRIZE;
+ return prize;
}
-void sub_818DEDC(void)
+void SetFavorLadyState_Complete(void)
{
- SetLilycoveFavourLady();
- gUnknown_0203CD64->phase = 1;
+ InitLilycoveFavorLady();
+ sFavorLadyPtr->state = LILYCOVE_LADY_STATE_COMPLETED;
}
-void sub_818DEF4(void)
+void FieldCallback_FavorLadyEnableScriptContexts(void)
{
EnableBothScriptContexts();
}
-static void sub_818DF00(void)
+static void QuizLadyPickQuestion(void)
{
- u8 v0;
+ u8 questionId;
u8 i;
- v0 = Random() % 16;
- for (i = 0; i < 9; i ++)
+ questionId = Random() % ARRAY_COUNT(sQuizLadyQuizQuestions);
+ for (i = 0; i < QUIZ_QUESTION_LEN; i ++)
{
- gUnknown_0203CD68->unk_002[i] = gUnknown_0860B1A4[v0][i];
+ sQuizLadyPtr->question[i] = sQuizLadyQuizQuestions[questionId][i];
}
- gUnknown_0203CD68->unk_014 = sUnknown_0860B1E4[v0];
- gUnknown_0203CD68->itemId = sUnknown_0860B204[v0];
- gUnknown_0203CD68->unk_02b = v0;
- gUnknown_0203CD68->playerName[0] = EOS;
+ sQuizLadyPtr->correctAnswer = sQuizLadyQuizAnswers[questionId];
+ sQuizLadyPtr->prize = sQuizLadyPrizes[questionId];
+ sQuizLadyPtr->questionId = questionId;
+ sQuizLadyPtr->playerName[0] = EOS;
}
-static void SetLilycoveQuizLady(void)
+static void InitLilycoveQuizLady(void)
{
u8 i;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->id = LILYCOVE_LADY_QUIZ;
- gUnknown_0203CD68->phase = 0;
- for (i = 0; i < 9; i ++)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->id = LILYCOVE_LADY_QUIZ;
+ sQuizLadyPtr->state = LILYCOVE_LADY_STATE_READY;
+ for (i = 0; i < QUIZ_QUESTION_LEN; i ++)
{
- gUnknown_0203CD68->unk_002[i] = -1;
+ sQuizLadyPtr->question[i] = -1;
}
- gUnknown_0203CD68->unk_014 = -1;
- gUnknown_0203CD68->unk_016 = -1;
- for (i = 0; i < 4; i ++)
+ sQuizLadyPtr->correctAnswer = -1;
+ sQuizLadyPtr->playerAnswer = -1;
+ for (i = 0; i < TRAINER_ID_LENGTH; i ++)
{
- gUnknown_0203CD68->playerTrainerId[i] = 0;
+ sQuizLadyPtr->playerTrainerId[i] = 0;
}
- gUnknown_0203CD68->itemId = ITEM_NONE;
- gUnknown_0203CD68->unk_02a = 0;
- gUnknown_0203CD68->unk_02c = 0x10;
- gUnknown_0203CD68->language = gGameLanguage;
- sub_818DF00();
+ sQuizLadyPtr->prize = ITEM_NONE;
+ sQuizLadyPtr->waitingForChallenger = FALSE;
+ sQuizLadyPtr->prevQuestionId = ARRAY_COUNT(sQuizLadyQuizQuestions);
+ sQuizLadyPtr->language = gGameLanguage;
+ QuizLadyPickQuestion();
}
-static void sub_818E004(void)
+static void ResetQuizLadyForRecordMix(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->id = LILYCOVE_LADY_QUIZ;
- gUnknown_0203CD68->phase = 0;
- gUnknown_0203CD68->unk_02a = 0;
- gUnknown_0203CD68->unk_016 = -1;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->id = LILYCOVE_LADY_QUIZ;
+ sQuizLadyPtr->state = LILYCOVE_LADY_STATE_READY;
+ sQuizLadyPtr->waitingForChallenger = FALSE;
+ sQuizLadyPtr->playerAnswer = -1;
}
-u8 sub_818E038(void)
+u8 GetQuizLadyState(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (gUnknown_0203CD68->phase == 2)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (sQuizLadyPtr->state == LILYCOVE_LADY_STATE_PRIZE)
{
- return 2;
+ return LILYCOVE_LADY_STATE_PRIZE;
}
- else if (gUnknown_0203CD68->phase == 1)
+ else if (sQuizLadyPtr->state == LILYCOVE_LADY_STATE_COMPLETED)
{
- return 1;
+ return LILYCOVE_LADY_STATE_COMPLETED;
}
else
{
- return 0;
+ return LILYCOVE_LADY_STATE_READY;
}
}
-u8 sub_818E06C(void)
+u8 GetQuizAuthor(void)
{
int i;
int j;
- u8 rv;
+ u8 authorNameId;
struct LilycoveLadyQuiz *quiz;
quiz = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (sub_811F8D8(quiz->unk_014) == 0)
- {
- i = quiz->unk_02b;
+ if (sub_811F8D8(quiz->correctAnswer) == 0)
+ {
+ i = quiz->questionId;
do
{
- if (++ i >= 16)
+ if (++ i >= (int)(ARRAY_COUNT(sQuizLadyQuizQuestions)))
{
i = 0;
}
- } while (sub_811F8D8(sUnknown_0860B1E4[i]) == 0);
- for (j = 0; j < 9; j ++)
+ } while (sub_811F8D8(sQuizLadyQuizAnswers[i]) == 0);
+ for (j = 0; j < QUIZ_QUESTION_LEN; j ++)
{
- quiz->unk_002[j] = gUnknown_0860B1A4[i][j];
+ quiz->question[j] = sQuizLadyQuizQuestions[i][j];
}
- quiz->unk_014 = sUnknown_0860B1E4[i];
- quiz->itemId = sUnknown_0860B204[i];
- quiz->unk_02b = i;
+ quiz->correctAnswer = sQuizLadyQuizAnswers[i];
+ quiz->prize = sQuizLadyPrizes[i];
+ quiz->questionId = i;
quiz->playerName[0] = EOS;
}
- rv = sub_818E13C();
- if (rv == 0)
+ authorNameId = BufferQuizAuthorName();
+ if (authorNameId == QUIZ_AUTHOR_NAME_LADY)
{
- return 2;
+ return QUIZ_AUTHOR_LADY;
}
- else if (rv == 2 || sub_818E1F4())
+ else if (authorNameId == QUIZ_AUTHOR_NAME_OTHER_PLAYER || IsQuizTrainerIdNotPlayer())
{
- return 1;
+ return QUIZ_AUTHOR_OTHER_PLAYER;
}
else
{
- return 0;
+ return QUIZ_AUTHOR_PLAYER;
}
}
-static u8 sub_818E13C(void)
+static u8 BufferQuizAuthorName(void)
{
- u8 retval;
- u8 len;
+ u8 authorNameId;
+ u8 nameLen;
u8 i;
- retval = 1;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (gUnknown_0203CD68->playerName[0] == EOS)
+ authorNameId = QUIZ_AUTHOR_NAME_PLAYER;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (sQuizLadyPtr->playerName[0] == EOS)
{
- StringCopy7(gStringVar1, gText_Lady2);
- retval = 0;
+ StringCopy7(gStringVar1, gText_QuizLady_Lady);
+ authorNameId = QUIZ_AUTHOR_NAME_LADY;
}
else
{
- StringCopy7(gStringVar1, gUnknown_0203CD68->playerName);
- ConvertInternationalString(gStringVar1, gUnknown_0203CD68->language);
- len = sub_818E258(gUnknown_0203CD68->playerName);
- if (len == sub_818E258(gSaveBlock2Ptr->playerName))
+ StringCopy7(gStringVar1, sQuizLadyPtr->playerName);
+ ConvertInternationalString(gStringVar1, sQuizLadyPtr->language);
+ nameLen = GetPlayerNameLength(sQuizLadyPtr->playerName);
+ if (nameLen == GetPlayerNameLength(gSaveBlock2Ptr->playerName))
{
- u8 *name = gUnknown_0203CD68->playerName;
- for (i = 0; i < len; i ++)
+ u8 *name = sQuizLadyPtr->playerName;
+ for (i = 0; i < nameLen; i ++)
{
- name = gUnknown_0203CD68->playerName;
+ name = sQuizLadyPtr->playerName;
if (name[i] != gSaveBlock2Ptr->playerName[i])
{
- retval = 2;
+ authorNameId = QUIZ_AUTHOR_NAME_OTHER_PLAYER;
break;
}
}
}
}
- return retval;
+ return authorNameId;
}
-static u8 sub_818E1F4(void)
+static bool8 IsQuizTrainerIdNotPlayer(void)
{
- bool8 response;
+ bool8 notPlayer;
u8 i;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- response = FALSE;
- for (i = 0; i < 4; i ++)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ notPlayer = FALSE;
+ for (i = 0; i < TRAINER_ID_LENGTH; i ++)
{
- if (gUnknown_0203CD68->playerTrainerId[i] != gSaveBlock2Ptr->playerTrainerId[i])
+ if (sQuizLadyPtr->playerTrainerId[i] != gSaveBlock2Ptr->playerTrainerId[i])
{
- response = TRUE;
+ notPlayer = TRUE;
break;
}
}
- return response;
+ return notPlayer;
}
-static u8 sub_818E258(const u8 *str)
+static u8 GetPlayerNameLength(const u8 *playerName)
{
u8 len;
const u8 *ptr;
- for (len = 0, ptr = str; *ptr != EOS; len ++, ptr ++);
+ for (len = 0, ptr = playerName; *ptr != EOS; len ++, ptr ++);
return len;
}
-void sub_818E274(void)
+void BufferQuizPrizeName(void)
{
- StringCopy(gStringVar1, ItemId_GetName(gUnknown_0203CD68->itemId));
+ StringCopy(gStringVar1, ItemId_GetName(sQuizLadyPtr->prize));
}
-bool8 sub_818E298(void)
+bool8 BufferQuizAuthorNameAndCheckIfLady(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (!sub_818E13C())
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (BufferQuizAuthorName() == QUIZ_AUTHOR_NAME_LADY)
{
- gUnknown_0203CD68->language = gGameLanguage;
+ sQuizLadyPtr->language = gGameLanguage;
return TRUE;
}
return FALSE;
}
-u8 sub_818E2D8(void)
+bool8 IsQuizLadyWaitingForChallenger(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- return gUnknown_0203CD68->unk_02a;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ return sQuizLadyPtr->waitingForChallenger;
}
-void sub_818E2FC(void)
+void QuizLadyGetPlayerAnswer(void)
{
ShowEasyChatScreen();
}
-bool8 sub_818E308(void)
+bool8 IsQuizAnswerCorrect(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- CopyEasyChatWord(gStringVar1, gUnknown_0203CD68->unk_014);
- CopyEasyChatWord(gStringVar2, gUnknown_0203CD68->unk_016);
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ CopyEasyChatWord(gStringVar1, sQuizLadyPtr->correctAnswer);
+ CopyEasyChatWord(gStringVar2, sQuizLadyPtr->playerAnswer);
return StringCompare(gStringVar1, gStringVar2) ? FALSE : TRUE;
}
-void sub_818E358(void)
+void BufferQuizPrizeItem(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gSpecialVar_0x8005 = gUnknown_0203CD68->itemId;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ gSpecialVar_0x8005 = sQuizLadyPtr->prize;
}
-void sub_818E37C(void)
+void SetQuizLadyState_Complete(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->phase = 1;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->state = LILYCOVE_LADY_STATE_COMPLETED;
}
-void sub_818E39C(void)
+void SetQuizLadyState_GivePrize(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->phase = 2;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->state = LILYCOVE_LADY_STATE_PRIZE;
}
-void sub_818E3BC(void)
+void ClearQuizLadyPlayerAnswer(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->unk_016 = -1;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->playerAnswer = -1;
}
-void sub_818E3E0(void)
+void Script_QuizLadyOpenBagMenu(void)
{
- sub_81AAC70();
+ QuizLadyOpenBagMenu();
}
-void sub_818E3EC(void)
+void QuizLadyPickNewQuestion(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (sub_818E298())
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (BufferQuizAuthorNameAndCheckIfLady())
{
- gUnknown_0203CD68->unk_02c = gUnknown_0203CD68->unk_02b;
+ sQuizLadyPtr->prevQuestionId = sQuizLadyPtr->questionId;
}
else
{
- gUnknown_0203CD68->unk_02c = 0x10;
+ sQuizLadyPtr->prevQuestionId = ARRAY_COUNT(sQuizLadyQuizQuestions);
}
- sub_818DF00();
+ QuizLadyPickQuestion();
}
-void sub_818E430(void)
+void ClearQuizLadyQuestionAndAnswer(void)
{
u8 i;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- for (i = 0; i < 9; i ++)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ for (i = 0; i < QUIZ_QUESTION_LEN; i ++)
{
- gUnknown_0203CD68->unk_002[i] = -1;
+ sQuizLadyPtr->question[i] = -1;
}
- gUnknown_0203CD68->unk_014 = -1;
+ sQuizLadyPtr->correctAnswer = -1;
}
-void sub_818E47C(void)
+void QuizLadySetCustomQuestion(void)
{
gSpecialVar_0x8004 = EASY_CHAT_TYPE_QUIZ_SET_QUESTION;
ShowEasyChatScreen();
}
-void sub_818E490(void)
+void QuizLadyTakePrizeForCustomQuiz(void)
{
RemoveBagItem(gSpecialVar_ItemId, 1);
}
-void sub_818E4A4(void)
+void QuizLadyRecordCustomQuizData(void)
{
u8 i;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->itemId = gSpecialVar_ItemId;
- for (i = 0; i < 4; i ++)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->prize = gSpecialVar_ItemId;
+ for (i = 0; i < TRAINER_ID_LENGTH; i ++)
{
- gUnknown_0203CD68->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
+ sQuizLadyPtr->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
}
- StringCopy7(gUnknown_0203CD68->playerName, gSaveBlock2Ptr->playerName);
- gUnknown_0203CD68->language = gGameLanguage;
+ StringCopy7(sQuizLadyPtr->playerName, gSaveBlock2Ptr->playerName);
+ sQuizLadyPtr->language = gGameLanguage;
}
-void sub_818E510(void)
+void QuizLadySetWaitingForChallenger(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->unk_02a = 1;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->waitingForChallenger = TRUE;
}
-void sub_818E538(void)
+void BufferQuizCorrectAnswer(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- CopyEasyChatWord(gStringVar3, gUnknown_0203CD68->unk_014);
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ CopyEasyChatWord(gStringVar3, sQuizLadyPtr->correctAnswer);
}
-void sub_818E564(void)
+
+void FieldCallback_QuizLadyEnableScriptContexts(void)
{
EnableBothScriptContexts();
}
-void sub_818E570(const LilycoveLady *lilycoveLady)
+void QuizLadyClearQuestionForRecordMix(const LilycoveLady *lilycoveLady)
{
u8 i;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (lilycoveLady->quiz.unk_02c < 16 && gUnknown_0203CD68->id == LILYCOVE_LADY_QUIZ)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (lilycoveLady->quiz.prevQuestionId < ARRAY_COUNT(sQuizLadyQuizQuestions)
+ && sQuizLadyPtr->id == LILYCOVE_LADY_QUIZ)
{
for (i = 0; i < 4; i ++)
{
- if (lilycoveLady->quiz.unk_02c != gUnknown_0203CD68->unk_02b)
+ if (lilycoveLady->quiz.prevQuestionId != sQuizLadyPtr->questionId)
{
break;
}
- gUnknown_0203CD68->unk_02b = Random() % 16;
+ sQuizLadyPtr->questionId = Random() % ARRAY_COUNT(sQuizLadyQuizQuestions);
}
- if (lilycoveLady->quiz.unk_02c == gUnknown_0203CD68->unk_02b)
+ if (lilycoveLady->quiz.prevQuestionId == sQuizLadyPtr->questionId)
{
- gUnknown_0203CD68->unk_02b = (gUnknown_0203CD68->unk_02b + 1) % 16;
+ sQuizLadyPtr->questionId = (sQuizLadyPtr->questionId + 1) % (int)(ARRAY_COUNT(sQuizLadyQuizQuestions));
}
- gUnknown_0203CD68->unk_02c = lilycoveLady->quiz.unk_02c;
+ sQuizLadyPtr->prevQuestionId = lilycoveLady->quiz.prevQuestionId;
}
}
-static void sub_818E604(void)
+static void ResetContestLadyContestData(void)
{
- gUnknown_0203CD6C->playerName[0] = EOS;
- gUnknown_0203CD6C->fave_pkblk = 0;
- gUnknown_0203CD6C->other_pkblk = 0;
- gUnknown_0203CD6C->max_sheen = 0;
- gUnknown_0203CD6C->category = Random() % 5;
+ sContestLadyPtr->playerName[0] = EOS;
+ sContestLadyPtr->numGoodPokeblocksGiven = 0;
+ sContestLadyPtr->numOtherPokeblocksGiven = 0;
+ sContestLadyPtr->maxSheen = 0;
+ sContestLadyPtr->category = Random() % CONTEST_CATEGORIES_COUNT;
}
-static void SetLilycoveContestLady(void)
+static void InitLilycoveContestLady(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- gUnknown_0203CD6C->id = LILYCOVE_LADY_CONTEST;
- gUnknown_0203CD6C->phase = 0;
- sub_818E604();
- gUnknown_0203CD6C->language = gGameLanguage;
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ sContestLadyPtr->id = LILYCOVE_LADY_CONTEST;
+ sContestLadyPtr->givenPokeblock = FALSE;
+ ResetContestLadyContestData();
+ sContestLadyPtr->language = gGameLanguage;
}
-static void sub_818E674(void)
+static void ResetContestLadyForRecordMix(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- gUnknown_0203CD6C->id = LILYCOVE_LADY_CONTEST;
- gUnknown_0203CD6C->phase = 0;
- if (gUnknown_0203CD6C->fave_pkblk == 5 || gUnknown_0203CD6C->other_pkblk == 5)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ sContestLadyPtr->id = LILYCOVE_LADY_CONTEST;
+ sContestLadyPtr->givenPokeblock = FALSE;
+ if (sContestLadyPtr->numGoodPokeblocksGiven == LILYCOVE_LADY_GIFT_THRESHOLD
+ || sContestLadyPtr->numOtherPokeblocksGiven == LILYCOVE_LADY_GIFT_THRESHOLD)
{
- sub_818E604();
+ ResetContestLadyContestData();
}
}
-static void sub_818E6B0(u8 sheen)
+static void ContestLadySavePlayerNameIfHighSheen(u8 sheen)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- if (gUnknown_0203CD6C->max_sheen <= sheen)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (sContestLadyPtr->maxSheen <= sheen)
{
- gUnknown_0203CD6C->max_sheen = sheen;
- memset(gUnknown_0203CD6C->playerName, EOS, sizeof(gUnknown_0203CD6C->playerName));
- memcpy(gUnknown_0203CD6C->playerName, gSaveBlock2Ptr->playerName, sizeof(gUnknown_0203CD6C->playerName));
- gUnknown_0203CD6C->language = gGameLanguage;
+ sContestLadyPtr->maxSheen = sheen;
+ memset(sContestLadyPtr->playerName, EOS, sizeof(sContestLadyPtr->playerName));
+ memcpy(sContestLadyPtr->playerName, gSaveBlock2Ptr->playerName, sizeof(sContestLadyPtr->playerName));
+ sContestLadyPtr->language = gGameLanguage;
}
}
bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock)
{
- u8 sheen;
- bool8 response;
+ u8 sheen = 0;
+ bool8 correctFlavor = FALSE;
- sheen = 0;
- response = FALSE;
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- switch (gUnknown_0203CD6C->category)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ switch (sContestLadyPtr->category)
{
- case 0:
+ case CONTEST_CATEGORY_COOL:
if (pokeblock->spicy != 0)
{
sheen = pokeblock->spicy;
- response = TRUE;
+ correctFlavor = TRUE;
}
break;
- case 1:
+ case CONTEST_CATEGORY_BEAUTY:
if (pokeblock->dry != 0)
{
sheen = pokeblock->dry;
- response = TRUE;
+ correctFlavor = TRUE;
}
break;
- case 2:
+ case CONTEST_CATEGORY_CUTE:
if (pokeblock->sweet != 0)
{
sheen = pokeblock->sweet;
- response = TRUE;
+ correctFlavor = TRUE;
}
break;
- case 3:
+ case CONTEST_CATEGORY_SMART:
if (pokeblock->bitter != 0)
{
sheen = pokeblock->bitter;
- response = TRUE;
+ correctFlavor = TRUE;
}
break;
- case 4:
+ case CONTEST_CATEGORY_TOUGH:
if (pokeblock->sour != 0)
{
sheen = pokeblock->sour;
- response = TRUE;
+ correctFlavor = TRUE;
}
break;
}
- if (response == TRUE)
+ if (correctFlavor == TRUE)
{
- sub_818E6B0(sheen);
- gUnknown_0203CD6C->fave_pkblk ++;
+ ContestLadySavePlayerNameIfHighSheen(sheen);
+ sContestLadyPtr->numGoodPokeblocksGiven++;
}
else
{
- gUnknown_0203CD6C->other_pkblk ++;
+ sContestLadyPtr->numOtherPokeblocksGiven++;
}
- return response;
+ return correctFlavor;
}
-static void sub_818E794(u8 *dest1, u8 *dest2)
+static void BufferContestLadyCategoryAndMonName(u8 *dest1, u8 *dest2)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- StringCopy(dest1, gUnknown_0860B324[gUnknown_0203CD6C->category]);
- StringCopy10(dest2, gUnknown_0860B310[gUnknown_0203CD6C->category]);
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ StringCopy(dest1, sContestLadyCategoryNames[sContestLadyPtr->category]);
+ StringCopy10(dest2, sContestLadyMonNames[sContestLadyPtr->category]);
}
-void sub_818E7E0(u8 *dest1, u8 *dest2)
+void BufferContestLadyMonName(u8 *dest1, u8 *dest2)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- *dest1 = gUnknown_0203CD6C->category;
- StringCopy(dest2, gUnknown_0860B310[gUnknown_0203CD6C->category]);
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ *dest1 = sContestLadyPtr->category;
+ StringCopy(dest2, sContestLadyMonNames[sContestLadyPtr->category]);
}
-void sub_818E81C(u8 *dest)
+void BufferContestLadyPlayerName(u8 *dest)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- StringCopy(dest, gUnknown_0203CD6C->playerName);
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ StringCopy(dest, sContestLadyPtr->playerName);
}
-void sub_818E848(u8 *dest)
+void BufferContestLadyLanguage(u8 *dest)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- *dest = gUnknown_0203CD6C->language;
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ *dest = sContestLadyPtr->language;
}
-void sub_818E868(u8 *dest, u8 category)
+void BufferContestName(u8 *dest, u8 category)
{
- StringCopy(dest, gUnknown_0860B338[category]);
+ StringCopy(dest, sContestNames[category]);
}
+// used in tv.c to determine sTVShowState for Contest Lady show
+// if return val is 1, sTVShowState is 1
+// if return val is 2, sTVShowState is 3
+// if return val is 0, sTVShowState is 2
u8 sub_818E880(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- if (gUnknown_0203CD6C->fave_pkblk >= 5)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (sContestLadyPtr->numGoodPokeblocksGiven >= LILYCOVE_LADY_GIFT_THRESHOLD)
{
return 1;
}
- else if (gUnknown_0203CD6C->fave_pkblk == 0)
+ else if (sContestLadyPtr->numGoodPokeblocksGiven == 0)
{
return 2;
}
@@ -973,53 +783,54 @@ u8 sub_818E880(void)
}
}
-bool8 sub_818E8B4(void)
+
+bool8 HasPlayerGivenContestLadyPokeblock(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- if (gUnknown_0203CD6C->phase == 1)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (sContestLadyPtr->givenPokeblock == TRUE)
{
return TRUE;
}
return FALSE;
}
-bool8 sub_818E8E0(void)
+bool8 ShouldContestLadyShowGoOnAir(void)
{
- bool8 response;
+ bool8 putOnAir = FALSE;
- response = FALSE;
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- if (gUnknown_0203CD6C->fave_pkblk >= 5 || gUnknown_0203CD6C->other_pkblk >= 5)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (sContestLadyPtr->numGoodPokeblocksGiven >= LILYCOVE_LADY_GIFT_THRESHOLD
+ || sContestLadyPtr->numOtherPokeblocksGiven >= LILYCOVE_LADY_GIFT_THRESHOLD)
{
- response = TRUE;
+ putOnAir = TRUE;
}
- return response;
+ return putOnAir;
}
-void sub_818E914(void)
+void Script_BufferContestLadyCategoryAndMonName(void)
{
- sub_818E794(gStringVar2, gStringVar1);
+ BufferContestLadyCategoryAndMonName(gStringVar2, gStringVar1);
}
-void sub_818E92C(void)
+void OpenPokeblockCaseForContestLady(void)
{
OpenPokeblockCase(3, CB2_ReturnToField);
}
-void sub_818E940(void)
+void SetContestLadyGivenPokeblock(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- gUnknown_0203CD6C->phase = 1;
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ sContestLadyPtr->givenPokeblock = TRUE;
}
-void sub_818E960(void)
+void GetContestLadyMonSpecies(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- gSpecialVar_0x8005 = sUnknown_0860B34C[gUnknown_0203CD6C->category];
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ gSpecialVar_0x8005 = sContestLadyMonSpecies[sContestLadyPtr->category];
}
-u8 sub_818E990(void)
+u8 GetContestLadyCategory(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- return gUnknown_0203CD6C->category;
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ return sContestLadyPtr->category;
}
diff --git a/asm/m4a_1.s b/src/m4a_1.s
index cab4ed174..cab4ed174 100644
--- a/asm/m4a_1.s
+++ b/src/m4a_1.s
diff --git a/src/new_game.c b/src/new_game.c
index ee67da9be..b4d9ba9b3 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -198,7 +198,7 @@ void NewGameInitData(void)
ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags);
ResetMiniGamesResults();
copy_strings_to_sav1();
- SetLilycoveLady();
+ InitLilycoveLady();
ResetAllApprenticeData();
ClearRankingHallRecords();
InitMatchCallCounters();
diff --git a/src/party_menu.c b/src/party_menu.c
index dd0a4dabd..f4b749bde 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -3650,7 +3650,7 @@ static u8 sub_81B31B0(u8 a)
for (i = 0; i < gUnknown_0203CEC4->listSize; i++)
{
- u8 unk = (gUnknown_0203CEC4->actions[i] > 18) ? 4 : 3;
+ u8 unk = (gUnknown_0203CEC4->actions[i] >= MENU_FIELD_MOVES) ? 4 : 3;
AddTextPrinterParameterized4(gUnknown_0203CEC4->windowId[0], 1, cursorDimension, (i * 16) + 1, fontAttribute, 0, sFontColorTable[unk], 0, sCursorOptions[gUnknown_0203CEC4->actions[i]].text);
}
diff --git a/src/pokedex.c b/src/pokedex.c
index 0e532ed92..c1787ef6a 100644
--- a/src/pokedex.c
+++ b/src/pokedex.c
@@ -4249,12 +4249,12 @@ u16 GetPokedexHeightWeight(u16 dexNum, u8 data)
{
switch (data)
{
- case 0: // height
- return gPokedexEntries[dexNum].height;
- case 1: // weight
- return gPokedexEntries[dexNum].weight;
- default:
- return 1;
+ case 0: // height
+ return gPokedexEntries[dexNum].height;
+ case 1: // weight
+ return gPokedexEntries[dexNum].weight;
+ default:
+ return 1;
}
}
@@ -4360,23 +4360,23 @@ u16 GetHoennPokedexCount(u8 caseID)
return count;
}
-u16 sub_80C089C(u8 caseID)
+u16 GetKantoPokedexCount(u8 caseID)
{
u16 count = 0;
u16 i;
- for (i = 0; i < 151; i++)
+ for (i = 0; i < KANTO_DEX_COUNT; i++)
{
switch (caseID)
{
- case FLAG_GET_SEEN:
- if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN))
- count++;
- break;
- case FLAG_GET_CAUGHT:
- if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
- count++;
- break;
+ case FLAG_GET_SEEN:
+ if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN))
+ count++;
+ break;
+ case FLAG_GET_CAUGHT:
+ if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
+ count++;
+ break;
}
}
return count;
@@ -4386,7 +4386,7 @@ bool16 HasAllHoennMons(void)
{
u16 i;
- for (i = 0; i < 200; i++)
+ for (i = 0; i < HOENN_DEX_COUNT - 2; i++)
{
if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT))
return FALSE;
@@ -4394,11 +4394,11 @@ bool16 HasAllHoennMons(void)
return TRUE;
}
-bool8 sub_80C0918(void)
+bool8 HasAllKantoMons(void)
{
u16 i;
- for (i = 0; i < 150; i++)
+ for (i = 0; i < KANTO_DEX_COUNT - 1; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
return FALSE;
@@ -4406,26 +4406,26 @@ bool8 sub_80C0918(void)
return TRUE;
}
-u16 sub_80C0944(void)
+bool16 HasAllMons(void)
{
u16 i;
- for (i = 0; i < 150; i++)
+ for (i = 0; i < NATIONAL_DEX_MEWTWO; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
- return 0;
+ return FALSE;
}
- for (i = 151; i < 248; i++)
+ for (i = NATIONAL_DEX_MEW; i < NATIONAL_DEX_TYRANITAR; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
- return 0;
+ return FALSE;
}
- for (i = 251; i < 384; i++)
+ for (i = NATIONAL_DEX_CELEBI; i < NATIONAL_DEX_RAYQUAZA; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
- return 0;
+ return FALSE;
}
- return 1;
+ return TRUE;
}
void sub_80C09B0(u16 a)
diff --git a/src/pokemon.c b/src/pokemon.c
index cb7be1715..f5e79243e 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -2341,7 +2341,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI
u16 evAmount;
u8 evsBits;
- CreateMon(mon, species, level, fixedIV, 0, 0, 0, 0);
+ CreateMon(mon, species, level, fixedIV, 0, 0, OT_ID_PLAYER_ID, 0);
evsBits = evSpread;
@@ -2373,7 +2373,7 @@ void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src)
u8 language;
u8 value;
- CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId);
+ CreateMon(mon, src->species, src->level, 0, 1, src->personality, OT_ID_PRESET, src->otId);
for (i = 0; i < MAX_MON_MOVES; i++)
SetMonMoveSlot(mon, src->moves[i], i);
@@ -2435,7 +2435,7 @@ void CreateBattleTowerMon2(struct Pokemon *mon, struct BattleTowerPokemon *src,
else
level = src->level;
- CreateMon(mon, src->species, level, 0, 1, src->personality, 1, src->otId);
+ CreateMon(mon, src->species, level, 0, 1, src->personality, OT_ID_PRESET, src->otId);
for (i = 0; i < MAX_MON_MOVES; i++)
SetMonMoveSlot(mon, src->moves[i], i);
@@ -2497,7 +2497,7 @@ void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 m
0x1F,
TRUE,
personality,
- TRUE,
+ OT_ID_PRESET,
otId);
SetMonData(mon, MON_DATA_HELD_ITEM, &src->party[monId].item);
@@ -2527,7 +2527,7 @@ void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level,
i = Random32();
} while (nature != GetNatureFromPersonality(i));
- CreateMon(mon, species, level, fixedIV, TRUE, i, TRUE, otId);
+ CreateMon(mon, species, level, fixedIV, TRUE, i, OT_ID_PRESET, otId);
evsBits = evSpread;
for (i = 0; i < NUM_STATS; i++)
{
@@ -4424,7 +4424,7 @@ u8 GetMonsStateToDoubles_2(void)
return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON;
}
-u8 GetAbilityBySpecies(u16 species, bool8 abilityNum)
+u8 GetAbilityBySpecies(u16 species, u8 abilityNum)
{
if (abilityNum)
gLastUsedAbility = gBaseStats[species].abilities[1];
@@ -4458,7 +4458,7 @@ void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord)
15,
1,
gBattleResources->secretBase->party.personality[i],
- 2,
+ OT_ID_RANDOM_NO_SHINY,
0);
SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->party.heldItems[i]);
diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c
index 59ec8f4f1..4cd1a4772 100644
--- a/src/pokemon_storage_system.c
+++ b/src/pokemon_storage_system.c
@@ -464,9 +464,6 @@ EWRAM_DATA static u8 sMovingMonOrigBoxPos = 0;
EWRAM_DATA static bool8 sCanOnlyMove = 0;
// This file's functions.
-#if !defined(NONMATCHING) && MODERN
-#define static
-#endif
static void CreatePCMenu(u8 whichMenu, s16 *windowIdPtr);
static void Cb2_EnterPSS(u8 boxOption);
static u8 GetCurrentBoxOption(void);
diff --git a/src/pokenav_match_call_data.c b/src/pokenav_match_call_data.c
index d2d89babf..5379ee88e 100644
--- a/src/pokenav_match_call_data.c
+++ b/src/pokenav_match_call_data.c
@@ -6,7 +6,9 @@
#include "battle.h"
#include "gym_leader_rematch.h"
#include "match_call.h"
+#include "pokenav.h"
#include "constants/region_map_sections.h"
+#include "constants/trainers.h"
// Static type declarations
@@ -94,11 +96,11 @@ typedef union {
const struct MatchCallStruct5 *type5;
} match_call_t;
-struct UnkStruct_08625388 {
+struct MatchCallOverride {
u16 idx;
- u16 v2;
- u32 v4;
- const u8 *v8[4];
+ u16 facilityClass;
+ u32 flag;
+ const u8 *flavorTexts[4];
};
// Static RAM declarations
@@ -123,11 +125,11 @@ static bool32 MatchCall_IsRematchable_Type2(match_call_t);
static bool32 MatchCall_IsRematchable_Type3(match_call_t);
static bool32 MatchCall_IsRematchable_Type4(match_call_t);
-static bool32 sub_81D1840(match_call_t);
-static bool32 sub_81D1844(match_call_t);
-static bool32 sub_81D1848(match_call_t);
-static bool32 sub_81D184C(match_call_t);
-static bool32 sub_81D1850(match_call_t);
+static bool32 MatchCall_HasCheckPage_Type0(match_call_t);
+static bool32 MatchCall_HasCheckPage_Type1(match_call_t);
+static bool32 MatchCall_HasCheckPage_Type2(match_call_t);
+static bool32 MatchCall_HasCheckPage_Type3(match_call_t);
+static bool32 MatchCall_HasCheckPage_Type4(match_call_t);
static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t);
static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t);
@@ -423,10 +425,10 @@ static const match_call_text_data_t sMayTextScripts[] = {
{ NULL, 0xFFFF, 0xFFFF }
};
-static const struct MatchCallStruct4 sBrendanMatchCallHeader =
+static const struct MatchCallStruct4 sMayMatchCallHeader =
{
.type = 4,
- .gender = MALE,
+ .gender = MALE, //Gender of player
.flag = FLAG_ENABLE_RIVAL_MATCH_CALL,
.desc = gMayBrendanMatchCallDesc,
.name = gExpandedPlaceholder_May,
@@ -452,10 +454,10 @@ static const match_call_text_data_t sBrendanTextScripts[] = {
{ NULL, 0xFFFF, 0xFFFF }
};
-static const struct MatchCallStruct4 sMayMatchCallHeader =
+static const struct MatchCallStruct4 sBrendanMatchCallHeader =
{
.type = 4,
- .gender = FEMALE,
+ .gender = FEMALE, //Gender of player
.flag = FLAG_ENABLE_RIVAL_MATCH_CALL,
.desc = gMayBrendanMatchCallDesc,
.name = gExpandedPlaceholder_Brendan,
@@ -727,27 +729,27 @@ static const struct MatchCallStruct5 sWallaceMatchCallHeader =
};
static const match_call_t sMatchCallHeaders[] = {
- {.type0 = &sMrStoneMatchCallHeader},
- {.type3 = &sProfBirchMatchCallHeader},
- {.type4 = &sMayMatchCallHeader},
- {.type4 = &sBrendanMatchCallHeader},
- {.type2 = &sWallyMatchCallHeader},
- {.type5 = &sNormanMatchCallHeader},
- {.type0 = &sMomMatchCallHeader},
- {.type0 = &sStevenMatchCallHeader},
- {.type0 = &sScottMatchCallHeader},
- {.type5 = &sRoxanneMatchCallHeader},
- {.type5 = &sBrawlyMatchCallHeader},
- {.type5 = &sWattsonMatchCallHeader},
- {.type5 = &sFlanneryMatchCallHeader},
- {.type5 = &sWinonaMatchCallHeader},
- {.type5 = &sTateLizaMatchCallHeader},
- {.type5 = &sJuanMatchCallHeader},
- {.type5 = &sSidneyMatchCallHeader},
- {.type5 = &sPhoebeMatchCallHeader},
- {.type5 = &sGlaciaMatchCallHeader},
- {.type5 = &sDrakeMatchCallHeader},
- {.type5 = &sWallaceMatchCallHeader}
+ [MC_HEADER_MR_STONE] = {.type0 = &sMrStoneMatchCallHeader},
+ [MC_HEADER_PROF_BIRCH] = {.type3 = &sProfBirchMatchCallHeader},
+ [MC_HEADER_BRENDAN] = {.type4 = &sBrendanMatchCallHeader},
+ [MC_HEADER_MAY] = {.type4 = &sMayMatchCallHeader},
+ [MC_HEADER_WALLY] = {.type2 = &sWallyMatchCallHeader},
+ [MC_HEADER_NORMAN] = {.type5 = &sNormanMatchCallHeader},
+ [MC_HEADER_MOM] = {.type0 = &sMomMatchCallHeader},
+ [MC_HEADER_STEVEN] = {.type0 = &sStevenMatchCallHeader},
+ [MC_HEADER_SCOTT] = {.type0 = &sScottMatchCallHeader},
+ [MC_HEADER_ROXANNE] = {.type5 = &sRoxanneMatchCallHeader},
+ [MC_HEADER_BRAWLY] = {.type5 = &sBrawlyMatchCallHeader},
+ [MC_HEADER_WATTSON] = {.type5 = &sWattsonMatchCallHeader},
+ [MC_HEADER_FLANNERY] = {.type5 = &sFlanneryMatchCallHeader},
+ [MC_HEADER_WINONA] = {.type5 = &sWinonaMatchCallHeader},
+ [MC_HEADER_TATE_LIZA] = {.type5 = &sTateLizaMatchCallHeader},
+ [MC_HEADER_JUAN] = {.type5 = &sJuanMatchCallHeader},
+ [MC_HEADER_SIDNEY] = {.type5 = &sSidneyMatchCallHeader},
+ [MC_HEADER_PHOEBE] = {.type5 = &sPhoebeMatchCallHeader},
+ [MC_HEADER_GLACIA] = {.type5 = &sGlaciaMatchCallHeader},
+ [MC_HEADER_DRAKE] = {.type5 = &sDrakeMatchCallHeader},
+ [MC_HEADER_WALLACE] = {.type5 = &sWallaceMatchCallHeader}
};
static bool32 (*const sMatchCallGetFlagFuncs[])(match_call_t) = {
@@ -774,12 +776,12 @@ static bool32 (*const sMatchCall_IsRematchableFunctions[])(match_call_t) = {
MatchCall_IsRematchable_Type3
};
-static bool32 (*const gUnknown_08625338[])(match_call_t) = {
- sub_81D1840,
- sub_81D1844,
- sub_81D1848,
- sub_81D184C,
- sub_81D1850
+static bool32 (*const sMatchCall_HasCheckPageFunctions[])(match_call_t) = {
+ MatchCall_HasCheckPage_Type0,
+ MatchCall_HasCheckPage_Type1,
+ MatchCall_HasCheckPage_Type2,
+ MatchCall_HasCheckPage_Type4,
+ MatchCall_HasCheckPage_Type3
};
static u32 (*const sMatchCall_GetRematchTableIdxFunctions[])(match_call_t) = {
@@ -806,11 +808,11 @@ static void (*const sMatchCall_GetNameAndDescFunctions[])(match_call_t, const u8
MatchCall_GetNameAndDesc_Type3
};
-static const struct UnkStruct_08625388 sMatchCallCheckPageOverrides[] = {
- { 7, 0x4B, 0xffff, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle } }, // STEVEN
- { 7, 0x4B, FLAG_DEFEATED_MOSSDEEP_GYM, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle } }, // STEVEN
- { 2, 0x3c, 0xffff, { gMatchCall_BrendanStrategyText, gMatchCall_BrendanTrainersPokemonText, gMatchCall_BrendanSelfIntroductionText_Line1, gMatchCall_BrendanSelfIntroductionText_Line2 } }, // Brendan
- { 3, 0x3f, 0xffff, { gMatchCall_MayStrategyText, gMatchCall_MayTrainersPokemonText, gMatchCall_MaySelfIntroductionText_Line1, gMatchCall_MaySelfIntroductionText_Line2 } } // May
+static const struct MatchCallOverride sMatchCallCheckPageOverrides[] = {
+ { MC_HEADER_STEVEN, FACILITY_CLASS_STEVEN, 0xFFFF, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle } }, // STEVEN
+ { MC_HEADER_STEVEN, FACILITY_CLASS_STEVEN, FLAG_DEFEATED_MOSSDEEP_GYM, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle } }, // STEVEN
+ { MC_HEADER_BRENDAN, FACILITY_CLASS_BRENDAN, 0xFFFF, { gMatchCall_BrendanStrategyText, gMatchCall_BrendanTrainersPokemonText, gMatchCall_BrendanSelfIntroductionText_Line1, gMatchCall_BrendanSelfIntroductionText_Line2 } }, // Brendan
+ { MC_HEADER_MAY, FACILITY_CLASS_MAY, 0xFFFF, { gMatchCall_MayStrategyText, gMatchCall_MayTrainersPokemonText, gMatchCall_MaySelfIntroductionText_Line1, gMatchCall_MaySelfIntroductionText_Line2 } } // May
};
// .text
@@ -981,7 +983,7 @@ static bool32 MatchCall_IsRematchable_Type3(match_call_t matchCall)
return FALSE;
}
-bool32 sub_81D17E8(u32 idx)
+bool32 MatchCall_HasCheckPage(u32 idx)
{
match_call_t matchCall;
u32 i;
@@ -990,7 +992,7 @@ bool32 sub_81D17E8(u32 idx)
return FALSE;
matchCall = sMatchCallHeaders[idx];
i = MatchCallGetFunctionIndex(matchCall);
- if (gUnknown_08625338[i](matchCall))
+ if (sMatchCall_HasCheckPageFunctions[i](matchCall))
return TRUE;
for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++)
{
@@ -1000,27 +1002,27 @@ bool32 sub_81D17E8(u32 idx)
return FALSE;
}
-static bool32 sub_81D1840(match_call_t matchCall)
+static bool32 MatchCall_HasCheckPage_Type0(match_call_t matchCall)
{
return FALSE;
}
-static bool32 sub_81D1844(match_call_t matchCall)
+static bool32 MatchCall_HasCheckPage_Type1(match_call_t matchCall)
{
return TRUE;
}
-static bool32 sub_81D1848(match_call_t matchCall)
+static bool32 MatchCall_HasCheckPage_Type2(match_call_t matchCall)
{
return TRUE;
}
-static bool32 sub_81D184C(match_call_t matchCall)
+static bool32 MatchCall_HasCheckPage_Type4(match_call_t matchCall)
{
return FALSE;
}
-static bool32 sub_81D1850(match_call_t matchCall)
+static bool32 MatchCall_HasCheckPage_Type3(match_call_t matchCall)
{
return FALSE;
}
@@ -1210,7 +1212,7 @@ static void MatchCall_GetNameAndDescByRematchIdx(u32 idx, const u8 **desc, const
*name = trainer->trainerName;
}
-const u8 *sub_81D1B40(u32 idx, u32 offset)
+const u8 *MatchCall_GetOverrideFlavorText(u32 idx, u32 offset)
{
u32 i;
@@ -1224,24 +1226,24 @@ const u8 *sub_81D1B40(u32 idx, u32 offset)
break;
if (sMatchCallCheckPageOverrides[i + 1].idx != idx)
break;
- if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].v4))
+ if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].flag))
break;
i++;
}
- return sMatchCallCheckPageOverrides[i].v8[offset];
+ return sMatchCallCheckPageOverrides[i].flavorTexts[offset];
}
}
return NULL;
}
-int sub_81D1BD0(u32 idx)
+int MatchCall_GetOverrideFacilityClass(u32 idx)
{
u32 i;
for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++)
{
if (sMatchCallCheckPageOverrides[i].idx == idx)
- return sMatchCallCheckPageOverrides[i].v2;
+ return sMatchCallCheckPageOverrides[i].facilityClass;
}
return -1;
}
diff --git a/src/pokenav_unk_3.c b/src/pokenav_unk_3.c
index ffb1e0a4a..c66434192 100755
--- a/src/pokenav_unk_3.c
+++ b/src/pokenav_unk_3.c
@@ -84,7 +84,7 @@ static u32 sub_81CAB44(struct Pokenav3Struct *state)
state->callback = sub_81CAC04;
state->unk0 = 0;
selectedMatchCall = GetSelectedMatchCall();
- if (!state->unk1C[selectedMatchCall].boxId || sub_81D17E8(state->unk1C[selectedMatchCall].unk6))
+ if (!state->unk1C[selectedMatchCall].boxId || MatchCall_HasCheckPage(state->unk1C[selectedMatchCall].unk6))
{
state->unk4 = gUnknown_0862250A;
state->unk2 = 2;
@@ -212,7 +212,7 @@ static u32 sub_81CAD20(s32 taskState)
state->unkA++;
}
- if (++state->unk8 >= 21) // TODO: This is the size of sMatchCallHeaders
+ if (++state->unk8 >= MC_HEADER_COUNT)
{
state->unkC = state->unk8;
state->unk8 = 0;
@@ -331,7 +331,7 @@ int sub_81CAF04(int index)
return gTrainers[index].trainerPic;
}
- index = sub_81D1BD0(var0);
+ index = MatchCall_GetOverrideFacilityClass(var0);
return gFacilityClassToPicIndex[index];
}
@@ -358,7 +358,7 @@ const u8 *sub_81CAFD8(int index, int textType)
{
var0 = MatchCall_GetRematchTableIdx(state->unk1C[index].unk6);
if (var0 == REMATCH_TABLE_ENTRIES)
- return sub_81D1B40(state->unk1C[index].unk6, textType);
+ return MatchCall_GetOverrideFlavorText(state->unk1C[index].unk6, textType);
}
else
{
@@ -426,7 +426,7 @@ int sub_81CB0E4(int index)
{
if (!state->unk1C[index].boxId)
return count;
- if (sub_81D17E8(state->unk1C[index].unk6))
+ if (MatchCall_HasCheckPage(state->unk1C[index].unk6))
return count;
count++;
@@ -443,7 +443,7 @@ int sub_81CB128(int index)
{
if (!state->unk1C[index].boxId)
return count;
- if (sub_81D17E8(state->unk1C[index].unk6))
+ if (MatchCall_HasCheckPage(state->unk1C[index].unk6))
return count;
count--;
@@ -462,7 +462,7 @@ bool32 unref_sub_81CB16C(void)
return TRUE;
}
- for (i = 0; i < 21; i++) // TODO: This is the size of sMatchCallHeaders
+ for (i = 0; i < MC_HEADER_COUNT; i++)
{
if (MatchCallFlagGetByIndex(i))
{
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 6cb145c80..32e0404b9 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -701,10 +701,10 @@ static void ReceiveLilycoveLadyData(LilycoveLady *lilycoveLady, size_t recordSiz
}
memcpy(sLilycoveLadySave, (void *)lilycoveLady + recordSize * mixIndices[which], sizeof(LilycoveLady));
- sub_818DA78();
+ ResetLilycoveLadyForRecordMix();
if (dest != NULL)
{
- sub_818E570(dest);
+ QuizLadyClearQuestionForRecordMix(dest);
free(dest);
}
}
diff --git a/src/roamer.c b/src/roamer.c
index be45642e0..8a67234e3 100644
--- a/src/roamer.c
+++ b/src/roamer.c
@@ -67,7 +67,7 @@ static void CreateInitialRoamerMon(bool16 createLatios)
else
(&gSaveBlock1Ptr->roamer)->species = SPECIES_LATIOS;
- CreateMon(&gEnemyParty[0], (&gSaveBlock1Ptr->roamer)->species, 40, 0x20, 0, 0, 0, 0);
+ CreateMon(&gEnemyParty[0], (&gSaveBlock1Ptr->roamer)->species, 40, 0x20, 0, 0, OT_ID_PLAYER_ID, 0);
(&gSaveBlock1Ptr->roamer)->level = 40;
(&gSaveBlock1Ptr->roamer)->status = 0;
(&gSaveBlock1Ptr->roamer)->active = TRUE;
diff --git a/src/rock.c b/src/rock.c
index f05816362..6f6e20955 100644
--- a/src/rock.c
+++ b/src/rock.c
@@ -508,7 +508,7 @@ void AnimDirtParticleAcrossScreen(struct Sprite *sprite)
sprite->pos1.x = 304;
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
sprite->data[5] = 1;
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
}
else
{
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 57cd3edbe..0326a56a4 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -62,7 +62,7 @@ static EWRAM_DATA u16 sMovingNpcMapBank = 0;
static EWRAM_DATA u16 sMovingNpcMapId = 0;
static EWRAM_DATA u16 sFieldEffectScriptId = 0;
-static u8 gUnknown_03000F30;
+static u8 gBrailleWindowId;
extern const SpecialFunc gSpecials[];
extern const u8 *gStdScripts[];
@@ -466,6 +466,9 @@ bool8 ScrCmd_addvar(struct ScriptContext *ctx)
{
u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
*ptr += ScriptReadHalfword(ctx);
+ // Note: addvar doesn't support adding from a variable in vanilla. If you were to
+ // add a VarGet() to the above, make sure you change the `addvar VAR_0x8006, 65535`
+ // in the contest scripts to `subvar VAR_0x8006, 1`, else contests will break.
return FALSE;
}
@@ -1102,7 +1105,7 @@ bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext *ctx)
+bool8 ScrCmd_copyobjectxytoperm(struct ScriptContext *ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
@@ -1515,13 +1518,13 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
yText = (yText - yWindow - 1) * 8;
winTemplate = CreateWindowTemplate(0, xWindow, yWindow + 1, width, height, 0xF, 0x1);
- gUnknown_03000F30 = AddWindow(&winTemplate);
- LoadUserWindowBorderGfx(gUnknown_03000F30, 0x214, 0xE0);
- DrawStdWindowFrame(gUnknown_03000F30, 0);
- PutWindowTilemap(gUnknown_03000F30);
- FillWindowPixelBuffer(gUnknown_03000F30, PIXEL_FILL(1));
- AddTextPrinterParameterized(gUnknown_03000F30, 6, gStringVar4, xText, yText, 0xFF, 0x0);
- CopyWindowToVram(gUnknown_03000F30, 3);
+ gBrailleWindowId = AddWindow(&winTemplate);
+ LoadUserWindowBorderGfx(gBrailleWindowId, 0x214, 0xE0);
+ DrawStdWindowFrame(gBrailleWindowId, 0);
+ PutWindowTilemap(gBrailleWindowId);
+ FillWindowPixelBuffer(gBrailleWindowId, PIXEL_FILL(1));
+ AddTextPrinterParameterized(gBrailleWindowId, 6, gStringVar4, xText, yText, 0xFF, 0x0);
+ CopyWindowToVram(gBrailleWindowId, 3);
return FALSE;
}
@@ -1630,7 +1633,7 @@ bool8 ScrCmd_buffercontesttype(struct ScriptContext *ctx)
u8 stringVarIndex = ScriptReadByte(ctx);
u16 index = VarGet(ScriptReadHalfword(ctx));
- sub_818E868(sScriptStringVars[stringVarIndex], index);
+ BufferContestName(sScriptStringVars[stringVarIndex], index);
return FALSE;
}
@@ -2254,8 +2257,8 @@ bool8 ScrCmd_setmonmetlocation(struct ScriptContext *ctx)
void sub_809BDB4(void)
{
- ClearStdWindowAndFrame(gUnknown_03000F30, 1);
- RemoveWindow(gUnknown_03000F30);
+ ClearStdWindowAndFrame(gBrailleWindowId, 1);
+ RemoveWindow(gBrailleWindowId);
}
bool8 ScrCmd_buffertrainerclassname(struct ScriptContext *ctx)
diff --git a/src/script_menu.c b/src/script_menu.c
index b17d3df38..b0e0ec920 100644
--- a/src/script_menu.c
+++ b/src/script_menu.c
@@ -41,11 +41,11 @@ const struct MenuAction MultichoiceList_003[] =
const struct MenuAction MultichoiceList_004[] =
{
- {gUnknown_085EADA4, NULL},
- {gUnknown_085EADB5, NULL},
- {gUnknown_085EADC4, NULL},
- {gUnknown_085EADD5, NULL},
- {gUnknown_085EADE7, NULL},
+ {gText_CoolnessContest, NULL},
+ {gText_BeautyContest, NULL},
+ {gText_CutenessContest, NULL},
+ {gText_SmartnessContest, NULL},
+ {gText_ToughnessContest, NULL},
{gText_Exit, NULL},
};
diff --git a/src/script_pokemon_util_80F87D8.c b/src/script_pokemon_util_80F87D8.c
index 2c7a9c775..51bd73b1c 100755
--- a/src/script_pokemon_util_80F87D8.c
+++ b/src/script_pokemon_util_80F87D8.c
@@ -551,7 +551,7 @@ u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 u
u8 heldItem[2];
struct Pokemon mon;
- CreateMon(&mon, species, level, 32, 0, 0, 0, 0);
+ CreateMon(&mon, species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0);
heldItem[0] = item;
heldItem[1] = item >> 8;
SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem);
@@ -624,7 +624,7 @@ void CreateScriptedWildMon(u16 species, u8 level, u16 item)
u8 heldItem[2];
ZeroEnemyPartyMons();
- CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0);
+ CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, OT_ID_PLAYER_ID, 0);
if (item)
{
heldItem[0] = item;
diff --git a/src/strings.c b/src/strings.c
index 8463cfacb..ebc995f13 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -610,11 +610,11 @@ const u8 gUnknown_085EAD72[] = _("What's a CONTEST?");
const u8 gUnknown_085EAD84[] = _("Types of CONTESTS");
const u8 gUnknown_085EAD96[] = _("Ranks");
const u8 gUnknown_085EAD9C[] = _("Judging");
-const u8 gUnknown_085EADA4[] = _("COOLNESS CONTEST");
-const u8 gUnknown_085EADB5[] = _("BEAUTY CONTEST");
-const u8 gUnknown_085EADC4[] = _("CUTENESS CONTEST");
-const u8 gUnknown_085EADD5[] = _("SMARTNESS CONTEST");
-const u8 gUnknown_085EADE7[] = _("TOUGHNESS CONTEST");
+const u8 gText_CoolnessContest[] = _("COOLNESS CONTEST");
+const u8 gText_BeautyContest[] = _("BEAUTY CONTEST");
+const u8 gText_CutenessContest[] = _("CUTENESS CONTEST");
+const u8 gText_SmartnessContest[] = _("SMARTNESS CONTEST");
+const u8 gText_ToughnessContest[] = _("TOUGHNESS CONTEST");
const u8 gUnknown_085EADF9[] = _("DECORATION");
const u8 gUnknown_085EAE04[] = _("PACK UP");
const u8 gUnknown_085EAE0C[] = _("COUNT");
@@ -1591,23 +1591,23 @@ const u8 gText_PkmnsNickname[] = _("{STR_VAR_1}'s nickname?");
const u8 gText_TellHimTheWords[] = _("Tell him the words.");
const u8 gText_MoveOkBack[] = _("{DPAD_NONE}MOVE {A_BUTTON}OK {B_BUTTON}BACK");
const u8 gText_CallCantBeMadeHere[] = _("A call can't be made from here.");
-const u8 gUnknown_085EEB2B[] = _("HANDSOME");
-const u8 gUnknown_085EEB34[] = _("VINNY");
-const u8 gUnknown_085EEB3A[] = _("MOREME");
-const u8 gUnknown_085EEB41[] = _("IRONHARD");
-const u8 gUnknown_085EEB4A[] = _("MUSCLE");
-const u8 gUnknown_085EEB51[] = _("coolness");
-const u8 gUnknown_085EEB5A[] = _("beauty");
-const u8 gUnknown_085EEB61[] = _("cuteness");
-const u8 gUnknown_085EEB6A[] = _("smartness");
-const u8 gUnknown_085EEB74[] = _("toughness");
-const u8 gText_Lady2[] = _("Lady");
-const u8 gUnknown_085EEB83[] = _("slippery");
-const u8 gUnknown_085EEB8C[] = _("roundish");
-const u8 gUnknown_085EEB95[] = _("wham-ish");
-const u8 gUnknown_085EEB9E[] = _("shiny");
-const u8 gUnknown_085EEBA4[] = _("sticky");
-const u8 gUnknown_085EEBAB[] = _("pointy");
+const u8 gText_ContestLady_Handsome[] = _("HANDSOME");
+const u8 gText_ContestLady_Vinny[] = _("VINNY");
+const u8 gText_ContestLady_Moreme[] = _("MOREME");
+const u8 gText_ContestLady_Ironhard[] = _("IRONHARD");
+const u8 gText_ContestLady_Muscle[] = _("MUSCLE");
+const u8 gText_ContestLady_Coolness[] = _("coolness");
+const u8 gText_ContestLady_Beauty[] = _("beauty");
+const u8 gText_ContestLady_Cuteness[] = _("cuteness");
+const u8 gText_ContestLady_Smartness[] = _("smartness");
+const u8 gText_ContestLady_Toughness[] = _("toughness");
+const u8 gText_QuizLady_Lady[] = _("Lady");
+const u8 gText_FavorLady_Slippery[] = _("slippery");
+const u8 gText_FavorLady_Roundish[] = _("roundish");
+const u8 gText_FavorLady_Whamish[] = _("wham-ish");
+const u8 gText_FavorLady_Shiny[] = _("shiny");
+const u8 gText_FavorLady_Sticky[] = _("sticky");
+const u8 gText_FavorLady_Pointy[] = _("pointy");
const u8 gText_RentalPkmn2[] = _("RENTAL POKéMON");
const u8 gText_SelectFirstPkmn[] = _("Select the first POKéMON.");
const u8 gText_SelectSecondPkmn[] = _("Select the second POKéMON.");
diff --git a/src/trade.c b/src/trade.c
index 94accc43c..d95e4ebf5 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -1551,7 +1551,7 @@ static void sub_80773D0(void)
for (i = 0; i < PARTY_SIZE; i++)
{
- CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, 0x20, FALSE, 0, 0, 0);
+ CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0);
}
sub_807A19C(0);
@@ -5832,7 +5832,7 @@ static void _CreateInGameTradePokemon(u8 whichPlayerMon, u8 whichInGameTrade)
u8 isMail;
struct Pokemon *pokemon = &gEnemyParty[0];
- CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId);
+ CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, OT_ID_PRESET, inGameTrade->otId);
SetMonData(pokemon, MON_DATA_HP_IV, &inGameTrade->ivs[0]);
SetMonData(pokemon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]);
diff --git a/src/tv.c b/src/tv.c
index b4c8463fd..ef826a4af 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -1657,12 +1657,12 @@ void PutLilycoveContestLadyShowOnTheAir(void)
if (gSpecialVar_Result != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
- sub_818E848(&show->contestLiveUpdates2.language);
+ BufferContestLadyLanguage(&show->contestLiveUpdates2.language);
show->contestLiveUpdates2.pokemonNameLanguage = LANGUAGE_ENGLISH;
show->contestLiveUpdates2.kind = TVSHOW_CONTEST_LIVE_UPDATES_2;
show->contestLiveUpdates2.active = TRUE;
- sub_818E81C(show->contestLiveUpdates2.playerName);
- sub_818E7E0(&show->contestLiveUpdates2.contestCategory, show->contestLiveUpdates2.nickname);
+ BufferContestLadyPlayerName(show->contestLiveUpdates2.playerName);
+ BufferContestLadyMonName(&show->contestLiveUpdates2.contestCategory, show->contestLiveUpdates2.nickname);
show->contestLiveUpdates2.pokeblockState = sub_818E880();
tv_store_id_2x(show);
}
@@ -5600,7 +5600,7 @@ static void DoTVShowPokemonContestLiveUpdates(void)
switch (state)
{
case 0:
- sub_818E868(gStringVar1, show->contestLiveUpdates.category);
+ BufferContestName(gStringVar1, show->contestLiveUpdates.category);
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language);
if (show->contestLiveUpdates.round1Rank == show->contestLiveUpdates.round2Rank)
@@ -7720,7 +7720,7 @@ static void DoTVShowPokemonContestLiveUpdates2(void)
switch (state)
{
case 0:
- sub_818E868(gStringVar1, show->contestLiveUpdates2.contestCategory);
+ BufferContestName(gStringVar1, show->contestLiveUpdates2.contestCategory);
if (show->contestLiveUpdates2.pokeblockState == 1)
{
sTVShowState = 1;
diff --git a/sym_bss.txt b/sym_bss.txt
index 4c974c3f6..29b30f2db 100644
--- a/sym_bss.txt
+++ b/sym_bss.txt
@@ -51,7 +51,7 @@
.include "src/pokenav_unk_10.o"
.include "src/ereader_helpers.o"
.include "src/faraway_island.o"
- .include "asm/m4a_1.o"
+ .include "src/m4a_1.o"
.include "src/agb_flash.o"
.include "src/siirtc.o"
.include "*libgcc.a:dp-bit.o"
diff --git a/tools/gbagfx/Makefile b/tools/gbagfx/Makefile
index d9c219587..f0638414d 100644
--- a/tools/gbagfx/Makefile
+++ b/tools/gbagfx/Makefile
@@ -1,16 +1,19 @@
-CC ?= gcc
+CC = gcc
-CFLAGS = -Wall -Wextra -Werror -std=c11 -O2 -DPNG_SKIP_SETJMP_CHECK
+CFLAGS = -Wall -Wextra -Werror -Wno-sign-compare -std=c11 -O2 -DPNG_SKIP_SETJMP_CHECK
LIBS = -lpng -lz
-SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c rl.c util.c font.c
+SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c rl.c util.c font.c huff.c
.PHONY: all clean
all: gbagfx
@:
+gbagfx-debug: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h
+ $(CC) $(CFLAGS) -DDEBUG $(SRCS) -o $@ $(LDFLAGS) $(LIBS)
+
gbagfx: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS)
diff --git a/tools/gbagfx/huff.c b/tools/gbagfx/huff.c
new file mode 100644
index 000000000..143ed79be
--- /dev/null
+++ b/tools/gbagfx/huff.c
@@ -0,0 +1,398 @@
+#include <stdbool.h>
+#include <string.h>
+#include <assert.h>
+#include <stdio.h>
+#include <stdint.h>
+#include "global.h"
+#include "huff.h"
+
+static int cmp_tree(const void * a0, const void * b0) {
+ return ((struct HuffData *)a0)->value - ((struct HuffData *)b0)->value;
+}
+
+typedef int (*cmpfun)(const void *, const void *);
+
+int msort_r(void * data, size_t count, size_t size, cmpfun cmp, void * buffer) {
+ /*
+ * Out-of-place mergesort (stable sort)
+ * Returns 1 on success, 0 on failure
+ */
+ void * leftPtr;
+ void * rightPtr;
+ void * leftEnd;
+ void * rightEnd;
+ int i;
+
+ switch (count) {
+ case 0:
+ // Should never be here
+ return 0;
+
+ case 1:
+ // Nothing to do here
+ break;
+
+ case 2:
+ // Swap the two entries if the right one compares higher.
+ if (cmp(data, data + size) > 0) {
+ memcpy(buffer, data, size);
+ memcpy(data, data + size, size);
+ memcpy(data + size, buffer, size);
+ }
+ break;
+ default:
+ // Merge sort out-of-place.
+ leftPtr = data;
+ leftEnd = rightPtr = data + count / 2 * size;
+ rightEnd = data + count * size;
+
+ // Sort the left half
+ if (!msort_r(leftPtr, count / 2, size, cmp, buffer))
+ return 0;
+
+ // Sort the right half
+ if (!msort_r(rightPtr, count / 2 + (count & 1), size, cmp, buffer))
+ return 0;
+
+ // Merge the sorted halves out of place
+ i = 0;
+ do {
+ if (cmp(leftPtr, rightPtr) <= 0) {
+ memcpy(buffer + i * size, leftPtr, size);
+ leftPtr += size;
+ } else {
+ memcpy(buffer + i * size, rightPtr, size);
+ rightPtr += size;
+ }
+
+ } while (++i < count && leftPtr < leftEnd && rightPtr < rightEnd);
+
+ // Copy the remainder
+ if (i < count) {
+ if (leftPtr < leftEnd) {
+ memcpy(buffer + i * size, leftPtr, leftEnd - leftPtr);
+ }
+ else {
+ memcpy(buffer + i * size, rightPtr, rightEnd - rightPtr);
+ }
+ }
+
+ // Copy the merged data back
+ memcpy(data, buffer, count * size);
+ break;
+ }
+
+ return 1;
+}
+
+int msort(void * data, size_t count, size_t size, cmpfun cmp) {
+ void * buffer = malloc(count * size);
+ if (buffer == NULL) return 0;
+ int result = msort_r(data, count, size, cmp, buffer);
+ free(buffer);
+ return result;
+}
+
+static void write_tree(unsigned char * dest, HuffNode_t * tree, int nitems, struct BitEncoding * encoding) {
+ /*
+ * The example used to guide this function encodes the tree in a
+ * breadth-first manner. We attempt to emulate that here.
+ */
+
+ int i, j, k;
+
+ // There are (2 * nitems - 1) nodes in the binary tree. Allocate that.
+ HuffNode_t * traversal = calloc(2 * nitems - 1, sizeof(HuffNode_t));
+ if (traversal == NULL)
+ FATAL_ERROR("Fatal error while compressing Huff file.\n");
+
+ // The first node is the root of the tree.
+ traversal[0] = *tree;
+ i = 1;
+
+ // Copy the tree into a breadth-first ordering using brute force.
+ for (int depth = 1; i < 2 * nitems - 1; depth++) {
+ // Consider every possible path up to the current depth.
+ for (j = 0; i < 2 * nitems - 1 && j < 1 << depth; j++) {
+ // The index of the path is used to encode the path itself.
+ // Start from the most significant relevant bit and work our way down.
+ // Keep track of the current and previous nodes.
+ HuffNode_t * currNode = traversal;
+ HuffNode_t * parent = NULL;
+ for (k = 0; k < depth; k++) {
+ if (currNode->header.isLeaf)
+ break;
+ parent = currNode;
+ if ((j >> (depth - k - 1)) & 1)
+ currNode = currNode->branch.right;
+ else
+ currNode = currNode->branch.left;
+ }
+ // Check that the length of the current path equals the current depth.
+ if (k == depth) {
+ // Make sure we can encode the current branch.
+ // Bail here if we cannot.
+ // This is only applicable for 8-bit encodings.
+ if (traversal + i - parent > 128)
+ FATAL_ERROR("Fatal error while compressing Huff file: unable to encode binary tree.\n");
+ // Copy the current node, and update its parent.
+ traversal[i] = *currNode;
+ if (parent != NULL) {
+ if ((j & 1) == 1)
+ parent->branch.right = traversal + i;
+ else
+ parent->branch.left = traversal + i;
+ }
+ // Encode the path through the tree in the lookup table
+ if (traversal[i].header.isLeaf) {
+ encoding[traversal[i].leaf.key].nbits = depth;
+ encoding[traversal[i].leaf.key].bitstring = j;
+ }
+ i++;
+ }
+ }
+ }
+
+ // Encode the size of the tree.
+ // This is used by the decompressor to skip the tree.
+ dest[4] = nitems - 1;
+
+ // Encode each node in the tree.
+ for (i = 0; i < 2 * nitems - 1; i++) {
+ HuffNode_t * currNode = traversal + i;
+ if (currNode->header.isLeaf) {
+ dest[5 + i] = traversal[i].leaf.key;
+ } else {
+ dest[5 + i] = (((currNode->branch.right - traversal - i) / 2) - 1);
+ if (currNode->branch.left->header.isLeaf)
+ dest[5 + i] |= 0x80;
+ if (currNode->branch.right->header.isLeaf)
+ dest[5 + i] |= 0x40;
+ }
+ }
+
+ free(traversal);
+}
+
+static inline void write_32_le(unsigned char * dest, int * destPos, uint32_t * buff, int * buffPos) {
+ dest[*destPos] = *buff;
+ dest[*destPos + 1] = *buff >> 8;
+ dest[*destPos + 2] = *buff >> 16;
+ dest[*destPos + 3] = *buff >> 24;
+ *destPos += 4;
+ *buff = 0;
+ *buffPos = 0;
+}
+
+static inline void read_32_le(unsigned char * src, int * srcPos, uint32_t * buff) {
+ uint32_t tmp = src[*srcPos];
+ tmp |= src[*srcPos + 1] << 8;
+ tmp |= src[*srcPos + 2] << 16;
+ tmp |= src[*srcPos + 3] << 24;
+ *srcPos += 4;
+ *buff = tmp;
+}
+
+static void write_bits(unsigned char * dest, int * destPos, struct BitEncoding * encoding, int value, uint32_t * buff, int * buffBits) {
+ int nbits = encoding[value].nbits;
+ uint32_t bitstring = encoding[value].bitstring;
+
+ if (*buffBits + nbits >= 32) {
+ int diff = *buffBits + nbits - 32;
+ *buff <<= nbits - diff;
+ *buff |= bitstring >> diff;
+ bitstring &= ~(1 << diff);
+ nbits = diff;
+ write_32_le(dest, destPos, buff, buffBits);
+ }
+ if (nbits != 0) {
+ *buff <<= nbits;
+ *buff |= bitstring;
+ *buffBits += nbits;
+ }
+}
+
+/*
+=======================================
+MAIN COMPRESSION/DECOMPRESSION ROUTINES
+=======================================
+ */
+
+unsigned char * HuffCompress(unsigned char * src, int srcSize, int * compressedSize_p, int bitDepth) {
+ if (srcSize <= 0)
+ goto fail;
+
+ int worstCaseDestSize = 4 + (2 << bitDepth) + srcSize * 3;
+
+ unsigned char *dest = malloc(worstCaseDestSize);
+ if (dest == NULL)
+ goto fail;
+
+ int nitems = 1 << bitDepth;
+
+ HuffNode_t * freqs = calloc(nitems, sizeof(HuffNode_t));
+ if (freqs == NULL)
+ goto fail;
+
+ struct BitEncoding * encoding = calloc(nitems, sizeof(struct BitEncoding));
+ if (encoding == NULL)
+ goto fail;
+
+ // Set up the frequencies table. This will inform the tree.
+ for (int i = 0; i < nitems; i++) {
+ freqs[i].header.isLeaf = 1;
+ freqs[i].header.value = 0;
+ freqs[i].leaf.key = i;
+ }
+
+ // Count each nybble or byte.
+ for (int i = 0; i < srcSize; i++) {
+ if (bitDepth == 8) {
+ freqs[src[i]].header.value++;
+ } else {
+ freqs[src[i] >> 4].header.value++;
+ freqs[src[i] & 0xF].header.value++;
+ }
+ }
+
+#ifdef DEBUG
+ for (int i = 0; i < nitems; i++) {
+ fprintf(stderr, "%d: %d\n", i, freqs[i].header.value);
+ }
+#endif // DEBUG
+
+ // Sort the frequency table.
+ if (!msort(freqs, nitems, sizeof(HuffNode_t), cmp_tree))
+ goto fail;
+
+ // Prune zero-frequency values.
+ for (int i = 0; i < nitems; i++) {
+ if (freqs[i].header.value != 0) {
+ if (i > 0) {
+ for (int j = i; j < nitems; j++) {
+ freqs[j - i] = freqs[j];
+ }
+ nitems -= i;
+ }
+ break;
+ }
+ // This should never happen:
+ if (i == nitems - 1)
+ goto fail;
+ }
+
+ HuffNode_t * tree = calloc(nitems * 2 - 1, sizeof(HuffNode_t));
+ if (tree == NULL)
+ goto fail;
+
+ // Iteratively collapse the two least frequent nodes.
+ HuffNode_t * endptr = freqs + nitems - 2;
+
+ for (int i = 0; i < nitems - 1; i++) {
+ HuffNode_t * left = freqs;
+ HuffNode_t * right = freqs + 1;
+ tree[i * 2] = *right;
+ tree[i * 2 + 1] = *left;
+ for (int j = 0; j < nitems - i - 2; j++)
+ freqs[j] = freqs[j + 2];
+ endptr->header.isLeaf = 0;
+ endptr->header.value = tree[i * 2].header.value + tree[i * 2 + 1].header.value;
+ endptr->branch.left = tree + i * 2;
+ endptr->branch.right = tree + i * 2 + 1;
+ endptr--;
+ if (i < nitems - 2 && !msort(freqs, nitems - i - 1, sizeof(HuffNode_t), cmp_tree))
+ goto fail;
+ }
+
+ // Write the tree breadth-first, and create the path lookup table.
+ write_tree(dest, freqs, nitems, encoding);
+
+ free(tree);
+ free(freqs);
+
+ // Encode the data itself.
+ int destPos = 4 + nitems * 2;
+ uint32_t destBuf = 0;
+ uint32_t srcBuf = 0;
+ int destBitPos = 0;
+
+ for (int srcPos = 0; srcPos < srcSize;) {
+ read_32_le(src, &srcPos, &srcBuf);
+ for (int i = 0; i < 32 / bitDepth; i++) {
+ write_bits(dest, &destPos, encoding, srcBuf & (0xFF >> (8 - bitDepth)), &destBuf, &destBitPos);
+ srcBuf >>= bitDepth;
+ }
+ }
+
+ if (destBitPos != 0) {
+ write_32_le(dest, &destPos, &destBuf, &destBitPos);
+ }
+
+ free(encoding);
+
+ // Write the header.
+ dest[0] = bitDepth | 0x20;
+ dest[1] = srcSize;
+ dest[2] = srcSize >> 8;
+ dest[3] = srcSize >> 16;
+ *compressedSize_p = (destPos + 3) & ~3;
+ return dest;
+
+fail:
+ FATAL_ERROR("Fatal error while compressing Huff file.\n");
+}
+
+unsigned char * HuffDecompress(unsigned char * src, int srcSize, int * uncompressedSize_p) {
+ if (srcSize < 4)
+ goto fail;
+
+ int bitDepth = *src & 15;
+ if (bitDepth != 4 && bitDepth != 8)
+ goto fail;
+
+ int destSize = (src[3] << 16) | (src[2] << 8) | src[1];
+
+ unsigned char *dest = malloc(destSize);
+
+ if (dest == NULL)
+ goto fail;
+
+ int treePos = 5;
+ int treeSize = (src[4] + 1) * 2;
+ int srcPos = 4 + treeSize;
+ int destPos = 0;
+ int curValPos = 0;
+ uint32_t destTmp = 0;
+ uint32_t window;
+
+ for (;;)
+ {
+ if (srcPos >= srcSize)
+ goto fail;
+ read_32_le(src, &srcPos, &window);
+ for (int i = 0; i < 32; i++) {
+ int curBit = (window >> 31) & 1;
+ unsigned char treeView = src[treePos];
+ bool isLeaf = ((treeView << curBit) & 0x80) != 0;
+ treePos &= ~1; // align
+ treePos += ((treeView & 0x3F) + 1) * 2 + curBit;
+ if (isLeaf) {
+ destTmp >>= bitDepth;
+ destTmp |= (src[treePos] << (32 - bitDepth));
+ curValPos++;
+ if (curValPos == 32 / bitDepth) {
+ write_32_le(dest, &destPos, &destTmp, &curValPos);
+ if (destPos == destSize) {
+ *uncompressedSize_p = destSize;
+ return dest;
+ }
+ }
+ treePos = 5;
+ }
+ window <<= 1;
+ }
+ }
+
+fail:
+ FATAL_ERROR("Fatal error while decompressing Huff file.\n");
+}
diff --git a/tools/gbagfx/huff.h b/tools/gbagfx/huff.h
new file mode 100644
index 000000000..6002fe954
--- /dev/null
+++ b/tools/gbagfx/huff.h
@@ -0,0 +1,38 @@
+#ifndef HUFF_H
+#define HUFF_H
+
+union HuffNode;
+
+struct HuffData {
+ unsigned value:31;
+ unsigned isLeaf:1;
+};
+
+struct HuffLeaf {
+ struct HuffData header;
+ unsigned char key;
+};
+
+struct HuffBranch {
+ struct HuffData header;
+ union HuffNode * left;
+ union HuffNode * right;
+};
+
+union HuffNode {
+ struct HuffData header;
+ struct HuffLeaf leaf;
+ struct HuffBranch branch;
+};
+
+typedef union HuffNode HuffNode_t;
+
+struct BitEncoding {
+ unsigned long long nbits:6;
+ unsigned long long bitstring:58;
+};
+
+unsigned char * HuffCompress(unsigned char * buffer, int srcSize, int * compressedSize_p, int bitDepth);
+unsigned char * HuffDecompress(unsigned char * buffer, int srcSize, int * uncompressedSize_p);
+
+#endif //HUFF_H
diff --git a/tools/gbagfx/lz.c b/tools/gbagfx/lz.c
index c2ba3e327..97434ce50 100644
--- a/tools/gbagfx/lz.c
+++ b/tools/gbagfx/lz.c
@@ -69,10 +69,8 @@ fail:
FATAL_ERROR("Fatal error while decompressing LZ file.\n");
}
-unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize)
+unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize, const int minDistance)
{
- const int minDistance = 2; // for compatibility with LZ77UnCompVram()
-
if (srcSize <= 0)
goto fail;
diff --git a/tools/gbagfx/lz.h b/tools/gbagfx/lz.h
index 164d62279..90f56b643 100644
--- a/tools/gbagfx/lz.h
+++ b/tools/gbagfx/lz.h
@@ -4,6 +4,6 @@
#define LZ_H
unsigned char *LZDecompress(unsigned char *src, int srcSize, int *uncompressedSize);
-unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize);
+unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize, const int minDistance);
#endif // LZ_H
diff --git a/tools/gbagfx/main.c b/tools/gbagfx/main.c
index 86b0afa53..aa0681fb6 100644
--- a/tools/gbagfx/main.c
+++ b/tools/gbagfx/main.c
@@ -12,6 +12,7 @@
#include "lz.h"
#include "rl.h"
#include "font.h"
+#include "huff.h"
struct CommandHandler
{
@@ -319,6 +320,7 @@ void HandlePngToFullwidthJapaneseFontCommand(char *inputPath, char *outputPath,
void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char **argv)
{
int overflowSize = 0;
+ int minDistance = 2; // default, for compatibility with LZ77UnCompVram()
for (int i = 3; i < argc; i++)
{
@@ -337,6 +339,19 @@ void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char *
if (overflowSize < 1)
FATAL_ERROR("Overflow size must be positive.\n");
}
+ else if (strcmp(option, "-search") == 0)
+ {
+ if (i + 1 >= argc)
+ FATAL_ERROR("No size following \"-overflow\".\n");
+
+ i++;
+
+ if (!ParseNumber(argv[i], NULL, 10, &minDistance))
+ FATAL_ERROR("Failed to parse LZ min search distance.\n");
+
+ if (minDistance < 1)
+ FATAL_ERROR("LZ min search distance must be positive.\n");
+ }
else
{
FATAL_ERROR("Unrecognized option \"%s\".\n", option);
@@ -353,7 +368,7 @@ void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char *
unsigned char *buffer = ReadWholeFileZeroPadded(inputPath, &fileSize, overflowSize);
int compressedSize;
- unsigned char *compressedData = LZCompress(buffer, fileSize + overflowSize, &compressedSize);
+ unsigned char *compressedData = LZCompress(buffer, fileSize + overflowSize, &compressedSize, minDistance);
compressedData[1] = (unsigned char)fileSize;
compressedData[2] = (unsigned char)(fileSize >> 8);
@@ -411,6 +426,61 @@ void HandleRLDecompressCommand(char *inputPath, char *outputPath, int argc UNUSE
free(uncompressedData);
}
+void HandleHuffCompressCommand(char *inputPath, char *outputPath, int argc, char **argv)
+{
+ int fileSize;
+ int bitDepth = 4;
+
+ for (int i = 3; i < argc; i++)
+ {
+ char *option = argv[i];
+
+ if (strcmp(option, "-depth") == 0)
+ {
+ if (i + 1 >= argc)
+ FATAL_ERROR("No size following \"-depth\".\n");
+
+ i++;
+
+ if (!ParseNumber(argv[i], NULL, 10, &bitDepth))
+ FATAL_ERROR("Failed to parse bit depth.\n");
+
+ if (bitDepth != 4 && bitDepth != 8)
+ FATAL_ERROR("GBA only supports bit depth of 4 or 8.\n");
+ }
+ else
+ {
+ FATAL_ERROR("Unrecognized option \"%s\".\n", option);
+ }
+ }
+
+ unsigned char *buffer = ReadWholeFile(inputPath, &fileSize);
+
+ int compressedSize;
+ unsigned char *compressedData = HuffCompress(buffer, fileSize, &compressedSize, bitDepth);
+
+ free(buffer);
+
+ WriteWholeFile(outputPath, compressedData, compressedSize);
+
+ free(compressedData);
+}
+
+void HandleHuffDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
+{
+ int fileSize;
+ unsigned char *buffer = ReadWholeFile(inputPath, &fileSize);
+
+ int uncompressedSize;
+ unsigned char *uncompressedData = HuffDecompress(buffer, fileSize, &uncompressedSize);
+
+ free(buffer);
+
+ WriteWholeFile(outputPath, uncompressedData, uncompressedSize);
+
+ free(uncompressedData);
+}
+
int main(int argc, char **argv)
{
if (argc < 3)
@@ -433,7 +503,9 @@ int main(int argc, char **argv)
{ "png", "hwjpnfont", HandlePngToHalfwidthJapaneseFontCommand },
{ "fwjpnfont", "png", HandleFullwidthJapaneseFontToPngCommand },
{ "png", "fwjpnfont", HandlePngToFullwidthJapaneseFontCommand },
+ { NULL, "huff", HandleHuffCompressCommand },
{ NULL, "lz", HandleLZCompressCommand },
+ { "huff", NULL, HandleHuffDecompressCommand },
{ "lz", NULL, HandleLZDecompressCommand },
{ NULL, "rl", HandleRLCompressCommand },
{ "rl", NULL, HandleRLDecompressCommand },
diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp
index 383010aa3..98805c952 100644
--- a/tools/preproc/asm_file.cpp
+++ b/tools/preproc/asm_file.cpp
@@ -475,9 +475,11 @@ void AsmFile::ExpectEmptyRestOfLine()
m_lineStart = m_pos;
m_lineNum++;
}
- else if (m_buffer[m_pos] == '\r')
+ else if (m_buffer[m_pos] == '\r' && m_buffer[m_pos + 1] == '\n')
{
- RaiseError("only Unix-style LF newlines are supported");
+ m_pos += 2;
+ m_lineStart = m_pos;
+ m_lineNum++;
}
else
{
diff --git a/tools/ramscrgen/elf.cpp b/tools/ramscrgen/elf.cpp
index 7599fe0bb..7e78704b8 100644
--- a/tools/ramscrgen/elf.cpp
+++ b/tools/ramscrgen/elf.cpp
@@ -10,6 +10,8 @@
#define SHN_COMMON 0xFFF2
static std::string s_elfPath;
+static std::string s_archiveFilePath;
+static std::string s_archiveObjectPath;
static FILE *s_file;
@@ -22,6 +24,7 @@ static std::uint32_t s_symtabOffset;
static std::uint32_t s_strtabOffset;
static std::uint32_t s_symbolCount;
+static std::uint32_t s_elfFileOffset;
struct Symbol
{
@@ -31,7 +34,7 @@ struct Symbol
static void Seek(long offset)
{
- if (std::fseek(s_file, offset, SEEK_SET) != 0)
+ if (std::fseek(s_file, s_elfFileOffset + offset, SEEK_SET) != 0)
FATAL_ERROR("error: failed to seek to %ld in \"%s\"", offset, s_elfPath.c_str());
}
@@ -98,6 +101,18 @@ static void VerifyElfIdent()
FATAL_ERROR("error: \"%s\" not little-endian ELF\n", s_elfPath.c_str());
}
+static void VerifyAr()
+{
+ char expectedMagic[8] = {'!', '<', 'a', 'r', 'c', 'h', '>', '\n'};
+ char magic[8];
+
+ if (std::fread(magic, 8, 1, s_file) != 1)
+ FATAL_ERROR("error: failed to read AR magic from \"%s\"\n", s_archiveFilePath.c_str());
+
+ if (std::memcmp(magic, expectedMagic, 8) != 0)
+ FATAL_ERROR("error: AR magic did not match in \"%s\"\n", s_archiveFilePath.c_str());
+}
+
static void ReadElfHeader()
{
Seek(0x20);
@@ -108,6 +123,40 @@ static void ReadElfHeader()
s_shstrtabIndex = ReadInt16();
}
+static void FindArObj()
+{
+ char file_ident[17] = {0};
+ char filesize_s[11] = {0};
+ char expectedEndMagic[2] = { 0x60, 0x0a };
+ char end_magic[2];
+ std::size_t filesize;
+
+ Seek(8);
+ while (!std::feof(s_file)) {
+ if (std::fread(file_ident, 16, 1, s_file) != 1)
+ FATAL_ERROR("error: failed to read file ident in \"%s\"\n", s_archiveFilePath.c_str());
+ Skip(32);
+ if (std::fread(filesize_s, 10, 1, s_file) != 1)
+ FATAL_ERROR("error: failed to read filesize in \"%s\"\n", s_archiveFilePath.c_str());
+ if (std::fread(end_magic, 2, 1, s_file) != 1)
+ FATAL_ERROR("error: failed to read end sentinel in \"%s\"\n", s_archiveFilePath.c_str());
+ if (std::memcmp(end_magic, expectedEndMagic, 2) != 0)
+ FATAL_ERROR("error: corrupted archive header in \"%s\" at \"%s\"\n", s_archiveFilePath.c_str(), file_ident);
+
+ char * ptr = std::strchr(file_ident, '/');
+ if (ptr != nullptr)
+ *ptr = 0;
+ filesize = std::strtoul(filesize_s, nullptr, 10);
+ if (std::strncmp(s_archiveObjectPath.c_str(), file_ident, 16) == 0) {
+ s_elfFileOffset = std::ftell(s_file);
+ return;
+ }
+ Skip(filesize);
+ }
+
+ FATAL_ERROR("error: could not find object \"%s\" in archive \"%s\"\n", s_archiveObjectPath.c_str(), s_archiveFilePath.c_str());
+}
+
static std::string GetSectionName(std::uint32_t shstrtabOffset, int index)
{
Seek(s_sectionHeaderOffset + s_sectionHeaderEntrySize * index);
@@ -153,21 +202,14 @@ static void FindTableOffsets()
FATAL_ERROR("error: couldn't find .strtab section in \"%s\"\n", s_elfPath.c_str());
}
-std::map<std::string, std::uint32_t> GetCommonSymbols(std::string path)
+static std::map<std::string, std::uint32_t> GetCommonSymbols_Shared()
{
- s_elfPath = path;
-
- std::map<std::string, std::uint32_t> commonSymbols;
-
- s_file = std::fopen(s_elfPath.c_str(), "rb");
-
- if (s_file == NULL)
- FATAL_ERROR("error: failed to open \"%s\" for reading\n", path.c_str());
-
VerifyElfIdent();
ReadElfHeader();
FindTableOffsets();
-
+
+ std::map<std::string, std::uint32_t> commonSymbols;
+
std::vector<Symbol> commonSymbolVec;
Seek(s_symtabOffset);
@@ -193,3 +235,38 @@ std::map<std::string, std::uint32_t> GetCommonSymbols(std::string path)
return commonSymbols;
}
+
+std::map<std::string, std::uint32_t> GetCommonSymbolsFromLib(std::string sourcePath, std::string libpath)
+{
+ std::size_t colonPos = libpath.find(':');
+ if (colonPos == std::string::npos)
+ FATAL_ERROR("error: missing colon separator in libfile \"%s\"\n", s_elfPath.c_str());
+
+ s_archiveObjectPath = libpath.substr(colonPos + 1);
+ s_archiveFilePath = sourcePath + "/" + libpath.substr(1, colonPos - 1);
+ s_elfPath = sourcePath + "/" + libpath.substr(1);
+
+ s_file = std::fopen(s_archiveFilePath.c_str(), "rb");
+
+ if (s_file == NULL)
+ FATAL_ERROR("error: failed to open \"%s\" for reading\n", s_archiveFilePath.c_str());
+
+ VerifyAr();
+ FindArObj();
+ return GetCommonSymbols_Shared();
+}
+
+std::map<std::string, std::uint32_t> GetCommonSymbols(std::string sourcePath, std::string path)
+{
+ s_elfFileOffset = 0;
+ if (path[0] == '*')
+ return GetCommonSymbolsFromLib(sourcePath, path);
+
+ s_elfPath = sourcePath + "/" + path;
+ s_file = std::fopen(s_elfPath.c_str(), "rb");
+
+ if (s_file == NULL)
+ FATAL_ERROR("error: failed to open \"%s\" for reading\n", path.c_str());
+
+ return GetCommonSymbols_Shared();
+}
diff --git a/tools/ramscrgen/elf.h b/tools/ramscrgen/elf.h
index 0bfdd696f..3704860c0 100644
--- a/tools/ramscrgen/elf.h
+++ b/tools/ramscrgen/elf.h
@@ -25,6 +25,6 @@
#include <map>
#include <string>
-std::map<std::string, std::uint32_t> GetCommonSymbols(std::string path);
+std::map<std::string, std::uint32_t> GetCommonSymbols(std::string sourcePath, std::string path);
#endif // ELF_H
diff --git a/tools/ramscrgen/main.cpp b/tools/ramscrgen/main.cpp
index 6c4f4bbd7..5e5894f47 100644
--- a/tools/ramscrgen/main.cpp
+++ b/tools/ramscrgen/main.cpp
@@ -27,9 +27,15 @@
void HandleCommonInclude(std::string filename, std::string sourcePath, std::string symOrderPath, std::string lang)
{
- auto commonSymbols = GetCommonSymbols(sourcePath + "/" + filename);
+ auto commonSymbols = GetCommonSymbols(sourcePath, filename);
+ std::size_t dotIndex;
- std::size_t dotIndex = filename.find_last_of('.');
+ if (filename[0] == '*') {
+ dotIndex = filename.find_last_of(':');
+ filename = filename.substr(dotIndex + 1);
+ }
+
+ dotIndex = filename.find_last_of('.');
if (dotIndex == std::string::npos)
FATAL_ERROR("error: \"%s\" doesn't have a file extension\n", filename.c_str());
@@ -73,7 +79,7 @@ void HandleCommonInclude(std::string filename, std::string sourcePath, std::stri
}
}
-void ConvertSymFile(std::string filename, std::string sectionName, std::string lang, bool common, std::string sourcePath, std::string commonSymPath)
+void ConvertSymFile(std::string filename, std::string sectionName, std::string lang, bool common, std::string sourcePath, std::string commonSymPath, std::string libSourcePath)
{
SymFile symFile(filename);
@@ -91,7 +97,7 @@ void ConvertSymFile(std::string filename, std::string sectionName, std::string l
symFile.ExpectEmptyRestOfLine();
printf(". = ALIGN(4);\n");
if (common)
- HandleCommonInclude(incFilename, sourcePath, commonSymPath, lang);
+ HandleCommonInclude(incFilename, incFilename[0] == '*' ? libSourcePath : sourcePath, commonSymPath, lang);
else
printf("%s(%s);\n", incFilename.c_str(), sectionName.c_str());
break;
@@ -148,6 +154,7 @@ int main(int argc, char **argv)
std::string lang = std::string(argv[3]);
std::string sourcePath;
std::string commonSymPath;
+ std::string libSourcePath;
if (argc > 4)
{
@@ -166,8 +173,15 @@ int main(int argc, char **argv)
sourcePath = paths.substr(0, commaPos);
commonSymPath = paths.substr(commaPos + 1);
+ commaPos = commonSymPath.find(',');
+ if (commaPos == std::string::npos) {
+ libSourcePath = "tools/agbcc/lib";
+ } else {
+ libSourcePath = commonSymPath.substr(commaPos + 1);
+ commonSymPath = commonSymPath.substr(0, commaPos);
+ }
}
- ConvertSymFile(symFileName, sectionName, lang, common, sourcePath, commonSymPath);
+ ConvertSymFile(symFileName, sectionName, lang, common, sourcePath, commonSymPath, libSourcePath);
return 0;
}
diff --git a/tools/scaninc/scaninc.cpp b/tools/scaninc/scaninc.cpp
index b95cbd033..a3e40c5d9 100644
--- a/tools/scaninc/scaninc.cpp
+++ b/tools/scaninc/scaninc.cpp
@@ -97,19 +97,26 @@ int main(int argc, char **argv)
}
for (auto include : file.GetIncludes())
{
+ bool exists = false;
+ std::string path("");
for (auto includeDir : includeDirs)
{
- std::string path(includeDir + include);
+ path = includeDir + include;
if (CanOpenFile(path))
{
- bool inserted = dependencies.insert(path).second;
- if (inserted)
- {
- filesToProcess.push(path);
- }
+ exists = true;
break;
}
}
+ if (!exists && file.FileType() == SourceFileType::Asm)
+ {
+ path = include;
+ }
+ bool inserted = dependencies.insert(path).second;
+ if (inserted && exists)
+ {
+ filesToProcess.push(path);
+ }
}
includeDirs.pop_back();
}
diff --git a/tools/scaninc/source_file.cpp b/tools/scaninc/source_file.cpp
index f23ff6db6..df31282f8 100644
--- a/tools/scaninc/source_file.cpp
+++ b/tools/scaninc/source_file.cpp
@@ -89,6 +89,11 @@ SourceFile::SourceFile(std::string path)
}
}
+SourceFileType SourceFile::FileType()
+{
+ return m_file_type;
+}
+
SourceFile::~SourceFile()
{
if (m_file_type == SourceFileType::Cpp || m_file_type == SourceFileType::Header)
diff --git a/tools/scaninc/source_file.h b/tools/scaninc/source_file.h
index f7b6412bd..854b3f116 100644
--- a/tools/scaninc/source_file.h
+++ b/tools/scaninc/source_file.h
@@ -50,6 +50,7 @@ public:
const std::set<std::string>& GetIncbins();
const std::set<std::string>& GetIncludes();
std::string& GetSrcDir();
+ SourceFileType FileType();
private:
union InnerUnion {