diff options
author | GriffinR <griffin.g.richards@gmail.com> | 2019-09-03 22:22:14 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-03 22:22:14 -0400 |
commit | 6b04ea0727973e66227b31caa2ccdcb6f2b4891f (patch) | |
tree | 4d5e4e5d1b6e480bd195d8a9a29703e6475cc2e9 | |
parent | ecf2097abb1481109578b7b8260fd40606f27abe (diff) | |
parent | 1f4c88c95243e8d75f25d5b7868c837c47aa578d (diff) |
Merge branch 'master' into document-eventscripts
173 files changed, 12843 insertions, 2099 deletions
@@ -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 Binary files differnew file mode 100644 index 000000000..edf0d36c9 --- /dev/null +++ b/berry_fix/payload/graphics/debug_digits.png diff --git a/berry_fix/payload/graphics/msg_box.png b/berry_fix/payload/graphics/msg_box.png Binary files differnew file mode 100644 index 000000000..00d1bbe37 --- /dev/null +++ b/berry_fix/payload/graphics/msg_box.png diff --git a/berry_fix/payload/graphics/msg_box.tilemap b/berry_fix/payload/graphics/msg_box.tilemap Binary files differnew file mode 100644 index 000000000..5b82401ba --- /dev/null +++ b/berry_fix/payload/graphics/msg_box.tilemap 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 = ®_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 Binary files differdeleted file mode 100644 index 0afff07f5..000000000 --- a/data/berry_fix.mb +++ /dev/null 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]); @@ -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 { |